Subversion Repositories HelenOS

Rev

Rev 4578 | Rev 4589 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 4578 Rev 4582
Line 36... Line 36...
36
 *  This is a part of the network application library.
36
 *  This is a part of the network application library.
37
 */
37
 */
38
 
38
 
39
#include <assert.h>
39
#include <assert.h>
40
#include <async.h>
40
#include <async.h>
41
//#include <fibril_sync.h>
41
#include <fibril_sync.h>
42
 
42
 
43
#include <ipc/services.h>
43
#include <ipc/services.h>
44
 
44
 
45
#include "../err.h"
45
#include "../err.h"
46
#include "../modules.h"
46
#include "../modules.h"
Line 60... Line 60...
60
    int                 socket_id;
60
    int                 socket_id;
61
    int                 phone;
61
    int                 phone;
62
    services_t          service;
62
    services_t          service;
63
    int                 max_content;
63
    int                 max_content;
64
    int                 received;
64
    int                 received;
65
//  fibril_mutex_t      receive_lock;
65
    fibril_mutex_t      receive_lock;
66
//  fibril_condvar_t    receive_signal;
66
    fibril_condvar_t    receive_signal;
67
    int                 accepted;
67
    int                 accepted;
68
//  fibril_mutex_t      accept_lock;
68
    fibril_mutex_t      accept_lock;
69
//  fibril_condvar_t    accept_signal;
69
    fibril_condvar_t    accept_signal;
70
};
70
};
71
 
71
 
72
INT_MAP_DECLARE( sockets, socket_t );
72
INT_MAP_DECLARE( sockets, socket_t );
73
 
73
 
74
static struct{
74
static struct{
Line 116... Line 116...
116
    socket->socket_id = socket_id;
116
    socket->socket_id = socket_id;
117
    socket->phone = phone;
117
    socket->phone = phone;
118
    socket->service = service;
118
    socket->service = service;
119
    socket->received = 0;
119
    socket->received = 0;
120
    socket->accepted = 0;
120
    socket->accepted = 0;
121
//  fibril_mutex_initialize( & socket->receive_lock );
121
    fibril_mutex_initialize( & socket->receive_lock );
122
//  fibril_condvar_initialize( & socket->receive_signal );
122
    fibril_condvar_initialize( & socket->receive_signal );
123
//  fibril_mutex_initialize( & socket->accept_lock );
123
    fibril_mutex_initialize( & socket->accept_lock );
124
//  fibril_condvar_initialize( & socket->accept_signal );
124
    fibril_condvar_initialize( & socket->accept_signal );
125
}
125
}
126
 
126
 
127
void socket_connection( ipc_callid_t iid, ipc_call_t * icall ){
127
void socket_connection( ipc_callid_t iid, ipc_call_t * icall ){
128
    ERROR_DECLARE;
128
    ERROR_DECLARE;
129
 
129
 
Line 140... Line 140...
140
                socket = sockets_find( socket_get_sockets(), SOCKET_GET_SOCKET_ID( & call ));
140
                socket = sockets_find( socket_get_sockets(), SOCKET_GET_SOCKET_ID( & call ));
141
                if( ! socket ){
141
                if( ! socket ){
142
                    ERROR_CODE = ENOTSOCK;
142
                    ERROR_CODE = ENOTSOCK;
143
                    break;
143
                    break;
144
                }
144
                }
145
//              fibril_mutex_lock( & socket->receive_lock );
145
                fibril_mutex_lock( & socket->receive_lock );
146
                ++ socket->received;
146
                ++ socket->received;
147
//              fibril_condvar_signal( & socket->receive_signal );
147
                fibril_condvar_signal( & socket->receive_signal );
148
//              fibril_mutex_unlock( & socket->receive_lock );
148
                fibril_mutex_unlock( & socket->receive_lock );
149
                ERROR_CODE = EOK;
149
                ERROR_CODE = EOK;
150
                break;
150
                break;
151
            case NET_SOCKET_ACCEPTED:
151
            case NET_SOCKET_ACCEPTED:
152
                socket = sockets_find( socket_get_sockets(), SOCKET_GET_SOCKET_ID( & call ));
152
                socket = sockets_find( socket_get_sockets(), SOCKET_GET_SOCKET_ID( & call ));
153
                if( ! socket ){
153
                if( ! socket ){
154
                    ERROR_CODE = ENOTSOCK;
154
                    ERROR_CODE = ENOTSOCK;
155
                    break;
155
                    break;
156
                }
156
                }
157
//              fibril_mutex_lock( & socket->accept_lock );
157
                fibril_mutex_lock( & socket->accept_lock );
158
                new_socket = ( socket_ref ) malloc( sizeof( socket_t ));
158
                new_socket = ( socket_ref ) malloc( sizeof( socket_t ));
159
                if( ! new_socket ){
159
                if( ! new_socket ){
160
                    ERROR_CODE = ENOMEM;
160
                    ERROR_CODE = ENOMEM;
161
                    break;
161
                    break;
162
                }
162
                }
163
                socket_initialize( new_socket, SOCKET_GET_NEW_SOCKET_ID( & call ), socket->phone, socket->service );
163
                socket_initialize( new_socket, SOCKET_GET_NEW_SOCKET_ID( & call ), socket->phone, socket->service );
164
                if( ERROR_OCCURRED( sockets_add( socket_get_sockets(), new_socket->socket_id, new_socket ))){
164
                if( ERROR_OCCURRED( sockets_add( socket_get_sockets(), new_socket->socket_id, new_socket ))){
165
                    break;
165
                    break;
166
                }
166
                }
167
                ++ socket->accepted;
167
                ++ socket->accepted;
168
//              fibril_condvar_signal( & socket->accept_signal );
168
                fibril_condvar_signal( & socket->accept_signal );
169
//              fibril_mutex_unlock( & socket->accept_lock );
169
                fibril_mutex_unlock( & socket->accept_lock );
170
                break;
170
                break;
171
/*          case NET_SOCKET_MTU:
171
/*          case NET_SOCKET_MTU:
172
                socket = sockets_find( socket_get_sockets(), SOCKET_GET_SOCKET_ID( & call ));
172
                socket = sockets_find( socket_get_sockets(), SOCKET_GET_SOCKET_ID( & call ));
173
                if( ! socket ){
173
                if( ! socket ){
174
                    ERROR_CODE = ENOTSOCK;
174
                    ERROR_CODE = ENOTSOCK;
Line 275... Line 275...
275
 
275
 
276
    if( ! cliaddr ) return EBADMEM;
276
    if( ! cliaddr ) return EBADMEM;
277
    if( ! addrlen ) return NO_DATA;
277
    if( ! addrlen ) return NO_DATA;
278
    socket = sockets_find( socket_get_sockets(), socket_id );
278
    socket = sockets_find( socket_get_sockets(), socket_id );
279
    if( ! socket ) return ENOTSOCK;
279
    if( ! socket ) return ENOTSOCK;
280
//  fibril_mutex_lock( & socket->accept_lock );
280
    fibril_mutex_lock( & socket->accept_lock );
281
    while( socket->accepted <= 0 ){
281
    while( socket->accepted <= 0 ){
282
//      fibril_condvar_wait( & socket->accept_signal, & socket->accept_lock );
282
        fibril_condvar_wait( & socket->accept_signal, & socket->accept_lock );
283
    }
283
    }
284
    message_id = async_send_3( socket->phone, NET_SOCKET_ACCEPT, socket->socket_id, 0, socket->service, NULL );
284
    message_id = async_send_3( socket->phone, NET_SOCKET_ACCEPT, socket->socket_id, 0, socket->service, NULL );
285
    ipc_data_read_start( socket->phone, cliaddr, * addrlen );
285
    ipc_data_read_start( socket->phone, cliaddr, * addrlen );
286
    async_wait_for( message_id, & result );
286
    async_wait_for( message_id, & result );
287
    if( result > 0 ){
287
    if( result > 0 ){
288
        -- socket->accepted;
288
        -- socket->accepted;
289
    }
289
    }
290
//  fibril_mutex_unlock( & socket->accept_lock );
290
    fibril_mutex_unlock( & socket->accept_lock );
291
    return ( int ) result;
291
    return ( int ) result;
292
}
292
}
293
 
293
 
294
int connect( int socket_id, const struct sockaddr * serv_addr, socklen_t addrlen ){
294
int connect( int socket_id, const struct sockaddr * serv_addr, socklen_t addrlen ){
295
    return socket_send_data( socket_id, NET_SOCKET_CONNECT, 0, serv_addr, addrlen );
295
    return socket_send_data( socket_id, NET_SOCKET_CONNECT, 0, serv_addr, addrlen );
Line 333... Line 333...
333
 
333
 
334
    if( ! data ) return EBADMEM;
334
    if( ! data ) return EBADMEM;
335
    if( ! datalength ) return NO_DATA;
335
    if( ! datalength ) return NO_DATA;
336
    socket = sockets_find( socket_get_sockets(), socket_id );
336
    socket = sockets_find( socket_get_sockets(), socket_id );
337
    if( ! socket ) return ENOTSOCK;
337
    if( ! socket ) return ENOTSOCK;
338
//  fibril_mutex_lock( & socket->receive_lock );
338
    fibril_mutex_lock( & socket->receive_lock );
339
    while( socket->received <= 0 ){
339
    while( socket->received <= 0 ){
340
//      fibril_condvar_wait( & socket->receive_signal, & socket->receive_lock );
340
        fibril_condvar_wait( & socket->receive_signal, & socket->receive_lock );
341
    }
341
    }
342
    message_id = async_send_3( socket->phone, NET_SOCKET_RECV, socket->socket_id, flags, socket->service, NULL );
342
    message_id = async_send_3( socket->phone, NET_SOCKET_RECV, socket->socket_id, flags, socket->service, NULL );
343
    ipc_data_read_start( socket->phone, data, datalength );
343
    ipc_data_read_start( socket->phone, data, datalength );
344
    async_wait_for( message_id, & result );
344
    async_wait_for( message_id, & result );
345
    if( result > 0 ){
345
    if( result > 0 ){
346
        -- socket->received;
346
        -- socket->received;
347
    }
347
    }
348
//  fibril_mutex_unlock( & socket->receive_lock );
348
    fibril_mutex_unlock( & socket->receive_lock );
349
    return ( int ) result;
349
    return ( int ) result;
350
}
350
}
351
 
351
 
352
int recvfrom( int socket_id, void * data, size_t datalength, int flags, struct sockaddr * fromaddr, socklen_t * addrlen ){
352
int recvfrom( int socket_id, void * data, size_t datalength, int flags, struct sockaddr * fromaddr, socklen_t * addrlen ){
353
    socket_ref      socket;
353
    socket_ref      socket;
Line 358... Line 358...
358
    if( ! addrlen ) return NO_DATA;
358
    if( ! addrlen ) return NO_DATA;
359
    if( ! data ) return EBADMEM;
359
    if( ! data ) return EBADMEM;
360
    if( ! datalength ) return NO_DATA;
360
    if( ! datalength ) return NO_DATA;
361
    socket = sockets_find( socket_get_sockets(), socket_id );
361
    socket = sockets_find( socket_get_sockets(), socket_id );
362
    if( ! socket ) return ENOTSOCK;
362
    if( ! socket ) return ENOTSOCK;
363
//  fibril_mutex_lock( & socket->receive_lock );
363
    fibril_mutex_lock( & socket->receive_lock );
364
    while( socket->received <= 0 ){
364
    while( socket->received <= 0 ){
365
//      fibril_condvar_wait( & socket->receive_signal, & socket->receive_lock );
365
        fibril_condvar_wait( & socket->receive_signal, & socket->receive_lock );
366
    }
366
    }
367
    message_id = async_send_3( socket->phone, NET_SOCKET_RECVFROM, socket->socket_id, flags, socket->service, NULL );
367
    message_id = async_send_3( socket->phone, NET_SOCKET_RECVFROM, socket->socket_id, flags, socket->service, NULL );
368
    if( ipc_data_read_start( socket->phone, fromaddr, * addrlen ) == EOK ){
368
    if( ipc_data_read_start( socket->phone, fromaddr, * addrlen ) == EOK ){
369
        ipc_data_read_start( socket->phone, data, datalength );
369
        ipc_data_read_start( socket->phone, data, datalength );
370
    }
370
    }
371
    async_wait_for( message_id, & result );
371
    async_wait_for( message_id, & result );
372
    if( result > 0 ){
372
    if( result > 0 ){
373
        -- socket->received;
373
        -- socket->received;
374
    }
374
    }
375
//  fibril_mutex_unlock( & socket->receive_lock );
375
    fibril_mutex_unlock( & socket->receive_lock );
376
    return ( int ) result;
376
    return ( int ) result;
377
}
377
}
378
 
378
 
379
int getsockopt( int socket_id, int level, int optname, void * value, size_t * optlen ){
379
int getsockopt( int socket_id, int level, int optname, void * value, size_t * optlen ){
380
    socket_ref      socket;
380
    socket_ref      socket;