tcp.rs 33 KB

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