tcp.rs 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913
  1. use core::{i32, ops, cmp, fmt};
  2. use byteorder::{ByteOrder, NetworkEndian};
  3. use Error;
  4. use super::{IpProtocol, IpAddress};
  5. use super::ip::checksum;
  6. /// A TCP sequence number.
  7. ///
  8. /// A sequence number is a monotonically advancing integer modulo 2<sup>32</sup>.
  9. /// Sequence numbers do not have a discontiguity when compared pairwise across a signed overflow.
  10. #[derive(Debug, PartialEq, Eq, Clone, Copy)]
  11. pub struct SeqNumber(pub i32);
  12. impl fmt::Display for SeqNumber {
  13. fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
  14. write!(f, "{}", self.0 as u32)
  15. }
  16. }
  17. impl ops::Add<usize> for SeqNumber {
  18. type Output = SeqNumber;
  19. fn add(self, rhs: usize) -> SeqNumber {
  20. if rhs > i32::MAX as usize {
  21. panic!("attempt to add to sequence number with unsigned overflow")
  22. }
  23. SeqNumber(self.0.wrapping_add(rhs as i32))
  24. }
  25. }
  26. impl ops::Sub<usize> for SeqNumber {
  27. type Output = SeqNumber;
  28. fn sub(self, rhs: usize) -> SeqNumber {
  29. if rhs > i32::MAX as usize {
  30. panic!("attempt to subtract to sequence number with unsigned overflow")
  31. }
  32. SeqNumber(self.0.wrapping_sub(rhs as i32))
  33. }
  34. }
  35. impl ops::AddAssign<usize> for SeqNumber {
  36. fn add_assign(&mut self, rhs: usize) {
  37. *self = *self + rhs;
  38. }
  39. }
  40. impl ops::Sub for SeqNumber {
  41. type Output = usize;
  42. fn sub(self, rhs: SeqNumber) -> usize {
  43. (self.0 - rhs.0) as usize
  44. }
  45. }
  46. impl cmp::PartialOrd for SeqNumber {
  47. fn partial_cmp(&self, other: &SeqNumber) -> Option<cmp::Ordering> {
  48. (self.0 - other.0).partial_cmp(&0)
  49. }
  50. }
  51. /// A read/write wrapper around a Transmission Control Protocol packet buffer.
  52. #[derive(Debug)]
  53. pub struct Packet<T: AsRef<[u8]>> {
  54. buffer: T
  55. }
  56. mod field {
  57. #![allow(non_snake_case)]
  58. use wire::field::*;
  59. pub const SRC_PORT: Field = 0..2;
  60. pub const DST_PORT: Field = 2..4;
  61. pub const SEQ_NUM: Field = 4..8;
  62. pub const ACK_NUM: Field = 8..12;
  63. pub const FLAGS: Field = 12..14;
  64. pub const WIN_SIZE: Field = 14..16;
  65. pub const CHECKSUM: Field = 16..18;
  66. pub const URGENT: Field = 18..20;
  67. pub const FLG_FIN: u16 = 0x001;
  68. pub const FLG_SYN: u16 = 0x002;
  69. pub const FLG_RST: u16 = 0x004;
  70. pub const FLG_PSH: u16 = 0x008;
  71. pub const FLG_ACK: u16 = 0x010;
  72. pub const FLG_URG: u16 = 0x020;
  73. pub const FLG_ECE: u16 = 0x040;
  74. pub const FLG_CWR: u16 = 0x080;
  75. pub const FLG_NS: u16 = 0x100;
  76. pub const OPT_END: u8 = 0x00;
  77. pub const OPT_NOP: u8 = 0x01;
  78. pub const OPT_MSS: u8 = 0x02;
  79. pub const OPT_WS: u8 = 0x03;
  80. }
  81. impl<T: AsRef<[u8]>> Packet<T> {
  82. /// Wrap a buffer with a TCP packet. Returns an error if the buffer
  83. /// is too small to contain one.
  84. pub fn new(buffer: T) -> Result<Packet<T>, Error> {
  85. let len = buffer.as_ref().len();
  86. if len < field::URGENT.end {
  87. Err(Error::Truncated)
  88. } else {
  89. Ok(Packet { buffer: buffer })
  90. }
  91. }
  92. /// Consumes the packet, returning the underlying buffer.
  93. pub fn into_inner(self) -> T {
  94. self.buffer
  95. }
  96. /// Return the source port field.
  97. #[inline]
  98. pub fn src_port(&self) -> u16 {
  99. let data = self.buffer.as_ref();
  100. NetworkEndian::read_u16(&data[field::SRC_PORT])
  101. }
  102. /// Return the destination port field.
  103. #[inline]
  104. pub fn dst_port(&self) -> u16 {
  105. let data = self.buffer.as_ref();
  106. NetworkEndian::read_u16(&data[field::DST_PORT])
  107. }
  108. /// Return the sequence number field.
  109. #[inline]
  110. pub fn seq_number(&self) -> SeqNumber {
  111. let data = self.buffer.as_ref();
  112. SeqNumber(NetworkEndian::read_i32(&data[field::SEQ_NUM]))
  113. }
  114. /// Return the acknowledgement number field.
  115. #[inline]
  116. pub fn ack_number(&self) -> SeqNumber {
  117. let data = self.buffer.as_ref();
  118. SeqNumber(NetworkEndian::read_i32(&data[field::ACK_NUM]))
  119. }
  120. /// Return the FIN flag.
  121. #[inline]
  122. pub fn fin(&self) -> bool {
  123. let data = self.buffer.as_ref();
  124. let raw = NetworkEndian::read_u16(&data[field::FLAGS]);
  125. raw & field::FLG_FIN != 0
  126. }
  127. /// Return the SYN flag.
  128. #[inline]
  129. pub fn syn(&self) -> bool {
  130. let data = self.buffer.as_ref();
  131. let raw = NetworkEndian::read_u16(&data[field::FLAGS]);
  132. raw & field::FLG_SYN != 0
  133. }
  134. /// Return the RST flag.
  135. #[inline]
  136. pub fn rst(&self) -> bool {
  137. let data = self.buffer.as_ref();
  138. let raw = NetworkEndian::read_u16(&data[field::FLAGS]);
  139. raw & field::FLG_RST != 0
  140. }
  141. /// Return the PSH flag.
  142. #[inline]
  143. pub fn psh(&self) -> bool {
  144. let data = self.buffer.as_ref();
  145. let raw = NetworkEndian::read_u16(&data[field::FLAGS]);
  146. raw & field::FLG_PSH != 0
  147. }
  148. /// Return the ACK flag.
  149. #[inline]
  150. pub fn ack(&self) -> bool {
  151. let data = self.buffer.as_ref();
  152. let raw = NetworkEndian::read_u16(&data[field::FLAGS]);
  153. raw & field::FLG_ACK != 0
  154. }
  155. /// Return the URG flag.
  156. #[inline]
  157. pub fn urg(&self) -> bool {
  158. let data = self.buffer.as_ref();
  159. let raw = NetworkEndian::read_u16(&data[field::FLAGS]);
  160. raw & field::FLG_URG != 0
  161. }
  162. /// Return the ECE flag.
  163. #[inline]
  164. pub fn ece(&self) -> bool {
  165. let data = self.buffer.as_ref();
  166. let raw = NetworkEndian::read_u16(&data[field::FLAGS]);
  167. raw & field::FLG_ECE != 0
  168. }
  169. /// Return the CWR flag.
  170. #[inline]
  171. pub fn cwr(&self) -> bool {
  172. let data = self.buffer.as_ref();
  173. let raw = NetworkEndian::read_u16(&data[field::FLAGS]);
  174. raw & field::FLG_CWR != 0
  175. }
  176. /// Return the NS flag.
  177. #[inline]
  178. pub fn ns(&self) -> bool {
  179. let data = self.buffer.as_ref();
  180. let raw = NetworkEndian::read_u16(&data[field::FLAGS]);
  181. raw & field::FLG_NS != 0
  182. }
  183. /// Return the header length, in octets.
  184. #[inline]
  185. pub fn header_len(&self) -> u8 {
  186. let data = self.buffer.as_ref();
  187. let raw = NetworkEndian::read_u16(&data[field::FLAGS]);
  188. ((raw >> 12) * 4) as u8
  189. }
  190. /// Return the window size field.
  191. #[inline]
  192. pub fn window_len(&self) -> u16 {
  193. let data = self.buffer.as_ref();
  194. NetworkEndian::read_u16(&data[field::WIN_SIZE])
  195. }
  196. /// Return the checksum field.
  197. #[inline]
  198. pub fn checksum(&self) -> u16 {
  199. let data = self.buffer.as_ref();
  200. NetworkEndian::read_u16(&data[field::CHECKSUM])
  201. }
  202. /// Return the urgent pointer field.
  203. #[inline]
  204. pub fn urgent_at(&self) -> u16 {
  205. let data = self.buffer.as_ref();
  206. NetworkEndian::read_u16(&data[field::URGENT])
  207. }
  208. /// Return the length of the segment, in terms of sequence space.
  209. #[inline]
  210. pub fn segment_len(&self) -> usize {
  211. let data = self.buffer.as_ref();
  212. let mut length = data.len() - self.header_len() as usize;
  213. if self.syn() { length += 1 }
  214. if self.fin() { length += 1 }
  215. length
  216. }
  217. /// Validate the packet checksum.
  218. ///
  219. /// # Panics
  220. /// This function panics unless `src_addr` and `dst_addr` belong to the same family,
  221. /// and that family is IPv4 or IPv6.
  222. pub fn verify_checksum(&self, src_addr: &IpAddress, dst_addr: &IpAddress) -> bool {
  223. let data = self.buffer.as_ref();
  224. checksum::combine(&[
  225. checksum::pseudo_header(src_addr, dst_addr, IpProtocol::Tcp,
  226. data.len() as u32),
  227. checksum::data(data)
  228. ]) == !0
  229. }
  230. }
  231. impl<'a, T: AsRef<[u8]> + ?Sized> Packet<&'a T> {
  232. /// Return a pointer to the options.
  233. #[inline]
  234. pub fn options(&self) -> &'a [u8] {
  235. let header_len = self.header_len() as usize;
  236. let data = self.buffer.as_ref();
  237. &data[field::URGENT.end..header_len]
  238. }
  239. /// Return a pointer to the payload.
  240. #[inline]
  241. pub fn payload(&self) -> &'a [u8] {
  242. let header_len = self.header_len() as usize;
  243. let data = self.buffer.as_ref();
  244. &data[header_len..]
  245. }
  246. }
  247. impl<T: AsRef<[u8]> + AsMut<[u8]>> Packet<T> {
  248. /// Set the source port field.
  249. #[inline]
  250. pub fn set_src_port(&mut self, value: u16) {
  251. let mut data = self.buffer.as_mut();
  252. NetworkEndian::write_u16(&mut data[field::SRC_PORT], value)
  253. }
  254. /// Set the destination port field.
  255. #[inline]
  256. pub fn set_dst_port(&mut self, value: u16) {
  257. let mut data = self.buffer.as_mut();
  258. NetworkEndian::write_u16(&mut data[field::DST_PORT], value)
  259. }
  260. /// Set the sequence number field.
  261. #[inline]
  262. pub fn set_seq_number(&mut self, value: SeqNumber) {
  263. let mut data = self.buffer.as_mut();
  264. NetworkEndian::write_i32(&mut data[field::SEQ_NUM], value.0)
  265. }
  266. /// Set the acknowledgement number field.
  267. #[inline]
  268. pub fn set_ack_number(&mut self, value: SeqNumber) {
  269. let mut data = self.buffer.as_mut();
  270. NetworkEndian::write_i32(&mut data[field::ACK_NUM], value.0)
  271. }
  272. /// Clear the entire flags field.
  273. #[inline]
  274. pub fn clear_flags(&mut self) {
  275. let data = self.buffer.as_mut();
  276. let raw = NetworkEndian::read_u16(&data[field::FLAGS]);
  277. let raw = raw & !0x0fff;
  278. NetworkEndian::write_u16(&mut data[field::FLAGS], raw)
  279. }
  280. /// Set the FIN flag.
  281. #[inline]
  282. pub fn set_fin(&mut self, value: bool) {
  283. let mut data = self.buffer.as_mut();
  284. let raw = NetworkEndian::read_u16(&data[field::FLAGS]);
  285. let raw = if value { raw | field::FLG_FIN } else { raw & !field::FLG_FIN };
  286. NetworkEndian::write_u16(&mut data[field::FLAGS], raw)
  287. }
  288. /// Set the SYN flag.
  289. #[inline]
  290. pub fn set_syn(&mut self, value: bool) {
  291. let mut data = self.buffer.as_mut();
  292. let raw = NetworkEndian::read_u16(&data[field::FLAGS]);
  293. let raw = if value { raw | field::FLG_SYN } else { raw & !field::FLG_SYN };
  294. NetworkEndian::write_u16(&mut data[field::FLAGS], raw)
  295. }
  296. /// Set the RST flag.
  297. #[inline]
  298. pub fn set_rst(&mut self, value: bool) {
  299. let mut data = self.buffer.as_mut();
  300. let raw = NetworkEndian::read_u16(&data[field::FLAGS]);
  301. let raw = if value { raw | field::FLG_RST } else { raw & !field::FLG_RST };
  302. NetworkEndian::write_u16(&mut data[field::FLAGS], raw)
  303. }
  304. /// Set the PSH flag.
  305. #[inline]
  306. pub fn set_psh(&mut self, value: bool) {
  307. let mut data = self.buffer.as_mut();
  308. let raw = NetworkEndian::read_u16(&data[field::FLAGS]);
  309. let raw = if value { raw | field::FLG_PSH } else { raw & !field::FLG_PSH };
  310. NetworkEndian::write_u16(&mut data[field::FLAGS], raw)
  311. }
  312. /// Set the ACK flag.
  313. #[inline]
  314. pub fn set_ack(&mut self, value: bool) {
  315. let mut data = self.buffer.as_mut();
  316. let raw = NetworkEndian::read_u16(&data[field::FLAGS]);
  317. let raw = if value { raw | field::FLG_ACK } else { raw & !field::FLG_ACK };
  318. NetworkEndian::write_u16(&mut data[field::FLAGS], raw)
  319. }
  320. /// Set the URG flag.
  321. #[inline]
  322. pub fn set_urg(&mut self, value: bool) {
  323. let mut data = self.buffer.as_mut();
  324. let raw = NetworkEndian::read_u16(&data[field::FLAGS]);
  325. let raw = if value { raw | field::FLG_URG } else { raw & !field::FLG_URG };
  326. NetworkEndian::write_u16(&mut data[field::FLAGS], raw)
  327. }
  328. /// Set the ECE flag.
  329. #[inline]
  330. pub fn set_ece(&mut self, value: bool) {
  331. let mut data = self.buffer.as_mut();
  332. let raw = NetworkEndian::read_u16(&data[field::FLAGS]);
  333. let raw = if value { raw | field::FLG_ECE } else { raw & !field::FLG_ECE };
  334. NetworkEndian::write_u16(&mut data[field::FLAGS], raw)
  335. }
  336. /// Set the CWR flag.
  337. #[inline]
  338. pub fn set_cwr(&mut self, value: bool) {
  339. let mut data = self.buffer.as_mut();
  340. let raw = NetworkEndian::read_u16(&data[field::FLAGS]);
  341. let raw = if value { raw | field::FLG_CWR } else { raw & !field::FLG_CWR };
  342. NetworkEndian::write_u16(&mut data[field::FLAGS], raw)
  343. }
  344. /// Set the NS flag.
  345. #[inline]
  346. pub fn set_ns(&mut self, value: bool) {
  347. let mut data = self.buffer.as_mut();
  348. let raw = NetworkEndian::read_u16(&data[field::FLAGS]);
  349. let raw = if value { raw | field::FLG_NS } else { raw & !field::FLG_NS };
  350. NetworkEndian::write_u16(&mut data[field::FLAGS], raw)
  351. }
  352. /// Set the header length, in octets.
  353. #[inline]
  354. pub fn set_header_len(&mut self, value: u8) {
  355. let mut data = self.buffer.as_mut();
  356. let raw = NetworkEndian::read_u16(&data[field::FLAGS]);
  357. let raw = (raw & !0xf000) | ((value as u16) / 4) << 12;
  358. NetworkEndian::write_u16(&mut data[field::FLAGS], raw)
  359. }
  360. /// Return the window size field.
  361. #[inline]
  362. pub fn set_window_len(&mut self, value: u16) {
  363. let mut data = self.buffer.as_mut();
  364. NetworkEndian::write_u16(&mut data[field::WIN_SIZE], value)
  365. }
  366. /// Set the checksum field.
  367. #[inline]
  368. pub fn set_checksum(&mut self, value: u16) {
  369. let mut data = self.buffer.as_mut();
  370. NetworkEndian::write_u16(&mut data[field::CHECKSUM], value)
  371. }
  372. /// Set the urgent pointer field.
  373. #[inline]
  374. pub fn set_urgent_at(&mut self, value: u16) {
  375. let mut data = self.buffer.as_mut();
  376. NetworkEndian::write_u16(&mut data[field::URGENT], value)
  377. }
  378. /// Compute and fill in the header checksum.
  379. ///
  380. /// # Panics
  381. /// This function panics unless `src_addr` and `dst_addr` belong to the same family,
  382. /// and that family is IPv4 or IPv6.
  383. pub fn fill_checksum(&mut self, src_addr: &IpAddress, dst_addr: &IpAddress) {
  384. self.set_checksum(0);
  385. let checksum = {
  386. let data = self.buffer.as_ref();
  387. !checksum::combine(&[
  388. checksum::pseudo_header(src_addr, dst_addr, IpProtocol::Tcp,
  389. data.len() as u32),
  390. checksum::data(data)
  391. ])
  392. };
  393. self.set_checksum(checksum)
  394. }
  395. }
  396. impl<'a, T: AsRef<[u8]> + AsMut<[u8]> + ?Sized> Packet<&'a mut T> {
  397. /// Return a pointer to the options.
  398. #[inline]
  399. pub fn options_mut(&mut self) -> &mut [u8] {
  400. let header_len = self.header_len() as usize;
  401. let data = self.buffer.as_mut();
  402. &mut data[field::URGENT.end..header_len]
  403. }
  404. /// Return a mutable pointer to the payload data.
  405. #[inline]
  406. pub fn payload_mut(&mut self) -> &mut [u8] {
  407. let header_len = self.header_len() as usize;
  408. let mut data = self.buffer.as_mut();
  409. &mut data[header_len..]
  410. }
  411. }
  412. /// A representation of a single TCP option.
  413. #[derive(Debug, PartialEq, Eq, Clone, Copy)]
  414. pub enum TcpOption<'a> {
  415. EndOfList,
  416. NoOperation,
  417. MaxSegmentSize(u16),
  418. WindowScale(u8),
  419. Unknown { kind: u8, data: &'a [u8] }
  420. }
  421. impl<'a> TcpOption<'a> {
  422. pub fn parse(buffer: &'a [u8]) -> Result<(&'a [u8], TcpOption<'a>), Error> {
  423. let (length, option);
  424. match *buffer.get(0).ok_or(Error::Truncated)? {
  425. field::OPT_END => {
  426. length = 1;
  427. option = TcpOption::EndOfList;
  428. }
  429. field::OPT_NOP => {
  430. length = 1;
  431. option = TcpOption::NoOperation;
  432. }
  433. kind => {
  434. length = *buffer.get(1).ok_or(Error::Truncated)? as usize;
  435. if buffer.len() < length { return Err(Error::Truncated) }
  436. let data = &buffer[2..length];
  437. match (kind, length) {
  438. (field::OPT_END, _) |
  439. (field::OPT_NOP, _) =>
  440. unreachable!(),
  441. (field::OPT_MSS, 4) =>
  442. option = TcpOption::MaxSegmentSize(NetworkEndian::read_u16(data)),
  443. (field::OPT_MSS, _) =>
  444. return Err(Error::Malformed),
  445. (field::OPT_WS, 3) =>
  446. option = TcpOption::WindowScale(data[0]),
  447. (field::OPT_WS, _) =>
  448. return Err(Error::Malformed),
  449. (_, _) =>
  450. option = TcpOption::Unknown { kind: kind, data: data }
  451. }
  452. }
  453. }
  454. Ok((&buffer[length..], option))
  455. }
  456. pub fn buffer_len(&self) -> usize {
  457. match self {
  458. &TcpOption::EndOfList => 1,
  459. &TcpOption::NoOperation => 1,
  460. &TcpOption::MaxSegmentSize(_) => 4,
  461. &TcpOption::WindowScale(_) => 3,
  462. &TcpOption::Unknown { data, .. } => 2 + data.len()
  463. }
  464. }
  465. pub fn emit<'b>(&self, buffer: &'b mut [u8]) -> &'b mut [u8] {
  466. let length;
  467. match self {
  468. &TcpOption::EndOfList => {
  469. length = 1;
  470. buffer[0] = field::OPT_END;
  471. }
  472. &TcpOption::NoOperation => {
  473. length = 1;
  474. buffer[0] = field::OPT_NOP;
  475. }
  476. _ => {
  477. length = self.buffer_len();
  478. buffer[1] = length as u8;
  479. match self {
  480. &TcpOption::EndOfList |
  481. &TcpOption::NoOperation =>
  482. unreachable!(),
  483. &TcpOption::MaxSegmentSize(value) => {
  484. buffer[0] = field::OPT_MSS;
  485. NetworkEndian::write_u16(&mut buffer[2..], value)
  486. }
  487. &TcpOption::WindowScale(value) => {
  488. buffer[0] = field::OPT_WS;
  489. buffer[2] = value;
  490. }
  491. &TcpOption::Unknown { kind, data: provided } => {
  492. buffer[0] = kind;
  493. buffer[2..].copy_from_slice(provided)
  494. }
  495. }
  496. }
  497. }
  498. &mut buffer[length..]
  499. }
  500. }
  501. /// The control flags of a Transmission Control Protocol packet.
  502. #[derive(Debug, PartialEq, Eq, Clone, Copy)]
  503. pub enum Control {
  504. None,
  505. Syn,
  506. Fin,
  507. Rst
  508. }
  509. /// A high-level representation of a Transmission Control Protocol packet.
  510. #[derive(Debug, PartialEq, Eq, Clone, Copy)]
  511. pub struct Repr<'a> {
  512. pub src_port: u16,
  513. pub dst_port: u16,
  514. pub control: Control,
  515. pub seq_number: SeqNumber,
  516. pub ack_number: Option<SeqNumber>,
  517. pub window_len: u16,
  518. pub max_seg_size: Option<u16>,
  519. pub payload: &'a [u8]
  520. }
  521. impl<'a> Repr<'a> {
  522. /// Parse a Transmission Control Protocol packet and return a high-level representation.
  523. pub fn parse<T: ?Sized>(packet: &Packet<&'a T>,
  524. src_addr: &IpAddress,
  525. dst_addr: &IpAddress) -> Result<Repr<'a>, Error>
  526. where T: AsRef<[u8]> {
  527. // Source and destination ports must be present.
  528. if packet.src_port() == 0 { return Err(Error::Malformed) }
  529. if packet.dst_port() == 0 { return Err(Error::Malformed) }
  530. // Valid checksum is expected...
  531. if !packet.verify_checksum(src_addr, dst_addr) { return Err(Error::Checksum) }
  532. let control =
  533. match (packet.syn(), packet.fin(), packet.rst()) {
  534. (false, false, false) => Control::None,
  535. (true, false, false) => Control::Syn,
  536. (false, true, false) => Control::Fin,
  537. (false, false, true ) => Control::Rst,
  538. _ => return Err(Error::Malformed)
  539. };
  540. let ack_number =
  541. match packet.ack() {
  542. true => Some(packet.ack_number()),
  543. false => None
  544. };
  545. // The PSH flag is ignored.
  546. // The URG flag and the urgent field is ignored. This behavior is standards-compliant,
  547. // however, most deployed systems (e.g. Linux) are *not* standards-compliant, and would
  548. // cut the byte at the urgent pointer from the stream.
  549. let mut max_seg_size = None;
  550. let mut options = packet.options();
  551. while options.len() > 0 {
  552. let (next_options, option) = TcpOption::parse(options)?;
  553. match option {
  554. TcpOption::EndOfList => break,
  555. TcpOption::NoOperation => (),
  556. TcpOption::MaxSegmentSize(value) =>
  557. max_seg_size = Some(value),
  558. _ => ()
  559. }
  560. options = next_options;
  561. }
  562. Ok(Repr {
  563. src_port: packet.src_port(),
  564. dst_port: packet.dst_port(),
  565. control: control,
  566. seq_number: packet.seq_number(),
  567. ack_number: ack_number,
  568. window_len: packet.window_len(),
  569. max_seg_size: max_seg_size,
  570. payload: packet.payload()
  571. })
  572. }
  573. /// Return the length of a header that will be emitted from this high-level representation.
  574. pub fn header_len(&self) -> usize {
  575. let mut length = field::URGENT.end;
  576. if self.max_seg_size.is_some() {
  577. length += 4
  578. }
  579. length
  580. }
  581. /// Return the length of a packet that will be emitted from this high-level representation.
  582. pub fn buffer_len(&self) -> usize {
  583. self.header_len() + self.payload.len()
  584. }
  585. /// Emit a high-level representation into a Transmission Control Protocol packet.
  586. pub fn emit<T: ?Sized>(&self, packet: &mut Packet<&mut T>,
  587. src_addr: &IpAddress,
  588. dst_addr: &IpAddress)
  589. where T: AsRef<[u8]> + AsMut<[u8]> {
  590. packet.set_src_port(self.src_port);
  591. packet.set_dst_port(self.dst_port);
  592. packet.set_seq_number(self.seq_number);
  593. packet.set_ack_number(self.ack_number.unwrap_or(SeqNumber(0)));
  594. packet.set_window_len(self.window_len);
  595. packet.set_header_len(self.header_len() as u8);
  596. packet.clear_flags();
  597. match self.control {
  598. Control::None => (),
  599. Control::Syn => packet.set_syn(true),
  600. Control::Fin => packet.set_fin(true),
  601. Control::Rst => packet.set_rst(true)
  602. }
  603. packet.set_ack(self.ack_number.is_some());
  604. {
  605. let mut options = packet.options_mut();
  606. if let Some(value) = self.max_seg_size {
  607. let tmp = options; options = TcpOption::MaxSegmentSize(value).emit(tmp);
  608. }
  609. if options.len() > 0 {
  610. TcpOption::EndOfList.emit(options);
  611. }
  612. }
  613. packet.payload_mut().copy_from_slice(self.payload);
  614. packet.fill_checksum(src_addr, dst_addr)
  615. }
  616. }
  617. impl<'a, T: AsRef<[u8]> + ?Sized> fmt::Display for Packet<&'a T> {
  618. fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
  619. // Cannot use Repr::parse because we don't have the IP addresses.
  620. try!(write!(f, "TCP src={} dst={}",
  621. self.src_port(), self.dst_port()));
  622. if self.syn() { try!(write!(f, " syn")) }
  623. if self.fin() { try!(write!(f, " fin")) }
  624. if self.rst() { try!(write!(f, " rst")) }
  625. if self.psh() { try!(write!(f, " psh")) }
  626. if self.ece() { try!(write!(f, " ece")) }
  627. if self.cwr() { try!(write!(f, " cwr")) }
  628. if self.ns() { try!(write!(f, " ns" )) }
  629. try!(write!(f, " seq={}", self.seq_number()));
  630. if self.ack() {
  631. try!(write!(f, " ack={}", self.ack_number()));
  632. }
  633. try!(write!(f, " win={}", self.window_len()));
  634. if self.urg() {
  635. try!(write!(f, " urg={}", self.urgent_at()))
  636. }
  637. try!(write!(f, " len={}", self.payload().len()));
  638. let mut options = self.options();
  639. while options.len() > 0 {
  640. let (next_options, option) =
  641. match TcpOption::parse(options) {
  642. Ok(res) => res,
  643. Err(err) => return write!(f, " ({})", err)
  644. };
  645. match option {
  646. TcpOption::EndOfList => break,
  647. TcpOption::NoOperation => (),
  648. TcpOption::MaxSegmentSize(value) =>
  649. try!(write!(f, " mss={}", value)),
  650. TcpOption::WindowScale(value) =>
  651. try!(write!(f, " ws={}", value)),
  652. TcpOption::Unknown { kind, .. } =>
  653. try!(write!(f, " opt({})", kind)),
  654. }
  655. options = next_options;
  656. }
  657. Ok(())
  658. }
  659. }
  660. impl<'a> fmt::Display for Repr<'a> {
  661. fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
  662. try!(write!(f, "TCP src={} dst={}",
  663. self.src_port, self.dst_port));
  664. match self.control {
  665. Control::Syn => try!(write!(f, " syn")),
  666. Control::Fin => try!(write!(f, " fin")),
  667. Control::Rst => try!(write!(f, " rst")),
  668. Control::None => ()
  669. }
  670. try!(write!(f, " seq={}", self.seq_number));
  671. if let Some(ack_number) = self.ack_number {
  672. try!(write!(f, " ack={}", ack_number));
  673. }
  674. try!(write!(f, " win={}", self.window_len));
  675. try!(write!(f, " len={}", self.payload.len()));
  676. if let Some(max_seg_size) = self.max_seg_size {
  677. try!(write!(f, " mss={}", max_seg_size));
  678. }
  679. Ok(())
  680. }
  681. }
  682. use super::pretty_print::{PrettyPrint, PrettyIndent};
  683. impl<T: AsRef<[u8]>> PrettyPrint for Packet<T> {
  684. fn pretty_print(buffer: &AsRef<[u8]>, f: &mut fmt::Formatter,
  685. indent: &mut PrettyIndent) -> fmt::Result {
  686. match Packet::new(buffer) {
  687. Err(err) => write!(f, "{}({})\n", indent, err),
  688. Ok(packet) => write!(f, "{}{}\n", indent, packet)
  689. }
  690. }
  691. }
  692. #[cfg(test)]
  693. mod test {
  694. use wire::Ipv4Address;
  695. use super::*;
  696. const SRC_ADDR: Ipv4Address = Ipv4Address([192, 168, 1, 1]);
  697. const DST_ADDR: Ipv4Address = Ipv4Address([192, 168, 1, 2]);
  698. static PACKET_BYTES: [u8; 28] =
  699. [0xbf, 0x00, 0x00, 0x50,
  700. 0x01, 0x23, 0x45, 0x67,
  701. 0x89, 0xab, 0xcd, 0xef,
  702. 0x60, 0x35, 0x01, 0x23,
  703. 0x01, 0xb6, 0x02, 0x01,
  704. 0x03, 0x03, 0x0c, 0x01,
  705. 0xaa, 0x00, 0x00, 0xff];
  706. static OPTION_BYTES: [u8; 4] =
  707. [0x03, 0x03, 0x0c, 0x01];
  708. static PAYLOAD_BYTES: [u8; 4] =
  709. [0xaa, 0x00, 0x00, 0xff];
  710. #[test]
  711. fn test_deconstruct() {
  712. let packet = Packet::new(&PACKET_BYTES[..]).unwrap();
  713. assert_eq!(packet.src_port(), 48896);
  714. assert_eq!(packet.dst_port(), 80);
  715. assert_eq!(packet.seq_number(), SeqNumber(0x01234567));
  716. assert_eq!(packet.ack_number(), SeqNumber(0x89abcdefu32 as i32));
  717. assert_eq!(packet.header_len(), 24);
  718. assert_eq!(packet.fin(), true);
  719. assert_eq!(packet.syn(), false);
  720. assert_eq!(packet.rst(), true);
  721. assert_eq!(packet.psh(), false);
  722. assert_eq!(packet.ack(), true);
  723. assert_eq!(packet.urg(), true);
  724. assert_eq!(packet.window_len(), 0x0123);
  725. assert_eq!(packet.urgent_at(), 0x0201);
  726. assert_eq!(packet.checksum(), 0x01b6);
  727. assert_eq!(packet.options(), &OPTION_BYTES[..]);
  728. assert_eq!(packet.payload(), &PAYLOAD_BYTES[..]);
  729. assert_eq!(packet.verify_checksum(&SRC_ADDR.into(), &DST_ADDR.into()), true);
  730. }
  731. #[test]
  732. fn test_construct() {
  733. let mut bytes = vec![0; PACKET_BYTES.len()];
  734. let mut packet = Packet::new(&mut bytes).unwrap();
  735. packet.set_src_port(48896);
  736. packet.set_dst_port(80);
  737. packet.set_seq_number(SeqNumber(0x01234567));
  738. packet.set_ack_number(SeqNumber(0x89abcdefu32 as i32));
  739. packet.set_header_len(24);
  740. packet.set_fin(true);
  741. packet.set_syn(false);
  742. packet.set_rst(true);
  743. packet.set_psh(false);
  744. packet.set_ack(true);
  745. packet.set_urg(true);
  746. packet.set_window_len(0x0123);
  747. packet.set_urgent_at(0x0201);
  748. packet.set_checksum(0xEEEE);
  749. packet.options_mut().copy_from_slice(&OPTION_BYTES[..]);
  750. packet.payload_mut().copy_from_slice(&PAYLOAD_BYTES[..]);
  751. packet.fill_checksum(&SRC_ADDR.into(), &DST_ADDR.into());
  752. assert_eq!(&packet.into_inner()[..], &PACKET_BYTES[..]);
  753. }
  754. static SYN_PACKET_BYTES: [u8; 24] =
  755. [0xbf, 0x00, 0x00, 0x50,
  756. 0x01, 0x23, 0x45, 0x67,
  757. 0x00, 0x00, 0x00, 0x00,
  758. 0x50, 0x02, 0x01, 0x23,
  759. 0x7a, 0x8d, 0x00, 0x00,
  760. 0xaa, 0x00, 0x00, 0xff];
  761. fn packet_repr() -> Repr<'static> {
  762. Repr {
  763. src_port: 48896,
  764. dst_port: 80,
  765. seq_number: SeqNumber(0x01234567),
  766. ack_number: None,
  767. window_len: 0x0123,
  768. control: Control::Syn,
  769. max_seg_size: None,
  770. payload: &PAYLOAD_BYTES
  771. }
  772. }
  773. #[test]
  774. fn test_parse() {
  775. let packet = Packet::new(&SYN_PACKET_BYTES[..]).unwrap();
  776. let repr = Repr::parse(&packet, &SRC_ADDR.into(), &DST_ADDR.into()).unwrap();
  777. assert_eq!(repr, packet_repr());
  778. }
  779. #[test]
  780. fn test_emit() {
  781. let repr = packet_repr();
  782. let mut bytes = vec![0; repr.buffer_len()];
  783. let mut packet = Packet::new(&mut bytes).unwrap();
  784. repr.emit(&mut packet, &SRC_ADDR.into(), &DST_ADDR.into());
  785. assert_eq!(&packet.into_inner()[..], &SYN_PACKET_BYTES[..]);
  786. }
  787. macro_rules! assert_option_parses {
  788. ($opt:expr, $data:expr) => ({
  789. assert_eq!(TcpOption::parse($data), Ok((&[][..], $opt)));
  790. let buffer = &mut [0; 20][..$opt.buffer_len()];
  791. assert_eq!($opt.emit(buffer), &mut []);
  792. assert_eq!(&*buffer, $data);
  793. })
  794. }
  795. #[test]
  796. fn test_tcp_options() {
  797. assert_option_parses!(TcpOption::EndOfList,
  798. &[0x00]);
  799. assert_option_parses!(TcpOption::NoOperation,
  800. &[0x01]);
  801. assert_option_parses!(TcpOption::MaxSegmentSize(1500),
  802. &[0x02, 0x04, 0x05, 0xdc]);
  803. assert_option_parses!(TcpOption::WindowScale(12),
  804. &[0x03, 0x03, 0x0c]);
  805. assert_option_parses!(TcpOption::Unknown { kind: 12, data: &[1, 2, 3][..] },
  806. &[0x0c, 0x05, 0x01, 0x02, 0x03])
  807. }
  808. #[test]
  809. fn test_malformed_tcp_options() {
  810. assert_eq!(TcpOption::parse(&[]),
  811. Err(Error::Truncated));
  812. assert_eq!(TcpOption::parse(&[0xc]),
  813. Err(Error::Truncated));
  814. assert_eq!(TcpOption::parse(&[0xc, 0x05, 0x01, 0x02]),
  815. Err(Error::Truncated));
  816. assert_eq!(TcpOption::parse(&[0x2, 0x02]),
  817. Err(Error::Malformed));
  818. assert_eq!(TcpOption::parse(&[0x3, 0x02]),
  819. Err(Error::Malformed));
  820. }
  821. }