Subversion Repositories HelenOS

Rev

Rev 4747 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
4578 mejdrech 1
/*
2
 * Copyright (c) 2009 Lukas Mejdrech
3
 * All rights reserved.
4
 *
5
 * Redistribution and use in source and binary forms, with or without
6
 * modification, are permitted provided that the following conditions
7
 * are met:
8
 *
9
 * - Redistributions of source code must retain the above copyright
10
 *   notice, this list of conditions and the following disclaimer.
11
 * - Redistributions in binary form must reproduce the above copyright
12
 *   notice, this list of conditions and the following disclaimer in the
13
 *   documentation and/or other materials provided with the distribution.
14
 * - The name of the author may not be used to endorse or promote products
15
 *   derived from this software without specific prior written permission.
16
 *
17
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18
 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19
 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20
 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21
 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22
 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26
 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27
 */
28
 
29
/** @addtogroup socket
30
 *  @{
31
 */
32
 
33
/** @file
4756 mejdrech 34
 *  Socket common core.
4578 mejdrech 35
 */
36
 
37
#ifndef __NET_SOCKET_CORE_H__
38
#define __NET_SOCKET_CORE_H__
39
 
40
#include <sys/types.h>
41
 
42
#include "../include/in.h"
43
#include "../include/device.h"
44
 
4738 mejdrech 45
#include "../structures/generic_char_map.h"
4589 mejdrech 46
#include "../structures/dynamic_fifo.h"
4578 mejdrech 47
#include "../structures/int_map.h"
48
#include "../structures/packet/packet.h"
49
 
4756 mejdrech 50
/** Initial size of the received packet queue.
51
 */
4589 mejdrech 52
#define SOCKET_INITIAL_RECEIVED_SIZE    4
4756 mejdrech 53
 
54
/** Maximum size of the received packet queue.
55
 */
4747 mejdrech 56
#define SOCKET_MAX_RECEIVED_SIZE        0
4589 mejdrech 57
 
4756 mejdrech 58
/** Initial size of the sockets for acceptance queue.
59
 */
4589 mejdrech 60
#define SOCKET_INITIAL_ACCEPTED_SIZE    1
4756 mejdrech 61
 
62
/** Maximum size of the sockets for acceptance queue.
63
 */
4747 mejdrech 64
#define SOCKET_MAX_ACCEPTEDED_SIZE      0
4589 mejdrech 65
 
4756 mejdrech 66
/** Listening sockets' port map key.
4738 mejdrech 67
 */
68
#define SOCKET_MAP_KEY_LISTENING    "L"
69
 
4756 mejdrech 70
/** Type definition of the socket core.
71
 *  @see socket_core
72
 */
4578 mejdrech 73
typedef struct socket_core  socket_core_t;
74
 
4756 mejdrech 75
/** Type definition of the socket core pointer.
76
 *  @see socket_core
77
 */
78
typedef socket_core_t * socket_core_ref;
79
 
80
/** Type definition of the socket port.
81
 *  @see socket_port
82
 */
4738 mejdrech 83
typedef struct socket_port  socket_port_t;
84
 
4756 mejdrech 85
/** Type definition of the socket port pointer.
86
 *  @see socket_port
87
 */
88
typedef socket_port_t * socket_port_ref;
89
 
90
/** Socket core.
91
 */
4578 mejdrech 92
struct socket_core{
4756 mejdrech 93
    /** Socket identifier.
94
     */
4578 mejdrech 95
    int             socket_id;
4756 mejdrech 96
    /** Client application phone.
97
     */
4578 mejdrech 98
    int             phone;
4756 mejdrech 99
    /** Bound port.
100
     */
4578 mejdrech 101
    int             port;
4756 mejdrech 102
    /** Received packets queue.
103
     */
4589 mejdrech 104
    dyn_fifo_t      received;
4756 mejdrech 105
    /** Sockets for acceptance queue.
106
     */
4589 mejdrech 107
    dyn_fifo_t      accepted;
4756 mejdrech 108
    /** Protocol specific data.
109
     */
4726 mejdrech 110
    void *          specific_data;
4756 mejdrech 111
    /** Socket ports map key.
112
     */
4738 mejdrech 113
    const char *    key;
4756 mejdrech 114
    /** Length of the Socket ports map key.
115
     */
4738 mejdrech 116
    size_t          key_length;
4578 mejdrech 117
};
118
 
4756 mejdrech 119
/** Sockets map.
120
 *  The key is the socket identifier.
121
 */
4578 mejdrech 122
INT_MAP_DECLARE( socket_cores, socket_core_t );
123
 
4756 mejdrech 124
/** Bount port sockets map.
125
 *  The listening socket has the SOCKET_MAP_KEY_LISTENING key identifier whereas the other use the remote addresses.
126
 */
4738 mejdrech 127
GENERIC_CHAR_MAP_DECLARE( socket_port_map, socket_core_ref );
4578 mejdrech 128
 
4756 mejdrech 129
/** Ports map.
130
 *  The key is the port number.
131
 */
4738 mejdrech 132
INT_MAP_DECLARE( socket_ports, socket_port_t );
133
 
4756 mejdrech 134
/** Destroys local sockets.
135
 *  Releases all buffered packets and calls the release function for each of the sockets.
136
 *  @param[in] packet_phone The packet server phone to release buffered packets.
137
 *  @param[in] local_sockets The local sockets to be destroyed.
138
 *  @param[in,out] global_sockets The global sockets to be updated.
139
 *  @param[in] socket_release The client release callback function.
140
 */
4738 mejdrech 141
void    socket_cores_release( int packet_phone, socket_cores_ref local_sockets, socket_ports_ref global_sockets, void ( * socket_release )( socket_core_ref socket ));
142
 
4756 mejdrech 143
/** Binds the socket to the port.
144
 *  The address port is used if set, a free port is used if not.
145
 *  @param[in] local_sockets The local sockets to be searched.
146
 *  @param[in,out] global_sockets The global sockets to be updated.
147
 *  @param[in] socket_id The new socket identifier.
148
 *  @param[in] addr The address to be bound to.
149
 *  @param[in] addrlen The address length.
150
 *  @param[in] free_ports_start The minimum free port.
151
 *  @param[in] free_ports_end The maximum free port.
152
 *  @param[in] last_used_port The last used free port.
153
 *  @returns EOK on success.
154
 *  @returns ENOTSOCK if the socket was not found.
155
 *  @returns EAFNOSUPPORT if the address family is not supported.
156
 *  @returns EADDRINUSE if the port is already in use.
157
 *  @returns Other error codes as defined for the socket_bind_free_port() function.
158
 *  @returns Other error codes as defined for the socket_bind_insert() function.
159
 */
4700 mejdrech 160
int socket_bind( socket_cores_ref local_sockets, socket_ports_ref global_sockets, int socket_id, void * addr, size_t addrlen, int free_ports_start, int free_ports_end, int last_used_port );
4756 mejdrech 161
 
162
/** Binds the socket to a free port.
163
 *  The first free port is used.
164
 *  @param[in,out] global_sockets The global sockets to be updated.
165
 *  @param[in,out] socket The socket to be bound.
166
 *  @param[in] free_ports_start The minimum free port.
167
 *  @param[in] free_ports_end The maximum free port.
168
 *  @param[in] last_used_port The last used free port.
169
 *  @returns EOK on success.
170
 *  @returns ENOTCONN if no free port was found.
171
 *  @returns Other error codes as defined for the socket_bind_insert() function.
172
 */
4700 mejdrech 173
int socket_bind_free_port( socket_ports_ref global_sockets, socket_core_ref socket, int free_ports_start, int free_ports_end, int last_used_port );
4756 mejdrech 174
 
175
/** Creates a new socket.
176
 *  @param[in,out] local_sockets The local sockets to be updated.
177
 *  @param[in] app_phone The application phone.
178
 *  @param[in] specific_data The socket specific data.
179
 *  @param[out] socket_id The new socket identifier.
180
 *  @returns EOK on success.
181
 *  @returns EBADMEM if the socket_id parameter is NULL.
182
 *  @returns ENOMEM if there is not enough memory left.
183
 */
4726 mejdrech 184
int socket_create( socket_cores_ref local_sockets, int app_phone, void * specific_data, int * socket_id );
4756 mejdrech 185
 
186
/** Destroys the socket.
187
 *  If the socket is bound, the port is released.
188
 *  Releases all buffered packets, calls the release function and removes the socket from the local sockets.
189
 *  @param[in] packet_phone The packet server phone to release buffered packets.
190
 *  @param[in] socket_id The socket identifier.
191
 *  @param[in,out] local_sockets The local sockets to be updated.
192
 *  @param[in,out] global_sockets The global sockets to be updated.
193
 *  @param[in] socket_release The client release callback function.
194
 *  @returns EOK on success.
195
 *  @returns ENOTSOCK if the socket is not found.
196
 */
4738 mejdrech 197
int socket_destroy( int packet_phone, int socket_id, socket_cores_ref local_sockets, socket_ports_ref global_sockets, void ( * socket_release )( socket_core_ref socket ));
4756 mejdrech 198
 
199
/** Replies the packet or the packet queue data to the application via the socket.
200
 *  Uses the current message processing fibril.
201
 *  @param[in] packet The packet to be transfered.
202
 *  @param[out] length The total data length.
203
 *  @returns EOK on success.
204
 *  @returns EBADMEM if the length parameter is NULL.
205
 *  @returns ENOMEM if there is not enough memory left.
206
 *  @returns Other error codes as defined for the data_reply() function.
207
 */
4738 mejdrech 208
int socket_reply_packets( packet_t packet, size_t * length );
4756 mejdrech 209
 
210
/** Finds the bound port socket.
211
 *  @param[in] global_sockets The global sockets to be searched.
212
 *  @param[in] port The port number.
213
 *  @param[in] key The socket key identifier.
214
 *  @param[in] key_length The socket key length.
215
 *  @returns The found socket.
216
 *  @returns NULL if no socket was found.
217
 */
4738 mejdrech 218
socket_core_ref socket_port_find( socket_ports_ref global_sockets, int port, const char * key, size_t key_length );
4756 mejdrech 219
 
220
/** Releases the socket port.
221
 *  If the socket is bound the port entry is released.
222
 *  If there are no more port entries the port is release.
223
 *  @param[in] global_sockets The global sockets to be updated.
224
 *  @param[in] socket The socket to be unbound.
225
 */
4738 mejdrech 226
void    socket_port_release( socket_ports_ref global_sockets, socket_core_ref socket );
4756 mejdrech 227
 
228
/** Adds the socket to an already bound port.
229
 *  @param[in] global_sockets The global sockets to be updated.
230
 *  @param[in] port The port number to be bound to.
231
 *  @param[in] socket The socket to be added.
232
 *  @param[in] key The socket key identifier.
233
 *  @param[in] key_length The socket key length.
234
 *  @returns EOK on success.
235
 *  @returns ENOENT if the port is not already used.
236
 *  @returns Other error codes as defined for the socket_port_add_core() function.
237
 */
4738 mejdrech 238
int socket_port_add( socket_ports_ref global_sockets, int port, socket_core_ref socket, const char * key, size_t key_length );
4578 mejdrech 239
 
240
#endif
241
 
242
/** @}
243
 */