Ignore:
File:
1 edited

Legend:

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

    rfb04cba8 raaa3f33a  
    127127typedef struct tcp_timeout tcp_timeout_t;
    128128
    129 /** Type definition of the TCP timeout pointer.
    130  *  @see tcp_timeout
    131  */
    132 typedef tcp_timeout_t *tcp_timeout_ref;
    133 
    134129/** TCP reply timeout data.
    135130 *  Used as a timeouting fibril argument.
     
    144139
    145140        /** Local sockets. */
    146         socket_cores_ref local_sockets;
     141        socket_cores_t *local_sockets;
    147142
    148143        /** Socket identifier. */
     
    166161
    167162static 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);
     163static void tcp_prepare_operation_header(socket_core_t *, tcp_socket_data_t *,
     164    tcp_header_t *, int synchronize, int);
     165static int tcp_prepare_timeout(int (*)(void *), socket_core_t *,
     166    tcp_socket_data_t *, size_t, tcp_socket_state_t, suseconds_t, int);
     167static void tcp_free_socket_data(socket_core_t *);
    173168
    174169static int tcp_timeout(void *);
     
    177172
    178173static int tcp_process_packet(device_id_t, packet_t, services_t);
    179 static int tcp_connect_core(socket_core_ref, socket_cores_ref,
     174static int tcp_connect_core(socket_core_t *, socket_cores_t *,
    180175    struct sockaddr *, socklen_t);
    181 static int tcp_queue_prepare_packet(socket_core_ref, tcp_socket_data_ref,
     176static int tcp_queue_prepare_packet(socket_core_t *, tcp_socket_data_t *,
    182177    packet_t, size_t);
    183 static int tcp_queue_packet(socket_core_ref, tcp_socket_data_ref, packet_t,
     178static int tcp_queue_packet(socket_core_t *, tcp_socket_data_t *, packet_t,
    184179    size_t);
    185 static packet_t tcp_get_packets_to_send(socket_core_ref, tcp_socket_data_ref);
     180static packet_t tcp_get_packets_to_send(socket_core_t *, tcp_socket_data_t *);
    186181static void tcp_send_packets(device_id_t, packet_t);
    187182
    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,
     183static void tcp_process_acknowledgement(socket_core_t *, tcp_socket_data_t *,
     184    tcp_header_t *);
     185static packet_t tcp_send_prepare_packet(socket_core_t *, tcp_socket_data_t *,
    191186    packet_t, size_t, size_t);
    192 static packet_t tcp_prepare_copy(socket_core_ref, tcp_socket_data_ref, packet_t,
     187static packet_t tcp_prepare_copy(socket_core_t *, tcp_socket_data_t *, packet_t,
    193188    size_t, size_t);
    194 /* static */ void tcp_retransmit_packet(socket_core_ref, tcp_socket_data_ref,
     189/* static */ void tcp_retransmit_packet(socket_core_t *, tcp_socket_data_t *,
    195190    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,
     191static int tcp_create_notification_packet(packet_t *, socket_core_t *,
     192    tcp_socket_data_t *, int, int);
     193static void tcp_refresh_socket_data(tcp_socket_data_t *);
     194
     195static void tcp_initialize_socket_data(tcp_socket_data_t *);
     196
     197static int tcp_process_listen(socket_core_t *, tcp_socket_data_t *,
     198    tcp_header_t *, packet_t, struct sockaddr *, struct sockaddr *, size_t);
     199static int tcp_process_syn_sent(socket_core_t *, tcp_socket_data_t *,
     200    tcp_header_t *, packet_t);
     201static int tcp_process_syn_received(socket_core_t *, tcp_socket_data_t *,
     202    tcp_header_t *, packet_t);
     203static int tcp_process_established(socket_core_t *, tcp_socket_data_t *,
     204    tcp_header_t *, packet_t, int, size_t);
     205static int tcp_queue_received_packet(socket_core_t *, tcp_socket_data_t *,
    211206    packet_t, int, size_t);
    212207
     
    214209static int tcp_process_client_messages(ipc_callid_t, ipc_call_t);
    215210
    216 static int tcp_listen_message(socket_cores_ref, int, int);
    217 static int tcp_connect_message(socket_cores_ref, int, struct sockaddr *,
     211static int tcp_listen_message(socket_cores_t *, int, int);
     212static int tcp_connect_message(socket_cores_t *, int, struct sockaddr *,
    218213    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);
     214static int tcp_recvfrom_message(socket_cores_t *, int, int, size_t *);
     215static int tcp_send_message(socket_cores_t *, int, int, size_t *, int);
     216static int tcp_accept_message(socket_cores_t *, int, int, size_t *, size_t *);
     217static int tcp_close_message(socket_cores_t *, int);
    223218
    224219/** TCP global data. */
     
    290285        size_t offset;
    291286        int result;
    292         tcp_header_ref header;
    293         socket_core_ref socket;
    294         tcp_socket_data_ref socket_data;
     287        tcp_header_t *header;
     288        socket_core_t *socket;
     289        tcp_socket_data_t *socket_data;
    295290        packet_t next_packet;
    296291        size_t total_length;
     
    343338
    344339        /* Get tcp header */
    345         header = (tcp_header_ref) packet_get_data(packet);
     340        header = (tcp_header_t *) packet_get_data(packet);
    346341        if (!header)
    347342                return tcp_release_and_return(packet, NO_DATA);
     
    380375
    381376        printf("socket id %d\n", socket->socket_id);
    382         socket_data = (tcp_socket_data_ref) socket->specific_data;
     377        socket_data = (tcp_socket_data_t *) socket->specific_data;
    383378        assert(socket_data);
    384379
     
    497492}
    498493
    499 int tcp_process_established(socket_core_ref socket, tcp_socket_data_ref
    500     socket_data, tcp_header_ref header, packet_t packet, int fragments,
     494int tcp_process_established(socket_core_t *socket, tcp_socket_data_t *
     495    socket_data, tcp_header_t *header, packet_t packet, int fragments,
    501496    size_t total_length)
    502497{
     
    805800}
    806801
    807 int tcp_queue_received_packet(socket_core_ref socket,
    808     tcp_socket_data_ref socket_data, packet_t packet, int fragments,
     802int tcp_queue_received_packet(socket_core_t *socket,
     803    tcp_socket_data_t *socket_data, packet_t packet, int fragments,
    809804    size_t total_length)
    810805{
    811         packet_dimension_ref packet_dimension;
     806        packet_dimension_t *packet_dimension;
    812807        int rc;
    813808
     
    842837}
    843838
    844 int tcp_process_syn_sent(socket_core_ref socket, tcp_socket_data_ref
    845     socket_data, tcp_header_ref header, packet_t packet)
     839int tcp_process_syn_sent(socket_core_t *socket, tcp_socket_data_t *
     840    socket_data, tcp_header_t *header, packet_t packet)
    846841{
    847842        packet_t next_packet;
     
    900895}
    901896
    902 int tcp_process_listen(socket_core_ref listening_socket,
    903     tcp_socket_data_ref listening_socket_data, tcp_header_ref header,
     897int tcp_process_listen(socket_core_t *listening_socket,
     898    tcp_socket_data_t *listening_socket_data, tcp_header_t *header,
    904899    packet_t packet, struct sockaddr *src, struct sockaddr *dest,
    905900    size_t addrlen)
    906901{
    907902        packet_t next_packet;
    908         socket_core_ref socket;
    909         tcp_socket_data_ref socket_data;
     903        socket_core_t *socket;
     904        tcp_socket_data_t *socket_data;
    910905        int socket_id;
    911906        int listening_socket_id = listening_socket->socket_id;
     
    922917                return tcp_release_and_return(packet, EINVAL);
    923918
    924         socket_data = (tcp_socket_data_ref) malloc(sizeof(*socket_data));
     919        socket_data = (tcp_socket_data_t *) malloc(sizeof(*socket_data));
    925920        if (!socket_data)
    926921                return tcp_release_and_return(packet, ENOMEM);
     
    979974        }
    980975        listening_socket_data =
    981             (tcp_socket_data_ref) listening_socket->specific_data;
     976            (tcp_socket_data_t *) listening_socket->specific_data;
    982977        assert(listening_socket_data);
    983978
     
    991986                return ENOTSOCK;
    992987        }
    993         socket_data = (tcp_socket_data_ref) socket->specific_data;
     988        socket_data = (tcp_socket_data_t *) socket->specific_data;
    994989        assert(socket_data);
    995990
     
    10601055}
    10611056
    1062 int tcp_process_syn_received(socket_core_ref socket,
    1063     tcp_socket_data_ref socket_data, tcp_header_ref header, packet_t packet)
    1064 {
    1065         socket_core_ref listening_socket;
    1066         tcp_socket_data_ref listening_socket_data;
     1057int tcp_process_syn_received(socket_core_t *socket,
     1058    tcp_socket_data_t *socket_data, tcp_header_t *header, packet_t packet)
     1059{
     1060        socket_core_t *listening_socket;
     1061        tcp_socket_data_t *listening_socket_data;
    10671062        int rc;
    10681063
     
    10861081        if (listening_socket) {
    10871082                listening_socket_data =
    1088                     (tcp_socket_data_ref) listening_socket->specific_data;
     1083                    (tcp_socket_data_t *) listening_socket->specific_data;
    10891084                assert(listening_socket_data);
    10901085
     
    11271122}
    11281123
    1129 void tcp_process_acknowledgement(socket_core_ref socket,
    1130     tcp_socket_data_ref socket_data, tcp_header_ref header)
     1124void tcp_process_acknowledgement(socket_core_t *socket,
     1125    tcp_socket_data_t *socket_data, tcp_header_t *header)
    11311126{
    11321127        size_t number;
     
    12651260}
    12661261
    1267 void tcp_refresh_socket_data(tcp_socket_data_ref socket_data)
     1262void tcp_refresh_socket_data(tcp_socket_data_t *socket_data)
    12681263{
    12691264        assert(socket_data);
     
    12811276}
    12821277
    1283 void tcp_initialize_socket_data(tcp_socket_data_ref socket_data)
     1278void tcp_initialize_socket_data(tcp_socket_data_t *socket_data)
    12841279{
    12851280        assert(socket_data);
     
    13041299        ipc_call_t answer;
    13051300        int answer_count;
    1306         tcp_socket_data_ref socket_data;
    1307         socket_core_ref socket;
    1308         packet_dimension_ref packet_dimension;
     1301        tcp_socket_data_t *socket_data;
     1302        socket_core_t *socket;
     1303        packet_dimension_t *packet_dimension;
    13091304
    13101305        /*
     
    13361331                case NET_SOCKET:
    13371332                        socket_data =
    1338                             (tcp_socket_data_ref) malloc(sizeof(*socket_data));
     1333                            (tcp_socket_data_t *) malloc(sizeof(*socket_data));
    13391334                        if (!socket_data) {
    13401335                                res = ENOMEM;
     
    13831378                                    SOCKET_GET_SOCKET_ID(call));
    13841379                                if (socket) {
    1385                                         socket_data = (tcp_socket_data_ref)
     1380                                        socket_data = (tcp_socket_data_t *)
    13861381                                            socket->specific_data;
    13871382                                        assert(socket_data);
     
    15401535int tcp_timeout(void *data)
    15411536{
    1542         tcp_timeout_ref timeout = data;
     1537        tcp_timeout_t *timeout = data;
    15431538        int keep_write_lock = false;
    1544         socket_core_ref socket;
    1545         tcp_socket_data_ref socket_data;
     1539        socket_core_t *socket;
     1540        tcp_socket_data_t *socket_data;
    15461541
    15471542        assert(timeout);
     
    15611556                goto out;
    15621557       
    1563         socket_data = (tcp_socket_data_ref) socket->specific_data;
     1558        socket_data = (tcp_socket_data_t *) socket->specific_data;
    15641559        assert(socket_data);
    15651560        if (socket_data->local_sockets != timeout->local_sockets)
     
    16171612int tcp_release_after_timeout(void *data)
    16181613{
    1619         tcp_timeout_ref timeout = data;
    1620         socket_core_ref socket;
    1621         tcp_socket_data_ref socket_data;
     1614        tcp_timeout_t *timeout = data;
     1615        socket_core_t *socket;
     1616        tcp_socket_data_t *socket_data;
    16221617        fibril_rwlock_t *local_lock;
    16231618
     
    16351630
    16361631        if (socket && (socket->socket_id == timeout->socket_id)) {
    1637                 socket_data = (tcp_socket_data_ref) socket->specific_data;
     1632                socket_data = (tcp_socket_data_t *) socket->specific_data;
    16381633                assert(socket_data);
    16391634                if (socket_data->local_sockets == timeout->local_sockets) {
     
    16561651}
    16571652
    1658 void tcp_retransmit_packet(socket_core_ref socket, tcp_socket_data_ref
     1653void tcp_retransmit_packet(socket_core_t *socket, tcp_socket_data_t *
    16591654    socket_data, size_t sequence_number)
    16601655{
     
    16831678}
    16841679
    1685 int tcp_listen_message(socket_cores_ref local_sockets, int socket_id,
     1680int tcp_listen_message(socket_cores_t *local_sockets, int socket_id,
    16861681    int backlog)
    16871682{
    1688         socket_core_ref socket;
    1689         tcp_socket_data_ref socket_data;
     1683        socket_core_t *socket;
     1684        tcp_socket_data_t *socket_data;
    16901685
    16911686        assert(local_sockets);
     
    17001695       
    17011696        /* Get the socket specific data */
    1702         socket_data = (tcp_socket_data_ref) socket->specific_data;
     1697        socket_data = (tcp_socket_data_t *) socket->specific_data;
    17031698        assert(socket_data);
    17041699
     
    17091704}
    17101705
    1711 int tcp_connect_message(socket_cores_ref local_sockets, int socket_id,
     1706int tcp_connect_message(socket_cores_t *local_sockets, int socket_id,
    17121707    struct sockaddr *addr, socklen_t addrlen)
    17131708{
    1714         socket_core_ref socket;
     1709        socket_core_t *socket;
    17151710        int rc;
    17161711
     
    17371732}
    17381733
    1739 int tcp_connect_core(socket_core_ref socket, socket_cores_ref local_sockets,
     1734int tcp_connect_core(socket_core_t *socket, socket_cores_t *local_sockets,
    17401735    struct sockaddr *addr, socklen_t addrlen)
    17411736{
    1742         tcp_socket_data_ref socket_data;
     1737        tcp_socket_data_t *socket_data;
    17431738        packet_t packet;
    17441739        int rc;
     
    17491744
    17501745        /* Get the socket specific data */
    1751         socket_data = (tcp_socket_data_ref) socket->specific_data;
     1746        socket_data = (tcp_socket_data_t *) socket->specific_data;
    17521747        assert(socket_data);
    17531748        assert(socket->specific_data == socket_data);
     
    18281823}
    18291824
    1830 int tcp_queue_prepare_packet(socket_core_ref socket,
    1831     tcp_socket_data_ref socket_data, packet_t packet, size_t data_length)
    1832 {
    1833         tcp_header_ref header;
     1825int tcp_queue_prepare_packet(socket_core_t *socket,
     1826    tcp_socket_data_t *socket_data, packet_t packet, size_t data_length)
     1827{
     1828        tcp_header_t *header;
    18341829        int rc;
    18351830
     
    18391834
    18401835        /* Get TCP header */
    1841         header = (tcp_header_ref) packet_get_data(packet);
     1836        header = (tcp_header_t *) packet_get_data(packet);
    18421837        if (!header)
    18431838                return NO_DATA;
     
    18591854}
    18601855
    1861 int tcp_queue_packet(socket_core_ref socket, tcp_socket_data_ref socket_data,
     1856int tcp_queue_packet(socket_core_t *socket, tcp_socket_data_t *socket_data,
    18621857    packet_t packet, size_t data_length)
    18631858{
     
    18811876}
    18821877
    1883 packet_t tcp_get_packets_to_send(socket_core_ref socket, tcp_socket_data_ref
     1878packet_t tcp_get_packets_to_send(socket_core_t *socket, tcp_socket_data_t *
    18841879    socket_data)
    18851880{
     
    19411936}
    19421937
    1943 packet_t tcp_send_prepare_packet(socket_core_ref socket, tcp_socket_data_ref
     1938packet_t tcp_send_prepare_packet(socket_core_t *socket, tcp_socket_data_t *
    19441939    socket_data, packet_t packet, size_t data_length, size_t sequence_number)
    19451940{
    1946         tcp_header_ref header;
     1941        tcp_header_t *header;
    19471942        uint32_t checksum;
    19481943        int rc;
     
    19611956
    19621957        /* Get the header */
    1963         header = (tcp_header_ref) packet_get_data(packet);
     1958        header = (tcp_header_t *) packet_get_data(packet);
    19641959        if (!header) {
    19651960                pq_release_remote(tcp_globals.net_phone, packet_get_id(packet));
     
    20021997}
    20031998
    2004 packet_t tcp_prepare_copy(socket_core_ref socket, tcp_socket_data_ref
     1999packet_t tcp_prepare_copy(socket_core_t *socket, tcp_socket_data_t *
    20052000    socket_data, packet_t packet, size_t data_length, size_t sequence_number)
    20062001{
     
    20322027}
    20332028
    2034 void tcp_prepare_operation_header(socket_core_ref socket,
    2035     tcp_socket_data_ref socket_data, tcp_header_ref header, int synchronize,
     2029void tcp_prepare_operation_header(socket_core_t *socket,
     2030    tcp_socket_data_t *socket_data, tcp_header_t *header, int synchronize,
    20362031    int finalize)
    20372032{
     
    20502045
    20512046int tcp_prepare_timeout(int (*timeout_function)(void *tcp_timeout_t),
    2052     socket_core_ref socket, tcp_socket_data_ref socket_data,
     2047    socket_core_t *socket, tcp_socket_data_t *socket_data,
    20532048    size_t sequence_number, tcp_socket_state_t state, suseconds_t timeout,
    20542049    int globals_read_only)
    20552050{
    2056         tcp_timeout_ref operation_timeout;
     2051        tcp_timeout_t *operation_timeout;
    20572052        fid_t fibril;
    20582053
     
    20962091}
    20972092
    2098 int tcp_recvfrom_message(socket_cores_ref local_sockets, int socket_id,
     2093int tcp_recvfrom_message(socket_cores_t *local_sockets, int socket_id,
    20992094    int flags, size_t *addrlen)
    21002095{
    2101         socket_core_ref socket;
    2102         tcp_socket_data_ref socket_data;
     2096        socket_core_t *socket;
     2097        tcp_socket_data_t *socket_data;
    21032098        int packet_id;
    21042099        packet_t packet;
     
    21172112                return NO_DATA;
    21182113
    2119         socket_data = (tcp_socket_data_ref) socket->specific_data;
     2114        socket_data = (tcp_socket_data_t *) socket->specific_data;
    21202115
    21212116        /* Check state */
     
    21542149}
    21552150
    2156 int tcp_send_message(socket_cores_ref local_sockets, int socket_id,
     2151int tcp_send_message(socket_cores_t *local_sockets, int socket_id,
    21572152    int fragments, size_t *data_fragment_size, int flags)
    21582153{
    2159         socket_core_ref socket;
    2160         tcp_socket_data_ref socket_data;
    2161         packet_dimension_ref packet_dimension;
     2154        socket_core_t *socket;
     2155        tcp_socket_data_t *socket_data;
     2156        packet_dimension_t *packet_dimension;
    21622157        packet_t packet;
    21632158        size_t total_length;
    2164         tcp_header_ref header;
     2159        tcp_header_t *header;
    21652160        int index;
    21662161        int result;
     
    21792174                return NO_DATA;
    21802175
    2181         socket_data = (tcp_socket_data_ref) socket->specific_data;
     2176        socket_data = (tcp_socket_data_t *) socket->specific_data;
    21822177
    21832178        /* Check state */
     
    22302225
    22312226int
    2232 tcp_close_message(socket_cores_ref local_sockets, int socket_id)
    2233 {
    2234         socket_core_ref socket;
    2235         tcp_socket_data_ref socket_data;
     2227tcp_close_message(socket_cores_t *local_sockets, int socket_id)
     2228{
     2229        socket_core_t *socket;
     2230        tcp_socket_data_t *socket_data;
    22362231        packet_t packet;
    22372232        int rc;
     
    22432238
    22442239        /* Get the socket specific data */
    2245         socket_data = (tcp_socket_data_ref) socket->specific_data;
     2240        socket_data = (tcp_socket_data_t *) socket->specific_data;
    22462241        assert(socket_data);
    22472242
     
    22982293}
    22992294
    2300 int tcp_create_notification_packet(packet_t *packet, socket_core_ref socket,
    2301     tcp_socket_data_ref socket_data, int synchronize, int finalize)
    2302 {
    2303         packet_dimension_ref packet_dimension;
    2304         tcp_header_ref header;
     2295int tcp_create_notification_packet(packet_t *packet, socket_core_t *socket,
     2296    tcp_socket_data_t *socket_data, int synchronize, int finalize)
     2297{
     2298        packet_dimension_t *packet_dimension;
     2299        tcp_header_t *header;
    23052300        int rc;
    23062301
     
    23322327}
    23332328
    2334 int tcp_accept_message(socket_cores_ref local_sockets, int socket_id,
     2329int tcp_accept_message(socket_cores_t *local_sockets, int socket_id,
    23352330    int new_socket_id, size_t *data_fragment_size, size_t *addrlen)
    23362331{
    2337         socket_core_ref accepted;
    2338         socket_core_ref socket;
    2339         tcp_socket_data_ref socket_data;
    2340         packet_dimension_ref packet_dimension;
     2332        socket_core_t *accepted;
     2333        socket_core_t *socket;
     2334        tcp_socket_data_t *socket_data;
     2335        packet_dimension_t *packet_dimension;
    23412336        int rc;
    23422337
     
    23512346
    23522347        /* Get the socket specific data */
    2353         socket_data = (tcp_socket_data_ref) socket->specific_data;
     2348        socket_data = (tcp_socket_data_t *) socket->specific_data;
    23542349        assert(socket_data);
    23552350
     
    23692364
    23702365                /* Get the socket specific data */
    2371                 socket_data = (tcp_socket_data_ref) accepted->specific_data;
     2366                socket_data = (tcp_socket_data_t *) accepted->specific_data;
    23722367                assert(socket_data);
    23732368                /* TODO can it be in another state? */
     
    24052400}
    24062401
    2407 void tcp_free_socket_data(socket_core_ref socket)
    2408 {
    2409         tcp_socket_data_ref socket_data;
     2402void tcp_free_socket_data(socket_core_t *socket)
     2403{
     2404        tcp_socket_data_t *socket_data;
    24102405
    24112406        assert(socket);
     
    24142409
    24152410        /* Get the socket specific data */
    2416         socket_data = (tcp_socket_data_ref) socket->specific_data;
     2411        socket_data = (tcp_socket_data_t *) socket->specific_data;
    24172412        assert(socket_data);
    24182413
Note: See TracChangeset for help on using the changeset viewer.