tcp.rs 80 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243
  1. use core::fmt;
  2. use managed::Managed;
  3. use Error;
  4. use wire::{IpProtocol, IpAddress, IpEndpoint};
  5. use wire::{TcpSeqNumber, TcpPacket, TcpRepr, TcpControl};
  6. use socket::{Socket, IpRepr, IpPayload};
  7. /// A TCP stream ring buffer.
  8. #[derive(Debug)]
  9. pub struct SocketBuffer<'a> {
  10. storage: Managed<'a, [u8]>,
  11. read_at: usize,
  12. length: usize
  13. }
  14. impl<'a> SocketBuffer<'a> {
  15. /// Create a packet buffer with the given storage.
  16. pub fn new<T>(storage: T) -> SocketBuffer<'a>
  17. where T: Into<Managed<'a, [u8]>> {
  18. SocketBuffer {
  19. storage: storage.into(),
  20. read_at: 0,
  21. length: 0
  22. }
  23. }
  24. fn capacity(&self) -> usize {
  25. self.storage.len()
  26. }
  27. fn len(&self) -> usize {
  28. self.length
  29. }
  30. fn window(&self) -> usize {
  31. self.capacity() - self.len()
  32. }
  33. fn empty(&self) -> bool {
  34. self.len() == 0
  35. }
  36. fn full(&self) -> bool {
  37. self.window() == 0
  38. }
  39. fn clamp_writer(&self, mut size: usize) -> (usize, usize) {
  40. let write_at = (self.read_at + self.length) % self.storage.len();
  41. // We can't enqueue more than there is free space.
  42. let free = self.storage.len() - self.length;
  43. if size > free { size = free }
  44. // We can't contiguously enqueue past the beginning of the storage.
  45. let until_end = self.storage.len() - write_at;
  46. if size > until_end { size = until_end }
  47. (write_at, size)
  48. }
  49. fn enqueue(&mut self, size: usize) -> &mut [u8] {
  50. let (write_at, size) = self.clamp_writer(size);
  51. self.length += size;
  52. &mut self.storage[write_at..write_at + size]
  53. }
  54. fn enqueue_slice(&mut self, data: &[u8]) {
  55. let data = {
  56. let mut dest = self.enqueue(data.len());
  57. let (data, rest) = data.split_at(dest.len());
  58. dest.copy_from_slice(data);
  59. rest
  60. };
  61. // Retry, in case we had a wraparound.
  62. let mut dest = self.enqueue(data.len());
  63. let (data, _) = data.split_at(dest.len());
  64. dest.copy_from_slice(data);
  65. }
  66. fn clamp_reader(&self, offset: usize, mut size: usize) -> (usize, usize) {
  67. let read_at = (self.read_at + offset) % self.storage.len();
  68. // We can't read past the end of the queued data.
  69. if offset > self.length { return (read_at, 0) }
  70. // We can't dequeue more than was queued.
  71. let clamped_length = self.length - offset;
  72. if size > clamped_length { size = clamped_length }
  73. // We can't contiguously dequeue past the end of the storage.
  74. let until_end = self.storage.len() - read_at;
  75. if size > until_end { size = until_end }
  76. (read_at, size)
  77. }
  78. fn dequeue(&mut self, size: usize) -> &[u8] {
  79. let (read_at, size) = self.clamp_reader(0, size);
  80. self.read_at = (self.read_at + size) % self.storage.len();
  81. self.length -= size;
  82. &self.storage[read_at..read_at + size]
  83. }
  84. fn peek(&self, offset: usize, size: usize) -> &[u8] {
  85. let (read_at, size) = self.clamp_reader(offset, size);
  86. &self.storage[read_at..read_at + size]
  87. }
  88. fn advance(&mut self, size: usize) {
  89. if size > self.length {
  90. panic!("advancing {} octets into free space", size - self.length)
  91. }
  92. self.read_at = (self.read_at + size) % self.storage.len();
  93. self.length -= size;
  94. }
  95. }
  96. impl<'a> Into<SocketBuffer<'a>> for Managed<'a, [u8]> {
  97. fn into(self) -> SocketBuffer<'a> {
  98. SocketBuffer::new(self)
  99. }
  100. }
  101. /// The state of a TCP socket, according to [RFC 793][rfc793].
  102. /// [rfc793]: https://tools.ietf.org/html/rfc793
  103. #[derive(Debug, PartialEq, Eq, Clone, Copy)]
  104. pub enum State {
  105. Closed,
  106. Listen,
  107. SynSent,
  108. SynReceived,
  109. Established,
  110. FinWait1,
  111. FinWait2,
  112. CloseWait,
  113. Closing,
  114. LastAck,
  115. TimeWait
  116. }
  117. impl fmt::Display for State {
  118. fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
  119. match self {
  120. &State::Closed => write!(f, "CLOSED"),
  121. &State::Listen => write!(f, "LISTEN"),
  122. &State::SynSent => write!(f, "SYN-SENT"),
  123. &State::SynReceived => write!(f, "SYN-RECEIVED"),
  124. &State::Established => write!(f, "ESTABLISHED"),
  125. &State::FinWait1 => write!(f, "FIN-WAIT-1"),
  126. &State::FinWait2 => write!(f, "FIN-WAIT-2"),
  127. &State::CloseWait => write!(f, "CLOSE-WAIT"),
  128. &State::Closing => write!(f, "CLOSING"),
  129. &State::LastAck => write!(f, "LAST-ACK"),
  130. &State::TimeWait => write!(f, "TIME-WAIT")
  131. }
  132. }
  133. }
  134. #[derive(Debug, PartialEq)]
  135. struct Retransmit {
  136. resend_at: u64,
  137. delay: u64
  138. }
  139. impl Retransmit {
  140. fn new() -> Retransmit {
  141. Retransmit { resend_at: 0, delay: 0 }
  142. }
  143. fn reset(&mut self) {
  144. self.resend_at = 0;
  145. self.delay = 0;
  146. }
  147. fn may_send_old(&mut self, timestamp: u64) -> bool {
  148. if self.delay == 0 {
  149. // We haven't transmitted anything yet.
  150. false
  151. } else if timestamp < self.resend_at {
  152. // We may not retransmit yet.
  153. false
  154. } else {
  155. // We may retransmit!
  156. true
  157. }
  158. }
  159. fn may_send_new(&mut self, timestamp: u64) -> bool {
  160. if self.delay == 0 {
  161. // We've something new to transmit, do it unconditionally.
  162. self.delay = 100; // ms
  163. self.resend_at = timestamp + self.delay;
  164. true
  165. } else {
  166. false
  167. }
  168. }
  169. fn commit(&mut self, timestamp: u64) -> bool {
  170. if self.delay == 0 {
  171. self.delay = 100; // ms
  172. self.resend_at = timestamp + self.delay;
  173. false
  174. } else if timestamp >= self.resend_at {
  175. self.resend_at = timestamp + self.delay;
  176. self.delay *= 2;
  177. true
  178. } else {
  179. false
  180. }
  181. }
  182. }
  183. /// A Transmission Control Protocol socket.
  184. ///
  185. /// A TCP socket may passively listen for connections or actively connect to another endpoint.
  186. /// Note that, for listening sockets, there is no "backlog"; to be able to simultaneously
  187. /// accept several connections, as many sockets must be allocated, or any new connection
  188. /// attempts will be reset.
  189. #[derive(Debug)]
  190. pub struct TcpSocket<'a> {
  191. /// State of the socket.
  192. state: State,
  193. /// Address passed to listen(). Listen address is set when listen() is called and
  194. /// used every time the socket is reset back to the LISTEN state.
  195. listen_address: IpAddress,
  196. /// Current local endpoint. This is used for both filtering the incoming packets and
  197. /// setting the source address. When listening or initiating connection on/from
  198. /// an unspecified address, this field is updated with the chosen source address before
  199. /// any packets are sent.
  200. local_endpoint: IpEndpoint,
  201. /// Current remote endpoint. This is used for both filtering the incoming packets and
  202. /// setting the destination address. If the remote endpoint is unspecified, it means that
  203. /// aborting the connection will not send an RST, and, in TIME-WAIT state, will not
  204. /// send an ACK.
  205. remote_endpoint: IpEndpoint,
  206. /// The sequence number corresponding to the beginning of the transmit buffer.
  207. /// I.e. an ACK(local_seq_no+n) packet removes n bytes from the transmit buffer.
  208. local_seq_no: TcpSeqNumber,
  209. /// The sequence number corresponding to the beginning of the receive buffer.
  210. /// I.e. userspace reading n bytes adds n to remote_seq_no.
  211. remote_seq_no: TcpSeqNumber,
  212. /// The last sequence number sent.
  213. /// I.e. in an idle socket, local_seq_no+tx_buffer.len().
  214. remote_last_seq: TcpSeqNumber,
  215. /// The last acknowledgement number sent.
  216. /// I.e. in an idle socket, remote_seq_no+rx_buffer.len().
  217. remote_last_ack: TcpSeqNumber,
  218. /// The speculative remote window size.
  219. /// I.e. the actual remote window size minus the count of in-flight octets.
  220. remote_win_len: usize,
  221. retransmit: Retransmit,
  222. rx_buffer: SocketBuffer<'a>,
  223. tx_buffer: SocketBuffer<'a>,
  224. debug_id: usize
  225. }
  226. impl<'a> TcpSocket<'a> {
  227. /// Create a socket using the given buffers.
  228. pub fn new<T>(rx_buffer: T, tx_buffer: T) -> Socket<'a, 'static>
  229. where T: Into<SocketBuffer<'a>> {
  230. let rx_buffer = rx_buffer.into();
  231. if rx_buffer.capacity() > <u16>::max_value() as usize {
  232. panic!("buffers larger than {} require window scaling, which is not implemented",
  233. <u16>::max_value())
  234. }
  235. Socket::Tcp(TcpSocket {
  236. state: State::Closed,
  237. listen_address: IpAddress::default(),
  238. local_endpoint: IpEndpoint::default(),
  239. remote_endpoint: IpEndpoint::default(),
  240. local_seq_no: TcpSeqNumber(0),
  241. remote_seq_no: TcpSeqNumber(0),
  242. remote_last_seq: TcpSeqNumber(0),
  243. remote_last_ack: TcpSeqNumber(0),
  244. remote_win_len: 0,
  245. retransmit: Retransmit::new(),
  246. tx_buffer: tx_buffer.into(),
  247. rx_buffer: rx_buffer.into(),
  248. debug_id: 0
  249. })
  250. }
  251. /// Return the debug identifier.
  252. pub fn debug_id(&self) -> usize {
  253. self.debug_id
  254. }
  255. /// Set the debug identifier.
  256. ///
  257. /// The debug identifier is a number printed in socket trace messages.
  258. /// It could as well be used by the user code.
  259. pub fn set_debug_id(&mut self, id: usize) {
  260. self.debug_id = id
  261. }
  262. /// Return the local endpoint.
  263. #[inline]
  264. pub fn local_endpoint(&self) -> IpEndpoint {
  265. self.local_endpoint
  266. }
  267. /// Return the remote endpoint.
  268. #[inline]
  269. pub fn remote_endpoint(&self) -> IpEndpoint {
  270. self.remote_endpoint
  271. }
  272. /// Return the connection state, in terms of the TCP state machine.
  273. pub fn state(&self) -> State {
  274. self.state
  275. }
  276. /// Start listening on the given endpoint.
  277. ///
  278. /// This function returns an error if the socket was open; see [is_open](#method.is_open).
  279. pub fn listen<T: Into<IpEndpoint>>(&mut self, endpoint: T) -> Result<(), ()> {
  280. if self.is_open() { return Err(()) }
  281. let endpoint = endpoint.into();
  282. self.listen_address = endpoint.addr;
  283. self.local_endpoint = endpoint;
  284. self.remote_endpoint = IpEndpoint::default();
  285. self.set_state(State::Listen);
  286. Ok(())
  287. }
  288. /// Close the transmit half of the full-duplex connection.
  289. ///
  290. /// Note that there is no corresponding function for the receive half of the full-duplex
  291. /// connection; only the remote end can close it. If you no longer wish to receive any
  292. /// data and would like to reuse the socket right away, use [abort](#method.abort).
  293. pub fn close(&mut self) {
  294. match self.state {
  295. // In the LISTEN state there is no established connection.
  296. State::Listen =>
  297. self.set_state(State::Closed),
  298. // In the SYN-SENT state the remote endpoint is not yet synchronized and, upon
  299. // receiving an RST, will abort the connection.
  300. State::SynSent =>
  301. self.set_state(State::Closed),
  302. // In the SYN-RECEIVED, ESTABLISHED and CLOSE-WAIT states the transmit half
  303. // of the connection is open, and needs to be explicitly closed with a FIN.
  304. State::SynReceived | State::Established => {
  305. self.retransmit.reset();
  306. self.set_state(State::FinWait1);
  307. }
  308. State::CloseWait => {
  309. self.retransmit.reset();
  310. self.set_state(State::LastAck);
  311. }
  312. // In the FIN-WAIT-1, FIN-WAIT-2, CLOSING, LAST-ACK, TIME-WAIT and CLOSED states,
  313. // the transmit half of the connection is already closed, and no further
  314. // action is needed.
  315. State::FinWait1 | State::FinWait2 | State::Closing |
  316. State::TimeWait | State::LastAck | State::Closed => ()
  317. }
  318. }
  319. /// Aborts the connection, if any.
  320. ///
  321. /// This function instantly closes the socket. One reset packet will be sent to the remote
  322. /// endpoint.
  323. ///
  324. /// In terms of the TCP state machine, the socket may be in any state and is moved to
  325. /// the `CLOSED` state.
  326. pub fn abort(&mut self) {
  327. self.set_state(State::Closed);
  328. }
  329. /// Return whether the socket is passively listening for incoming connections.
  330. ///
  331. /// In terms of the TCP state machine, the socket must be in the `LISTEN` state.
  332. pub fn is_listening(&self) -> bool {
  333. match self.state {
  334. State::Listen => true,
  335. _ => false
  336. }
  337. }
  338. /// Return whether the socket is open.
  339. ///
  340. /// This function returns true if the socket will process incoming or dispatch outgoing
  341. /// packets. Note that this does not mean that it is possible to send or receive data through
  342. /// the socket; for that, use [can_send](#method.can_send) or [can_recv](#method.can_recv).
  343. ///
  344. /// In terms of the TCP state machine, the socket must be in the `CLOSED` or `TIME-WAIT` state.
  345. pub fn is_open(&self) -> bool {
  346. match self.state {
  347. State::Closed => false,
  348. State::TimeWait => false,
  349. _ => true
  350. }
  351. }
  352. /// Return whether a connection is active.
  353. ///
  354. /// This function returns true if the socket is actively exchanging packets with
  355. /// a remote endpoint. Note that this does not mean that it is possible to send or receive
  356. /// data through the socket; for that, use [can_send](#method.can_send) or
  357. /// [can_recv](#method.can_recv).
  358. ///
  359. /// If a connection is established, [abort](#method.close) will send a reset to
  360. /// the remote endpoint.
  361. ///
  362. /// In terms of the TCP state machine, the socket must be in the `CLOSED`, `TIME-WAIT`,
  363. /// or `LISTEN` state.
  364. pub fn is_active(&self) -> bool {
  365. match self.state {
  366. State::Closed => false,
  367. State::TimeWait => false,
  368. State::Listen => false,
  369. _ => true
  370. }
  371. }
  372. /// Return whether the transmit half of the full-duplex connection is open.
  373. ///
  374. /// This function returns true if it's possible to send data and have it arrive
  375. /// to the remote endpoint. However, it does not make any guarantees about the state
  376. /// of the transmit buffer, and even if it returns true, [send](#method.send) may
  377. /// not be able to enqueue any octets.
  378. ///
  379. /// In terms of the TCP state machine, the socket must be in the `ESTABLISHED` or
  380. /// `CLOSE-WAIT` state.
  381. pub fn may_send(&self) -> bool {
  382. match self.state {
  383. State::Established => true,
  384. // In CLOSE-WAIT, the remote endpoint has closed our receive half of the connection
  385. // but we still can transmit indefinitely.
  386. State::CloseWait => true,
  387. _ => false
  388. }
  389. }
  390. /// Return whether the receive half of the full-duplex connection is open.
  391. ///
  392. /// This function returns true if it's possible to receive data from the remote endpoint.
  393. /// It will return true while there is data in the receive buffer, and if there isn't,
  394. /// as long as the remote endpoint has not closed the connection.
  395. ///
  396. /// In terms of the TCP state machine, the socket must be in the `ESTABLISHED`,
  397. /// `FIN-WAIT-1`, or `FIN-WAIT-2` state, or have data in the receive buffer instead.
  398. pub fn may_recv(&self) -> bool {
  399. match self.state {
  400. State::Established => true,
  401. // In FIN-WAIT-1/2, we have closed our transmit half of the connection but
  402. // we still can receive indefinitely.
  403. State::FinWait1 | State::FinWait2 => true,
  404. // If we have something in the receive buffer, we can receive that.
  405. _ if self.rx_buffer.len() > 0 => true,
  406. _ => false
  407. }
  408. }
  409. /// Check whether the transmit half of the full-duplex connection is open
  410. /// (see [may_send](#method.may_send), and the transmit buffer is not full.
  411. pub fn can_send(&self) -> bool {
  412. if !self.may_send() { return false }
  413. !self.tx_buffer.full()
  414. }
  415. /// Check whether the receive half of the full-duplex connection buffer is open
  416. /// (see [may_recv](#method.may_recv), and the receive buffer is not empty.
  417. pub fn can_recv(&self) -> bool {
  418. if !self.may_recv() { return false }
  419. !self.rx_buffer.empty()
  420. }
  421. /// Enqueue a sequence of octets to be sent, and return a pointer to it.
  422. ///
  423. /// This function may return a slice smaller than the requested size in case
  424. /// there is not enough contiguous free space in the transmit buffer, down to
  425. /// an empty slice.
  426. ///
  427. /// This function returns an error if the transmit half of the connection is not open;
  428. /// see [can_send](#method.can_send).
  429. pub fn send(&mut self, size: usize) -> Result<&mut [u8], ()> {
  430. if !self.may_send() { return Err(()) }
  431. #[cfg(any(test, feature = "verbose"))]
  432. let old_length = self.tx_buffer.len();
  433. let buffer = self.tx_buffer.enqueue(size);
  434. if buffer.len() > 0 {
  435. #[cfg(any(test, feature = "verbose"))]
  436. net_trace!("[{}]{}:{}: tx buffer: enqueueing {} octets (now {})",
  437. self.debug_id, self.local_endpoint, self.remote_endpoint,
  438. buffer.len(), old_length + buffer.len());
  439. self.retransmit.reset();
  440. }
  441. Ok(buffer)
  442. }
  443. /// Enqueue a sequence of octets to be sent, and fill it from a slice.
  444. ///
  445. /// This function returns the amount of bytes actually enqueued, which is limited
  446. /// by the amount of free space in the transmit buffer; down to zero.
  447. ///
  448. /// See also [send](#method.send).
  449. pub fn send_slice(&mut self, data: &[u8]) -> Result<usize, ()> {
  450. let buffer = try!(self.send(data.len()));
  451. let data = &data[..buffer.len()];
  452. buffer.copy_from_slice(data);
  453. Ok(buffer.len())
  454. }
  455. /// Dequeue a sequence of received octets, and return a pointer to it.
  456. ///
  457. /// This function may return a slice smaller than the requested size in case
  458. /// there are not enough octets queued in the receive buffer, down to
  459. /// an empty slice.
  460. pub fn recv(&mut self, size: usize) -> Result<&[u8], ()> {
  461. // We may have received some data inside the initial SYN, but until the connection
  462. // is fully open we must not dequeue any data, as it may be overwritten by e.g.
  463. // another (stale) SYN.
  464. if !self.may_recv() { return Err(()) }
  465. #[cfg(any(test, feature = "verbose"))]
  466. let old_length = self.rx_buffer.len();
  467. let buffer = self.rx_buffer.dequeue(size);
  468. self.remote_seq_no += buffer.len();
  469. if buffer.len() > 0 {
  470. #[cfg(any(test, feature = "verbose"))]
  471. net_trace!("[{}]{}:{}: rx buffer: dequeueing {} octets (now {})",
  472. self.debug_id, self.local_endpoint, self.remote_endpoint,
  473. buffer.len(), old_length - buffer.len());
  474. }
  475. Ok(buffer)
  476. }
  477. /// Dequeue a sequence of received octets, and fill a slice from it.
  478. ///
  479. /// This function returns the amount of bytes actually dequeued, which is limited
  480. /// by the amount of free space in the transmit buffer; down to zero.
  481. ///
  482. /// See also [recv](#method.recv).
  483. pub fn recv_slice(&mut self, data: &mut [u8]) -> Result<usize, ()> {
  484. let buffer = try!(self.recv(data.len()));
  485. let data = &mut data[..buffer.len()];
  486. data.copy_from_slice(buffer);
  487. Ok(buffer.len())
  488. }
  489. fn set_state(&mut self, state: State) {
  490. if self.state != state {
  491. if self.remote_endpoint.addr.is_unspecified() {
  492. net_trace!("[{}]{}: state={}=>{}",
  493. self.debug_id, self.local_endpoint,
  494. self.state, state);
  495. } else {
  496. net_trace!("[{}]{}:{}: state={}=>{}",
  497. self.debug_id, self.local_endpoint, self.remote_endpoint,
  498. self.state, state);
  499. }
  500. }
  501. self.state = state
  502. }
  503. /// See [Socket::process](enum.Socket.html#method.process).
  504. pub fn process(&mut self, _timestamp: u64, ip_repr: &IpRepr,
  505. payload: &[u8]) -> Result<(), Error> {
  506. if self.state == State::Closed { return Err(Error::Rejected) }
  507. if ip_repr.protocol() != IpProtocol::Tcp { return Err(Error::Rejected) }
  508. let packet = try!(TcpPacket::new(&payload[..ip_repr.payload_len()]));
  509. let repr = try!(TcpRepr::parse(&packet, &ip_repr.src_addr(), &ip_repr.dst_addr()));
  510. // Reject packets with a wrong destination.
  511. if self.local_endpoint.port != repr.dst_port { return Err(Error::Rejected) }
  512. if !self.local_endpoint.addr.is_unspecified() &&
  513. self.local_endpoint.addr != ip_repr.dst_addr() { return Err(Error::Rejected) }
  514. // Reject packets from a source to which we aren't connected.
  515. if self.remote_endpoint.port != 0 &&
  516. self.remote_endpoint.port != repr.src_port { return Err(Error::Rejected) }
  517. if !self.remote_endpoint.addr.is_unspecified() &&
  518. self.remote_endpoint.addr != ip_repr.src_addr() { return Err(Error::Rejected) }
  519. // Consider how much the sequence number space differs from the transmit buffer space.
  520. let (sent_syn, sent_fin) = match self.state {
  521. // In SYN-SENT or SYN-RECEIVED, we've just sent a SYN.
  522. State::SynSent | State::SynReceived => (true, false),
  523. // In FIN-WAIT-1, LAST-ACK, or CLOSING, we've just sent a FIN.
  524. State::FinWait1 | State::LastAck | State::Closing => (false, true),
  525. // In all other states we've already got acknowledgemetns for
  526. // all of the control flags we sent.
  527. _ => (false, false)
  528. };
  529. let control_len = (sent_syn as usize) + (sent_fin as usize);
  530. // Reject unacceptable acknowledgements.
  531. match (self.state, repr) {
  532. // The initial SYN (or whatever) cannot contain an acknowledgement.
  533. // It may be destined to another socket though.
  534. (State::Listen, TcpRepr { ack_number: Some(_), .. }) => {
  535. return Err(Error::Rejected)
  536. }
  537. (State::Listen, TcpRepr { ack_number: None, .. }) => (),
  538. // An RST received in response to initial SYN is acceptable if it acknowledges
  539. // the initial SYN.
  540. (State::SynSent, TcpRepr { control: TcpControl::Rst, ack_number: None, .. }) => {
  541. net_trace!("[{}]{}:{}: unacceptable RST (expecting RST|ACK) \
  542. in response to initial SYN",
  543. self.debug_id, self.local_endpoint, self.remote_endpoint);
  544. return Err(Error::Malformed)
  545. }
  546. (State::SynSent, TcpRepr {
  547. control: TcpControl::Rst, ack_number: Some(ack_number), ..
  548. }) => {
  549. if ack_number != self.local_seq_no {
  550. net_trace!("[{}]{}:{}: unacceptable RST|ACK in response to initial SYN",
  551. self.debug_id, self.local_endpoint, self.remote_endpoint);
  552. return Err(Error::Malformed)
  553. }
  554. }
  555. // Any other RST need only have a valid sequence number.
  556. (_, TcpRepr { control: TcpControl::Rst, .. }) => (),
  557. // Every packet after the initial SYN must be an acknowledgement.
  558. (_, TcpRepr { ack_number: None, .. }) => {
  559. net_trace!("[{}]{}:{}: expecting an ACK",
  560. self.debug_id, self.local_endpoint, self.remote_endpoint);
  561. return Err(Error::Malformed)
  562. }
  563. // Every acknowledgement must be for transmitted but unacknowledged data.
  564. (_, TcpRepr { ack_number: Some(ack_number), .. }) => {
  565. let unacknowledged = self.tx_buffer.len() + control_len;
  566. if !(ack_number >= self.local_seq_no &&
  567. ack_number <= (self.local_seq_no + unacknowledged)) {
  568. net_trace!("[{}]{}:{}: unacceptable ACK ({} not in {}...{})",
  569. self.debug_id, self.local_endpoint, self.remote_endpoint,
  570. ack_number, self.local_seq_no, self.local_seq_no + unacknowledged);
  571. return Err(Error::Dropped)
  572. }
  573. }
  574. }
  575. match (self.state, repr) {
  576. // In LISTEN and SYN-SENT states, we have not yet synchronized with the remote end.
  577. (State::Listen, _) => (),
  578. (State::SynSent, _) => (),
  579. // In all other states, segments must occupy a valid portion of the receive window.
  580. // For now, do not try to reassemble out-of-order segments.
  581. (_, TcpRepr { seq_number, .. }) => {
  582. let next_remote_seq = self.remote_seq_no + self.rx_buffer.len();
  583. if seq_number > next_remote_seq {
  584. net_trace!("[{}]{}:{}: unacceptable SEQ ({} not in {}..)",
  585. self.debug_id, self.local_endpoint, self.remote_endpoint,
  586. seq_number, next_remote_seq);
  587. return Err(Error::Dropped)
  588. } else if seq_number != next_remote_seq {
  589. net_trace!("[{}]{}:{}: duplicate SEQ ({} in ..{})",
  590. self.debug_id, self.local_endpoint, self.remote_endpoint,
  591. seq_number, next_remote_seq);
  592. // If we've seen this sequence number already but the remote end is not aware
  593. // of that, make sure we send the acknowledgement again.
  594. self.remote_last_ack = next_remote_seq - 1;
  595. self.retransmit.reset();
  596. return Err(Error::Dropped)
  597. }
  598. }
  599. }
  600. // Validate and update the state.
  601. match (self.state, repr) {
  602. // RSTs are ignored in the LISTEN state.
  603. (State::Listen, TcpRepr { control: TcpControl::Rst, .. }) =>
  604. return Err(Error::Rejected),
  605. // RSTs in SYN-RECEIVED flip the socket back to the LISTEN state.
  606. (State::SynReceived, TcpRepr { control: TcpControl::Rst, .. }) => {
  607. net_trace!("[{}]{}:{}: received RST",
  608. self.debug_id, self.local_endpoint, self.remote_endpoint);
  609. self.local_endpoint.addr = self.listen_address;
  610. self.remote_endpoint = IpEndpoint::default();
  611. self.set_state(State::Listen);
  612. return Ok(())
  613. }
  614. // RSTs in any other state close the socket.
  615. (_, TcpRepr { control: TcpControl::Rst, .. }) => {
  616. net_trace!("[{}]{}:{}: received RST",
  617. self.debug_id, self.local_endpoint, self.remote_endpoint);
  618. self.set_state(State::Closed);
  619. self.local_endpoint = IpEndpoint::default();
  620. self.remote_endpoint = IpEndpoint::default();
  621. return Ok(())
  622. }
  623. // SYN packets in the LISTEN state change it to SYN-RECEIVED.
  624. (State::Listen, TcpRepr {
  625. src_port, dst_port, control: TcpControl::Syn, seq_number, ack_number: None, ..
  626. }) => {
  627. net_trace!("[{}]{}: received SYN",
  628. self.debug_id, self.local_endpoint);
  629. self.local_endpoint = IpEndpoint::new(ip_repr.dst_addr(), dst_port);
  630. self.remote_endpoint = IpEndpoint::new(ip_repr.src_addr(), src_port);
  631. // FIXME: use something more secure here
  632. self.local_seq_no = TcpSeqNumber(-seq_number.0);
  633. self.remote_last_seq = self.local_seq_no + 1;
  634. self.remote_seq_no = seq_number + 1;
  635. self.set_state(State::SynReceived);
  636. self.retransmit.reset();
  637. }
  638. // ACK packets in the SYN-RECEIVED state change it to ESTABLISHED.
  639. (State::SynReceived, TcpRepr { control: TcpControl::None, .. }) => {
  640. self.set_state(State::Established);
  641. self.retransmit.reset();
  642. }
  643. // ACK packets in ESTABLISHED state reset the retransmit timer.
  644. (State::Established, TcpRepr { control: TcpControl::None, .. }) => {
  645. self.retransmit.reset()
  646. },
  647. // FIN packets in ESTABLISHED state indicate the remote side has closed.
  648. (State::Established, TcpRepr { control: TcpControl::Fin, .. }) => {
  649. self.remote_seq_no += 1;
  650. self.set_state(State::CloseWait);
  651. self.retransmit.reset();
  652. }
  653. // ACK packets in FIN-WAIT-1 state change it to FIN-WAIT-2, if we've already
  654. // sent everything in the transmit buffer, and reset the retransmit timer.
  655. (State::FinWait1, TcpRepr { control: TcpControl::None, .. }) => {
  656. if self.tx_buffer.empty() {
  657. self.set_state(State::FinWait2);
  658. } else {
  659. self.retransmit.reset();
  660. }
  661. }
  662. // FIN packets in FIN-WAIT-1 state change it to CLOSING.
  663. (State::FinWait1, TcpRepr { control: TcpControl::Fin, .. }) => {
  664. self.remote_seq_no += 1;
  665. self.set_state(State::Closing);
  666. self.retransmit.reset();
  667. }
  668. // FIN packets in FIN-WAIT-2 state change it to TIME-WAIT.
  669. (State::FinWait2, TcpRepr { control: TcpControl::Fin, .. }) => {
  670. self.remote_seq_no += 1;
  671. self.set_state(State::TimeWait);
  672. self.retransmit.reset();
  673. }
  674. // ACK packets in CLOSING state change it to TIME-WAIT.
  675. (State::Closing, TcpRepr { control: TcpControl::None, .. }) => {
  676. self.set_state(State::TimeWait);
  677. self.retransmit.reset();
  678. }
  679. // ACK packets in CLOSE-WAIT state reset the retransmit timer.
  680. (State::CloseWait, TcpRepr { control: TcpControl::None, .. }) => {
  681. self.retransmit.reset();
  682. }
  683. // ACK packets in LAST-ACK state change it to CLOSED.
  684. (State::LastAck, TcpRepr { control: TcpControl::None, .. }) => {
  685. // Clear the remote endpoint, or we'll send an RST there.
  686. self.set_state(State::Closed);
  687. self.remote_endpoint = IpEndpoint::default();
  688. }
  689. _ => {
  690. net_trace!("[{}]{}:{}: unexpected packet {}",
  691. self.debug_id, self.local_endpoint, self.remote_endpoint, repr);
  692. return Err(Error::Malformed)
  693. }
  694. }
  695. // Dequeue acknowledged octets.
  696. if let Some(ack_number) = repr.ack_number {
  697. let mut ack_len = ack_number - self.local_seq_no;
  698. // There could have been no data sent before the SYN, so we always remove it
  699. // from the sequence space.
  700. if sent_syn {
  701. ack_len -= 1
  702. }
  703. // We could've sent data before the FIN, so only remove FIN from the sequence
  704. // space if all of that data is acknowledged.
  705. if sent_fin && self.tx_buffer.len() + 1 == ack_len {
  706. ack_len -= 1;
  707. net_trace!("[{}]{}:{}: received ACK of FIN",
  708. self.debug_id, self.local_endpoint, self.remote_endpoint);
  709. // If we've just switched from the FIN-WAIT-1 state to the CLOSING state
  710. // because we've received a FIN, and the same packet simultaneously acknowledges
  711. // the FIN we've sent, this is our only opportunity to move to the TIME-WAIT state.
  712. match self.state {
  713. State::Closing =>
  714. self.set_state(State::TimeWait),
  715. _ => ()
  716. }
  717. }
  718. if ack_len > 0 {
  719. net_trace!("[{}]{}:{}: tx buffer: dequeueing {} octets (now {})",
  720. self.debug_id, self.local_endpoint, self.remote_endpoint,
  721. ack_len, self.tx_buffer.len() - ack_len);
  722. }
  723. self.tx_buffer.advance(ack_len);
  724. self.local_seq_no = ack_number;
  725. }
  726. // Enqueue payload octets, which is guaranteed to be in order, unless we already did.
  727. if repr.payload.len() > 0 {
  728. net_trace!("[{}]{}:{}: rx buffer: enqueueing {} octets (now {})",
  729. self.debug_id, self.local_endpoint, self.remote_endpoint,
  730. repr.payload.len(), self.rx_buffer.len() + repr.payload.len());
  731. self.rx_buffer.enqueue_slice(repr.payload)
  732. }
  733. // Update window length.
  734. self.remote_win_len = repr.window_len as usize;
  735. Ok(())
  736. }
  737. /// See [Socket::dispatch](enum.Socket.html#method.dispatch).
  738. pub fn dispatch<F, R>(&mut self, timestamp: u64, emit: &mut F) -> Result<R, Error>
  739. where F: FnMut(&IpRepr, &IpPayload) -> Result<R, Error> {
  740. if self.remote_endpoint.is_unspecified() { return Err(Error::Exhausted) }
  741. let mut repr = TcpRepr {
  742. src_port: self.local_endpoint.port,
  743. dst_port: self.remote_endpoint.port,
  744. control: TcpControl::None,
  745. seq_number: self.local_seq_no,
  746. ack_number: None,
  747. window_len: self.rx_buffer.window() as u16,
  748. payload: &[]
  749. };
  750. if self.state == State::Closed {
  751. // If we have a specified local and remote endpoint, but are in the CLOSED state,
  752. // we've ended up here after aborting a connection. Send exactly one RST packet.
  753. net_trace!("[{}]{}:{}: sending RST",
  754. self.debug_id, self.local_endpoint, self.remote_endpoint);
  755. repr.control = TcpControl::Rst;
  756. repr.ack_number = Some(self.remote_seq_no);
  757. let ip_repr = IpRepr::Unspecified {
  758. src_addr: self.local_endpoint.addr,
  759. dst_addr: self.remote_endpoint.addr,
  760. protocol: IpProtocol::Tcp,
  761. payload_len: repr.buffer_len()
  762. };
  763. let result = emit(&ip_repr, &repr);
  764. self.local_endpoint = IpEndpoint::default();
  765. self.remote_endpoint = IpEndpoint::default();
  766. return result
  767. }
  768. if self.retransmit.may_send_old(timestamp) {
  769. // The retransmit timer has expired, so assume all in-flight data that
  770. // has not been acknowledged is lost.
  771. match self.state {
  772. // Retransmission of SYN is handled elsewhere.
  773. State::SynReceived => (),
  774. _ => self.remote_last_seq = self.local_seq_no
  775. }
  776. } else if self.retransmit.may_send_new(timestamp) {
  777. // The retransmit timer has reset, and we can send something new.
  778. } else {
  779. // We don't have anything to send at this time.
  780. return Err(Error::Exhausted)
  781. }
  782. let mut should_send = false;
  783. match self.state {
  784. // We never transmit anything in the CLOSED, LISTEN, or FIN-WAIT-2 states.
  785. State::Closed | State::Listen | State::FinWait2 => {
  786. return Err(Error::Exhausted)
  787. }
  788. // We transmit a SYN|ACK in the SYN-RECEIVED state.
  789. State::SynReceived => {
  790. repr.control = TcpControl::Syn;
  791. net_trace!("[{}]{}:{}: sending SYN|ACK",
  792. self.debug_id, self.local_endpoint, self.remote_endpoint);
  793. should_send = true;
  794. }
  795. // We transmit a SYN in the SYN-SENT state.
  796. State::SynSent => {
  797. repr.control = TcpControl::Syn;
  798. repr.ack_number = None;
  799. net_trace!("[{}]{}:{}: sending SYN",
  800. self.debug_id, self.local_endpoint, self.remote_endpoint);
  801. should_send = true;
  802. }
  803. // We transmit data in the ESTABLISHED state,
  804. // ACK in CLOSE-WAIT, CLOSING, and TIME-WAIT states,
  805. // FIN in FIN-WAIT-1 and LAST-ACK states,
  806. // but only if the receiver has a nonzero window.
  807. State::Established |
  808. State::CloseWait | State::Closing | State::TimeWait |
  809. State::FinWait1 | State::LastAck
  810. if self.remote_win_len > 0 => {
  811. // We can send something, so let's try doing that.
  812. let mut size = self.tx_buffer.len();
  813. // Clamp to remote window length.
  814. if size > self.remote_win_len { size = self.remote_win_len }
  815. // Clamp to MSS. Currently we only support the default MSS value.
  816. if size > 536 { size = 536 }
  817. // Extract data from the buffer. This may return less than what we want,
  818. // in case it's not possible to extract a contiguous slice.
  819. let offset = self.remote_last_seq - self.local_seq_no;
  820. let data = self.tx_buffer.peek(offset, size);
  821. if data.len() > 0 {
  822. // Send the extracted data.
  823. net_trace!("[{}]{}:{}: tx buffer: peeking at {} octets (from {})",
  824. self.debug_id, self.local_endpoint, self.remote_endpoint,
  825. data.len(), offset);
  826. repr.seq_number += offset;
  827. repr.payload = data;
  828. // Speculatively shrink the remote window. This will get updated
  829. // the next time we receive a packet.
  830. self.remote_win_len -= data.len();
  831. // Advance the in-flight sequence number.
  832. self.remote_last_seq += data.len();
  833. should_send = true;
  834. }
  835. // The FIN control flag occupies the place in the sequence space after
  836. // the data in the current segment. If we still have some data left for the next
  837. // segment (e.g. the receiver window is too small), then don't send FIN just yet.
  838. let all_data_sent = self.tx_buffer.len() == offset + data.len();
  839. match self.state {
  840. State::FinWait1 | State::LastAck if all_data_sent => {
  841. // We should notify the other side that we've closed the transmit half
  842. // of the connection.
  843. net_trace!("[{}]{}:{}: sending FIN|ACK",
  844. self.debug_id, self.local_endpoint, self.remote_endpoint);
  845. repr.control = TcpControl::Fin;
  846. should_send = true;
  847. }
  848. _ => ()
  849. }
  850. }
  851. // We don't transmit anything (except ACKs) if the receiver has a zero window.
  852. State::Established |
  853. State::CloseWait | State::Closing | State::TimeWait |
  854. State::FinWait1 | State::LastAck => ()
  855. }
  856. let ack_number = self.remote_seq_no + self.rx_buffer.len();
  857. if !should_send && self.remote_last_ack != ack_number {
  858. // Acknowledge all data we have received, since it is all in order.
  859. net_trace!("[{}]{}:{}: sending ACK",
  860. self.debug_id, self.local_endpoint, self.remote_endpoint);
  861. should_send = true;
  862. }
  863. if should_send {
  864. if self.retransmit.commit(timestamp) {
  865. net_trace!("[{}]{}:{}: retransmit after {}ms",
  866. self.debug_id, self.local_endpoint, self.remote_endpoint,
  867. self.retransmit.delay);
  868. }
  869. repr.ack_number = Some(ack_number);
  870. self.remote_last_ack = ack_number;
  871. let ip_repr = IpRepr::Unspecified {
  872. src_addr: self.local_endpoint.addr,
  873. dst_addr: self.remote_endpoint.addr,
  874. protocol: IpProtocol::Tcp,
  875. payload_len: repr.buffer_len()
  876. };
  877. emit(&ip_repr, &repr)
  878. } else {
  879. Err(Error::Exhausted)
  880. }
  881. }
  882. }
  883. impl<'a> IpPayload for TcpRepr<'a> {
  884. fn buffer_len(&self) -> usize {
  885. self.buffer_len()
  886. }
  887. fn emit(&self, ip_repr: &IpRepr, payload: &mut [u8]) {
  888. let mut packet = TcpPacket::new(payload).expect("undersized payload");
  889. self.emit(&mut packet, &ip_repr.src_addr(), &ip_repr.dst_addr())
  890. }
  891. }
  892. #[cfg(test)]
  893. mod test {
  894. use wire::{IpAddress, Ipv4Address};
  895. use super::*;
  896. #[test]
  897. fn test_buffer() {
  898. let mut buffer = SocketBuffer::new(vec![0; 8]); // ........
  899. buffer.enqueue(6).copy_from_slice(b"foobar"); // foobar..
  900. assert_eq!(buffer.dequeue(3), b"foo"); // ...bar..
  901. buffer.enqueue(6).copy_from_slice(b"ba"); // ...barba
  902. buffer.enqueue(4).copy_from_slice(b"zho"); // zhobarba
  903. assert_eq!(buffer.dequeue(6), b"barba"); // zho.....
  904. assert_eq!(buffer.dequeue(8), b"zho"); // ........
  905. buffer.enqueue(8).copy_from_slice(b"gefug"); // ...gefug
  906. }
  907. #[test]
  908. fn test_buffer_wraparound() {
  909. let mut buffer = SocketBuffer::new(vec![0; 8]); // ........
  910. buffer.enqueue_slice(&b"foobar"[..]); // foobar..
  911. assert_eq!(buffer.dequeue(3), b"foo"); // ...bar..
  912. buffer.enqueue_slice(&b"bazhoge"[..]); // zhobarba
  913. }
  914. #[test]
  915. fn test_buffer_peek() {
  916. let mut buffer = SocketBuffer::new(vec![0; 8]); // ........
  917. buffer.enqueue_slice(&b"foobar"[..]); // foobar..
  918. assert_eq!(buffer.peek(0, 8), &b"foobar"[..]);
  919. assert_eq!(buffer.peek(3, 8), &b"bar"[..]);
  920. }
  921. #[test]
  922. fn test_retransmit_may_send() {
  923. fn may_send(r: &mut Retransmit, t: u64) -> (bool, bool) {
  924. (r.may_send_old(t), r.may_send_new(t))
  925. }
  926. let mut r = Retransmit::new();
  927. assert_eq!(may_send(&mut r, 1000), (false, true));
  928. r.commit(1000);
  929. assert_eq!(may_send(&mut r, 1000), (false, false));
  930. assert_eq!(may_send(&mut r, 1050), (false, false));
  931. assert_eq!(may_send(&mut r, 1101), (true, false));
  932. r.commit(1101);
  933. assert_eq!(may_send(&mut r, 1150), (false, false));
  934. assert_eq!(may_send(&mut r, 1200), (false, false));
  935. assert_eq!(may_send(&mut r, 1301), (true, false));
  936. r.reset();
  937. assert_eq!(may_send(&mut r, 1350), (false, true));
  938. }
  939. const LOCAL_IP: IpAddress = IpAddress::Ipv4(Ipv4Address([10, 0, 0, 1]));
  940. const REMOTE_IP: IpAddress = IpAddress::Ipv4(Ipv4Address([10, 0, 0, 2]));
  941. const LOCAL_PORT: u16 = 80;
  942. const REMOTE_PORT: u16 = 49500;
  943. const LOCAL_END: IpEndpoint = IpEndpoint { addr: LOCAL_IP, port: LOCAL_PORT };
  944. const REMOTE_END: IpEndpoint = IpEndpoint { addr: REMOTE_IP, port: REMOTE_PORT };
  945. const LOCAL_SEQ: TcpSeqNumber = TcpSeqNumber(10000);
  946. const REMOTE_SEQ: TcpSeqNumber = TcpSeqNumber(-10000);
  947. const SEND_TEMPL: TcpRepr<'static> = TcpRepr {
  948. src_port: REMOTE_PORT, dst_port: LOCAL_PORT,
  949. control: TcpControl::None,
  950. seq_number: TcpSeqNumber(0), ack_number: Some(TcpSeqNumber(0)),
  951. window_len: 256, payload: &[]
  952. };
  953. const RECV_TEMPL: TcpRepr<'static> = TcpRepr {
  954. src_port: LOCAL_PORT, dst_port: REMOTE_PORT,
  955. control: TcpControl::None,
  956. seq_number: TcpSeqNumber(0), ack_number: Some(TcpSeqNumber(0)),
  957. window_len: 64, payload: &[]
  958. };
  959. fn send(socket: &mut TcpSocket, timestamp: u64, repr: &TcpRepr) -> Result<(), Error> {
  960. trace!("send: {}", repr);
  961. let mut buffer = vec![0; repr.buffer_len()];
  962. let mut packet = TcpPacket::new(&mut buffer).unwrap();
  963. repr.emit(&mut packet, &REMOTE_IP, &LOCAL_IP);
  964. let ip_repr = IpRepr::Unspecified {
  965. src_addr: REMOTE_IP,
  966. dst_addr: LOCAL_IP,
  967. protocol: IpProtocol::Tcp,
  968. payload_len: repr.buffer_len()
  969. };
  970. socket.process(timestamp, &ip_repr, &packet.into_inner()[..])
  971. }
  972. fn recv<F>(socket: &mut TcpSocket, timestamp: u64, mut f: F)
  973. where F: FnMut(Result<TcpRepr, Error>) {
  974. let mut buffer = vec![];
  975. let result = socket.dispatch(timestamp, &mut |ip_repr, payload| {
  976. assert_eq!(ip_repr.protocol(), IpProtocol::Tcp);
  977. assert_eq!(ip_repr.src_addr(), LOCAL_IP);
  978. assert_eq!(ip_repr.dst_addr(), REMOTE_IP);
  979. buffer.resize(payload.buffer_len(), 0);
  980. payload.emit(&ip_repr, &mut buffer[..]);
  981. let packet = TcpPacket::new(&buffer[..]).unwrap();
  982. let repr = try!(TcpRepr::parse(&packet, &ip_repr.src_addr(), &ip_repr.dst_addr()));
  983. trace!("recv: {}", repr);
  984. Ok(f(Ok(repr)))
  985. });
  986. // Appease borrow checker.
  987. match result {
  988. Ok(()) => (),
  989. Err(e) => f(Err(e))
  990. }
  991. }
  992. macro_rules! send {
  993. ($socket:ident, $repr:expr) =>
  994. (send!($socket, time 0, $repr));
  995. ($socket:ident, $repr:expr, $result:expr) =>
  996. (send!($socket, time 0, $repr, $result));
  997. ($socket:ident, time $time:expr, $repr:expr) =>
  998. (send!($socket, time 0, $repr, Ok(())));
  999. ($socket:ident, time $time:expr, $repr:expr, $result:expr) =>
  1000. (assert_eq!(send(&mut $socket, $time, &$repr), $result));
  1001. }
  1002. macro_rules! recv {
  1003. ($socket:ident, [$( $repr:expr )*]) => ({
  1004. $( recv!($socket, Ok($repr)); )*
  1005. recv!($socket, Err(Error::Exhausted))
  1006. });
  1007. ($socket:ident, $result:expr) =>
  1008. (recv!($socket, time 0, $result));
  1009. ($socket:ident, time $time:expr, $result:expr) =>
  1010. (recv(&mut $socket, $time, |repr| assert_eq!(repr, $result)));
  1011. }
  1012. macro_rules! sanity {
  1013. ($socket1:expr, $socket2:expr, retransmit: $retransmit:expr) => ({
  1014. let (s1, s2) = ($socket1, $socket2);
  1015. assert_eq!(s1.state, s2.state, "state");
  1016. assert_eq!(s1.listen_address, s2.listen_address, "listen_address");
  1017. assert_eq!(s1.local_endpoint, s2.local_endpoint, "local_endpoint");
  1018. assert_eq!(s1.remote_endpoint, s2.remote_endpoint, "remote_endpoint");
  1019. assert_eq!(s1.local_seq_no, s2.local_seq_no, "local_seq_no");
  1020. assert_eq!(s1.remote_seq_no, s2.remote_seq_no, "remote_seq_no");
  1021. assert_eq!(s1.remote_last_seq, s2.remote_last_seq, "remote_last_seq");
  1022. assert_eq!(s1.remote_last_ack, s2.remote_last_ack, "remote_last_ack");
  1023. assert_eq!(s1.remote_win_len, s2.remote_win_len, "remote_win_len");
  1024. if $retransmit {
  1025. assert_eq!(s1.retransmit, s2.retransmit, "retransmit");
  1026. } else {
  1027. let retransmit = Retransmit { resend_at: 100, delay: 100 };
  1028. assert_eq!(s1.retransmit, retransmit, "retransmit (delaying)");
  1029. }
  1030. });
  1031. ($socket1:expr, $socket2:expr) =>
  1032. (sanity!($socket1, $socket2, retransmit: true))
  1033. }
  1034. fn init_logger() {
  1035. extern crate log;
  1036. use std::boxed::Box;
  1037. struct Logger(());
  1038. impl log::Log for Logger {
  1039. fn enabled(&self, _metadata: &log::LogMetadata) -> bool {
  1040. true
  1041. }
  1042. fn log(&self, record: &log::LogRecord) {
  1043. println!("{}", record.args());
  1044. }
  1045. }
  1046. let _ = log::set_logger(|max_level| {
  1047. max_level.set(log::LogLevelFilter::Trace);
  1048. Box::new(Logger(()))
  1049. });
  1050. println!("");
  1051. }
  1052. fn socket() -> TcpSocket<'static> {
  1053. init_logger();
  1054. let rx_buffer = SocketBuffer::new(vec![0; 64]);
  1055. let tx_buffer = SocketBuffer::new(vec![0; 64]);
  1056. match TcpSocket::new(rx_buffer, tx_buffer) {
  1057. Socket::Tcp(socket) => socket,
  1058. _ => unreachable!()
  1059. }
  1060. }
  1061. // =========================================================================================//
  1062. // Tests for the CLOSED state.
  1063. // =========================================================================================//
  1064. #[test]
  1065. fn test_closed_reject() {
  1066. let mut s = socket();
  1067. assert_eq!(s.state, State::Closed);
  1068. send!(s, TcpRepr {
  1069. control: TcpControl::Syn,
  1070. ..SEND_TEMPL
  1071. }, Err(Error::Rejected));
  1072. }
  1073. #[test]
  1074. fn test_closed_reject_after_listen() {
  1075. let mut s = socket();
  1076. s.listen(LOCAL_END).unwrap();
  1077. s.close();
  1078. send!(s, TcpRepr {
  1079. control: TcpControl::Syn,
  1080. ..SEND_TEMPL
  1081. }, Err(Error::Rejected));
  1082. }
  1083. #[test]
  1084. fn test_closed_close() {
  1085. let mut s = socket();
  1086. s.close();
  1087. assert_eq!(s.state, State::Closed);
  1088. }
  1089. // =========================================================================================//
  1090. // Tests for the LISTEN state.
  1091. // =========================================================================================//
  1092. fn socket_listen() -> TcpSocket<'static> {
  1093. let mut s = socket();
  1094. s.state = State::Listen;
  1095. s.local_endpoint = IpEndpoint::new(IpAddress::default(), LOCAL_PORT);
  1096. s
  1097. }
  1098. #[test]
  1099. fn test_listen_sanity() {
  1100. let mut s = socket();
  1101. s.listen(LOCAL_PORT).unwrap();
  1102. sanity!(s, socket_listen());
  1103. }
  1104. #[test]
  1105. fn test_listen_syn() {
  1106. let mut s = socket_listen();
  1107. send!(s, TcpRepr {
  1108. control: TcpControl::Syn,
  1109. seq_number: REMOTE_SEQ,
  1110. ack_number: None,
  1111. ..SEND_TEMPL
  1112. });
  1113. sanity!(s, socket_syn_received());
  1114. }
  1115. #[test]
  1116. fn test_listen_syn_reject_ack() {
  1117. let mut s = socket_listen();
  1118. send!(s, TcpRepr {
  1119. control: TcpControl::Syn,
  1120. seq_number: REMOTE_SEQ,
  1121. ack_number: Some(LOCAL_SEQ),
  1122. ..SEND_TEMPL
  1123. }, Err(Error::Rejected));
  1124. assert_eq!(s.state, State::Listen);
  1125. }
  1126. #[test]
  1127. fn test_listen_rst() {
  1128. let mut s = socket_listen();
  1129. send!(s, TcpRepr {
  1130. control: TcpControl::Rst,
  1131. seq_number: REMOTE_SEQ,
  1132. ack_number: None,
  1133. ..SEND_TEMPL
  1134. }, Err(Error::Rejected));
  1135. }
  1136. #[test]
  1137. fn test_listen_close() {
  1138. let mut s = socket_listen();
  1139. s.close();
  1140. assert_eq!(s.state, State::Closed);
  1141. }
  1142. // =========================================================================================//
  1143. // Tests for the SYN-RECEIVED state.
  1144. // =========================================================================================//
  1145. fn socket_syn_received() -> TcpSocket<'static> {
  1146. let mut s = socket();
  1147. s.state = State::SynReceived;
  1148. s.local_endpoint = LOCAL_END;
  1149. s.remote_endpoint = REMOTE_END;
  1150. s.local_seq_no = LOCAL_SEQ;
  1151. s.remote_seq_no = REMOTE_SEQ + 1;
  1152. s.remote_last_seq = LOCAL_SEQ + 1;
  1153. s.remote_win_len = 256;
  1154. s
  1155. }
  1156. #[test]
  1157. fn test_syn_received_syn_ack() {
  1158. let mut s = socket_syn_received();
  1159. recv!(s, [TcpRepr {
  1160. control: TcpControl::Syn,
  1161. seq_number: LOCAL_SEQ,
  1162. ack_number: Some(REMOTE_SEQ + 1),
  1163. ..RECV_TEMPL
  1164. }]);
  1165. send!(s, TcpRepr {
  1166. seq_number: REMOTE_SEQ + 1,
  1167. ack_number: Some(LOCAL_SEQ + 1),
  1168. ..SEND_TEMPL
  1169. });
  1170. assert_eq!(s.state, State::Established);
  1171. sanity!(s, socket_established());
  1172. }
  1173. #[test]
  1174. fn test_syn_received_rst() {
  1175. let mut s = socket_syn_received();
  1176. send!(s, TcpRepr {
  1177. control: TcpControl::Rst,
  1178. seq_number: REMOTE_SEQ + 1,
  1179. ack_number: Some(LOCAL_SEQ),
  1180. ..SEND_TEMPL
  1181. });
  1182. assert_eq!(s.state, State::Listen);
  1183. assert_eq!(s.local_endpoint, IpEndpoint::new(IpAddress::Unspecified, LOCAL_END.port));
  1184. assert_eq!(s.remote_endpoint, IpEndpoint::default());
  1185. }
  1186. #[test]
  1187. fn test_syn_received_close() {
  1188. let mut s = socket_syn_received();
  1189. s.close();
  1190. assert_eq!(s.state, State::FinWait1);
  1191. }
  1192. // =========================================================================================//
  1193. // Tests for the SYN-SENT state.
  1194. // =========================================================================================//
  1195. fn socket_syn_sent() -> TcpSocket<'static> {
  1196. let mut s = socket();
  1197. s.state = State::SynSent;
  1198. s.local_endpoint = LOCAL_END;
  1199. s.remote_endpoint = REMOTE_END;
  1200. s.local_seq_no = LOCAL_SEQ;
  1201. s
  1202. }
  1203. #[test]
  1204. fn test_syn_sent_rst() {
  1205. let mut s = socket_syn_sent();
  1206. send!(s, TcpRepr {
  1207. control: TcpControl::Rst,
  1208. seq_number: REMOTE_SEQ,
  1209. ack_number: Some(LOCAL_SEQ),
  1210. ..SEND_TEMPL
  1211. });
  1212. assert_eq!(s.state, State::Closed);
  1213. }
  1214. #[test]
  1215. fn test_syn_sent_rst_no_ack() {
  1216. let mut s = socket_syn_sent();
  1217. send!(s, TcpRepr {
  1218. control: TcpControl::Rst,
  1219. seq_number: REMOTE_SEQ,
  1220. ack_number: None,
  1221. ..SEND_TEMPL
  1222. }, Err(Error::Malformed));
  1223. assert_eq!(s.state, State::SynSent);
  1224. }
  1225. #[test]
  1226. fn test_syn_sent_rst_bad_ack() {
  1227. let mut s = socket_syn_sent();
  1228. send!(s, TcpRepr {
  1229. control: TcpControl::Rst,
  1230. seq_number: REMOTE_SEQ,
  1231. ack_number: Some(TcpSeqNumber(1234)),
  1232. ..SEND_TEMPL
  1233. }, Err(Error::Malformed));
  1234. assert_eq!(s.state, State::SynSent);
  1235. }
  1236. #[test]
  1237. fn test_syn_sent_close() {
  1238. let mut s = socket();
  1239. s.close();
  1240. assert_eq!(s.state, State::Closed);
  1241. }
  1242. // =========================================================================================//
  1243. // Tests for the ESTABLISHED state.
  1244. // =========================================================================================//
  1245. fn socket_established() -> TcpSocket<'static> {
  1246. let mut s = socket_syn_received();
  1247. s.state = State::Established;
  1248. s.local_seq_no = LOCAL_SEQ + 1;
  1249. s.remote_last_ack = REMOTE_SEQ + 1;
  1250. s
  1251. }
  1252. #[test]
  1253. fn test_established_recv() {
  1254. let mut s = socket_established();
  1255. send!(s, TcpRepr {
  1256. seq_number: REMOTE_SEQ + 1,
  1257. ack_number: Some(LOCAL_SEQ + 1),
  1258. payload: &b"abcdef"[..],
  1259. ..SEND_TEMPL
  1260. });
  1261. recv!(s, [TcpRepr {
  1262. seq_number: LOCAL_SEQ + 1,
  1263. ack_number: Some(REMOTE_SEQ + 1 + 6),
  1264. window_len: 58,
  1265. ..RECV_TEMPL
  1266. }]);
  1267. assert_eq!(s.rx_buffer.dequeue(6), &b"abcdef"[..]);
  1268. }
  1269. #[test]
  1270. fn test_established_send() {
  1271. let mut s = socket_established();
  1272. // First roundtrip after establishing.
  1273. s.send_slice(b"abcdef").unwrap();
  1274. recv!(s, [TcpRepr {
  1275. seq_number: LOCAL_SEQ + 1,
  1276. ack_number: Some(REMOTE_SEQ + 1),
  1277. payload: &b"abcdef"[..],
  1278. ..RECV_TEMPL
  1279. }]);
  1280. assert_eq!(s.tx_buffer.len(), 6);
  1281. send!(s, TcpRepr {
  1282. seq_number: REMOTE_SEQ + 1,
  1283. ack_number: Some(LOCAL_SEQ + 1 + 6),
  1284. ..SEND_TEMPL
  1285. });
  1286. assert_eq!(s.tx_buffer.len(), 0);
  1287. // Second roundtrip.
  1288. s.send_slice(b"foobar").unwrap();
  1289. recv!(s, [TcpRepr {
  1290. seq_number: LOCAL_SEQ + 1 + 6,
  1291. ack_number: Some(REMOTE_SEQ + 1),
  1292. payload: &b"foobar"[..],
  1293. ..RECV_TEMPL
  1294. }]);
  1295. send!(s, TcpRepr {
  1296. seq_number: REMOTE_SEQ + 1,
  1297. ack_number: Some(LOCAL_SEQ + 1 + 6 + 6),
  1298. ..SEND_TEMPL
  1299. });
  1300. assert_eq!(s.tx_buffer.len(), 0);
  1301. }
  1302. #[test]
  1303. fn test_established_send_no_ack_send() {
  1304. let mut s = socket_established();
  1305. s.send_slice(b"abcdef").unwrap();
  1306. recv!(s, [TcpRepr {
  1307. seq_number: LOCAL_SEQ + 1,
  1308. ack_number: Some(REMOTE_SEQ + 1),
  1309. payload: &b"abcdef"[..],
  1310. ..RECV_TEMPL
  1311. }]);
  1312. s.send_slice(b"foobar").unwrap();
  1313. recv!(s, [TcpRepr {
  1314. seq_number: LOCAL_SEQ + 1 + 6,
  1315. ack_number: Some(REMOTE_SEQ + 1),
  1316. payload: &b"foobar"[..],
  1317. ..RECV_TEMPL
  1318. }]);
  1319. }
  1320. #[test]
  1321. fn test_established_send_buf_gt_win() {
  1322. let mut s = socket_established();
  1323. s.remote_win_len = 16;
  1324. // First roundtrip after establishing.
  1325. s.send_slice(&[0; 32][..]).unwrap();
  1326. recv!(s, [TcpRepr {
  1327. seq_number: LOCAL_SEQ + 1,
  1328. ack_number: Some(REMOTE_SEQ + 1),
  1329. payload: &[0; 16][..],
  1330. ..RECV_TEMPL
  1331. }]);
  1332. }
  1333. #[test]
  1334. fn test_established_no_ack() {
  1335. let mut s = socket_established();
  1336. send!(s, TcpRepr {
  1337. seq_number: REMOTE_SEQ + 1,
  1338. ack_number: None,
  1339. ..SEND_TEMPL
  1340. }, Err(Error::Malformed));
  1341. }
  1342. #[test]
  1343. fn test_established_bad_ack() {
  1344. let mut s = socket_established();
  1345. // Already acknowledged data.
  1346. send!(s, TcpRepr {
  1347. seq_number: REMOTE_SEQ + 1,
  1348. ack_number: Some(TcpSeqNumber(LOCAL_SEQ.0 - 1)),
  1349. ..SEND_TEMPL
  1350. }, Err(Error::Dropped));
  1351. assert_eq!(s.local_seq_no, LOCAL_SEQ + 1);
  1352. // Data not yet transmitted.
  1353. send!(s, TcpRepr {
  1354. seq_number: REMOTE_SEQ + 1,
  1355. ack_number: Some(LOCAL_SEQ + 10),
  1356. ..SEND_TEMPL
  1357. }, Err(Error::Dropped));
  1358. assert_eq!(s.local_seq_no, LOCAL_SEQ + 1);
  1359. }
  1360. #[test]
  1361. fn test_established_bad_seq() {
  1362. let mut s = socket_established();
  1363. // Data outside of receive window.
  1364. send!(s, TcpRepr {
  1365. seq_number: REMOTE_SEQ + 1 + 256,
  1366. ack_number: Some(LOCAL_SEQ + 1),
  1367. ..SEND_TEMPL
  1368. }, Err(Error::Dropped));
  1369. assert_eq!(s.remote_seq_no, REMOTE_SEQ + 1);
  1370. }
  1371. #[test]
  1372. fn test_established_fin() {
  1373. let mut s = socket_established();
  1374. send!(s, TcpRepr {
  1375. control: TcpControl::Fin,
  1376. seq_number: REMOTE_SEQ + 1,
  1377. ack_number: Some(LOCAL_SEQ + 1),
  1378. ..SEND_TEMPL
  1379. });
  1380. recv!(s, [TcpRepr {
  1381. seq_number: LOCAL_SEQ + 1,
  1382. ack_number: Some(REMOTE_SEQ + 1 + 1),
  1383. ..RECV_TEMPL
  1384. }]);
  1385. assert_eq!(s.state, State::CloseWait);
  1386. sanity!(s, socket_close_wait(), retransmit: false);
  1387. }
  1388. #[test]
  1389. fn test_established_send_fin() {
  1390. let mut s = socket_established();
  1391. s.send_slice(b"abcdef").unwrap();
  1392. send!(s, TcpRepr {
  1393. control: TcpControl::Fin,
  1394. seq_number: REMOTE_SEQ + 1,
  1395. ack_number: Some(LOCAL_SEQ + 1),
  1396. ..SEND_TEMPL
  1397. });
  1398. assert_eq!(s.state, State::CloseWait);
  1399. recv!(s, [TcpRepr {
  1400. seq_number: LOCAL_SEQ + 1,
  1401. ack_number: Some(REMOTE_SEQ + 1 + 1),
  1402. payload: &b"abcdef"[..],
  1403. ..RECV_TEMPL
  1404. }]);
  1405. }
  1406. #[test]
  1407. fn test_established_rst() {
  1408. let mut s = socket_established();
  1409. send!(s, TcpRepr {
  1410. control: TcpControl::Rst,
  1411. seq_number: REMOTE_SEQ + 1,
  1412. ack_number: Some(LOCAL_SEQ + 1),
  1413. ..SEND_TEMPL
  1414. });
  1415. assert_eq!(s.state, State::Closed);
  1416. }
  1417. #[test]
  1418. fn test_established_rst_no_ack() {
  1419. let mut s = socket_established();
  1420. send!(s, TcpRepr {
  1421. control: TcpControl::Rst,
  1422. seq_number: REMOTE_SEQ + 1,
  1423. ack_number: None,
  1424. ..SEND_TEMPL
  1425. });
  1426. assert_eq!(s.state, State::Closed);
  1427. }
  1428. #[test]
  1429. fn test_established_close() {
  1430. let mut s = socket_established();
  1431. s.close();
  1432. assert_eq!(s.state, State::FinWait1);
  1433. sanity!(s, socket_fin_wait_1());
  1434. }
  1435. #[test]
  1436. fn test_established_abort() {
  1437. let mut s = socket_established();
  1438. s.abort();
  1439. assert_eq!(s.state, State::Closed);
  1440. recv!(s, [TcpRepr {
  1441. control: TcpControl::Rst,
  1442. seq_number: LOCAL_SEQ + 1,
  1443. ack_number: Some(REMOTE_SEQ + 1),
  1444. ..RECV_TEMPL
  1445. }]);
  1446. }
  1447. // =========================================================================================//
  1448. // Tests for the FIN-WAIT-1 state.
  1449. // =========================================================================================//
  1450. fn socket_fin_wait_1() -> TcpSocket<'static> {
  1451. let mut s = socket_established();
  1452. s.state = State::FinWait1;
  1453. s
  1454. }
  1455. #[test]
  1456. fn test_fin_wait_1_fin_ack() {
  1457. let mut s = socket_fin_wait_1();
  1458. recv!(s, [TcpRepr {
  1459. control: TcpControl::Fin,
  1460. seq_number: LOCAL_SEQ + 1,
  1461. ack_number: Some(REMOTE_SEQ + 1),
  1462. ..RECV_TEMPL
  1463. }]);
  1464. send!(s, TcpRepr {
  1465. seq_number: REMOTE_SEQ + 1,
  1466. ack_number: Some(LOCAL_SEQ + 1 + 1),
  1467. ..SEND_TEMPL
  1468. });
  1469. assert_eq!(s.state, State::FinWait2);
  1470. sanity!(&s, socket_fin_wait_2(), retransmit: false);
  1471. }
  1472. #[test]
  1473. fn test_fin_wait_1_fin_fin() {
  1474. let mut s = socket_fin_wait_1();
  1475. recv!(s, [TcpRepr {
  1476. control: TcpControl::Fin,
  1477. seq_number: LOCAL_SEQ + 1,
  1478. ack_number: Some(REMOTE_SEQ + 1),
  1479. ..RECV_TEMPL
  1480. }]);
  1481. send!(s, TcpRepr {
  1482. control: TcpControl::Fin,
  1483. seq_number: REMOTE_SEQ + 1,
  1484. ack_number: Some(LOCAL_SEQ + 1),
  1485. ..SEND_TEMPL
  1486. });
  1487. assert_eq!(s.state, State::Closing);
  1488. sanity!(s, socket_closing());
  1489. }
  1490. #[test]
  1491. fn test_fin_wait_1_fin_with_data_queued() {
  1492. let mut s = socket_established();
  1493. s.remote_win_len = 6;
  1494. s.send_slice(b"abcdef123456").unwrap();
  1495. s.close();
  1496. recv!(s, [TcpRepr {
  1497. seq_number: LOCAL_SEQ + 1,
  1498. ack_number: Some(REMOTE_SEQ + 1),
  1499. payload: &b"abcdef"[..],
  1500. ..RECV_TEMPL
  1501. }]);
  1502. send!(s, TcpRepr {
  1503. seq_number: REMOTE_SEQ + 1,
  1504. ack_number: Some(LOCAL_SEQ + 1 + 6),
  1505. ..SEND_TEMPL
  1506. });
  1507. assert_eq!(s.state, State::FinWait1);
  1508. }
  1509. #[test]
  1510. fn test_fin_wait_1_close() {
  1511. let mut s = socket_fin_wait_1();
  1512. s.close();
  1513. assert_eq!(s.state, State::FinWait1);
  1514. }
  1515. // =========================================================================================//
  1516. // Tests for the FIN-WAIT-2 state.
  1517. // =========================================================================================//
  1518. fn socket_fin_wait_2() -> TcpSocket<'static> {
  1519. let mut s = socket_fin_wait_1();
  1520. s.state = State::FinWait2;
  1521. s.local_seq_no = LOCAL_SEQ + 1 + 1;
  1522. s
  1523. }
  1524. #[test]
  1525. fn test_fin_wait_2_fin() {
  1526. let mut s = socket_fin_wait_2();
  1527. send!(s, TcpRepr {
  1528. control: TcpControl::Fin,
  1529. seq_number: REMOTE_SEQ + 1,
  1530. ack_number: Some(LOCAL_SEQ + 1 + 1),
  1531. ..SEND_TEMPL
  1532. });
  1533. assert_eq!(s.state, State::TimeWait);
  1534. sanity!(s, socket_time_wait(false));
  1535. }
  1536. #[test]
  1537. fn test_fin_wait_2_close() {
  1538. let mut s = socket_fin_wait_2();
  1539. s.close();
  1540. assert_eq!(s.state, State::FinWait2);
  1541. }
  1542. // =========================================================================================//
  1543. // Tests for the CLOSING state.
  1544. // =========================================================================================//
  1545. fn socket_closing() -> TcpSocket<'static> {
  1546. let mut s = socket_fin_wait_1();
  1547. s.state = State::Closing;
  1548. s.local_seq_no = LOCAL_SEQ + 1;
  1549. s.remote_seq_no = REMOTE_SEQ + 1 + 1;
  1550. s
  1551. }
  1552. #[test]
  1553. fn test_closing_ack_fin() {
  1554. let mut s = socket_closing();
  1555. recv!(s, [TcpRepr {
  1556. seq_number: LOCAL_SEQ + 1,
  1557. ack_number: Some(REMOTE_SEQ + 1 + 1),
  1558. ..RECV_TEMPL
  1559. }]);
  1560. send!(s, TcpRepr {
  1561. seq_number: REMOTE_SEQ + 1 + 1,
  1562. ack_number: Some(LOCAL_SEQ + 1 + 1),
  1563. ..SEND_TEMPL
  1564. });
  1565. assert_eq!(s.state, State::TimeWait);
  1566. sanity!(s, socket_time_wait(true));
  1567. }
  1568. #[test]
  1569. fn test_closing_close() {
  1570. let mut s = socket_closing();
  1571. s.close();
  1572. assert_eq!(s.state, State::Closing);
  1573. }
  1574. // =========================================================================================//
  1575. // Tests for the TIME-WAIT state.
  1576. // =========================================================================================//
  1577. fn socket_time_wait(from_closing: bool) -> TcpSocket<'static> {
  1578. let mut s = socket_fin_wait_2();
  1579. s.state = State::TimeWait;
  1580. s.remote_seq_no = REMOTE_SEQ + 1 + 1;
  1581. if from_closing {
  1582. s.remote_last_ack = REMOTE_SEQ + 1 + 1;
  1583. }
  1584. s
  1585. }
  1586. #[test]
  1587. fn test_time_wait_from_fin_wait_2_ack() {
  1588. let mut s = socket_time_wait(false);
  1589. recv!(s, [TcpRepr {
  1590. seq_number: LOCAL_SEQ + 1 + 1,
  1591. ack_number: Some(REMOTE_SEQ + 1 + 1),
  1592. ..RECV_TEMPL
  1593. }]);
  1594. }
  1595. #[test]
  1596. fn test_time_wait_from_closing_no_ack() {
  1597. let mut s = socket_time_wait(true);
  1598. recv!(s, []);
  1599. }
  1600. #[test]
  1601. fn test_time_wait_close() {
  1602. let mut s = socket_time_wait(false);
  1603. s.close();
  1604. assert_eq!(s.state, State::TimeWait);
  1605. }
  1606. // =========================================================================================//
  1607. // Tests for the CLOSE-WAIT state.
  1608. // =========================================================================================//
  1609. fn socket_close_wait() -> TcpSocket<'static> {
  1610. let mut s = socket_established();
  1611. s.state = State::CloseWait;
  1612. s.remote_seq_no = REMOTE_SEQ + 1 + 1;
  1613. s.remote_last_ack = REMOTE_SEQ + 1 + 1;
  1614. s
  1615. }
  1616. #[test]
  1617. fn test_close_wait_ack() {
  1618. let mut s = socket_close_wait();
  1619. s.send_slice(b"abcdef").unwrap();
  1620. recv!(s, [TcpRepr {
  1621. seq_number: LOCAL_SEQ + 1,
  1622. ack_number: Some(REMOTE_SEQ + 1 + 1),
  1623. payload: &b"abcdef"[..],
  1624. ..RECV_TEMPL
  1625. }]);
  1626. send!(s, TcpRepr {
  1627. seq_number: REMOTE_SEQ + 1 + 1,
  1628. ack_number: Some(LOCAL_SEQ + 1 + 6),
  1629. ..SEND_TEMPL
  1630. });
  1631. }
  1632. #[test]
  1633. fn test_close_wait_close() {
  1634. let mut s = socket_close_wait();
  1635. s.close();
  1636. assert_eq!(s.state, State::LastAck);
  1637. sanity!(s, socket_last_ack());
  1638. }
  1639. // =========================================================================================//
  1640. // Tests for the LAST-ACK state.
  1641. // =========================================================================================//
  1642. fn socket_last_ack() -> TcpSocket<'static> {
  1643. let mut s = socket_close_wait();
  1644. s.state = State::LastAck;
  1645. s
  1646. }
  1647. #[test]
  1648. fn test_last_ack_fin_ack() {
  1649. let mut s = socket_last_ack();
  1650. recv!(s, [TcpRepr {
  1651. control: TcpControl::Fin,
  1652. seq_number: LOCAL_SEQ + 1,
  1653. ack_number: Some(REMOTE_SEQ + 1 + 1),
  1654. ..RECV_TEMPL
  1655. }]);
  1656. assert_eq!(s.state, State::LastAck);
  1657. send!(s, TcpRepr {
  1658. seq_number: REMOTE_SEQ + 1 + 1,
  1659. ack_number: Some(LOCAL_SEQ + 1 + 1),
  1660. ..SEND_TEMPL
  1661. });
  1662. assert_eq!(s.state, State::Closed);
  1663. }
  1664. #[test]
  1665. fn test_last_ack_close() {
  1666. let mut s = socket_last_ack();
  1667. s.close();
  1668. assert_eq!(s.state, State::LastAck);
  1669. }
  1670. // =========================================================================================//
  1671. // Tests for transitioning through multiple states.
  1672. // =========================================================================================//
  1673. #[test]
  1674. fn test_listen() {
  1675. let mut s = socket();
  1676. s.listen(IpEndpoint::new(IpAddress::default(), LOCAL_PORT)).unwrap();
  1677. assert_eq!(s.state, State::Listen);
  1678. }
  1679. #[test]
  1680. fn test_three_way_handshake() {
  1681. let mut s = socket_listen();
  1682. send!(s, TcpRepr {
  1683. control: TcpControl::Syn,
  1684. seq_number: REMOTE_SEQ,
  1685. ack_number: None,
  1686. ..SEND_TEMPL
  1687. });
  1688. assert_eq!(s.state(), State::SynReceived);
  1689. assert_eq!(s.local_endpoint(), LOCAL_END);
  1690. assert_eq!(s.remote_endpoint(), REMOTE_END);
  1691. recv!(s, [TcpRepr {
  1692. control: TcpControl::Syn,
  1693. seq_number: LOCAL_SEQ,
  1694. ack_number: Some(REMOTE_SEQ + 1),
  1695. ..RECV_TEMPL
  1696. }]);
  1697. send!(s, TcpRepr {
  1698. seq_number: REMOTE_SEQ + 1,
  1699. ack_number: Some(LOCAL_SEQ + 1),
  1700. ..SEND_TEMPL
  1701. });
  1702. assert_eq!(s.state(), State::Established);
  1703. assert_eq!(s.local_seq_no, LOCAL_SEQ + 1);
  1704. assert_eq!(s.remote_seq_no, REMOTE_SEQ + 1);
  1705. }
  1706. #[test]
  1707. fn test_remote_close() {
  1708. let mut s = socket_established();
  1709. send!(s, TcpRepr {
  1710. control: TcpControl::Fin,
  1711. seq_number: REMOTE_SEQ + 1,
  1712. ack_number: Some(LOCAL_SEQ + 1),
  1713. ..SEND_TEMPL
  1714. });
  1715. assert_eq!(s.state, State::CloseWait);
  1716. recv!(s, [TcpRepr {
  1717. seq_number: LOCAL_SEQ + 1,
  1718. ack_number: Some(REMOTE_SEQ + 1 + 1),
  1719. ..RECV_TEMPL
  1720. }]);
  1721. s.close();
  1722. assert_eq!(s.state, State::LastAck);
  1723. recv!(s, [TcpRepr {
  1724. control: TcpControl::Fin,
  1725. seq_number: LOCAL_SEQ + 1,
  1726. ack_number: Some(REMOTE_SEQ + 1 + 1),
  1727. ..RECV_TEMPL
  1728. }]);
  1729. send!(s, TcpRepr {
  1730. seq_number: REMOTE_SEQ + 1 + 1,
  1731. ack_number: Some(LOCAL_SEQ + 1 + 1),
  1732. ..SEND_TEMPL
  1733. });
  1734. assert_eq!(s.state, State::Closed);
  1735. }
  1736. #[test]
  1737. fn test_local_close() {
  1738. let mut s = socket_established();
  1739. s.close();
  1740. assert_eq!(s.state, State::FinWait1);
  1741. recv!(s, [TcpRepr {
  1742. control: TcpControl::Fin,
  1743. seq_number: LOCAL_SEQ + 1,
  1744. ack_number: Some(REMOTE_SEQ + 1),
  1745. ..RECV_TEMPL
  1746. }]);
  1747. send!(s, TcpRepr {
  1748. seq_number: REMOTE_SEQ + 1,
  1749. ack_number: Some(LOCAL_SEQ + 1 + 1),
  1750. ..SEND_TEMPL
  1751. });
  1752. assert_eq!(s.state, State::FinWait2);
  1753. send!(s, TcpRepr {
  1754. control: TcpControl::Fin,
  1755. seq_number: REMOTE_SEQ + 1,
  1756. ack_number: Some(LOCAL_SEQ + 1 + 1),
  1757. ..SEND_TEMPL
  1758. });
  1759. assert_eq!(s.state, State::TimeWait);
  1760. recv!(s, [TcpRepr {
  1761. seq_number: LOCAL_SEQ + 1 + 1,
  1762. ack_number: Some(REMOTE_SEQ + 1 + 1),
  1763. ..RECV_TEMPL
  1764. }]);
  1765. }
  1766. #[test]
  1767. fn test_simultaneous_close() {
  1768. let mut s = socket_established();
  1769. s.close();
  1770. assert_eq!(s.state, State::FinWait1);
  1771. recv!(s, [TcpRepr { // this is logically located...
  1772. control: TcpControl::Fin,
  1773. seq_number: LOCAL_SEQ + 1,
  1774. ack_number: Some(REMOTE_SEQ + 1),
  1775. ..RECV_TEMPL
  1776. }]);
  1777. send!(s, TcpRepr {
  1778. control: TcpControl::Fin,
  1779. seq_number: REMOTE_SEQ + 1,
  1780. ack_number: Some(LOCAL_SEQ + 1),
  1781. ..SEND_TEMPL
  1782. });
  1783. assert_eq!(s.state, State::Closing);
  1784. recv!(s, [TcpRepr {
  1785. seq_number: LOCAL_SEQ + 1,
  1786. ack_number: Some(REMOTE_SEQ + 1 + 1),
  1787. ..RECV_TEMPL
  1788. }]);
  1789. // ... at this point
  1790. send!(s, TcpRepr {
  1791. seq_number: REMOTE_SEQ + 1 + 1,
  1792. ack_number: Some(LOCAL_SEQ + 1 + 1),
  1793. ..SEND_TEMPL
  1794. });
  1795. assert_eq!(s.state, State::TimeWait);
  1796. recv!(s, []);
  1797. }
  1798. #[test]
  1799. fn test_simultaneous_close_combined_fin_ack() {
  1800. let mut s = socket_established();
  1801. s.close();
  1802. assert_eq!(s.state, State::FinWait1);
  1803. recv!(s, [TcpRepr {
  1804. control: TcpControl::Fin,
  1805. seq_number: LOCAL_SEQ + 1,
  1806. ack_number: Some(REMOTE_SEQ + 1),
  1807. ..RECV_TEMPL
  1808. }]);
  1809. send!(s, TcpRepr {
  1810. control: TcpControl::Fin,
  1811. seq_number: REMOTE_SEQ + 1,
  1812. ack_number: Some(LOCAL_SEQ + 1 + 1),
  1813. ..SEND_TEMPL
  1814. });
  1815. assert_eq!(s.state, State::TimeWait);
  1816. recv!(s, [TcpRepr {
  1817. seq_number: LOCAL_SEQ + 1 + 1,
  1818. ack_number: Some(REMOTE_SEQ + 1 + 1),
  1819. ..RECV_TEMPL
  1820. }]);
  1821. }
  1822. #[test]
  1823. fn test_fin_with_data() {
  1824. let mut s = socket_established();
  1825. s.send_slice(b"abcdef").unwrap();
  1826. s.close();
  1827. recv!(s, [TcpRepr {
  1828. control: TcpControl::Fin,
  1829. seq_number: LOCAL_SEQ + 1,
  1830. ack_number: Some(REMOTE_SEQ + 1),
  1831. payload: &b"abcdef"[..],
  1832. ..RECV_TEMPL
  1833. }])
  1834. }
  1835. #[test]
  1836. fn test_mutual_close_with_data() {
  1837. let mut s = socket_established();
  1838. s.send_slice(b"abcdef").unwrap();
  1839. s.close();
  1840. assert_eq!(s.state, State::FinWait1);
  1841. recv!(s, [TcpRepr {
  1842. control: TcpControl::Fin,
  1843. seq_number: LOCAL_SEQ + 1,
  1844. ack_number: Some(REMOTE_SEQ + 1),
  1845. payload: &b"abcdef"[..],
  1846. ..RECV_TEMPL
  1847. }]);
  1848. send!(s, TcpRepr {
  1849. control: TcpControl::Fin,
  1850. seq_number: REMOTE_SEQ + 1,
  1851. ack_number: Some(LOCAL_SEQ + 1 + 6 + 1),
  1852. ..SEND_TEMPL
  1853. });
  1854. }
  1855. // =========================================================================================//
  1856. // Tests for retransmission on packet loss.
  1857. // =========================================================================================//
  1858. fn socket_recved() -> TcpSocket<'static> {
  1859. let mut s = socket_established();
  1860. send!(s, TcpRepr {
  1861. seq_number: REMOTE_SEQ + 1,
  1862. ack_number: Some(LOCAL_SEQ + 1),
  1863. payload: &b"abcdef"[..],
  1864. ..SEND_TEMPL
  1865. });
  1866. recv!(s, [TcpRepr {
  1867. seq_number: LOCAL_SEQ + 1,
  1868. ack_number: Some(REMOTE_SEQ + 1 + 6),
  1869. window_len: 58,
  1870. ..RECV_TEMPL
  1871. }]);
  1872. s
  1873. }
  1874. #[test]
  1875. fn test_duplicate_seq_ack() {
  1876. let mut s = socket_recved();
  1877. // remote retransmission
  1878. send!(s, TcpRepr {
  1879. seq_number: REMOTE_SEQ + 1,
  1880. ack_number: Some(LOCAL_SEQ + 1),
  1881. payload: &b"abcdef"[..],
  1882. ..SEND_TEMPL
  1883. }, Err(Error::Dropped));
  1884. recv!(s, [TcpRepr {
  1885. seq_number: LOCAL_SEQ + 1,
  1886. ack_number: Some(REMOTE_SEQ + 1 + 6),
  1887. window_len: 58,
  1888. ..RECV_TEMPL
  1889. }]);
  1890. }
  1891. #[test]
  1892. fn test_data_retransmit() {
  1893. let mut s = socket_established();
  1894. s.send_slice(b"abcdef").unwrap();
  1895. recv!(s, time 1000, Ok(TcpRepr {
  1896. seq_number: LOCAL_SEQ + 1,
  1897. ack_number: Some(REMOTE_SEQ + 1),
  1898. payload: &b"abcdef"[..],
  1899. ..RECV_TEMPL
  1900. }));
  1901. recv!(s, time 1050, Err(Error::Exhausted));
  1902. recv!(s, time 1100, Ok(TcpRepr {
  1903. seq_number: LOCAL_SEQ + 1,
  1904. ack_number: Some(REMOTE_SEQ + 1),
  1905. payload: &b"abcdef"[..],
  1906. ..RECV_TEMPL
  1907. }));
  1908. }
  1909. #[test]
  1910. fn test_send_data_after_syn_ack_retransmit() {
  1911. let mut s = socket_syn_received();
  1912. recv!(s, time 50, Ok(TcpRepr {
  1913. control: TcpControl::Syn,
  1914. seq_number: LOCAL_SEQ,
  1915. ack_number: Some(REMOTE_SEQ + 1),
  1916. ..RECV_TEMPL
  1917. }));
  1918. recv!(s, time 150, Ok(TcpRepr { // retransmit
  1919. control: TcpControl::Syn,
  1920. seq_number: LOCAL_SEQ,
  1921. ack_number: Some(REMOTE_SEQ + 1),
  1922. ..RECV_TEMPL
  1923. }));
  1924. send!(s, TcpRepr {
  1925. seq_number: REMOTE_SEQ + 1,
  1926. ack_number: Some(LOCAL_SEQ + 1),
  1927. ..SEND_TEMPL
  1928. });
  1929. assert_eq!(s.state(), State::Established);
  1930. s.send_slice(b"abcdef").unwrap();
  1931. recv!(s, [TcpRepr {
  1932. seq_number: LOCAL_SEQ + 1,
  1933. ack_number: Some(REMOTE_SEQ + 1),
  1934. payload: &b"abcdef"[..],
  1935. ..RECV_TEMPL
  1936. }])
  1937. }
  1938. #[test]
  1939. fn test_established_retransmit_reset_after_ack() {
  1940. let mut s = socket_established();
  1941. s.remote_win_len = 6;
  1942. s.send_slice(b"abcdef").unwrap();
  1943. s.send_slice(b"123456").unwrap();
  1944. s.send_slice(b"ABCDEF").unwrap();
  1945. recv!(s, time 1000, Ok(TcpRepr {
  1946. seq_number: LOCAL_SEQ + 1,
  1947. ack_number: Some(REMOTE_SEQ + 1),
  1948. payload: &b"abcdef"[..],
  1949. ..RECV_TEMPL
  1950. }));
  1951. send!(s, time 1005, TcpRepr {
  1952. seq_number: REMOTE_SEQ + 1,
  1953. ack_number: Some(LOCAL_SEQ + 1 + 6),
  1954. window_len: 6,
  1955. ..SEND_TEMPL
  1956. });
  1957. recv!(s, time 1010, Ok(TcpRepr {
  1958. seq_number: LOCAL_SEQ + 1 + 6,
  1959. ack_number: Some(REMOTE_SEQ + 1),
  1960. payload: &b"123456"[..],
  1961. ..RECV_TEMPL
  1962. }));
  1963. send!(s, time 1015, TcpRepr {
  1964. seq_number: REMOTE_SEQ + 1,
  1965. ack_number: Some(LOCAL_SEQ + 1 + 6 + 6),
  1966. window_len: 6,
  1967. ..SEND_TEMPL
  1968. });
  1969. recv!(s, time 1020, Ok(TcpRepr {
  1970. seq_number: LOCAL_SEQ + 1 + 6 + 6,
  1971. ack_number: Some(REMOTE_SEQ + 1),
  1972. payload: &b"ABCDEF"[..],
  1973. ..RECV_TEMPL
  1974. }));
  1975. }
  1976. #[test]
  1977. fn test_close_wait_retransmit_reset_after_ack() {
  1978. let mut s = socket_close_wait();
  1979. s.remote_win_len = 6;
  1980. s.send_slice(b"abcdef").unwrap();
  1981. s.send_slice(b"123456").unwrap();
  1982. s.send_slice(b"ABCDEF").unwrap();
  1983. recv!(s, time 1000, Ok(TcpRepr {
  1984. seq_number: LOCAL_SEQ + 1,
  1985. ack_number: Some(REMOTE_SEQ + 1 + 1),
  1986. payload: &b"abcdef"[..],
  1987. ..RECV_TEMPL
  1988. }));
  1989. send!(s, time 1005, TcpRepr {
  1990. seq_number: REMOTE_SEQ + 1 + 1,
  1991. ack_number: Some(LOCAL_SEQ + 1 + 6),
  1992. window_len: 6,
  1993. ..SEND_TEMPL
  1994. });
  1995. recv!(s, time 1010, Ok(TcpRepr {
  1996. seq_number: LOCAL_SEQ + 1 + 6,
  1997. ack_number: Some(REMOTE_SEQ + 1 + 1),
  1998. payload: &b"123456"[..],
  1999. ..RECV_TEMPL
  2000. }));
  2001. send!(s, time 1015, TcpRepr {
  2002. seq_number: REMOTE_SEQ + 1 + 1,
  2003. ack_number: Some(LOCAL_SEQ + 1 + 6 + 6),
  2004. window_len: 6,
  2005. ..SEND_TEMPL
  2006. });
  2007. recv!(s, time 1020, Ok(TcpRepr {
  2008. seq_number: LOCAL_SEQ + 1 + 6 + 6,
  2009. ack_number: Some(REMOTE_SEQ + 1 + 1),
  2010. payload: &b"ABCDEF"[..],
  2011. ..RECV_TEMPL
  2012. }));
  2013. }
  2014. #[test]
  2015. fn test_fin_wait_1_retransmit_reset_after_ack() {
  2016. let mut s = socket_established();
  2017. s.remote_win_len = 6;
  2018. s.send_slice(b"abcdef").unwrap();
  2019. s.send_slice(b"123456").unwrap();
  2020. s.send_slice(b"ABCDEF").unwrap();
  2021. s.close();
  2022. recv!(s, time 1000, Ok(TcpRepr {
  2023. seq_number: LOCAL_SEQ + 1,
  2024. ack_number: Some(REMOTE_SEQ + 1),
  2025. payload: &b"abcdef"[..],
  2026. ..RECV_TEMPL
  2027. }));
  2028. send!(s, time 1005, TcpRepr {
  2029. seq_number: REMOTE_SEQ + 1,
  2030. ack_number: Some(LOCAL_SEQ + 1 + 6),
  2031. window_len: 6,
  2032. ..SEND_TEMPL
  2033. });
  2034. recv!(s, time 1010, Ok(TcpRepr {
  2035. seq_number: LOCAL_SEQ + 1 + 6,
  2036. ack_number: Some(REMOTE_SEQ + 1),
  2037. payload: &b"123456"[..],
  2038. ..RECV_TEMPL
  2039. }));
  2040. send!(s, time 1015, TcpRepr {
  2041. seq_number: REMOTE_SEQ + 1,
  2042. ack_number: Some(LOCAL_SEQ + 1 + 6 + 6),
  2043. window_len: 6,
  2044. ..SEND_TEMPL
  2045. });
  2046. recv!(s, time 1020, Ok(TcpRepr {
  2047. control: TcpControl::Fin,
  2048. seq_number: LOCAL_SEQ + 1 + 6 + 6,
  2049. ack_number: Some(REMOTE_SEQ + 1),
  2050. payload: &b"ABCDEF"[..],
  2051. ..RECV_TEMPL
  2052. }));
  2053. }
  2054. }