tcp.rs 92 KB

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