Changeset ede63e4 in mainline for uspace/srv/net/tl/tcp/tcp.c


Ignore:
Timestamp:
2010-01-04T23:25:48Z (14 years ago)
Author:
Lukas Mejdrech <lukasmejdrech@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
eac9722
Parents:
1a0fb3f8
Message:
  • socket identifier generation moved to libsocket, + data fragment size fix and enhancement, + [ICMP|TCP|UDP]_HEADER_SIZE definition, + int_map_update() function to alter item key
File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/srv/net/tl/tcp/tcp.c

    r1a0fb3f8 rede63e4  
    205205int     tcp_connect_message( socket_cores_ref local_sockets, int socket_id, struct sockaddr * addr, socklen_t addrlen );
    206206int     tcp_recvfrom_message( socket_cores_ref local_sockets, int socket_id, int flags, size_t * addrlen );
    207 int     tcp_send_message( socket_cores_ref local_sockets, int socket_id, int fragments, size_t data_fragment_size, int flags );
    208 int     tcp_accept_message( socket_cores_ref local_sockets, int socket_id, size_t * addrlen );
     207int     tcp_send_message( socket_cores_ref local_sockets, int socket_id, int fragments, size_t * data_fragment_size, int flags );
     208int     tcp_accept_message( socket_cores_ref local_sockets, int socket_id, int new_socket_id, size_t * data_fragment_size, size_t * addrlen );
    209209int tcp_close_message( socket_cores_ref local_sockets, int socket_id );
    210210
     
    298298                return tcp_release_and_return( packet, EINVAL );
    299299        }
    300         if( length < sizeof( tcp_header_t ) + offset ){
     300        if( length < TCP_HEADER_SIZE + offset ){
    301301                return tcp_release_and_return( packet, NO_DATA );
    302302        }
     
    668668        ERROR_DECLARE;
    669669
     670        packet_dimension_ref    packet_dimension;
     671
    670672        assert( socket );
    671673        assert( socket_data );
     
    676678
    677679        // queue the received packet
    678         if( ERROR_OCCURRED( dyn_fifo_push( & socket->received, packet_get_id( packet ), SOCKET_MAX_RECEIVED_SIZE ))){
     680        if( ERROR_OCCURRED( dyn_fifo_push( & socket->received, packet_get_id( packet ), SOCKET_MAX_RECEIVED_SIZE ))
     681        || ERROR_OCCURRED( tl_get_ip_packet_dimension( tcp_globals.ip_phone, & tcp_globals.dimensions, socket_data->device_id, & packet_dimension ))){
    679682                return tcp_release_and_return( packet, ERROR_CODE );
    680683        }
     
    684687
    685688        // notify the destination socket
    686         async_msg_5( socket->phone, NET_SOCKET_RECEIVED, ( ipcarg_t ) socket->socket_id, 0, 0, 0, ( ipcarg_t ) fragments );
     689        async_msg_5( socket->phone, NET_SOCKET_RECEIVED, ( ipcarg_t ) socket->socket_id, (( packet_dimension->content < socket_data->data_fragment_size ) ? packet_dimension->content : socket_data->data_fragment_size ), 0, 0, ( ipcarg_t ) fragments );
    687690        return EOK;
    688691}
     
    783786//                      printf( "addr %p\n", socket_data->addr, socket_data->addrlen );
    784787                        // create a socket
     788                        socket_id = -1;
    785789                        if( ERROR_OCCURRED( socket_create( socket_data->local_sockets, listening_socket->phone, socket_data, & socket_id ))){
    786790                                free( socket_data->addr );
     
    789793                        }
    790794
     795                        socket_id *= -1;
    791796                        printf("new_sock %d\n", socket_id);
    792797                        socket_data->pseudo_header = listening_socket_data->pseudo_header;
     
    901906                        if( ! ERROR_OCCURRED( dyn_fifo_push( & listening_socket->accepted, socket->socket_id, listening_socket_data->backlog ))){
    902907                                // notify the destination socket
    903                                 async_msg_5( socket->phone, NET_SOCKET_ACCEPTED, ( ipcarg_t ) listening_socket->socket_id, 0, 0, 0, ( ipcarg_t ) socket->socket_id );
     908                                async_msg_5( socket->phone, NET_SOCKET_ACCEPTED, ( ipcarg_t ) listening_socket->socket_id, socket_data->data_fragment_size, TCP_HEADER_SIZE, 0, ( ipcarg_t ) socket->socket_id );
    904909                                fibril_rwlock_write_unlock( socket_data->local_lock );
    905910                                return EOK;
     
    10351040        bzero( socket_data, sizeof( * socket_data ));
    10361041        socket_data->state = TCP_SOCKET_INITIAL;
    1037         socket_data->device_id = -1;
     1042        socket_data->device_id = DEVICE_INVALID_ID;
    10381043        socket_data->window = NET_DEFAULT_TCP_WINDOW;
    10391044        socket_data->treshold = socket_data->window;
     
    10511056        fibril_mutex_initialize( & socket_data->operation.mutex );
    10521057        fibril_condvar_initialize( & socket_data->operation.condvar );
     1058        socket_data->data_fragment_size = MAX_TCP_FRAGMENT_SIZE;
    10531059}
    10541060
     
    10651071        tcp_socket_data_ref             socket_data;
    10661072        socket_core_ref                 socket;
     1073        packet_dimension_ref    packet_dimension;
    10671074
    10681075        /*
     
    10961103                                        socket_data->local_sockets = & local_sockets;
    10971104                                        fibril_rwlock_write_lock( & lock );
     1105                                        * SOCKET_SET_SOCKET_ID( answer ) = SOCKET_GET_SOCKET_ID( call );
    10981106                                        res = socket_create( & local_sockets, app_phone, socket_data, SOCKET_SET_SOCKET_ID( answer ));
    10991107                                        fibril_rwlock_write_unlock( & lock );
    11001108                                        if( res == EOK ){
    1101                                                 * SOCKET_SET_HEADER_SIZE( answer ) = sizeof( tcp_header_t );
    1102                                                 * SOCKET_SET_DATA_FRAGMENT_SIZE( answer ) = MAX_TCP_FRAGMENT_SIZE;
     1109                                                if( tl_get_ip_packet_dimension( tcp_globals.ip_phone, & tcp_globals.dimensions, DEVICE_INVALID_ID, & packet_dimension ) == EOK ){
     1110                                                        * SOCKET_SET_DATA_FRAGMENT_SIZE( answer ) = (( packet_dimension->content < socket_data->data_fragment_size ) ? packet_dimension->content : socket_data->data_fragment_size );
     1111                                                }
     1112//                                              * SOCKET_SET_DATA_FRAGMENT_SIZE( answer ) = MAX_TCP_FRAGMENT_SIZE;
     1113                                                * SOCKET_SET_HEADER_SIZE( answer ) = TCP_HEADER_SIZE;
    11031114                                                answer_count = 3;
    11041115                                        }else{
     
    11381149                                res = data_receive(( void ** ) & addr, & addrlen );
    11391150                                if( res == EOK ){
    1140                                         // the global lock may released in the tcp_connect_message() function
     1151                                        // the global lock may be released in the tcp_connect_message() function
    11411152                                        fibril_rwlock_write_lock( & tcp_globals.lock );
    11421153                                        fibril_rwlock_write_lock( & lock );
     
    11521163                                fibril_rwlock_read_lock( & tcp_globals.lock );
    11531164                                fibril_rwlock_write_lock( & lock );
    1154                                 res = tcp_accept_message( & local_sockets, SOCKET_GET_SOCKET_ID( call ), & addrlen );
     1165                                res = tcp_accept_message( & local_sockets, SOCKET_GET_SOCKET_ID( call ), SOCKET_GET_NEW_SOCKET_ID( call ), SOCKET_SET_DATA_FRAGMENT_SIZE( answer ), & addrlen );
    11551166                                fibril_rwlock_write_unlock( & lock );
    11561167                                fibril_rwlock_read_unlock( & tcp_globals.lock );
     
    11581169                                        * SOCKET_SET_SOCKET_ID( answer ) = res;
    11591170                                        * SOCKET_SET_ADDRESS_LENGTH( answer ) = addrlen;
    1160                                         answer_count = 2;
     1171                                        answer_count = 3;
    11611172                                }
    11621173                                break;
     
    11641175                                fibril_rwlock_read_lock( & tcp_globals.lock );
    11651176                                fibril_rwlock_write_lock( & lock );
    1166                                 res = tcp_send_message( & local_sockets, SOCKET_GET_SOCKET_ID( call ), SOCKET_GET_DATA_FRAGMENTS( call ), SOCKET_GET_DATA_FRAGMENT_SIZE( call ), SOCKET_GET_FLAGS( call ));
     1177                                res = tcp_send_message( & local_sockets, SOCKET_GET_SOCKET_ID( call ), SOCKET_GET_DATA_FRAGMENTS( call ), SOCKET_SET_DATA_FRAGMENT_SIZE( answer ), SOCKET_GET_FLAGS( call ));
    11671178                                if( res != EOK ){
    11681179                                        fibril_rwlock_write_unlock( & lock );
    11691180                                        fibril_rwlock_read_unlock( & tcp_globals.lock );
     1181                                }else{
     1182                                        answer_count = 2;
    11701183                                }
    11711184                                break;
     
    11751188                                        fibril_rwlock_read_lock( & tcp_globals.lock );
    11761189                                        fibril_rwlock_write_lock( & lock );
    1177                                         res = tcp_send_message( & local_sockets, SOCKET_GET_SOCKET_ID( call ), SOCKET_GET_DATA_FRAGMENTS( call ), SOCKET_GET_DATA_FRAGMENT_SIZE( call ), SOCKET_GET_FLAGS( call ));
     1190                                        res = tcp_send_message( & local_sockets, SOCKET_GET_SOCKET_ID( call ), SOCKET_GET_DATA_FRAGMENTS( call ), SOCKET_SET_DATA_FRAGMENT_SIZE( answer ), SOCKET_GET_FLAGS( call ));
    11781191                                        if( res != EOK ){
    11791192                                                fibril_rwlock_write_unlock( & lock );
    11801193                                                fibril_rwlock_read_unlock( & tcp_globals.lock );
     1194                                        }else{
     1195                                                answer_count = 2;
    11811196                                        }
    11821197                                        free( addr );
     
    12041219                                        * SOCKET_SET_READ_DATA_LENGTH( answer ) = res;
    12051220                                        * SOCKET_SET_ADDRESS_LENGTH( answer ) = addrlen;
    1206                                         answer_count = 2;
     1221                                        answer_count = 3;
    12071222                                        res = EOK;
    12081223                                }
     
    17251740}
    17261741
    1727 int tcp_send_message( socket_cores_ref local_sockets, int socket_id, int fragments, size_t data_fragment_size, int flags ){
     1742int tcp_send_message( socket_cores_ref local_sockets, int socket_id, int fragments, size_t * data_fragment_size, int flags ){
    17281743        ERROR_DECLARE;
    17291744
     
    17381753
    17391754        assert( local_sockets );
     1755        assert( data_fragment_size );
    17401756
    17411757        // find the socket
     
    17531769        ERROR_PROPAGATE( tl_get_ip_packet_dimension( tcp_globals.ip_phone, & tcp_globals.dimensions, socket_data->device_id, & packet_dimension ));
    17541770
    1755         // TODO return the device_id + data_fragment_size if different - the client should send it again
    1756         // ( two messages are better than ip fragmentation )
     1771        * data_fragment_size = (( packet_dimension->content < socket_data->data_fragment_size ) ? packet_dimension->content : socket_data->data_fragment_size );
    17571772
    17581773        for( index = 0; index < fragments; ++ index ){
    17591774                // read the data fragment
    1760                 result = tl_socket_read_packet_data( tcp_globals.net_phone, & packet, sizeof( tcp_header_t ), packet_dimension, socket_data->addr, socket_data->addrlen );
     1775                result = tl_socket_read_packet_data( tcp_globals.net_phone, & packet, TCP_HEADER_SIZE, packet_dimension, socket_data->addr, socket_data->addrlen );
    17611776                if( result < 0 ) return result;
    17621777                total_length = ( size_t ) result;
     
    18441859        ERROR_PROPAGATE( tl_get_ip_packet_dimension( tcp_globals.ip_phone, & tcp_globals.dimensions, socket_data->device_id, & packet_dimension ));
    18451860        // get a new packet
    1846         * packet = packet_get_4( tcp_globals.net_phone, sizeof( tcp_header_t ), packet_dimension->addr_len, packet_dimension->prefix, packet_dimension->suffix );
     1861        * packet = packet_get_4( tcp_globals.net_phone, TCP_HEADER_SIZE, packet_dimension->addr_len, packet_dimension->prefix, packet_dimension->suffix );
    18471862        if( ! * packet ) return ENOMEM;
    18481863        // allocate space in the packet
     
    18561871}
    18571872
    1858 int tcp_accept_message( socket_cores_ref local_sockets, int socket_id, size_t * addrlen ){
     1873int tcp_accept_message( socket_cores_ref local_sockets, int socket_id, int new_socket_id, size_t * data_fragment_size, size_t * addrlen ){
    18591874        ERROR_DECLARE;
    18601875
     
    18621877        socket_core_ref         socket;
    18631878        tcp_socket_data_ref     socket_data;
     1879        packet_dimension_ref    packet_dimension;
    18641880
    18651881        assert( local_sockets );
     1882        assert( data_fragment_size );
    18661883        assert( addrlen );
    18671884
     
    18871904                socket_data = ( tcp_socket_data_ref ) accepted->specific_data;
    18881905                assert( socket_data );
     1906                // TODO can it be in another state?
    18891907                if( socket_data->state == TCP_SOCKET_ESTABLISHED ){
    18901908                        ERROR_PROPAGATE( data_reply( socket_data->addr, socket_data->addrlen ));
     1909                        ERROR_PROPAGATE( tl_get_ip_packet_dimension( tcp_globals.ip_phone, & tcp_globals.dimensions, socket_data->device_id, & packet_dimension ));
    18911910                        * addrlen = socket_data->addrlen;
     1911                        * data_fragment_size = (( packet_dimension->content < socket_data->data_fragment_size ) ? packet_dimension->content : socket_data->data_fragment_size );
     1912                        if( new_socket_id > 0 ){
     1913                                ERROR_PROPAGATE( socket_cores_update( local_sockets, accepted->socket_id, new_socket_id ));
     1914                                accepted->socket_id = new_socket_id;
     1915                        }
    18921916                }
    18931917                dyn_fifo_pop( & socket->accepted );
Note: See TracChangeset for help on using the changeset viewer.