Ignore:
File:
1 edited

Legend:

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

    r28a3e74 r472020fc  
    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 
     45#include <err.h>
     46
     47#include <ipc/ipc.h>
    4648#include <ipc/services.h>
    4749#include <ipc/net.h>
     
    6365#include <ip_interface.h>
    6466#include <icmp_client.h>
    65 #include <icmp_remote.h>
     67#include <icmp_interface.h>
    6668#include <net_interface.h>
    6769#include <socket_core.h>
    6870#include <tl_common.h>
    69 #include <tl_remote.h>
    70 #include <tl_skel.h>
     71#include <tl_local.h>
     72#include <tl_interface.h>
    7173
    7274#include "tcp.h"
    7375#include "tcp_header.h"
     76#include "tcp_module.h"
    7477
    7578/** TCP module name. */
    76 #define NAME  "tcp"
     79#define NAME    "TCP protocol"
    7780
    7881/** The TCP window default value. */
     
    107110
    108111/** Returns a value indicating whether the value is in the interval respecting
    109  * the possible overflow.
     112 *  the possible overflow.
    110113 *
    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.
     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.
    116118 */
    117119#define IS_IN_INTERVAL_OVERFLOW(lower, value, higher_equal) \
     
    124126 */
    125127typedef struct tcp_timeout tcp_timeout_t;
     128
     129/** Type definition of the TCP timeout pointer.
     130 *  @see tcp_timeout
     131 */
     132typedef tcp_timeout_t *tcp_timeout_ref;
    126133
    127134/** TCP reply timeout data.
     
    137144
    138145        /** Local sockets. */
    139         socket_cores_t *local_sockets;
     146        socket_cores_ref local_sockets;
    140147
    141148        /** Socket identifier. */
     
    152159
    153160        /** Port map key. */
    154         uint8_t *key;
     161        char *key;
    155162
    156163        /** Port map key length. */
     
    158165};
    159166
    160 static int tcp_release_and_return(packet_t *, int);
    161 static void tcp_prepare_operation_header(socket_core_t *, tcp_socket_data_t *,
    162     tcp_header_t *, int synchronize, int);
    163 static int tcp_prepare_timeout(int (*)(void *), socket_core_t *,
    164     tcp_socket_data_t *, size_t, tcp_socket_state_t, suseconds_t, int);
    165 static void tcp_free_socket_data(socket_core_t *);
    166 
    167 static int tcp_timeout(void *);
    168 
    169 static int tcp_release_after_timeout(void *);
    170 
    171 static int tcp_process_packet(device_id_t, packet_t *, services_t);
    172 static int tcp_connect_core(socket_core_t *, socket_cores_t *,
    173     struct sockaddr *, socklen_t);
    174 static int tcp_queue_prepare_packet(socket_core_t *, tcp_socket_data_t *,
    175     packet_t *, size_t);
    176 static int tcp_queue_packet(socket_core_t *, tcp_socket_data_t *, packet_t *,
    177     size_t);
    178 static packet_t *tcp_get_packets_to_send(socket_core_t *, tcp_socket_data_t *);
    179 static void tcp_send_packets(device_id_t, packet_t *);
    180 
    181 static void tcp_process_acknowledgement(socket_core_t *, tcp_socket_data_t *,
    182     tcp_header_t *);
    183 static packet_t *tcp_send_prepare_packet(socket_core_t *, tcp_socket_data_t *,
    184     packet_t *, size_t, size_t);
    185 static 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);
    189 static int tcp_create_notification_packet(packet_t **, socket_core_t *,
    190     tcp_socket_data_t *, int, int);
    191 static void tcp_refresh_socket_data(tcp_socket_data_t *);
    192 
    193 static void tcp_initialize_socket_data(tcp_socket_data_t *);
    194 
    195 static int tcp_process_listen(socket_core_t *, tcp_socket_data_t *,
    196     tcp_header_t *, packet_t *, struct sockaddr *, struct sockaddr *, size_t);
    197 static int tcp_process_syn_sent(socket_core_t *, tcp_socket_data_t *,
    198     tcp_header_t *, packet_t *);
    199 static int tcp_process_syn_received(socket_core_t *, tcp_socket_data_t *,
    200     tcp_header_t *, packet_t *);
    201 static int tcp_process_established(socket_core_t *, tcp_socket_data_t *,
    202     tcp_header_t *, packet_t *, int, size_t);
    203 static int tcp_queue_received_packet(socket_core_t *, tcp_socket_data_t *,
    204     packet_t *, int, size_t);
    205 static void tcp_queue_received_end_of_data(socket_core_t *socket);
    206 
    207 static int tcp_received_msg(device_id_t, packet_t *, services_t, services_t);
    208 static int tcp_process_client_messages(ipc_callid_t, ipc_call_t);
    209 
    210 static int tcp_listen_message(socket_cores_t *, int, int);
    211 static int tcp_connect_message(socket_cores_t *, int, struct sockaddr *,
    212     socklen_t);
    213 static int tcp_recvfrom_message(socket_cores_t *, int, int, size_t *);
    214 static int tcp_send_message(socket_cores_t *, int, int, size_t *, int);
    215 static int tcp_accept_message(socket_cores_t *, int, int, size_t *, size_t *);
    216 static int tcp_close_message(socket_cores_t *, int);
     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 */
     172int tcp_release_and_return(packet_t packet, int result);
     173
     174void tcp_prepare_operation_header(socket_core_ref socket,
     175    tcp_socket_data_ref socket_data, tcp_header_ref header, int synchronize,
     176    int finalize);
     177int 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);
     181void tcp_free_socket_data(socket_core_ref socket);
     182
     183int tcp_timeout(void *data);
     184
     185int tcp_release_after_timeout(void *data);
     186
     187int tcp_process_packet(device_id_t device_id, packet_t packet,
     188    services_t error);
     189int tcp_connect_core(socket_core_ref socket, socket_cores_ref local_sockets,
     190    struct sockaddr *addr, socklen_t addrlen);
     191int tcp_queue_prepare_packet(socket_core_ref socket,
     192    tcp_socket_data_ref socket_data, packet_t packet, size_t data_length);
     193int tcp_queue_packet(socket_core_ref socket, tcp_socket_data_ref socket_data,
     194    packet_t packet, size_t data_length);
     195packet_t tcp_get_packets_to_send(socket_core_ref socket,
     196    tcp_socket_data_ref socket_data);
     197void tcp_send_packets(device_id_t device_id, packet_t packet);
     198
     199void tcp_process_acknowledgement(socket_core_ref socket,
     200    tcp_socket_data_ref socket_data, tcp_header_ref header);
     201packet_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);
     204packet_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);
     207void tcp_retransmit_packet(socket_core_ref socket,
     208    tcp_socket_data_ref socket_data, size_t sequence_number);
     209int tcp_create_notification_packet(packet_t * packet, socket_core_ref socket,
     210    tcp_socket_data_ref socket_data, int synchronize, int finalize);
     211void tcp_refresh_socket_data(tcp_socket_data_ref socket_data);
     212
     213void tcp_initialize_socket_data(tcp_socket_data_ref socket_data);
     214
     215int 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);
     219int tcp_process_syn_sent(socket_core_ref socket,
     220    tcp_socket_data_ref socket_data, tcp_header_ref header, packet_t packet);
     221int tcp_process_syn_received(socket_core_ref socket,
     222    tcp_socket_data_ref socket_data, tcp_header_ref header, packet_t packet);
     223int 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);
     226int 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
     230int tcp_received_msg(device_id_t device_id, packet_t packet,
     231    services_t receiver, services_t error);
     232int tcp_process_client_messages(ipc_callid_t callid, ipc_call_t call);
     233
     234int tcp_listen_message(socket_cores_ref local_sockets, int socket_id,
     235    int backlog);
     236int tcp_connect_message(socket_cores_ref local_sockets, int socket_id,
     237    struct sockaddr *addr, socklen_t addrlen);
     238int tcp_recvfrom_message(socket_cores_ref local_sockets, int socket_id,
     239    int flags, size_t * addrlen);
     240int tcp_send_message(socket_cores_ref local_sockets, int socket_id,
     241    int fragments, size_t * data_fragment_size, int flags);
     242int tcp_accept_message(socket_cores_ref local_sockets, int socket_id,
     243    int new_socket_id, size_t * data_fragment_size, size_t * addrlen);
     244int tcp_close_message(socket_cores_ref local_sockets, int socket_id);
    217245
    218246/** TCP global data. */
    219247tcp_globals_t tcp_globals;
    220248
    221 int tcp_received_msg(device_id_t device_id, packet_t *packet,
    222     services_t receiver, services_t error)
    223 {
    224         int rc;
     249int 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
     278int
     279tcp_received_msg(device_id_t device_id, packet_t packet, services_t receiver,
     280    services_t error)
     281{
     282        ERROR_DECLARE;
    225283
    226284        if (receiver != SERVICE_TCP)
     
    228286
    229287        fibril_rwlock_write_lock(&tcp_globals.lock);
    230         rc = tcp_process_packet(device_id, packet, error);
    231         if (rc != EOK)
     288        if (ERROR_OCCURRED(tcp_process_packet(device_id, packet, error)))
    232289                fibril_rwlock_write_unlock(&tcp_globals.lock);
    233290
    234         printf("receive %d \n", rc);
    235 
    236         return rc;
    237 }
    238 
    239 int tcp_process_packet(device_id_t device_id, packet_t *packet, services_t error)
    240 {
     291        printf("receive %d \n", ERROR_CODE);
     292
     293        return ERROR_CODE;
     294}
     295
     296int tcp_process_packet(device_id_t device_id, packet_t packet, services_t error)
     297{
     298        ERROR_DECLARE;
     299
    241300        size_t length;
    242301        size_t offset;
    243302        int result;
    244         tcp_header_t *header;
    245         socket_core_t *socket;
    246         tcp_socket_data_t *socket_data;
    247         packet_t *next_packet;
     303        tcp_header_ref header;
     304        socket_core_ref socket;
     305        tcp_socket_data_ref socket_data;
     306        packet_t next_packet;
    248307        size_t total_length;
    249308        uint32_t checksum;
     
    254313        struct sockaddr *dest;
    255314        size_t addrlen;
    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? */
     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?
    278338        result = ip_client_process_packet(packet, NULL, NULL, NULL, NULL, NULL);
    279339        if (result < 0)
     
    289349                return tcp_release_and_return(packet, NO_DATA);
    290350
    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);
     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);
    298357        if (!header)
    299358                return tcp_release_and_return(packet, NO_DATA);
    300359
    301 #if 0
    302         printf("header len %d, port %d \n", TCP_HEADER_LENGTH(header),
    303             ntohs(header->destination_port));
    304 #endif
     360//      printf("header len %d, port %d \n", TCP_HEADER_LENGTH(header),
     361//          ntohs(header->destination_port));
     362
    305363        result = packet_get_addr(packet, (uint8_t **) &src, (uint8_t **) &dest);
    306364        if (result <= 0)
     
    309367        addrlen = (size_t) result;
    310368
    311         rc = tl_set_address_port(src, addrlen, ntohs(header->source_port));
    312         if (rc != EOK)
    313                 return tcp_release_and_return(packet, rc);
     369        if (ERROR_OCCURRED(tl_set_address_port(src, addrlen,
     370            ntohs(header->source_port))))
     371                return tcp_release_and_return(packet, ERROR_CODE);
    314372       
    315         /* Find the destination socket */
     373        // find the destination socket
    316374        socket = socket_port_find(&tcp_globals.sockets,
    317             ntohs(header->destination_port), (uint8_t *) src, addrlen);
     375            ntohs(header->destination_port), (const char *) src, addrlen);
    318376        if (!socket) {
    319                 /* Find the listening destination socket */
     377                // find the listening destination socket
    320378                socket = socket_port_find(&tcp_globals.sockets,
    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 
     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        }
    334391        printf("socket id %d\n", socket->socket_id);
    335         socket_data = (tcp_socket_data_t *) socket->specific_data;
     392        socket_data = (tcp_socket_data_ref) socket->specific_data;
    336393        assert(socket_data);
    337394
    338         /* Some data received, clear the timeout counter */
     395        // some data received, clear the timeout counter
    339396        socket_data->timeout_count = 0;
    340397
    341         /* Count the received packet fragments */
     398        // count the received packet fragments
    342399        next_packet = packet;
    343400        fragments = 0;
     
    345402        total_length = 0;
    346403        do {
    347                 fragments++;
     404                ++fragments;
    348405                length = packet_get_data_length(next_packet);
    349406                if (length <= 0)
     
    352409                total_length += length;
    353410
    354                 /* Add partial checksum if set */
     411                // add partial checksum if set
    355412                if (!error) {
    356413                        checksum = compute_checksum(checksum,
     
    364421
    365422        if (error)
    366                 goto has_error_service;
     423                goto error;
    367424       
    368425        if (socket_data->state == TCP_SOCKET_LISTEN) {
     426
    369427                if (socket_data->pseudo_header) {
    370428                        free(socket_data->pseudo_header);
     
    373431                }
    374432
    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) {
     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))) {
    379436                        fibril_rwlock_write_unlock(socket_data->local_lock);
    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                 }
     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);
    390445        }
    391446       
     
    397452                fibril_rwlock_write_unlock(socket_data->local_lock);
    398453
    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 */
     454                if (ERROR_NONE(tl_prepare_icmp_packet(tcp_globals.net_phone,
     455                    tcp_globals.icmp_phone, packet, error))) {
     456                        // checksum error ICMP
    403457                        icmp_parameter_problem_msg(tcp_globals.icmp_phone,
    404458                            ICMP_PARAM_POINTER,
     
    410464        }
    411465
    412 has_error_service:
    413         fibril_rwlock_write_unlock(&tcp_globals.lock);
    414 
    415         /* TODO error reporting/handling */
     466error:
     467        fibril_rwlock_read_unlock(&tcp_globals.lock);
     468
     469        // TODO error reporting/handling
    416470        switch (socket_data->state) {
    417471        case TCP_SOCKET_LISTEN:
    418                 rc = tcp_process_listen(socket, socket_data, header, packet,
    419                     src, dest, addrlen);
     472                ERROR_CODE = tcp_process_listen(socket, socket_data, header,
     473                    packet, src, dest, addrlen);
    420474                break;
    421475        case TCP_SOCKET_SYN_RECEIVED:
    422                 rc = tcp_process_syn_received(socket, socket_data, header,
     476                ERROR_CODE = tcp_process_syn_received(socket, socket_data,
     477                    header, packet);
     478                break;
     479        case TCP_SOCKET_SYN_SENT:
     480                ERROR_CODE = tcp_process_syn_sent(socket, socket_data, header,
    423481                    packet);
    424482                break;
    425         case TCP_SOCKET_SYN_SENT:
    426                 rc = tcp_process_syn_sent(socket, socket_data, header, packet);
    427                 break;
    428483        case TCP_SOCKET_FIN_WAIT_1:
    429                 /* ack changing the state to FIN_WAIT_2 gets processed later */
     484                // ack changing the state to FIN_WAIT_2 gets processed later
    430485        case TCP_SOCKET_FIN_WAIT_2:
    431                 /* fin changing state to LAST_ACK gets processed later */
     486                // fin changing state to LAST_ACK gets processed later
    432487        case TCP_SOCKET_LAST_ACK:
    433                 /* ack releasing the socket get processed later */
     488                // ack releasing the socket get processed later
    434489        case TCP_SOCKET_CLOSING:
    435                 /* ack releasing the socket gets processed later */
     490                // ack releasing the socket gets processed later
    436491        case TCP_SOCKET_ESTABLISHED:
    437                 rc = tcp_process_established(socket, socket_data, header,
    438                     packet, fragments, total_length);
     492                ERROR_CODE = tcp_process_established(socket, socket_data,
     493                    header, packet, fragments, total_length);
    439494                break;
    440495        default:
     
    442497        }
    443498
    444         if (rc != EOK) {
     499        if (ERROR_CODE != EOK) {
     500                printf("process %d\n", ERROR_CODE);
    445501                fibril_rwlock_write_unlock(socket_data->local_lock);
    446                 printf("process %d\n", rc);
    447502        }
    448503
     
    450505}
    451506
    452 int tcp_process_established(socket_core_t *socket, tcp_socket_data_t *
    453     socket_data, tcp_header_t *header, packet_t *packet, int fragments,
     507int
     508tcp_process_established(socket_core_ref socket, tcp_socket_data_ref socket_data,
     509    tcp_header_ref header, packet_t packet, int fragments,
    454510    size_t total_length)
    455511{
    456         packet_t *next_packet;
    457         packet_t *tmp_packet;
     512        ERROR_DECLARE;
     513
     514        packet_t next_packet;
     515        packet_t tmp_packet;
    458516        uint32_t old_incoming;
    459517        size_t order;
     
    462520        size_t offset;
    463521        uint32_t new_sequence_number;
    464         bool forced_ack;
    465         int rc;
    466522
    467523        assert(socket);
     
    471527        assert(packet);
    472528
    473         forced_ack = false;
    474 
    475529        new_sequence_number = ntohl(header->sequence_number);
    476530        old_incoming = socket_data->next_incoming;
    477531
    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 */
     532        if (header->finalize)
     533                socket_data->fin_incoming = new_sequence_number;
     534
     535        // trim begining if containing expected data
    484536        if (IS_IN_INTERVAL_OVERFLOW(new_sequence_number,
    485537            socket_data->next_incoming, new_sequence_number + total_length)) {
    486538
    487                 /* Get the acknowledged offset */
     539                // get the acknowledged offset
    488540                if (socket_data->next_incoming < new_sequence_number) {
    489541                        offset = new_sequence_number -
     
    497549                total_length -= offset;
    498550                length = packet_get_data_length(packet);
    499 
    500                 /* Trim the acknowledged data */
     551                // trim the acknowledged data
    501552                while (length <= offset) {
    502                         /* Release the acknowledged packets */
     553                        // release the acknowledged packets
    503554                        next_packet = pq_next(packet);
    504555                        pq_release_remote(tcp_globals.net_phone,
     
    509560                }
    510561
    511                 if (offset > 0) {
    512                         rc = packet_trim(packet, offset, 0);
    513                         if (rc != EOK)
    514                                 return tcp_release_and_return(packet, rc);
    515                 }
     562                if ((offset > 0) && (ERROR_OCCURRED(packet_trim(packet,
     563                    offset, 0))))
     564                        return tcp_release_and_return(packet, ERROR_CODE);
    516565
    517566                assert(new_sequence_number == socket_data->next_incoming);
    518567        }
    519568
    520         /* Release if overflowing the window */
     569        // release if overflowing the window
    521570/*
    522571        if (IS_IN_INTERVAL_OVERFLOW(socket_data->next_incoming +
     
    545594                        if (length <= offset)
    546595                                next_packet = pq_next(next_packet);
    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                         }
     596                        else if (ERROR_OCCURRED(packet_trim(next_packet, 0,
     597                            length - offset)))
     598                                return tcp_release_and_return(packet,
     599                                    ERROR_CODE);
    554600                        offset -= length;
    555601                        total_length -= length - offset;
     
    568614        }
    569615*/
    570         /* The expected one arrived? */
     616        // the expected one arrived?
    571617        if (new_sequence_number == socket_data->next_incoming) {
    572618                printf("expected\n");
    573                 /* Process acknowledgement */
     619                // process acknowledgement
    574620                tcp_process_acknowledgement(socket, socket_data, header);
    575621
    576                 /* Remove the header */
     622                // remove the header
    577623                total_length -= TCP_HEADER_LENGTH(header);
    578                 rc = packet_trim(packet, TCP_HEADER_LENGTH(header), 0);
    579                 if (rc != EOK)
    580                         return tcp_release_and_return(packet, rc);
     624                if (ERROR_OCCURRED(packet_trim(packet,
     625                    TCP_HEADER_LENGTH(header), 0)))
     626                        return tcp_release_and_return(packet, ERROR_CODE);
    581627
    582628                if (total_length) {
    583                         rc = tcp_queue_received_packet(socket, socket_data,
    584                             packet, fragments, total_length);
    585                         if (rc != EOK)
    586                                 return rc;
     629                        ERROR_PROPAGATE(tcp_queue_received_packet(socket,
     630                            socket_data, packet, fragments, total_length));
    587631                } else {
    588632                        total_length = 1;
     
    592636                packet = socket_data->incoming;
    593637                while (packet) {
    594                         rc = pq_get_order(socket_data->incoming, &order, NULL);
    595                         if (rc != EOK) {
    596                                 /* Remove the corrupted packet */
     638
     639                        if (ERROR_OCCURRED(pq_get_order(socket_data->incoming,
     640                            &order, NULL))) {
     641                                // remove the corrupted packet
    597642                                next_packet = pq_detach(packet);
    598643                                if (packet == socket_data->incoming)
     
    607652                        if (IS_IN_INTERVAL_OVERFLOW(sequence_number,
    608653                            old_incoming, socket_data->next_incoming)) {
    609                                 /* Move to the next */
     654                                // move to the next
    610655                                packet = pq_next(packet);
    611                                 /* Coninual data? */
     656                                // coninual data?
    612657                        } else if (IS_IN_INTERVAL_OVERFLOW(old_incoming,
    613658                            sequence_number, socket_data->next_incoming)) {
    614                                 /* Detach the packet */
     659                                // detach the packet
    615660                                next_packet = pq_detach(packet);
    616661                                if (packet == socket_data->incoming)
    617662                                        socket_data->incoming = next_packet;
    618                                 /* Get data length */
     663                                // get data length
    619664                                length = packet_get_data_length(packet);
    620665                                new_sequence_number = sequence_number + length;
    621666                                if (length <= 0) {
    622                                         /* Remove the empty packet */
     667                                        // remove the empty packet
    623668                                        pq_release_remote(tcp_globals.net_phone,
    624669                                            packet_get_id(packet));
     
    626671                                        continue;
    627672                                }
    628                                 /* Exactly following */
     673                                // exactly following
    629674                                if (sequence_number ==
    630675                                    socket_data->next_incoming) {
    631                                         /* Queue received data */
    632                                         rc = tcp_queue_received_packet(socket,
     676                                        // queue received data
     677                                        ERROR_PROPAGATE(
     678                                            tcp_queue_received_packet(socket,
    633679                                            socket_data, packet, 1,
    634                                             packet_get_data_length(packet));
    635                                         if (rc != EOK)
    636                                                 return rc;
     680                                            packet_get_data_length(packet)));
    637681                                        socket_data->next_incoming =
    638682                                            new_sequence_number;
    639683                                        packet = next_packet;
    640684                                        continue;
    641                                         /* At least partly following data? */
    642                                 }
    643                                 if (IS_IN_INTERVAL_OVERFLOW(sequence_number,
    644                                     socket_data->next_incoming, new_sequence_number)) {
     685                                        // at least partly following data?
     686                                } else if (IS_IN_INTERVAL_OVERFLOW(
     687                                    sequence_number, socket_data->next_incoming,
     688                                    new_sequence_number)) {
    645689                                        if (socket_data->next_incoming <
    646690                                            new_sequence_number) {
     
    652696                                                    new_sequence_number;
    653697                                        }
    654                                         rc = packet_trim(packet,length, 0);
    655                                         if (rc == EOK) {
    656                                                 /* Queue received data */
    657                                                 rc = tcp_queue_received_packet(
     698                                        if (ERROR_NONE(packet_trim(packet,
     699                                            length, 0))) {
     700                                                // queue received data
     701                                                ERROR_PROPAGATE(
     702                                                    tcp_queue_received_packet(
    658703                                                    socket, socket_data, packet,
    659704                                                    1, packet_get_data_length(
    660                                                     packet));
    661                                                 if (rc != EOK)
    662                                                         return rc;
     705                                                    packet)));
    663706                                                socket_data->next_incoming =
    664707                                                    new_sequence_number;
     
    667710                                        }
    668711                                }
    669                                 /* Remove the duplicit or corrupted packet */
     712                                // remove the duplicit or corrupted packet
    670713                                pq_release_remote(tcp_globals.net_phone,
    671714                                    packet_get_id(packet));
     
    680723            socket_data->next_incoming + socket_data->window)) {
    681724                printf("in window\n");
    682                 /* Process acknowledgement */
     725                // process acknowledgement
    683726                tcp_process_acknowledgement(socket, socket_data, header);
    684727
    685                 /* Remove the header */
     728                // remove the header
    686729                total_length -= TCP_HEADER_LENGTH(header);
    687                 rc = packet_trim(packet, TCP_HEADER_LENGTH(header), 0);
    688                 if (rc != EOK)
    689                         return tcp_release_and_return(packet, rc);
     730                if (ERROR_OCCURRED(packet_trim(packet,
     731                    TCP_HEADER_LENGTH(header), 0)))
     732                        return tcp_release_and_return(packet, ERROR_CODE);
    690733
    691734                next_packet = pq_detach(packet);
    692735                length = packet_get_data_length(packet);
    693                 rc = pq_add(&socket_data->incoming, packet, new_sequence_number,
    694                     length);
    695                 if (rc != EOK) {
    696                         /* Remove the corrupted packets */
     736                if (ERROR_OCCURRED(pq_add(&socket_data->incoming, packet,
     737                    new_sequence_number, length))) {
     738                        // remove the corrupted packets
    697739                        pq_release_remote(tcp_globals.net_phone,
    698740                            packet_get_id(packet));
     
    704746                                tmp_packet = pq_detach(next_packet);
    705747                                length = packet_get_data_length(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) {
     748                                if (ERROR_OCCURRED(pq_set_order(next_packet,
     749                                    new_sequence_number, length)) ||
     750                                    ERROR_OCCURRED(pq_insert_after(packet,
     751                                    next_packet))) {
    715752                                        pq_release_remote(tcp_globals.net_phone,
    716753                                            packet_get_id(next_packet));
     
    721758        } else {
    722759                printf("unexpected\n");
    723                 /* Release duplicite or restricted */
     760                // release duplicite or restricted
    724761                pq_release_remote(tcp_globals.net_phone, packet_get_id(packet));
    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 */
     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)) {
    734767                switch (socket_data->state) {
    735768                case TCP_SOCKET_FIN_WAIT_1:
     
    738771                        socket_data->state = TCP_SOCKET_CLOSING;
    739772                        break;
    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;
     773                        //case TCP_ESTABLISHED:
    745774                default:
    746775                        socket_data->state = TCP_SOCKET_CLOSE_WAIT;
     
    750779
    751780        packet = tcp_get_packets_to_send(socket, socket_data);
    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;
     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));
    761787                packet = tcp_send_prepare_packet(socket, socket_data, packet, 1,
    762788                    socket_data->last_outgoing + 1);
     
    765791        fibril_rwlock_write_unlock(socket_data->local_lock);
    766792
    767         /* Send the packet */
     793        // send the packet
    768794        tcp_send_packets(socket_data->device_id, packet);
    769795
     
    771797}
    772798
    773 int tcp_queue_received_packet(socket_core_t *socket,
    774     tcp_socket_data_t *socket_data, packet_t *packet, int fragments,
     799int
     800tcp_queue_received_packet(socket_core_ref socket,
     801    tcp_socket_data_ref socket_data, packet_t packet, int fragments,
    775802    size_t total_length)
    776803{
    777         packet_dimension_t *packet_dimension;
    778         int rc;
     804        ERROR_DECLARE;
     805
     806        packet_dimension_ref packet_dimension;
    779807
    780808        assert(socket);
     
    785813        assert(socket_data->window > total_length);
    786814
    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 */
     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
    798825        socket_data->window -= total_length;
    799826
    800         /* Notify the destination socket */
     827        // notify the destination socket
    801828        async_msg_5(socket->phone, NET_SOCKET_RECEIVED,
    802             (sysarg_t) socket->socket_id,
     829            (ipcarg_t) socket->socket_id,
    803830            ((packet_dimension->content < socket_data->data_fragment_size) ?
    804831            packet_dimension->content : socket_data->data_fragment_size), 0, 0,
    805             (sysarg_t) fragments);
     832            (ipcarg_t) fragments);
    806833
    807834        return EOK;
    808835}
    809836
    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  */
    817 static 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 
    828 int 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;
     837int
     838tcp_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;
    833844
    834845        assert(socket);
     
    841852                return tcp_release_and_return(packet, EINVAL);
    842853       
    843         /* Process acknowledgement */
     854        // process acknowledgement
    844855        tcp_process_acknowledgement(socket, socket_data, header);
    845856
    846857        socket_data->next_incoming = ntohl(header->sequence_number) + 1;
    847 
    848         /* Release additional packets */
     858        // release additional packets
    849859        next_packet = pq_detach(packet);
    850860        if (next_packet) {
     
    852862                    packet_get_id(next_packet));
    853863        }
    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 
     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        }
    863870        tcp_prepare_operation_header(socket, socket_data, header, 0, 0);
    864871        fibril_mutex_lock(&socket_data->operation.mutex);
    865872        socket_data->operation.result = tcp_queue_packet(socket, socket_data,
    866873            packet, 1);
    867 
    868874        if (socket_data->operation.result == EOK) {
    869875                socket_data->state = TCP_SOCKET_ESTABLISHED;
     
    871877                if (packet) {
    872878                        fibril_rwlock_write_unlock( socket_data->local_lock);
    873                         /* Send the packet */
     879                        // send the packet
    874880                        tcp_send_packets(socket_data->device_id, packet);
    875                         /* Signal the result */
     881                        // signal the result
    876882                        fibril_condvar_signal( &socket_data->operation.condvar);
    877883                        fibril_mutex_unlock( &socket_data->operation.mutex);
     
    879885                }
    880886        }
    881 
    882887        fibril_mutex_unlock(&socket_data->operation.mutex);
    883888        return tcp_release_and_return(packet, EINVAL);
    884889}
    885890
    886 int 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,
     891int
     892tcp_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,
    889895    size_t addrlen)
    890896{
    891         packet_t *next_packet;
    892         socket_core_t *socket;
    893         tcp_socket_data_t *socket_data;
     897        ERROR_DECLARE;
     898
     899        packet_t next_packet;
     900        socket_core_ref socket;
     901        tcp_socket_data_ref socket_data;
    894902        int socket_id;
    895903        int listening_socket_id = listening_socket->socket_id;
    896904        int listening_port = listening_socket->port;
    897         int rc;
    898905
    899906        assert(listening_socket);
     
    906913                return tcp_release_and_return(packet, EINVAL);
    907914
    908         socket_data = (tcp_socket_data_t *) malloc(sizeof(*socket_data));
     915        socket_data = (tcp_socket_data_ref) malloc(sizeof(*socket_data));
    909916        if (!socket_data)
    910917                return tcp_release_and_return(packet, ENOMEM);
     
    923930                return tcp_release_and_return(packet, ENOMEM);
    924931        }
    925 
    926932        memcpy(socket_data->addr, src, socket_data->addrlen);
    927933        socket_data->dest_port = ntohs(header->source_port);
    928         rc = tl_set_address_port(socket_data->addr, socket_data->addrlen,
    929             socket_data->dest_port);
    930         if (rc != EOK) {
     934        if (ERROR_OCCURRED(tl_set_address_port(socket_data->addr,
     935            socket_data->addrlen, socket_data->dest_port))) {
    931936                free(socket_data->addr);
    932937                free(socket_data);
    933                 return tcp_release_and_return(packet, rc);
    934         }
    935 
    936         /* Create a socket */
     938                pq_release_remote(tcp_globals.net_phone, packet_get_id(packet));
     939                return ERROR_CODE;
     940        }
     941
     942        // create a socket
    937943        socket_id = -1;
    938         rc = socket_create(socket_data->local_sockets, listening_socket->phone,
    939             socket_data, &socket_id);
    940         if (rc != EOK) {
     944        if (ERROR_OCCURRED(socket_create(socket_data->local_sockets,
     945            listening_socket->phone, socket_data, &socket_id))) {
    941946                free(socket_data->addr);
    942947                free(socket_data);
    943                 return tcp_release_and_return(packet, rc);
     948                return tcp_release_and_return(packet, ERROR_CODE);
    944949        }
    945950
     
    953958        fibril_rwlock_write_lock(&tcp_globals.lock);
    954959
    955         /* Find the destination socket */
     960        // find the destination socket
    956961        listening_socket = socket_port_find(&tcp_globals.sockets,
    957             listening_port, (uint8_t *) SOCKET_MAP_KEY_LISTENING, 0);
    958         if (!listening_socket ||
     962            listening_port, SOCKET_MAP_KEY_LISTENING, 0);
     963        if ((!listening_socket) ||
    959964            (listening_socket->socket_id != listening_socket_id)) {
    960965                fibril_rwlock_write_unlock(&tcp_globals.lock);
    961                 /* A shadow may remain until app hangs up */
     966                // a shadow may remain until app hangs up
    962967                return tcp_release_and_return(packet, EOK /*ENOTSOCK*/);
    963968        }
    964969        listening_socket_data =
    965             (tcp_socket_data_t *) listening_socket->specific_data;
     970            (tcp_socket_data_ref) listening_socket->specific_data;
    966971        assert(listening_socket_data);
    967972
     
    971976            socket_id);
    972977        if (!socket) {
    973                 /* Where is the socket?!? */
     978                // where is the socket?!?
    974979                fibril_rwlock_write_unlock(&tcp_globals.lock);
    975980                return ENOTSOCK;
    976981        }
    977         socket_data = (tcp_socket_data_t *) socket->specific_data;
     982        socket_data = (tcp_socket_data_ref) socket->specific_data;
    978983        assert(socket_data);
    979984
    980         rc = socket_port_add(&tcp_globals.sockets, listening_port, socket,
    981             (uint8_t *) socket_data->addr, socket_data->addrlen);
     985        ERROR_CODE = socket_port_add(&tcp_globals.sockets, listening_port,
     986            socket, (const char *) socket_data->addr, socket_data->addrlen);
    982987        assert(socket == socket_port_find(&tcp_globals.sockets, listening_port,
    983             (uint8_t *) socket_data->addr, socket_data->addrlen));
    984 
    985 //      rc = socket_bind_free_port(&tcp_globals.sockets, socket,
     988            (const char *) socket_data->addr, socket_data->addrlen));
     989
     990//      ERROR_CODE = socket_bind_free_port(&tcp_globals.sockets, socket,
    986991//          TCP_FREE_PORTS_START, TCP_FREE_PORTS_END,
    987992//          tcp_globals.last_used_port);
    988993//      tcp_globals.last_used_port = socket->port;
    989994        fibril_rwlock_write_unlock(&tcp_globals.lock);
    990         if (rc != EOK) {
     995        if (ERROR_CODE != EOK) {
    991996                socket_destroy(tcp_globals.net_phone, socket->socket_id,
    992997                    socket_data->local_sockets, &tcp_globals.sockets,
    993998                    tcp_free_socket_data);
    994                 return tcp_release_and_return(packet, rc);
     999                return tcp_release_and_return(packet, ERROR_CODE);
    9951000        }
    9961001
     
    9981003        socket_data->next_incoming = ntohl(header->sequence_number) + 1;
    9991004
    1000         /* Release additional packets */
     1005        // release additional packets
    10011006        next_packet = pq_detach(packet);
    10021007        if (next_packet) {
     
    10051010        }
    10061011
    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) {
     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)))) {
    10231016                socket_destroy(tcp_globals.net_phone, socket->socket_id,
    10241017                    socket_data->local_sockets, &tcp_globals.sockets,
    10251018                    tcp_free_socket_data);
    1026                 return rc;
     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;
    10271029        }
    10281030
     
    10381040        fibril_rwlock_write_unlock(socket_data->local_lock);
    10391041
    1040         /* Send the packet */
     1042        // send the packet
    10411043        tcp_send_packets(socket_data->device_id, packet);
    10421044
     
    10441046}
    10451047
    1046 int 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;
     1048int
     1049tcp_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;
    10521056
    10531057        assert(socket);
     
    10601064                return tcp_release_and_return(packet, EINVAL);
    10611065
    1062         /* Process acknowledgement */
     1066        // process acknowledgement
    10631067        tcp_process_acknowledgement(socket, socket_data, header);
    10641068
    1065         socket_data->next_incoming = ntohl(header->sequence_number); /* + 1; */
     1069        socket_data->next_incoming = ntohl(header->sequence_number);    // + 1;
    10661070        pq_release_remote(tcp_globals.net_phone, packet_get_id(packet));
    10671071        socket_data->state = TCP_SOCKET_ESTABLISHED;
     
    10701074        if (listening_socket) {
    10711075                listening_socket_data =
    1072                     (tcp_socket_data_t *) listening_socket->specific_data;
     1076                    (tcp_socket_data_ref) listening_socket->specific_data;
    10731077                assert(listening_socket_data);
    10741078
    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 */
     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
    10801085                        async_msg_5(socket->phone, NET_SOCKET_ACCEPTED,
    1081                             (sysarg_t) listening_socket->socket_id,
     1086                            (ipcarg_t) listening_socket->socket_id,
    10821087                            socket_data->data_fragment_size, TCP_HEADER_SIZE,
    1083                             0, (sysarg_t) socket->socket_id);
     1088                            0, (ipcarg_t) socket->socket_id);
    10841089
    10851090                        fibril_rwlock_write_unlock(socket_data->local_lock);
     
    10871092                }
    10881093        }
    1089         /* Send FIN */
     1094        // send FIN
    10901095        socket_data->state = TCP_SOCKET_FIN_WAIT_1;
    10911096
    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 */
     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
    11031105        packet = tcp_get_packets_to_send(socket, socket_data);
    11041106        fibril_rwlock_write_unlock(socket_data->local_lock);
    11051107        if (packet) {
    1106                 /* Send the packet */
     1108                // send the packet
    11071109                tcp_send_packets(socket_data->device_id, packet);
    11081110        }
     
    11111113}
    11121114
    1113 void tcp_process_acknowledgement(socket_core_t *socket,
    1114     tcp_socket_data_t *socket_data, tcp_header_t *header)
     1115void
     1116tcp_process_acknowledgement(socket_core_ref socket,
     1117    tcp_socket_data_ref socket_data, tcp_header_ref header)
    11151118{
    11161119        size_t number;
    11171120        size_t length;
    1118         packet_t *packet;
    1119         packet_t *next;
    1120         packet_t *acknowledged = NULL;
     1121        packet_t packet;
     1122        packet_t next;
     1123        packet_t acknowledged = NULL;
    11211124        uint32_t old;
    11221125
     
    11301133
    11311134        number = ntohl(header->acknowledgement_number);
    1132 
    1133         /* If more data acknowledged */
     1135        // if more data acknowledged
    11341136        if (number != socket_data->expected) {
    11351137                old = socket_data->expected;
     
    11421144                        case TCP_SOCKET_LAST_ACK:
    11431145                        case TCP_SOCKET_CLOSING:
    1144                                 /*
    1145                                  * FIN acknowledged - release the socket in
    1146                                  * another fibril.
    1147                                  */
     1146                                // fin acknowledged - release the socket in
     1147                                // another fibril
    11481148                                tcp_prepare_timeout(tcp_release_after_timeout,
    11491149                                    socket, socket_data, 0,
     
    11551155                        }
    11561156                }
    1157 
    1158                 /* Update the treshold if higher than set */
     1157                // update the treshold if higher than set
    11591158                if (number + ntohs(header->window) >
    11601159                    socket_data->expected + socket_data->treshold) {
     
    11621161                            socket_data->expected;
    11631162                }
    1164 
    1165                 /* Set new expected sequence number */
     1163                // set new expected sequence number
    11661164                socket_data->expected = number;
    11671165                socket_data->expected_count = 1;
     
    11751173                                        socket_data->outgoing = next;
    11761174
    1177                                 /* Add to acknowledged or release */
     1175                                // add to acknowledged or release
    11781176                                if (pq_add(&acknowledged, packet, 0, 0) != EOK)
    11791177                                        pq_release_remote(tcp_globals.net_phone,
     
    11831181                                break;
    11841182                }
    1185 
    1186                 /* Release acknowledged */
     1183                // release acknowledged
    11871184                if (acknowledged) {
    11881185                        pq_release_remote(tcp_globals.net_phone,
     
    11901187                }
    11911188                return;
    1192                 /* If the same as the previous time */
    1193         }
    1194 
     1189                // if the same as the previous time
     1190        }
    11951191        if (number == socket_data->expected) {
    1196                 /* Increase the counter */
    1197                 socket_data->expected_count++;
     1192                // increase the counter
     1193                ++socket_data->expected_count;
    11981194                if (socket_data->expected_count == TCP_FAST_RETRANSMIT_COUNT) {
    11991195                        socket_data->expected_count = 1;
    1200                         /* TODO retransmit lock */
     1196                        // TODO retransmit lock
    12011197                        //tcp_retransmit_packet(socket, socket_data, number);
    12021198                }
     
    12041200}
    12051201
    1206 /** Per-connection initialization
    1207  *
    1208  */
    1209 void 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  */
    1226 int tl_message(ipc_callid_t callid, ipc_call_t *call,
    1227     ipc_call_t *answer, size_t *answer_count)
    1228 {
     1202int 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
    12291209        assert(call);
    12301210        assert(answer);
     
    12321212
    12331213        *answer_count = 0;
    1234         switch (IPC_GET_IMETHOD(*call)) {
     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
    12351225        case IPC_M_CONNECT_TO_ME:
    12361226                return tcp_process_client_messages(callid, *call);
     
    12401230}
    12411231
    1242 void tcp_refresh_socket_data(tcp_socket_data_t *socket_data)
     1232void tcp_refresh_socket_data(tcp_socket_data_ref socket_data)
    12431233{
    12441234        assert(socket_data);
     
    12561246}
    12571247
    1258 void tcp_initialize_socket_data(tcp_socket_data_t *socket_data)
     1248void tcp_initialize_socket_data(tcp_socket_data_ref socket_data)
    12591249{
    12601250        assert(socket_data);
     
    12711261        bool keep_on_going = true;
    12721262        socket_cores_t local_sockets;
    1273         int app_phone = IPC_GET_PHONE(call);
     1263        int app_phone = IPC_GET_PHONE(&call);
    12741264        struct sockaddr *addr;
    12751265        int socket_id;
     
    12781268        fibril_rwlock_t lock;
    12791269        ipc_call_t answer;
    1280         size_t answer_count;
    1281         tcp_socket_data_t *socket_data;
    1282         socket_core_t *socket;
    1283         packet_dimension_t *packet_dimension;
     1270        int answer_count;
     1271        tcp_socket_data_ref socket_data;
     1272        socket_core_ref socket;
     1273        packet_dimension_ref packet_dimension;
    12841274
    12851275        /*
     
    12951285        while (keep_on_going) {
    12961286
    1297                 /* Answer the call */
     1287                // answer the call
    12981288                answer_call(callid, res, &answer, answer_count);
    1299                 /* Refresh data */
     1289                // refresh data
    13001290                refresh_answer(&answer, &answer_count);
    1301                 /* Get the next call */
     1291                // get the next call
    13021292                callid = async_get_call(&call);
    13031293
    1304                 /* Process the call */
    1305                 switch (IPC_GET_IMETHOD(call)) {
     1294                // process the call
     1295                switch (IPC_GET_METHOD(call)) {
    13061296                case IPC_M_PHONE_HUNGUP:
    13071297                        keep_on_going = false;
     
    13111301                case NET_SOCKET:
    13121302                        socket_data =
    1313                             (tcp_socket_data_t *) malloc(sizeof(*socket_data));
     1303                            (tcp_socket_data_ref) malloc(sizeof(*socket_data));
    13141304                        if (!socket_data) {
    13151305                                res = ENOMEM;
     
    13451335
    13461336                case NET_SOCKET_BIND:
    1347                         res = async_data_write_accept((void **) &addr, false,
    1348                             0, 0, 0, &addrlen);
     1337                        res = data_receive((void **) &addr, &addrlen);
    13491338                        if (res != EOK)
    13501339                                break;
     
    13591348                                    SOCKET_GET_SOCKET_ID(call));
    13601349                                if (socket) {
    1361                                         socket_data = (tcp_socket_data_t *)
     1350                                        socket_data = (tcp_socket_data_ref)
    13621351                                            socket->specific_data;
    13631352                                        assert(socket_data);
     
    13831372
    13841373                case NET_SOCKET_CONNECT:
    1385                         res = async_data_write_accept((void **) &addr, false,
    1386                             0, 0, 0, &addrlen);
     1374                        res = data_receive((void **) &addr, &addrlen);
    13871375                        if (res != EOK)
    13881376                                break;
    1389                         /*
    1390                          * The global lock may be released in the
    1391                          * tcp_connect_message() function.
    1392                          */
     1377                        // the global lock may be released in the
     1378                        // tcp_connect_message() function
    13931379                        fibril_rwlock_write_lock(&tcp_globals.lock);
    13941380                        fibril_rwlock_write_lock(&lock);
     
    14351421
    14361422                case NET_SOCKET_SENDTO:
    1437                         res = async_data_write_accept((void **) &addr, false,
    1438                             0, 0, 0, &addrlen);
     1423                        res = data_receive((void **) &addr, &addrlen);
    14391424                        if (res != EOK)
    14401425                                break;
     
    15051490        }
    15061491
    1507         /* Release the application phone */
    1508         async_hangup(app_phone);
     1492        // release the application phone
     1493        ipc_hangup(app_phone);
    15091494
    15101495        printf("release\n");
    1511         /* Release all local sockets */
     1496        // release all local sockets
    15121497        socket_cores_release(tcp_globals.net_phone, &local_sockets,
    15131498            &tcp_globals.sockets, tcp_free_socket_data);
     
    15181503int tcp_timeout(void *data)
    15191504{
    1520         tcp_timeout_t *timeout = data;
     1505        tcp_timeout_ref timeout = data;
    15211506        int keep_write_lock = false;
    1522         socket_core_t *socket;
    1523         tcp_socket_data_t *socket_data;
     1507        socket_core_ref socket;
     1508        tcp_socket_data_ref socket_data;
    15241509
    15251510        assert(timeout);
    15261511
    1527         /* Sleep the given timeout */
     1512        // sleep the given timeout
    15281513        async_usleep(timeout->timeout);
    1529         /* Lock the globals */
     1514        // lock the globals
    15301515        if (timeout->globals_read_only)
    15311516                fibril_rwlock_read_lock(&tcp_globals.lock);
     
    15331518                fibril_rwlock_write_lock(&tcp_globals.lock);
    15341519
    1535         /* Find the pending operation socket */
     1520        // find the pending operation socket
    15361521        socket = socket_port_find(&tcp_globals.sockets, timeout->port,
    15371522            timeout->key, timeout->key_length);
    1538         if (!socket || (socket->socket_id != timeout->socket_id))
     1523        if (!(socket && (socket->socket_id == timeout->socket_id)))
    15391524                goto out;
    15401525       
    1541         socket_data = (tcp_socket_data_t *) socket->specific_data;
     1526        socket_data = (tcp_socket_data_ref) socket->specific_data;
    15421527        assert(socket_data);
    15431528        if (socket_data->local_sockets != timeout->local_sockets)
     
    15461531        fibril_rwlock_write_lock(socket_data->local_lock);
    15471532        if (timeout->sequence_number) {
    1548                 /* Increase the timeout counter */
    1549                 socket_data->timeout_count++;
     1533                // increase the timeout counter;
     1534                ++socket_data->timeout_count;
    15501535                if (socket_data->timeout_count == TCP_MAX_TIMEOUTS) {
    1551                         /* TODO release as connection lost */
     1536                        // TODO release as connection lost
    15521537                        //tcp_refresh_socket_data(socket_data);
    15531538                        fibril_rwlock_write_unlock(socket_data->local_lock);
    15541539                } else {
    1555                         /* Retransmit */
     1540                        // retransmit
    15561541//                      tcp_retransmit_packet(socket,
    15571542//                          socket_data, timeout->sequence_number);
     
    15601545        } else {
    15611546                fibril_mutex_lock(&socket_data->operation.mutex);
    1562                 /* Set the timeout operation result if state not changed */
     1547                // set the timeout operation result if state not
     1548                // changed
    15631549                if (socket_data->state == timeout->state) {
    15641550                        socket_data->operation.result = ETIMEOUT;
    1565 
    1566                         /* Notify the main fibril */
     1551                        // notify the main fibril
    15671552                        fibril_condvar_signal(&socket_data->operation.condvar);
    1568 
    1569                         /* Keep the global write lock */
     1553                        // keep the global write lock
    15701554                        keep_write_lock = true;
    15711555                } else {
    1572                         /*
    1573                          * Operation is ok, do nothing.
    1574                          * Unlocking from now on, so the unlocking
    1575                          * order does not matter.
    1576                          */
     1556                        // operation is ok, do nothing
     1557                        // unlocking from now on, so the unlocki
     1558                        // order does not matter...
    15771559                        fibril_rwlock_write_unlock(socket_data->local_lock);
    15781560                }
     
    15811563
    15821564out:
    1583         /* Unlock only if no socket */
     1565        // unlock only if no socket
    15841566        if (timeout->globals_read_only)
    15851567                fibril_rwlock_read_unlock(&tcp_globals.lock);
    15861568        else if (!keep_write_lock)
    1587                 /* Release if not desired */
     1569                // release if not desired
    15881570                fibril_rwlock_write_unlock(&tcp_globals.lock);
    15891571       
    1590         /* Release the timeout structure */
     1572        // release the timeout structure
    15911573        free(timeout);
    15921574        return EOK;
     
    15951577int tcp_release_after_timeout(void *data)
    15961578{
    1597         tcp_timeout_t *timeout = data;
    1598         socket_core_t *socket;
    1599         tcp_socket_data_t *socket_data;
     1579        tcp_timeout_ref timeout = data;
     1580        socket_core_ref socket;
     1581        tcp_socket_data_ref socket_data;
    16001582        fibril_rwlock_t *local_lock;
    16011583
    16021584        assert(timeout);
    16031585
    1604         /* Sleep the given timeout */
     1586        // sleep the given timeout
    16051587        async_usleep(timeout->timeout);
    1606 
    1607         /* Lock the globals */
     1588        // lock the globals
    16081589        fibril_rwlock_write_lock(&tcp_globals.lock);
    1609 
    1610         /* Find the pending operation socket */
     1590        // find the pending operation socket
    16111591        socket = socket_port_find(&tcp_globals.sockets, timeout->port,
    16121592            timeout->key, timeout->key_length);
    1613 
    16141593        if (socket && (socket->socket_id == timeout->socket_id)) {
    1615                 socket_data = (tcp_socket_data_t *) socket->specific_data;
     1594                socket_data = (tcp_socket_data_ref) socket->specific_data;
    16161595                assert(socket_data);
    16171596                if (socket_data->local_sockets == timeout->local_sockets) {
     
    16241603                }
    16251604        }
    1626 
    1627         /* Unlock the globals */
     1605        // unlock the globals
    16281606        fibril_rwlock_write_unlock(&tcp_globals.lock);
    1629 
    1630         /* Release the timeout structure */
     1607        // release the timeout structure
    16311608        free(timeout);
    1632 
    16331609        return EOK;
    16341610}
    16351611
    1636 void 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;
     1612void
     1613tcp_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;
    16411618        size_t data_length;
    16421619
     
    16451622        assert(socket->specific_data == socket_data);
    16461623
    1647         /* Sent packet? */
     1624        // sent packet?
    16481625        packet = pq_find(socket_data->outgoing, sequence_number);
    16491626        printf("retransmit %d\n", packet_get_id(packet));
     
    16611638}
    16621639
    1663 int 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;
     1640int
     1641tcp_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;
    16681645
    16691646        assert(local_sockets);
     
    16721649                return EINVAL;
    16731650
    1674         /* Find the socket */
     1651        // find the socket
    16751652        socket = socket_cores_find(local_sockets, socket_id);
    16761653        if (!socket)
    16771654                return ENOTSOCK;
    16781655       
    1679         /* Get the socket specific data */
    1680         socket_data = (tcp_socket_data_t *) socket->specific_data;
     1656        // get the socket specific data
     1657        socket_data = (tcp_socket_data_ref) socket->specific_data;
    16811658        assert(socket_data);
    1682 
    1683         /* Set the backlog */
     1659        // set the backlog
    16841660        socket_data->backlog = backlog;
    16851661
     
    16871663}
    16881664
    1689 int tcp_connect_message(socket_cores_t *local_sockets, int socket_id,
     1665int
     1666tcp_connect_message(socket_cores_ref local_sockets, int socket_id,
    16901667    struct sockaddr *addr, socklen_t addrlen)
    16911668{
    1692         socket_core_t *socket;
    1693         int rc;
     1669        ERROR_DECLARE;
     1670
     1671        socket_core_ref socket;
    16941672
    16951673        assert(local_sockets);
     
    16971675        assert(addrlen > 0);
    16981676
    1699         /* Find the socket */
     1677        // find the socket
    17001678        socket = socket_cores_find(local_sockets, socket_id);
    17011679        if (!socket)
    17021680                return ENOTSOCK;
    17031681       
    1704         rc = tcp_connect_core(socket, local_sockets, addr, addrlen);
    1705         if (rc != EOK) {
     1682        if (ERROR_OCCURRED(tcp_connect_core(socket, local_sockets, addr,
     1683            addrlen))) {
    17061684                tcp_free_socket_data(socket);
    1707                 /* Unbind if bound */
     1685                // unbind if bound
    17081686                if (socket->port > 0) {
    17091687                        socket_ports_exclude(&tcp_globals.sockets,
    1710                             socket->port, free);
     1688                            socket->port);
    17111689                        socket->port = 0;
    17121690                }
    17131691        }
    1714         return rc;
    1715 }
    1716 
    1717 int tcp_connect_core(socket_core_t *socket, socket_cores_t *local_sockets,
     1692        return ERROR_CODE;
     1693}
     1694
     1695int
     1696tcp_connect_core(socket_core_ref socket, socket_cores_ref local_sockets,
    17181697    struct sockaddr *addr, socklen_t addrlen)
    17191698{
    1720         tcp_socket_data_t *socket_data;
    1721         packet_t *packet;
    1722         int rc;
     1699        ERROR_DECLARE;
     1700
     1701        tcp_socket_data_ref socket_data;
     1702        packet_t packet;
    17231703
    17241704        assert(socket);
     
    17261706        assert(addrlen > 0);
    17271707
    1728         /* Get the socket specific data */
    1729         socket_data = (tcp_socket_data_t *) socket->specific_data;
     1708        // get the socket specific data
     1709        socket_data = (tcp_socket_data_ref) socket->specific_data;
    17301710        assert(socket_data);
    17311711        assert(socket->specific_data == socket_data);
     
    17351715                return EINVAL;
    17361716
    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        
     1717        // get the destination port
     1718        ERROR_PROPAGATE(tl_get_address_port(addr, addrlen,
     1719            &socket_data->dest_port));
    17421720        if (socket->port <= 0) {
    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 */
     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
    17501726                tcp_globals.last_used_port = socket->port;
    17511727        }
    17521728
    1753         rc = ip_get_route_req(tcp_globals.ip_phone, IPPROTO_TCP,
     1729        ERROR_PROPAGATE(ip_get_route_req(tcp_globals.ip_phone, IPPROTO_TCP,
    17541730            addr, addrlen, &socket_data->device_id,
    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 */
     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
    17651738        fibril_rwlock_write_unlock(&tcp_globals.lock);
    17661739
    17671740        socket_data->addr = addr;
    17681741        socket_data->addrlen = addrlen;
    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)) {
     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
    17761747                socket_data->addr = NULL;
    17771748                socket_data->addrlen = 0;
    17781749                fibril_rwlock_write_lock(&tcp_globals.lock);
     1750
    17791751        } else {
     1752
    17801753                packet = tcp_get_packets_to_send(socket, socket_data);
    17811754                if (packet) {
    17821755                        fibril_mutex_lock(&socket_data->operation.mutex);
    17831756                        fibril_rwlock_write_unlock(socket_data->local_lock);
    1784 
    1785                         socket_data->state = TCP_SOCKET_SYN_SENT;
    1786 
    1787                         /* Send the packet */
     1757                        // send the packet
    17881758                        printf("connecting %d\n", packet_get_id(packet));
    17891759                        tcp_send_packets(socket_data->device_id, packet);
    17901760
    1791                         /* Wait for a reply */
     1761                        // wait for a reply
    17921762                        fibril_condvar_wait(&socket_data->operation.condvar,
    17931763                            &socket_data->operation.mutex);
    1794                         rc = socket_data->operation.result;
    1795                         if (rc != EOK) {
     1764                        ERROR_CODE = socket_data->operation.result;
     1765                        if (ERROR_CODE != EOK) {
    17961766                                socket_data->addr = NULL;
    17971767                                socket_data->addrlen = 0;
     
    18001770                        socket_data->addr = NULL;
    18011771                        socket_data->addrlen = 0;
    1802                         rc = EINTR;
     1772                        ERROR_CODE = EINTR;
    18031773                }
    18041774        }
    18051775
    18061776        fibril_mutex_unlock(&socket_data->operation.mutex);
    1807         return rc;
    1808 }
    1809 
    1810 int 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;
     1777
     1778        // return the result
     1779        return ERROR_CODE;
     1780}
     1781
     1782int
     1783tcp_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;
    18151789
    18161790        assert(socket);
     
    18181792        assert(socket->specific_data == socket_data);
    18191793
    1820         /* Get TCP header */
    1821         header = (tcp_header_t *) packet_get_data(packet);
     1794        // get tcp header
     1795        header = (tcp_header_ref) packet_get_data(packet);
    18221796        if (!header)
    18231797                return NO_DATA;
     
    18271801        header->sequence_number = htonl(socket_data->next_outgoing);
    18281802
    1829         rc = packet_set_addr(packet, NULL, (uint8_t *) socket_data->addr,
    1830             socket_data->addrlen);
    1831         if (rc != EOK)
     1803        if (ERROR_OCCURRED(packet_set_addr(packet, NULL,
     1804            (uint8_t *) socket_data->addr, socket_data->addrlen)))
    18321805                return tcp_release_and_return(packet, EINVAL);
    18331806
    1834         /* Remember the outgoing FIN */
     1807        // remember the outgoing FIN
    18351808        if (header->finalize)
    18361809                socket_data->fin_outgoing = socket_data->next_outgoing;
     
    18391812}
    18401813
    1841 int 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;
     1814int
     1815tcp_queue_packet(socket_core_ref socket, tcp_socket_data_ref socket_data,
     1816    packet_t packet, size_t data_length)
     1817{
     1818        ERROR_DECLARE;
    18451819
    18461820        assert(socket);
     
    18481822        assert(socket->specific_data == socket_data);
    18491823
    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);
     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);
    18581830
    18591831        socket_data->next_outgoing += data_length;
     
    18611833}
    18621834
    1863 packet_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;
     1835packet_t
     1836tcp_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;
    18701844        size_t data_length;
    1871         int rc;
    18721845
    18731846        assert(socket);
     
    18791852                pq_get_order(packet, NULL, &data_length);
    18801853
    1881                 /*
    1882                  * Send only if fits into the window, respecting the possible
    1883                  * overflow.
    1884                  */
     1854                // send only if fits into the window
     1855                // respecting the possible overflow
    18851856                if (!IS_IN_INTERVAL_OVERFLOW(
    18861857                    (uint32_t) socket_data->last_outgoing,
     
    18961867                if (!sending) {
    18971868                        sending = copy;
    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                         }
     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;
    19051873                }
    19061874
    19071875                previous = copy;
    19081876                packet = pq_next(packet);
    1909 
    1910                 /* Overflow occurred? */
    1911                 if (!packet &&
     1877                // overflow occurred ?
     1878                if ((!packet) &&
    19121879                    (socket_data->last_outgoing > socket_data->next_outgoing)) {
    19131880                        printf("gpts overflow\n");
    1914                         /* Continue from the beginning */
     1881                        // continue from the beginning
    19151882                        packet = socket_data->outgoing;
    19161883                }
     
    19211888}
    19221889
    1923 packet_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;
     1890packet_t
     1891tcp_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;
    19271897        uint32_t checksum;
    1928         int rc;
    19291898
    19301899        assert(socket);
     
    19321901        assert(socket->specific_data == socket_data);
    19331902
    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) {
     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)))) {
    19381907                pq_release_remote(tcp_globals.net_phone, packet_get_id(packet));
    19391908                return NULL;
    19401909        }
    19411910
    1942         /* Get the header */
    1943         header = (tcp_header_t *) packet_get_data(packet);
     1911        // get the header
     1912        header = (tcp_header_ref) packet_get_data(packet);
    19441913        if (!header) {
    19451914                pq_release_remote(tcp_globals.net_phone, packet_get_id(packet));
     
    19481917        assert(ntohl(header->sequence_number) == sequence_number);
    19491918
    1950         /* Adjust the header */
     1919        // adjust the header
    19511920        if (socket_data->next_incoming) {
    19521921                header->acknowledgement_number =
     
    19561925        header->window = htons(socket_data->window);
    19571926
    1958         /* Checksum */
     1927        // checksum
    19591928        header->checksum = 0;
    19601929        checksum = compute_checksum(0, socket_data->pseudo_header,
    19611930            socket_data->headerlen);
    1962         checksum = compute_checksum(checksum,
    1963             (uint8_t *) packet_get_data(packet),
     1931        checksum = compute_checksum(checksum, (uint8_t *) packet_get_data(packet),
    19641932            packet_get_data_length(packet));
    19651933        header->checksum = htons(flip_checksum(compact_checksum(checksum)));
    19661934
    1967         /* Prepare the packet */
    1968         rc = ip_client_prepare_packet(packet, IPPROTO_TCP, 0, 0, 0, 0);
    1969         if (rc != EOK) {
     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))) {
    19701940                pq_release_remote(tcp_globals.net_phone, packet_get_id(packet));
    19711941                return NULL;
    19721942        }
    19731943
    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 
    19811944        return packet;
    19821945}
    19831946
    1984 packet_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;
     1947packet_t
     1948tcp_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;
    19881952
    19891953        assert(socket);
     
    19911955        assert(socket->specific_data == socket_data);
    19921956
    1993         /* Make a copy of the packet */
     1957        // make a copy of the packet
    19941958        copy = packet_get_copy(tcp_globals.net_phone, packet);
    19951959        if (!copy)
     
    20001964}
    20011965
    2002 void tcp_send_packets(device_id_t device_id, packet_t *packet)
    2003 {
    2004         packet_t *next;
     1966void tcp_send_packets(device_id_t device_id, packet_t packet)
     1967{
     1968        packet_t next;
    20051969
    20061970        while (packet) {
     
    20121976}
    20131977
    2014 void tcp_prepare_operation_header(socket_core_t *socket,
    2015     tcp_socket_data_t *socket_data, tcp_header_t *header, int synchronize,
     1978void
     1979tcp_prepare_operation_header(socket_core_ref socket,
     1980    tcp_socket_data_ref socket_data, tcp_header_ref header, int synchronize,
    20161981    int finalize)
    20171982{
     
    20291994}
    20301995
    2031 int tcp_prepare_timeout(int (*timeout_function)(void *tcp_timeout_t),
    2032     socket_core_t *socket, tcp_socket_data_t *socket_data,
     1996int
     1997tcp_prepare_timeout(int (*timeout_function)(void *tcp_timeout_t),
     1998    socket_core_ref socket, tcp_socket_data_ref socket_data,
    20331999    size_t sequence_number, tcp_socket_state_t state, suseconds_t timeout,
    20342000    int globals_read_only)
    20352001{
    2036         tcp_timeout_t *operation_timeout;
     2002        tcp_timeout_ref operation_timeout;
    20372003        fid_t fibril;
    20382004
     
    20412007        assert(socket->specific_data == socket_data);
    20422008
    2043         /* Prepare the timeout with key bundle structure */
     2009        // prepare the timeout with key bundle structure
    20442010        operation_timeout = malloc(sizeof(*operation_timeout) +
    20452011            socket->key_length + 1);
     
    20562022        operation_timeout->state = state;
    20572023
    2058         /* Copy the key */
    2059         operation_timeout->key = ((uint8_t *) operation_timeout) +
     2024        // copy the key
     2025        operation_timeout->key = ((char *) operation_timeout) +
    20602026            sizeof(*operation_timeout);
    20612027        operation_timeout->key_length = socket->key_length;
     
    20632029        operation_timeout->key[operation_timeout->key_length] = '\0';
    20642030
    2065         /* Prepare the timeouting thread */
     2031        // prepare the timeouting thread
    20662032        fibril = fibril_create(timeout_function, operation_timeout);
    20672033        if (!fibril) {
    20682034                free(operation_timeout);
    2069                 return ENOMEM;
    2070         }
    2071 
     2035                return EPARTY;  /* FIXME: use another EC */
     2036        }
    20722037//      fibril_mutex_lock(&socket_data->operation.mutex);
    2073         /* Start the timeout fibril */
     2038        // start the timeouting fibril
    20742039        fibril_add_ready(fibril);
    20752040        //socket_data->state = state;
     
    20772042}
    20782043
    2079 int 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;
     2044int
     2045tcp_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;
    20842052        int packet_id;
    2085         packet_t *packet;
     2053        packet_t packet;
    20862054        size_t length;
    2087         int rc;
    20882055
    20892056        assert(local_sockets);
    20902057
    2091         /* Find the socket */
     2058        // find the socket
    20922059        socket = socket_cores_find(local_sockets, socket_id);
    20932060        if (!socket)
    20942061                return ENOTSOCK;
    20952062
    2096         /* Get the socket specific data */
     2063        // get the socket specific data
    20972064        if (!socket->specific_data)
    20982065                return NO_DATA;
    20992066
    2100         socket_data = (tcp_socket_data_t *) socket->specific_data;
    2101 
    2102         /* Check state */
     2067        socket_data = (tcp_socket_data_ref) socket->specific_data;
     2068
     2069        // check state
    21032070        if ((socket_data->state != TCP_SOCKET_ESTABLISHED) &&
    21042071            (socket_data->state != TCP_SOCKET_CLOSE_WAIT))
    21052072                return ENOTCONN;
    21062073
    2107         /* Send the source address if desired */
     2074        // send the source address if desired
    21082075        if (addrlen) {
    2109                 rc = data_reply(socket_data->addr, socket_data->addrlen);
    2110                 if (rc != EOK)
    2111                         return rc;
     2076                ERROR_PROPAGATE(data_reply(socket_data->addr,
     2077                    socket_data->addrlen));
    21122078                *addrlen = socket_data->addrlen;
    21132079        }
    21142080
    2115         /* Get the next received packet */
     2081        // get the next received packet
    21162082        packet_id = dyn_fifo_value(&socket->received);
    21172083        if (packet_id < 0)
    21182084                return NO_DATA;
    21192085
    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 */
     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
    21302093        dyn_fifo_pop(&socket->received);
    21312094        pq_release_remote(tcp_globals.net_phone, packet_get_id(packet));
    2132 
    2133         /* Return the total length */
     2095        // return the total length
    21342096        return (int) length;
    21352097}
    21362098
    2137 int 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;
     2099int
     2100tcp_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;
    21442109        size_t total_length;
    2145         tcp_header_t *header;
     2110        tcp_header_ref header;
    21462111        int index;
    21472112        int result;
    2148         int rc;
    21492113
    21502114        assert(local_sockets);
    21512115        assert(data_fragment_size);
    21522116
    2153         /* Find the socket */
     2117        // find the socket
    21542118        socket = socket_cores_find(local_sockets, socket_id);
    21552119        if (!socket)
    21562120                return ENOTSOCK;
    21572121
    2158         /* Get the socket specific data */
     2122        // get the socket specific data
    21592123        if (!socket->specific_data)
    21602124                return NO_DATA;
    21612125
    2162         socket_data = (tcp_socket_data_t *) socket->specific_data;
    2163 
    2164         /* Check state */
     2126        socket_data = (tcp_socket_data_ref) socket->specific_data;
     2127
     2128        // check state
    21652129        if ((socket_data->state != TCP_SOCKET_ESTABLISHED) &&
    21662130            (socket_data->state != TCP_SOCKET_CLOSE_WAIT))
    21672131                return ENOTCONN;
    21682132
    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;
     2133        ERROR_PROPAGATE(tl_get_ip_packet_dimension(tcp_globals.ip_phone,
     2134           &tcp_globals.dimensions, socket_data->device_id, &packet_dimension));
    21732135
    21742136        *data_fragment_size =
     
    21762138            packet_dimension->content : socket_data->data_fragment_size);
    21772139
    2178         for (index = 0; index < fragments; index++) {
    2179                 /* Read the data fragment */
     2140        for (index = 0; index < fragments; ++index) {
     2141                // read the data fragment
    21802142                result = tl_socket_read_packet_data(tcp_globals.net_phone,
    21812143                    &packet, TCP_HEADER_SIZE, packet_dimension,
     
    21852147
    21862148                total_length = (size_t) result;
    2187 
    2188                 /* Prefix the TCP header */
     2149                // prefix the tcp header
    21892150                header = PACKET_PREFIX(packet, tcp_header_t);
    21902151                if (!header)
     
    21922153
    21932154                tcp_prepare_operation_header(socket, socket_data, header, 0, 0);
    2194                 rc = tcp_queue_packet(socket, socket_data, packet, total_length);
    2195                 if (rc != EOK)
    2196                         return rc;
    2197         }
    2198 
    2199         /* Flush packets */
     2155                ERROR_PROPAGATE(tcp_queue_packet(socket, socket_data, packet,
     2156                    0));
     2157        }
     2158
     2159        // flush packets
    22002160        packet = tcp_get_packets_to_send(socket, socket_data);
    22012161        fibril_rwlock_write_unlock(socket_data->local_lock);
     
    22032163
    22042164        if (packet) {
    2205                 /* Send the packet */
     2165                // send the packet
    22062166                tcp_send_packets(socket_data->device_id, packet);
    22072167        }
     
    22112171
    22122172int
    2213 tcp_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 */
     2173tcp_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
    22212182        socket = socket_cores_find(local_sockets, socket_id);
    22222183        if (!socket)
    22232184                return ENOTSOCK;
    22242185
    2225         /* Get the socket specific data */
    2226         socket_data = (tcp_socket_data_t *) socket->specific_data;
     2186        // get the socket specific data
     2187        socket_data = (tcp_socket_data_ref) socket->specific_data;
    22272188        assert(socket_data);
    22282189
    2229         /* Check state */
     2190        // check state
    22302191        switch (socket_data->state) {
    22312192        case TCP_SOCKET_ESTABLISHED:
     
    22402201
    22412202        default:
    2242                 /* Just destroy */
    2243                 rc = socket_destroy(tcp_globals.net_phone, socket_id,
     2203                // just destroy
     2204                if (ERROR_NONE(socket_destroy(tcp_globals.net_phone, socket_id,
    22442205                    local_sockets, &tcp_globals.sockets,
    2245                     tcp_free_socket_data);
    2246                 if (rc == EOK) {
     2206                    tcp_free_socket_data))) {
    22472207                        fibril_rwlock_write_unlock(socket_data->local_lock);
    22482208                        fibril_rwlock_write_unlock(&tcp_globals.lock);
    22492209                }
    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 */
     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
    22692224        packet = tcp_get_packets_to_send(socket, socket_data);
    22702225        fibril_rwlock_write_unlock(socket_data->local_lock);
     
    22722227
    22732228        if (packet) {
    2274                 /* Send the packet */
     2229                // send the packet
    22752230                tcp_send_packets(socket_data->device_id, packet);
    22762231        }
     
    22792234}
    22802235
    2281 int 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;
     2236int
     2237tcp_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;
    22872244
    22882245        assert(packet);
    22892246
    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 */
     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
    22972253        *packet = packet_get_4_remote(tcp_globals.net_phone, TCP_HEADER_SIZE,
    22982254            packet_dimension->addr_len, packet_dimension->prefix,
     
    23022258                return ENOMEM;
    23032259
    2304         /* Allocate space in the packet */
     2260        // allocate space in the packet
    23052261        header = PACKET_SUFFIX(*packet, tcp_header_t);
    23062262        if (!header)
     
    23132269}
    23142270
    2315 int 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;
     2271int
     2272tcp_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;
    23232281
    23242282        assert(local_sockets);
     
    23262284        assert(addrlen);
    23272285
    2328         /* Find the socket */
     2286        // find the socket
    23292287        socket = socket_cores_find(local_sockets, socket_id);
    23302288        if (!socket)
    23312289                return ENOTSOCK;
    23322290
    2333         /* Get the socket specific data */
    2334         socket_data = (tcp_socket_data_t *) socket->specific_data;
     2291        // get the socket specific data
     2292        socket_data = (tcp_socket_data_ref) socket->specific_data;
    23352293        assert(socket_data);
    23362294
    2337         /* Check state */
     2295        // check state
    23382296        if (socket_data->state != TCP_SOCKET_LISTEN)
    23392297                return EINVAL;
     
    23492307                        return ENOTSOCK;
    23502308
    2351                 /* Get the socket specific data */
    2352                 socket_data = (tcp_socket_data_t *) accepted->specific_data;
     2309                // get the socket specific data
     2310                socket_data = (tcp_socket_data_ref) accepted->specific_data;
    23532311                assert(socket_data);
    2354                 /* TODO can it be in another state? */
     2312                // TODO can it be in another state?
    23552313                if (socket_data->state == TCP_SOCKET_ESTABLISHED) {
    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;
     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));
    23652319                        *addrlen = socket_data->addrlen;
    23662320
     
    23722326       
    23732327                        if (new_socket_id > 0) {
    2374                                 rc = socket_cores_update(local_sockets,
    2375                                     accepted->socket_id, new_socket_id);
    2376                                 if (rc != EOK)
    2377                                         return rc;
     2328                                ERROR_PROPAGATE(socket_cores_update(
     2329                                    local_sockets, accepted->socket_id,
     2330                                    new_socket_id));
    23782331                                accepted->socket_id = new_socket_id;
    23792332                        }
     
    23862339}
    23872340
    2388 void tcp_free_socket_data(socket_core_t *socket)
    2389 {
    2390         tcp_socket_data_t *socket_data;
     2341void
     2342tcp_free_socket_data(socket_core_ref socket)
     2343{
     2344        tcp_socket_data_ref socket_data;
    23912345
    23922346        assert(socket);
     
    23942348        printf("destroy_socket %d\n", socket->socket_id);
    23952349
    2396         /* Get the socket specific data */
    2397         socket_data = (tcp_socket_data_t *) socket->specific_data;
     2350        // get the socket specific data
     2351        socket_data = (tcp_socket_data_ref) socket->specific_data;
    23982352        assert(socket_data);
    2399 
    2400         /* Free the pseudo header */
     2353        //free the pseudo header
    24012354        if (socket_data->pseudo_header) {
    24022355                if (socket_data->headerlen) {
     
    24072360                socket_data->pseudo_header = NULL;
    24082361        }
    2409 
    24102362        socket_data->headerlen = 0;
    2411 
    2412         /* Free the address */
     2363        // free the address
    24132364        if (socket_data->addr) {
    24142365                if (socket_data->addrlen) {
     
    24222373}
    24232374
    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  */
    2430 int tcp_release_and_return(packet_t *packet, int result)
     2375int tcp_release_and_return(packet_t packet, int result)
    24312376{
    24322377        pq_release_remote(tcp_globals.net_phone, packet_get_id(packet));
     
    24342379}
    24352380
    2436 /** Process IPC messages from the IP module
     2381/** Default thread for new connections.
    24372382 *
    2438  * @param[in]     iid   Message identifier.
    2439  * @param[in,out] icall Message parameters.
     2383 *  @param[in] iid The initial message identifier.
     2384 *  @param[in] icall The initial message call structure.
    24402385 *
    24412386 */
    2442 static void tcp_receiver(ipc_callid_t iid, ipc_call_t *icall)
    2443 {
    2444         packet_t *packet;
    2445         int rc;
    2446        
     2387static 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
    24472395        while (true) {
    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.
     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.
    24672431 *
    2468  * @param[in] net_phone Network module phone.
     2432 *  @param argc The count of the command line arguments. Ignored parameter.
     2433 *  @param argv The command line parameters. Ignored parameter.
    24692434 *
    2470  * @return EOK on success.
    2471  * @return ENOMEM if there is not enough memory left.
     2435 *  @returns EOK on success.
     2436 *  @returns Other error codes as defined for each specific module start function.
    24722437 *
    24732438 */
    2474 int 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 
    2501 out:
    2502         fibril_rwlock_write_unlock(&tcp_globals.lock);
    2503         return rc;
    2504 }
    2505 
    2506 int main(int argc, char *argv[])
    2507 {
    2508         return tl_module_start(SERVICE_TCP);
     2439int
     2440main(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;
    25092451}
    25102452
Note: See TracChangeset for help on using the changeset viewer.