Annotation of Gnu-Mach/i386/i386at/gpl/linux/include/net/tcp.h, revision 1.1

1.1     ! root        1: /*
        !             2:  * INET                An implementation of the TCP/IP protocol suite for the LINUX
        !             3:  *             operating system.  INET is implemented using the  BSD Socket
        !             4:  *             interface as the means of communication with the user level.
        !             5:  *
        !             6:  *             Definitions for the TCP module.
        !             7:  *
        !             8:  * Version:    @(#)tcp.h       1.0.5   05/23/93
        !             9:  *
        !            10:  * Authors:    Ross Biro, <[email protected]>
        !            11:  *             Fred N. van Kempen, <[email protected]>
        !            12:  *
        !            13:  *             This program is free software; you can redistribute it and/or
        !            14:  *             modify it under the terms of the GNU General Public License
        !            15:  *             as published by the Free Software Foundation; either version
        !            16:  *             2 of the License, or (at your option) any later version.
        !            17:  */
        !            18: #ifndef _TCP_H
        !            19: #define _TCP_H
        !            20: 
        !            21: #include <linux/tcp.h>
        !            22: #include <net/checksum.h>
        !            23: 
        !            24: #define MAX_SYN_SIZE   44 + MAX_HEADER + 15
        !            25: #define MAX_FIN_SIZE   40 + MAX_HEADER + 15
        !            26: #define MAX_ACK_SIZE   40 + MAX_HEADER + 15
        !            27: #define MAX_RESET_SIZE 40 + MAX_HEADER + 15
        !            28: #define MAX_WINDOW     32767           /* Never offer a window over 32767 without using
        !            29:                                           window scaling (not yet supported). Some poor
        !            30:                                           stacks do signed 16bit maths! */
        !            31: #define MIN_WINDOW     2048
        !            32: #define MAX_ACK_BACKLOG        2
        !            33: #define MIN_WRITE_SPACE        2048
        !            34: #define TCP_WINDOW_DIFF        2048
        !            35: 
        !            36: /* urg_data states */
        !            37: #define URG_VALID      0x0100
        !            38: #define URG_NOTYET     0x0200
        !            39: #define URG_READ       0x0400
        !            40: 
        !            41: #define TCP_RETR1      7       /*
        !            42:                                 * This is how many retries it does before it
        !            43:                                 * tries to figure out if the gateway is
        !            44:                                 * down.
        !            45:                                 */
        !            46: 
        !            47: #define TCP_RETR2      15      /*
        !            48:                                 * This should take at least
        !            49:                                 * 90 minutes to time out.
        !            50:                                 */
        !            51: 
        !            52: #define TCP_TIMEOUT_LEN        (15*60*HZ) /* should be about 15 mins           */
        !            53: #define TCP_TIMEWAIT_LEN (60*HZ) /* how long to wait to successfully 
        !            54:                                  * close the socket, about 60 seconds  */
        !            55: #define TCP_FIN_TIMEOUT (3*60*HZ) /* BSD style FIN_WAIT2 deadlock breaker */                             
        !            56: #define TCP_ACK_TIME   (3*HZ)  /* time to delay before sending an ACK  */
        !            57: #define TCP_DONE_TIME  (5*HZ/2)/* maximum time to wait before actually
        !            58:                                 * destroying a socket                  */
        !            59: #define TCP_WRITE_TIME (30*HZ) /* initial time to wait for an ACK,
        !            60:                                 * after last transmit                  */
        !            61: #define TCP_TIMEOUT_INIT (3*HZ)        /* RFC 1122 initial timeout value       */
        !            62: #define TCP_SYN_RETRIES         10     /* number of times to retry opening a
        !            63:                                 * connection   (TCP_RETR2-....)        */
        !            64: #define TCP_PROBEWAIT_LEN (1*HZ)/* time to wait between probes when
        !            65:                                 * I've got something to write and
        !            66:                                 * there is no window                   */
        !            67: 
        !            68: #define TCP_NO_CHECK   0       /* turn to one if you want the default
        !            69:                                 * to be no checksum                    */
        !            70: 
        !            71: 
        !            72: /*
        !            73:  *     TCP option
        !            74:  */
        !            75:  
        !            76: #define TCPOPT_NOP             1       /* Padding */
        !            77: #define TCPOPT_EOL             0       /* End of options */
        !            78: #define TCPOPT_MSS             2       /* Segment size negotiating */
        !            79: /*
        !            80:  *     We don't use these yet, but they are for PAWS and big windows
        !            81:  */
        !            82: #define TCPOPT_WINDOW          3       /* Window scaling */
        !            83: #define TCPOPT_TIMESTAMP       8       /* Better RTT estimations/PAWS */
        !            84: 
        !            85: 
        !            86: /*
        !            87:  * The next routines deal with comparing 32 bit unsigned ints
        !            88:  * and worry about wraparound (automatic with unsigned arithmetic).
        !            89:  */
        !            90: 
        !            91: extern __inline int before(__u32 seq1, __u32 seq2)
        !            92: {
        !            93:         return (__s32)(seq1-seq2) < 0;
        !            94: }
        !            95: 
        !            96: extern __inline int after(__u32 seq1, __u32 seq2)
        !            97: {
        !            98:        return (__s32)(seq2-seq1) < 0;
        !            99: }
        !           100: 
        !           101: 
        !           102: /* is s2<=s1<=s3 ? */
        !           103: extern __inline int between(__u32 seq1, __u32 seq2, __u32 seq3)
        !           104: {
        !           105:        return (after(seq1+1, seq2) && before(seq1, seq3+1));
        !           106: }
        !           107: 
        !           108: static __inline__ int min(unsigned int a, unsigned int b)
        !           109: {
        !           110:        if (a < b) 
        !           111:                return(a);
        !           112:        return(b);
        !           113: }
        !           114: 
        !           115: extern struct proto tcp_prot;
        !           116: extern struct tcp_mib tcp_statistics;
        !           117: extern struct wait_queue *master_select_wakeup;
        !           118: 
        !           119: extern void    tcp_err(int type, int code, unsigned char *header, __u32 daddr,
        !           120:                        __u32, struct inet_protocol *protocol);
        !           121: extern void    tcp_shutdown (struct sock *sk, int how);
        !           122: extern int     tcp_rcv(struct sk_buff *skb, struct device *dev,
        !           123:                        struct options *opt, __u32 daddr,
        !           124:                        unsigned short len, __u32 saddr, int redo,
        !           125:                        struct inet_protocol *protocol);
        !           126: 
        !           127: extern int tcp_ioctl(struct sock *sk, int cmd, unsigned long arg);
        !           128: 
        !           129: extern void tcp_read_wakeup(struct sock *);
        !           130: extern void tcp_write_xmit(struct sock *);
        !           131: extern void tcp_time_wait(struct sock *);
        !           132: extern void tcp_retransmit(struct sock *, int);
        !           133: extern void tcp_do_retransmit(struct sock *, int);
        !           134: extern void tcp_send_check(struct tcphdr *th, unsigned long saddr, 
        !           135:                unsigned long daddr, int len, struct sk_buff *skb);
        !           136: 
        !           137: /* tcp_output.c */
        !           138: 
        !           139: extern void tcp_send_probe0(struct sock *);
        !           140: extern void tcp_send_partial(struct sock *);
        !           141: extern void tcp_write_wakeup(struct sock *);
        !           142: extern void tcp_send_fin(struct sock *sk);
        !           143: extern void tcp_send_synack(struct sock *, struct sock *, struct sk_buff *);
        !           144: extern void tcp_send_skb(struct sock *, struct sk_buff *);
        !           145: extern void tcp_send_ack(u32, u32, struct sock *sk, struct tcphdr *th, u32);
        !           146: extern void tcp_send_reset(unsigned long saddr, unsigned long daddr, struct tcphdr *th,
        !           147:          struct proto *prot, struct options *opt, struct device *dev, int tos, int ttl);
        !           148: 
        !           149: extern void tcp_enqueue_partial(struct sk_buff *, struct sock *);
        !           150: extern struct sk_buff * tcp_dequeue_partial(struct sock *);
        !           151: 
        !           152: /* tcp_input.c */
        !           153: extern void tcp_cache_zap(void);
        !           154: 
        !           155: /* tcp_timer.c */
        !           156: #define     tcp_reset_msl_timer(x,y,z) reset_timer(x,y,z)
        !           157: extern void tcp_reset_xmit_timer(struct sock *, int, unsigned long);
        !           158: extern void tcp_retransmit_timer(unsigned long);
        !           159: 
        !           160: /*
        !           161:  *     Default sequence number picking algorithm.
        !           162:  *     As close as possible to RFC 793, which
        !           163:  *     suggests using a 250kHz clock.
        !           164:  *     Further reading shows this assumes 2MB/s networks.
        !           165:  *     For 10MB/s ethernet, a 1MHz clock is appropriate.
        !           166:  *     That's funny, Linux has one built in!  Use it!
        !           167:  */
        !           168: 
        !           169: static inline u32 tcp_init_seq(void)
        !           170: {
        !           171:        struct timeval tv;
        !           172:        do_gettimeofday(&tv);
        !           173:        return tv.tv_usec+tv.tv_sec*1000000;
        !           174: }
        !           175: 
        !           176: /*
        !           177:  *      This function returns the amount that we can raise the
        !           178:  *      usable window based on the following constraints
        !           179:  *  
        !           180:  *     1. The window can never be shrunk once it is offered (RFC 793)
        !           181:  *     2. We limit memory per socket
        !           182:  */
        !           183: 
        !           184: static __inline__ unsigned short tcp_raise_window(struct sock *sk)
        !           185: {
        !           186:        long free_space = sock_rspace(sk);
        !           187:        long window;
        !           188: 
        !           189:        if (free_space > 1024)
        !           190:                free_space &= ~0x3FF; /* make free space a multiple of 1024 */
        !           191: 
        !           192:        if(sk->window_clamp)
        !           193:                free_space = min(sk->window_clamp, free_space);
        !           194:  
        !           195:        /* 
        !           196:          * compute the actual window i.e. 
        !           197:          * old_window - received_bytes_on_that_win 
        !           198:         */
        !           199: 
        !           200:        window = sk->window - (sk->acked_seq - sk->lastwin_seq);
        !           201: 
        !           202:        if (sk->mss == 0)
        !           203:                sk->mss = sk->mtu;
        !           204:  
        !           205:        if ( window < 0 ) {     
        !           206:                window = 0;
        !           207:                printk(KERN_DEBUG "TRW: win < 0 w=%d 1=%u 2=%u\n", 
        !           208:                       sk->window, sk->acked_seq, sk->lastwin_seq);
        !           209:        }
        !           210:        
        !           211:        if ( (free_space - window) >= min(sk->mss, MAX_WINDOW/2) )
        !           212:                return ((free_space - window) / sk->mss) * sk->mss;
        !           213: 
        !           214:        return 0;
        !           215: }
        !           216: 
        !           217: static __inline__ unsigned short tcp_select_window(struct sock *sk)
        !           218: {
        !           219:        long free_space = sock_rspace(sk);
        !           220:        long window;
        !           221: 
        !           222:        if (free_space > 1024)
        !           223:                free_space &= ~0x3FF;   /* make free space a multiple of 1024 */
        !           224: 
        !           225:        if (sk->window_clamp)
        !           226:                free_space = min(sk->window_clamp, free_space);
        !           227:        
        !           228:        /*
        !           229:         * compute the actual window i.e.
        !           230:         * old_window - received_bytes_on_that_win
        !           231:         */
        !           232: 
        !           233:        if (sk->mss == 0)
        !           234:                sk->mss = sk->mtu;
        !           235: 
        !           236:        window = sk->window - (sk->acked_seq - sk->lastwin_seq);
        !           237: 
        !           238:        if ( window < 0 ) {
        !           239:                window = 0;
        !           240:                printk(KERN_DEBUG "TSW: win < 0 w=%d 1=%u 2=%u\n",
        !           241:                        sk->window, sk->acked_seq, sk->lastwin_seq);
        !           242:        }
        !           243: 
        !           244:        /*
        !           245:         * RFC 1122:
        !           246:         * "the suggested [SWS] avoidance algoritm for the receiver is to keep
        !           247:         *  RECV.NEXT + RCV.WIN fixed until:
        !           248:         *  RCV.BUFF - RCV.USER - RCV.WINDOW >= min(1/2 RCV.BUFF, MSS)"
        !           249:         *
        !           250:         * i.e. don't raise the right edge of the window until you can't raise
        !           251:         * it MSS bytes
        !           252:         */
        !           253: 
        !           254:        if ( (free_space - window) >= min(sk->mss, MAX_WINDOW/2) )
        !           255:                window += ((free_space - window) / sk->mss) * sk->mss;
        !           256: 
        !           257:        sk->window = window;
        !           258:        sk->lastwin_seq = sk->acked_seq;
        !           259: 
        !           260:        return sk->window;
        !           261: }
        !           262: 
        !           263: /*
        !           264:  * List all states of a TCP socket that can be viewed as a "connected"
        !           265:  * state.  This now includes TCP_SYN_RECV, although I am not yet fully
        !           266:  * convinced that this is the solution for the 'getpeername(2)'
        !           267:  * problem. Thanks to Stephen A. Wood <[email protected]>  -FvK
        !           268:  */
        !           269: 
        !           270: extern __inline const int tcp_connected(const int state)
        !           271: {
        !           272:   return(state == TCP_ESTABLISHED || state == TCP_CLOSE_WAIT ||
        !           273:         state == TCP_FIN_WAIT1   || state == TCP_FIN_WAIT2 ||
        !           274:         state == TCP_SYN_RECV);
        !           275: }
        !           276: 
        !           277: /*
        !           278:  * Calculate(/check) TCP checksum
        !           279:  */
        !           280: static __inline__ u16 tcp_check(struct tcphdr *th, int len,
        !           281:        unsigned long saddr, unsigned long daddr, unsigned long base)
        !           282: {
        !           283:        return csum_tcpudp_magic(saddr,daddr,len,IPPROTO_TCP,base);
        !           284: }
        !           285: 
        !           286: #undef STATE_TRACE
        !           287: 
        !           288: #ifdef STATE_TRACE
        !           289: static char *statename[]={
        !           290:        "Unused","Established","Syn Sent","Syn Recv",
        !           291:        "Fin Wait 1","Fin Wait 2","Time Wait", "Close",
        !           292:        "Close Wait","Last ACK","Listen","Closing"
        !           293: };
        !           294: #endif
        !           295: 
        !           296: static __inline__ void tcp_set_state(struct sock *sk, int state)
        !           297: {
        !           298:        int oldstate = sk->state;
        !           299: 
        !           300:        sk->state = state;
        !           301: 
        !           302: #ifdef STATE_TRACE
        !           303:        if(sk->debug)
        !           304:                printk("TCP sk=%p, State %s -> %s\n",sk, statename[oldstate],statename[state]);
        !           305: #endif 
        !           306: 
        !           307:        switch (state) {
        !           308:        case TCP_ESTABLISHED:
        !           309:                if (oldstate != TCP_ESTABLISHED) {
        !           310:                        tcp_statistics.TcpCurrEstab++;
        !           311:                        /* This is a hack but it doesn't occur often and it's going to
        !           312:                           be a real        to fix nicely */
        !           313:                        if (oldstate == TCP_SYN_RECV)
        !           314:                                wake_up_interruptible(&master_select_wakeup);
        !           315:                }
        !           316:                break;
        !           317: 
        !           318:        case TCP_CLOSE:
        !           319:                tcp_cache_zap();
        !           320:                /* Should be about 2 rtt's */
        !           321:                reset_timer(sk, TIME_DONE, min(sk->rtt * 2, TCP_DONE_TIME));
        !           322:                /* fall through */
        !           323:        default:
        !           324:                if (oldstate==TCP_ESTABLISHED)
        !           325:                        tcp_statistics.TcpCurrEstab--;
        !           326:        }
        !           327: }
        !           328: 
        !           329: #endif /* _TCP_H */

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.