tcp.rs 32 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973
  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 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>, Error> {
  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<(), Error> {
  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. #[inline]
  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 mut 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 mut 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 mut 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 mut 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 mut 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 mut 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 mut 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 mut 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 mut 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 mut 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 mut 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 mut 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 mut 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 mut 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 mut 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 mut 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 mut 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 mut 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>), Error> {
  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 control flags of a Transmission Control Protocol packet.
  534. #[derive(Debug, PartialEq, Eq, Clone, Copy)]
  535. pub enum Control {
  536. None,
  537. Syn,
  538. Fin,
  539. Rst
  540. }
  541. /// A high-level representation of a Transmission Control Protocol packet.
  542. #[derive(Debug, PartialEq, Eq, Clone, Copy)]
  543. pub struct Repr<'a> {
  544. pub src_port: u16,
  545. pub dst_port: u16,
  546. pub control: Control,
  547. pub push: bool,
  548. pub seq_number: SeqNumber,
  549. pub ack_number: Option<SeqNumber>,
  550. pub window_len: u16,
  551. pub max_seg_size: Option<u16>,
  552. pub payload: &'a [u8]
  553. }
  554. impl<'a> Repr<'a> {
  555. /// Parse a Transmission Control Protocol packet and return a high-level representation.
  556. pub fn parse<T: ?Sized>(packet: &Packet<&'a T>,
  557. src_addr: &IpAddress,
  558. dst_addr: &IpAddress) -> Result<Repr<'a>, Error>
  559. where T: AsRef<[u8]> {
  560. // Source and destination ports must be present.
  561. if packet.src_port() == 0 { return Err(Error::Malformed) }
  562. if packet.dst_port() == 0 { return Err(Error::Malformed) }
  563. // Valid checksum is expected...
  564. if !packet.verify_checksum(src_addr, dst_addr) { return Err(Error::Checksum) }
  565. let control =
  566. match (packet.syn(), packet.fin(), packet.rst()) {
  567. (false, false, false) => Control::None,
  568. (true, false, false) => Control::Syn,
  569. (false, true, false) => Control::Fin,
  570. (false, false, true ) => Control::Rst,
  571. _ => return Err(Error::Malformed)
  572. };
  573. let ack_number =
  574. match packet.ack() {
  575. true => Some(packet.ack_number()),
  576. false => None
  577. };
  578. // The PSH flag is ignored.
  579. // The URG flag and the urgent field is ignored. This behavior is standards-compliant,
  580. // however, most deployed systems (e.g. Linux) are *not* standards-compliant, and would
  581. // cut the byte at the urgent pointer from the stream.
  582. let mut max_seg_size = None;
  583. let mut options = packet.options();
  584. while options.len() > 0 {
  585. let (next_options, option) = TcpOption::parse(options)?;
  586. match option {
  587. TcpOption::EndOfList => break,
  588. TcpOption::NoOperation => (),
  589. TcpOption::MaxSegmentSize(value) =>
  590. max_seg_size = Some(value),
  591. _ => ()
  592. }
  593. options = next_options;
  594. }
  595. Ok(Repr {
  596. src_port: packet.src_port(),
  597. dst_port: packet.dst_port(),
  598. control: control,
  599. push: packet.psh(),
  600. seq_number: packet.seq_number(),
  601. ack_number: ack_number,
  602. window_len: packet.window_len(),
  603. max_seg_size: max_seg_size,
  604. payload: packet.payload()
  605. })
  606. }
  607. /// Return the length of a header that will be emitted from this high-level representation.
  608. pub fn header_len(&self) -> usize {
  609. let mut length = field::URGENT.end;
  610. if self.max_seg_size.is_some() {
  611. length += 4
  612. }
  613. length
  614. }
  615. /// Return the length of a packet that will be emitted from this high-level representation.
  616. pub fn buffer_len(&self) -> usize {
  617. self.header_len() + self.payload.len()
  618. }
  619. /// Emit a high-level representation into a Transmission Control Protocol packet.
  620. pub fn emit<T: ?Sized>(&self, packet: &mut Packet<&mut T>,
  621. src_addr: &IpAddress,
  622. dst_addr: &IpAddress)
  623. where T: AsRef<[u8]> + AsMut<[u8]> {
  624. packet.set_src_port(self.src_port);
  625. packet.set_dst_port(self.dst_port);
  626. packet.set_seq_number(self.seq_number);
  627. packet.set_ack_number(self.ack_number.unwrap_or(SeqNumber(0)));
  628. packet.set_window_len(self.window_len);
  629. packet.set_header_len(self.header_len() as u8);
  630. packet.clear_flags();
  631. match self.control {
  632. Control::None => (),
  633. Control::Syn => packet.set_syn(true),
  634. Control::Fin => packet.set_fin(true),
  635. Control::Rst => packet.set_rst(true)
  636. }
  637. packet.set_psh(self.push);
  638. packet.set_ack(self.ack_number.is_some());
  639. {
  640. let mut options = packet.options_mut();
  641. if let Some(value) = self.max_seg_size {
  642. let tmp = options; options = TcpOption::MaxSegmentSize(value).emit(tmp);
  643. }
  644. if options.len() > 0 {
  645. TcpOption::EndOfList.emit(options);
  646. }
  647. }
  648. packet.payload_mut().copy_from_slice(self.payload);
  649. packet.fill_checksum(src_addr, dst_addr)
  650. }
  651. }
  652. impl<'a, T: AsRef<[u8]> + ?Sized> fmt::Display for Packet<&'a T> {
  653. fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
  654. // Cannot use Repr::parse because we don't have the IP addresses.
  655. write!(f, "TCP src={} dst={}",
  656. self.src_port(), self.dst_port())?;
  657. if self.syn() { write!(f, " syn")? }
  658. if self.fin() { write!(f, " fin")? }
  659. if self.rst() { write!(f, " rst")? }
  660. if self.psh() { write!(f, " psh")? }
  661. if self.ece() { write!(f, " ece")? }
  662. if self.cwr() { write!(f, " cwr")? }
  663. if self.ns() { write!(f, " ns" )? }
  664. write!(f, " seq={}", self.seq_number())?;
  665. if self.ack() {
  666. write!(f, " ack={}", self.ack_number())?;
  667. }
  668. write!(f, " win={}", self.window_len())?;
  669. if self.urg() {
  670. write!(f, " urg={}", self.urgent_at())?;
  671. }
  672. write!(f, " len={}", self.payload().len())?;
  673. let mut options = self.options();
  674. while options.len() > 0 {
  675. let (next_options, option) =
  676. match TcpOption::parse(options) {
  677. Ok(res) => res,
  678. Err(err) => return write!(f, " ({})", err)
  679. };
  680. match option {
  681. TcpOption::EndOfList => break,
  682. TcpOption::NoOperation => (),
  683. TcpOption::MaxSegmentSize(value) =>
  684. write!(f, " mss={}", value)?,
  685. TcpOption::WindowScale(value) =>
  686. write!(f, " ws={}", value)?,
  687. TcpOption::Unknown { kind, .. } =>
  688. write!(f, " opt({})", kind)?,
  689. }
  690. options = next_options;
  691. }
  692. Ok(())
  693. }
  694. }
  695. impl<'a> fmt::Display for Repr<'a> {
  696. fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
  697. write!(f, "TCP src={} dst={}",
  698. self.src_port, self.dst_port)?;
  699. match self.control {
  700. Control::Syn => write!(f, " syn")?,
  701. Control::Fin => write!(f, " fin")?,
  702. Control::Rst => write!(f, " rst")?,
  703. Control::None => ()
  704. }
  705. if self.push {
  706. write!(f, " psh")?;
  707. }
  708. write!(f, " seq={}", self.seq_number)?;
  709. if let Some(ack_number) = self.ack_number {
  710. write!(f, " ack={}", ack_number)?;
  711. }
  712. write!(f, " win={}", self.window_len)?;
  713. write!(f, " len={}", self.payload.len())?;
  714. if let Some(max_seg_size) = self.max_seg_size {
  715. write!(f, " mss={}", max_seg_size)?;
  716. }
  717. Ok(())
  718. }
  719. }
  720. use super::pretty_print::{PrettyPrint, PrettyIndent};
  721. impl<T: AsRef<[u8]>> PrettyPrint for Packet<T> {
  722. fn pretty_print(buffer: &AsRef<[u8]>, f: &mut fmt::Formatter,
  723. indent: &mut PrettyIndent) -> fmt::Result {
  724. match Packet::new_checked(buffer) {
  725. Err(err) => write!(f, "{}({})\n", indent, err),
  726. Ok(packet) => write!(f, "{}{}\n", indent, packet)
  727. }
  728. }
  729. }
  730. #[cfg(test)]
  731. mod test {
  732. use wire::Ipv4Address;
  733. use super::*;
  734. const SRC_ADDR: Ipv4Address = Ipv4Address([192, 168, 1, 1]);
  735. const DST_ADDR: Ipv4Address = Ipv4Address([192, 168, 1, 2]);
  736. static PACKET_BYTES: [u8; 28] =
  737. [0xbf, 0x00, 0x00, 0x50,
  738. 0x01, 0x23, 0x45, 0x67,
  739. 0x89, 0xab, 0xcd, 0xef,
  740. 0x60, 0x35, 0x01, 0x23,
  741. 0x01, 0xb6, 0x02, 0x01,
  742. 0x03, 0x03, 0x0c, 0x01,
  743. 0xaa, 0x00, 0x00, 0xff];
  744. static OPTION_BYTES: [u8; 4] =
  745. [0x03, 0x03, 0x0c, 0x01];
  746. static PAYLOAD_BYTES: [u8; 4] =
  747. [0xaa, 0x00, 0x00, 0xff];
  748. #[test]
  749. fn test_deconstruct() {
  750. let packet = Packet::new(&PACKET_BYTES[..]);
  751. assert_eq!(packet.src_port(), 48896);
  752. assert_eq!(packet.dst_port(), 80);
  753. assert_eq!(packet.seq_number(), SeqNumber(0x01234567));
  754. assert_eq!(packet.ack_number(), SeqNumber(0x89abcdefu32 as i32));
  755. assert_eq!(packet.header_len(), 24);
  756. assert_eq!(packet.fin(), true);
  757. assert_eq!(packet.syn(), false);
  758. assert_eq!(packet.rst(), true);
  759. assert_eq!(packet.psh(), false);
  760. assert_eq!(packet.ack(), true);
  761. assert_eq!(packet.urg(), true);
  762. assert_eq!(packet.window_len(), 0x0123);
  763. assert_eq!(packet.urgent_at(), 0x0201);
  764. assert_eq!(packet.checksum(), 0x01b6);
  765. assert_eq!(packet.options(), &OPTION_BYTES[..]);
  766. assert_eq!(packet.payload(), &PAYLOAD_BYTES[..]);
  767. assert_eq!(packet.verify_checksum(&SRC_ADDR.into(), &DST_ADDR.into()), true);
  768. }
  769. #[test]
  770. fn test_construct() {
  771. let mut bytes = vec![0; PACKET_BYTES.len()];
  772. let mut packet = Packet::new(&mut bytes);
  773. packet.set_src_port(48896);
  774. packet.set_dst_port(80);
  775. packet.set_seq_number(SeqNumber(0x01234567));
  776. packet.set_ack_number(SeqNumber(0x89abcdefu32 as i32));
  777. packet.set_header_len(24);
  778. packet.set_fin(true);
  779. packet.set_syn(false);
  780. packet.set_rst(true);
  781. packet.set_psh(false);
  782. packet.set_ack(true);
  783. packet.set_urg(true);
  784. packet.set_window_len(0x0123);
  785. packet.set_urgent_at(0x0201);
  786. packet.set_checksum(0xEEEE);
  787. packet.options_mut().copy_from_slice(&OPTION_BYTES[..]);
  788. packet.payload_mut().copy_from_slice(&PAYLOAD_BYTES[..]);
  789. packet.fill_checksum(&SRC_ADDR.into(), &DST_ADDR.into());
  790. assert_eq!(&packet.into_inner()[..], &PACKET_BYTES[..]);
  791. }
  792. #[test]
  793. fn test_truncated() {
  794. let packet = Packet::new(&PACKET_BYTES[..23]);
  795. assert_eq!(packet.check_len(), Err(Error::Truncated));
  796. }
  797. #[test]
  798. fn test_impossible_len() {
  799. let mut bytes = vec![0; 20];
  800. let mut packet = Packet::new(&mut bytes);
  801. packet.set_header_len(10);
  802. assert_eq!(packet.check_len(), Err(Error::Malformed));
  803. }
  804. static SYN_PACKET_BYTES: [u8; 24] =
  805. [0xbf, 0x00, 0x00, 0x50,
  806. 0x01, 0x23, 0x45, 0x67,
  807. 0x00, 0x00, 0x00, 0x00,
  808. 0x50, 0x0a, 0x01, 0x23,
  809. 0x7a, 0x85, 0x00, 0x00,
  810. 0xaa, 0x00, 0x00, 0xff];
  811. fn packet_repr() -> Repr<'static> {
  812. Repr {
  813. src_port: 48896,
  814. dst_port: 80,
  815. seq_number: SeqNumber(0x01234567),
  816. ack_number: None,
  817. window_len: 0x0123,
  818. control: Control::Syn,
  819. push: true,
  820. max_seg_size: None,
  821. payload: &PAYLOAD_BYTES
  822. }
  823. }
  824. #[test]
  825. fn test_parse() {
  826. let packet = Packet::new(&SYN_PACKET_BYTES[..]);
  827. let repr = Repr::parse(&packet, &SRC_ADDR.into(), &DST_ADDR.into()).unwrap();
  828. assert_eq!(repr, packet_repr());
  829. }
  830. #[test]
  831. fn test_emit() {
  832. let repr = packet_repr();
  833. let mut bytes = vec![0; repr.buffer_len()];
  834. let mut packet = Packet::new(&mut bytes);
  835. repr.emit(&mut packet, &SRC_ADDR.into(), &DST_ADDR.into());
  836. assert_eq!(&packet.into_inner()[..], &SYN_PACKET_BYTES[..]);
  837. }
  838. macro_rules! assert_option_parses {
  839. ($opt:expr, $data:expr) => ({
  840. assert_eq!(TcpOption::parse($data), Ok((&[][..], $opt)));
  841. let buffer = &mut [0; 20][..$opt.buffer_len()];
  842. assert_eq!($opt.emit(buffer), &mut []);
  843. assert_eq!(&*buffer, $data);
  844. })
  845. }
  846. #[test]
  847. fn test_tcp_options() {
  848. assert_option_parses!(TcpOption::EndOfList,
  849. &[0x00]);
  850. assert_option_parses!(TcpOption::NoOperation,
  851. &[0x01]);
  852. assert_option_parses!(TcpOption::MaxSegmentSize(1500),
  853. &[0x02, 0x04, 0x05, 0xdc]);
  854. assert_option_parses!(TcpOption::WindowScale(12),
  855. &[0x03, 0x03, 0x0c]);
  856. assert_option_parses!(TcpOption::Unknown { kind: 12, data: &[1, 2, 3][..] },
  857. &[0x0c, 0x05, 0x01, 0x02, 0x03])
  858. }
  859. #[test]
  860. fn test_malformed_tcp_options() {
  861. assert_eq!(TcpOption::parse(&[]),
  862. Err(Error::Truncated));
  863. assert_eq!(TcpOption::parse(&[0xc]),
  864. Err(Error::Truncated));
  865. assert_eq!(TcpOption::parse(&[0xc, 0x05, 0x01, 0x02]),
  866. Err(Error::Truncated));
  867. assert_eq!(TcpOption::parse(&[0xc, 0x01]),
  868. Err(Error::Truncated));
  869. assert_eq!(TcpOption::parse(&[0x2, 0x02]),
  870. Err(Error::Malformed));
  871. assert_eq!(TcpOption::parse(&[0x3, 0x02]),
  872. Err(Error::Malformed));
  873. }
  874. }