PageRenderTime 92ms CodeModel.GetById 12ms RepoModel.GetById 0ms app.codeStats 1ms

/os/net/src/stream.cpp

http://es-operating-system.googlecode.com/
C++ | 495 lines | 405 code | 62 blank | 28 comment | 41 complexity | 16519ec242f518b6b127fc5cb69b07d9 MD5 | raw file
Possible License(s): Apache-2.0
  1. /*
  2. * Copyright 2008, 2009 Google Inc.
  3. * Copyright 2006, 2007 Nintendo Co., Ltd.
  4. *
  5. * Licensed under the Apache License, Version 2.0 (the "License");
  6. * you may not use this file except in compliance with the License.
  7. * You may obtain a copy of the License at
  8. *
  9. * http://www.apache.org/licenses/LICENSE-2.0
  10. *
  11. * Unless required by applicable law or agreed to in writing, software
  12. * distributed under the License is distributed on an "AS IS" BASIS,
  13. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  14. * See the License for the specific language governing permissions and
  15. * limitations under the License.
  16. */
  17. #include <es/endian.h>
  18. #include <es/handle.h>
  19. #include <es/md5.h>
  20. #include <es/net/inet4.h>
  21. #include "stream.h"
  22. const TimeSpan StreamReceiver::R2(1000000000LL); // RFC 1122 4.2.3.5
  23. const TimeSpan StreamReceiver::R2_SYN(1800000000LL);
  24. const TimeSpan StreamReceiver::MSL(1200000000LL);
  25. const TimeSpan StreamReceiver::RTT_MIN(10000000);
  26. const TimeSpan StreamReceiver::RTT_MAX(2 * MSL);
  27. const TimeSpan StreamReceiver::RTT_DEFAULT(30000000);
  28. const TimeSpan StreamReceiver::PERSIST_MAX(MAX_BACKOFF * RTT_MAX);
  29. const TimeSpan StreamReceiver::DACK_TIMEOUT(2000000);
  30. const int StreamReceiver::MaxConn(5);
  31. StreamReceiver::StateClosed StreamReceiver::stateClosed;
  32. StreamReceiver::StateListen StreamReceiver::stateListen;
  33. StreamReceiver::StateSynSent StreamReceiver::stateSynSent;
  34. StreamReceiver::StateSynReceived StreamReceiver::stateSynReceived;
  35. StreamReceiver::StateEstablished StreamReceiver::stateEstablished;
  36. StreamReceiver::StateFinWait1 StreamReceiver::stateFinWait1;
  37. StreamReceiver::StateFinWait2 StreamReceiver::stateFinWait2;
  38. StreamReceiver::StateCloseWait StreamReceiver::stateCloseWait;
  39. StreamReceiver::StateLastAck StreamReceiver::stateLastAck;
  40. StreamReceiver::StateClosing StreamReceiver::stateClosing;
  41. StreamReceiver::StateTimeWait StreamReceiver::stateTimeWait;
  42. // cf. RFC 1948
  43. TCPSeq StreamReceiver::
  44. isn(InetMessenger* m)
  45. {
  46. MD5Context context;
  47. u8 bytes[16];
  48. Handle<Address> address;
  49. int len;
  50. u16 port;
  51. MD5Init(&context);
  52. // XXX MD5Update(&context, per-host secret and the boot);
  53. address = m->getRemote();
  54. len = address->getAddress(bytes, sizeof bytes);
  55. MD5Update(&context, bytes, len);
  56. port = htons(m->getLocalPort());
  57. MD5Update(&context, &port, 2);
  58. address = m->getLocal();
  59. len = address->getAddress(bytes, sizeof bytes);
  60. MD5Update(&context, bytes, len);
  61. port = htons(m->getRemotePort());
  62. MD5Update(&context, &port, 2);
  63. MD5Final(bytes, &context);
  64. s32 isn = *(s32*) &bytes[0];
  65. isn ^= *(s32*) &bytes[4];
  66. isn ^= *(s32*) &bytes[8];
  67. isn ^= *(s32*) &bytes[12];
  68. isn += (s32) (DateTime::getNow().getTicks() / (10000000 / IIS_CLOCK)); // XXX resolution
  69. return TCPSeq(isn);
  70. }
  71. int StreamReceiver::
  72. getDefaultMSS()
  73. {
  74. if (socket)
  75. {
  76. switch (socket->getAddressFamily())
  77. {
  78. case AF_INET:
  79. return IP_MIN_MTU - sizeof(IPHdr) - sizeof(TCPHdr);
  80. case AF_INET6:
  81. return IP6_MIN_MTU - sizeof(IP6Hdr) - sizeof(TCPHdr);
  82. }
  83. }
  84. return 0;
  85. }
  86. int StreamReceiver::
  87. getDefaultMSS(int mtu)
  88. {
  89. if (socket)
  90. {
  91. switch (socket->getAddressFamily())
  92. {
  93. case AF_INET:
  94. return mtu - sizeof(IPHdr) - sizeof(TCPHdr);
  95. case AF_INET6:
  96. return mtu - sizeof(IP6Hdr) - sizeof(TCPHdr);
  97. }
  98. }
  99. return 0;
  100. }
  101. bool StreamReceiver::
  102. input(InetMessenger* m, Conduit* c)
  103. {
  104. Synchronized<es::Monitor*> method(monitor);
  105. esReport("StreamReceiver::input %s\n", state->getName());
  106. if (state->input(m, this))
  107. {
  108. int size = 14 + 60 + 60 + mss; // XXX Assume MAC, IPv4, TCP
  109. Handle<InetMessenger> seg = new InetMessenger(&InetReceiver::output, size, size);
  110. Handle<Address> addr;
  111. seg->setLocal(addr = m->getLocal());
  112. seg->setRemote(addr = m->getRemote());
  113. seg->setLocalPort(m->getLocalPort());
  114. seg->setRemotePort(m->getRemotePort());
  115. seg->setType(IPPROTO_TCP);
  116. Visitor v(seg);
  117. conduit->accept(&v, conduit->getB());
  118. }
  119. return true;
  120. }
  121. bool StreamReceiver::
  122. output(InetMessenger* m, Conduit* c)
  123. {
  124. Synchronized<es::Monitor*> method(monitor);
  125. hole = 0;
  126. onxt = sendNext;
  127. return state->output(m, this);
  128. }
  129. bool StreamReceiver::
  130. error(InetMessenger* m, Conduit* c)
  131. {
  132. Synchronized<es::Monitor*> method(monitor);
  133. int code = m->getErrorCode();
  134. if (code != ENETUNREACH)
  135. {
  136. err = code;
  137. abort();
  138. }
  139. return true;
  140. }
  141. void StreamReceiver::
  142. abort()
  143. {
  144. setState(stateClosed);
  145. stopRxmitTimer();
  146. stopAckTimer();
  147. // XXX process listen and completed, etc.
  148. StreamReceiver* listening = this->listening;
  149. esReport("%s\n", "abort()");
  150. // Clean up accepted queue
  151. if (listening)
  152. {
  153. Synchronized<es::Monitor*> method(listening->monitor);
  154. if (listening->accepted.contains(this))
  155. listening->accepted.remove(this);
  156. }
  157. // TODO Is it nessary to clean up corresponding part in conduit graph?
  158. #if 0
  159. // clean up corresponding part in conduit graph
  160. Adapter* adapter;
  161. if (this->socket)
  162. {
  163. adapter = this->socket->getAdapter();
  164. if (adapter)
  165. {
  166. SocketUninstaller uninstaller(this->socket);
  167. adapter->accept(&uninstaller);
  168. }
  169. }
  170. #endif
  171. notify();
  172. }
  173. // Copy data out of recvRing
  174. bool StreamReceiver::
  175. read(SocketMessenger* m, Conduit* c)
  176. {
  177. Synchronized<es::Monitor*> method(monitor);
  178. while (!isReadable())
  179. {
  180. if (!socket->getBlocking())
  181. {
  182. m->setErrorCode(EAGAIN);
  183. return false;
  184. }
  185. if (socket->getTimeout())
  186. {
  187. monitor->wait(socket->getTimeout());
  188. if (!isReadable())
  189. {
  190. m->setErrorCode(ETIMEDOUT);
  191. return false;
  192. }
  193. else
  194. {
  195. break;
  196. }
  197. }
  198. monitor->wait();
  199. }
  200. long len;
  201. if (recvRing.getUsed() + recvUp - recvNext == 0)
  202. {
  203. len = 1;
  204. haveUrg = false;
  205. }
  206. else if (haveUrg)
  207. {
  208. len = std::min(recvRing.getUsed(), recvRing.getUsed() + recvUp - recvNext);
  209. }
  210. else
  211. {
  212. len = recvRing.getUsed();
  213. }
  214. if (len < 0)
  215. {
  216. // XXX m->setErrorCode(XXX);
  217. return false;
  218. }
  219. if (m->getSize() < len)
  220. {
  221. len = m->getSize();
  222. }
  223. m->setSize(len);
  224. recvRing.read(m->fix(len), len);
  225. int size = 14 + 60 + 60 + mss; // XXX Assume MAC, IPv4, TCP
  226. Handle<InetMessenger> seg = new InetMessenger(&InetReceiver::output, size, size);
  227. Handle<Address> addr;
  228. seg->setLocal(addr = m->getLocal());
  229. seg->setRemote(addr = m->getRemote());
  230. seg->setLocalPort(m->getLocalPort());
  231. seg->setRemotePort(m->getRemotePort());
  232. seg->setType(IPPROTO_TCP);
  233. Visitor v(seg);
  234. conduit->accept(&v, conduit->getB());
  235. return false;
  236. }
  237. // Copy data into sendRing
  238. bool StreamReceiver::
  239. write(SocketMessenger* m, Conduit* c)
  240. {
  241. Synchronized<es::Monitor*> method(monitor);
  242. while (!isWritable())
  243. {
  244. if (!socket->getBlocking())
  245. {
  246. m->setErrorCode(EAGAIN);
  247. return false;
  248. }
  249. if (socket->getTimeout())
  250. {
  251. monitor->wait(socket->getTimeout());
  252. if (!isWritable())
  253. {
  254. m->setErrorCode(ETIMEDOUT);
  255. return false;
  256. }
  257. else
  258. {
  259. break;
  260. }
  261. }
  262. monitor->wait();
  263. }
  264. long len = socket->getSendBufferSize() - sendRing.getUsed();
  265. if (len < 0)
  266. {
  267. // XXX m->setErrorCode(XXX);
  268. return false;
  269. }
  270. if (m->getLength() < len)
  271. {
  272. len = m->getLength();
  273. }
  274. sendRing.write(m->fix(len), len);
  275. m->setPosition(m->getSize() - len);
  276. int size = 14 + 60 + 60 + mss; // XXX Assume MAC, IPv4, TCP
  277. Handle<InetMessenger> seg = new InetMessenger(&InetReceiver::output, size, size);
  278. Handle<Address> addr;
  279. seg->setLocal(addr = m->getLocal());
  280. seg->setRemote(addr = m->getRemote());
  281. seg->setLocalPort(m->getLocalPort());
  282. seg->setRemotePort(m->getRemotePort());
  283. seg->setType(IPPROTO_TCP);
  284. seg->setFlag(m->getFlag());
  285. Visitor v(seg);
  286. conduit->accept(&v, conduit->getB());
  287. return false;
  288. }
  289. bool StreamReceiver::
  290. accept(SocketMessenger* m, Conduit* c)
  291. {
  292. Synchronized<es::Monitor*> method(monitor);
  293. return state->accept(m, this);
  294. }
  295. bool StreamReceiver::
  296. listen(SocketMessenger* m, Conduit* c)
  297. {
  298. Synchronized<es::Monitor*> method(monitor);
  299. return false;
  300. }
  301. bool StreamReceiver::
  302. connect(SocketMessenger* m, Conduit* c)
  303. {
  304. Synchronized<es::Monitor*> method(monitor);
  305. return state->connect(m, this);
  306. }
  307. bool StreamReceiver::
  308. close(SocketMessenger* m, Conduit* c)
  309. {
  310. Synchronized<es::Monitor*> method(monitor);
  311. if (socket->getTimeout() == 0 && !socket->getBlocking())
  312. {
  313. state->abort(this);
  314. return false;
  315. }
  316. shutrd = shutwr = true;
  317. if (state->close(m, this))
  318. {
  319. int size = 14 + 60 + 60 + mss; // XXX Assume MAC, IPv4, TCP
  320. Handle<InetMessenger> seg = new InetMessenger(&InetReceiver::output, size, size);
  321. Handle<Address> addr;
  322. seg->setLocal(addr = m->getLocal());
  323. seg->setRemote(addr = m->getRemote());
  324. seg->setLocalPort(m->getLocalPort());
  325. seg->setRemotePort(m->getRemotePort());
  326. seg->setType(IPPROTO_TCP);
  327. Visitor v(seg);
  328. conduit->accept(&v, conduit->getB());
  329. }
  330. while (!isClosable())
  331. {
  332. ASSERT(socket);
  333. if (!socket->getBlocking())
  334. {
  335. m->setErrorCode(EAGAIN);
  336. return false;
  337. }
  338. monitor->wait();
  339. }
  340. return false;
  341. }
  342. bool StreamReceiver::
  343. shutdownOutput(SocketMessenger* m, Conduit* c)
  344. {
  345. Synchronized<es::Monitor*> method(monitor);
  346. shutwr = true;
  347. if (state->close(m, this))
  348. {
  349. int size = 14 + 60 + 60 + mss; // XXX Assume MAC, IPv4, TCP
  350. Handle<InetMessenger> seg = new InetMessenger(&InetReceiver::output, size, size);
  351. Handle<Address> addr;
  352. seg->setLocal(addr = m->getLocal());
  353. seg->setRemote(addr = m->getRemote());
  354. seg->setLocalPort(m->getLocalPort());
  355. seg->setRemotePort(m->getRemotePort());
  356. seg->setType(IPPROTO_TCP);
  357. Visitor v(seg);
  358. conduit->accept(&v, conduit->getB());
  359. }
  360. return false;
  361. }
  362. bool StreamReceiver::
  363. shutdownInput(SocketMessenger* m, Conduit* c)
  364. {
  365. Synchronized<es::Monitor*> method(monitor);
  366. shutrd = true;
  367. notify();
  368. return false;
  369. }
  370. bool StreamReceiver::
  371. StateClosed::connect(SocketMessenger* m, StreamReceiver* s)
  372. {
  373. // Initialize tcp
  374. s->initRto();
  375. s->iss = s->isn(m);
  376. s->sendUna = s->iss;
  377. s->sendNext = s->iss; // incremented later by output()
  378. s->sendMax = s->iss;
  379. s->sendUp = s->sendUna;
  380. s->sendFack = s->sendUna;
  381. s->rxmitData = 0;
  382. s->sendAwin = 0;
  383. #ifdef TCP_SACK
  384. s->sendRecover = s->sendUna;
  385. s->lastSack = s->sendUna;
  386. #endif // TCP_SACK
  387. Handle<Address> local = m->getLocal();
  388. s->mss = s->getDefaultMSS(local->getPathMTU());
  389. s->setState(stateSynSent);
  390. // Send SYN
  391. int size = 14 + 60 + 60; // XXX Assume MAC, IPv4, TCP
  392. Handle<InetMessenger> seg = new InetMessenger(&InetReceiver::output, size, size);
  393. seg->setLocal(local);
  394. seg->setRemote(Handle<Address>(m->getRemote()));
  395. seg->setLocalPort(m->getLocalPort());
  396. seg->setRemotePort(m->getRemotePort());
  397. seg->setType(IPPROTO_TCP);
  398. Visitor v(seg);
  399. s->conduit->accept(&v, s->conduit->getB());
  400. while (!s->isConnectable())
  401. {
  402. if (!s->socket->getBlocking())
  403. {
  404. m->setErrorCode(EINPROGRESS);
  405. return false;
  406. }
  407. s->monitor->wait();
  408. }
  409. return false;
  410. }
  411. bool StreamReceiver::
  412. StateListen::accept(SocketMessenger* m, StreamReceiver* s)
  413. {
  414. while (!s->isAcceptable())
  415. {
  416. if (!s->socket->getBlocking())
  417. {
  418. m->setErrorCode(EAGAIN);
  419. return false;
  420. }
  421. s->monitor->wait();
  422. }
  423. if (s->state == &stateListen && !s->accepted.isEmpty())
  424. {
  425. s->pendingConn--;
  426. ASSERT(s->pendingConn >= 0);
  427. StreamReceiver* accepted = s->accepted.removeFirst();
  428. ASSERT(accepted);
  429. ASSERT(accepted->socket);
  430. m->setSocket(accepted->socket);
  431. }
  432. return false;
  433. }