tcp.rs 32 KB

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