PageRenderTime 41ms CodeModel.GetById 13ms RepoModel.GetById 0ms app.codeStats 0ms

/os/net/src/socket.cpp

http://es-operating-system.googlecode.com/
C++ | 802 lines | 676 code | 95 blank | 31 comment | 100 complexity | e75939e7436bf287480a0ec36440e8df 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 <new>
  18. #include <stdlib.h>
  19. #include <string.h>
  20. #include <es/net/arp.h>
  21. #include "dix.h"
  22. #include "inet4address.h"
  23. #include "loopback.h"
  24. #include "socket.h"
  25. #include "visualizer.h"
  26. es::Resolver* Socket::resolver = 0;
  27. es::InternetConfig* Socket::config = 0;
  28. es::Context* Socket::interface = 0;
  29. AddressFamily::List Socket::addressFamilyList;
  30. NetworkInterface* Socket::interfaces[Socket::INTERFACE_MAX];
  31. Timer* Socket::timer;
  32. LoopbackAccessor LoopbackInterface::loopbackAccessor;
  33. void Socket::
  34. initialize()
  35. {
  36. DateTime seed = DateTime::getNow();
  37. srand48(seed.getTicks());
  38. timer = new Timer;
  39. }
  40. int Socket::
  41. addInterface(es::NetworkInterface* networkInterface)
  42. {
  43. int n;
  44. for (n = 1; n < Socket::INTERFACE_MAX; ++n)
  45. {
  46. if (interfaces[n] == 0)
  47. {
  48. break;
  49. }
  50. }
  51. if (Socket::INTERFACE_MAX <= n)
  52. {
  53. return -1;
  54. }
  55. switch (networkInterface->getType())
  56. {
  57. case es::NetworkInterface::Ethernet:
  58. {
  59. DIXInterface* dixInterface = new DIXInterface(networkInterface);
  60. dixInterface->setScopeID(n);
  61. interfaces[n] = dixInterface;
  62. // Connect address families to the loopback interface.
  63. AddressFamily* af;
  64. AddressFamily::List::Iterator iter = addressFamilyList.begin();
  65. while ((af = iter.next()))
  66. {
  67. af->addInterface(dixInterface);
  68. }
  69. #if 0
  70. {
  71. Visualizer v;
  72. dixInterface->getAdapter()->accept(&v);
  73. }
  74. #endif
  75. dixInterface->start();
  76. break;
  77. }
  78. case es::NetworkInterface::Loopback:
  79. {
  80. LoopbackInterface* loopbackInterface = new LoopbackInterface(networkInterface);
  81. loopbackInterface->setScopeID(n);
  82. interfaces[n] = loopbackInterface;
  83. // Connect address families to the loopback interface.
  84. AddressFamily* af;
  85. AddressFamily::List::Iterator iter = addressFamilyList.begin();
  86. while ((af = iter.next()))
  87. {
  88. af->addInterface(loopbackInterface);
  89. }
  90. #if 0
  91. {
  92. Visualizer v;
  93. loopbackInterface->getAdapter()->accept(&v);
  94. }
  95. #endif
  96. loopbackInterface->start();
  97. break;
  98. }
  99. default:
  100. return -1;
  101. }
  102. return n;
  103. }
  104. void Socket::
  105. removeInterface(es::NetworkInterface* networkInterface)
  106. {
  107. for (int n = 1; n < Socket::INTERFACE_MAX; ++n)
  108. {
  109. NetworkInterface* i = interfaces[n];
  110. if (i && i->networkInterface == networkInterface)
  111. {
  112. interfaces[n] = 0;
  113. delete i;
  114. break;
  115. }
  116. }
  117. }
  118. Socket::
  119. Socket(int family, int type, int protocol) :
  120. family(family),
  121. type(type),
  122. protocol(protocol),
  123. adapter(0),
  124. af(0),
  125. recvBufferSize(8192),
  126. sendBufferSize(8192),
  127. errorCode(0),
  128. selector(0),
  129. blocking(true),
  130. recvFromAddress(0),
  131. recvFromPort(0)
  132. {
  133. af = getAddressFamily(family);
  134. }
  135. Socket::
  136. ~Socket()
  137. {
  138. // Leave from multicast groups XXX
  139. if (adapter)
  140. {
  141. SocketUninstaller uninstaller(this);
  142. adapter->accept(&uninstaller);
  143. }
  144. }
  145. bool Socket::
  146. input(InetMessenger* m, Conduit* c)
  147. {
  148. return true;
  149. }
  150. bool Socket::
  151. output(InetMessenger* m, Conduit* c)
  152. {
  153. return true;
  154. }
  155. bool Socket::
  156. error(InetMessenger* m, Conduit* c)
  157. {
  158. return true;
  159. }
  160. //
  161. // ISocket
  162. //
  163. bool Socket::
  164. isBound()
  165. {
  166. return getLocalPort();
  167. }
  168. bool Socket::
  169. isClosed()
  170. {
  171. return isBound() && !getAdapter(); // bound and then uninstalled?
  172. }
  173. bool Socket::
  174. sockAtMark()
  175. {
  176. if (!adapter)
  177. {
  178. errorCode = ENOTCONN;
  179. return -errorCode;
  180. }
  181. SocketMessenger m(this, &SocketReceiver::atMark);
  182. Visitor v(&m);
  183. adapter->accept(&v);
  184. int code = m.getErrorCode();
  185. if (code)
  186. {
  187. if (code != EAGAIN)
  188. {
  189. errorCode = code;
  190. }
  191. return -errorCode;
  192. }
  193. return m.getFlag();
  194. }
  195. bool Socket::
  196. isUrgent()
  197. {
  198. if (!adapter)
  199. {
  200. errorCode = ENOTCONN;
  201. return -errorCode;
  202. }
  203. SocketMessenger m(this, &SocketReceiver::isUrgent);
  204. Visitor v(&m);
  205. adapter->accept(&v);
  206. int code = m.getErrorCode();
  207. if (code)
  208. {
  209. if (code != EAGAIN)
  210. {
  211. errorCode = code;
  212. }
  213. return -errorCode;
  214. }
  215. return m.getFlag();
  216. }
  217. bool Socket::
  218. isConnected()
  219. {
  220. return getRemotePort();
  221. }
  222. int Socket::
  223. getHops()
  224. {
  225. }
  226. void Socket::
  227. setHops(int limit)
  228. {
  229. }
  230. int Socket::
  231. getReceiveBufferSize()
  232. {
  233. return recvBufferSize;
  234. }
  235. void Socket::
  236. setReceiveBufferSize(int size)
  237. {
  238. if (!isBound())
  239. {
  240. recvBufferSize = size;
  241. }
  242. }
  243. int Socket::
  244. getSendBufferSize()
  245. {
  246. return sendBufferSize;
  247. }
  248. void Socket::
  249. setSendBufferSize(int size)
  250. {
  251. if (!isBound())
  252. {
  253. sendBufferSize = size;
  254. }
  255. }
  256. long long Socket::
  257. getTimeout()
  258. {
  259. return timeout;
  260. }
  261. void Socket::
  262. setTimeout(long long timeSpan)
  263. {
  264. timeout = timeSpan;
  265. }
  266. bool Socket::
  267. getReuseAddress()
  268. {
  269. }
  270. void Socket::
  271. setReuseAddress(bool on)
  272. {
  273. }
  274. void Socket::
  275. bind(es::InternetAddress* addr, int port)
  276. {
  277. if (isBound())
  278. {
  279. return;
  280. }
  281. if (port == 0)
  282. {
  283. port = af->selectEphemeralPort(this);
  284. if (port == 0)
  285. {
  286. return;
  287. }
  288. // XXX Reserve anon from others
  289. }
  290. Conduit* protocol = af->getProtocol(this);
  291. if (!protocol)
  292. {
  293. return;
  294. }
  295. setLocal(dynamic_cast<Address*>(addr)); // XXX
  296. setLocalPort(port);
  297. SocketInstaller installer(this);
  298. protocol->accept(&installer);
  299. }
  300. void Socket::
  301. connect(es::InternetAddress* addr, int port)
  302. {
  303. if (isConnected() || addr == 0 || port == 0)
  304. {
  305. return;
  306. }
  307. Conduit* protocol = af->getProtocol(this);
  308. if (!protocol)
  309. {
  310. return;
  311. }
  312. int anon = 0;
  313. if (getLocalPort() == 0)
  314. {
  315. anon = af->selectEphemeralPort(this);
  316. if (anon == 0)
  317. {
  318. return;
  319. }
  320. // XXX Reserve anon from others
  321. }
  322. es::InternetAddress* src = 0;
  323. if (!getLocal()) // XXX any
  324. {
  325. src = af->selectSourceAddress(addr);
  326. if (!src)
  327. {
  328. return;
  329. }
  330. }
  331. if (isBound())
  332. {
  333. SocketDisconnector disconnector(this);
  334. adapter->accept(&disconnector);
  335. if (anon)
  336. {
  337. setLocalPort(anon);
  338. }
  339. if (src)
  340. {
  341. setLocal(dynamic_cast<Address*>(src));
  342. }
  343. setRemote(dynamic_cast<Address*>(addr)); // XXX
  344. setRemotePort(port);
  345. SocketConnector connector(this, disconnector.getProtocol());
  346. protocol->accept(&connector);
  347. }
  348. else
  349. {
  350. if (anon)
  351. {
  352. setLocalPort(anon);
  353. }
  354. if (src)
  355. {
  356. setLocal(dynamic_cast<Address*>(src));
  357. }
  358. setRemote(dynamic_cast<Address*>(addr)); // XXX
  359. setRemotePort(port);
  360. SocketInstaller installer(this);
  361. protocol->accept(&installer);
  362. }
  363. // Request connect
  364. SocketMessenger m(this, &SocketReceiver::connect);
  365. Visitor v(&m);
  366. adapter->accept(&v);
  367. int code = m.getErrorCode();
  368. if (code != EINPROGRESS)
  369. {
  370. errorCode = code;
  371. }
  372. }
  373. es::Socket* Socket::
  374. accept()
  375. {
  376. SocketMessenger m(this, &SocketReceiver::accept);
  377. Visitor v(&m);
  378. adapter->accept(&v);
  379. errorCode = m.getErrorCode();
  380. int code = m.getErrorCode();
  381. if (code != EAGAIN)
  382. {
  383. errorCode = code;
  384. }
  385. return m.getSocket();
  386. }
  387. void Socket::
  388. close()
  389. {
  390. if (!adapter)
  391. {
  392. return;
  393. }
  394. SocketMessenger m(this, &SocketReceiver::close);
  395. Visitor v(&m);
  396. adapter->accept(&v);
  397. int code = m.getErrorCode();
  398. if (code != EAGAIN)
  399. {
  400. errorCode = code;
  401. }
  402. }
  403. void Socket::
  404. listen(int backlog)
  405. {
  406. StreamReceiver* s = dynamic_cast<StreamReceiver*>(getReceiver());
  407. if (s)
  408. {
  409. s->setState(StreamReceiver::stateListen);
  410. s->setBackLogCount(backlog);
  411. }
  412. }
  413. int Socket::
  414. read(void* dst, int count)
  415. {
  416. if (!adapter)
  417. {
  418. errorCode = ENOTCONN;
  419. return -errorCode;
  420. }
  421. SocketMessenger m(this, &SocketReceiver::read, dst, count);
  422. Visitor v(&m);
  423. adapter->accept(&v);
  424. int code = m.getErrorCode();
  425. if (code)
  426. {
  427. if (code != EAGAIN)
  428. {
  429. errorCode = code;
  430. }
  431. return -errorCode;
  432. }
  433. return m.getLength();
  434. }
  435. int Socket::
  436. recvFrom(void* dst, int count, int flags)
  437. {
  438. if (!adapter)
  439. {
  440. errorCode = ENOTCONN;
  441. return -errorCode;
  442. }
  443. SocketMessenger m(this, &SocketReceiver::read, dst, count);
  444. Visitor v(&m);
  445. adapter->accept(&v);
  446. int code = m.getErrorCode();
  447. if (code)
  448. {
  449. if (code != EAGAIN)
  450. {
  451. errorCode = code;
  452. }
  453. return -errorCode;
  454. }
  455. if (recvFromAddress)
  456. {
  457. recvFromAddress->release();
  458. }
  459. recvFromAddress = m.getRemote();
  460. recvFromPort = m.getRemotePort();
  461. return m.getLength();
  462. }
  463. es::InternetAddress* Socket::
  464. getRecvFromAddress()
  465. {
  466. es::InternetAddress* addr = recvFromAddress;
  467. recvFromAddress = 0;
  468. return addr;
  469. }
  470. int Socket::
  471. getRecvFromPort()
  472. {
  473. int port = recvFromPort;
  474. recvFromPort = 0;
  475. return port;
  476. }
  477. int Socket::
  478. sendTo(const void* src, int count, int flags, es::InternetAddress* addr, int port)
  479. {
  480. if (!adapter)
  481. {
  482. errorCode = ENOTCONN;
  483. return -errorCode;
  484. }
  485. SocketMessenger m(this, &SocketReceiver::write, const_cast<void*>(src), count);
  486. m.setRemote(dynamic_cast<Inet4Address*>(addr));
  487. m.setRemotePort(port);
  488. m.setFlag(flags);
  489. Visitor v(&m);
  490. adapter->accept(&v);
  491. int code = m.getErrorCode();
  492. if (code)
  493. {
  494. if (code != EAGAIN)
  495. {
  496. errorCode = code;
  497. }
  498. return -errorCode;
  499. }
  500. return m.getLength();
  501. }
  502. void Socket::
  503. shutdownInput()
  504. {
  505. if (!adapter)
  506. {
  507. return;
  508. }
  509. SocketMessenger m(this, &SocketReceiver::shutdownInput);
  510. Visitor v(&m);
  511. adapter->accept(&v);
  512. errorCode = m.getErrorCode();
  513. }
  514. void Socket::
  515. shutdownOutput()
  516. {
  517. if (!adapter)
  518. {
  519. return;
  520. }
  521. SocketMessenger m(this, &SocketReceiver::shutdownOutput);
  522. Visitor v(&m);
  523. adapter->accept(&v);
  524. errorCode = m.getErrorCode();
  525. }
  526. int Socket::
  527. write(const void* src, int count)
  528. {
  529. if (!adapter)
  530. {
  531. errorCode = ENOTCONN;
  532. return -errorCode;
  533. }
  534. SocketMessenger m(this, &SocketReceiver::write, const_cast<void*>(src), count);
  535. Visitor v(&m);
  536. adapter->accept(&v);
  537. int code = m.getErrorCode();
  538. if (code)
  539. {
  540. if (code != EAGAIN)
  541. {
  542. errorCode = code;
  543. }
  544. return -errorCode;
  545. }
  546. return m.getLength();
  547. }
  548. bool Socket::
  549. isAcceptable()
  550. {
  551. if (!adapter)
  552. {
  553. return false;
  554. }
  555. SocketMessenger m(this, &SocketReceiver::isAcceptable);
  556. Visitor v(&m);
  557. adapter->accept(&v);
  558. return m.getErrorCode();
  559. }
  560. bool Socket::
  561. isConnectable()
  562. {
  563. if (!adapter)
  564. {
  565. return false;
  566. }
  567. SocketMessenger m(this, &SocketReceiver::isConnectable);
  568. Visitor v(&m);
  569. adapter->accept(&v);
  570. return m.getErrorCode();
  571. }
  572. bool Socket::
  573. isReadable()
  574. {
  575. if (!adapter)
  576. {
  577. return false;
  578. }
  579. SocketMessenger m(this, &SocketReceiver::isReadable);
  580. Visitor v(&m);
  581. adapter->accept(&v);
  582. return m.getErrorCode();
  583. }
  584. bool Socket::
  585. isWritable()
  586. {
  587. if (!adapter)
  588. {
  589. return false;
  590. }
  591. SocketMessenger m(this, &SocketReceiver::isWritable);
  592. Visitor v(&m);
  593. adapter->accept(&v);
  594. return m.getErrorCode();
  595. }
  596. //
  597. // IMulticastSocket
  598. //
  599. bool Socket::
  600. getLoopbackMode()
  601. {
  602. }
  603. void Socket::
  604. setLoopbackMode(bool disable)
  605. {
  606. }
  607. void Socket::
  608. joinGroup(es::InternetAddress* addr)
  609. {
  610. Address* address = static_cast<Address*>(addr);
  611. if (address->isMulticast())
  612. {
  613. addresses.addLast(address);
  614. address->addSocket(this);
  615. }
  616. }
  617. void Socket::
  618. leaveGroup(es::InternetAddress* addr)
  619. {
  620. Address* address = static_cast<Address*>(addr);
  621. if (addresses.contains(address))
  622. {
  623. addresses.remove(address);
  624. address->removeSocket(this);
  625. }
  626. }
  627. void Socket::
  628. notify()
  629. {
  630. if (!adapter)
  631. {
  632. return;
  633. }
  634. SocketMessenger m(this, &SocketReceiver::notify);
  635. Visitor v(&m);
  636. adapter->accept(&v);
  637. }
  638. int Socket::
  639. add(es::Monitor* selector)
  640. {
  641. esReport("Socket::%s(%p) : %p\n", __func__, selector, this->selector);
  642. if (!selector || this->selector)
  643. {
  644. return -1;
  645. }
  646. selector->addRef();
  647. this->selector = selector;
  648. return 1;
  649. }
  650. int Socket::
  651. remove(es::Monitor* selector)
  652. {
  653. esReport("Socket::%s(%p) : %p\n", __func__, selector, this->selector);
  654. if (!selector || selector != this->selector)
  655. {
  656. return -1;
  657. }
  658. selector->release();
  659. this->selector = 0;
  660. return 1;
  661. }
  662. //
  663. // IInterface
  664. //
  665. Object* Socket::
  666. queryInterface(const char* riid)
  667. {
  668. Object* objectPtr;
  669. if (strcmp(riid, es::Socket::iid()) == 0)
  670. {
  671. objectPtr = static_cast<es::Socket*>(this);
  672. }
  673. else if (strcmp(riid, es::Selectable::iid()) == 0)
  674. {
  675. objectPtr = static_cast<es::Selectable*>(this);
  676. }
  677. else if (strcmp(riid, Object::iid()) == 0)
  678. {
  679. objectPtr = static_cast<es::Socket*>(this);
  680. }
  681. else if (strcmp(riid, es::MulticastSocket::iid()) == 0 && type == es::Socket::Datagram)
  682. {
  683. objectPtr = static_cast<es::Socket*>(this);
  684. }
  685. else
  686. {
  687. return NULL;
  688. }
  689. objectPtr->addRef();
  690. return objectPtr;
  691. }
  692. unsigned int Socket::
  693. addRef()
  694. {
  695. return ref.addRef();
  696. }
  697. unsigned int Socket::
  698. release()
  699. {
  700. unsigned int count = ref.release();
  701. if (count == 0)
  702. {
  703. delete this;
  704. return 0;
  705. }
  706. return count;
  707. }