1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #ifndef LIBRARIES_NACL_IO_MOUNT_NODE_SOCKET_H_ 6 #define LIBRARIES_NACL_IO_MOUNT_NODE_SOCKET_H_ 7 8 #include "nacl_io/ossocket.h" 9 #ifdef PROVIDES_SOCKET_API 10 11 #include <sys/fcntl.h> 12 #include <ppapi/c/pp_errors.h> 13 #include <ppapi/c/pp_resource.h> 14 #include <ppapi/c/ppb_net_address.h> 15 16 #include "nacl_io/mount.h" 17 #include "nacl_io/mount_node.h" 18 #include "nacl_io/mount_node_stream.h" 19 #include "nacl_io/pepper_interface.h" 20 21 namespace nacl_io { 22 23 /* Only allow single maximum transfers of 64K or less. Socket users 24 * should be looping on Send/Recv size. */ 25 static const size_t MAX_SOCK_TRANSFER = 65536; 26 27 class MountStream; 28 class MountNodeSocket; 29 typedef sdk_util::ScopedRef<MountNodeSocket> ScopedMountNodeSocket; 30 31 class MountNodeSocket : public MountNodeStream { 32 public: 33 explicit MountNodeSocket(Mount* mount); 34 MountNodeSocket(Mount* mount, PP_Resource socket); 35 36 protected: 37 virtual void Destroy(); 38 39 public: 40 // Normal read/write operations on a file (recv/send). 41 virtual Error Read(const HandleAttr& attr, 42 void* buf, 43 size_t count, 44 int* out_bytes); 45 virtual Error Write(const HandleAttr& attr, 46 const void* buf, 47 size_t count, 48 int* out_bytes); 49 50 virtual Error GetSockOpt(int lvl, int optname, void* optval, socklen_t* len); 51 virtual Error SetSockOpt(int lvl, 52 int optname, 53 const void* optval, 54 socklen_t len); 55 56 // Unsupported Functions 57 virtual Error MMap(void* addr, 58 size_t length, 59 int prot, 60 int flags, 61 size_t offset, 62 void** out_addr); 63 64 // Socket Functions. 65 virtual Error Accept(const HandleAttr& attr, 66 PP_Resource* new_sock, 67 struct sockaddr* addr, 68 socklen_t* len); 69 virtual Error Bind(const struct sockaddr* addr, socklen_t len); 70 virtual Error Connect(const HandleAttr& attr, 71 const struct sockaddr* addr, 72 socklen_t len); 73 virtual Error Listen(int backlog); 74 virtual Error Recv(const HandleAttr& attr, 75 void* buf, 76 size_t len, 77 int flags, 78 int* out_len); 79 virtual Error RecvFrom(const HandleAttr& attr, 80 void* buf, 81 size_t len, 82 int flags, 83 struct sockaddr* src_addr, 84 socklen_t* addrlen, 85 int* out_len); 86 virtual Error Send(const HandleAttr& attr, 87 const void* buf, 88 size_t len, 89 int flags, 90 int* out_len); 91 virtual Error SendTo(const HandleAttr& attr, 92 const void* buf, 93 size_t len, 94 int flags, 95 const struct sockaddr* dest_addr, 96 socklen_t addrlen, 97 int* out_len); 98 99 virtual Error Shutdown(int how); 100 101 virtual Error GetPeerName(struct sockaddr* addr, socklen_t* len); 102 virtual Error GetSockName(struct sockaddr* addr, socklen_t* len); 103 104 PP_Resource socket_resource() { return socket_resource_; } 105 PP_Resource remote_addr() { return remote_addr_; } 106 107 // Updates socket's state, recording last error. 108 virtual void SetError_Locked(int pp_error_num); 109 110 protected: 111 bool IsBound() { return local_addr_ != 0; } 112 bool IsConnected() { return remote_addr_ != 0; } 113 114 // Wraps common error checks, timeouts, work pump for send. 115 Error SendHelper(const HandleAttr& attr, 116 const void* buf, 117 size_t len, 118 int flags, 119 PP_Resource addr, 120 int* out_len); 121 122 // Wraps common error checks, timeouts, work pump for recv. 123 Error RecvHelper(const HandleAttr& attr, 124 void* buf, 125 size_t len, 126 int flags, 127 PP_Resource* addr, 128 int* out_len); 129 130 131 // Per socket type send and recv 132 virtual Error Recv_Locked(void* buffer, 133 size_t len, 134 PP_Resource* out_addr, 135 int* out_len) = 0; 136 137 virtual Error Send_Locked(const void* buffer, 138 size_t len, 139 PP_Resource addr, 140 int* out_len) = 0; 141 142 143 NetAddressInterface* NetInterface(); 144 TCPSocketInterface* TCPInterface(); 145 UDPSocketInterface* UDPInterface(); 146 147 PP_Resource SockAddrToResource(const struct sockaddr* addr, socklen_t len); 148 socklen_t ResourceToSockAddr(PP_Resource addr, 149 socklen_t len, 150 struct sockaddr* out_addr); 151 152 bool IsEquivalentAddress(PP_Resource addr1, PP_Resource addr2); 153 154 protected: 155 PP_Resource socket_resource_; 156 PP_Resource local_addr_; 157 PP_Resource remote_addr_; 158 uint32_t socket_flags_; 159 int last_errno_; 160 bool keep_alive_; 161 struct linger linger_; 162 163 friend class KernelProxy; 164 friend class MountStream; 165 }; 166 167 } // namespace nacl_io 168 169 #endif // PROVIDES_SOCKET_API 170 #endif // LIBRARIES_NACL_IO_MOUNT_NODE_SOCKET_H_ 171