Subversion Repositories HelenOS

Rev

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

Rev 4742 Rev 4750
Line 170... Line 170...
170
 *  @param result The result to be returned. Input parameter.
170
 *  @param result The result to be returned. Input parameter.
171
 *  @return The result parameter.
171
 *  @return The result parameter.
172
 */
172
 */
173
int tcp_release_and_return( packet_t packet, int result );
173
int tcp_release_and_return( packet_t packet, int result );
174
 
174
 
175
int tcp_get_packet_dimension( device_id_t device_id, packet_dimension_ref * packet_dimension );
-
 
176
void    tcp_prepare_operation_header( socket_core_ref socket, tcp_socket_data_ref socket_data, tcp_header_ref header, int synchronize, int finalize );
175
void    tcp_prepare_operation_header( socket_core_ref socket, tcp_socket_data_ref socket_data, tcp_header_ref header, int synchronize, int finalize );
177
int tcp_prepare_timeout( int ( * timeout_function )( void * tcp_timeout_t ), socket_core_ref socket, tcp_socket_data_ref socket_data, size_t sequence_number, tcp_socket_state_t state, suseconds_t timeout, int globals_read_only );
176
int tcp_prepare_timeout( int ( * timeout_function )( void * tcp_timeout_t ), socket_core_ref socket, tcp_socket_data_ref socket_data, size_t sequence_number, tcp_socket_state_t state, suseconds_t timeout, int globals_read_only );
178
void    tcp_free_socket_data( socket_core_ref socket );
177
void    tcp_free_socket_data( socket_core_ref socket );
179
int tcp_timeout( void * data );
178
int tcp_timeout( void * data );
180
int tcp_release_after_timeout( void * data );
179
int tcp_release_after_timeout( void * data );
Line 204... Line 203...
204
int tcp_recvfrom_message( socket_cores_ref local_sockets, int socket_id, int flags, size_t * addrlen );
203
int tcp_recvfrom_message( socket_cores_ref local_sockets, int socket_id, int flags, size_t * addrlen );
205
int tcp_send_message( socket_cores_ref local_sockets, int socket_id, int fragments, size_t data_fragment_size, int flags );
204
int tcp_send_message( socket_cores_ref local_sockets, int socket_id, int fragments, size_t data_fragment_size, int flags );
206
int tcp_accept_message( socket_cores_ref local_sockets, int socket_id, size_t * addrlen );
205
int tcp_accept_message( socket_cores_ref local_sockets, int socket_id, size_t * addrlen );
207
int tcp_close_message( socket_cores_ref local_sockets, int socket_id );
206
int tcp_close_message( socket_cores_ref local_sockets, int socket_id );
208
 
207
 
209
DEVICE_MAP_IMPLEMENT( packet_dimensions, packet_dimension_t );
-
 
210
 
-
 
211
/** TCP global data.
208
/** TCP global data.
212
 */
209
 */
213
tcp_globals_t   tcp_globals;
210
tcp_globals_t   tcp_globals;
214
 
211
 
215
/** Initializes the module.
212
/** Initializes the module.
Line 1630... Line 1627...
1630
        ip_send_msg( tcp_globals.ip_phone, device_id, packet, SERVICE_TCP, 0 );
1627
        ip_send_msg( tcp_globals.ip_phone, device_id, packet, SERVICE_TCP, 0 );
1631
        packet = next;
1628
        packet = next;
1632
    }
1629
    }
1633
}
1630
}
1634
 
1631
 
1635
int tcp_get_packet_dimension( device_id_t device_id, packet_dimension_ref * packet_dimension ){
-
 
1636
    ERROR_DECLARE;
-
 
1637
 
-
 
1638
    assert( packet_dimension );
-
 
1639
 
-
 
1640
    * packet_dimension = packet_dimensions_find( & tcp_globals.dimensions, device_id );
-
 
1641
    if( ! * packet_dimension ){
-
 
1642
        // ask for and remember them if not found
-
 
1643
        * packet_dimension = malloc( sizeof( ** packet_dimension ));
-
 
1644
        if( ! * packet_dimension ) return ENOMEM;
-
 
1645
        if( ERROR_OCCURRED( ip_packet_size_req( tcp_globals.ip_phone, device_id, & ( ** packet_dimension ).addr_len, & ( ** packet_dimension ).prefix, & ( ** packet_dimension ).content, & ( ** packet_dimension ).suffix ))){
-
 
1646
            free( * packet_dimension );
-
 
1647
            return ERROR_CODE;
-
 
1648
        }
-
 
1649
        ERROR_CODE = packet_dimensions_add( & tcp_globals.dimensions, device_id, * packet_dimension );
-
 
1650
        if( ERROR_CODE < 0 ){
-
 
1651
            free( * packet_dimension );
-
 
1652
            return ERROR_CODE;
-
 
1653
        }
-
 
1654
    }
-
 
1655
    return EOK;
-
 
1656
}
-
 
1657
 
-
 
1658
void tcp_prepare_operation_header( socket_core_ref socket, tcp_socket_data_ref socket_data, tcp_header_ref header, int synchronize, int finalize ){
1632
void tcp_prepare_operation_header( socket_core_ref socket, tcp_socket_data_ref socket_data, tcp_header_ref header, int synchronize, int finalize ){
1659
    assert( socket );
1633
    assert( socket );
1660
    assert( socket_data );
1634
    assert( socket_data );
1661
    assert( socket->specific_data == socket_data );
1635
    assert( socket->specific_data == socket_data );
1662
    assert( header );
1636
    assert( header );
Line 1776... Line 1750...
1776
    // check state
1750
    // check state
1777
    if(( socket_data->state != TCP_SOCKET_ESTABLISHED ) && ( socket_data->state != TCP_SOCKET_CLOSE_WAIT )){
1751
    if(( socket_data->state != TCP_SOCKET_ESTABLISHED ) && ( socket_data->state != TCP_SOCKET_CLOSE_WAIT )){
1778
        return ENOTCONN;
1752
        return ENOTCONN;
1779
    }
1753
    }
1780
 
1754
 
1781
    ERROR_PROPAGATE( tcp_get_packet_dimension( socket_data->device_id, & packet_dimension ));
1755
    ERROR_PROPAGATE( tl_get_ip_packet_dimension( tcp_globals.ip_phone, & tcp_globals.dimensions, socket_data->device_id, & packet_dimension ));
1782
 
1756
 
1783
    // TODO return the device_id + data_fragment_size if different - the client should send it again
1757
    // TODO return the device_id + data_fragment_size if different - the client should send it again
1784
    // ( two messages are better than ip fragmentation )
1758
    // ( two messages are better than ip fragmentation )
1785
 
1759
 
1786
    for( index = 0; index < fragments; ++ index ){
1760
    for( index = 0; index < fragments; ++ index ){
Line 1867... Line 1841...
1867
    tcp_header_ref          header;
1841
    tcp_header_ref          header;
1868
 
1842
 
1869
    assert( packet );
1843
    assert( packet );
1870
 
1844
 
1871
    // get the device packet dimension
1845
    // get the device packet dimension
1872
    ERROR_PROPAGATE( tcp_get_packet_dimension( socket_data->device_id, & packet_dimension ));
1846
    ERROR_PROPAGATE( tl_get_ip_packet_dimension( tcp_globals.ip_phone, & tcp_globals.dimensions, socket_data->device_id, & packet_dimension ));
1873
    // get a new packet
1847
    // get a new packet
1874
    * packet = packet_get_4( tcp_globals.net_phone, sizeof( tcp_header_t ), packet_dimension->addr_len, packet_dimension->prefix, packet_dimension->suffix );
1848
    * packet = packet_get_4( tcp_globals.net_phone, sizeof( tcp_header_t ), packet_dimension->addr_len, packet_dimension->prefix, packet_dimension->suffix );
1875
    if( ! * packet ) return ENOMEM;
1849
    if( ! * packet ) return ENOMEM;
1876
    // allocate space in the packet
1850
    // allocate space in the packet
1877
    header = PACKET_SUFFIX( * packet, tcp_header_t );
1851
    header = PACKET_SUFFIX( * packet, tcp_header_t );