Ignore:
File:
1 edited

Legend:

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

    r0ac2158 r6b82009  
    11/*
    2  * Copyright (c) 2011 Jiri Svoboda
     2 * Copyright (c) 2008 Lukas Mejdrech
    33 * All rights reserved.
    44 *
     
    3030 * @{
    3131 */
    32 /** @file TCP (Transmission Control Protocol) network module
    33  */
    34 
    35 #ifndef TCP_H
    36 #define TCP_H
     32
     33/** @file
     34 * TCP module.
     35 */
     36
     37#ifndef NET_TCP_H_
     38#define NET_TCP_H_
    3739
    3840#include <async.h>
    39 #include <packet_remote.h>
    40 #include "tcp_type.h"
    41 
    42 extern async_sess_t *net_sess;
    43 extern async_sess_t *ip_sess;
    44 extern void tcp_transmit_pdu(tcp_pdu_t *);
     41#include <fibril_synch.h>
     42#include <net/packet.h>
     43#include <net/device.h>
     44#include <socket_core.h>
     45#include <tl_common.h>
     46
     47/** Type definition of the TCP global data.
     48 * @see tcp_globals
     49 */
     50typedef struct tcp_globals tcp_globals_t;
     51
     52/** Type definition of the TCP socket specific data.
     53 * @see tcp_socket_data
     54 */
     55typedef struct tcp_socket_data tcp_socket_data_t;
     56
     57/** Type definition of the TCP operation data.
     58 * @see tcp_operation
     59 */
     60typedef struct tcp_operation tcp_operation_t;
     61
     62/** TCP socket state type definition.
     63 * @see tcp_socket_state
     64 */
     65typedef enum tcp_socket_state tcp_socket_state_t;
     66
     67/** TCP socket state. */
     68enum tcp_socket_state {
     69        /** Initial.
     70         *
     71         * Not connected or bound.
     72         */
     73        TCP_SOCKET_INITIAL,
     74       
     75        /** Listening.
     76         *
     77         * Awaiting a connection request from another TCP layer.
     78         * When SYN is received a new bound socket in the
     79         * TCP_SOCKET_SYN_RECEIVED state should be created.
     80         */
     81        TCP_SOCKET_LISTEN,
     82       
     83        /** Connecting issued.
     84         *
     85         * A SYN has been sent, and TCP is awaiting the response SYN.
     86         * Should continue to the TCP_SOCKET_ESTABLISHED state.
     87         */
     88        TCP_SOCKET_SYN_SENT,
     89       
     90        /** Connecting received.
     91         *
     92         * A SYN has been received, a SYN has been sent, and TCP is awaiting an
     93         * ACK. Should continue to the TCP_SOCKET_ESTABLISHED state.
     94         */
     95        TCP_SOCKET_SYN_RECEIVED,
     96       
     97        /** Connected.
     98         *
     99         * The three-way handshake has been completed.
     100         */
     101        TCP_SOCKET_ESTABLISHED,
     102       
     103        /** Closing started.
     104         *
     105         * The local application has issued a CLOSE.
     106         * TCP has sent a FIN, and is awaiting an ACK or a FIN.
     107         * Should continue to the TCP_SOCKET_FIN_WAIT_2 state when an ACK is
     108         * received.
     109         * Should continue to the TCP_SOCKET_CLOSING state when a FIN is
     110         * received.
     111         */
     112        TCP_SOCKET_FIN_WAIT_1,
     113       
     114        /** Closing confirmed.
     115         *
     116         * A FIN has been sent, and an ACK received.
     117         * TCP is awaiting a~FIN from the remote TCP layer.
     118         * Should continue to the TCP_SOCKET_CLOSING state.
     119         */
     120        TCP_SOCKET_FIN_WAIT_2,
     121       
     122        /** Closing.
     123         *
     124         * A FIN has been sent, a FIN has been received, and an ACK has been
     125         * sent.
     126         * TCP is awaiting an ACK for the FIN that was sent.
     127         * Should continue to the TCP_SOCKET_TIME_WAIT state.
     128         */
     129        TCP_SOCKET_CLOSING,
     130       
     131        /** Closing received.
     132         *
     133         * TCP has received a FIN, and has sent an ACK.
     134         * It is awaiting a close request from the local application before
     135         * sending a FIN.
     136         * Should continue to the TCP_SOCKET_SOCKET_LAST_ACK state.
     137         */
     138        TCP_SOCKET_CLOSE_WAIT,
     139       
     140        /**
     141         * A FIN has been received, and an ACK and a FIN have been sent.
     142         * TCP is awaiting an ACK.
     143         * Should continue to the TCP_SOCKET_TIME_WAIT state.
     144         */
     145        TCP_SOCKET_LAST_ACK,
     146       
     147        /** Closing finished.
     148         *
     149         * FINs have been received and ACK’d, and TCP is waiting two MSLs to
     150         * remove the connection from the table.
     151         */
     152        TCP_SOCKET_TIME_WAIT,
     153       
     154        /** Closed.
     155         *
     156         * Imaginary, this indicates that a connection has been removed from
     157         * the connection table.
     158         */
     159        TCP_SOCKET_CLOSED
     160};
     161
     162/** TCP operation data. */
     163struct tcp_operation {
     164        /** Operation result. */
     165        int result;
     166        /** Safety lock. */
     167        fibril_mutex_t mutex;
     168        /** Operation result signaling. */
     169        fibril_condvar_t condvar;
     170};
     171
     172/** TCP socket specific data. */
     173struct tcp_socket_data {
     174        /** TCP socket state. */
     175        tcp_socket_state_t state;
     176       
     177        /**
     178         * Data fragment size.
     179         * Sending optimalization.
     180         */
     181        size_t data_fragment_size;
     182       
     183        /** Device identifier. */
     184        device_id_t device_id;
     185       
     186        /**
     187         * Listening backlog.
     188         * The maximal number of connected but not yet accepted sockets.
     189         */
     190        int backlog;
     191       
     192        /**
     193         * Parent listening socket identifier.
     194         * Set if this socket is an accepted one.
     195         */
     196        int listening_socket_id;
     197       
     198        /** Treshold size in bytes. */
     199        size_t treshold;
     200        /** Window size in bytes. */
     201        size_t window;
     202        /** Acknowledgement timeout. */
     203        suseconds_t timeout;
     204        /** Last acknowledged byte. */
     205        uint32_t acknowledged;
     206        /** Next incoming sequence number. */
     207        uint32_t next_incoming;
     208        /** Incoming FIN. */
     209        uint32_t fin_incoming;
     210        /** Next outgoing sequence number. */
     211        uint32_t next_outgoing;
     212        /** Last outgoing sequence number. */
     213        uint32_t last_outgoing;
     214        /** Outgoing FIN. */
     215        uint32_t fin_outgoing;
     216       
     217        /**
     218         * Expected sequence number by the remote host.
     219         * The sequence number the other host expects.
     220         * The notification is sent only upon a packet reecival.
     221         */
     222        uint32_t expected;
     223       
     224        /**
     225         * Expected sequence number counter.
     226         * Counts the number of received notifications for the same sequence
     227         * number.
     228         */
     229        int expected_count;
     230       
     231        /** Incoming packet queue.
     232         *
     233         * Packets are buffered until received in the right order.
     234         * The packets are excluded after successfully read.
     235         * Packets are sorted by their starting byte.
     236         * Packets metric is set as their data length.
     237         */
     238        packet_t *incoming;
     239       
     240        /** Outgoing packet queue.
     241         *
     242         * Packets are buffered until acknowledged by the remote host in the
     243         * right order.
     244         * The packets are excluded after acknowledged.
     245         * Packets are sorted by their starting byte.
     246         * Packets metric is set as their data length.
     247         */
     248        packet_t *outgoing;
     249       
     250        /** IP pseudo header. */
     251        void *pseudo_header;
     252        /** IP pseudo header length. */
     253        size_t headerlen;
     254        /** Remote host address. */
     255        struct sockaddr *addr;
     256        /** Remote host address length. */
     257        socklen_t addrlen;
     258        /** Remote host port. */
     259        uint16_t dest_port;
     260        /** Parent local sockets. */
     261        socket_cores_t *local_sockets;
     262       
     263        /** Local sockets safety lock.
     264         *
     265         * May be locked for writing while holding the global lock for reading
     266         * when changing the local sockets only.
     267         * The global lock may be locked only before locking the local lock.
     268         * The global lock may be locked more weakly than the local lock.
     269         * The global lock may be released before releasing the local lock.
     270         * @see tcp_globals:lock
     271         */
     272        fibril_rwlock_t *local_lock;
     273       
     274        /** Pending operation data. */
     275        tcp_operation_t operation;
     276       
     277        /**
     278         * Timeouts in a row counter.
     279         * If TCP_MAX_TIMEOUTS is reached, the connection is lost.
     280         */
     281        int timeout_count;
     282};
     283
     284/** TCP global data. */
     285struct tcp_globals {
     286        /** Networking module session. */
     287        async_sess_t *net_sess;
     288        /** IP module session. */
     289        async_sess_t *ip_sess;
     290        /** ICMP module session. */
     291        async_sess_t *icmp_sess;
     292        /** Last used free port. */
     293        int last_used_port;
     294        /** Active sockets. */
     295        socket_ports_t sockets;
     296        /** Device packet dimensions. */
     297        packet_dimensions_t dimensions;
     298       
     299        /**
     300         * Safety lock.
     301         * Write lock is used only for adding or removing socket ports.
     302         */
     303        fibril_rwlock_t lock;
     304};
    45305
    46306#endif
Note: See TracChangeset for help on using the changeset viewer.