Ignore:
File:
1 edited

Legend:

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

    r0578271 r89e57cee  
    4747#include <stdio.h>
    4848#include <errno.h>
     49#include <err.h>
    4950
    5051#include <ipc/ipc.h>
     
    234235int tcp_initialize(async_client_conn_t client_connection)
    235236{
    236         int rc;
     237        ERROR_DECLARE;
    237238
    238239        assert(client_connection);
     
    245246        tcp_globals.ip_phone = ip_bind_service(SERVICE_IP, IPPROTO_TCP,
    246247            SERVICE_TCP, client_connection);
    247         if (tcp_globals.ip_phone < 0) {
    248                 fibril_rwlock_write_unlock(&tcp_globals.lock);
     248        if (tcp_globals.ip_phone < 0)
    249249                return tcp_globals.ip_phone;
    250         }
    251250       
    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) {
     251        ERROR_PROPAGATE(socket_ports_initialize(&tcp_globals.sockets));
     252        if (ERROR_OCCURRED(packet_dimensions_initialize(
     253            &tcp_globals.dimensions))) {
    258254                socket_ports_destroy(&tcp_globals.sockets);
    259                 goto out;
     255                return ERROR_CODE;
    260256        }
    261257
    262258        tcp_globals.last_used_port = TCP_FREE_PORTS_START - 1;
    263 
    264 out:
    265259        fibril_rwlock_write_unlock(&tcp_globals.lock);
    266         return rc;
     260
     261        return EOK;
    267262}
    268263
     
    271266    services_t error)
    272267{
    273         int rc;
     268        ERROR_DECLARE;
    274269
    275270        if (receiver != SERVICE_TCP)
     
    277272
    278273        fibril_rwlock_write_lock(&tcp_globals.lock);
    279         rc = tcp_process_packet(device_id, packet, error);
    280         if (rc != EOK)
     274        if (ERROR_OCCURRED(tcp_process_packet(device_id, packet, error)))
    281275                fibril_rwlock_write_unlock(&tcp_globals.lock);
    282276
    283         printf("receive %d \n", rc);
    284 
    285         return rc;
     277        printf("receive %d \n", ERROR_CODE);
     278
     279        return ERROR_CODE;
    286280}
    287281
    288282int tcp_process_packet(device_id_t device_id, packet_t packet, services_t error)
    289283{
     284        ERROR_DECLARE;
     285
    290286        size_t length;
    291287        size_t offset;
     
    303299        struct sockaddr *dest;
    304300        size_t addrlen;
    305         int rc;
    306301
    307302        switch (error) {
     
    316311
    317312                length = (size_t) result;
    318                 rc = packet_trim(packet, length, 0);
    319                 if (rc != EOK)
    320                         return tcp_release_and_return(packet, rc);
     313                if (ERROR_OCCURRED(packet_trim(packet, length, 0)))
     314                        return tcp_release_and_return(packet, ERROR_CODE);
    321315                break;
    322316        default:
     
    339333
    340334        // trim all but TCP header
    341         rc = packet_trim(packet, offset, 0);
    342         if (rc != EOK)
    343                 return tcp_release_and_return(packet, rc);
     335        if (ERROR_OCCURRED(packet_trim(packet, offset, 0)))
     336                return tcp_release_and_return(packet, ERROR_CODE);
    344337
    345338        // get tcp header
     
    357350        addrlen = (size_t) result;
    358351
    359         rc = tl_set_address_port(src, addrlen, ntohs(header->source_port));
    360         if (rc != EOK)
    361                 return tcp_release_and_return(packet, rc);
     352        if (ERROR_OCCURRED(tl_set_address_port(src, addrlen,
     353            ntohs(header->source_port))))
     354                return tcp_release_and_return(packet, ERROR_CODE);
    362355       
    363356        // find the destination socket
     
    420413                }
    421414
    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) {
     415                if (ERROR_OCCURRED(ip_client_get_pseudo_header(IPPROTO_TCP, src,
     416                    addrlen, dest, addrlen, total_length,
     417                    &socket_data->pseudo_header, &socket_data->headerlen))) {
    426418                        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                 }
     419                        return tcp_release_and_return(packet, ERROR_CODE);
     420                }
     421
     422        } else if (ERROR_OCCURRED(ip_client_set_pseudo_header_data_length(
     423            socket_data->pseudo_header, socket_data->headerlen,
     424            total_length))) {
     425                fibril_rwlock_write_unlock(socket_data->local_lock);
     426                return tcp_release_and_return(packet, ERROR_CODE);
    437427        }
    438428       
     
    444434                fibril_rwlock_write_unlock(socket_data->local_lock);
    445435
    446                 rc = tl_prepare_icmp_packet(tcp_globals.net_phone,
    447                     tcp_globals.icmp_phone, packet, error);
    448                 if (rc == EOK) {
     436                if (ERROR_NONE(tl_prepare_icmp_packet(tcp_globals.net_phone,
     437                    tcp_globals.icmp_phone, packet, error))) {
    449438                        // checksum error ICMP
    450439                        icmp_parameter_problem_msg(tcp_globals.icmp_phone,
     
    463452        switch (socket_data->state) {
    464453        case TCP_SOCKET_LISTEN:
    465                 rc = tcp_process_listen(socket, socket_data, header, packet,
    466                     src, dest, addrlen);
     454                ERROR_CODE = tcp_process_listen(socket, socket_data, header,
     455                    packet, src, dest, addrlen);
    467456                break;
    468457        case TCP_SOCKET_SYN_RECEIVED:
    469                 rc = tcp_process_syn_received(socket, socket_data, header,
    470                     packet);
     458                ERROR_CODE = tcp_process_syn_received(socket, socket_data,
     459                    header, packet);
    471460                break;
    472461        case TCP_SOCKET_SYN_SENT:
    473                 rc = tcp_process_syn_sent(socket, socket_data, header, packet);
     462                ERROR_CODE = tcp_process_syn_sent(socket, socket_data, header,
     463                    packet);
    474464                break;
    475465        case TCP_SOCKET_FIN_WAIT_1:
     
    482472                // ack releasing the socket gets processed later
    483473        case TCP_SOCKET_ESTABLISHED:
    484                 rc = tcp_process_established(socket, socket_data, header,
    485                     packet, fragments, total_length);
     474                ERROR_CODE = tcp_process_established(socket, socket_data,
     475                    header, packet, fragments, total_length);
    486476                break;
    487477        default:
     
    489479        }
    490480
    491         if (rc != EOK) {
     481        if (ERROR_CODE != EOK) {
     482                printf("process %d\n", ERROR_CODE);
    492483                fibril_rwlock_write_unlock(socket_data->local_lock);
    493                 printf("process %d\n", rc);
    494484        }
    495485
     
    501491    tcp_header_ref header, packet_t packet, int fragments, size_t total_length)
    502492{
     493        ERROR_DECLARE;
     494
    503495        packet_t next_packet;
    504496        packet_t tmp_packet;
     
    509501        size_t offset;
    510502        uint32_t new_sequence_number;
    511         int rc;
    512503
    513504        assert(socket);
     
    550541                }
    551542
    552                 if (offset > 0) {
    553                         rc = packet_trim(packet, offset, 0);
    554                         if (rc != EOK)
    555                                 return tcp_release_and_return(packet, rc);
    556                 }
     543                if ((offset > 0) && (ERROR_OCCURRED(packet_trim(packet,
     544                    offset, 0))))
     545                        return tcp_release_and_return(packet, ERROR_CODE);
    557546
    558547                assert(new_sequence_number == socket_data->next_incoming);
     
    586575                        if (length <= offset)
    587576                                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                         }
     577                        else if (ERROR_OCCURRED(packet_trim(next_packet, 0,
     578                            length - offset)))
     579                                return tcp_release_and_return(packet,
     580                                    ERROR_CODE);
    595581                        offset -= length;
    596582                        total_length -= length - offset;
     
    617603                // remove the header
    618604                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);
     605                if (ERROR_OCCURRED(packet_trim(packet,
     606                    TCP_HEADER_LENGTH(header), 0)))
     607                        return tcp_release_and_return(packet, ERROR_CODE);
    622608
    623609                if (total_length) {
    624                         rc = tcp_queue_received_packet(socket, socket_data,
    625                             packet, fragments, total_length);
    626                         if (rc != EOK)
    627                                 return rc;
     610                        ERROR_PROPAGATE(tcp_queue_received_packet(socket,
     611                            socket_data, packet, fragments, total_length));
    628612                } else {
    629613                        total_length = 1;
     
    633617                packet = socket_data->incoming;
    634618                while (packet) {
    635                         rc = pq_get_order(socket_data->incoming, &order, NULL);
    636                         if (rc != EOK) {
     619
     620                        if (ERROR_OCCURRED(pq_get_order(socket_data->incoming,
     621                            &order, NULL))) {
    637622                                // remove the corrupted packet
    638623                                next_packet = pq_detach(packet);
     
    671656                                    socket_data->next_incoming) {
    672657                                        // queue received data
    673                                         rc = tcp_queue_received_packet(socket,
     658                                        ERROR_PROPAGATE(
     659                                            tcp_queue_received_packet(socket,
    674660                                            socket_data, packet, 1,
    675                                             packet_get_data_length(packet));
    676                                         if (rc != EOK)
    677                                                 return rc;
     661                                            packet_get_data_length(packet)));
    678662                                        socket_data->next_incoming =
    679663                                            new_sequence_number;
     
    693677                                                    new_sequence_number;
    694678                                        }
    695                                         rc = packet_trim(packet,length, 0);
    696                                         if (rc == EOK) {
     679                                        if (ERROR_NONE(packet_trim(packet,
     680                                            length, 0))) {
    697681                                                // queue received data
    698                                                 rc = tcp_queue_received_packet(
     682                                                ERROR_PROPAGATE(
     683                                                    tcp_queue_received_packet(
    699684                                                    socket, socket_data, packet,
    700685                                                    1, packet_get_data_length(
    701                                                     packet));
    702                                                 if (rc != EOK)
    703                                                         return rc;
     686                                                    packet)));
    704687                                                socket_data->next_incoming =
    705688                                                    new_sequence_number;
     
    726709                // remove the header
    727710                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);
     711                if (ERROR_OCCURRED(packet_trim(packet,
     712                    TCP_HEADER_LENGTH(header), 0)))
     713                        return tcp_release_and_return(packet, ERROR_CODE);
    731714
    732715                next_packet = pq_detach(packet);
    733716                length = packet_get_data_length(packet);
    734                 rc = pq_add(&socket_data->incoming, packet, new_sequence_number,
    735                     length);
    736                 if (rc != EOK) {
     717                if (ERROR_OCCURRED(pq_add(&socket_data->incoming, packet,
     718                    new_sequence_number, length))) {
    737719                        // remove the corrupted packets
    738720                        pq_release_remote(tcp_globals.net_phone,
     
    745727                                tmp_packet = pq_detach(next_packet);
    746728                                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) {
     729                                if (ERROR_OCCURRED(pq_set_order(next_packet,
     730                                    new_sequence_number, length)) ||
     731                                    ERROR_OCCURRED(pq_insert_after(packet,
     732                                    next_packet))) {
    756733                                        pq_release_remote(tcp_globals.net_phone,
    757734                                            packet_get_id(next_packet));
     
    785762        if (!packet) {
    786763                // 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;
     764                ERROR_PROPAGATE(tcp_create_notification_packet(&packet, socket,
     765                    socket_data, 0, 0));
     766                ERROR_PROPAGATE(tcp_queue_prepare_packet(socket, socket_data,
     767                    packet, 1));
    794768                packet = tcp_send_prepare_packet(socket, socket_data, packet, 1,
    795769                    socket_data->last_outgoing + 1);
     
    809783    size_t total_length)
    810784{
     785        ERROR_DECLARE;
     786
    811787        packet_dimension_ref packet_dimension;
    812         int rc;
    813788
    814789        assert(socket);
     
    820795
    821796        // 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);
     797        if (ERROR_OCCURRED(dyn_fifo_push(&socket->received,
     798            packet_get_id(packet), SOCKET_MAX_RECEIVED_SIZE)) ||
     799            ERROR_OCCURRED(tl_get_ip_packet_dimension(tcp_globals.ip_phone,
     800            &tcp_globals.dimensions, socket_data->device_id,
     801            &packet_dimension))) {
     802                return tcp_release_and_return(packet, ERROR_CODE);
     803        }
    830804
    831805        // decrease the window size
     
    846820    tcp_header_ref header, packet_t packet)
    847821{
     822        ERROR_DECLARE;
     823
    848824        packet_t next_packet;
    849         int rc;
    850825
    851826        assert(socket);
     
    869844        }
    870845        // 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);
     846        if ((packet_get_data_length(packet) > sizeof(*header)) &&
     847            ERROR_OCCURRED(packet_trim(packet, 0,
     848            packet_get_data_length(packet) - sizeof(*header)))) {
     849                return tcp_release_and_return(packet, ERROR_CODE);
    876850        }
    877851        tcp_prepare_operation_header(socket, socket_data, header, 0, 0);
     
    902876    size_t addrlen)
    903877{
     878        ERROR_DECLARE;
     879
    904880        packet_t next_packet;
    905881        socket_core_ref socket;
     
    908884        int listening_socket_id = listening_socket->socket_id;
    909885        int listening_port = listening_socket->port;
    910         int rc;
    911886
    912887        assert(listening_socket);
     
    938913        memcpy(socket_data->addr, src, socket_data->addrlen);
    939914        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) {
     915        if (ERROR_OCCURRED(tl_set_address_port(socket_data->addr,
     916            socket_data->addrlen, socket_data->dest_port))) {
    943917                free(socket_data->addr);
    944918                free(socket_data);
    945                 return tcp_release_and_return(packet, rc);
     919                pq_release_remote(tcp_globals.net_phone, packet_get_id(packet));
     920                return ERROR_CODE;
    946921        }
    947922
    948923        // create a socket
    949924        socket_id = -1;
    950         rc = socket_create(socket_data->local_sockets, listening_socket->phone,
    951             socket_data, &socket_id);
    952         if (rc != EOK) {
     925        if (ERROR_OCCURRED(socket_create(socket_data->local_sockets,
     926            listening_socket->phone, socket_data, &socket_id))) {
    953927                free(socket_data->addr);
    954928                free(socket_data);
    955                 return tcp_release_and_return(packet, rc);
     929                return tcp_release_and_return(packet, ERROR_CODE);
    956930        }
    957931
     
    990964        assert(socket_data);
    991965
    992         rc = socket_port_add(&tcp_globals.sockets, listening_port, socket,
    993             (const char *) socket_data->addr, socket_data->addrlen);
     966        ERROR_CODE = socket_port_add(&tcp_globals.sockets, listening_port,
     967            socket, (const char *) socket_data->addr, socket_data->addrlen);
    994968        assert(socket == socket_port_find(&tcp_globals.sockets, listening_port,
    995969            (const char *) socket_data->addr, socket_data->addrlen));
    996970
    997 //      rc = socket_bind_free_port(&tcp_globals.sockets, socket,
     971//      ERROR_CODE = socket_bind_free_port(&tcp_globals.sockets, socket,
    998972//          TCP_FREE_PORTS_START, TCP_FREE_PORTS_END,
    999973//          tcp_globals.last_used_port);
    1000974//      tcp_globals.last_used_port = socket->port;
    1001975        fibril_rwlock_write_unlock(&tcp_globals.lock);
    1002         if (rc != EOK) {
     976        if (ERROR_CODE != EOK) {
    1003977                socket_destroy(tcp_globals.net_phone, socket->socket_id,
    1004978                    socket_data->local_sockets, &tcp_globals.sockets,
    1005979                    tcp_free_socket_data);
    1006                 return tcp_release_and_return(packet, rc);
     980                return tcp_release_and_return(packet, ERROR_CODE);
    1007981        }
    1008982
     
    1018992
    1019993        // 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) {
     994        if ((packet_get_data_length(packet) > sizeof(*header)) &&
     995            ERROR_OCCURRED(packet_trim(packet, 0,
     996            packet_get_data_length(packet) - sizeof(*header)))) {
    1035997                socket_destroy(tcp_globals.net_phone, socket->socket_id,
    1036998                    socket_data->local_sockets, &tcp_globals.sockets,
    1037999                    tcp_free_socket_data);
    1038                 return rc;
     1000                return tcp_release_and_return(packet, ERROR_CODE);
     1001        }
     1002
     1003        tcp_prepare_operation_header(socket, socket_data, header, 1, 0);
     1004
     1005        if (ERROR_OCCURRED(tcp_queue_packet(socket, socket_data, packet, 1))) {
     1006                socket_destroy(tcp_globals.net_phone, socket->socket_id,
     1007                    socket_data->local_sockets, &tcp_globals.sockets,
     1008                    tcp_free_socket_data);
     1009                return ERROR_CODE;
    10391010        }
    10401011
     
    10601031    tcp_socket_data_ref socket_data, tcp_header_ref header, packet_t packet)
    10611032{
     1033        ERROR_DECLARE;
     1034
    10621035        socket_core_ref listening_socket;
    10631036        tcp_socket_data_ref listening_socket_data;
    1064         int rc;
    10651037
    10661038        assert(socket);
     
    10871059
    10881060                // 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) {
     1061                if (ERROR_NONE(dyn_fifo_push(&listening_socket->accepted,
     1062                    (-1 * socket->socket_id),
     1063                    listening_socket_data->backlog))) {
     1064
    10921065                        // notify the destination socket
    10931066                        async_msg_5(socket->phone, NET_SOCKET_ACCEPTED,
     
    11041077
    11051078        // create the notification packet
    1106         rc = tcp_create_notification_packet(&packet, socket, socket_data, 0, 1);
    1107         if (rc != EOK)
    1108                 return rc;
     1079        ERROR_PROPAGATE(tcp_create_notification_packet(&packet, socket,
     1080            socket_data, 0, 1));
    11091081
    11101082        // send the packet
    1111         rc = tcp_queue_packet(socket, socket_data, packet, 1);
    1112         if (rc != EOK)
    1113                 return rc;
     1083        ERROR_PROPAGATE(tcp_queue_packet(socket, socket_data, packet, 1));
    11141084
    11151085        // flush packets
     
    12281198    ipc_call_t *answer, int *answer_count)
    12291199{
     1200        ERROR_DECLARE;
     1201
    12301202        packet_t packet;
    1231         int rc;
    12321203
    12331204        assert(call);
     
    12381209        switch (IPC_GET_METHOD(*call)) {
    12391210        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;
     1211                //fibril_rwlock_read_lock(&tcp_globals.lock);
     1212                if (ERROR_NONE(packet_translate_remote(tcp_globals.net_phone,
     1213                    &packet, IPC_GET_PACKET(call)))) {
     1214                        ERROR_CODE = tcp_received_msg(IPC_GET_DEVICE(call),
     1215                            packet, SERVICE_TCP, IPC_GET_ERROR(call));
     1216                }
     1217                //fibril_rwlock_read_unlock(&tcp_globals.lock);
     1218                return ERROR_CODE;
     1219
    12511220        case IPC_M_CONNECT_TO_ME:
    12521221                return tcp_process_client_messages(callid, *call);
     
    16931662    struct sockaddr *addr, socklen_t addrlen)
    16941663{
     1664        ERROR_DECLARE;
     1665
    16951666        socket_core_ref socket;
    1696         int rc;
    16971667
    16981668        assert(local_sockets);
     
    17051675                return ENOTSOCK;
    17061676       
    1707         rc = tcp_connect_core(socket, local_sockets, addr, addrlen);
    1708         if (rc != EOK) {
     1677        if (ERROR_OCCURRED(tcp_connect_core(socket, local_sockets, addr,
     1678            addrlen))) {
    17091679                tcp_free_socket_data(socket);
    17101680                // unbind if bound
     
    17151685                }
    17161686        }
    1717         return rc;
     1687        return ERROR_CODE;
    17181688}
    17191689
     
    17221692    struct sockaddr *addr, socklen_t addrlen)
    17231693{
     1694        ERROR_DECLARE;
     1695
    17241696        tcp_socket_data_ref socket_data;
    17251697        packet_t packet;
    1726         int rc;
    17271698
    17281699        assert(socket);
     
    17401711
    17411712        // get the destination port
    1742         rc = tl_get_address_port(addr, addrlen, &socket_data->dest_port);
    1743         if (rc != EOK)
    1744                 return rc;
    1745        
     1713        ERROR_PROPAGATE(tl_get_address_port(addr, addrlen,
     1714            &socket_data->dest_port));
    17461715        if (socket->port <= 0) {
    17471716                // 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;
     1717                ERROR_PROPAGATE(socket_bind_free_port(&tcp_globals.sockets,
     1718                    socket, TCP_FREE_PORTS_START, TCP_FREE_PORTS_END,
     1719                    tcp_globals.last_used_port));
    17531720                // set the next port as the search starting port number
    17541721                tcp_globals.last_used_port = socket->port;
    17551722        }
    17561723
    1757         rc = ip_get_route_req(tcp_globals.ip_phone, IPPROTO_TCP,
     1724        ERROR_PROPAGATE(ip_get_route_req(tcp_globals.ip_phone, IPPROTO_TCP,
    17581725            addr, addrlen, &socket_data->device_id,
    1759             &socket_data->pseudo_header, &socket_data->headerlen);
    1760         if (rc != EOK)
    1761                 return rc;
     1726            &socket_data->pseudo_header, &socket_data->headerlen));
    17621727
    17631728        // create the notification packet
    1764         rc = tcp_create_notification_packet(&packet, socket, socket_data, 1, 0);
    1765         if (rc != EOK)
    1766                 return rc;
     1729        ERROR_PROPAGATE(tcp_create_notification_packet(&packet, socket,
     1730            socket_data, 1, 0));
    17671731
    17681732        // unlock the globals and wait for an operation
     
    17721736        socket_data->addrlen = addrlen;
    17731737        // 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)) {
     1738        if (ERROR_OCCURRED(tcp_queue_packet(socket, socket_data, packet, 1)) ||
     1739            ERROR_OCCURRED(tcp_prepare_timeout(tcp_timeout, socket, socket_data,
     1740            0, TCP_SOCKET_INITIAL, NET_DEFAULT_TCP_INITIAL_TIMEOUT, false))) {
    17791741                socket_data->addr = NULL;
    17801742                socket_data->addrlen = 0;
     
    17921754                        fibril_condvar_wait(&socket_data->operation.condvar,
    17931755                            &socket_data->operation.mutex);
    1794                         rc = socket_data->operation.result;
    1795                         if (rc != EOK) {
     1756                        ERROR_CODE = socket_data->operation.result;
     1757                        if (ERROR_CODE != EOK) {
    17961758                                socket_data->addr = NULL;
    17971759                                socket_data->addrlen = 0;
     
    18001762                        socket_data->addr = NULL;
    18011763                        socket_data->addrlen = 0;
    1802                         rc = EINTR;
     1764                        ERROR_CODE = EINTR;
    18031765                }
    18041766        }
     
    18071769
    18081770        // return the result
    1809         return rc;
     1771        return ERROR_CODE;
    18101772}
    18111773
     
    18141776    tcp_socket_data_ref socket_data, packet_t packet, size_t data_length)
    18151777{
     1778        ERROR_DECLARE;
     1779
    18161780        tcp_header_ref header;
    1817         int rc;
    18181781
    18191782        assert(socket);
     
    18301793        header->sequence_number = htonl(socket_data->next_outgoing);
    18311794
    1832         rc = packet_set_addr(packet, NULL, (uint8_t *) socket_data->addr,
    1833             socket_data->addrlen);
    1834         if (rc != EOK)
     1795        if (ERROR_OCCURRED(packet_set_addr(packet, NULL,
     1796            (uint8_t *) socket_data->addr, socket_data->addrlen)))
    18351797                return tcp_release_and_return(packet, EINVAL);
    18361798
     
    18461808    packet_t packet, size_t data_length)
    18471809{
    1848         int rc;
     1810        ERROR_DECLARE;
    18491811
    18501812        assert(socket);
     
    18521814        assert(socket->specific_data == socket_data);
    18531815
    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);
     1816        ERROR_PROPAGATE(tcp_queue_prepare_packet(socket, socket_data, packet,
     1817            data_length));
     1818
     1819        if (ERROR_OCCURRED(pq_add(&socket_data->outgoing, packet,
     1820            socket_data->next_outgoing, data_length)))
     1821                return tcp_release_and_return(packet, ERROR_CODE);
    18621822
    18631823        socket_data->next_outgoing += data_length;
     
    18681828tcp_get_packets_to_send(socket_core_ref socket, tcp_socket_data_ref socket_data)
    18691829{
     1830        ERROR_DECLARE;
     1831
    18701832        packet_t packet;
    18711833        packet_t copy;
     
    18731835        packet_t previous = NULL;
    18741836        size_t data_length;
    1875         int rc;
    18761837
    18771838        assert(socket);
     
    18981859                if (!sending) {
    18991860                        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                         }
     1861                } else if (ERROR_OCCURRED(pq_insert_after(previous, copy))) {
     1862                        pq_release_remote(tcp_globals.net_phone,
     1863                            packet_get_id(copy));
     1864                        return sending;
    19071865                }
    19081866
     
    19261884    packet_t packet, size_t data_length, size_t sequence_number)
    19271885{
     1886        ERROR_DECLARE;
     1887
    19281888        tcp_header_ref header;
    19291889        uint32_t checksum;
    1930         int rc;
    19311890
    19321891        assert(socket);
     
    19351894
    19361895        // 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) {
     1896        if (ERROR_OCCURRED(ip_client_set_pseudo_header_data_length(
     1897            socket_data->pseudo_header, socket_data->headerlen,
     1898            packet_get_data_length(packet)))) {
    19401899                pq_release_remote(tcp_globals.net_phone, packet_get_id(packet));
    19411900                return NULL;
     
    19621921        checksum = compute_checksum(0, socket_data->pseudo_header,
    19631922            socket_data->headerlen);
    1964         checksum = compute_checksum(checksum,
    1965             (uint8_t *) packet_get_data(packet),
     1923        checksum = compute_checksum(checksum, (uint8_t *) packet_get_data(packet),
    19661924            packet_get_data_length(packet));
    19671925        header->checksum = htons(flip_checksum(compact_checksum(checksum)));
    19681926
    19691927        // 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) {
     1928        if (ERROR_OCCURRED(ip_client_prepare_packet(packet, IPPROTO_TCP, 0, 0,
     1929            0, 0)) || ERROR_OCCURRED(tcp_prepare_timeout(tcp_timeout, socket,
     1930            socket_data, sequence_number, socket_data->state,
     1931            socket_data->timeout, true))) {
    19781932                pq_release_remote(tcp_globals.net_phone, packet_get_id(packet));
    19791933                return NULL;
     
    20842038    size_t *addrlen)
    20852039{
     2040        ERROR_DECLARE;
     2041
    20862042        socket_core_ref socket;
    20872043        tcp_socket_data_ref socket_data;
     
    20892045        packet_t packet;
    20902046        size_t length;
    2091         int rc;
    20922047
    20932048        assert(local_sockets);
     
    21112066        // send the source address if desired
    21122067        if (addrlen) {
    2113                 rc = data_reply(socket_data->addr, socket_data->addrlen);
    2114                 if (rc != EOK)
    2115                         return rc;
     2068                ERROR_PROPAGATE(data_reply(socket_data->addr,
     2069                    socket_data->addrlen));
    21162070                *addrlen = socket_data->addrlen;
    21172071        }
     
    21222076                return NO_DATA;
    21232077
    2124         rc = packet_translate_remote(tcp_globals.net_phone, &packet, packet_id);
    2125         if (rc != EOK)
    2126                 return rc;
     2078        ERROR_PROPAGATE(packet_translate_remote(tcp_globals.net_phone, &packet,
     2079            packet_id));
    21272080
    21282081        // reply the packets
    2129         rc = socket_reply_packets(packet, &length);
    2130         if (rc != EOK)
    2131                 return rc;
     2082        ERROR_PROPAGATE(socket_reply_packets(packet, &length));
    21322083
    21332084        // release the packet
     
    21422093    size_t *data_fragment_size, int flags)
    21432094{
     2095        ERROR_DECLARE;
     2096
    21442097        socket_core_ref socket;
    21452098        tcp_socket_data_ref socket_data;
     
    21502103        int index;
    21512104        int result;
    2152         int rc;
    21532105
    21542106        assert(local_sockets);
     
    21712123                return ENOTCONN;
    21722124
    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;
     2125        ERROR_PROPAGATE(tl_get_ip_packet_dimension(tcp_globals.ip_phone,
     2126           &tcp_globals.dimensions, socket_data->device_id, &packet_dimension));
    21772127
    21782128        *data_fragment_size =
     
    21952145
    21962146                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;
     2147                ERROR_PROPAGATE(tcp_queue_packet(socket, socket_data, packet,
     2148                    0));
    22002149        }
    22012150
     
    22162165tcp_close_message(socket_cores_ref local_sockets, int socket_id)
    22172166{
     2167        ERROR_DECLARE;
     2168
    22182169        socket_core_ref socket;
    22192170        tcp_socket_data_ref socket_data;
    22202171        packet_t packet;
    2221         int rc;
    22222172
    22232173        // find the socket
     
    22442194        default:
    22452195                // just destroy
    2246                 rc = socket_destroy(tcp_globals.net_phone, socket_id,
     2196                if (ERROR_NONE(socket_destroy(tcp_globals.net_phone, socket_id,
    22472197                    local_sockets, &tcp_globals.sockets,
    2248                     tcp_free_socket_data);
    2249                 if (rc == EOK) {
     2198                    tcp_free_socket_data))) {
    22502199                        fibril_rwlock_write_unlock(socket_data->local_lock);
    22512200                        fibril_rwlock_write_unlock(&tcp_globals.lock);
    22522201                }
    2253                 return rc;
     2202                return ERROR_CODE;
    22542203        }
    22552204
     
    22582207
    22592208        // create the notification packet
    2260         rc = tcp_create_notification_packet(&packet, socket, socket_data, 0, 1);
    2261         if (rc != EOK)
    2262                 return rc;
     2209        ERROR_PROPAGATE(tcp_create_notification_packet(&packet, socket,
     2210            socket_data, 0, 1));
    22632211
    22642212        // send the packet
    2265         rc = tcp_queue_packet(socket, socket_data, packet, 1);
    2266         if (rc != EOK)
    2267                 return rc;
     2213        ERROR_PROPAGATE(tcp_queue_packet(socket, socket_data, packet, 1));
    22682214
    22692215        // flush packets
     
    22842230    tcp_socket_data_ref socket_data, int synchronize, int finalize)
    22852231{
     2232        ERROR_DECLARE;
     2233
    22862234        packet_dimension_ref packet_dimension;
    22872235        tcp_header_ref header;
    2288         int rc;
    22892236
    22902237        assert(packet);
    22912238
    22922239        // 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;
     2240        ERROR_PROPAGATE(tl_get_ip_packet_dimension(tcp_globals.ip_phone,
     2241            &tcp_globals.dimensions, socket_data->device_id,
     2242            &packet_dimension));
    22972243
    22982244        // get a new packet
     
    23192265    int new_socket_id, size_t *data_fragment_size, size_t *addrlen)
    23202266{
     2267        ERROR_DECLARE;
     2268
    23212269        socket_core_ref accepted;
    23222270        socket_core_ref socket;
    23232271        tcp_socket_data_ref socket_data;
    23242272        packet_dimension_ref packet_dimension;
    2325         int rc;
    23262273
    23272274        assert(local_sockets);
     
    23572304                // TODO can it be in another state?
    23582305                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;
     2306                        ERROR_PROPAGATE(data_reply(socket_data->addr,
     2307                            socket_data->addrlen));
     2308                        ERROR_PROPAGATE(tl_get_ip_packet_dimension(
     2309                            tcp_globals.ip_phone, &tcp_globals.dimensions,
     2310                            socket_data->device_id, &packet_dimension));
    23682311                        *addrlen = socket_data->addrlen;
    23692312
     
    23752318       
    23762319                        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;
     2320                                ERROR_PROPAGATE(socket_cores_update(
     2321                                    local_sockets, accepted->socket_id,
     2322                                    new_socket_id));
    23812323                                accepted->socket_id = new_socket_id;
    23822324                        }
     
    24882430main(int argc, char *argv[])
    24892431{
    2490         int rc;
    2491 
    2492         rc = tl_module_start_standalone(tl_client_connection);
    2493         return rc;
     2432        ERROR_DECLARE;
     2433
     2434        /*
     2435           Start the module
     2436         */
     2437        if (ERROR_OCCURRED(tl_module_start_standalone(tl_client_connection)))
     2438                return ERROR_CODE;
     2439
     2440        return EOK;
    24942441}
    24952442
Note: See TracChangeset for help on using the changeset viewer.