tcp.rs 70 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953
  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. /// Start listening on the given endpoint.
  273. ///
  274. /// This function returns an error if the socket was open; see [is_open](#method.is_open).
  275. pub fn listen<T: Into<IpEndpoint>>(&mut self, endpoint: T) -> Result<(), ()> {
  276. if self.is_open() { return Err(()) }
  277. let endpoint = endpoint.into();
  278. self.listen_address = endpoint.addr;
  279. self.local_endpoint = endpoint;
  280. self.remote_endpoint = IpEndpoint::default();
  281. self.set_state(State::Listen);
  282. Ok(())
  283. }
  284. /// Close the transmit half of the full-duplex connection.
  285. ///
  286. /// Note that there is no corresponding function for the receive half of the full-duplex
  287. /// connection; only the remote end can close it. If you no longer wish to receive any
  288. /// data and would like to reuse the socket right away, use [abort](#method.abort).
  289. pub fn close(&mut self) {
  290. match self.state {
  291. // In the LISTEN state there is no established connection.
  292. State::Listen =>
  293. self.set_state(State::Closed),
  294. // In the SYN-SENT state the remote endpoint is not yet synchronized and, upon
  295. // receiving an RST, will abort the connection.
  296. State::SynSent =>
  297. self.set_state(State::Closed),
  298. // In the SYN-RECEIVED, ESTABLISHED and CLOSE-WAIT states the transmit half
  299. // of the connection is open, and needs to be explicitly closed with a FIN.
  300. State::SynReceived | State::Established => {
  301. self.retransmit.reset();
  302. self.set_state(State::FinWait1);
  303. }
  304. State::CloseWait => {
  305. self.retransmit.reset();
  306. self.set_state(State::LastAck);
  307. }
  308. // In the FIN-WAIT-1, FIN-WAIT-2, CLOSING, LAST-ACK, TIME-WAIT and CLOSED states,
  309. // the transmit half of the connection is already closed, and no further
  310. // action is needed.
  311. State::FinWait1 | State::FinWait2 | State::Closing |
  312. State::TimeWait | State::LastAck | State::Closed => ()
  313. }
  314. }
  315. /// Return whether the socket is passively listening for incoming connections.
  316. pub fn is_listening(&self) -> bool {
  317. match self.state {
  318. State::Listen => true,
  319. _ => false
  320. }
  321. }
  322. /// Return whether the socket is open.
  323. ///
  324. /// This function returns true if the socket will process incoming or dispatch outgoing
  325. /// packets. Note that this does not mean that it is possible to send or receive data through
  326. /// the socket; for that, use [can_send](#method.can_send) or [can_recv](#method.can_recv).
  327. pub fn is_open(&self) -> bool {
  328. match self.state {
  329. State::Closed => false,
  330. State::TimeWait => false,
  331. _ => true
  332. }
  333. }
  334. /// Return whether a connection is active.
  335. ///
  336. /// This function returns true if the socket is actively exchanging packets with
  337. /// a remote endpoint. Note that this does not mean that it is possible to send or receive
  338. /// data through the socket; for that, use [can_send](#method.can_send) or
  339. /// [can_recv](#method.can_recv).
  340. ///
  341. /// If a connection is established, [abort](#method.close) will send a reset to
  342. /// the remote endpoint.
  343. pub fn is_active(&self) -> bool {
  344. match self.state {
  345. State::Closed => false,
  346. State::TimeWait => false,
  347. State::Listen => false,
  348. _ => true
  349. }
  350. }
  351. /// Return whether the transmit half of the full-duplex connection is open.
  352. ///
  353. /// This function returns true if it's possible to send data and have it arrive
  354. /// to the remote endpoint. However, it does not make any guarantees about the state
  355. /// of the transmit buffer, and even if it returns true, [send](#method.send) may
  356. /// not be able to enqueue any octets.
  357. pub fn may_send(&self) -> bool {
  358. match self.state {
  359. State::Established => true,
  360. // In CLOSE-WAIT, the remote endpoint has closed our receive half of the connection
  361. // but we still can transmit indefinitely.
  362. State::CloseWait => true,
  363. _ => false
  364. }
  365. }
  366. /// Return whether the receive half of the full-duplex connection is open.
  367. ///
  368. /// This function returns true if it's possible to receive data from the remote endpoint.
  369. /// It will return true while there is data in the receive buffer, and if there isn't,
  370. /// as long as the remote endpoint has not closed the connection.
  371. pub fn may_recv(&self) -> bool {
  372. match self.state {
  373. State::Established => true,
  374. // In FIN-WAIT-1/2, we have closed our transmit half of the connection but
  375. // we still can receive indefinitely.
  376. State::FinWait1 | State::FinWait2 => true,
  377. // If we have something in the receive buffer, we can receive that.
  378. _ if self.rx_buffer.len() > 0 => true,
  379. _ => false
  380. }
  381. }
  382. /// Check whether the transmit half of the full-duplex connection is open, and
  383. /// the transmit buffer is not full.
  384. pub fn can_send(&self) -> bool {
  385. if !self.may_send() { return false }
  386. !self.tx_buffer.full()
  387. }
  388. /// Check whether the receive half of the full-duplex connection buffer is open,
  389. /// and the receive buffer is not empty.
  390. pub fn can_recv(&self) -> bool {
  391. if !self.may_recv() { return false }
  392. !self.rx_buffer.empty()
  393. }
  394. /// Enqueue a sequence of octets to be sent, and return a pointer to it.
  395. ///
  396. /// This function may return a slice smaller than the requested size in case
  397. /// there is not enough contiguous free space in the transmit buffer, down to
  398. /// an empty slice.
  399. ///
  400. /// This function returns an error if the transmit half of the connection is not open;
  401. /// see [can_send](#method.can_send).
  402. pub fn send(&mut self, size: usize) -> Result<&mut [u8], ()> {
  403. if !self.may_send() { return Err(()) }
  404. let old_length = self.tx_buffer.len();
  405. let buffer = self.tx_buffer.enqueue(size);
  406. if buffer.len() > 0 {
  407. net_trace!("[{}]{}:{}: tx buffer: enqueueing {} octets (now {})",
  408. self.debug_id, self.local_endpoint, self.remote_endpoint,
  409. buffer.len(), old_length + buffer.len());
  410. self.retransmit.reset();
  411. }
  412. Ok(buffer)
  413. }
  414. /// Enqueue a sequence of octets to be sent, and fill it from a slice.
  415. ///
  416. /// This function returns the amount of bytes actually enqueued, which is limited
  417. /// by the amount of free space in the transmit buffer; down to zero.
  418. ///
  419. /// See also [send](#method.send).
  420. pub fn send_slice(&mut self, data: &[u8]) -> Result<usize, ()> {
  421. let buffer = try!(self.send(data.len()));
  422. let data = &data[..buffer.len()];
  423. buffer.copy_from_slice(data);
  424. Ok(buffer.len())
  425. }
  426. /// Dequeue a sequence of received octets, and return a pointer to it.
  427. ///
  428. /// This function may return a slice smaller than the requested size in case
  429. /// there are not enough octets queued in the receive buffer, down to
  430. /// an empty slice.
  431. pub fn recv(&mut self, size: usize) -> Result<&[u8], ()> {
  432. // We may have received some data inside the initial SYN ("TCP Fast Open"),
  433. // but until the connection is fully open we refuse to dequeue any data.
  434. if !self.may_recv() { return Err(()) }
  435. let old_length = self.rx_buffer.len();
  436. let buffer = self.rx_buffer.dequeue(size);
  437. self.remote_seq_no += buffer.len();
  438. if buffer.len() > 0 {
  439. net_trace!("[{}]{}:{}: rx buffer: dequeueing {} octets (now {})",
  440. self.debug_id, self.local_endpoint, self.remote_endpoint,
  441. buffer.len(), old_length - buffer.len());
  442. }
  443. Ok(buffer)
  444. }
  445. /// Dequeue a sequence of received octets, and fill a slice from it.
  446. ///
  447. /// This function returns the amount of bytes actually dequeued, which is limited
  448. /// by the amount of free space in the transmit buffer; down to zero.
  449. ///
  450. /// See also [recv](#method.recv).
  451. pub fn recv_slice(&mut self, data: &mut [u8]) -> Result<usize, ()> {
  452. let buffer = try!(self.recv(data.len()));
  453. let data = &mut data[..buffer.len()];
  454. data.copy_from_slice(buffer);
  455. Ok(buffer.len())
  456. }
  457. /// Return the connection state.
  458. ///
  459. /// This function is provided for debugging.
  460. pub fn state(&self) -> State {
  461. self.state
  462. }
  463. fn set_state(&mut self, state: State) {
  464. if self.state != state {
  465. if self.remote_endpoint.addr.is_unspecified() {
  466. net_trace!("[{}]{}: state={}=>{}",
  467. self.debug_id, self.local_endpoint,
  468. self.state, state);
  469. } else {
  470. net_trace!("[{}]{}:{}: state={}=>{}",
  471. self.debug_id, self.local_endpoint, self.remote_endpoint,
  472. self.state, state);
  473. }
  474. }
  475. self.state = state
  476. }
  477. /// See [Socket::process](enum.Socket.html#method.process).
  478. pub fn process(&mut self, _timestamp: u64, ip_repr: &IpRepr,
  479. payload: &[u8]) -> Result<(), Error> {
  480. if ip_repr.protocol() != IpProtocol::Tcp { return Err(Error::Rejected) }
  481. let packet = try!(TcpPacket::new(&payload[..ip_repr.payload_len()]));
  482. let repr = try!(TcpRepr::parse(&packet, &ip_repr.src_addr(), &ip_repr.dst_addr()));
  483. // Reject packets with a wrong destination.
  484. if self.local_endpoint.port != repr.dst_port { return Err(Error::Rejected) }
  485. if !self.local_endpoint.addr.is_unspecified() &&
  486. self.local_endpoint.addr != ip_repr.dst_addr() { return Err(Error::Rejected) }
  487. // Reject packets from a source to which we aren't connected.
  488. if self.remote_endpoint.port != 0 &&
  489. self.remote_endpoint.port != repr.src_port { return Err(Error::Rejected) }
  490. if !self.remote_endpoint.addr.is_unspecified() &&
  491. self.remote_endpoint.addr != ip_repr.src_addr() { return Err(Error::Rejected) }
  492. // Reject unacceptable acknowledgements.
  493. match (self.state, repr) {
  494. // The initial SYN (or whatever) cannot contain an acknowledgement.
  495. (State::Listen, TcpRepr { ack_number: Some(_), .. }) => {
  496. net_trace!("[{}]{}:{}: ACK received by a socket in LISTEN state",
  497. self.debug_id, self.local_endpoint, self.remote_endpoint);
  498. return Err(Error::Malformed)
  499. }
  500. (State::Listen, TcpRepr { ack_number: None, .. }) => (),
  501. // An RST received in response to initial SYN is acceptable if it acknowledges
  502. // the initial SYN.
  503. (State::SynSent, TcpRepr { control: TcpControl::Rst, ack_number: None, .. }) => {
  504. net_trace!("[{}]{}:{}: unacceptable RST (expecting RST|ACK) \
  505. in response to initial SYN",
  506. self.debug_id, self.local_endpoint, self.remote_endpoint);
  507. return Err(Error::Malformed)
  508. }
  509. (State::SynSent, TcpRepr {
  510. control: TcpControl::Rst, ack_number: Some(ack_number), ..
  511. }) => {
  512. if ack_number != self.local_seq_no {
  513. net_trace!("[{}]{}:{}: unacceptable RST|ACK in response to initial SYN",
  514. self.debug_id, self.local_endpoint, self.remote_endpoint);
  515. return Err(Error::Malformed)
  516. }
  517. }
  518. // Any other RST need only have a valid sequence number.
  519. (_, TcpRepr { control: TcpControl::Rst, .. }) => (),
  520. // Every packet after the initial SYN must be an acknowledgement.
  521. (_, TcpRepr { ack_number: None, .. }) => {
  522. net_trace!("[{}]{}:{}: expecting an ACK",
  523. self.debug_id, self.local_endpoint, self.remote_endpoint);
  524. return Err(Error::Malformed)
  525. }
  526. // Every acknowledgement must be for transmitted but unacknowledged data.
  527. (state, TcpRepr { ack_number: Some(ack_number), .. }) => {
  528. let control_len = match state {
  529. // In SYN-SENT or SYN-RECEIVED, we've just sent a SYN.
  530. State::SynSent | State::SynReceived => 1,
  531. // In FIN-WAIT-1, LAST-ACK, or CLOSING, we've just sent a FIN.
  532. State::FinWait1 | State::LastAck | State::Closing => 1,
  533. // In all other states we've already got acknowledgemetns for
  534. // all of the control flags we sent.
  535. _ => 0
  536. };
  537. let unacknowledged = self.tx_buffer.len() + control_len;
  538. if !(ack_number >= self.local_seq_no &&
  539. ack_number <= (self.local_seq_no + unacknowledged)) {
  540. net_trace!("[{}]{}:{}: unacceptable ACK ({} not in {}...{})",
  541. self.debug_id, self.local_endpoint, self.remote_endpoint,
  542. ack_number, self.local_seq_no, self.local_seq_no + unacknowledged);
  543. return Err(Error::Dropped)
  544. }
  545. }
  546. }
  547. match (self.state, repr) {
  548. // In LISTEN and SYN-SENT states, we have not yet synchronized with the remote end.
  549. (State::Listen, _) => (),
  550. (State::SynSent, _) => (),
  551. // In all other states, segments must occupy a valid portion of the receive window.
  552. // For now, do not try to reassemble out-of-order segments.
  553. (_, TcpRepr { seq_number, .. }) => {
  554. let next_remote_seq = self.remote_seq_no + self.rx_buffer.len();
  555. if seq_number > next_remote_seq {
  556. net_trace!("[{}]{}:{}: unacceptable SEQ ({} not in {}..)",
  557. self.debug_id, self.local_endpoint, self.remote_endpoint,
  558. seq_number, next_remote_seq);
  559. return Err(Error::Dropped)
  560. } else if seq_number != next_remote_seq {
  561. net_trace!("[{}]{}:{}: duplicate SEQ ({} in ..{})",
  562. self.debug_id, self.local_endpoint, self.remote_endpoint,
  563. seq_number, next_remote_seq);
  564. // If we've seen this sequence number already but the remote end is not aware
  565. // of that, make sure we send the acknowledgement again.
  566. self.remote_last_ack = next_remote_seq - 1;
  567. self.retransmit.reset();
  568. return Err(Error::Dropped)
  569. }
  570. }
  571. }
  572. // Validate and update the state.
  573. match (self.state, repr) {
  574. // RSTs are ignored in the LISTEN state.
  575. (State::Listen, TcpRepr { control: TcpControl::Rst, .. }) =>
  576. return Ok(()),
  577. // RSTs in SYN-RECEIVED flip the socket back to the LISTEN state.
  578. (State::SynReceived, TcpRepr { control: TcpControl::Rst, .. }) => {
  579. net_trace!("[{}]{}:{}: received RST",
  580. self.debug_id, self.local_endpoint, self.remote_endpoint);
  581. self.local_endpoint.addr = self.listen_address;
  582. self.remote_endpoint = IpEndpoint::default();
  583. self.set_state(State::Listen);
  584. return Ok(())
  585. }
  586. // RSTs in any other state close the socket.
  587. (_, TcpRepr { control: TcpControl::Rst, .. }) => {
  588. net_trace!("[{}]{}:{}: received RST",
  589. self.debug_id, self.local_endpoint, self.remote_endpoint);
  590. self.set_state(State::Closed);
  591. self.local_endpoint = IpEndpoint::default();
  592. self.remote_endpoint = IpEndpoint::default();
  593. return Ok(())
  594. }
  595. // SYN packets in the LISTEN state change it to SYN-RECEIVED.
  596. (State::Listen, TcpRepr {
  597. src_port, dst_port, control: TcpControl::Syn, seq_number, ack_number: None, ..
  598. }) => {
  599. net_trace!("[{}]{}: received SYN",
  600. self.debug_id, self.local_endpoint);
  601. self.local_endpoint = IpEndpoint::new(ip_repr.dst_addr(), dst_port);
  602. self.remote_endpoint = IpEndpoint::new(ip_repr.src_addr(), src_port);
  603. // FIXME: use something more secure here
  604. self.local_seq_no = TcpSeqNumber(-seq_number.0);
  605. self.remote_last_seq = self.local_seq_no + 1;
  606. self.remote_seq_no = seq_number + 1;
  607. self.set_state(State::SynReceived);
  608. self.retransmit.reset();
  609. }
  610. // ACK packets in the SYN-RECEIVED state change it to ESTABLISHED.
  611. (State::SynReceived, TcpRepr { control: TcpControl::None, .. }) => {
  612. self.local_seq_no += 1;
  613. self.set_state(State::Established);
  614. self.retransmit.reset();
  615. }
  616. // ACK packets in ESTABLISHED state do nothing.
  617. (State::Established, TcpRepr { control: TcpControl::None, .. }) => (),
  618. // FIN packets in ESTABLISHED state indicate the remote side has closed.
  619. (State::Established, TcpRepr { control: TcpControl::Fin, .. }) => {
  620. self.remote_seq_no += 1;
  621. self.set_state(State::CloseWait);
  622. self.retransmit.reset();
  623. }
  624. // ACK packets in FIN-WAIT-1 state change it to FIN-WAIT-2.
  625. (State::FinWait1, TcpRepr { control: TcpControl::None, .. }) => {
  626. self.local_seq_no += 1;
  627. self.set_state(State::FinWait2);
  628. }
  629. // FIN packets in FIN-WAIT-1 state change it to CLOSING.
  630. (State::FinWait1, TcpRepr { control: TcpControl::Fin, .. }) => {
  631. self.remote_seq_no += 1;
  632. self.set_state(State::Closing);
  633. self.retransmit.reset();
  634. }
  635. // FIN packets in FIN-WAIT-2 state change it to TIME-WAIT.
  636. (State::FinWait2, TcpRepr { control: TcpControl::Fin, .. }) => {
  637. self.remote_seq_no += 1;
  638. self.set_state(State::TimeWait);
  639. self.retransmit.reset();
  640. }
  641. // ACK packets in CLOSING state change it to TIME-WAIT.
  642. (State::Closing, TcpRepr { control: TcpControl::None, .. }) => {
  643. self.local_seq_no += 1;
  644. self.set_state(State::TimeWait);
  645. self.retransmit.reset();
  646. }
  647. // ACK packets in CLOSE-WAIT state do nothing.
  648. (State::CloseWait, TcpRepr { control: TcpControl::None, .. }) => (),
  649. // ACK packets in LAST-ACK state change it to CLOSED.
  650. (State::LastAck, TcpRepr { control: TcpControl::None, .. }) => {
  651. // Clear the remote endpoint, or we'll send an RST there.
  652. self.set_state(State::Closed);
  653. self.remote_endpoint = IpEndpoint::default();
  654. self.local_seq_no += 1;
  655. }
  656. _ => {
  657. net_trace!("[{}]{}:{}: unexpected packet {}",
  658. self.debug_id, self.local_endpoint, self.remote_endpoint, repr);
  659. return Err(Error::Malformed)
  660. }
  661. }
  662. // Dequeue acknowledged octets.
  663. if let Some(ack_number) = repr.ack_number {
  664. let ack_length = ack_number - self.local_seq_no;
  665. if ack_length > 0 {
  666. net_trace!("[{}]{}:{}: tx buffer: dequeueing {} octets (now {})",
  667. self.debug_id, self.local_endpoint, self.remote_endpoint,
  668. ack_length, self.tx_buffer.len() - ack_length);
  669. }
  670. self.tx_buffer.advance(ack_length);
  671. self.local_seq_no = ack_number;
  672. }
  673. // Enqueue payload octets, which is guaranteed to be in order, unless we already did.
  674. if repr.payload.len() > 0 {
  675. net_trace!("[{}]{}:{}: rx buffer: enqueueing {} octets (now {})",
  676. self.debug_id, self.local_endpoint, self.remote_endpoint,
  677. repr.payload.len(), self.rx_buffer.len() + repr.payload.len());
  678. self.rx_buffer.enqueue_slice(repr.payload)
  679. }
  680. // Update window length.
  681. self.remote_win_len = repr.window_len as usize;
  682. Ok(())
  683. }
  684. /// See [Socket::dispatch](enum.Socket.html#method.dispatch).
  685. pub fn dispatch<F, R>(&mut self, timestamp: u64, emit: &mut F) -> Result<R, Error>
  686. where F: FnMut(&IpRepr, &IpPayload) -> Result<R, Error> {
  687. if self.remote_endpoint.is_unspecified() { return Err(Error::Exhausted) }
  688. let mut repr = TcpRepr {
  689. src_port: self.local_endpoint.port,
  690. dst_port: self.remote_endpoint.port,
  691. control: TcpControl::None,
  692. seq_number: self.local_seq_no,
  693. ack_number: None,
  694. window_len: self.rx_buffer.window() as u16,
  695. payload: &[]
  696. };
  697. if self.retransmit.may_send_old(timestamp) {
  698. // The retransmit timer has expired, so assume all in-flight data that
  699. // has not been acknowledged is lost.
  700. match self.state {
  701. // Retransmission of SYN is handled elsewhere.
  702. State::SynReceived => (),
  703. _ => self.remote_last_seq = self.local_seq_no
  704. }
  705. } else if self.retransmit.may_send_new(timestamp) {
  706. // The retransmit timer has reset, and we can send something new.
  707. } else {
  708. // We don't have anything to send at this time.
  709. return Err(Error::Exhausted)
  710. }
  711. let mut should_send = false;
  712. match self.state {
  713. // We never transmit anything in the CLOSED, LISTEN, or FIN-WAIT-2 states.
  714. State::Closed | State::Listen | State::FinWait2 => {
  715. return Err(Error::Exhausted)
  716. }
  717. // We transmit a SYN|ACK in the SYN-RECEIVED state.
  718. State::SynReceived => {
  719. repr.control = TcpControl::Syn;
  720. net_trace!("[{}]{}:{}: sending SYN|ACK",
  721. self.debug_id, self.local_endpoint, self.remote_endpoint);
  722. should_send = true;
  723. }
  724. // We transmit a SYN in the SYN-SENT state.
  725. State::SynSent => {
  726. repr.control = TcpControl::Syn;
  727. repr.ack_number = None;
  728. net_trace!("[{}]{}:{}: sending SYN",
  729. self.debug_id, self.local_endpoint, self.remote_endpoint);
  730. should_send = true;
  731. }
  732. // We transmit data in the ESTABLISHED state,
  733. // ACK in CLOSE-WAIT, CLOSING, and TIME-WAIT states,
  734. // FIN in FIN-WAIT-1 and LAST-ACK states,
  735. // but only if the receiver has a nonzero window.
  736. State::Established |
  737. State::CloseWait | State::Closing | State::TimeWait |
  738. State::FinWait1 | State::LastAck
  739. if self.remote_win_len > 0 => {
  740. // We can send something, so let's try doing that.
  741. let mut size = self.tx_buffer.len();
  742. // Clamp to remote window length.
  743. if size > self.remote_win_len { size = self.remote_win_len }
  744. // Clamp to MSS. Currently we only support the default MSS value.
  745. if size > 536 { size = 536 }
  746. // Extract data from the buffer. This may return less than what we want,
  747. // in case it's not possible to extract a contiguous slice.
  748. let offset = self.remote_last_seq - self.local_seq_no;
  749. let data = self.tx_buffer.peek(offset, size);
  750. if data.len() > 0 {
  751. // Send the extracted data.
  752. net_trace!("[{}]{}:{}: tx buffer: peeking at {} octets (from {})",
  753. self.debug_id, self.local_endpoint, self.remote_endpoint,
  754. data.len(), offset);
  755. repr.seq_number += offset;
  756. repr.payload = data;
  757. // Speculatively shrink the remote window. This will get updated
  758. // the next time we receive a packet.
  759. self.remote_win_len -= data.len();
  760. // Advance the in-flight sequence number.
  761. self.remote_last_seq += data.len();
  762. should_send = true;
  763. }
  764. match self.state {
  765. State::FinWait1 | State::LastAck => {
  766. // We should notify the other side that we've closed the transmit half
  767. // of the connection.
  768. net_trace!("[{}]{}:{}: sending FIN|ACK",
  769. self.debug_id, self.local_endpoint, self.remote_endpoint);
  770. repr.control = TcpControl::Fin;
  771. should_send = true;
  772. }
  773. _ => ()
  774. }
  775. }
  776. // We don't transmit anything (except ACKs) if the receiver has a zero window.
  777. State::Established |
  778. State::CloseWait | State::Closing | State::TimeWait |
  779. State::FinWait1 | State::LastAck => ()
  780. }
  781. let ack_number = self.remote_seq_no + self.rx_buffer.len();
  782. if !should_send && self.remote_last_ack != ack_number {
  783. // Acknowledge all data we have received, since it is all in order.
  784. net_trace!("[{}]{}:{}: sending ACK",
  785. self.debug_id, self.local_endpoint, self.remote_endpoint);
  786. should_send = true;
  787. }
  788. if should_send {
  789. if self.retransmit.commit(timestamp) {
  790. net_trace!("[{}]{}:{}: retransmit after {}ms",
  791. self.debug_id, self.local_endpoint, self.remote_endpoint,
  792. self.retransmit.delay);
  793. }
  794. repr.ack_number = Some(ack_number);
  795. self.remote_last_ack = ack_number;
  796. let ip_repr = IpRepr::Unspecified {
  797. src_addr: self.local_endpoint.addr,
  798. dst_addr: self.remote_endpoint.addr,
  799. protocol: IpProtocol::Tcp,
  800. payload_len: repr.buffer_len()
  801. };
  802. emit(&ip_repr, &repr)
  803. } else {
  804. Err(Error::Exhausted)
  805. }
  806. }
  807. }
  808. impl<'a> IpPayload for TcpRepr<'a> {
  809. fn buffer_len(&self) -> usize {
  810. self.buffer_len()
  811. }
  812. fn emit(&self, ip_repr: &IpRepr, payload: &mut [u8]) {
  813. let mut packet = TcpPacket::new(payload).expect("undersized payload");
  814. self.emit(&mut packet, &ip_repr.src_addr(), &ip_repr.dst_addr())
  815. }
  816. }
  817. #[cfg(test)]
  818. mod test {
  819. use wire::{IpAddress, Ipv4Address};
  820. use super::*;
  821. #[test]
  822. fn test_buffer() {
  823. let mut buffer = SocketBuffer::new(vec![0; 8]); // ........
  824. buffer.enqueue(6).copy_from_slice(b"foobar"); // foobar..
  825. assert_eq!(buffer.dequeue(3), b"foo"); // ...bar..
  826. buffer.enqueue(6).copy_from_slice(b"ba"); // ...barba
  827. buffer.enqueue(4).copy_from_slice(b"zho"); // zhobarba
  828. assert_eq!(buffer.dequeue(6), b"barba"); // zho.....
  829. assert_eq!(buffer.dequeue(8), b"zho"); // ........
  830. buffer.enqueue(8).copy_from_slice(b"gefug"); // ...gefug
  831. }
  832. #[test]
  833. fn test_buffer_wraparound() {
  834. let mut buffer = SocketBuffer::new(vec![0; 8]); // ........
  835. buffer.enqueue_slice(&b"foobar"[..]); // foobar..
  836. assert_eq!(buffer.dequeue(3), b"foo"); // ...bar..
  837. buffer.enqueue_slice(&b"bazhoge"[..]); // zhobarba
  838. }
  839. #[test]
  840. fn test_buffer_peek() {
  841. let mut buffer = SocketBuffer::new(vec![0; 8]); // ........
  842. buffer.enqueue_slice(&b"foobar"[..]); // foobar..
  843. assert_eq!(buffer.peek(0, 8), &b"foobar"[..]);
  844. assert_eq!(buffer.peek(3, 8), &b"bar"[..]);
  845. }
  846. #[test]
  847. fn test_retransmit_may_send() {
  848. fn may_send(r: &mut Retransmit, t: u64) -> (bool, bool) {
  849. (r.may_send_old(t), r.may_send_new(t))
  850. }
  851. let mut r = Retransmit::new();
  852. assert_eq!(may_send(&mut r, 1000), (false, true));
  853. r.commit(1000);
  854. assert_eq!(may_send(&mut r, 1000), (false, false));
  855. assert_eq!(may_send(&mut r, 1050), (false, false));
  856. assert_eq!(may_send(&mut r, 1101), (true, false));
  857. r.commit(1101);
  858. assert_eq!(may_send(&mut r, 1150), (false, false));
  859. assert_eq!(may_send(&mut r, 1200), (false, false));
  860. assert_eq!(may_send(&mut r, 1301), (true, false));
  861. r.reset();
  862. assert_eq!(may_send(&mut r, 1350), (false, true));
  863. }
  864. const LOCAL_IP: IpAddress = IpAddress::Ipv4(Ipv4Address([10, 0, 0, 1]));
  865. const REMOTE_IP: IpAddress = IpAddress::Ipv4(Ipv4Address([10, 0, 0, 2]));
  866. const LOCAL_PORT: u16 = 80;
  867. const REMOTE_PORT: u16 = 49500;
  868. const LOCAL_END: IpEndpoint = IpEndpoint { addr: LOCAL_IP, port: LOCAL_PORT };
  869. const REMOTE_END: IpEndpoint = IpEndpoint { addr: REMOTE_IP, port: REMOTE_PORT };
  870. const LOCAL_SEQ: TcpSeqNumber = TcpSeqNumber(10000);
  871. const REMOTE_SEQ: TcpSeqNumber = TcpSeqNumber(-10000);
  872. const SEND_TEMPL: TcpRepr<'static> = TcpRepr {
  873. src_port: REMOTE_PORT, dst_port: LOCAL_PORT,
  874. control: TcpControl::None,
  875. seq_number: TcpSeqNumber(0), ack_number: Some(TcpSeqNumber(0)),
  876. window_len: 256, payload: &[]
  877. };
  878. const RECV_TEMPL: TcpRepr<'static> = TcpRepr {
  879. src_port: LOCAL_PORT, dst_port: REMOTE_PORT,
  880. control: TcpControl::None,
  881. seq_number: TcpSeqNumber(0), ack_number: Some(TcpSeqNumber(0)),
  882. window_len: 64, payload: &[]
  883. };
  884. fn send(socket: &mut TcpSocket, timestamp: u64, repr: &TcpRepr) -> Result<(), Error> {
  885. trace!("send: {}", repr);
  886. let mut buffer = vec![0; repr.buffer_len()];
  887. let mut packet = TcpPacket::new(&mut buffer).unwrap();
  888. repr.emit(&mut packet, &REMOTE_IP, &LOCAL_IP);
  889. let ip_repr = IpRepr::Unspecified {
  890. src_addr: REMOTE_IP,
  891. dst_addr: LOCAL_IP,
  892. protocol: IpProtocol::Tcp,
  893. payload_len: repr.buffer_len()
  894. };
  895. socket.process(timestamp, &ip_repr, &packet.into_inner()[..])
  896. }
  897. fn recv<F>(socket: &mut TcpSocket, timestamp: u64, mut f: F)
  898. where F: FnMut(Result<TcpRepr, Error>) {
  899. let mut buffer = vec![];
  900. let result = socket.dispatch(timestamp, &mut |ip_repr, payload| {
  901. assert_eq!(ip_repr.protocol(), IpProtocol::Tcp);
  902. assert_eq!(ip_repr.src_addr(), LOCAL_IP);
  903. assert_eq!(ip_repr.dst_addr(), REMOTE_IP);
  904. buffer.resize(payload.buffer_len(), 0);
  905. payload.emit(&ip_repr, &mut buffer[..]);
  906. let packet = TcpPacket::new(&buffer[..]).unwrap();
  907. let repr = try!(TcpRepr::parse(&packet, &ip_repr.src_addr(), &ip_repr.dst_addr()));
  908. trace!("recv: {}", repr);
  909. Ok(f(Ok(repr)))
  910. });
  911. // Appease borrow checker.
  912. match result {
  913. Ok(()) => (),
  914. Err(e) => f(Err(e))
  915. }
  916. }
  917. macro_rules! send {
  918. ($socket:ident, $repr:expr) =>
  919. (send!($socket, time 0, $repr));
  920. ($socket:ident, $repr:expr, $result:expr) =>
  921. (send!($socket, time 0, $repr, $result));
  922. ($socket:ident, time $time:expr, $repr:expr) =>
  923. (send!($socket, time 0, $repr, Ok(())));
  924. ($socket:ident, time $time:expr, $repr:expr, $result:expr) =>
  925. (assert_eq!(send(&mut $socket, $time, &$repr), $result));
  926. }
  927. macro_rules! recv {
  928. ($socket:ident, [$( $repr:expr )*]) => ({
  929. $( recv!($socket, Ok($repr)); )*
  930. recv!($socket, Err(Error::Exhausted))
  931. });
  932. ($socket:ident, $result:expr) =>
  933. (recv!($socket, time 0, $result));
  934. ($socket:ident, time $time:expr, $result:expr) =>
  935. (recv(&mut $socket, $time, |repr| assert_eq!(repr, $result)));
  936. }
  937. macro_rules! sanity {
  938. ($socket1:expr, $socket2:expr, retransmit: $retransmit:expr) => ({
  939. let (s1, s2) = ($socket1, $socket2);
  940. assert_eq!(s1.state, s2.state, "state");
  941. assert_eq!(s1.listen_address, s2.listen_address, "listen_address");
  942. assert_eq!(s1.local_endpoint, s2.local_endpoint, "local_endpoint");
  943. assert_eq!(s1.remote_endpoint, s2.remote_endpoint, "remote_endpoint");
  944. assert_eq!(s1.local_seq_no, s2.local_seq_no, "local_seq_no");
  945. assert_eq!(s1.remote_seq_no, s2.remote_seq_no, "remote_seq_no");
  946. assert_eq!(s1.remote_last_seq, s2.remote_last_seq, "remote_last_seq");
  947. assert_eq!(s1.remote_last_ack, s2.remote_last_ack, "remote_last_ack");
  948. assert_eq!(s1.remote_win_len, s2.remote_win_len, "remote_win_len");
  949. if $retransmit {
  950. assert_eq!(s1.retransmit, s2.retransmit, "retransmit");
  951. } else {
  952. let retransmit = Retransmit { resend_at: 100, delay: 100 };
  953. assert_eq!(s1.retransmit, retransmit, "retransmit (delaying)");
  954. }
  955. });
  956. ($socket1:expr, $socket2:expr) =>
  957. (sanity!($socket1, $socket2, retransmit: true))
  958. }
  959. fn init_logger() {
  960. extern crate log;
  961. use std::boxed::Box;
  962. struct Logger(());
  963. impl log::Log for Logger {
  964. fn enabled(&self, _metadata: &log::LogMetadata) -> bool {
  965. true
  966. }
  967. fn log(&self, record: &log::LogRecord) {
  968. println!("{}", record.args());
  969. }
  970. }
  971. let _ = log::set_logger(|max_level| {
  972. max_level.set(log::LogLevelFilter::Trace);
  973. Box::new(Logger(()))
  974. });
  975. println!("");
  976. }
  977. fn socket() -> TcpSocket<'static> {
  978. init_logger();
  979. let rx_buffer = SocketBuffer::new(vec![0; 64]);
  980. let tx_buffer = SocketBuffer::new(vec![0; 64]);
  981. match TcpSocket::new(rx_buffer, tx_buffer) {
  982. Socket::Tcp(socket) => socket,
  983. _ => unreachable!()
  984. }
  985. }
  986. // =========================================================================================//
  987. // Tests for the CLOSED state.
  988. // =========================================================================================//
  989. #[test]
  990. fn test_closed_reject() {
  991. let mut s = socket();
  992. assert_eq!(s.state, State::Closed);
  993. send!(s, TcpRepr {
  994. control: TcpControl::Syn,
  995. ..SEND_TEMPL
  996. }, Err(Error::Rejected));
  997. }
  998. #[test]
  999. fn test_closed_close() {
  1000. let mut s = socket();
  1001. s.close();
  1002. assert_eq!(s.state, State::Closed);
  1003. }
  1004. // =========================================================================================//
  1005. // Tests for the LISTEN state.
  1006. // =========================================================================================//
  1007. fn socket_listen() -> TcpSocket<'static> {
  1008. let mut s = socket();
  1009. s.state = State::Listen;
  1010. s.local_endpoint = IpEndpoint::new(IpAddress::default(), LOCAL_PORT);
  1011. s
  1012. }
  1013. #[test]
  1014. fn test_listen_sanity() {
  1015. let mut s = socket();
  1016. s.listen(LOCAL_PORT).unwrap();
  1017. sanity!(s, socket_listen());
  1018. }
  1019. #[test]
  1020. fn test_listen_syn() {
  1021. let mut s = socket_listen();
  1022. send!(s, TcpRepr {
  1023. control: TcpControl::Syn,
  1024. seq_number: REMOTE_SEQ,
  1025. ack_number: None,
  1026. ..SEND_TEMPL
  1027. });
  1028. sanity!(s, socket_syn_received());
  1029. }
  1030. #[test]
  1031. fn test_listen_syn_no_ack() {
  1032. let mut s = socket_listen();
  1033. send!(s, TcpRepr {
  1034. control: TcpControl::Syn,
  1035. seq_number: REMOTE_SEQ,
  1036. ack_number: Some(LOCAL_SEQ),
  1037. ..SEND_TEMPL
  1038. }, Err(Error::Malformed));
  1039. assert_eq!(s.state, State::Listen);
  1040. }
  1041. #[test]
  1042. fn test_listen_rst() {
  1043. let mut s = socket_listen();
  1044. send!(s, TcpRepr {
  1045. control: TcpControl::Rst,
  1046. seq_number: REMOTE_SEQ,
  1047. ack_number: None,
  1048. ..SEND_TEMPL
  1049. });
  1050. }
  1051. #[test]
  1052. fn test_listen_close() {
  1053. let mut s = socket_listen();
  1054. s.close();
  1055. assert_eq!(s.state, State::Closed);
  1056. }
  1057. // =========================================================================================//
  1058. // Tests for the SYN-RECEIVED state.
  1059. // =========================================================================================//
  1060. fn socket_syn_received() -> TcpSocket<'static> {
  1061. let mut s = socket();
  1062. s.state = State::SynReceived;
  1063. s.local_endpoint = LOCAL_END;
  1064. s.remote_endpoint = REMOTE_END;
  1065. s.local_seq_no = LOCAL_SEQ;
  1066. s.remote_seq_no = REMOTE_SEQ + 1;
  1067. s.remote_last_seq = LOCAL_SEQ + 1;
  1068. s.remote_win_len = 256;
  1069. s
  1070. }
  1071. #[test]
  1072. fn test_syn_received_syn_ack() {
  1073. let mut s = socket_syn_received();
  1074. recv!(s, [TcpRepr {
  1075. control: TcpControl::Syn,
  1076. seq_number: LOCAL_SEQ,
  1077. ack_number: Some(REMOTE_SEQ + 1),
  1078. ..RECV_TEMPL
  1079. }]);
  1080. send!(s, TcpRepr {
  1081. seq_number: REMOTE_SEQ + 1,
  1082. ack_number: Some(LOCAL_SEQ + 1),
  1083. ..SEND_TEMPL
  1084. });
  1085. assert_eq!(s.state, State::Established);
  1086. sanity!(s, socket_established());
  1087. }
  1088. #[test]
  1089. fn test_syn_received_rst() {
  1090. let mut s = socket_syn_received();
  1091. send!(s, TcpRepr {
  1092. control: TcpControl::Rst,
  1093. seq_number: REMOTE_SEQ + 1,
  1094. ack_number: Some(LOCAL_SEQ),
  1095. ..SEND_TEMPL
  1096. });
  1097. assert_eq!(s.state, State::Listen);
  1098. assert_eq!(s.local_endpoint, IpEndpoint::new(IpAddress::Unspecified, LOCAL_END.port));
  1099. assert_eq!(s.remote_endpoint, IpEndpoint::default());
  1100. }
  1101. #[test]
  1102. fn test_syn_received_close() {
  1103. let mut s = socket_syn_received();
  1104. s.close();
  1105. assert_eq!(s.state, State::FinWait1);
  1106. }
  1107. // =========================================================================================//
  1108. // Tests for the SYN-SENT state.
  1109. // =========================================================================================//
  1110. fn socket_syn_sent() -> TcpSocket<'static> {
  1111. let mut s = socket();
  1112. s.state = State::SynSent;
  1113. s.local_endpoint = LOCAL_END;
  1114. s.remote_endpoint = REMOTE_END;
  1115. s.local_seq_no = LOCAL_SEQ;
  1116. s
  1117. }
  1118. #[test]
  1119. fn test_syn_sent_rst() {
  1120. let mut s = socket_syn_sent();
  1121. send!(s, TcpRepr {
  1122. control: TcpControl::Rst,
  1123. seq_number: REMOTE_SEQ,
  1124. ack_number: Some(LOCAL_SEQ),
  1125. ..SEND_TEMPL
  1126. });
  1127. assert_eq!(s.state, State::Closed);
  1128. }
  1129. #[test]
  1130. fn test_syn_sent_rst_no_ack() {
  1131. let mut s = socket_syn_sent();
  1132. send!(s, TcpRepr {
  1133. control: TcpControl::Rst,
  1134. seq_number: REMOTE_SEQ,
  1135. ack_number: None,
  1136. ..SEND_TEMPL
  1137. }, Err(Error::Malformed));
  1138. assert_eq!(s.state, State::SynSent);
  1139. }
  1140. #[test]
  1141. fn test_syn_sent_rst_bad_ack() {
  1142. let mut s = socket_syn_sent();
  1143. send!(s, TcpRepr {
  1144. control: TcpControl::Rst,
  1145. seq_number: REMOTE_SEQ,
  1146. ack_number: Some(TcpSeqNumber(1234)),
  1147. ..SEND_TEMPL
  1148. }, Err(Error::Malformed));
  1149. assert_eq!(s.state, State::SynSent);
  1150. }
  1151. #[test]
  1152. fn test_syn_sent_close() {
  1153. let mut s = socket();
  1154. s.close();
  1155. assert_eq!(s.state, State::Closed);
  1156. }
  1157. // =========================================================================================//
  1158. // Tests for the ESTABLISHED state.
  1159. // =========================================================================================//
  1160. fn socket_established() -> TcpSocket<'static> {
  1161. let mut s = socket_syn_received();
  1162. s.state = State::Established;
  1163. s.local_seq_no = LOCAL_SEQ + 1;
  1164. s.remote_last_ack = REMOTE_SEQ + 1;
  1165. s
  1166. }
  1167. #[test]
  1168. fn test_established_recv() {
  1169. let mut s = socket_established();
  1170. send!(s, TcpRepr {
  1171. seq_number: REMOTE_SEQ + 1,
  1172. ack_number: Some(LOCAL_SEQ + 1),
  1173. payload: &b"abcdef"[..],
  1174. ..SEND_TEMPL
  1175. });
  1176. recv!(s, [TcpRepr {
  1177. seq_number: LOCAL_SEQ + 1,
  1178. ack_number: Some(REMOTE_SEQ + 1 + 6),
  1179. window_len: 58,
  1180. ..RECV_TEMPL
  1181. }]);
  1182. assert_eq!(s.rx_buffer.dequeue(6), &b"abcdef"[..]);
  1183. }
  1184. #[test]
  1185. fn test_established_send() {
  1186. let mut s = socket_established();
  1187. // First roundtrip after establishing.
  1188. s.send_slice(b"abcdef").unwrap();
  1189. recv!(s, [TcpRepr {
  1190. seq_number: LOCAL_SEQ + 1,
  1191. ack_number: Some(REMOTE_SEQ + 1),
  1192. payload: &b"abcdef"[..],
  1193. ..RECV_TEMPL
  1194. }]);
  1195. assert_eq!(s.tx_buffer.len(), 6);
  1196. send!(s, TcpRepr {
  1197. seq_number: REMOTE_SEQ + 1,
  1198. ack_number: Some(LOCAL_SEQ + 1 + 6),
  1199. ..SEND_TEMPL
  1200. });
  1201. assert_eq!(s.tx_buffer.len(), 0);
  1202. // Second roundtrip.
  1203. s.send_slice(b"foobar").unwrap();
  1204. recv!(s, [TcpRepr {
  1205. seq_number: LOCAL_SEQ + 1 + 6,
  1206. ack_number: Some(REMOTE_SEQ + 1),
  1207. payload: &b"foobar"[..],
  1208. ..RECV_TEMPL
  1209. }]);
  1210. send!(s, TcpRepr {
  1211. seq_number: REMOTE_SEQ + 1,
  1212. ack_number: Some(LOCAL_SEQ + 1 + 6 + 6),
  1213. ..SEND_TEMPL
  1214. });
  1215. assert_eq!(s.tx_buffer.len(), 0);
  1216. }
  1217. #[test]
  1218. fn test_established_send_no_ack_send() {
  1219. let mut s = socket_established();
  1220. s.send_slice(b"abcdef").unwrap();
  1221. recv!(s, [TcpRepr {
  1222. seq_number: LOCAL_SEQ + 1,
  1223. ack_number: Some(REMOTE_SEQ + 1),
  1224. payload: &b"abcdef"[..],
  1225. ..RECV_TEMPL
  1226. }]);
  1227. s.send_slice(b"foobar").unwrap();
  1228. recv!(s, [TcpRepr {
  1229. seq_number: LOCAL_SEQ + 1 + 6,
  1230. ack_number: Some(REMOTE_SEQ + 1),
  1231. payload: &b"foobar"[..],
  1232. ..RECV_TEMPL
  1233. }]);
  1234. }
  1235. #[test]
  1236. fn test_established_send_buf_gt_win() {
  1237. let mut s = socket_established();
  1238. s.remote_win_len = 16;
  1239. // First roundtrip after establishing.
  1240. s.send_slice(&[0; 32][..]).unwrap();
  1241. recv!(s, [TcpRepr {
  1242. seq_number: LOCAL_SEQ + 1,
  1243. ack_number: Some(REMOTE_SEQ + 1),
  1244. payload: &[0; 16][..],
  1245. ..RECV_TEMPL
  1246. }]);
  1247. }
  1248. #[test]
  1249. fn test_established_no_ack() {
  1250. let mut s = socket_established();
  1251. send!(s, TcpRepr {
  1252. seq_number: REMOTE_SEQ + 1,
  1253. ack_number: None,
  1254. ..SEND_TEMPL
  1255. }, Err(Error::Malformed));
  1256. }
  1257. #[test]
  1258. fn test_established_bad_ack() {
  1259. let mut s = socket_established();
  1260. // Already acknowledged data.
  1261. send!(s, TcpRepr {
  1262. seq_number: REMOTE_SEQ + 1,
  1263. ack_number: Some(TcpSeqNumber(LOCAL_SEQ.0 - 1)),
  1264. ..SEND_TEMPL
  1265. }, Err(Error::Dropped));
  1266. assert_eq!(s.local_seq_no, LOCAL_SEQ + 1);
  1267. // Data not yet transmitted.
  1268. send!(s, TcpRepr {
  1269. seq_number: REMOTE_SEQ + 1,
  1270. ack_number: Some(LOCAL_SEQ + 10),
  1271. ..SEND_TEMPL
  1272. }, Err(Error::Dropped));
  1273. assert_eq!(s.local_seq_no, LOCAL_SEQ + 1);
  1274. }
  1275. #[test]
  1276. fn test_established_bad_seq() {
  1277. let mut s = socket_established();
  1278. // Data outside of receive window.
  1279. send!(s, TcpRepr {
  1280. seq_number: REMOTE_SEQ + 1 + 256,
  1281. ack_number: Some(LOCAL_SEQ + 1),
  1282. ..SEND_TEMPL
  1283. }, Err(Error::Dropped));
  1284. assert_eq!(s.remote_seq_no, REMOTE_SEQ + 1);
  1285. }
  1286. #[test]
  1287. fn test_established_fin() {
  1288. let mut s = socket_established();
  1289. send!(s, TcpRepr {
  1290. control: TcpControl::Fin,
  1291. seq_number: REMOTE_SEQ + 1,
  1292. ack_number: Some(LOCAL_SEQ + 1),
  1293. ..SEND_TEMPL
  1294. });
  1295. recv!(s, [TcpRepr {
  1296. seq_number: LOCAL_SEQ + 1,
  1297. ack_number: Some(REMOTE_SEQ + 1 + 1),
  1298. ..RECV_TEMPL
  1299. }]);
  1300. assert_eq!(s.state, State::CloseWait);
  1301. sanity!(s, socket_close_wait(), retransmit: false);
  1302. }
  1303. #[test]
  1304. fn test_established_send_fin() {
  1305. let mut s = socket_established();
  1306. s.send_slice(b"abcdef").unwrap();
  1307. send!(s, TcpRepr {
  1308. control: TcpControl::Fin,
  1309. seq_number: REMOTE_SEQ + 1,
  1310. ack_number: Some(LOCAL_SEQ + 1),
  1311. ..SEND_TEMPL
  1312. });
  1313. assert_eq!(s.state, State::CloseWait);
  1314. recv!(s, [TcpRepr {
  1315. seq_number: LOCAL_SEQ + 1,
  1316. ack_number: Some(REMOTE_SEQ + 1 + 1),
  1317. payload: &b"abcdef"[..],
  1318. ..RECV_TEMPL
  1319. }]);
  1320. }
  1321. #[test]
  1322. fn test_established_rst() {
  1323. let mut s = socket_established();
  1324. send!(s, TcpRepr {
  1325. control: TcpControl::Rst,
  1326. seq_number: REMOTE_SEQ + 1,
  1327. ack_number: Some(LOCAL_SEQ + 1),
  1328. ..SEND_TEMPL
  1329. });
  1330. assert_eq!(s.state, State::Closed);
  1331. }
  1332. #[test]
  1333. fn test_established_rst_no_ack() {
  1334. let mut s = socket_established();
  1335. send!(s, TcpRepr {
  1336. control: TcpControl::Rst,
  1337. seq_number: REMOTE_SEQ + 1,
  1338. ack_number: None,
  1339. ..SEND_TEMPL
  1340. });
  1341. assert_eq!(s.state, State::Closed);
  1342. }
  1343. #[test]
  1344. fn test_established_close() {
  1345. let mut s = socket_established();
  1346. s.close();
  1347. assert_eq!(s.state, State::FinWait1);
  1348. sanity!(s, socket_fin_wait_1());
  1349. }
  1350. // =========================================================================================//
  1351. // Tests for the FIN-WAIT-1 state.
  1352. // =========================================================================================//
  1353. fn socket_fin_wait_1() -> TcpSocket<'static> {
  1354. let mut s = socket_established();
  1355. s.state = State::FinWait1;
  1356. s
  1357. }
  1358. #[test]
  1359. fn test_fin_wait_1_fin_ack() {
  1360. let mut s = socket_fin_wait_1();
  1361. recv!(s, [TcpRepr {
  1362. control: TcpControl::Fin,
  1363. seq_number: LOCAL_SEQ + 1,
  1364. ack_number: Some(REMOTE_SEQ + 1),
  1365. ..RECV_TEMPL
  1366. }]);
  1367. send!(s, TcpRepr {
  1368. seq_number: REMOTE_SEQ + 1,
  1369. ack_number: Some(LOCAL_SEQ + 1 + 1),
  1370. ..SEND_TEMPL
  1371. });
  1372. assert_eq!(s.state, State::FinWait2);
  1373. sanity!(&s, socket_fin_wait_2(), retransmit: false);
  1374. }
  1375. #[test]
  1376. fn test_fin_wait_1_fin_fin() {
  1377. let mut s = socket_fin_wait_1();
  1378. recv!(s, [TcpRepr {
  1379. control: TcpControl::Fin,
  1380. seq_number: LOCAL_SEQ + 1,
  1381. ack_number: Some(REMOTE_SEQ + 1),
  1382. ..RECV_TEMPL
  1383. }]);
  1384. send!(s, TcpRepr {
  1385. control: TcpControl::Fin,
  1386. seq_number: REMOTE_SEQ + 1,
  1387. ack_number: Some(LOCAL_SEQ + 1),
  1388. ..SEND_TEMPL
  1389. });
  1390. assert_eq!(s.state, State::Closing);
  1391. sanity!(s, socket_closing());
  1392. }
  1393. #[test]
  1394. fn test_fin_wait_1_close() {
  1395. let mut s = socket_fin_wait_1();
  1396. s.close();
  1397. assert_eq!(s.state, State::FinWait1);
  1398. }
  1399. // =========================================================================================//
  1400. // Tests for the FIN-WAIT-2 state.
  1401. // =========================================================================================//
  1402. fn socket_fin_wait_2() -> TcpSocket<'static> {
  1403. let mut s = socket_fin_wait_1();
  1404. s.state = State::FinWait2;
  1405. s.local_seq_no = LOCAL_SEQ + 1 + 1;
  1406. s
  1407. }
  1408. #[test]
  1409. fn test_fin_wait_2_fin() {
  1410. let mut s = socket_fin_wait_2();
  1411. send!(s, TcpRepr {
  1412. control: TcpControl::Fin,
  1413. seq_number: REMOTE_SEQ + 1,
  1414. ack_number: Some(LOCAL_SEQ + 1 + 1),
  1415. ..SEND_TEMPL
  1416. });
  1417. assert_eq!(s.state, State::TimeWait);
  1418. sanity!(s, socket_time_wait(false));
  1419. }
  1420. #[test]
  1421. fn test_fin_wait_2_close() {
  1422. let mut s = socket_fin_wait_2();
  1423. s.close();
  1424. assert_eq!(s.state, State::FinWait2);
  1425. }
  1426. // =========================================================================================//
  1427. // Tests for the CLOSING state.
  1428. // =========================================================================================//
  1429. fn socket_closing() -> TcpSocket<'static> {
  1430. let mut s = socket_fin_wait_1();
  1431. s.state = State::Closing;
  1432. s.local_seq_no = LOCAL_SEQ + 1;
  1433. s.remote_seq_no = REMOTE_SEQ + 1 + 1;
  1434. s
  1435. }
  1436. #[test]
  1437. fn test_closing_ack_fin() {
  1438. let mut s = socket_closing();
  1439. recv!(s, [TcpRepr {
  1440. seq_number: LOCAL_SEQ + 1,
  1441. ack_number: Some(REMOTE_SEQ + 1 + 1),
  1442. ..RECV_TEMPL
  1443. }]);
  1444. send!(s, TcpRepr {
  1445. seq_number: REMOTE_SEQ + 1 + 1,
  1446. ack_number: Some(LOCAL_SEQ + 1 + 1),
  1447. ..SEND_TEMPL
  1448. });
  1449. assert_eq!(s.state, State::TimeWait);
  1450. sanity!(s, socket_time_wait(true));
  1451. }
  1452. #[test]
  1453. fn test_closing_close() {
  1454. let mut s = socket_closing();
  1455. s.close();
  1456. assert_eq!(s.state, State::Closing);
  1457. }
  1458. // =========================================================================================//
  1459. // Tests for the TIME-WAIT state.
  1460. // =========================================================================================//
  1461. fn socket_time_wait(from_closing: bool) -> TcpSocket<'static> {
  1462. let mut s = socket_fin_wait_2();
  1463. s.state = State::TimeWait;
  1464. s.remote_seq_no = REMOTE_SEQ + 1 + 1;
  1465. if from_closing {
  1466. s.remote_last_ack = REMOTE_SEQ + 1 + 1;
  1467. }
  1468. s
  1469. }
  1470. #[test]
  1471. fn test_time_wait_from_fin_wait_2_ack() {
  1472. let mut s = socket_time_wait(false);
  1473. recv!(s, [TcpRepr {
  1474. seq_number: LOCAL_SEQ + 1 + 1,
  1475. ack_number: Some(REMOTE_SEQ + 1 + 1),
  1476. ..RECV_TEMPL
  1477. }]);
  1478. }
  1479. #[test]
  1480. fn test_time_wait_from_closing_no_ack() {
  1481. let mut s = socket_time_wait(true);
  1482. recv!(s, []);
  1483. }
  1484. #[test]
  1485. fn test_time_wait_close() {
  1486. let mut s = socket_time_wait(false);
  1487. s.close();
  1488. assert_eq!(s.state, State::TimeWait);
  1489. }
  1490. // =========================================================================================//
  1491. // Tests for the CLOSE-WAIT state.
  1492. // =========================================================================================//
  1493. fn socket_close_wait() -> TcpSocket<'static> {
  1494. let mut s = socket_established();
  1495. s.state = State::CloseWait;
  1496. s.remote_seq_no = REMOTE_SEQ + 1 + 1;
  1497. s.remote_last_ack = REMOTE_SEQ + 1 + 1;
  1498. s
  1499. }
  1500. #[test]
  1501. fn test_close_wait_ack() {
  1502. let mut s = socket_close_wait();
  1503. s.send_slice(b"abcdef").unwrap();
  1504. recv!(s, [TcpRepr {
  1505. seq_number: LOCAL_SEQ + 1,
  1506. ack_number: Some(REMOTE_SEQ + 1 + 1),
  1507. payload: &b"abcdef"[..],
  1508. ..RECV_TEMPL
  1509. }]);
  1510. send!(s, TcpRepr {
  1511. seq_number: REMOTE_SEQ + 1 + 1,
  1512. ack_number: Some(LOCAL_SEQ + 1 + 6),
  1513. ..SEND_TEMPL
  1514. });
  1515. }
  1516. #[test]
  1517. fn test_close_wait_close() {
  1518. let mut s = socket_close_wait();
  1519. s.close();
  1520. assert_eq!(s.state, State::LastAck);
  1521. sanity!(s, socket_last_ack());
  1522. }
  1523. // =========================================================================================//
  1524. // Tests for the LAST-ACK state.
  1525. // =========================================================================================//
  1526. fn socket_last_ack() -> TcpSocket<'static> {
  1527. let mut s = socket_close_wait();
  1528. s.state = State::LastAck;
  1529. s
  1530. }
  1531. #[test]
  1532. fn test_last_ack_fin_ack() {
  1533. let mut s = socket_last_ack();
  1534. recv!(s, [TcpRepr {
  1535. control: TcpControl::Fin,
  1536. seq_number: LOCAL_SEQ + 1,
  1537. ack_number: Some(REMOTE_SEQ + 1 + 1),
  1538. ..RECV_TEMPL
  1539. }]);
  1540. assert_eq!(s.state, State::LastAck);
  1541. send!(s, TcpRepr {
  1542. seq_number: REMOTE_SEQ + 1 + 1,
  1543. ack_number: Some(LOCAL_SEQ + 1 + 1),
  1544. ..SEND_TEMPL
  1545. });
  1546. assert_eq!(s.state, State::Closed);
  1547. }
  1548. #[test]
  1549. fn test_last_ack_close() {
  1550. let mut s = socket_last_ack();
  1551. s.close();
  1552. assert_eq!(s.state, State::LastAck);
  1553. }
  1554. // =========================================================================================//
  1555. // Tests for transitioning through multiple states.
  1556. // =========================================================================================//
  1557. #[test]
  1558. fn test_listen() {
  1559. let mut s = socket();
  1560. s.listen(IpEndpoint::new(IpAddress::default(), LOCAL_PORT)).unwrap();
  1561. assert_eq!(s.state, State::Listen);
  1562. }
  1563. #[test]
  1564. fn test_three_way_handshake() {
  1565. let mut s = socket_listen();
  1566. send!(s, TcpRepr {
  1567. control: TcpControl::Syn,
  1568. seq_number: REMOTE_SEQ,
  1569. ack_number: None,
  1570. ..SEND_TEMPL
  1571. });
  1572. assert_eq!(s.state(), State::SynReceived);
  1573. assert_eq!(s.local_endpoint(), LOCAL_END);
  1574. assert_eq!(s.remote_endpoint(), REMOTE_END);
  1575. recv!(s, [TcpRepr {
  1576. control: TcpControl::Syn,
  1577. seq_number: LOCAL_SEQ,
  1578. ack_number: Some(REMOTE_SEQ + 1),
  1579. ..RECV_TEMPL
  1580. }]);
  1581. send!(s, TcpRepr {
  1582. seq_number: REMOTE_SEQ + 1,
  1583. ack_number: Some(LOCAL_SEQ + 1),
  1584. ..SEND_TEMPL
  1585. });
  1586. assert_eq!(s.state(), State::Established);
  1587. assert_eq!(s.local_seq_no, LOCAL_SEQ + 1);
  1588. assert_eq!(s.remote_seq_no, REMOTE_SEQ + 1);
  1589. }
  1590. #[test]
  1591. fn test_remote_close() {
  1592. let mut s = socket_established();
  1593. send!(s, TcpRepr {
  1594. control: TcpControl::Fin,
  1595. seq_number: REMOTE_SEQ + 1,
  1596. ack_number: Some(LOCAL_SEQ + 1),
  1597. ..SEND_TEMPL
  1598. });
  1599. assert_eq!(s.state, State::CloseWait);
  1600. recv!(s, [TcpRepr {
  1601. seq_number: LOCAL_SEQ + 1,
  1602. ack_number: Some(REMOTE_SEQ + 1 + 1),
  1603. ..RECV_TEMPL
  1604. }]);
  1605. s.close();
  1606. assert_eq!(s.state, State::LastAck);
  1607. recv!(s, [TcpRepr {
  1608. control: TcpControl::Fin,
  1609. seq_number: LOCAL_SEQ + 1,
  1610. ack_number: Some(REMOTE_SEQ + 1 + 1),
  1611. ..RECV_TEMPL
  1612. }]);
  1613. send!(s, TcpRepr {
  1614. seq_number: REMOTE_SEQ + 1 + 1,
  1615. ack_number: Some(LOCAL_SEQ + 1 + 1),
  1616. ..SEND_TEMPL
  1617. });
  1618. assert_eq!(s.state, State::Closed);
  1619. }
  1620. #[test]
  1621. fn test_local_close() {
  1622. let mut s = socket_established();
  1623. s.close();
  1624. assert_eq!(s.state, State::FinWait1);
  1625. recv!(s, [TcpRepr {
  1626. control: TcpControl::Fin,
  1627. seq_number: LOCAL_SEQ + 1,
  1628. ack_number: Some(REMOTE_SEQ + 1),
  1629. ..RECV_TEMPL
  1630. }]);
  1631. send!(s, TcpRepr {
  1632. seq_number: REMOTE_SEQ + 1,
  1633. ack_number: Some(LOCAL_SEQ + 1 + 1),
  1634. ..SEND_TEMPL
  1635. });
  1636. assert_eq!(s.state, State::FinWait2);
  1637. send!(s, TcpRepr {
  1638. control: TcpControl::Fin,
  1639. seq_number: REMOTE_SEQ + 1,
  1640. ack_number: Some(LOCAL_SEQ + 1 + 1),
  1641. ..SEND_TEMPL
  1642. });
  1643. assert_eq!(s.state, State::TimeWait);
  1644. recv!(s, [TcpRepr {
  1645. seq_number: LOCAL_SEQ + 1 + 1,
  1646. ack_number: Some(REMOTE_SEQ + 1 + 1),
  1647. ..RECV_TEMPL
  1648. }]);
  1649. }
  1650. #[test]
  1651. fn test_simultaneous_close() {
  1652. let mut s = socket_established();
  1653. s.close();
  1654. assert_eq!(s.state, State::FinWait1);
  1655. recv!(s, [TcpRepr { // this is logically located...
  1656. control: TcpControl::Fin,
  1657. seq_number: LOCAL_SEQ + 1,
  1658. ack_number: Some(REMOTE_SEQ + 1),
  1659. ..RECV_TEMPL
  1660. }]);
  1661. send!(s, TcpRepr {
  1662. control: TcpControl::Fin,
  1663. seq_number: REMOTE_SEQ + 1,
  1664. ack_number: Some(LOCAL_SEQ + 1),
  1665. ..SEND_TEMPL
  1666. });
  1667. assert_eq!(s.state, State::Closing);
  1668. recv!(s, [TcpRepr {
  1669. seq_number: LOCAL_SEQ + 1,
  1670. ack_number: Some(REMOTE_SEQ + 1 + 1),
  1671. ..RECV_TEMPL
  1672. }]);
  1673. // ... at this point
  1674. send!(s, TcpRepr {
  1675. seq_number: REMOTE_SEQ + 1 + 1,
  1676. ack_number: Some(LOCAL_SEQ + 1 + 1),
  1677. ..SEND_TEMPL
  1678. });
  1679. assert_eq!(s.state, State::TimeWait);
  1680. recv!(s, []);
  1681. }
  1682. #[test]
  1683. fn test_fin_with_data() {
  1684. let mut s = socket_established();
  1685. s.send_slice(b"abcdef").unwrap();
  1686. s.close();
  1687. recv!(s, [TcpRepr {
  1688. control: TcpControl::Fin,
  1689. seq_number: LOCAL_SEQ + 1,
  1690. ack_number: Some(REMOTE_SEQ + 1),
  1691. payload: &b"abcdef"[..],
  1692. ..RECV_TEMPL
  1693. }])
  1694. }
  1695. // =========================================================================================//
  1696. // Tests for retransmission on packet loss.
  1697. // =========================================================================================//
  1698. fn socket_recved() -> TcpSocket<'static> {
  1699. let mut s = socket_established();
  1700. send!(s, TcpRepr {
  1701. seq_number: REMOTE_SEQ + 1,
  1702. ack_number: Some(LOCAL_SEQ + 1),
  1703. payload: &b"abcdef"[..],
  1704. ..SEND_TEMPL
  1705. });
  1706. recv!(s, [TcpRepr {
  1707. seq_number: LOCAL_SEQ + 1,
  1708. ack_number: Some(REMOTE_SEQ + 1 + 6),
  1709. window_len: 58,
  1710. ..RECV_TEMPL
  1711. }]);
  1712. s
  1713. }
  1714. #[test]
  1715. fn test_duplicate_seq_ack() {
  1716. let mut s = socket_recved();
  1717. // remote retransmission
  1718. send!(s, TcpRepr {
  1719. seq_number: REMOTE_SEQ + 1,
  1720. ack_number: Some(LOCAL_SEQ + 1),
  1721. payload: &b"abcdef"[..],
  1722. ..SEND_TEMPL
  1723. }, Err(Error::Dropped));
  1724. recv!(s, [TcpRepr {
  1725. seq_number: LOCAL_SEQ + 1,
  1726. ack_number: Some(REMOTE_SEQ + 1 + 6),
  1727. window_len: 58,
  1728. ..RECV_TEMPL
  1729. }]);
  1730. }
  1731. #[test]
  1732. fn test_data_retransmit() {
  1733. let mut s = socket_established();
  1734. s.send_slice(b"abcdef").unwrap();
  1735. recv!(s, time 1000, Ok(TcpRepr {
  1736. seq_number: LOCAL_SEQ + 1,
  1737. ack_number: Some(REMOTE_SEQ + 1),
  1738. payload: &b"abcdef"[..],
  1739. ..RECV_TEMPL
  1740. }));
  1741. recv!(s, time 1050, Err(Error::Exhausted));
  1742. recv!(s, time 1100, Ok(TcpRepr {
  1743. seq_number: LOCAL_SEQ + 1,
  1744. ack_number: Some(REMOTE_SEQ + 1),
  1745. payload: &b"abcdef"[..],
  1746. ..RECV_TEMPL
  1747. }));
  1748. }
  1749. #[test]
  1750. fn test_send_data_after_syn_ack_retransmit() {
  1751. let mut s = socket_syn_received();
  1752. recv!(s, time 50, Ok(TcpRepr {
  1753. control: TcpControl::Syn,
  1754. seq_number: LOCAL_SEQ,
  1755. ack_number: Some(REMOTE_SEQ + 1),
  1756. ..RECV_TEMPL
  1757. }));
  1758. recv!(s, time 150, Ok(TcpRepr { // retransmit
  1759. control: TcpControl::Syn,
  1760. seq_number: LOCAL_SEQ,
  1761. ack_number: Some(REMOTE_SEQ + 1),
  1762. ..RECV_TEMPL
  1763. }));
  1764. send!(s, TcpRepr {
  1765. seq_number: REMOTE_SEQ + 1,
  1766. ack_number: Some(LOCAL_SEQ + 1),
  1767. ..SEND_TEMPL
  1768. });
  1769. assert_eq!(s.state(), State::Established);
  1770. s.send_slice(b"abcdef").unwrap();
  1771. recv!(s, [TcpRepr {
  1772. seq_number: LOCAL_SEQ + 1,
  1773. ack_number: Some(REMOTE_SEQ + 1),
  1774. payload: &b"abcdef"[..],
  1775. ..RECV_TEMPL
  1776. }])
  1777. }
  1778. }