Ignore:
File:
1 edited

Legend:

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

    r0578271 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 */
    37 
    38 #include "tcp.h"
    39 #include "tcp_header.h"
    40 #include "tcp_module.h"
    4137
    4238#include <assert.h>
     
    4743#include <stdio.h>
    4844#include <errno.h>
     45#include <err.h>
    4946
    5047#include <ipc/ipc.h>
     
    7572#include <tl_interface.h>
    7673
     74#include "tcp.h"
     75#include "tcp_header.h"
     76#include "tcp_module.h"
     77
    7778/** TCP module name. */
    7879#define NAME    "TCP protocol"
     
    109110
    110111/** Returns a value indicating whether the value is in the interval respecting
    111  * the possible overflow.
     112 *  the possible overflow.
    112113 *
    113  * The high end and/or the value may overflow, be lower than the low value.
    114  *
    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.
     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.
    118118 */
    119119#define IS_IN_INTERVAL_OVERFLOW(lower, value, higher_equal) \
     
    165165};
    166166
    167 static int tcp_release_and_return(packet_t, int);
    168 static void tcp_prepare_operation_header(socket_core_ref, tcp_socket_data_ref,
    169     tcp_header_ref, int synchronize, int);
    170 static int tcp_prepare_timeout(int (*)(void *), socket_core_ref,
    171     tcp_socket_data_ref, size_t, tcp_socket_state_t, suseconds_t, int);
    172 static void tcp_free_socket_data(socket_core_ref);
    173 
    174 static int tcp_timeout(void *);
    175 
    176 static int tcp_release_after_timeout(void *);
    177 
    178 static int tcp_process_packet(device_id_t, packet_t, services_t);
    179 static int tcp_connect_core(socket_core_ref, socket_cores_ref,
    180     struct sockaddr *, socklen_t);
    181 static int tcp_queue_prepare_packet(socket_core_ref, tcp_socket_data_ref,
    182     packet_t, size_t);
    183 static int tcp_queue_packet(socket_core_ref, tcp_socket_data_ref, packet_t,
    184     size_t);
    185 static packet_t tcp_get_packets_to_send(socket_core_ref, tcp_socket_data_ref);
    186 static void tcp_send_packets(device_id_t, packet_t);
    187 
    188 static void tcp_process_acknowledgement(socket_core_ref, tcp_socket_data_ref,
    189     tcp_header_ref);
    190 static packet_t tcp_send_prepare_packet(socket_core_ref, tcp_socket_data_ref,
    191     packet_t, size_t, size_t);
    192 static packet_t tcp_prepare_copy(socket_core_ref, tcp_socket_data_ref, packet_t,
    193     size_t, size_t);
    194 /* static */ void tcp_retransmit_packet(socket_core_ref, tcp_socket_data_ref,
    195     size_t);
    196 static int tcp_create_notification_packet(packet_t *, socket_core_ref,
    197     tcp_socket_data_ref, int, int);
    198 static void tcp_refresh_socket_data(tcp_socket_data_ref);
    199 
    200 static void tcp_initialize_socket_data(tcp_socket_data_ref);
    201 
    202 static int tcp_process_listen(socket_core_ref, tcp_socket_data_ref,
    203     tcp_header_ref, packet_t, struct sockaddr *, struct sockaddr *, size_t);
    204 static int tcp_process_syn_sent(socket_core_ref, tcp_socket_data_ref,
    205     tcp_header_ref, packet_t);
    206 static int tcp_process_syn_received(socket_core_ref, tcp_socket_data_ref,
    207     tcp_header_ref, packet_t);
    208 static int tcp_process_established(socket_core_ref, tcp_socket_data_ref,
    209     tcp_header_ref, packet_t, int, size_t);
    210 static int tcp_queue_received_packet(socket_core_ref, tcp_socket_data_ref,
    211     packet_t, int, size_t);
    212 
    213 static int tcp_received_msg(device_id_t, packet_t, services_t, services_t);
    214 static int tcp_process_client_messages(ipc_callid_t, ipc_call_t);
    215 
    216 static int tcp_listen_message(socket_cores_ref, int, int);
    217 static int tcp_connect_message(socket_cores_ref, int, struct sockaddr *,
    218     socklen_t);
    219 static int tcp_recvfrom_message(socket_cores_ref, int, int, size_t *);
    220 static int tcp_send_message(socket_cores_ref, int, int, size_t *, int);
    221 static int tcp_accept_message(socket_cores_ref, int, int, size_t *, size_t *);
    222 static int tcp_close_message(socket_cores_ref, 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);
    223245
    224246/** TCP global data. */
    225247tcp_globals_t tcp_globals;
    226248
    227 /** Initializes the TCP module.
    228  *
    229  * @param[in] client_connection The client connection processing function. The
    230  *                      module skeleton propagates its own one.
    231  * @returns             EOK on success.
    232  * @returns             ENOMEM if there is not enough memory left.
    233  */
    234249int tcp_initialize(async_client_conn_t client_connection)
    235250{
    236         int rc;
     251        ERROR_DECLARE;
    237252
    238253        assert(client_connection);
     
    245260        tcp_globals.ip_phone = ip_bind_service(SERVICE_IP, IPPROTO_TCP,
    246261            SERVICE_TCP, client_connection);
    247         if (tcp_globals.ip_phone < 0) {
    248                 fibril_rwlock_write_unlock(&tcp_globals.lock);
     262        if (tcp_globals.ip_phone < 0)
    249263                return tcp_globals.ip_phone;
    250         }
    251264       
    252         rc = socket_ports_initialize(&tcp_globals.sockets);
    253         if (rc != EOK)
    254                 goto out;
    255 
    256         rc = packet_dimensions_initialize(&tcp_globals.dimensions);
    257         if (rc != EOK) {
     265        ERROR_PROPAGATE(socket_ports_initialize(&tcp_globals.sockets));
     266        if (ERROR_OCCURRED(packet_dimensions_initialize(
     267            &tcp_globals.dimensions))) {
    258268                socket_ports_destroy(&tcp_globals.sockets);
    259                 goto out;
     269                return ERROR_CODE;
    260270        }
    261271
    262272        tcp_globals.last_used_port = TCP_FREE_PORTS_START - 1;
    263 
    264 out:
    265273        fibril_rwlock_write_unlock(&tcp_globals.lock);
    266         return rc;
     274
     275        return EOK;
    267276}
    268277
     
    271280    services_t error)
    272281{
    273         int rc;
     282        ERROR_DECLARE;
    274283
    275284        if (receiver != SERVICE_TCP)
     
    277286
    278287        fibril_rwlock_write_lock(&tcp_globals.lock);
    279         rc = tcp_process_packet(device_id, packet, error);
    280         if (rc != EOK)
     288        if (ERROR_OCCURRED(tcp_process_packet(device_id, packet, error)))
    281289                fibril_rwlock_write_unlock(&tcp_globals.lock);
    282290
    283         printf("receive %d \n", rc);
    284 
    285         return rc;
     291        printf("receive %d \n", ERROR_CODE);
     292
     293        return ERROR_CODE;
    286294}
    287295
    288296int tcp_process_packet(device_id_t device_id, packet_t packet, services_t error)
    289297{
     298        ERROR_DECLARE;
     299
    290300        size_t length;
    291301        size_t offset;
     
    303313        struct sockaddr *dest;
    304314        size_t addrlen;
    305         int rc;
    306 
    307         switch (error) {
    308         case SERVICE_NONE:
    309                 break;
    310         case SERVICE_ICMP:
    311                 // process error
    312                 result = icmp_client_process_packet(packet, &type, &code, NULL,
    313                     NULL);
    314                 if (result < 0)
    315                         return tcp_release_and_return(packet, result);
    316 
    317                 length = (size_t) result;
    318                 rc = packet_trim(packet, length, 0);
    319                 if (rc != EOK)
    320                         return tcp_release_and_return(packet, rc);
    321                 break;
    322         default:
    323                 return tcp_release_and_return(packet, ENOTSUP);
     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                }
    324335        }
    325336
     
    339350
    340351        // trim all but TCP header
    341         rc = packet_trim(packet, offset, 0);
    342         if (rc != EOK)
    343                 return tcp_release_and_return(packet, rc);
     352        if (ERROR_OCCURRED(packet_trim(packet, offset, 0)))
     353                return tcp_release_and_return(packet, ERROR_CODE);
    344354
    345355        // get tcp header
     
    357367        addrlen = (size_t) result;
    358368
    359         rc = tl_set_address_port(src, addrlen, ntohs(header->source_port));
    360         if (rc != EOK)
    361                 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);
    362372       
    363373        // find the destination socket
     
    369379                    ntohs(header->destination_port), SOCKET_MAP_KEY_LISTENING,
    370380                    0);
    371         }
    372         if (!socket) {
    373                 if (tl_prepare_icmp_packet(tcp_globals.net_phone,
    374                     tcp_globals.icmp_phone, packet, error) == EOK) {
    375                         icmp_destination_unreachable_msg(tcp_globals.icmp_phone,
    376                             ICMP_PORT_UNREACH, 0, packet);
    377                 }
    378                 return EADDRNOTAVAIL;
    379         }
    380 
     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        }
    381391        printf("socket id %d\n", socket->socket_id);
    382392        socket_data = (tcp_socket_data_ref) socket->specific_data;
     
    392402        total_length = 0;
    393403        do {
    394                 fragments++;
     404                ++fragments;
    395405                length = packet_get_data_length(next_packet);
    396406                if (length <= 0)
     
    411421
    412422        if (error)
    413                 goto has_error_service;
     423                goto error;
    414424       
    415425        if (socket_data->state == TCP_SOCKET_LISTEN) {
     426
    416427                if (socket_data->pseudo_header) {
    417428                        free(socket_data->pseudo_header);
     
    420431                }
    421432
    422                 rc = ip_client_get_pseudo_header(IPPROTO_TCP, src, addrlen,
    423                     dest, addrlen, total_length, &socket_data->pseudo_header,
    424                     &socket_data->headerlen);
    425                 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))) {
    426436                        fibril_rwlock_write_unlock(socket_data->local_lock);
    427                         return tcp_release_and_return(packet, rc);
    428                 }
    429         } else {
    430                 rc = ip_client_set_pseudo_header_data_length(
    431                     socket_data->pseudo_header, socket_data->headerlen,
    432                     total_length);
    433                 if (rc != EOK) {
    434                         fibril_rwlock_write_unlock(socket_data->local_lock);
    435                         return tcp_release_and_return(packet, rc);
    436                 }
     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);
    437445        }
    438446       
     
    444452                fibril_rwlock_write_unlock(socket_data->local_lock);
    445453
    446                 rc = tl_prepare_icmp_packet(tcp_globals.net_phone,
    447                     tcp_globals.icmp_phone, packet, error);
    448                 if (rc == EOK) {
     454                if (ERROR_NONE(tl_prepare_icmp_packet(tcp_globals.net_phone,
     455                    tcp_globals.icmp_phone, packet, error))) {
    449456                        // checksum error ICMP
    450457                        icmp_parameter_problem_msg(tcp_globals.icmp_phone,
     
    457464        }
    458465
    459 has_error_service:
     466error:
    460467        fibril_rwlock_read_unlock(&tcp_globals.lock);
    461468
     
    463470        switch (socket_data->state) {
    464471        case TCP_SOCKET_LISTEN:
    465                 rc = tcp_process_listen(socket, socket_data, header, packet,
    466                     src, dest, addrlen);
     472                ERROR_CODE = tcp_process_listen(socket, socket_data, header,
     473                    packet, src, dest, addrlen);
    467474                break;
    468475        case TCP_SOCKET_SYN_RECEIVED:
    469                 rc = tcp_process_syn_received(socket, socket_data, header,
    470                     packet);
     476                ERROR_CODE = tcp_process_syn_received(socket, socket_data,
     477                    header, packet);
    471478                break;
    472479        case TCP_SOCKET_SYN_SENT:
    473                 rc = tcp_process_syn_sent(socket, socket_data, header, packet);
     480                ERROR_CODE = tcp_process_syn_sent(socket, socket_data, header,
     481                    packet);
    474482                break;
    475483        case TCP_SOCKET_FIN_WAIT_1:
     
    482490                // ack releasing the socket gets processed later
    483491        case TCP_SOCKET_ESTABLISHED:
    484                 rc = tcp_process_established(socket, socket_data, header,
    485                     packet, fragments, total_length);
     492                ERROR_CODE = tcp_process_established(socket, socket_data,
     493                    header, packet, fragments, total_length);
    486494                break;
    487495        default:
     
    489497        }
    490498
    491         if (rc != EOK) {
     499        if (ERROR_CODE != EOK) {
     500                printf("process %d\n", ERROR_CODE);
    492501                fibril_rwlock_write_unlock(socket_data->local_lock);
    493                 printf("process %d\n", rc);
    494502        }
    495503
     
    499507int
    500508tcp_process_established(socket_core_ref socket, tcp_socket_data_ref socket_data,
    501     tcp_header_ref header, packet_t packet, int fragments, size_t total_length)
    502 {
     509    tcp_header_ref header, packet_t packet, int fragments,
     510    size_t total_length)
     511{
     512        ERROR_DECLARE;
     513
    503514        packet_t next_packet;
    504515        packet_t tmp_packet;
     
    509520        size_t offset;
    510521        uint32_t new_sequence_number;
    511         int rc;
    512522
    513523        assert(socket);
     
    550560                }
    551561
    552                 if (offset > 0) {
    553                         rc = packet_trim(packet, offset, 0);
    554                         if (rc != EOK)
    555                                 return tcp_release_and_return(packet, rc);
    556                 }
     562                if ((offset > 0) && (ERROR_OCCURRED(packet_trim(packet,
     563                    offset, 0))))
     564                        return tcp_release_and_return(packet, ERROR_CODE);
    557565
    558566                assert(new_sequence_number == socket_data->next_incoming);
     
    586594                        if (length <= offset)
    587595                                next_packet = pq_next(next_packet);
    588                         else {
    589                                 rc = packet_trim(next_packet, 0,
    590                                     length - offset));
    591                                 if (rc != EOK)
    592                                         return tcp_release_and_return(packet,
    593                                             rc);
    594                         }
     596                        else if (ERROR_OCCURRED(packet_trim(next_packet, 0,
     597                            length - offset)))
     598                                return tcp_release_and_return(packet,
     599                                    ERROR_CODE);
    595600                        offset -= length;
    596601                        total_length -= length - offset;
     
    617622                // remove the header
    618623                total_length -= TCP_HEADER_LENGTH(header);
    619                 rc = packet_trim(packet, TCP_HEADER_LENGTH(header), 0);
    620                 if (rc != EOK)
    621                         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);
    622627
    623628                if (total_length) {
    624                         rc = tcp_queue_received_packet(socket, socket_data,
    625                             packet, fragments, total_length);
    626                         if (rc != EOK)
    627                                 return rc;
     629                        ERROR_PROPAGATE(tcp_queue_received_packet(socket,
     630                            socket_data, packet, fragments, total_length));
    628631                } else {
    629632                        total_length = 1;
     
    633636                packet = socket_data->incoming;
    634637                while (packet) {
    635                         rc = pq_get_order(socket_data->incoming, &order, NULL);
    636                         if (rc != EOK) {
     638
     639                        if (ERROR_OCCURRED(pq_get_order(socket_data->incoming,
     640                            &order, NULL))) {
    637641                                // remove the corrupted packet
    638642                                next_packet = pq_detach(packet);
     
    671675                                    socket_data->next_incoming) {
    672676                                        // queue received data
    673                                         rc = tcp_queue_received_packet(socket,
     677                                        ERROR_PROPAGATE(
     678                                            tcp_queue_received_packet(socket,
    674679                                            socket_data, packet, 1,
    675                                             packet_get_data_length(packet));
    676                                         if (rc != EOK)
    677                                                 return rc;
     680                                            packet_get_data_length(packet)));
    678681                                        socket_data->next_incoming =
    679682                                            new_sequence_number;
     
    681684                                        continue;
    682685                                        // at least partly following data?
    683                                 }
    684                                 if (IS_IN_INTERVAL_OVERFLOW(sequence_number,
    685                                     socket_data->next_incoming, new_sequence_number)) {
     686                                } else if (IS_IN_INTERVAL_OVERFLOW(
     687                                    sequence_number, socket_data->next_incoming,
     688                                    new_sequence_number)) {
    686689                                        if (socket_data->next_incoming <
    687690                                            new_sequence_number) {
     
    693696                                                    new_sequence_number;
    694697                                        }
    695                                         rc = packet_trim(packet,length, 0);
    696                                         if (rc == EOK) {
     698                                        if (ERROR_NONE(packet_trim(packet,
     699                                            length, 0))) {
    697700                                                // queue received data
    698                                                 rc = tcp_queue_received_packet(
     701                                                ERROR_PROPAGATE(
     702                                                    tcp_queue_received_packet(
    699703                                                    socket, socket_data, packet,
    700704                                                    1, packet_get_data_length(
    701                                                     packet));
    702                                                 if (rc != EOK)
    703                                                         return rc;
     705                                                    packet)));
    704706                                                socket_data->next_incoming =
    705707                                                    new_sequence_number;
     
    726728                // remove the header
    727729                total_length -= TCP_HEADER_LENGTH(header);
    728                 rc = packet_trim(packet, TCP_HEADER_LENGTH(header), 0);
    729                 if (rc != EOK)
    730                         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);
    731733
    732734                next_packet = pq_detach(packet);
    733735                length = packet_get_data_length(packet);
    734                 rc = pq_add(&socket_data->incoming, packet, new_sequence_number,
    735                     length);
    736                 if (rc != EOK) {
     736                if (ERROR_OCCURRED(pq_add(&socket_data->incoming, packet,
     737                    new_sequence_number, length))) {
    737738                        // remove the corrupted packets
    738739                        pq_release_remote(tcp_globals.net_phone,
     
    745746                                tmp_packet = pq_detach(next_packet);
    746747                                length = packet_get_data_length(next_packet);
    747 
    748                                 rc = pq_set_order(next_packet,
    749                                     new_sequence_number, length);
    750                                 if (rc != EOK) {
    751                                         pq_release_remote(tcp_globals.net_phone,
    752                                             packet_get_id(next_packet));
    753                                 }
    754                                 rc = pq_insert_after(packet, next_packet);
    755                                 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))) {
    756752                                        pq_release_remote(tcp_globals.net_phone,
    757753                                            packet_get_id(next_packet));
     
    785781        if (!packet) {
    786782                // create the notification packet
    787                 rc = tcp_create_notification_packet(&packet, socket,
    788                     socket_data, 0, 0);
    789                 if (rc != EOK)
    790                         return rc;
    791                 rc = tcp_queue_prepare_packet(socket, socket_data, packet, 1);
    792                 if (rc != EOK)
    793                         return rc;
     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));
    794787                packet = tcp_send_prepare_packet(socket, socket_data, packet, 1,
    795788                    socket_data->last_outgoing + 1);
     
    809802    size_t total_length)
    810803{
     804        ERROR_DECLARE;
     805
    811806        packet_dimension_ref packet_dimension;
    812         int rc;
    813807
    814808        assert(socket);
     
    820814
    821815        // queue the received packet
    822         rc = dyn_fifo_push(&socket->received, packet_get_id(packet),
    823             SOCKET_MAX_RECEIVED_SIZE);
    824         if (rc != EOK)
    825                 return tcp_release_and_return(packet, rc);
    826         rc = tl_get_ip_packet_dimension(tcp_globals.ip_phone,
    827             &tcp_globals.dimensions, socket_data->device_id, &packet_dimension);
    828         if (rc != EOK)
    829                 return tcp_release_and_return(packet, rc);
     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        }
    830823
    831824        // decrease the window size
     
    846839    tcp_header_ref header, packet_t packet)
    847840{
     841        ERROR_DECLARE;
     842
    848843        packet_t next_packet;
    849         int rc;
    850844
    851845        assert(socket);
     
    869863        }
    870864        // trim if longer than the header
    871         if (packet_get_data_length(packet) > sizeof(*header)) {
    872                 rc = packet_trim(packet, 0,
    873                     packet_get_data_length(packet) - sizeof(*header));
    874                 if (rc != EOK)
    875                         return tcp_release_and_return(packet, rc);
     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);
    876869        }
    877870        tcp_prepare_operation_header(socket, socket_data, header, 0, 0);
     
    902895    size_t addrlen)
    903896{
     897        ERROR_DECLARE;
     898
    904899        packet_t next_packet;
    905900        socket_core_ref socket;
     
    908903        int listening_socket_id = listening_socket->socket_id;
    909904        int listening_port = listening_socket->port;
    910         int rc;
    911905
    912906        assert(listening_socket);
     
    938932        memcpy(socket_data->addr, src, socket_data->addrlen);
    939933        socket_data->dest_port = ntohs(header->source_port);
    940         rc = tl_set_address_port(socket_data->addr, socket_data->addrlen,
    941             socket_data->dest_port);
    942         if (rc != EOK) {
     934        if (ERROR_OCCURRED(tl_set_address_port(socket_data->addr,
     935            socket_data->addrlen, socket_data->dest_port))) {
    943936                free(socket_data->addr);
    944937                free(socket_data);
    945                 return tcp_release_and_return(packet, rc);
     938                pq_release_remote(tcp_globals.net_phone, packet_get_id(packet));
     939                return ERROR_CODE;
    946940        }
    947941
    948942        // create a socket
    949943        socket_id = -1;
    950         rc = socket_create(socket_data->local_sockets, listening_socket->phone,
    951             socket_data, &socket_id);
    952         if (rc != EOK) {
     944        if (ERROR_OCCURRED(socket_create(socket_data->local_sockets,
     945            listening_socket->phone, socket_data, &socket_id))) {
    953946                free(socket_data->addr);
    954947                free(socket_data);
    955                 return tcp_release_and_return(packet, rc);
     948                return tcp_release_and_return(packet, ERROR_CODE);
    956949        }
    957950
     
    968961        listening_socket = socket_port_find(&tcp_globals.sockets,
    969962            listening_port, SOCKET_MAP_KEY_LISTENING, 0);
    970         if (!listening_socket ||
     963        if ((!listening_socket) ||
    971964            (listening_socket->socket_id != listening_socket_id)) {
    972965                fibril_rwlock_write_unlock(&tcp_globals.lock);
     
    990983        assert(socket_data);
    991984
    992         rc = socket_port_add(&tcp_globals.sockets, listening_port, socket,
    993             (const char *) 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);
    994987        assert(socket == socket_port_find(&tcp_globals.sockets, listening_port,
    995988            (const char *) socket_data->addr, socket_data->addrlen));
    996989
    997 //      rc = socket_bind_free_port(&tcp_globals.sockets, socket,
     990//      ERROR_CODE = socket_bind_free_port(&tcp_globals.sockets, socket,
    998991//          TCP_FREE_PORTS_START, TCP_FREE_PORTS_END,
    999992//          tcp_globals.last_used_port);
    1000993//      tcp_globals.last_used_port = socket->port;
    1001994        fibril_rwlock_write_unlock(&tcp_globals.lock);
    1002         if (rc != EOK) {
     995        if (ERROR_CODE != EOK) {
    1003996                socket_destroy(tcp_globals.net_phone, socket->socket_id,
    1004997                    socket_data->local_sockets, &tcp_globals.sockets,
    1005998                    tcp_free_socket_data);
    1006                 return tcp_release_and_return(packet, rc);
     999                return tcp_release_and_return(packet, ERROR_CODE);
    10071000        }
    10081001
     
    10181011
    10191012        // trim if longer than the header
    1020         if (packet_get_data_length(packet) > sizeof(*header)) {
    1021                 rc = packet_trim(packet, 0,
    1022                     packet_get_data_length(packet) - sizeof(*header));
    1023                 if (rc != EOK) {
    1024                         socket_destroy(tcp_globals.net_phone, socket->socket_id,
    1025                             socket_data->local_sockets, &tcp_globals.sockets,
    1026                             tcp_free_socket_data);
    1027                         return tcp_release_and_return(packet, rc);
    1028                 }
    1029         }
    1030 
    1031         tcp_prepare_operation_header(socket, socket_data, header, 1, 0);
    1032 
    1033         rc = tcp_queue_packet(socket, socket_data, packet, 1);
    1034         if (rc != EOK) {
     1013        if ((packet_get_data_length(packet) > sizeof(*header)) &&
     1014            ERROR_OCCURRED(packet_trim(packet, 0,
     1015            packet_get_data_length(packet) - sizeof(*header)))) {
    10351016                socket_destroy(tcp_globals.net_phone, socket->socket_id,
    10361017                    socket_data->local_sockets, &tcp_globals.sockets,
    10371018                    tcp_free_socket_data);
    1038                 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;
    10391029        }
    10401030
     
    10601050    tcp_socket_data_ref socket_data, tcp_header_ref header, packet_t packet)
    10611051{
     1052        ERROR_DECLARE;
     1053
    10621054        socket_core_ref listening_socket;
    10631055        tcp_socket_data_ref listening_socket_data;
    1064         int rc;
    10651056
    10661057        assert(socket);
     
    10871078
    10881079                // queue the received packet
    1089                 rc = dyn_fifo_push(&listening_socket->accepted,
    1090                     (-1 * socket->socket_id), listening_socket_data->backlog);
    1091                 if (rc == EOK) {
     1080                if (ERROR_NONE(dyn_fifo_push(&listening_socket->accepted,
     1081                    (-1 * socket->socket_id),
     1082                    listening_socket_data->backlog))) {
     1083
    10921084                        // notify the destination socket
    10931085                        async_msg_5(socket->phone, NET_SOCKET_ACCEPTED,
     
    11041096
    11051097        // create the notification packet
    1106         rc = tcp_create_notification_packet(&packet, socket, socket_data, 0, 1);
    1107         if (rc != EOK)
    1108                 return rc;
     1098        ERROR_PROPAGATE(tcp_create_notification_packet(&packet, socket,
     1099            socket_data, 0, 1));
    11091100
    11101101        // send the packet
    1111         rc = tcp_queue_packet(socket, socket_data, packet, 1);
    1112         if (rc != EOK)
    1113                 return rc;
     1102        ERROR_PROPAGATE(tcp_queue_packet(socket, socket_data, packet, 1));
    11141103
    11151104        // flush packets
     
    12021191        if (number == socket_data->expected) {
    12031192                // increase the counter
    1204                 socket_data->expected_count++;
     1193                ++socket_data->expected_count;
    12051194                if (socket_data->expected_count == TCP_FAST_RETRANSMIT_COUNT) {
    12061195                        socket_data->expected_count = 1;
     
    12111200}
    12121201
    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  * @returns             EOK on success.
    1221  * @returns             ENOTSUP if the message is not known.
    1222  *
    1223  * @see tcp_interface.h
    1224  * @see IS_NET_TCP_MESSAGE()
    1225  */
    1226 int
    1227 tcp_message_standalone(ipc_callid_t callid, ipc_call_t *call,
    1228     ipc_call_t *answer, int *answer_count)
    1229 {
     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
    12301207        packet_t packet;
    1231         int rc;
    12321208
    12331209        assert(call);
     
    12381214        switch (IPC_GET_METHOD(*call)) {
    12391215        case NET_TL_RECEIVED:
    1240 //              fibril_rwlock_read_lock(&tcp_globals.lock);
    1241                 rc = packet_translate_remote(tcp_globals.net_phone, &packet,
    1242                     IPC_GET_PACKET(call));
    1243                 if (rc != EOK) {
    1244 //                      fibril_rwlock_read_unlock(&tcp_globals.lock);
    1245                         return rc;
    1246                 }
    1247                 rc = tcp_received_msg(IPC_GET_DEVICE(call), packet, SERVICE_TCP,
    1248                     IPC_GET_ERROR(call));
    1249 //              fibril_rwlock_read_unlock(&tcp_globals.lock);
    1250                 return rc;
     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
    12511225        case IPC_M_CONNECT_TO_ME:
    12521226                return tcp_process_client_messages(callid, *call);
     
    15471521        socket = socket_port_find(&tcp_globals.sockets, timeout->port,
    15481522            timeout->key, timeout->key_length);
    1549         if (!socket || (socket->socket_id != timeout->socket_id))
     1523        if (!(socket && (socket->socket_id == timeout->socket_id)))
    15501524                goto out;
    15511525       
     
    15581532        if (timeout->sequence_number) {
    15591533                // increase the timeout counter;
    1560                 socket_data->timeout_count++;
     1534                ++socket_data->timeout_count;
    15611535                if (socket_data->timeout_count == TCP_MAX_TIMEOUTS) {
    15621536                        // TODO release as connection lost
     
    16931667    struct sockaddr *addr, socklen_t addrlen)
    16941668{
     1669        ERROR_DECLARE;
     1670
    16951671        socket_core_ref socket;
    1696         int rc;
    16971672
    16981673        assert(local_sockets);
     
    17051680                return ENOTSOCK;
    17061681       
    1707         rc = tcp_connect_core(socket, local_sockets, addr, addrlen);
    1708         if (rc != EOK) {
     1682        if (ERROR_OCCURRED(tcp_connect_core(socket, local_sockets, addr,
     1683            addrlen))) {
    17091684                tcp_free_socket_data(socket);
    17101685                // unbind if bound
     
    17151690                }
    17161691        }
    1717         return rc;
     1692        return ERROR_CODE;
    17181693}
    17191694
     
    17221697    struct sockaddr *addr, socklen_t addrlen)
    17231698{
     1699        ERROR_DECLARE;
     1700
    17241701        tcp_socket_data_ref socket_data;
    17251702        packet_t packet;
    1726         int rc;
    17271703
    17281704        assert(socket);
     
    17401716
    17411717        // get the destination port
    1742         rc = tl_get_address_port(addr, addrlen, &socket_data->dest_port);
    1743         if (rc != EOK)
    1744                 return rc;
    1745        
     1718        ERROR_PROPAGATE(tl_get_address_port(addr, addrlen,
     1719            &socket_data->dest_port));
    17461720        if (socket->port <= 0) {
    17471721                // try to find a free port
    1748                 rc = socket_bind_free_port(&tcp_globals.sockets, socket,
    1749                     TCP_FREE_PORTS_START, TCP_FREE_PORTS_END,
    1750                     tcp_globals.last_used_port);
    1751                 if (rc != EOK)
    1752                         return rc;
     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));
    17531725                // set the next port as the search starting port number
    17541726                tcp_globals.last_used_port = socket->port;
    17551727        }
    17561728
    1757         rc = ip_get_route_req(tcp_globals.ip_phone, IPPROTO_TCP,
     1729        ERROR_PROPAGATE(ip_get_route_req(tcp_globals.ip_phone, IPPROTO_TCP,
    17581730            addr, addrlen, &socket_data->device_id,
    1759             &socket_data->pseudo_header, &socket_data->headerlen);
    1760         if (rc != EOK)
    1761                 return rc;
     1731            &socket_data->pseudo_header, &socket_data->headerlen));
    17621732
    17631733        // create the notification packet
    1764         rc = tcp_create_notification_packet(&packet, socket, socket_data, 1, 0);
    1765         if (rc != EOK)
    1766                 return rc;
     1734        ERROR_PROPAGATE(tcp_create_notification_packet(&packet, socket,
     1735            socket_data, 1, 0));
    17671736
    17681737        // unlock the globals and wait for an operation
     
    17721741        socket_data->addrlen = addrlen;
    17731742        // send the packet
    1774 
    1775         if (((rc = tcp_queue_packet(socket, socket_data, packet, 1)) != EOK) ||
    1776             ((rc = tcp_prepare_timeout(tcp_timeout, socket, socket_data, 0,
    1777             TCP_SOCKET_INITIAL, NET_DEFAULT_TCP_INITIAL_TIMEOUT, false)) !=
    1778             EOK)) {
     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
    17791747                socket_data->addr = NULL;
    17801748                socket_data->addrlen = 0;
    17811749                fibril_rwlock_write_lock(&tcp_globals.lock);
     1750
    17821751        } else {
     1752
    17831753                packet = tcp_get_packets_to_send(socket, socket_data);
    17841754                if (packet) {
     
    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        }
     
    18071777
    18081778        // return the result
    1809         return rc;
     1779        return ERROR_CODE;
    18101780}
    18111781
     
    18141784    tcp_socket_data_ref socket_data, packet_t packet, size_t data_length)
    18151785{
     1786        ERROR_DECLARE;
     1787
    18161788        tcp_header_ref header;
    1817         int rc;
    18181789
    18191790        assert(socket);
     
    18301801        header->sequence_number = htonl(socket_data->next_outgoing);
    18311802
    1832         rc = packet_set_addr(packet, NULL, (uint8_t *) socket_data->addr,
    1833             socket_data->addrlen);
    1834         if (rc != EOK)
     1803        if (ERROR_OCCURRED(packet_set_addr(packet, NULL,
     1804            (uint8_t *) socket_data->addr, socket_data->addrlen)))
    18351805                return tcp_release_and_return(packet, EINVAL);
    18361806
     
    18461816    packet_t packet, size_t data_length)
    18471817{
    1848         int rc;
     1818        ERROR_DECLARE;
    18491819
    18501820        assert(socket);
     
    18521822        assert(socket->specific_data == socket_data);
    18531823
    1854         rc = tcp_queue_prepare_packet(socket, socket_data, packet, data_length);
    1855         if (rc != EOK)
    1856                 return rc;
    1857 
    1858         rc = pq_add(&socket_data->outgoing, packet, socket_data->next_outgoing,
    1859             data_length);
    1860         if (rc != EOK)
    1861                 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);
    18621830
    18631831        socket_data->next_outgoing += data_length;
     
    18681836tcp_get_packets_to_send(socket_core_ref socket, tcp_socket_data_ref socket_data)
    18691837{
     1838        ERROR_DECLARE;
     1839
    18701840        packet_t packet;
    18711841        packet_t copy;
     
    18731843        packet_t previous = NULL;
    18741844        size_t data_length;
    1875         int rc;
    18761845
    18771846        assert(socket);
     
    18981867                if (!sending) {
    18991868                        sending = copy;
    1900                 } else {
    1901                         rc = pq_insert_after(previous, copy);
    1902                         if (rc != EOK) {
    1903                                 pq_release_remote(tcp_globals.net_phone,
    1904                                     packet_get_id(copy));
    1905                                 return sending;
    1906                         }
     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;
    19071873                }
    19081874
     
    19101876                packet = pq_next(packet);
    19111877                // overflow occurred ?
    1912                 if (!packet &&
     1878                if ((!packet) &&
    19131879                    (socket_data->last_outgoing > socket_data->next_outgoing)) {
    19141880                        printf("gpts overflow\n");
     
    19261892    packet_t packet, size_t data_length, size_t sequence_number)
    19271893{
     1894        ERROR_DECLARE;
     1895
    19281896        tcp_header_ref header;
    19291897        uint32_t checksum;
    1930         int rc;
    19311898
    19321899        assert(socket);
     
    19351902
    19361903        // adjust the pseudo header
    1937         rc = ip_client_set_pseudo_header_data_length(socket_data->pseudo_header,
    1938             socket_data->headerlen, packet_get_data_length(packet));
    1939         if (rc != EOK) {
     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)))) {
    19401907                pq_release_remote(tcp_globals.net_phone, packet_get_id(packet));
    19411908                return NULL;
     
    19621929        checksum = compute_checksum(0, socket_data->pseudo_header,
    19631930            socket_data->headerlen);
    1964         checksum = compute_checksum(checksum,
    1965             (uint8_t *) packet_get_data(packet),
     1931        checksum = compute_checksum(checksum, (uint8_t *) packet_get_data(packet),
    19661932            packet_get_data_length(packet));
    19671933        header->checksum = htons(flip_checksum(compact_checksum(checksum)));
    19681934
    19691935        // prepare the packet
    1970         rc = ip_client_prepare_packet(packet, IPPROTO_TCP, 0, 0, 0, 0);
    1971         if (rc != EOK) {
    1972                 pq_release_remote(tcp_globals.net_phone, packet_get_id(packet));
    1973                 return NULL;
    1974         }
    1975         rc = tcp_prepare_timeout(tcp_timeout, socket, socket_data,
    1976             sequence_number, socket_data->state, socket_data->timeout, true);
    1977         if (rc != EOK) {
     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))) {
    19781940                pq_release_remote(tcp_globals.net_phone, packet_get_id(packet));
    19791941                return NULL;
     
    20822044int
    20832045tcp_recvfrom_message(socket_cores_ref local_sockets, int socket_id, int flags,
    2084     size_t *addrlen)
    2085 {
     2046    size_t * addrlen)
     2047{
     2048        ERROR_DECLARE;
     2049
    20862050        socket_core_ref socket;
    20872051        tcp_socket_data_ref socket_data;
     
    20892053        packet_t packet;
    20902054        size_t length;
    2091         int rc;
    20922055
    20932056        assert(local_sockets);
     
    21112074        // send the source address if desired
    21122075        if (addrlen) {
    2113                 rc = data_reply(socket_data->addr, socket_data->addrlen);
    2114                 if (rc != EOK)
    2115                         return rc;
     2076                ERROR_PROPAGATE(data_reply(socket_data->addr,
     2077                    socket_data->addrlen));
    21162078                *addrlen = socket_data->addrlen;
    21172079        }
     
    21222084                return NO_DATA;
    21232085
    2124         rc = packet_translate_remote(tcp_globals.net_phone, &packet, packet_id);
    2125         if (rc != EOK)
    2126                 return rc;
     2086        ERROR_PROPAGATE(packet_translate_remote(tcp_globals.net_phone, &packet,
     2087            packet_id));
    21272088
    21282089        // reply the packets
    2129         rc = socket_reply_packets(packet, &length);
    2130         if (rc != EOK)
    2131                 return rc;
     2090        ERROR_PROPAGATE(socket_reply_packets(packet, &length));
    21322091
    21332092        // release the packet
     
    21402099int
    21412100tcp_send_message(socket_cores_ref local_sockets, int socket_id, int fragments,
    2142     size_t *data_fragment_size, int flags)
    2143 {
     2101    size_t * data_fragment_size, int flags)
     2102{
     2103        ERROR_DECLARE;
     2104
    21442105        socket_core_ref socket;
    21452106        tcp_socket_data_ref socket_data;
     
    21502111        int index;
    21512112        int result;
    2152         int rc;
    21532113
    21542114        assert(local_sockets);
     
    21712131                return ENOTCONN;
    21722132
    2173         rc = tl_get_ip_packet_dimension(tcp_globals.ip_phone,
    2174             &tcp_globals.dimensions, socket_data->device_id, &packet_dimension);
    2175         if (rc != EOK)
    2176                 return rc;
     2133        ERROR_PROPAGATE(tl_get_ip_packet_dimension(tcp_globals.ip_phone,
     2134           &tcp_globals.dimensions, socket_data->device_id, &packet_dimension));
    21772135
    21782136        *data_fragment_size =
     
    21802138            packet_dimension->content : socket_data->data_fragment_size);
    21812139
    2182         for (index = 0; index < fragments; index++) {
     2140        for (index = 0; index < fragments; ++index) {
    21832141                // read the data fragment
    21842142                result = tl_socket_read_packet_data(tcp_globals.net_phone,
     
    21952153
    21962154                tcp_prepare_operation_header(socket, socket_data, header, 0, 0);
    2197                 rc = tcp_queue_packet(socket, socket_data, packet, 0);
    2198                 if (rc != EOK)
    2199                         return rc;
     2155                ERROR_PROPAGATE(tcp_queue_packet(socket, socket_data, packet,
     2156                    0));
    22002157        }
    22012158
     
    22162173tcp_close_message(socket_cores_ref local_sockets, int socket_id)
    22172174{
     2175        ERROR_DECLARE;
     2176
    22182177        socket_core_ref socket;
    22192178        tcp_socket_data_ref socket_data;
    22202179        packet_t packet;
    2221         int rc;
    22222180
    22232181        // find the socket
     
    22442202        default:
    22452203                // just destroy
    2246                 rc = socket_destroy(tcp_globals.net_phone, socket_id,
     2204                if (ERROR_NONE(socket_destroy(tcp_globals.net_phone, socket_id,
    22472205                    local_sockets, &tcp_globals.sockets,
    2248                     tcp_free_socket_data);
    2249                 if (rc == EOK) {
     2206                    tcp_free_socket_data))) {
    22502207                        fibril_rwlock_write_unlock(socket_data->local_lock);
    22512208                        fibril_rwlock_write_unlock(&tcp_globals.lock);
    22522209                }
    2253                 return rc;
     2210                return ERROR_CODE;
    22542211        }
    22552212
     
    22582215
    22592216        // create the notification packet
    2260         rc = tcp_create_notification_packet(&packet, socket, socket_data, 0, 1);
    2261         if (rc != EOK)
    2262                 return rc;
     2217        ERROR_PROPAGATE(tcp_create_notification_packet(&packet, socket,
     2218            socket_data, 0, 1));
    22632219
    22642220        // send the packet
    2265         rc = tcp_queue_packet(socket, socket_data, packet, 1);
    2266         if (rc != EOK)
    2267                 return rc;
     2221        ERROR_PROPAGATE(tcp_queue_packet(socket, socket_data, packet, 1));
    22682222
    22692223        // flush packets
     
    22812235
    22822236int
    2283 tcp_create_notification_packet(packet_t *packet, socket_core_ref socket,
     2237tcp_create_notification_packet(packet_t * packet, socket_core_ref socket,
    22842238    tcp_socket_data_ref socket_data, int synchronize, int finalize)
    22852239{
     2240        ERROR_DECLARE;
     2241
    22862242        packet_dimension_ref packet_dimension;
    22872243        tcp_header_ref header;
    2288         int rc;
    22892244
    22902245        assert(packet);
    22912246
    22922247        // get the device packet dimension
    2293         rc = tl_get_ip_packet_dimension(tcp_globals.ip_phone,
    2294             &tcp_globals.dimensions, socket_data->device_id, &packet_dimension);
    2295         if (rc != EOK)
    2296                 return rc;
     2248        ERROR_PROPAGATE(tl_get_ip_packet_dimension(tcp_globals.ip_phone,
     2249            &tcp_globals.dimensions, socket_data->device_id,
     2250            &packet_dimension));
    22972251
    22982252        // get a new packet
     
    23172271int
    23182272tcp_accept_message(socket_cores_ref local_sockets, int socket_id,
    2319     int new_socket_id, size_t *data_fragment_size, size_t *addrlen)
    2320 {
     2273    int new_socket_id, size_t * data_fragment_size, size_t * addrlen)
     2274{
     2275        ERROR_DECLARE;
     2276
    23212277        socket_core_ref accepted;
    23222278        socket_core_ref socket;
    23232279        tcp_socket_data_ref socket_data;
    23242280        packet_dimension_ref packet_dimension;
    2325         int rc;
    23262281
    23272282        assert(local_sockets);
     
    23572312                // TODO can it be in another state?
    23582313                if (socket_data->state == TCP_SOCKET_ESTABLISHED) {
    2359                         rc = data_reply(socket_data->addr,
    2360                             socket_data->addrlen);
    2361                         if (rc != EOK)
    2362                                 return rc;
    2363                         rc = tl_get_ip_packet_dimension(tcp_globals.ip_phone,
    2364                             &tcp_globals.dimensions, socket_data->device_id,
    2365                             &packet_dimension);
    2366                         if (rc != EOK)
    2367                                 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));
    23682319                        *addrlen = socket_data->addrlen;
    23692320
     
    23752326       
    23762327                        if (new_socket_id > 0) {
    2377                                 rc = socket_cores_update(local_sockets,
    2378                                     accepted->socket_id, new_socket_id);
    2379                                 if (rc != EOK)
    2380                                         return rc;
     2328                                ERROR_PROPAGATE(socket_cores_update(
     2329                                    local_sockets, accepted->socket_id,
     2330                                    new_socket_id));
    23812331                                accepted->socket_id = new_socket_id;
    23822332                        }
     
    24232373}
    24242374
    2425 /** Releases the packet and returns the result.
    2426  *
    2427  * @param[in] packet    The packet queue to be released.
    2428  * @param[in] result    The result to be returned.
    2429  * @return              The result parameter.
    2430  */
    24312375int tcp_release_and_return(packet_t packet, int result)
    24322376{
     
    24372381/** Default thread for new connections.
    24382382 *
    2439  * @param[in] iid       The initial message identifier.
    2440  * @param[in] icall     The initial message call structure.
     2383 *  @param[in] iid The initial message identifier.
     2384 *  @param[in] icall The initial message call structure.
    24412385 *
    24422386 */
     
    24532397                int answer_count;
    24542398
    2455                 /* Clear the answer structure */
     2399                /*
     2400                   Clear the answer structure
     2401                 */
    24562402                refresh_answer(&answer, &answer_count);
    24572403
    2458                 /* Fetch the next message */
     2404                /*
     2405                   Fetch the next message
     2406                 */
    24592407                ipc_call_t call;
    24602408                ipc_callid_t callid = async_get_call(&call);
    24612409
    2462                 /* Process the message */
     2410                /*
     2411                   Process the message
     2412                 */
    24632413                int res = tl_module_message_standalone(callid, &call, &answer,
    24642414                    &answer_count);
    24652415
    24662416                /*
    2467                  * End if told to either by the message or the processing
    2468                  * result.
     2417                   End if said to either by the message or the processing result
    24692418                 */
    24702419                if ((IPC_GET_METHOD(call) == IPC_M_PHONE_HUNGUP) ||
     
    24812430/** Starts the module.
    24822431 *
    2483  * @returns             EOK on success.
    2484  * @returns             Other error codes as defined for each specific module
    2485  *                      start function.
     2432 *  @param argc The count of the command line arguments. Ignored parameter.
     2433 *  @param argv The command line parameters. Ignored parameter.
     2434 *
     2435 *  @returns EOK on success.
     2436 *  @returns Other error codes as defined for each specific module start function.
     2437 *
    24862438 */
    24872439int
    24882440main(int argc, char *argv[])
    24892441{
    2490         int rc;
    2491 
    2492         rc = tl_module_start_standalone(tl_client_connection);
    2493         return rc;
     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;
    24942451}
    24952452
Note: See TracChangeset for help on using the changeset viewer.