Ignore:
File:
1 edited

Legend:

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

    r472020fc r28a3e74  
    2828
    2929/** @addtogroup tcp
    30  *  @{
     30 * @{
    3131 */
    3232
    3333/** @file
    34  *  TCP module implementation.
    35  *  @see tcp.h
     34 * TCP module implementation.
     35 * @see tcp.h
    3636 */
    3737
     
    4040#include <fibril_synch.h>
    4141#include <malloc.h>
    42 //TODO remove stdio
     42/* TODO remove stdio */
    4343#include <stdio.h>
    4444#include <errno.h>
    45 #include <err.h>
    46 
    47 #include <ipc/ipc.h>
     45
    4846#include <ipc/services.h>
    4947#include <ipc/net.h>
     
    6563#include <ip_interface.h>
    6664#include <icmp_client.h>
    67 #include <icmp_interface.h>
     65#include <icmp_remote.h>
    6866#include <net_interface.h>
    6967#include <socket_core.h>
    7068#include <tl_common.h>
    71 #include <tl_local.h>
    72 #include <tl_interface.h>
     69#include <tl_remote.h>
     70#include <tl_skel.h>
    7371
    7472#include "tcp.h"
    7573#include "tcp_header.h"
    76 #include "tcp_module.h"
    7774
    7875/** TCP module name. */
    79 #define NAME    "TCP protocol"
     76#define NAME  "tcp"
    8077
    8178/** The TCP window default value. */
     
    110107
    111108/** Returns a value indicating whether the value is in the interval respecting
    112  *  the possible overflow.
     109 * the possible overflow.
    113110 *
    114  *  The high end and/or the value may overflow, be lower than the low value.
    115  *  @param[in] lower The last value before the interval.
    116  *  @param[in] value The value to be checked.
    117  *  @param[in] higher_equal The last value in the interval.
     111 * The high end and/or the value may overflow, be lower than the low value.
     112 *
     113 * @param[in] lower     The last value before the interval.
     114 * @param[in] value     The value to be checked.
     115 * @param[in] higher_equal The last value in the interval.
    118116 */
    119117#define IS_IN_INTERVAL_OVERFLOW(lower, value, higher_equal) \
     
    126124 */
    127125typedef struct tcp_timeout tcp_timeout_t;
    128 
    129 /** Type definition of the TCP timeout pointer.
    130  *  @see tcp_timeout
    131  */
    132 typedef tcp_timeout_t *tcp_timeout_ref;
    133126
    134127/** TCP reply timeout data.
     
    144137
    145138        /** Local sockets. */
    146         socket_cores_ref local_sockets;
     139        socket_cores_t *local_sockets;
    147140
    148141        /** Socket identifier. */
     
    159152
    160153        /** Port map key. */
    161         char *key;
     154        uint8_t *key;
    162155
    163156        /** Port map key length. */
     
    165158};
    166159
    167 /** Releases the packet and returns the result.
    168  *  @param[in] packet The packet queue to be released.
    169  *  @param[in] result The result to be returned.
    170  *  @return The result parameter.
    171  */
    172 int tcp_release_and_return(packet_t packet, int result);
    173 
    174 void tcp_prepare_operation_header(socket_core_ref socket,
    175     tcp_socket_data_ref socket_data, tcp_header_ref header, int synchronize,
    176     int finalize);
    177 int tcp_prepare_timeout(int (*timeout_function)(void *tcp_timeout_t),
    178     socket_core_ref socket, tcp_socket_data_ref socket_data,
    179     size_t sequence_number, tcp_socket_state_t state, suseconds_t timeout,
    180     int globals_read_only);
    181 void tcp_free_socket_data(socket_core_ref socket);
    182 
    183 int tcp_timeout(void *data);
    184 
    185 int tcp_release_after_timeout(void *data);
    186 
    187 int tcp_process_packet(device_id_t device_id, packet_t packet,
    188     services_t error);
    189 int tcp_connect_core(socket_core_ref socket, socket_cores_ref local_sockets,
    190     struct sockaddr *addr, socklen_t addrlen);
    191 int tcp_queue_prepare_packet(socket_core_ref socket,
    192     tcp_socket_data_ref socket_data, packet_t packet, size_t data_length);
    193 int tcp_queue_packet(socket_core_ref socket, tcp_socket_data_ref socket_data,
    194     packet_t packet, size_t data_length);
    195 packet_t tcp_get_packets_to_send(socket_core_ref socket,
    196     tcp_socket_data_ref socket_data);
    197 void tcp_send_packets(device_id_t device_id, packet_t packet);
    198 
    199 void tcp_process_acknowledgement(socket_core_ref socket,
    200     tcp_socket_data_ref socket_data, tcp_header_ref header);
    201 packet_t tcp_send_prepare_packet(socket_core_ref socket,
    202     tcp_socket_data_ref socket_data, packet_t packet, size_t data_length,
    203     size_t sequence_number);
    204 packet_t tcp_prepare_copy(socket_core_ref socket,
    205     tcp_socket_data_ref socket_data, packet_t packet, size_t data_length,
    206     size_t sequence_number);
    207 void tcp_retransmit_packet(socket_core_ref socket,
    208     tcp_socket_data_ref socket_data, size_t sequence_number);
    209 int tcp_create_notification_packet(packet_t * packet, socket_core_ref socket,
    210     tcp_socket_data_ref socket_data, int synchronize, int finalize);
    211 void tcp_refresh_socket_data(tcp_socket_data_ref socket_data);
    212 
    213 void tcp_initialize_socket_data(tcp_socket_data_ref socket_data);
    214 
    215 int tcp_process_listen(socket_core_ref listening_socket,
    216     tcp_socket_data_ref listening_socket_data, tcp_header_ref header,
    217     packet_t packet, struct sockaddr *src, struct sockaddr *dest,
    218     size_t addrlen);
    219 int tcp_process_syn_sent(socket_core_ref socket,
    220     tcp_socket_data_ref socket_data, tcp_header_ref header, packet_t packet);
    221 int tcp_process_syn_received(socket_core_ref socket,
    222     tcp_socket_data_ref socket_data, tcp_header_ref header, packet_t packet);
    223 int tcp_process_established(socket_core_ref socket,
    224     tcp_socket_data_ref socket_data, tcp_header_ref header, packet_t packet,
    225     int fragments, size_t total_length);
    226 int tcp_queue_received_packet(socket_core_ref socket,
    227     tcp_socket_data_ref socket_data, packet_t packet, int fragments,
    228     size_t total_length);
    229 
    230 int tcp_received_msg(device_id_t device_id, packet_t packet,
    231     services_t receiver, services_t error);
    232 int tcp_process_client_messages(ipc_callid_t callid, ipc_call_t call);
    233 
    234 int tcp_listen_message(socket_cores_ref local_sockets, int socket_id,
    235     int backlog);
    236 int tcp_connect_message(socket_cores_ref local_sockets, int socket_id,
    237     struct sockaddr *addr, socklen_t addrlen);
    238 int tcp_recvfrom_message(socket_cores_ref local_sockets, int socket_id,
    239     int flags, size_t * addrlen);
    240 int tcp_send_message(socket_cores_ref local_sockets, int socket_id,
    241     int fragments, size_t * data_fragment_size, int flags);
    242 int tcp_accept_message(socket_cores_ref local_sockets, int socket_id,
    243     int new_socket_id, size_t * data_fragment_size, size_t * addrlen);
    244 int tcp_close_message(socket_cores_ref local_sockets, int socket_id);
     160static int tcp_release_and_return(packet_t *, int);
     161static void tcp_prepare_operation_header(socket_core_t *, tcp_socket_data_t *,
     162    tcp_header_t *, int synchronize, int);
     163static int tcp_prepare_timeout(int (*)(void *), socket_core_t *,
     164    tcp_socket_data_t *, size_t, tcp_socket_state_t, suseconds_t, int);
     165static void tcp_free_socket_data(socket_core_t *);
     166
     167static int tcp_timeout(void *);
     168
     169static int tcp_release_after_timeout(void *);
     170
     171static int tcp_process_packet(device_id_t, packet_t *, services_t);
     172static int tcp_connect_core(socket_core_t *, socket_cores_t *,
     173    struct sockaddr *, socklen_t);
     174static int tcp_queue_prepare_packet(socket_core_t *, tcp_socket_data_t *,
     175    packet_t *, size_t);
     176static int tcp_queue_packet(socket_core_t *, tcp_socket_data_t *, packet_t *,
     177    size_t);
     178static packet_t *tcp_get_packets_to_send(socket_core_t *, tcp_socket_data_t *);
     179static void tcp_send_packets(device_id_t, packet_t *);
     180
     181static void tcp_process_acknowledgement(socket_core_t *, tcp_socket_data_t *,
     182    tcp_header_t *);
     183static packet_t *tcp_send_prepare_packet(socket_core_t *, tcp_socket_data_t *,
     184    packet_t *, size_t, size_t);
     185static packet_t *tcp_prepare_copy(socket_core_t *, tcp_socket_data_t *,
     186    packet_t *, size_t, size_t);
     187/* static */ void tcp_retransmit_packet(socket_core_t *, tcp_socket_data_t *,
     188    size_t);
     189static int tcp_create_notification_packet(packet_t **, socket_core_t *,
     190    tcp_socket_data_t *, int, int);
     191static void tcp_refresh_socket_data(tcp_socket_data_t *);
     192
     193static void tcp_initialize_socket_data(tcp_socket_data_t *);
     194
     195static int tcp_process_listen(socket_core_t *, tcp_socket_data_t *,
     196    tcp_header_t *, packet_t *, struct sockaddr *, struct sockaddr *, size_t);
     197static int tcp_process_syn_sent(socket_core_t *, tcp_socket_data_t *,
     198    tcp_header_t *, packet_t *);
     199static int tcp_process_syn_received(socket_core_t *, tcp_socket_data_t *,
     200    tcp_header_t *, packet_t *);
     201static int tcp_process_established(socket_core_t *, tcp_socket_data_t *,
     202    tcp_header_t *, packet_t *, int, size_t);
     203static int tcp_queue_received_packet(socket_core_t *, tcp_socket_data_t *,
     204    packet_t *, int, size_t);
     205static void tcp_queue_received_end_of_data(socket_core_t *socket);
     206
     207static int tcp_received_msg(device_id_t, packet_t *, services_t, services_t);
     208static int tcp_process_client_messages(ipc_callid_t, ipc_call_t);
     209
     210static int tcp_listen_message(socket_cores_t *, int, int);
     211static int tcp_connect_message(socket_cores_t *, int, struct sockaddr *,
     212    socklen_t);
     213static int tcp_recvfrom_message(socket_cores_t *, int, int, size_t *);
     214static int tcp_send_message(socket_cores_t *, int, int, size_t *, int);
     215static int tcp_accept_message(socket_cores_t *, int, int, size_t *, size_t *);
     216static int tcp_close_message(socket_cores_t *, int);
    245217
    246218/** TCP global data. */
    247219tcp_globals_t tcp_globals;
    248220
    249 int tcp_initialize(async_client_conn_t client_connection)
    250 {
    251         ERROR_DECLARE;
    252 
    253         assert(client_connection);
    254 
    255         fibril_rwlock_initialize(&tcp_globals.lock);
    256         fibril_rwlock_write_lock(&tcp_globals.lock);
    257 
    258         tcp_globals.icmp_phone = icmp_connect_module(SERVICE_ICMP,
    259             ICMP_CONNECT_TIMEOUT);
    260         tcp_globals.ip_phone = ip_bind_service(SERVICE_IP, IPPROTO_TCP,
    261             SERVICE_TCP, client_connection);
    262         if (tcp_globals.ip_phone < 0)
    263                 return tcp_globals.ip_phone;
    264        
    265         ERROR_PROPAGATE(socket_ports_initialize(&tcp_globals.sockets));
    266         if (ERROR_OCCURRED(packet_dimensions_initialize(
    267             &tcp_globals.dimensions))) {
    268                 socket_ports_destroy(&tcp_globals.sockets);
    269                 return ERROR_CODE;
    270         }
    271 
    272         tcp_globals.last_used_port = TCP_FREE_PORTS_START - 1;
    273         fibril_rwlock_write_unlock(&tcp_globals.lock);
    274 
    275         return EOK;
    276 }
    277 
    278 int
    279 tcp_received_msg(device_id_t device_id, packet_t packet, services_t receiver,
    280     services_t error)
    281 {
    282         ERROR_DECLARE;
     221int tcp_received_msg(device_id_t device_id, packet_t *packet,
     222    services_t receiver, services_t error)
     223{
     224        int rc;
    283225
    284226        if (receiver != SERVICE_TCP)
     
    286228
    287229        fibril_rwlock_write_lock(&tcp_globals.lock);
    288         if (ERROR_OCCURRED(tcp_process_packet(device_id, packet, error)))
     230        rc = tcp_process_packet(device_id, packet, error);
     231        if (rc != EOK)
    289232                fibril_rwlock_write_unlock(&tcp_globals.lock);
    290233
    291         printf("receive %d \n", ERROR_CODE);
    292 
    293         return ERROR_CODE;
    294 }
    295 
    296 int tcp_process_packet(device_id_t device_id, packet_t packet, services_t error)
    297 {
    298         ERROR_DECLARE;
    299 
     234        printf("receive %d \n", rc);
     235
     236        return rc;
     237}
     238
     239int tcp_process_packet(device_id_t device_id, packet_t *packet, services_t error)
     240{
    300241        size_t length;
    301242        size_t offset;
    302243        int result;
    303         tcp_header_ref header;
    304         socket_core_ref socket;
    305         tcp_socket_data_ref socket_data;
    306         packet_t next_packet;
     244        tcp_header_t *header;
     245        socket_core_t *socket;
     246        tcp_socket_data_t *socket_data;
     247        packet_t *next_packet;
    307248        size_t total_length;
    308249        uint32_t checksum;
     
    313254        struct sockaddr *dest;
    314255        size_t addrlen;
    315 
    316         if (error) {
    317                 switch (error) {
    318                 case SERVICE_ICMP:
    319                         // process error
    320                         result = icmp_client_process_packet(packet, &type,
    321                             &code, NULL, NULL);
    322                         if (result < 0)
    323                                 return tcp_release_and_return(packet, result);
    324 
    325                         length = (size_t) result;
    326                         if (ERROR_OCCURRED(packet_trim(packet, length, 0))) {
    327                                 return tcp_release_and_return(packet,
    328                                     ERROR_CODE);
    329                         }
    330                         break;
    331 
    332                 default:
    333                         return tcp_release_and_return(packet, ENOTSUP);
    334                 }
    335         }
    336 
    337         // TODO process received ipopts?
     256        int rc;
     257
     258        switch (error) {
     259        case SERVICE_NONE:
     260                break;
     261        case SERVICE_ICMP:
     262                /* Process error */
     263                result = icmp_client_process_packet(packet, &type, &code, NULL,
     264                    NULL);
     265                if (result < 0)
     266                        return tcp_release_and_return(packet, result);
     267
     268                length = (size_t) result;
     269                rc = packet_trim(packet, length, 0);
     270                if (rc != EOK)
     271                        return tcp_release_and_return(packet, rc);
     272                break;
     273        default:
     274                return tcp_release_and_return(packet, ENOTSUP);
     275        }
     276
     277        /* TODO process received ipopts? */
    338278        result = ip_client_process_packet(packet, NULL, NULL, NULL, NULL, NULL);
    339279        if (result < 0)
     
    349289                return tcp_release_and_return(packet, NO_DATA);
    350290
    351         // trim all but TCP header
    352         if (ERROR_OCCURRED(packet_trim(packet, offset, 0)))
    353                 return tcp_release_and_return(packet, ERROR_CODE);
    354 
    355         // get tcp header
    356         header = (tcp_header_ref) packet_get_data(packet);
     291        /* Trim all but TCP header */
     292        rc = packet_trim(packet, offset, 0);
     293        if (rc != EOK)
     294                return tcp_release_and_return(packet, rc);
     295
     296        /* Get tcp header */
     297        header = (tcp_header_t *) packet_get_data(packet);
    357298        if (!header)
    358299                return tcp_release_and_return(packet, NO_DATA);
    359300
    360 //      printf("header len %d, port %d \n", TCP_HEADER_LENGTH(header),
    361 //          ntohs(header->destination_port));
    362 
     301#if 0
     302        printf("header len %d, port %d \n", TCP_HEADER_LENGTH(header),
     303            ntohs(header->destination_port));
     304#endif
    363305        result = packet_get_addr(packet, (uint8_t **) &src, (uint8_t **) &dest);
    364306        if (result <= 0)
     
    367309        addrlen = (size_t) result;
    368310
    369         if (ERROR_OCCURRED(tl_set_address_port(src, addrlen,
    370             ntohs(header->source_port))))
    371                 return tcp_release_and_return(packet, ERROR_CODE);
     311        rc = tl_set_address_port(src, addrlen, ntohs(header->source_port));
     312        if (rc != EOK)
     313                return tcp_release_and_return(packet, rc);
    372314       
    373         // find the destination socket
     315        /* Find the destination socket */
    374316        socket = socket_port_find(&tcp_globals.sockets,
    375             ntohs(header->destination_port), (const char *) src, addrlen);
     317            ntohs(header->destination_port), (uint8_t *) src, addrlen);
    376318        if (!socket) {
    377                 // find the listening destination socket
     319                /* Find the listening destination socket */
    378320                socket = socket_port_find(&tcp_globals.sockets,
    379                     ntohs(header->destination_port), SOCKET_MAP_KEY_LISTENING,
    380                     0);
    381                 if (!socket) {
    382                         if (tl_prepare_icmp_packet(tcp_globals.net_phone,
    383                             tcp_globals.icmp_phone, packet, error) == EOK) {
    384                                 icmp_destination_unreachable_msg(
    385                                     tcp_globals.icmp_phone, ICMP_PORT_UNREACH,
    386                                     0, packet);
    387                         }
    388                         return EADDRNOTAVAIL;
    389                 }
    390         }
     321                    ntohs(header->destination_port),
     322                    (uint8_t *) SOCKET_MAP_KEY_LISTENING, 0);
     323        }
     324
     325        if (!socket) {
     326                if (tl_prepare_icmp_packet(tcp_globals.net_phone,
     327                    tcp_globals.icmp_phone, packet, error) == EOK) {
     328                        icmp_destination_unreachable_msg(tcp_globals.icmp_phone,
     329                            ICMP_PORT_UNREACH, 0, packet);
     330                }
     331                return EADDRNOTAVAIL;
     332        }
     333
    391334        printf("socket id %d\n", socket->socket_id);
    392         socket_data = (tcp_socket_data_ref) socket->specific_data;
     335        socket_data = (tcp_socket_data_t *) socket->specific_data;
    393336        assert(socket_data);
    394337
    395         // some data received, clear the timeout counter
     338        /* Some data received, clear the timeout counter */
    396339        socket_data->timeout_count = 0;
    397340
    398         // count the received packet fragments
     341        /* Count the received packet fragments */
    399342        next_packet = packet;
    400343        fragments = 0;
     
    402345        total_length = 0;
    403346        do {
    404                 ++fragments;
     347                fragments++;
    405348                length = packet_get_data_length(next_packet);
    406349                if (length <= 0)
     
    409352                total_length += length;
    410353
    411                 // add partial checksum if set
     354                /* Add partial checksum if set */
    412355                if (!error) {
    413356                        checksum = compute_checksum(checksum,
     
    421364
    422365        if (error)
    423                 goto error;
     366                goto has_error_service;
    424367       
    425368        if (socket_data->state == TCP_SOCKET_LISTEN) {
    426 
    427369                if (socket_data->pseudo_header) {
    428370                        free(socket_data->pseudo_header);
     
    431373                }
    432374
    433                 if (ERROR_OCCURRED(ip_client_get_pseudo_header(IPPROTO_TCP, src,
    434                     addrlen, dest, addrlen, total_length,
    435                     &socket_data->pseudo_header, &socket_data->headerlen))) {
     375                rc = ip_client_get_pseudo_header(IPPROTO_TCP, src, addrlen,
     376                    dest, addrlen, total_length, &socket_data->pseudo_header,
     377                    &socket_data->headerlen);
     378                if (rc != EOK) {
    436379                        fibril_rwlock_write_unlock(socket_data->local_lock);
    437                         return tcp_release_and_return(packet, ERROR_CODE);
    438                 }
    439 
    440         } else if (ERROR_OCCURRED(ip_client_set_pseudo_header_data_length(
    441             socket_data->pseudo_header, socket_data->headerlen,
    442             total_length))) {
    443                 fibril_rwlock_write_unlock(socket_data->local_lock);
    444                 return tcp_release_and_return(packet, ERROR_CODE);
     380                        return tcp_release_and_return(packet, rc);
     381                }
     382        } else {
     383                rc = ip_client_set_pseudo_header_data_length(
     384                    socket_data->pseudo_header, socket_data->headerlen,
     385                    total_length);
     386                if (rc != EOK) {
     387                        fibril_rwlock_write_unlock(socket_data->local_lock);
     388                        return tcp_release_and_return(packet, rc);
     389                }
    445390        }
    446391       
     
    452397                fibril_rwlock_write_unlock(socket_data->local_lock);
    453398
    454                 if (ERROR_NONE(tl_prepare_icmp_packet(tcp_globals.net_phone,
    455                     tcp_globals.icmp_phone, packet, error))) {
    456                         // checksum error ICMP
     399                rc = tl_prepare_icmp_packet(tcp_globals.net_phone,
     400                    tcp_globals.icmp_phone, packet, error);
     401                if (rc == EOK) {
     402                        /* Checksum error ICMP */
    457403                        icmp_parameter_problem_msg(tcp_globals.icmp_phone,
    458404                            ICMP_PARAM_POINTER,
     
    464410        }
    465411
    466 error:
    467         fibril_rwlock_read_unlock(&tcp_globals.lock);
    468 
    469         // TODO error reporting/handling
     412has_error_service:
     413        fibril_rwlock_write_unlock(&tcp_globals.lock);
     414
     415        /* TODO error reporting/handling */
    470416        switch (socket_data->state) {
    471417        case TCP_SOCKET_LISTEN:
    472                 ERROR_CODE = tcp_process_listen(socket, socket_data, header,
    473                     packet, src, dest, addrlen);
     418                rc = tcp_process_listen(socket, socket_data, header, packet,
     419                    src, dest, addrlen);
    474420                break;
    475421        case TCP_SOCKET_SYN_RECEIVED:
    476                 ERROR_CODE = tcp_process_syn_received(socket, socket_data,
    477                     header, packet);
     422                rc = tcp_process_syn_received(socket, socket_data, header,
     423                    packet);
    478424                break;
    479425        case TCP_SOCKET_SYN_SENT:
    480                 ERROR_CODE = tcp_process_syn_sent(socket, socket_data, header,
    481                     packet);
     426                rc = tcp_process_syn_sent(socket, socket_data, header, packet);
    482427                break;
    483428        case TCP_SOCKET_FIN_WAIT_1:
    484                 // ack changing the state to FIN_WAIT_2 gets processed later
     429                /* ack changing the state to FIN_WAIT_2 gets processed later */
    485430        case TCP_SOCKET_FIN_WAIT_2:
    486                 // fin changing state to LAST_ACK gets processed later
     431                /* fin changing state to LAST_ACK gets processed later */
    487432        case TCP_SOCKET_LAST_ACK:
    488                 // ack releasing the socket get processed later
     433                /* ack releasing the socket get processed later */
    489434        case TCP_SOCKET_CLOSING:
    490                 // ack releasing the socket gets processed later
     435                /* ack releasing the socket gets processed later */
    491436        case TCP_SOCKET_ESTABLISHED:
    492                 ERROR_CODE = tcp_process_established(socket, socket_data,
    493                     header, packet, fragments, total_length);
     437                rc = tcp_process_established(socket, socket_data, header,
     438                    packet, fragments, total_length);
    494439                break;
    495440        default:
     
    497442        }
    498443
    499         if (ERROR_CODE != EOK) {
    500                 printf("process %d\n", ERROR_CODE);
     444        if (rc != EOK) {
    501445                fibril_rwlock_write_unlock(socket_data->local_lock);
     446                printf("process %d\n", rc);
    502447        }
    503448
     
    505450}
    506451
    507 int
    508 tcp_process_established(socket_core_ref socket, tcp_socket_data_ref socket_data,
    509     tcp_header_ref header, packet_t packet, int fragments,
     452int tcp_process_established(socket_core_t *socket, tcp_socket_data_t *
     453    socket_data, tcp_header_t *header, packet_t *packet, int fragments,
    510454    size_t total_length)
    511455{
    512         ERROR_DECLARE;
    513 
    514         packet_t next_packet;
    515         packet_t tmp_packet;
     456        packet_t *next_packet;
     457        packet_t *tmp_packet;
    516458        uint32_t old_incoming;
    517459        size_t order;
     
    520462        size_t offset;
    521463        uint32_t new_sequence_number;
     464        bool forced_ack;
     465        int rc;
    522466
    523467        assert(socket);
     
    527471        assert(packet);
    528472
     473        forced_ack = false;
     474
    529475        new_sequence_number = ntohl(header->sequence_number);
    530476        old_incoming = socket_data->next_incoming;
    531477
    532         if (header->finalize)
    533                 socket_data->fin_incoming = new_sequence_number;
    534 
    535         // trim begining if containing expected data
     478        if (header->finalize) {
     479                socket_data->fin_incoming = new_sequence_number +
     480                    total_length - TCP_HEADER_LENGTH(header);
     481        }
     482
     483        /* Trim begining if containing expected data */
    536484        if (IS_IN_INTERVAL_OVERFLOW(new_sequence_number,
    537485            socket_data->next_incoming, new_sequence_number + total_length)) {
    538486
    539                 // get the acknowledged offset
     487                /* Get the acknowledged offset */
    540488                if (socket_data->next_incoming < new_sequence_number) {
    541489                        offset = new_sequence_number -
     
    549497                total_length -= offset;
    550498                length = packet_get_data_length(packet);
    551                 // trim the acknowledged data
     499
     500                /* Trim the acknowledged data */
    552501                while (length <= offset) {
    553                         // release the acknowledged packets
     502                        /* Release the acknowledged packets */
    554503                        next_packet = pq_next(packet);
    555504                        pq_release_remote(tcp_globals.net_phone,
     
    560509                }
    561510
    562                 if ((offset > 0) && (ERROR_OCCURRED(packet_trim(packet,
    563                     offset, 0))))
    564                         return tcp_release_and_return(packet, ERROR_CODE);
     511                if (offset > 0) {
     512                        rc = packet_trim(packet, offset, 0);
     513                        if (rc != EOK)
     514                                return tcp_release_and_return(packet, rc);
     515                }
    565516
    566517                assert(new_sequence_number == socket_data->next_incoming);
    567518        }
    568519
    569         // release if overflowing the window
     520        /* Release if overflowing the window */
    570521/*
    571522        if (IS_IN_INTERVAL_OVERFLOW(socket_data->next_incoming +
     
    594545                        if (length <= offset)
    595546                                next_packet = pq_next(next_packet);
    596                         else if (ERROR_OCCURRED(packet_trim(next_packet, 0,
    597                             length - offset)))
    598                                 return tcp_release_and_return(packet,
    599                                     ERROR_CODE);
     547                        else {
     548                                rc = packet_trim(next_packet, 0,
     549                                    length - offset));
     550                                if (rc != EOK)
     551                                        return tcp_release_and_return(packet,
     552                                            rc);
     553                        }
    600554                        offset -= length;
    601555                        total_length -= length - offset;
     
    614568        }
    615569*/
    616         // the expected one arrived?
     570        /* The expected one arrived? */
    617571        if (new_sequence_number == socket_data->next_incoming) {
    618572                printf("expected\n");
    619                 // process acknowledgement
     573                /* Process acknowledgement */
    620574                tcp_process_acknowledgement(socket, socket_data, header);
    621575
    622                 // remove the header
     576                /* Remove the header */
    623577                total_length -= TCP_HEADER_LENGTH(header);
    624                 if (ERROR_OCCURRED(packet_trim(packet,
    625                     TCP_HEADER_LENGTH(header), 0)))
    626                         return tcp_release_and_return(packet, ERROR_CODE);
     578                rc = packet_trim(packet, TCP_HEADER_LENGTH(header), 0);
     579                if (rc != EOK)
     580                        return tcp_release_and_return(packet, rc);
    627581
    628582                if (total_length) {
    629                         ERROR_PROPAGATE(tcp_queue_received_packet(socket,
    630                             socket_data, packet, fragments, total_length));
     583                        rc = tcp_queue_received_packet(socket, socket_data,
     584                            packet, fragments, total_length);
     585                        if (rc != EOK)
     586                                return rc;
    631587                } else {
    632588                        total_length = 1;
     
    636592                packet = socket_data->incoming;
    637593                while (packet) {
    638 
    639                         if (ERROR_OCCURRED(pq_get_order(socket_data->incoming,
    640                             &order, NULL))) {
    641                                 // remove the corrupted packet
     594                        rc = pq_get_order(socket_data->incoming, &order, NULL);
     595                        if (rc != EOK) {
     596                                /* Remove the corrupted packet */
    642597                                next_packet = pq_detach(packet);
    643598                                if (packet == socket_data->incoming)
     
    652607                        if (IS_IN_INTERVAL_OVERFLOW(sequence_number,
    653608                            old_incoming, socket_data->next_incoming)) {
    654                                 // move to the next
     609                                /* Move to the next */
    655610                                packet = pq_next(packet);
    656                                 // coninual data?
     611                                /* Coninual data? */
    657612                        } else if (IS_IN_INTERVAL_OVERFLOW(old_incoming,
    658613                            sequence_number, socket_data->next_incoming)) {
    659                                 // detach the packet
     614                                /* Detach the packet */
    660615                                next_packet = pq_detach(packet);
    661616                                if (packet == socket_data->incoming)
    662617                                        socket_data->incoming = next_packet;
    663                                 // get data length
     618                                /* Get data length */
    664619                                length = packet_get_data_length(packet);
    665620                                new_sequence_number = sequence_number + length;
    666621                                if (length <= 0) {
    667                                         // remove the empty packet
     622                                        /* Remove the empty packet */
    668623                                        pq_release_remote(tcp_globals.net_phone,
    669624                                            packet_get_id(packet));
     
    671626                                        continue;
    672627                                }
    673                                 // exactly following
     628                                /* Exactly following */
    674629                                if (sequence_number ==
    675630                                    socket_data->next_incoming) {
    676                                         // queue received data
    677                                         ERROR_PROPAGATE(
    678                                             tcp_queue_received_packet(socket,
     631                                        /* Queue received data */
     632                                        rc = tcp_queue_received_packet(socket,
    679633                                            socket_data, packet, 1,
    680                                             packet_get_data_length(packet)));
     634                                            packet_get_data_length(packet));
     635                                        if (rc != EOK)
     636                                                return rc;
    681637                                        socket_data->next_incoming =
    682638                                            new_sequence_number;
    683639                                        packet = next_packet;
    684640                                        continue;
    685                                         // at least partly following data?
    686                                 } else if (IS_IN_INTERVAL_OVERFLOW(
    687                                     sequence_number, socket_data->next_incoming,
    688                                     new_sequence_number)) {
     641                                        /* At least partly following data? */
     642                                }
     643                                if (IS_IN_INTERVAL_OVERFLOW(sequence_number,
     644                                    socket_data->next_incoming, new_sequence_number)) {
    689645                                        if (socket_data->next_incoming <
    690646                                            new_sequence_number) {
     
    696652                                                    new_sequence_number;
    697653                                        }
    698                                         if (ERROR_NONE(packet_trim(packet,
    699                                             length, 0))) {
    700                                                 // queue received data
    701                                                 ERROR_PROPAGATE(
    702                                                     tcp_queue_received_packet(
     654                                        rc = packet_trim(packet,length, 0);
     655                                        if (rc == EOK) {
     656                                                /* Queue received data */
     657                                                rc = tcp_queue_received_packet(
    703658                                                    socket, socket_data, packet,
    704659                                                    1, packet_get_data_length(
    705                                                     packet)));
     660                                                    packet));
     661                                                if (rc != EOK)
     662                                                        return rc;
    706663                                                socket_data->next_incoming =
    707664                                                    new_sequence_number;
     
    710667                                        }
    711668                                }
    712                                 // remove the duplicit or corrupted packet
     669                                /* Remove the duplicit or corrupted packet */
    713670                                pq_release_remote(tcp_globals.net_phone,
    714671                                    packet_get_id(packet));
     
    723680            socket_data->next_incoming + socket_data->window)) {
    724681                printf("in window\n");
    725                 // process acknowledgement
     682                /* Process acknowledgement */
    726683                tcp_process_acknowledgement(socket, socket_data, header);
    727684
    728                 // remove the header
     685                /* Remove the header */
    729686                total_length -= TCP_HEADER_LENGTH(header);
    730                 if (ERROR_OCCURRED(packet_trim(packet,
    731                     TCP_HEADER_LENGTH(header), 0)))
    732                         return tcp_release_and_return(packet, ERROR_CODE);
     687                rc = packet_trim(packet, TCP_HEADER_LENGTH(header), 0);
     688                if (rc != EOK)
     689                        return tcp_release_and_return(packet, rc);
    733690
    734691                next_packet = pq_detach(packet);
    735692                length = packet_get_data_length(packet);
    736                 if (ERROR_OCCURRED(pq_add(&socket_data->incoming, packet,
    737                     new_sequence_number, length))) {
    738                         // remove the corrupted packets
     693                rc = pq_add(&socket_data->incoming, packet, new_sequence_number,
     694                    length);
     695                if (rc != EOK) {
     696                        /* Remove the corrupted packets */
    739697                        pq_release_remote(tcp_globals.net_phone,
    740698                            packet_get_id(packet));
     
    746704                                tmp_packet = pq_detach(next_packet);
    747705                                length = packet_get_data_length(next_packet);
    748                                 if (ERROR_OCCURRED(pq_set_order(next_packet,
    749                                     new_sequence_number, length)) ||
    750                                     ERROR_OCCURRED(pq_insert_after(packet,
    751                                     next_packet))) {
     706
     707                                rc = pq_set_order(next_packet,
     708                                    new_sequence_number, length);
     709                                if (rc != EOK) {
     710                                        pq_release_remote(tcp_globals.net_phone,
     711                                            packet_get_id(next_packet));
     712                                }
     713                                rc = pq_insert_after(packet, next_packet);
     714                                if (rc != EOK) {
    752715                                        pq_release_remote(tcp_globals.net_phone,
    753716                                            packet_get_id(next_packet));
     
    758721        } else {
    759722                printf("unexpected\n");
    760                 // release duplicite or restricted
     723                /* Release duplicite or restricted */
    761724                pq_release_remote(tcp_globals.net_phone, packet_get_id(packet));
    762         }
    763 
    764         // change state according to the acknowledging incoming fin
    765         if (IS_IN_INTERVAL_OVERFLOW(old_incoming, socket_data->fin_incoming,
    766             socket_data->next_incoming)) {
     725                forced_ack = true;
     726        }
     727
     728        /* If next in sequence is an incoming FIN */
     729        if (socket_data->next_incoming == socket_data->fin_incoming) {
     730                /* Advance sequence number */
     731                socket_data->next_incoming += 1;
     732
     733                /* Handle FIN */
    767734                switch (socket_data->state) {
    768735                case TCP_SOCKET_FIN_WAIT_1:
     
    771738                        socket_data->state = TCP_SOCKET_CLOSING;
    772739                        break;
    773                         //case TCP_ESTABLISHED:
     740                case TCP_SOCKET_ESTABLISHED:
     741                        /* Queue end-of-data marker on the socket. */
     742                        tcp_queue_received_end_of_data(socket);
     743                        socket_data->state = TCP_SOCKET_CLOSE_WAIT;
     744                        break;
    774745                default:
    775746                        socket_data->state = TCP_SOCKET_CLOSE_WAIT;
     
    779750
    780751        packet = tcp_get_packets_to_send(socket, socket_data);
    781         if (!packet) {
    782                 // create the notification packet
    783                 ERROR_PROPAGATE(tcp_create_notification_packet(&packet, socket,
    784                     socket_data, 0, 0));
    785                 ERROR_PROPAGATE(tcp_queue_prepare_packet(socket, socket_data,
    786                     packet, 1));
     752        if (!packet && (socket_data->next_incoming != old_incoming || forced_ack)) {
     753                /* Create the notification packet */
     754                rc = tcp_create_notification_packet(&packet, socket,
     755                    socket_data, 0, 0);
     756                if (rc != EOK)
     757                        return rc;
     758                rc = tcp_queue_prepare_packet(socket, socket_data, packet, 1);
     759                if (rc != EOK)
     760                        return rc;
    787761                packet = tcp_send_prepare_packet(socket, socket_data, packet, 1,
    788762                    socket_data->last_outgoing + 1);
     
    791765        fibril_rwlock_write_unlock(socket_data->local_lock);
    792766
    793         // send the packet
     767        /* Send the packet */
    794768        tcp_send_packets(socket_data->device_id, packet);
    795769
     
    797771}
    798772
    799 int
    800 tcp_queue_received_packet(socket_core_ref socket,
    801     tcp_socket_data_ref socket_data, packet_t packet, int fragments,
     773int tcp_queue_received_packet(socket_core_t *socket,
     774    tcp_socket_data_t *socket_data, packet_t *packet, int fragments,
    802775    size_t total_length)
    803776{
    804         ERROR_DECLARE;
    805 
    806         packet_dimension_ref packet_dimension;
     777        packet_dimension_t *packet_dimension;
     778        int rc;
    807779
    808780        assert(socket);
     
    813785        assert(socket_data->window > total_length);
    814786
    815         // queue the received packet
    816         if (ERROR_OCCURRED(dyn_fifo_push(&socket->received,
    817             packet_get_id(packet), SOCKET_MAX_RECEIVED_SIZE)) ||
    818             ERROR_OCCURRED(tl_get_ip_packet_dimension(tcp_globals.ip_phone,
    819             &tcp_globals.dimensions, socket_data->device_id,
    820             &packet_dimension))) {
    821                 return tcp_release_and_return(packet, ERROR_CODE);
    822         }
    823 
    824         // decrease the window size
     787        /* Queue the received packet */
     788        rc = dyn_fifo_push(&socket->received, packet_get_id(packet),
     789            SOCKET_MAX_RECEIVED_SIZE);
     790        if (rc != EOK)
     791                return tcp_release_and_return(packet, rc);
     792        rc = tl_get_ip_packet_dimension(tcp_globals.ip_phone,
     793            &tcp_globals.dimensions, socket_data->device_id, &packet_dimension);
     794        if (rc != EOK)
     795                return tcp_release_and_return(packet, rc);
     796
     797        /* Decrease the window size */
    825798        socket_data->window -= total_length;
    826799
    827         // notify the destination socket
     800        /* Notify the destination socket */
    828801        async_msg_5(socket->phone, NET_SOCKET_RECEIVED,
    829             (ipcarg_t) socket->socket_id,
     802            (sysarg_t) socket->socket_id,
    830803            ((packet_dimension->content < socket_data->data_fragment_size) ?
    831804            packet_dimension->content : socket_data->data_fragment_size), 0, 0,
    832             (ipcarg_t) fragments);
     805            (sysarg_t) fragments);
    833806
    834807        return EOK;
    835808}
    836809
    837 int
    838 tcp_process_syn_sent(socket_core_ref socket, tcp_socket_data_ref socket_data,
    839     tcp_header_ref header, packet_t packet)
    840 {
    841         ERROR_DECLARE;
    842 
    843         packet_t next_packet;
     810/** Queue end-of-data marker on the socket.
     811 *
     812 * Next element in the sequence space is FIN. Queue end-of-data marker
     813 * on the socket.
     814 *
     815 * @param socket        Socket
     816 */
     817static void tcp_queue_received_end_of_data(socket_core_t *socket)
     818{
     819        assert(socket != NULL);
     820
     821        /* Notify the destination socket */
     822        async_msg_5(socket->phone, NET_SOCKET_RECEIVED,
     823            (sysarg_t) socket->socket_id,
     824            0, 0, 0,
     825            (sysarg_t) 0 /* 0 fragments == no more data */);
     826}
     827
     828int tcp_process_syn_sent(socket_core_t *socket, tcp_socket_data_t *
     829    socket_data, tcp_header_t *header, packet_t *packet)
     830{
     831        packet_t *next_packet;
     832        int rc;
    844833
    845834        assert(socket);
     
    852841                return tcp_release_and_return(packet, EINVAL);
    853842       
    854         // process acknowledgement
     843        /* Process acknowledgement */
    855844        tcp_process_acknowledgement(socket, socket_data, header);
    856845
    857846        socket_data->next_incoming = ntohl(header->sequence_number) + 1;
    858         // release additional packets
     847
     848        /* Release additional packets */
    859849        next_packet = pq_detach(packet);
    860850        if (next_packet) {
     
    862852                    packet_get_id(next_packet));
    863853        }
    864         // trim if longer than the header
    865         if ((packet_get_data_length(packet) > sizeof(*header)) &&
    866             ERROR_OCCURRED(packet_trim(packet, 0,
    867             packet_get_data_length(packet) - sizeof(*header)))) {
    868                 return tcp_release_and_return(packet, ERROR_CODE);
    869         }
     854
     855        /* Trim if longer than the header */
     856        if (packet_get_data_length(packet) > sizeof(*header)) {
     857                rc = packet_trim(packet, 0,
     858                    packet_get_data_length(packet) - sizeof(*header));
     859                if (rc != EOK)
     860                        return tcp_release_and_return(packet, rc);
     861        }
     862
    870863        tcp_prepare_operation_header(socket, socket_data, header, 0, 0);
    871864        fibril_mutex_lock(&socket_data->operation.mutex);
    872865        socket_data->operation.result = tcp_queue_packet(socket, socket_data,
    873866            packet, 1);
     867
    874868        if (socket_data->operation.result == EOK) {
    875869                socket_data->state = TCP_SOCKET_ESTABLISHED;
     
    877871                if (packet) {
    878872                        fibril_rwlock_write_unlock( socket_data->local_lock);
    879                         // send the packet
     873                        /* Send the packet */
    880874                        tcp_send_packets(socket_data->device_id, packet);
    881                         // signal the result
     875                        /* Signal the result */
    882876                        fibril_condvar_signal( &socket_data->operation.condvar);
    883877                        fibril_mutex_unlock( &socket_data->operation.mutex);
     
    885879                }
    886880        }
     881
    887882        fibril_mutex_unlock(&socket_data->operation.mutex);
    888883        return tcp_release_and_return(packet, EINVAL);
    889884}
    890885
    891 int
    892 tcp_process_listen(socket_core_ref listening_socket,
    893     tcp_socket_data_ref listening_socket_data, tcp_header_ref header,
    894     packet_t packet, struct sockaddr *src, struct sockaddr *dest,
     886int tcp_process_listen(socket_core_t *listening_socket,
     887    tcp_socket_data_t *listening_socket_data, tcp_header_t *header,
     888    packet_t *packet, struct sockaddr *src, struct sockaddr *dest,
    895889    size_t addrlen)
    896890{
    897         ERROR_DECLARE;
    898 
    899         packet_t next_packet;
    900         socket_core_ref socket;
    901         tcp_socket_data_ref socket_data;
     891        packet_t *next_packet;
     892        socket_core_t *socket;
     893        tcp_socket_data_t *socket_data;
    902894        int socket_id;
    903895        int listening_socket_id = listening_socket->socket_id;
    904896        int listening_port = listening_socket->port;
     897        int rc;
    905898
    906899        assert(listening_socket);
     
    913906                return tcp_release_and_return(packet, EINVAL);
    914907
    915         socket_data = (tcp_socket_data_ref) malloc(sizeof(*socket_data));
     908        socket_data = (tcp_socket_data_t *) malloc(sizeof(*socket_data));
    916909        if (!socket_data)
    917910                return tcp_release_and_return(packet, ENOMEM);
     
    930923                return tcp_release_and_return(packet, ENOMEM);
    931924        }
     925
    932926        memcpy(socket_data->addr, src, socket_data->addrlen);
    933927        socket_data->dest_port = ntohs(header->source_port);
    934         if (ERROR_OCCURRED(tl_set_address_port(socket_data->addr,
    935             socket_data->addrlen, socket_data->dest_port))) {
     928        rc = tl_set_address_port(socket_data->addr, socket_data->addrlen,
     929            socket_data->dest_port);
     930        if (rc != EOK) {
    936931                free(socket_data->addr);
    937932                free(socket_data);
    938                 pq_release_remote(tcp_globals.net_phone, packet_get_id(packet));
    939                 return ERROR_CODE;
    940         }
    941 
    942         // create a socket
     933                return tcp_release_and_return(packet, rc);
     934        }
     935
     936        /* Create a socket */
    943937        socket_id = -1;
    944         if (ERROR_OCCURRED(socket_create(socket_data->local_sockets,
    945             listening_socket->phone, socket_data, &socket_id))) {
     938        rc = socket_create(socket_data->local_sockets, listening_socket->phone,
     939            socket_data, &socket_id);
     940        if (rc != EOK) {
    946941                free(socket_data->addr);
    947942                free(socket_data);
    948                 return tcp_release_and_return(packet, ERROR_CODE);
     943                return tcp_release_and_return(packet, rc);
    949944        }
    950945
     
    958953        fibril_rwlock_write_lock(&tcp_globals.lock);
    959954
    960         // find the destination socket
     955        /* Find the destination socket */
    961956        listening_socket = socket_port_find(&tcp_globals.sockets,
    962             listening_port, SOCKET_MAP_KEY_LISTENING, 0);
    963         if ((!listening_socket) ||
     957            listening_port, (uint8_t *) SOCKET_MAP_KEY_LISTENING, 0);
     958        if (!listening_socket ||
    964959            (listening_socket->socket_id != listening_socket_id)) {
    965960                fibril_rwlock_write_unlock(&tcp_globals.lock);
    966                 // a shadow may remain until app hangs up
     961                /* A shadow may remain until app hangs up */
    967962                return tcp_release_and_return(packet, EOK /*ENOTSOCK*/);
    968963        }
    969964        listening_socket_data =
    970             (tcp_socket_data_ref) listening_socket->specific_data;
     965            (tcp_socket_data_t *) listening_socket->specific_data;
    971966        assert(listening_socket_data);
    972967
     
    976971            socket_id);
    977972        if (!socket) {
    978                 // where is the socket?!?
     973                /* Where is the socket?!? */
    979974                fibril_rwlock_write_unlock(&tcp_globals.lock);
    980975                return ENOTSOCK;
    981976        }
    982         socket_data = (tcp_socket_data_ref) socket->specific_data;
     977        socket_data = (tcp_socket_data_t *) socket->specific_data;
    983978        assert(socket_data);
    984979
    985         ERROR_CODE = socket_port_add(&tcp_globals.sockets, listening_port,
    986             socket, (const char *) socket_data->addr, socket_data->addrlen);
     980        rc = socket_port_add(&tcp_globals.sockets, listening_port, socket,
     981            (uint8_t *) socket_data->addr, socket_data->addrlen);
    987982        assert(socket == socket_port_find(&tcp_globals.sockets, listening_port,
    988             (const char *) socket_data->addr, socket_data->addrlen));
    989 
    990 //      ERROR_CODE = socket_bind_free_port(&tcp_globals.sockets, socket,
     983            (uint8_t *) socket_data->addr, socket_data->addrlen));
     984
     985//      rc = socket_bind_free_port(&tcp_globals.sockets, socket,
    991986//          TCP_FREE_PORTS_START, TCP_FREE_PORTS_END,
    992987//          tcp_globals.last_used_port);
    993988//      tcp_globals.last_used_port = socket->port;
    994989        fibril_rwlock_write_unlock(&tcp_globals.lock);
    995         if (ERROR_CODE != EOK) {
     990        if (rc != EOK) {
    996991                socket_destroy(tcp_globals.net_phone, socket->socket_id,
    997992                    socket_data->local_sockets, &tcp_globals.sockets,
    998993                    tcp_free_socket_data);
    999                 return tcp_release_and_return(packet, ERROR_CODE);
     994                return tcp_release_and_return(packet, rc);
    1000995        }
    1001996
     
    1003998        socket_data->next_incoming = ntohl(header->sequence_number) + 1;
    1004999
    1005         // release additional packets
     1000        /* Release additional packets */
    10061001        next_packet = pq_detach(packet);
    10071002        if (next_packet) {
     
    10101005        }
    10111006
    1012         // trim if longer than the header
    1013         if ((packet_get_data_length(packet) > sizeof(*header)) &&
    1014             ERROR_OCCURRED(packet_trim(packet, 0,
    1015             packet_get_data_length(packet) - sizeof(*header)))) {
     1007        /* Trim if longer than the header */
     1008        if (packet_get_data_length(packet) > sizeof(*header)) {
     1009                rc = packet_trim(packet, 0,
     1010                    packet_get_data_length(packet) - sizeof(*header));
     1011                if (rc != EOK) {
     1012                        socket_destroy(tcp_globals.net_phone, socket->socket_id,
     1013                            socket_data->local_sockets, &tcp_globals.sockets,
     1014                            tcp_free_socket_data);
     1015                        return tcp_release_and_return(packet, rc);
     1016                }
     1017        }
     1018
     1019        tcp_prepare_operation_header(socket, socket_data, header, 1, 0);
     1020
     1021        rc = tcp_queue_packet(socket, socket_data, packet, 1);
     1022        if (rc != EOK) {
    10161023                socket_destroy(tcp_globals.net_phone, socket->socket_id,
    10171024                    socket_data->local_sockets, &tcp_globals.sockets,
    10181025                    tcp_free_socket_data);
    1019                 return tcp_release_and_return(packet, ERROR_CODE);
    1020         }
    1021 
    1022         tcp_prepare_operation_header(socket, socket_data, header, 1, 0);
    1023 
    1024         if (ERROR_OCCURRED(tcp_queue_packet(socket, socket_data, packet, 1))) {
    1025                 socket_destroy(tcp_globals.net_phone, socket->socket_id,
    1026                     socket_data->local_sockets, &tcp_globals.sockets,
    1027                     tcp_free_socket_data);
    1028                 return ERROR_CODE;
     1026                return rc;
    10291027        }
    10301028
     
    10401038        fibril_rwlock_write_unlock(socket_data->local_lock);
    10411039
    1042         // send the packet
     1040        /* Send the packet */
    10431041        tcp_send_packets(socket_data->device_id, packet);
    10441042
     
    10461044}
    10471045
    1048 int
    1049 tcp_process_syn_received(socket_core_ref socket,
    1050     tcp_socket_data_ref socket_data, tcp_header_ref header, packet_t packet)
    1051 {
    1052         ERROR_DECLARE;
    1053 
    1054         socket_core_ref listening_socket;
    1055         tcp_socket_data_ref listening_socket_data;
     1046int tcp_process_syn_received(socket_core_t *socket,
     1047    tcp_socket_data_t *socket_data, tcp_header_t *header, packet_t *packet)
     1048{
     1049        socket_core_t *listening_socket;
     1050        tcp_socket_data_t *listening_socket_data;
     1051        int rc;
    10561052
    10571053        assert(socket);
     
    10641060                return tcp_release_and_return(packet, EINVAL);
    10651061
    1066         // process acknowledgement
     1062        /* Process acknowledgement */
    10671063        tcp_process_acknowledgement(socket, socket_data, header);
    10681064
    1069         socket_data->next_incoming = ntohl(header->sequence_number);    // + 1;
     1065        socket_data->next_incoming = ntohl(header->sequence_number); /* + 1; */
    10701066        pq_release_remote(tcp_globals.net_phone, packet_get_id(packet));
    10711067        socket_data->state = TCP_SOCKET_ESTABLISHED;
     
    10741070        if (listening_socket) {
    10751071                listening_socket_data =
    1076                     (tcp_socket_data_ref) listening_socket->specific_data;
     1072                    (tcp_socket_data_t *) listening_socket->specific_data;
    10771073                assert(listening_socket_data);
    10781074
    1079                 // queue the received packet
    1080                 if (ERROR_NONE(dyn_fifo_push(&listening_socket->accepted,
    1081                     (-1 * socket->socket_id),
    1082                     listening_socket_data->backlog))) {
    1083 
    1084                         // notify the destination socket
     1075                /* Queue the received packet */
     1076                rc = dyn_fifo_push(&listening_socket->accepted,
     1077                    (-1 * socket->socket_id), listening_socket_data->backlog);
     1078                if (rc == EOK) {
     1079                        /* Notify the destination socket */
    10851080                        async_msg_5(socket->phone, NET_SOCKET_ACCEPTED,
    1086                             (ipcarg_t) listening_socket->socket_id,
     1081                            (sysarg_t) listening_socket->socket_id,
    10871082                            socket_data->data_fragment_size, TCP_HEADER_SIZE,
    1088                             0, (ipcarg_t) socket->socket_id);
     1083                            0, (sysarg_t) socket->socket_id);
    10891084
    10901085                        fibril_rwlock_write_unlock(socket_data->local_lock);
     
    10921087                }
    10931088        }
    1094         // send FIN
     1089        /* Send FIN */
    10951090        socket_data->state = TCP_SOCKET_FIN_WAIT_1;
    10961091
    1097         // create the notification packet
    1098         ERROR_PROPAGATE(tcp_create_notification_packet(&packet, socket,
    1099             socket_data, 0, 1));
    1100 
    1101         // send the packet
    1102         ERROR_PROPAGATE(tcp_queue_packet(socket, socket_data, packet, 1));
    1103 
    1104         // flush packets
     1092        /* Create the notification packet */
     1093        rc = tcp_create_notification_packet(&packet, socket, socket_data, 0, 1);
     1094        if (rc != EOK)
     1095                return rc;
     1096
     1097        /* Send the packet */
     1098        rc = tcp_queue_packet(socket, socket_data, packet, 1);
     1099        if (rc != EOK)
     1100                return rc;
     1101
     1102        /* Flush packets */
    11051103        packet = tcp_get_packets_to_send(socket, socket_data);
    11061104        fibril_rwlock_write_unlock(socket_data->local_lock);
    11071105        if (packet) {
    1108                 // send the packet
     1106                /* Send the packet */
    11091107                tcp_send_packets(socket_data->device_id, packet);
    11101108        }
     
    11131111}
    11141112
    1115 void
    1116 tcp_process_acknowledgement(socket_core_ref socket,
    1117     tcp_socket_data_ref socket_data, tcp_header_ref header)
     1113void tcp_process_acknowledgement(socket_core_t *socket,
     1114    tcp_socket_data_t *socket_data, tcp_header_t *header)
    11181115{
    11191116        size_t number;
    11201117        size_t length;
    1121         packet_t packet;
    1122         packet_t next;
    1123         packet_t acknowledged = NULL;
     1118        packet_t *packet;
     1119        packet_t *next;
     1120        packet_t *acknowledged = NULL;
    11241121        uint32_t old;
    11251122
     
    11331130
    11341131        number = ntohl(header->acknowledgement_number);
    1135         // if more data acknowledged
     1132
     1133        /* If more data acknowledged */
    11361134        if (number != socket_data->expected) {
    11371135                old = socket_data->expected;
     
    11441142                        case TCP_SOCKET_LAST_ACK:
    11451143                        case TCP_SOCKET_CLOSING:
    1146                                 // fin acknowledged - release the socket in
    1147                                 // another fibril
     1144                                /*
     1145                                 * FIN acknowledged - release the socket in
     1146                                 * another fibril.
     1147                                 */
    11481148                                tcp_prepare_timeout(tcp_release_after_timeout,
    11491149                                    socket, socket_data, 0,
     
    11551155                        }
    11561156                }
    1157                 // update the treshold if higher than set
     1157
     1158                /* Update the treshold if higher than set */
    11581159                if (number + ntohs(header->window) >
    11591160                    socket_data->expected + socket_data->treshold) {
     
    11611162                            socket_data->expected;
    11621163                }
    1163                 // set new expected sequence number
     1164
     1165                /* Set new expected sequence number */
    11641166                socket_data->expected = number;
    11651167                socket_data->expected_count = 1;
     
    11731175                                        socket_data->outgoing = next;
    11741176
    1175                                 // add to acknowledged or release
     1177                                /* Add to acknowledged or release */
    11761178                                if (pq_add(&acknowledged, packet, 0, 0) != EOK)
    11771179                                        pq_release_remote(tcp_globals.net_phone,
     
    11811183                                break;
    11821184                }
    1183                 // release acknowledged
     1185
     1186                /* Release acknowledged */
    11841187                if (acknowledged) {
    11851188                        pq_release_remote(tcp_globals.net_phone,
     
    11871190                }
    11881191                return;
    1189                 // if the same as the previous time
    1190         }
     1192                /* If the same as the previous time */
     1193        }
     1194
    11911195        if (number == socket_data->expected) {
    1192                 // increase the counter
    1193                 ++socket_data->expected_count;
     1196                /* Increase the counter */
     1197                socket_data->expected_count++;
    11941198                if (socket_data->expected_count == TCP_FAST_RETRANSMIT_COUNT) {
    11951199                        socket_data->expected_count = 1;
    1196                         // TODO retransmit lock
     1200                        /* TODO retransmit lock */
    11971201                        //tcp_retransmit_packet(socket, socket_data, number);
    11981202                }
     
    12001204}
    12011205
    1202 int tcp_message_standalone(ipc_callid_t callid, ipc_call_t * call,
    1203     ipc_call_t * answer, int *answer_count)
    1204 {
    1205         ERROR_DECLARE;
    1206 
    1207         packet_t packet;
    1208 
     1206/** Per-connection initialization
     1207 *
     1208 */
     1209void tl_connection(void)
     1210{
     1211}
     1212
     1213/** Processes the TCP message.
     1214 *
     1215 * @param[in] callid    The message identifier.
     1216 * @param[in] call      The message parameters.
     1217 * @param[out] answer   The message answer parameters.
     1218 * @param[out] answer_count The last parameter for the actual answer in the
     1219 *                      answer parameter.
     1220 * @return              EOK on success.
     1221 * @return              ENOTSUP if the message is not known.
     1222 *
     1223 * @see tcp_interface.h
     1224 * @see IS_NET_TCP_MESSAGE()
     1225 */
     1226int tl_message(ipc_callid_t callid, ipc_call_t *call,
     1227    ipc_call_t *answer, size_t *answer_count)
     1228{
    12091229        assert(call);
    12101230        assert(answer);
     
    12121232
    12131233        *answer_count = 0;
    1214         switch (IPC_GET_METHOD(*call)) {
    1215         case NET_TL_RECEIVED:
    1216                 //fibril_rwlock_read_lock(&tcp_globals.lock);
    1217                 if (ERROR_NONE(packet_translate_remote(tcp_globals.net_phone,
    1218                     &packet, IPC_GET_PACKET(call)))) {
    1219                         ERROR_CODE = tcp_received_msg(IPC_GET_DEVICE(call),
    1220                             packet, SERVICE_TCP, IPC_GET_ERROR(call));
    1221                 }
    1222                 //fibril_rwlock_read_unlock(&tcp_globals.lock);
    1223                 return ERROR_CODE;
    1224 
     1234        switch (IPC_GET_IMETHOD(*call)) {
    12251235        case IPC_M_CONNECT_TO_ME:
    12261236                return tcp_process_client_messages(callid, *call);
     
    12301240}
    12311241
    1232 void tcp_refresh_socket_data(tcp_socket_data_ref socket_data)
     1242void tcp_refresh_socket_data(tcp_socket_data_t *socket_data)
    12331243{
    12341244        assert(socket_data);
     
    12461256}
    12471257
    1248 void tcp_initialize_socket_data(tcp_socket_data_ref socket_data)
     1258void tcp_initialize_socket_data(tcp_socket_data_t *socket_data)
    12491259{
    12501260        assert(socket_data);
     
    12611271        bool keep_on_going = true;
    12621272        socket_cores_t local_sockets;
    1263         int app_phone = IPC_GET_PHONE(&call);
     1273        int app_phone = IPC_GET_PHONE(call);
    12641274        struct sockaddr *addr;
    12651275        int socket_id;
     
    12681278        fibril_rwlock_t lock;
    12691279        ipc_call_t answer;
    1270         int answer_count;
    1271         tcp_socket_data_ref socket_data;
    1272         socket_core_ref socket;
    1273         packet_dimension_ref packet_dimension;
     1280        size_t answer_count;
     1281        tcp_socket_data_t *socket_data;
     1282        socket_core_t *socket;
     1283        packet_dimension_t *packet_dimension;
    12741284
    12751285        /*
     
    12851295        while (keep_on_going) {
    12861296
    1287                 // answer the call
     1297                /* Answer the call */
    12881298                answer_call(callid, res, &answer, answer_count);
    1289                 // refresh data
     1299                /* Refresh data */
    12901300                refresh_answer(&answer, &answer_count);
    1291                 // get the next call
     1301                /* Get the next call */
    12921302                callid = async_get_call(&call);
    12931303
    1294                 // process the call
    1295                 switch (IPC_GET_METHOD(call)) {
     1304                /* Process the call */
     1305                switch (IPC_GET_IMETHOD(call)) {
    12961306                case IPC_M_PHONE_HUNGUP:
    12971307                        keep_on_going = false;
     
    13011311                case NET_SOCKET:
    13021312                        socket_data =
    1303                             (tcp_socket_data_ref) malloc(sizeof(*socket_data));
     1313                            (tcp_socket_data_t *) malloc(sizeof(*socket_data));
    13041314                        if (!socket_data) {
    13051315                                res = ENOMEM;
     
    13351345
    13361346                case NET_SOCKET_BIND:
    1337                         res = data_receive((void **) &addr, &addrlen);
     1347                        res = async_data_write_accept((void **) &addr, false,
     1348                            0, 0, 0, &addrlen);
    13381349                        if (res != EOK)
    13391350                                break;
     
    13481359                                    SOCKET_GET_SOCKET_ID(call));
    13491360                                if (socket) {
    1350                                         socket_data = (tcp_socket_data_ref)
     1361                                        socket_data = (tcp_socket_data_t *)
    13511362                                            socket->specific_data;
    13521363                                        assert(socket_data);
     
    13721383
    13731384                case NET_SOCKET_CONNECT:
    1374                         res = data_receive((void **) &addr, &addrlen);
     1385                        res = async_data_write_accept((void **) &addr, false,
     1386                            0, 0, 0, &addrlen);
    13751387                        if (res != EOK)
    13761388                                break;
    1377                         // the global lock may be released in the
    1378                         // tcp_connect_message() function
     1389                        /*
     1390                         * The global lock may be released in the
     1391                         * tcp_connect_message() function.
     1392                         */
    13791393                        fibril_rwlock_write_lock(&tcp_globals.lock);
    13801394                        fibril_rwlock_write_lock(&lock);
     
    14211435
    14221436                case NET_SOCKET_SENDTO:
    1423                         res = data_receive((void **) &addr, &addrlen);
     1437                        res = async_data_write_accept((void **) &addr, false,
     1438                            0, 0, 0, &addrlen);
    14241439                        if (res != EOK)
    14251440                                break;
     
    14901505        }
    14911506
    1492         // release the application phone
    1493         ipc_hangup(app_phone);
     1507        /* Release the application phone */
     1508        async_hangup(app_phone);
    14941509
    14951510        printf("release\n");
    1496         // release all local sockets
     1511        /* Release all local sockets */
    14971512        socket_cores_release(tcp_globals.net_phone, &local_sockets,
    14981513            &tcp_globals.sockets, tcp_free_socket_data);
     
    15031518int tcp_timeout(void *data)
    15041519{
    1505         tcp_timeout_ref timeout = data;
     1520        tcp_timeout_t *timeout = data;
    15061521        int keep_write_lock = false;
    1507         socket_core_ref socket;
    1508         tcp_socket_data_ref socket_data;
     1522        socket_core_t *socket;
     1523        tcp_socket_data_t *socket_data;
    15091524
    15101525        assert(timeout);
    15111526
    1512         // sleep the given timeout
     1527        /* Sleep the given timeout */
    15131528        async_usleep(timeout->timeout);
    1514         // lock the globals
     1529        /* Lock the globals */
    15151530        if (timeout->globals_read_only)
    15161531                fibril_rwlock_read_lock(&tcp_globals.lock);
     
    15181533                fibril_rwlock_write_lock(&tcp_globals.lock);
    15191534
    1520         // find the pending operation socket
     1535        /* Find the pending operation socket */
    15211536        socket = socket_port_find(&tcp_globals.sockets, timeout->port,
    15221537            timeout->key, timeout->key_length);
    1523         if (!(socket && (socket->socket_id == timeout->socket_id)))
     1538        if (!socket || (socket->socket_id != timeout->socket_id))
    15241539                goto out;
    15251540       
    1526         socket_data = (tcp_socket_data_ref) socket->specific_data;
     1541        socket_data = (tcp_socket_data_t *) socket->specific_data;
    15271542        assert(socket_data);
    15281543        if (socket_data->local_sockets != timeout->local_sockets)
     
    15311546        fibril_rwlock_write_lock(socket_data->local_lock);
    15321547        if (timeout->sequence_number) {
    1533                 // increase the timeout counter;
    1534                 ++socket_data->timeout_count;
     1548                /* Increase the timeout counter */
     1549                socket_data->timeout_count++;
    15351550                if (socket_data->timeout_count == TCP_MAX_TIMEOUTS) {
    1536                         // TODO release as connection lost
     1551                        /* TODO release as connection lost */
    15371552                        //tcp_refresh_socket_data(socket_data);
    15381553                        fibril_rwlock_write_unlock(socket_data->local_lock);
    15391554                } else {
    1540                         // retransmit
     1555                        /* Retransmit */
    15411556//                      tcp_retransmit_packet(socket,
    15421557//                          socket_data, timeout->sequence_number);
     
    15451560        } else {
    15461561                fibril_mutex_lock(&socket_data->operation.mutex);
    1547                 // set the timeout operation result if state not
    1548                 // changed
     1562                /* Set the timeout operation result if state not changed */
    15491563                if (socket_data->state == timeout->state) {
    15501564                        socket_data->operation.result = ETIMEOUT;
    1551                         // notify the main fibril
     1565
     1566                        /* Notify the main fibril */
    15521567                        fibril_condvar_signal(&socket_data->operation.condvar);
    1553                         // keep the global write lock
     1568
     1569                        /* Keep the global write lock */
    15541570                        keep_write_lock = true;
    15551571                } else {
    1556                         // operation is ok, do nothing
    1557                         // unlocking from now on, so the unlocki
    1558                         // order does not matter...
     1572                        /*
     1573                         * Operation is ok, do nothing.
     1574                         * Unlocking from now on, so the unlocking
     1575                         * order does not matter.
     1576                         */
    15591577                        fibril_rwlock_write_unlock(socket_data->local_lock);
    15601578                }
     
    15631581
    15641582out:
    1565         // unlock only if no socket
     1583        /* Unlock only if no socket */
    15661584        if (timeout->globals_read_only)
    15671585                fibril_rwlock_read_unlock(&tcp_globals.lock);
    15681586        else if (!keep_write_lock)
    1569                 // release if not desired
     1587                /* Release if not desired */
    15701588                fibril_rwlock_write_unlock(&tcp_globals.lock);
    15711589       
    1572         // release the timeout structure
     1590        /* Release the timeout structure */
    15731591        free(timeout);
    15741592        return EOK;
     
    15771595int tcp_release_after_timeout(void *data)
    15781596{
    1579         tcp_timeout_ref timeout = data;
    1580         socket_core_ref socket;
    1581         tcp_socket_data_ref socket_data;
     1597        tcp_timeout_t *timeout = data;
     1598        socket_core_t *socket;
     1599        tcp_socket_data_t *socket_data;
    15821600        fibril_rwlock_t *local_lock;
    15831601
    15841602        assert(timeout);
    15851603
    1586         // sleep the given timeout
     1604        /* Sleep the given timeout */
    15871605        async_usleep(timeout->timeout);
    1588         // lock the globals
     1606
     1607        /* Lock the globals */
    15891608        fibril_rwlock_write_lock(&tcp_globals.lock);
    1590         // find the pending operation socket
     1609
     1610        /* Find the pending operation socket */
    15911611        socket = socket_port_find(&tcp_globals.sockets, timeout->port,
    15921612            timeout->key, timeout->key_length);
     1613
    15931614        if (socket && (socket->socket_id == timeout->socket_id)) {
    1594                 socket_data = (tcp_socket_data_ref) socket->specific_data;
     1615                socket_data = (tcp_socket_data_t *) socket->specific_data;
    15951616                assert(socket_data);
    15961617                if (socket_data->local_sockets == timeout->local_sockets) {
     
    16031624                }
    16041625        }
    1605         // unlock the globals
     1626
     1627        /* Unlock the globals */
    16061628        fibril_rwlock_write_unlock(&tcp_globals.lock);
    1607         // release the timeout structure
     1629
     1630        /* Release the timeout structure */
    16081631        free(timeout);
     1632
    16091633        return EOK;
    16101634}
    16111635
    1612 void
    1613 tcp_retransmit_packet(socket_core_ref socket, tcp_socket_data_ref socket_data,
    1614     size_t sequence_number)
    1615 {
    1616         packet_t packet;
    1617         packet_t copy;
     1636void tcp_retransmit_packet(socket_core_t *socket, tcp_socket_data_t *
     1637    socket_data, size_t sequence_number)
     1638{
     1639        packet_t *packet;
     1640        packet_t *copy;
    16181641        size_t data_length;
    16191642
     
    16221645        assert(socket->specific_data == socket_data);
    16231646
    1624         // sent packet?
     1647        /* Sent packet? */
    16251648        packet = pq_find(socket_data->outgoing, sequence_number);
    16261649        printf("retransmit %d\n", packet_get_id(packet));
     
    16381661}
    16391662
    1640 int
    1641 tcp_listen_message(socket_cores_ref local_sockets, int socket_id, int backlog)
    1642 {
    1643         socket_core_ref socket;
    1644         tcp_socket_data_ref socket_data;
     1663int tcp_listen_message(socket_cores_t *local_sockets, int socket_id,
     1664    int backlog)
     1665{
     1666        socket_core_t *socket;
     1667        tcp_socket_data_t *socket_data;
    16451668
    16461669        assert(local_sockets);
     
    16491672                return EINVAL;
    16501673
    1651         // find the socket
     1674        /* Find the socket */
    16521675        socket = socket_cores_find(local_sockets, socket_id);
    16531676        if (!socket)
    16541677                return ENOTSOCK;
    16551678       
    1656         // get the socket specific data
    1657         socket_data = (tcp_socket_data_ref) socket->specific_data;
     1679        /* Get the socket specific data */
     1680        socket_data = (tcp_socket_data_t *) socket->specific_data;
    16581681        assert(socket_data);
    1659         // set the backlog
     1682
     1683        /* Set the backlog */
    16601684        socket_data->backlog = backlog;
    16611685
     
    16631687}
    16641688
    1665 int
    1666 tcp_connect_message(socket_cores_ref local_sockets, int socket_id,
     1689int tcp_connect_message(socket_cores_t *local_sockets, int socket_id,
    16671690    struct sockaddr *addr, socklen_t addrlen)
    16681691{
    1669         ERROR_DECLARE;
    1670 
    1671         socket_core_ref socket;
     1692        socket_core_t *socket;
     1693        int rc;
    16721694
    16731695        assert(local_sockets);
     
    16751697        assert(addrlen > 0);
    16761698
    1677         // find the socket
     1699        /* Find the socket */
    16781700        socket = socket_cores_find(local_sockets, socket_id);
    16791701        if (!socket)
    16801702                return ENOTSOCK;
    16811703       
    1682         if (ERROR_OCCURRED(tcp_connect_core(socket, local_sockets, addr,
    1683             addrlen))) {
     1704        rc = tcp_connect_core(socket, local_sockets, addr, addrlen);
     1705        if (rc != EOK) {
    16841706                tcp_free_socket_data(socket);
    1685                 // unbind if bound
     1707                /* Unbind if bound */
    16861708                if (socket->port > 0) {
    16871709                        socket_ports_exclude(&tcp_globals.sockets,
    1688                             socket->port);
     1710                            socket->port, free);
    16891711                        socket->port = 0;
    16901712                }
    16911713        }
    1692         return ERROR_CODE;
    1693 }
    1694 
    1695 int
    1696 tcp_connect_core(socket_core_ref socket, socket_cores_ref local_sockets,
     1714        return rc;
     1715}
     1716
     1717int tcp_connect_core(socket_core_t *socket, socket_cores_t *local_sockets,
    16971718    struct sockaddr *addr, socklen_t addrlen)
    16981719{
    1699         ERROR_DECLARE;
    1700 
    1701         tcp_socket_data_ref socket_data;
    1702         packet_t packet;
     1720        tcp_socket_data_t *socket_data;
     1721        packet_t *packet;
     1722        int rc;
    17031723
    17041724        assert(socket);
     
    17061726        assert(addrlen > 0);
    17071727
    1708         // get the socket specific data
    1709         socket_data = (tcp_socket_data_ref) socket->specific_data;
     1728        /* Get the socket specific data */
     1729        socket_data = (tcp_socket_data_t *) socket->specific_data;
    17101730        assert(socket_data);
    17111731        assert(socket->specific_data == socket_data);
     
    17151735                return EINVAL;
    17161736
    1717         // get the destination port
    1718         ERROR_PROPAGATE(tl_get_address_port(addr, addrlen,
    1719             &socket_data->dest_port));
     1737        /* Get the destination port */
     1738        rc = tl_get_address_port(addr, addrlen, &socket_data->dest_port);
     1739        if (rc != EOK)
     1740                return rc;
     1741       
    17201742        if (socket->port <= 0) {
    1721                 // try to find a free port
    1722                 ERROR_PROPAGATE(socket_bind_free_port(&tcp_globals.sockets,
    1723                     socket, TCP_FREE_PORTS_START, TCP_FREE_PORTS_END,
    1724                     tcp_globals.last_used_port));
    1725                 // set the next port as the search starting port number
     1743                /* Try to find a free port */
     1744                rc = socket_bind_free_port(&tcp_globals.sockets, socket,
     1745                    TCP_FREE_PORTS_START, TCP_FREE_PORTS_END,
     1746                    tcp_globals.last_used_port);
     1747                if (rc != EOK)
     1748                        return rc;
     1749                /* Set the next port as the search starting port number */
    17261750                tcp_globals.last_used_port = socket->port;
    17271751        }
    17281752
    1729         ERROR_PROPAGATE(ip_get_route_req(tcp_globals.ip_phone, IPPROTO_TCP,
     1753        rc = ip_get_route_req(tcp_globals.ip_phone, IPPROTO_TCP,
    17301754            addr, addrlen, &socket_data->device_id,
    1731             &socket_data->pseudo_header, &socket_data->headerlen));
    1732 
    1733         // create the notification packet
    1734         ERROR_PROPAGATE(tcp_create_notification_packet(&packet, socket,
    1735             socket_data, 1, 0));
    1736 
    1737         // unlock the globals and wait for an operation
     1755            &socket_data->pseudo_header, &socket_data->headerlen);
     1756        if (rc != EOK)
     1757                return rc;
     1758
     1759        /* Create the notification packet */
     1760        rc = tcp_create_notification_packet(&packet, socket, socket_data, 1, 0);
     1761        if (rc != EOK)
     1762                return rc;
     1763
     1764        /* Unlock the globals and wait for an operation */
    17381765        fibril_rwlock_write_unlock(&tcp_globals.lock);
    17391766
    17401767        socket_data->addr = addr;
    17411768        socket_data->addrlen = addrlen;
    1742         // send the packet
    1743         if (ERROR_OCCURRED(tcp_queue_packet(socket, socket_data, packet, 1)) ||
    1744             ERROR_OCCURRED(tcp_prepare_timeout(tcp_timeout, socket, socket_data,
    1745             0, TCP_SOCKET_INITIAL, NET_DEFAULT_TCP_INITIAL_TIMEOUT, false))) {
    1746 
     1769
     1770        /* Send the packet */
     1771
     1772        if (((rc = tcp_queue_packet(socket, socket_data, packet, 1)) != EOK) ||
     1773            ((rc = tcp_prepare_timeout(tcp_timeout, socket, socket_data, 0,
     1774            TCP_SOCKET_INITIAL, NET_DEFAULT_TCP_INITIAL_TIMEOUT, false)) !=
     1775            EOK)) {
    17471776                socket_data->addr = NULL;
    17481777                socket_data->addrlen = 0;
    17491778                fibril_rwlock_write_lock(&tcp_globals.lock);
    1750 
    17511779        } else {
    1752 
    17531780                packet = tcp_get_packets_to_send(socket, socket_data);
    17541781                if (packet) {
    17551782                        fibril_mutex_lock(&socket_data->operation.mutex);
    17561783                        fibril_rwlock_write_unlock(socket_data->local_lock);
    1757                         // send the packet
     1784
     1785                        socket_data->state = TCP_SOCKET_SYN_SENT;
     1786
     1787                        /* Send the packet */
    17581788                        printf("connecting %d\n", packet_get_id(packet));
    17591789                        tcp_send_packets(socket_data->device_id, packet);
    17601790
    1761                         // wait for a reply
     1791                        /* Wait for a reply */
    17621792                        fibril_condvar_wait(&socket_data->operation.condvar,
    17631793                            &socket_data->operation.mutex);
    1764                         ERROR_CODE = socket_data->operation.result;
    1765                         if (ERROR_CODE != EOK) {
     1794                        rc = socket_data->operation.result;
     1795                        if (rc != EOK) {
    17661796                                socket_data->addr = NULL;
    17671797                                socket_data->addrlen = 0;
     
    17701800                        socket_data->addr = NULL;
    17711801                        socket_data->addrlen = 0;
    1772                         ERROR_CODE = EINTR;
     1802                        rc = EINTR;
    17731803                }
    17741804        }
    17751805
    17761806        fibril_mutex_unlock(&socket_data->operation.mutex);
    1777 
    1778         // return the result
    1779         return ERROR_CODE;
    1780 }
    1781 
    1782 int
    1783 tcp_queue_prepare_packet(socket_core_ref socket,
    1784     tcp_socket_data_ref socket_data, packet_t packet, size_t data_length)
    1785 {
    1786         ERROR_DECLARE;
    1787 
    1788         tcp_header_ref header;
     1807        return rc;
     1808}
     1809
     1810int tcp_queue_prepare_packet(socket_core_t *socket,
     1811    tcp_socket_data_t *socket_data, packet_t *packet, size_t data_length)
     1812{
     1813        tcp_header_t *header;
     1814        int rc;
    17891815
    17901816        assert(socket);
     
    17921818        assert(socket->specific_data == socket_data);
    17931819
    1794         // get tcp header
    1795         header = (tcp_header_ref) packet_get_data(packet);
     1820        /* Get TCP header */
     1821        header = (tcp_header_t *) packet_get_data(packet);
    17961822        if (!header)
    17971823                return NO_DATA;
     
    18011827        header->sequence_number = htonl(socket_data->next_outgoing);
    18021828
    1803         if (ERROR_OCCURRED(packet_set_addr(packet, NULL,
    1804             (uint8_t *) socket_data->addr, socket_data->addrlen)))
     1829        rc = packet_set_addr(packet, NULL, (uint8_t *) socket_data->addr,
     1830            socket_data->addrlen);
     1831        if (rc != EOK)
    18051832                return tcp_release_and_return(packet, EINVAL);
    18061833
    1807         // remember the outgoing FIN
     1834        /* Remember the outgoing FIN */
    18081835        if (header->finalize)
    18091836                socket_data->fin_outgoing = socket_data->next_outgoing;
     
    18121839}
    18131840
    1814 int
    1815 tcp_queue_packet(socket_core_ref socket, tcp_socket_data_ref socket_data,
    1816     packet_t packet, size_t data_length)
    1817 {
    1818         ERROR_DECLARE;
     1841int tcp_queue_packet(socket_core_t *socket, tcp_socket_data_t *socket_data,
     1842    packet_t *packet, size_t data_length)
     1843{
     1844        int rc;
    18191845
    18201846        assert(socket);
     
    18221848        assert(socket->specific_data == socket_data);
    18231849
    1824         ERROR_PROPAGATE(tcp_queue_prepare_packet(socket, socket_data, packet,
    1825             data_length));
    1826 
    1827         if (ERROR_OCCURRED(pq_add(&socket_data->outgoing, packet,
    1828             socket_data->next_outgoing, data_length)))
    1829                 return tcp_release_and_return(packet, ERROR_CODE);
     1850        rc = tcp_queue_prepare_packet(socket, socket_data, packet, data_length);
     1851        if (rc != EOK)
     1852                return rc;
     1853
     1854        rc = pq_add(&socket_data->outgoing, packet, socket_data->next_outgoing,
     1855            data_length);
     1856        if (rc != EOK)
     1857                return tcp_release_and_return(packet, rc);
    18301858
    18311859        socket_data->next_outgoing += data_length;
     
    18331861}
    18341862
    1835 packet_t
    1836 tcp_get_packets_to_send(socket_core_ref socket, tcp_socket_data_ref socket_data)
    1837 {
    1838         ERROR_DECLARE;
    1839 
    1840         packet_t packet;
    1841         packet_t copy;
    1842         packet_t sending = NULL;
    1843         packet_t previous = NULL;
     1863packet_t *tcp_get_packets_to_send(socket_core_t *socket, tcp_socket_data_t *
     1864    socket_data)
     1865{
     1866        packet_t *packet;
     1867        packet_t *copy;
     1868        packet_t *sending = NULL;
     1869        packet_t *previous = NULL;
    18441870        size_t data_length;
     1871        int rc;
    18451872
    18461873        assert(socket);
     
    18521879                pq_get_order(packet, NULL, &data_length);
    18531880
    1854                 // send only if fits into the window
    1855                 // respecting the possible overflow
     1881                /*
     1882                 * Send only if fits into the window, respecting the possible
     1883                 * overflow.
     1884                 */
    18561885                if (!IS_IN_INTERVAL_OVERFLOW(
    18571886                    (uint32_t) socket_data->last_outgoing,
     
    18671896                if (!sending) {
    18681897                        sending = copy;
    1869                 } else if (ERROR_OCCURRED(pq_insert_after(previous, copy))) {
    1870                         pq_release_remote(tcp_globals.net_phone,
    1871                             packet_get_id(copy));
    1872                         return sending;
     1898                } else {
     1899                        rc = pq_insert_after(previous, copy);
     1900                        if (rc != EOK) {
     1901                                pq_release_remote(tcp_globals.net_phone,
     1902                                    packet_get_id(copy));
     1903                                return sending;
     1904                        }
    18731905                }
    18741906
    18751907                previous = copy;
    18761908                packet = pq_next(packet);
    1877                 // overflow occurred ?
    1878                 if ((!packet) &&
     1909
     1910                /* Overflow occurred? */
     1911                if (!packet &&
    18791912                    (socket_data->last_outgoing > socket_data->next_outgoing)) {
    18801913                        printf("gpts overflow\n");
    1881                         // continue from the beginning
     1914                        /* Continue from the beginning */
    18821915                        packet = socket_data->outgoing;
    18831916                }
     
    18881921}
    18891922
    1890 packet_t
    1891 tcp_send_prepare_packet(socket_core_ref socket, tcp_socket_data_ref socket_data,
    1892     packet_t packet, size_t data_length, size_t sequence_number)
    1893 {
    1894         ERROR_DECLARE;
    1895 
    1896         tcp_header_ref header;
     1923packet_t *tcp_send_prepare_packet(socket_core_t *socket, tcp_socket_data_t *
     1924    socket_data, packet_t *packet, size_t data_length, size_t sequence_number)
     1925{
     1926        tcp_header_t *header;
    18971927        uint32_t checksum;
     1928        int rc;
    18981929
    18991930        assert(socket);
     
    19011932        assert(socket->specific_data == socket_data);
    19021933
    1903         // adjust the pseudo header
    1904         if (ERROR_OCCURRED(ip_client_set_pseudo_header_data_length(
    1905             socket_data->pseudo_header, socket_data->headerlen,
    1906             packet_get_data_length(packet)))) {
     1934        /* Adjust the pseudo header */
     1935        rc = ip_client_set_pseudo_header_data_length(socket_data->pseudo_header,
     1936            socket_data->headerlen, packet_get_data_length(packet));
     1937        if (rc != EOK) {
    19071938                pq_release_remote(tcp_globals.net_phone, packet_get_id(packet));
    19081939                return NULL;
    19091940        }
    19101941
    1911         // get the header
    1912         header = (tcp_header_ref) packet_get_data(packet);
     1942        /* Get the header */
     1943        header = (tcp_header_t *) packet_get_data(packet);
    19131944        if (!header) {
    19141945                pq_release_remote(tcp_globals.net_phone, packet_get_id(packet));
     
    19171948        assert(ntohl(header->sequence_number) == sequence_number);
    19181949
    1919         // adjust the header
     1950        /* Adjust the header */
    19201951        if (socket_data->next_incoming) {
    19211952                header->acknowledgement_number =
     
    19251956        header->window = htons(socket_data->window);
    19261957
    1927         // checksum
     1958        /* Checksum */
    19281959        header->checksum = 0;
    19291960        checksum = compute_checksum(0, socket_data->pseudo_header,
    19301961            socket_data->headerlen);
    1931         checksum = compute_checksum(checksum, (uint8_t *) packet_get_data(packet),
     1962        checksum = compute_checksum(checksum,
     1963            (uint8_t *) packet_get_data(packet),
    19321964            packet_get_data_length(packet));
    19331965        header->checksum = htons(flip_checksum(compact_checksum(checksum)));
    19341966
    1935         // prepare the packet
    1936         if (ERROR_OCCURRED(ip_client_prepare_packet(packet, IPPROTO_TCP, 0, 0,
    1937             0, 0)) || ERROR_OCCURRED(tcp_prepare_timeout(tcp_timeout, socket,
    1938             socket_data, sequence_number, socket_data->state,
    1939             socket_data->timeout, true))) {
     1967        /* Prepare the packet */
     1968        rc = ip_client_prepare_packet(packet, IPPROTO_TCP, 0, 0, 0, 0);
     1969        if (rc != EOK) {
    19401970                pq_release_remote(tcp_globals.net_phone, packet_get_id(packet));
    19411971                return NULL;
    19421972        }
    19431973
     1974        rc = tcp_prepare_timeout(tcp_timeout, socket, socket_data,
     1975            sequence_number, socket_data->state, socket_data->timeout, true);
     1976        if (rc != EOK) {
     1977                pq_release_remote(tcp_globals.net_phone, packet_get_id(packet));
     1978                return NULL;
     1979        }
     1980
    19441981        return packet;
    19451982}
    19461983
    1947 packet_t
    1948 tcp_prepare_copy(socket_core_ref socket, tcp_socket_data_ref socket_data,
    1949     packet_t packet, size_t data_length, size_t sequence_number)
    1950 {
    1951         packet_t copy;
     1984packet_t *tcp_prepare_copy(socket_core_t *socket, tcp_socket_data_t *
     1985    socket_data, packet_t *packet, size_t data_length, size_t sequence_number)
     1986{
     1987        packet_t *copy;
    19521988
    19531989        assert(socket);
     
    19551991        assert(socket->specific_data == socket_data);
    19561992
    1957         // make a copy of the packet
     1993        /* Make a copy of the packet */
    19581994        copy = packet_get_copy(tcp_globals.net_phone, packet);
    19591995        if (!copy)
     
    19642000}
    19652001
    1966 void tcp_send_packets(device_id_t device_id, packet_t packet)
    1967 {
    1968         packet_t next;
     2002void tcp_send_packets(device_id_t device_id, packet_t *packet)
     2003{
     2004        packet_t *next;
    19692005
    19702006        while (packet) {
     
    19762012}
    19772013
    1978 void
    1979 tcp_prepare_operation_header(socket_core_ref socket,
    1980     tcp_socket_data_ref socket_data, tcp_header_ref header, int synchronize,
     2014void tcp_prepare_operation_header(socket_core_t *socket,
     2015    tcp_socket_data_t *socket_data, tcp_header_t *header, int synchronize,
    19812016    int finalize)
    19822017{
     
    19942029}
    19952030
    1996 int
    1997 tcp_prepare_timeout(int (*timeout_function)(void *tcp_timeout_t),
    1998     socket_core_ref socket, tcp_socket_data_ref socket_data,
     2031int tcp_prepare_timeout(int (*timeout_function)(void *tcp_timeout_t),
     2032    socket_core_t *socket, tcp_socket_data_t *socket_data,
    19992033    size_t sequence_number, tcp_socket_state_t state, suseconds_t timeout,
    20002034    int globals_read_only)
    20012035{
    2002         tcp_timeout_ref operation_timeout;
     2036        tcp_timeout_t *operation_timeout;
    20032037        fid_t fibril;
    20042038
     
    20072041        assert(socket->specific_data == socket_data);
    20082042
    2009         // prepare the timeout with key bundle structure
     2043        /* Prepare the timeout with key bundle structure */
    20102044        operation_timeout = malloc(sizeof(*operation_timeout) +
    20112045            socket->key_length + 1);
     
    20222056        operation_timeout->state = state;
    20232057
    2024         // copy the key
    2025         operation_timeout->key = ((char *) operation_timeout) +
     2058        /* Copy the key */
     2059        operation_timeout->key = ((uint8_t *) operation_timeout) +
    20262060            sizeof(*operation_timeout);
    20272061        operation_timeout->key_length = socket->key_length;
     
    20292063        operation_timeout->key[operation_timeout->key_length] = '\0';
    20302064
    2031         // prepare the timeouting thread
     2065        /* Prepare the timeouting thread */
    20322066        fibril = fibril_create(timeout_function, operation_timeout);
    20332067        if (!fibril) {
    20342068                free(operation_timeout);
    2035                 return EPARTY;  /* FIXME: use another EC */
    2036         }
     2069                return ENOMEM;
     2070        }
     2071
    20372072//      fibril_mutex_lock(&socket_data->operation.mutex);
    2038         // start the timeouting fibril
     2073        /* Start the timeout fibril */
    20392074        fibril_add_ready(fibril);
    20402075        //socket_data->state = state;
     
    20422077}
    20432078
    2044 int
    2045 tcp_recvfrom_message(socket_cores_ref local_sockets, int socket_id, int flags,
    2046     size_t * addrlen)
    2047 {
    2048         ERROR_DECLARE;
    2049 
    2050         socket_core_ref socket;
    2051         tcp_socket_data_ref socket_data;
     2079int tcp_recvfrom_message(socket_cores_t *local_sockets, int socket_id,
     2080    int flags, size_t *addrlen)
     2081{
     2082        socket_core_t *socket;
     2083        tcp_socket_data_t *socket_data;
    20522084        int packet_id;
    2053         packet_t packet;
     2085        packet_t *packet;
    20542086        size_t length;
     2087        int rc;
    20552088
    20562089        assert(local_sockets);
    20572090
    2058         // find the socket
     2091        /* Find the socket */
    20592092        socket = socket_cores_find(local_sockets, socket_id);
    20602093        if (!socket)
    20612094                return ENOTSOCK;
    20622095
    2063         // get the socket specific data
     2096        /* Get the socket specific data */
    20642097        if (!socket->specific_data)
    20652098                return NO_DATA;
    20662099
    2067         socket_data = (tcp_socket_data_ref) socket->specific_data;
    2068 
    2069         // check state
     2100        socket_data = (tcp_socket_data_t *) socket->specific_data;
     2101
     2102        /* Check state */
    20702103        if ((socket_data->state != TCP_SOCKET_ESTABLISHED) &&
    20712104            (socket_data->state != TCP_SOCKET_CLOSE_WAIT))
    20722105                return ENOTCONN;
    20732106
    2074         // send the source address if desired
     2107        /* Send the source address if desired */
    20752108        if (addrlen) {
    2076                 ERROR_PROPAGATE(data_reply(socket_data->addr,
    2077                     socket_data->addrlen));
     2109                rc = data_reply(socket_data->addr, socket_data->addrlen);
     2110                if (rc != EOK)
     2111                        return rc;
    20782112                *addrlen = socket_data->addrlen;
    20792113        }
    20802114
    2081         // get the next received packet
     2115        /* Get the next received packet */
    20822116        packet_id = dyn_fifo_value(&socket->received);
    20832117        if (packet_id < 0)
    20842118                return NO_DATA;
    20852119
    2086         ERROR_PROPAGATE(packet_translate_remote(tcp_globals.net_phone, &packet,
    2087             packet_id));
    2088 
    2089         // reply the packets
    2090         ERROR_PROPAGATE(socket_reply_packets(packet, &length));
    2091 
    2092         // release the packet
     2120        rc = packet_translate_remote(tcp_globals.net_phone, &packet, packet_id);
     2121        if (rc != EOK)
     2122                return rc;
     2123
     2124        /* Reply the packets */
     2125        rc = socket_reply_packets(packet, &length);
     2126        if (rc != EOK)
     2127                return rc;
     2128
     2129        /* Release the packet */
    20932130        dyn_fifo_pop(&socket->received);
    20942131        pq_release_remote(tcp_globals.net_phone, packet_get_id(packet));
    2095         // return the total length
     2132
     2133        /* Return the total length */
    20962134        return (int) length;
    20972135}
    20982136
    2099 int
    2100 tcp_send_message(socket_cores_ref local_sockets, int socket_id, int fragments,
    2101     size_t * data_fragment_size, int flags)
    2102 {
    2103         ERROR_DECLARE;
    2104 
    2105         socket_core_ref socket;
    2106         tcp_socket_data_ref socket_data;
    2107         packet_dimension_ref packet_dimension;
    2108         packet_t packet;
     2137int tcp_send_message(socket_cores_t *local_sockets, int socket_id,
     2138    int fragments, size_t *data_fragment_size, int flags)
     2139{
     2140        socket_core_t *socket;
     2141        tcp_socket_data_t *socket_data;
     2142        packet_dimension_t *packet_dimension;
     2143        packet_t *packet;
    21092144        size_t total_length;
    2110         tcp_header_ref header;
     2145        tcp_header_t *header;
    21112146        int index;
    21122147        int result;
     2148        int rc;
    21132149
    21142150        assert(local_sockets);
    21152151        assert(data_fragment_size);
    21162152
    2117         // find the socket
     2153        /* Find the socket */
    21182154        socket = socket_cores_find(local_sockets, socket_id);
    21192155        if (!socket)
    21202156                return ENOTSOCK;
    21212157
    2122         // get the socket specific data
     2158        /* Get the socket specific data */
    21232159        if (!socket->specific_data)
    21242160                return NO_DATA;
    21252161
    2126         socket_data = (tcp_socket_data_ref) socket->specific_data;
    2127 
    2128         // check state
     2162        socket_data = (tcp_socket_data_t *) socket->specific_data;
     2163
     2164        /* Check state */
    21292165        if ((socket_data->state != TCP_SOCKET_ESTABLISHED) &&
    21302166            (socket_data->state != TCP_SOCKET_CLOSE_WAIT))
    21312167                return ENOTCONN;
    21322168
    2133         ERROR_PROPAGATE(tl_get_ip_packet_dimension(tcp_globals.ip_phone,
    2134            &tcp_globals.dimensions, socket_data->device_id, &packet_dimension));
     2169        rc = tl_get_ip_packet_dimension(tcp_globals.ip_phone,
     2170            &tcp_globals.dimensions, socket_data->device_id, &packet_dimension);
     2171        if (rc != EOK)
     2172                return rc;
    21352173
    21362174        *data_fragment_size =
     
    21382176            packet_dimension->content : socket_data->data_fragment_size);
    21392177
    2140         for (index = 0; index < fragments; ++index) {
    2141                 // read the data fragment
     2178        for (index = 0; index < fragments; index++) {
     2179                /* Read the data fragment */
    21422180                result = tl_socket_read_packet_data(tcp_globals.net_phone,
    21432181                    &packet, TCP_HEADER_SIZE, packet_dimension,
     
    21472185
    21482186                total_length = (size_t) result;
    2149                 // prefix the tcp header
     2187
     2188                /* Prefix the TCP header */
    21502189                header = PACKET_PREFIX(packet, tcp_header_t);
    21512190                if (!header)
     
    21532192
    21542193                tcp_prepare_operation_header(socket, socket_data, header, 0, 0);
    2155                 ERROR_PROPAGATE(tcp_queue_packet(socket, socket_data, packet,
    2156                     0));
    2157         }
    2158 
    2159         // flush packets
     2194                rc = tcp_queue_packet(socket, socket_data, packet, total_length);
     2195                if (rc != EOK)
     2196                        return rc;
     2197        }
     2198
     2199        /* Flush packets */
    21602200        packet = tcp_get_packets_to_send(socket, socket_data);
    21612201        fibril_rwlock_write_unlock(socket_data->local_lock);
     
    21632203
    21642204        if (packet) {
    2165                 // send the packet
     2205                /* Send the packet */
    21662206                tcp_send_packets(socket_data->device_id, packet);
    21672207        }
     
    21712211
    21722212int
    2173 tcp_close_message(socket_cores_ref local_sockets, int socket_id)
    2174 {
    2175         ERROR_DECLARE;
    2176 
    2177         socket_core_ref socket;
    2178         tcp_socket_data_ref socket_data;
    2179         packet_t packet;
    2180 
    2181         // find the socket
     2213tcp_close_message(socket_cores_t *local_sockets, int socket_id)
     2214{
     2215        socket_core_t *socket;
     2216        tcp_socket_data_t *socket_data;
     2217        packet_t *packet;
     2218        int rc;
     2219
     2220        /* Find the socket */
    21822221        socket = socket_cores_find(local_sockets, socket_id);
    21832222        if (!socket)
    21842223                return ENOTSOCK;
    21852224
    2186         // get the socket specific data
    2187         socket_data = (tcp_socket_data_ref) socket->specific_data;
     2225        /* Get the socket specific data */
     2226        socket_data = (tcp_socket_data_t *) socket->specific_data;
    21882227        assert(socket_data);
    21892228
    2190         // check state
     2229        /* Check state */
    21912230        switch (socket_data->state) {
    21922231        case TCP_SOCKET_ESTABLISHED:
     
    22012240
    22022241        default:
    2203                 // just destroy
    2204                 if (ERROR_NONE(socket_destroy(tcp_globals.net_phone, socket_id,
     2242                /* Just destroy */
     2243                rc = socket_destroy(tcp_globals.net_phone, socket_id,
    22052244                    local_sockets, &tcp_globals.sockets,
    2206                     tcp_free_socket_data))) {
     2245                    tcp_free_socket_data);
     2246                if (rc == EOK) {
    22072247                        fibril_rwlock_write_unlock(socket_data->local_lock);
    22082248                        fibril_rwlock_write_unlock(&tcp_globals.lock);
    22092249                }
    2210                 return ERROR_CODE;
    2211         }
    2212 
    2213         // send FIN
    2214         // TODO should I wait to complete?
    2215 
    2216         // create the notification packet
    2217         ERROR_PROPAGATE(tcp_create_notification_packet(&packet, socket,
    2218             socket_data, 0, 1));
    2219 
    2220         // send the packet
    2221         ERROR_PROPAGATE(tcp_queue_packet(socket, socket_data, packet, 1));
    2222 
    2223         // flush packets
     2250                return rc;
     2251        }
     2252
     2253        /*
     2254         * Send FIN.
     2255         * TODO should I wait to complete?
     2256         */
     2257
     2258        /* Create the notification packet */
     2259        rc = tcp_create_notification_packet(&packet, socket, socket_data, 0, 1);
     2260        if (rc != EOK)
     2261                return rc;
     2262
     2263        /* Send the packet */
     2264        rc = tcp_queue_packet(socket, socket_data, packet, 1);
     2265        if (rc != EOK)
     2266                return rc;
     2267
     2268        /* Flush packets */
    22242269        packet = tcp_get_packets_to_send(socket, socket_data);
    22252270        fibril_rwlock_write_unlock(socket_data->local_lock);
     
    22272272
    22282273        if (packet) {
    2229                 // send the packet
     2274                /* Send the packet */
    22302275                tcp_send_packets(socket_data->device_id, packet);
    22312276        }
     
    22342279}
    22352280
    2236 int
    2237 tcp_create_notification_packet(packet_t * packet, socket_core_ref socket,
    2238     tcp_socket_data_ref socket_data, int synchronize, int finalize)
    2239 {
    2240         ERROR_DECLARE;
    2241 
    2242         packet_dimension_ref packet_dimension;
    2243         tcp_header_ref header;
     2281int tcp_create_notification_packet(packet_t **packet, socket_core_t *socket,
     2282    tcp_socket_data_t *socket_data, int synchronize, int finalize)
     2283{
     2284        packet_dimension_t *packet_dimension;
     2285        tcp_header_t *header;
     2286        int rc;
    22442287
    22452288        assert(packet);
    22462289
    2247         // get the device packet dimension
    2248         ERROR_PROPAGATE(tl_get_ip_packet_dimension(tcp_globals.ip_phone,
    2249             &tcp_globals.dimensions, socket_data->device_id,
    2250             &packet_dimension));
    2251 
    2252         // get a new packet
     2290        /* Get the device packet dimension */
     2291        rc = tl_get_ip_packet_dimension(tcp_globals.ip_phone,
     2292            &tcp_globals.dimensions, socket_data->device_id, &packet_dimension);
     2293        if (rc != EOK)
     2294                return rc;
     2295
     2296        /* Get a new packet */
    22532297        *packet = packet_get_4_remote(tcp_globals.net_phone, TCP_HEADER_SIZE,
    22542298            packet_dimension->addr_len, packet_dimension->prefix,
     
    22582302                return ENOMEM;
    22592303
    2260         // allocate space in the packet
     2304        /* Allocate space in the packet */
    22612305        header = PACKET_SUFFIX(*packet, tcp_header_t);
    22622306        if (!header)
     
    22692313}
    22702314
    2271 int
    2272 tcp_accept_message(socket_cores_ref local_sockets, int socket_id,
    2273     int new_socket_id, size_t * data_fragment_size, size_t * addrlen)
    2274 {
    2275         ERROR_DECLARE;
    2276 
    2277         socket_core_ref accepted;
    2278         socket_core_ref socket;
    2279         tcp_socket_data_ref socket_data;
    2280         packet_dimension_ref packet_dimension;
     2315int tcp_accept_message(socket_cores_t *local_sockets, int socket_id,
     2316    int new_socket_id, size_t *data_fragment_size, size_t *addrlen)
     2317{
     2318        socket_core_t *accepted;
     2319        socket_core_t *socket;
     2320        tcp_socket_data_t *socket_data;
     2321        packet_dimension_t *packet_dimension;
     2322        int rc;
    22812323
    22822324        assert(local_sockets);
     
    22842326        assert(addrlen);
    22852327
    2286         // find the socket
     2328        /* Find the socket */
    22872329        socket = socket_cores_find(local_sockets, socket_id);
    22882330        if (!socket)
    22892331                return ENOTSOCK;
    22902332
    2291         // get the socket specific data
    2292         socket_data = (tcp_socket_data_ref) socket->specific_data;
     2333        /* Get the socket specific data */
     2334        socket_data = (tcp_socket_data_t *) socket->specific_data;
    22932335        assert(socket_data);
    22942336
    2295         // check state
     2337        /* Check state */
    22962338        if (socket_data->state != TCP_SOCKET_LISTEN)
    22972339                return EINVAL;
     
    23072349                        return ENOTSOCK;
    23082350
    2309                 // get the socket specific data
    2310                 socket_data = (tcp_socket_data_ref) accepted->specific_data;
     2351                /* Get the socket specific data */
     2352                socket_data = (tcp_socket_data_t *) accepted->specific_data;
    23112353                assert(socket_data);
    2312                 // TODO can it be in another state?
     2354                /* TODO can it be in another state? */
    23132355                if (socket_data->state == TCP_SOCKET_ESTABLISHED) {
    2314                         ERROR_PROPAGATE(data_reply(socket_data->addr,
    2315                             socket_data->addrlen));
    2316                         ERROR_PROPAGATE(tl_get_ip_packet_dimension(
    2317                             tcp_globals.ip_phone, &tcp_globals.dimensions,
    2318                             socket_data->device_id, &packet_dimension));
     2356                        rc = data_reply(socket_data->addr,
     2357                            socket_data->addrlen);
     2358                        if (rc != EOK)
     2359                                return rc;
     2360                        rc = tl_get_ip_packet_dimension(tcp_globals.ip_phone,
     2361                            &tcp_globals.dimensions, socket_data->device_id,
     2362                            &packet_dimension);
     2363                        if (rc != EOK)
     2364                                return rc;
    23192365                        *addrlen = socket_data->addrlen;
    23202366
     
    23262372       
    23272373                        if (new_socket_id > 0) {
    2328                                 ERROR_PROPAGATE(socket_cores_update(
    2329                                     local_sockets, accepted->socket_id,
    2330                                     new_socket_id));
     2374                                rc = socket_cores_update(local_sockets,
     2375                                    accepted->socket_id, new_socket_id);
     2376                                if (rc != EOK)
     2377                                        return rc;
    23312378                                accepted->socket_id = new_socket_id;
    23322379                        }
     
    23392386}
    23402387
    2341 void
    2342 tcp_free_socket_data(socket_core_ref socket)
    2343 {
    2344         tcp_socket_data_ref socket_data;
     2388void tcp_free_socket_data(socket_core_t *socket)
     2389{
     2390        tcp_socket_data_t *socket_data;
    23452391
    23462392        assert(socket);
     
    23482394        printf("destroy_socket %d\n", socket->socket_id);
    23492395
    2350         // get the socket specific data
    2351         socket_data = (tcp_socket_data_ref) socket->specific_data;
     2396        /* Get the socket specific data */
     2397        socket_data = (tcp_socket_data_t *) socket->specific_data;
    23522398        assert(socket_data);
    2353         //free the pseudo header
     2399
     2400        /* Free the pseudo header */
    23542401        if (socket_data->pseudo_header) {
    23552402                if (socket_data->headerlen) {
     
    23602407                socket_data->pseudo_header = NULL;
    23612408        }
     2409
    23622410        socket_data->headerlen = 0;
    2363         // free the address
     2411
     2412        /* Free the address */
    23642413        if (socket_data->addr) {
    23652414                if (socket_data->addrlen) {
     
    23732422}
    23742423
    2375 int tcp_release_and_return(packet_t packet, int result)
     2424/** Releases the packet and returns the result.
     2425 *
     2426 * @param[in] packet    The packet queue to be released.
     2427 * @param[in] result    The result to be returned.
     2428 * @return              The result parameter.
     2429 */
     2430int tcp_release_and_return(packet_t *packet, int result)
    23762431{
    23772432        pq_release_remote(tcp_globals.net_phone, packet_get_id(packet));
     
    23792434}
    23802435
    2381 /** Default thread for new connections.
     2436/** Process IPC messages from the IP module
    23822437 *
    2383  *  @param[in] iid The initial message identifier.
    2384  *  @param[in] icall The initial message call structure.
     2438 * @param[in]     iid   Message identifier.
     2439 * @param[in,out] icall Message parameters.
    23852440 *
    23862441 */
    2387 static void tl_client_connection(ipc_callid_t iid, ipc_call_t * icall)
    2388 {
    2389         /*
    2390          * Accept the connection
    2391          *  - Answer the first IPC_M_CONNECT_ME_TO call.
    2392          */
    2393         ipc_answer_0(iid, EOK);
    2394 
     2442static void tcp_receiver(ipc_callid_t iid, ipc_call_t *icall)
     2443{
     2444        packet_t *packet;
     2445        int rc;
     2446       
    23952447        while (true) {
    2396                 ipc_call_t answer;
    2397                 int answer_count;
    2398 
    2399                 /*
    2400                    Clear the answer structure
    2401                  */
    2402                 refresh_answer(&answer, &answer_count);
    2403 
    2404                 /*
    2405                    Fetch the next message
    2406                  */
    2407                 ipc_call_t call;
    2408                 ipc_callid_t callid = async_get_call(&call);
    2409 
    2410                 /*
    2411                    Process the message
    2412                  */
    2413                 int res = tl_module_message_standalone(callid, &call, &answer,
    2414                     &answer_count);
    2415 
    2416                 /*
    2417                    End if said to either by the message or the processing result
    2418                  */
    2419                 if ((IPC_GET_METHOD(call) == IPC_M_PHONE_HUNGUP) ||
    2420                     (res == EHANGUP))
    2421                         return;
    2422 
    2423                 /*
    2424                    Answer the message
    2425                  */
    2426                 answer_call(callid, res, &answer, answer_count);
    2427         }
    2428 }
    2429 
    2430 /** Starts the module.
     2448                switch (IPC_GET_IMETHOD(*icall)) {
     2449                case NET_TL_RECEIVED:
     2450                        rc = packet_translate_remote(tcp_globals.net_phone, &packet,
     2451                            IPC_GET_PACKET(*icall));
     2452                        if (rc == EOK)
     2453                                rc = tcp_received_msg(IPC_GET_DEVICE(*icall), packet,
     2454                                    SERVICE_TCP, IPC_GET_ERROR(*icall));
     2455                       
     2456                        async_answer_0(iid, (sysarg_t) rc);
     2457                        break;
     2458                default:
     2459                        async_answer_0(iid, (sysarg_t) ENOTSUP);
     2460                }
     2461               
     2462                iid = async_get_call(icall);
     2463        }
     2464}
     2465
     2466/** Initialize the TCP module.
    24312467 *
    2432  *  @param argc The count of the command line arguments. Ignored parameter.
    2433  *  @param argv The command line parameters. Ignored parameter.
     2468 * @param[in] net_phone Network module phone.
    24342469 *
    2435  *  @returns EOK on success.
    2436  *  @returns Other error codes as defined for each specific module start function.
     2470 * @return EOK on success.
     2471 * @return ENOMEM if there is not enough memory left.
    24372472 *
    24382473 */
    2439 int
    2440 main(int argc, char *argv[])
    2441 {
    2442         ERROR_DECLARE;
    2443 
    2444         /*
    2445            Start the module
    2446          */
    2447         if (ERROR_OCCURRED(tl_module_start_standalone(tl_client_connection)))
    2448                 return ERROR_CODE;
    2449 
    2450         return EOK;
     2474int tl_initialize(int net_phone)
     2475{
     2476        fibril_rwlock_initialize(&tcp_globals.lock);
     2477        fibril_rwlock_write_lock(&tcp_globals.lock);
     2478       
     2479        tcp_globals.net_phone = net_phone;
     2480       
     2481        tcp_globals.icmp_phone = icmp_connect_module(ICMP_CONNECT_TIMEOUT);
     2482        tcp_globals.ip_phone = ip_bind_service(SERVICE_IP, IPPROTO_TCP,
     2483            SERVICE_TCP, tcp_receiver);
     2484        if (tcp_globals.ip_phone < 0) {
     2485                fibril_rwlock_write_unlock(&tcp_globals.lock);
     2486                return tcp_globals.ip_phone;
     2487        }
     2488       
     2489        int rc = socket_ports_initialize(&tcp_globals.sockets);
     2490        if (rc != EOK)
     2491                goto out;
     2492
     2493        rc = packet_dimensions_initialize(&tcp_globals.dimensions);
     2494        if (rc != EOK) {
     2495                socket_ports_destroy(&tcp_globals.sockets, free);
     2496                goto out;
     2497        }
     2498
     2499        tcp_globals.last_used_port = TCP_FREE_PORTS_START - 1;
     2500
     2501out:
     2502        fibril_rwlock_write_unlock(&tcp_globals.lock);
     2503        return rc;
     2504}
     2505
     2506int main(int argc, char *argv[])
     2507{
     2508        return tl_module_start(SERVICE_TCP);
    24512509}
    24522510
Note: See TracChangeset for help on using the changeset viewer.