1 /** @file
2   Definitions for the socket library.
3 
4   Copyright (c) 2011, Intel Corporation
5   All rights reserved. This program and the accompanying materials
6   are licensed and made available under the terms and conditions of the BSD License
7   which accompanies this distribution.  The full text of the license may be found at
8   http://opensource.org/licenses/bsd-license.php
9 
10   THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
11   WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
12 
13 **/
14 
15 #ifndef _SOCKET_INTERNALS_H_
16 #define _SOCKET_INTERNALS_H_
17 
18 #include <Uefi.h>
19 
20 //----------------------------------------------------------------------
21 //
22 //  The following private files are required to support file descriptors
23 //
24 
25 #include <kfile.h>
26 #include <MainData.h>
27 
28 #include <Efi/SysEfi.h>
29 
30 //
31 //  End of private files
32 //
33 //----------------------------------------------------------------------
34 
35 #include <Library/DebugLib.h>
36 #include <Library/UefiBootServicesTableLib.h>
37 #include <Library/UefiLib.h>
38 
39 #include <Protocol/EfiSocket.h>
40 #include <Protocol/ServiceBinding.h>
41 
42 #include <sys/errno.h>
43 #include <sys/poll.h>
44 #include <sys/EfiSysCall.h>
45 #include <sys/socket.h>
46 
47 //------------------------------------------------------------------------------
48 //  Support Routines
49 //------------------------------------------------------------------------------
50 
51 /**
52   Translate from the socket file descriptor to the socket protocol.
53 
54   @param [in] s             Socket file descriptor returned from ::socket.
55 
56   @param [in] ppDescriptor  Address to receive the descriptor structure
57                             address for the file
58   @param [in] pErrno        Address of the errno variable
59 
60   @return   A pointer to the EFI_SOCKET_PROTOCOL structure or NULL if
61             an invalid file descriptor was passed in.
62 
63  **/
64 EFI_SOCKET_PROTOCOL *
65 BslFdToSocketProtocol (
66   int s,
67   struct __filedes ** ppDescriptor,
68   int * pErrno
69   );
70 
71 /**
72   Close the socket
73 
74   The BslSocketClose routine is called indirectly from the close file
75   system routine.  This routine closes the socket and returns the
76   status to the caller.
77 
78   @param[in] pDescriptor Descriptor address for the file
79 
80   @return   This routine returns 0 upon success and -1 upon failure.
81             In the case of failure, ::errno contains more information.
82 
83 **/
84 int
85 EFIAPI
86 BslSocketClose (
87   struct __filedes * pDescriptor
88   );
89 
90 /**
91   Worker routine to close the socket.
92 
93   @param[in] pSocketProtocol   Socket protocol structure address
94 
95   @param[in] pErrno            Address of the ::errno variable
96 
97   @retval EFI_SUCCESS   Successfully closed the socket
98 
99 **/
100 EFI_STATUS
101 BslSocketCloseWork (
102   IN EFI_SOCKET_PROTOCOL * pSocketProtocol,
103   IN int * pErrno
104   );
105 
106 /**
107   Poll the socket for activity
108 
109   @param [in] pDescriptor Descriptor address for the file
110 
111   @param [in] Events      Mask of events to detect
112 
113   @return     Detected events for the socket
114 
115  **/
116 short
117 EFIAPI
118 BslSocketPoll (
119   IN struct __filedes * pDescriptor,
120   IN short Events
121   );
122 
123 /**
124   Build a file descriptor for a socket.
125 
126   @param [in] pSocketProtocol   Socket protocol structure address
127 
128   @param [in] pErrno            Address of the errno variable
129 
130   @return  The file descriptor for the socket or -1 if an error occurs.
131 
132  **/
133 int
134 BslSocketProtocolToFd (
135   IN EFI_SOCKET_PROTOCOL * pSocketProtocol,
136   IN int * pErrno
137   );
138 
139 /**
140   Read support routine for sockets
141 
142   The BslSocketRead routine is called indirectly by the read file
143   system routine.  This routine is typically used for SOCK_STREAM
144   because it waits for receive data from the target system specified
145   in the ::connect call.
146 
147   @param [in] pDescriptor   Descriptor address for the file
148   @param [in] pOffset       File offset
149   @param [in] LengthInBytes Number of bytes to read
150   @param [in] pBuffer       Address of the buffer to receive the data
151 
152   @return   The number of bytes read or -1 if an error occurs.
153             In the case of an error, ::errno contains more details.
154 
155 **/
156 ssize_t
157 EFIAPI
158 BslSocketRead (
159   struct __filedes *pDescriptor,
160   off_t * pOffset,
161   size_t LengthInBytes,
162   void * pBuffer
163   );
164 
165 /**
166   Write support routine for sockets
167 
168   @param [in] pDescriptor   Descriptor address for the file
169   @param [in] pOffset       File offset
170   @param [in] LengthInBytes Number of bytes to write
171   @param [in] pBuffer       Address of the data
172 
173   @return   The number of bytes written or -1 if an error occurs.
174             In the case of an error, ::errno contains more details.
175 
176 **/
177 ssize_t
178 EFIAPI
179 BslSocketWrite (
180   struct __filedes *pDescriptor,
181   off_t * pOffset,
182   size_t LengthInBytes,
183   const void * pBuffer
184   );
185 
186 /**
187   Validate the socket's file descriptor
188 
189   @param [in] pDescriptor Descriptor for the file
190 
191   @param [in] pErrno      Address of the errno variable
192 
193   @return   A pointer to the EFI_SOCKET_PROTOCOL structure or NULL if
194             an invalid file descriptor was passed in.
195 
196  **/
197 EFI_SOCKET_PROTOCOL *
198 BslValidateSocketFd (
199   struct __filedes * pDescriptor,
200   int * pErrno
201   );
202 
203 //------------------------------------------------------------------------------
204 
205 #endif  //  _SOCKET_INTERNALS_H_
206