• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 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_SOCKET_SOCKET_NODE_H_
6 #define LIBRARIES_NACL_IO_SOCKET_SOCKET_NODE_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/filesystem.h"
17 #include "nacl_io/node.h"
18 #include "nacl_io/pepper_interface.h"
19 #include "nacl_io/stream/stream_node.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 StreamFs;
28 class SocketNode;
29 typedef sdk_util::ScopedRef<SocketNode> ScopedSocketNode;
30 
31 class SocketNode : public StreamNode {
32  public:
33   explicit SocketNode(Filesystem* filesystem);
34   SocketNode(Filesystem* filesystem, 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 
socket_resource()104   PP_Resource socket_resource() { return socket_resource_; }
remote_addr()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:
IsBound()111   bool IsBound() { return local_addr_ != 0; }
IsConnected()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   // Per socket type send and recv
131   virtual Error Recv_Locked(void* buffer,
132                             size_t len,
133                             PP_Resource* out_addr,
134                             int* out_len) = 0;
135 
136   virtual Error Send_Locked(const void* buffer,
137                             size_t len,
138                             PP_Resource addr,
139                             int* out_len) = 0;
140 
141   NetAddressInterface* NetInterface();
142   TCPSocketInterface* TCPInterface();
143   UDPSocketInterface* UDPInterface();
144 
145   PP_Resource SockAddrToResource(const struct sockaddr* addr, socklen_t len);
146   socklen_t ResourceToSockAddr(PP_Resource addr,
147                                socklen_t len,
148                                struct sockaddr* out_addr);
149 
150   bool IsEquivalentAddress(PP_Resource addr1, PP_Resource addr2);
151 
152  protected:
153   PP_Resource socket_resource_;
154   PP_Resource local_addr_;
155   PP_Resource remote_addr_;
156   uint32_t socket_flags_;
157   int last_errno_;
158   bool keep_alive_;
159   struct linger linger_;
160 
161   friend class KernelProxy;
162   friend class StreamFs;
163 };
164 
165 }  // namespace nacl_io
166 
167 #endif  // PROVIDES_SOCKET_API
168 #endif  // LIBRARIES_NACL_IO_SOCKET_SOCKET_NODE_H_
169