IPv4Socket.h 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. #pragma once
  2. #include <AK/HashMap.h>
  3. #include <AK/SinglyLinkedList.h>
  4. #include <Kernel/DoubleBuffer.h>
  5. #include <Kernel/Lock.h>
  6. #include <Kernel/Net/IPv4.h>
  7. #include <Kernel/Net/Socket.h>
  8. class IPv4SocketHandle;
  9. class TCPSocketHandle;
  10. class NetworkAdapter;
  11. class TCPPacket;
  12. class TCPSocket;
  13. class IPv4Socket : public Socket {
  14. public:
  15. static NonnullRefPtr<IPv4Socket> create(int type, int protocol);
  16. virtual ~IPv4Socket() override;
  17. static Lockable<HashTable<IPv4Socket*>>& all_sockets();
  18. virtual KResult bind(const sockaddr*, socklen_t) override;
  19. virtual KResult connect(FileDescription&, const sockaddr*, socklen_t, ShouldBlock = ShouldBlock::Yes) override;
  20. virtual bool get_local_address(sockaddr*, socklen_t*) override;
  21. virtual bool get_peer_address(sockaddr*, socklen_t*) override;
  22. virtual void attach(FileDescription&) override;
  23. virtual void detach(FileDescription&) override;
  24. virtual bool can_read(FileDescription&) const override;
  25. virtual ssize_t read(FileDescription&, byte*, ssize_t) override;
  26. virtual ssize_t write(FileDescription&, const byte*, ssize_t) override;
  27. virtual bool can_write(FileDescription&) const override;
  28. virtual ssize_t sendto(FileDescription&, const void*, size_t, int, const sockaddr*, socklen_t) override;
  29. virtual ssize_t recvfrom(FileDescription&, void*, size_t, int flags, sockaddr*, socklen_t*) override;
  30. void did_receive(const IPv4Address& peer_address, word peer_port, ByteBuffer&&);
  31. const IPv4Address& local_address() const;
  32. word local_port() const { return m_local_port; }
  33. void set_local_port(word port) { m_local_port = port; }
  34. const IPv4Address& peer_address() const { return m_peer_address; }
  35. word peer_port() const { return m_peer_port; }
  36. void set_peer_port(word port) { m_peer_port = port; }
  37. protected:
  38. IPv4Socket(int type, int protocol);
  39. virtual const char* class_name() const override { return "IPv4Socket"; }
  40. int allocate_local_port_if_needed();
  41. virtual KResult protocol_bind() { return KSuccess; }
  42. virtual int protocol_receive(const ByteBuffer&, void*, size_t, int) { return -ENOTIMPL; }
  43. virtual int protocol_send(const void*, int) { return -ENOTIMPL; }
  44. virtual KResult protocol_connect(FileDescription&, ShouldBlock) { return KSuccess; }
  45. virtual int protocol_allocate_local_port() { return 0; }
  46. virtual bool protocol_is_disconnected() const { return false; }
  47. private:
  48. virtual bool is_ipv4() const override { return true; }
  49. bool m_bound { false };
  50. int m_attached_fds { 0 };
  51. IPv4Address m_local_address;
  52. IPv4Address m_peer_address;
  53. DoubleBuffer m_for_client;
  54. DoubleBuffer m_for_server;
  55. struct ReceivedPacket {
  56. IPv4Address peer_address;
  57. word peer_port;
  58. ByteBuffer data;
  59. };
  60. SinglyLinkedList<ReceivedPacket> m_receive_queue;
  61. word m_local_port { 0 };
  62. word m_peer_port { 0 };
  63. dword m_bytes_received { 0 };
  64. bool m_can_read { false };
  65. };
  66. class IPv4SocketHandle : public SocketHandle {
  67. public:
  68. IPv4SocketHandle() {}
  69. IPv4SocketHandle(RefPtr<IPv4Socket>&& socket)
  70. : SocketHandle(move(socket))
  71. {
  72. }
  73. IPv4SocketHandle(IPv4SocketHandle&& other)
  74. : SocketHandle(move(other))
  75. {
  76. }
  77. IPv4SocketHandle(const IPv4SocketHandle&) = delete;
  78. IPv4SocketHandle& operator=(const IPv4SocketHandle&) = delete;
  79. IPv4Socket* operator->() { return &socket(); }
  80. const IPv4Socket* operator->() const { return &socket(); }
  81. IPv4Socket& socket() { return static_cast<IPv4Socket&>(SocketHandle::socket()); }
  82. const IPv4Socket& socket() const { return static_cast<const IPv4Socket&>(SocketHandle::socket()); }
  83. };