Annotation of Gnu-Mach/linux/src/include/net/tcp.h, revision 1.1.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: /* This is for all connections with a full identity, no wildcards. */
                     25: #define TCP_HTABLE_SIZE                256
                     26: 
                     27: /* This is for listening sockets, thus all sockets which possess wildcards. */
                     28: #define TCP_LHTABLE_SIZE       32      /* Yes, really, this is all you need. */
                     29: 
                     30: /* This is for all sockets, to keep track of the local port allocations. */
                     31: #define TCP_BHTABLE_SIZE       64
                     32: 
                     33: /* tcp_ipv4.c: These need to be shared by v4 and v6 because the lookup
                     34:  *             and hashing code needs to work with different AF's yet
                     35:  *             the port space is shared.
                     36:  */
                     37: extern struct sock *tcp_established_hash[TCP_HTABLE_SIZE];
                     38: extern struct sock *tcp_listening_hash[TCP_LHTABLE_SIZE];
                     39: extern struct sock *tcp_bound_hash[TCP_BHTABLE_SIZE];
                     40: 
                     41: /* These are AF independant. */
                     42: static __inline__ int tcp_bhashfn(__u16 lport)
                     43: {
                     44:        return (lport ^ (lport >> 7)) & (TCP_BHTABLE_SIZE-1);
                     45: }
                     46: 
                     47: /* Find the next port that hashes h that is larger than lport.
                     48:  * If you change the hash, change this function to match, or you will
                     49:  * break TCP port selection. This function must also NOT wrap around
                     50:  * when the next number exceeds the largest possible port (2^16-1).
                     51:  */
                     52: static __inline__ int tcp_bhashnext(__u16 lport, __u16 h)
                     53: {
                     54:         __u32 s;       /* don't change this to a smaller type! */
                     55: 
                     56:         s = (lport ^ (h ^ tcp_bhashfn(lport)));
                     57:         if (s > lport)
                     58:                 return s;
                     59:         s = lport + TCP_BHTABLE_SIZE;
                     60:         return (s ^ (h ^ tcp_bhashfn(s)));
                     61: }
                     62: 
                     63: static __inline__ int tcp_sk_bhashfn(struct sock *sk)
                     64: {
                     65:        __u16 lport = sk->num;
                     66:        return tcp_bhashfn(lport);
                     67: }
                     68: 
                     69: /* These can have wildcards, don't try too hard.
                     70:  * XXX deal with thousands of IP aliases for listening ports later
                     71:  */
                     72: static __inline__ int tcp_lhashfn(unsigned short num)
                     73: {
                     74:        return num & (TCP_LHTABLE_SIZE - 1);
                     75: }
                     76: 
                     77: static __inline__ int tcp_sk_listen_hashfn(struct sock *sk)
                     78: {
                     79:        return tcp_lhashfn(sk->num);
                     80: }
                     81: 
                     82: /* This is IPv4 specific. */
                     83: static __inline__ int tcp_hashfn(__u32 laddr, __u16 lport,
                     84:                                 __u32 faddr, __u16 fport)
                     85: {
                     86:        return ((laddr ^ lport) ^ (faddr ^ fport)) & (TCP_HTABLE_SIZE - 1);
                     87: }
                     88: 
                     89: static __inline__ int tcp_sk_hashfn(struct sock *sk)
                     90: {
                     91:        __u32 laddr = sk->rcv_saddr;
                     92:        __u16 lport = sk->num;
                     93:        __u32 faddr = sk->daddr;
                     94:        __u16 fport = sk->dummy_th.dest;
                     95: 
                     96:        return tcp_hashfn(laddr, lport, faddr, fport);
                     97: }
                     98: 
                     99: /* Only those holding the sockhash lock call these two things here.
                    100:  * Note the slightly gross overloading of sk->prev, AF_UNIX is the
                    101:  * only other main benefactor of that member of SK, so who cares.
                    102:  */
                    103: static __inline__ void tcp_sk_bindify(struct sock *sk)
                    104: {
                    105:        int hashent = tcp_sk_bhashfn(sk);
                    106:        struct sock **htable = &tcp_bound_hash[hashent];
                    107: 
                    108:        if((sk->bind_next = *htable) != NULL)
                    109:                (*htable)->bind_pprev = &sk->bind_next;
                    110:        *htable = sk;
                    111:        sk->bind_pprev = htable;
                    112: }
                    113: 
                    114: static __inline__ void tcp_sk_unbindify(struct sock *sk)
                    115: {
                    116:        if(sk->bind_next)
                    117:                sk->bind_next->bind_pprev = sk->bind_pprev;
                    118:        *(sk->bind_pprev) = sk->bind_next;
                    119: }
                    120: 
                    121: /*
                    122:  * 40 is maximal IP options size
                    123:  * 4  is TCP option size (MSS)
                    124:  */
                    125: #define MAX_SYN_SIZE   (sizeof(struct iphdr) + 40 + sizeof(struct tcphdr) + 4 + MAX_HEADER + 15)
                    126: #define MAX_FIN_SIZE   (sizeof(struct iphdr) + 40 + sizeof(struct tcphdr) + MAX_HEADER + 15)
                    127: #define MAX_ACK_SIZE   (sizeof(struct iphdr) + 40 + sizeof(struct tcphdr) + MAX_HEADER + 15)
                    128: #define MAX_RESET_SIZE (sizeof(struct iphdr) + 40 + sizeof(struct tcphdr) + MAX_HEADER + 15)
                    129: 
                    130: #define MAX_WINDOW     32767           /* Never offer a window over 32767 without using
                    131:                                           window scaling (not yet supported). Some poor
                    132:                                           stacks do signed 16bit maths! */
                    133: #define MIN_WINDOW     2048
                    134: #define MAX_ACK_BACKLOG        2
                    135: #define MAX_DUP_ACKS   3
                    136: #define MIN_WRITE_SPACE        2048
                    137: #define TCP_WINDOW_DIFF        2048
                    138: 
                    139: /* urg_data states */
                    140: #define URG_VALID      0x0100
                    141: #define URG_NOTYET     0x0200
                    142: #define URG_READ       0x0400
                    143: 
                    144: #define TCP_RETR1      7       /*
                    145:                                 * This is how many retries it does before it
                    146:                                 * tries to figure out if the gateway is
                    147:                                 * down.
                    148:                                 */
                    149: 
                    150: #define TCP_RETR2      15      /*
                    151:                                 * This should take at least
                    152:                                 * 90 minutes to time out.
                    153:                                 */
                    154: 
                    155: #define TCP_TIMEOUT_LEN        (15*60*HZ) /* should be about 15 mins           */
                    156: #define TCP_TIMEWAIT_LEN (60*HZ) /* how long to wait to successfully 
                    157:                                  * close the socket, about 60 seconds  */
                    158: #define TCP_FIN_TIMEOUT (3*60*HZ) /* BSD style FIN_WAIT2 deadlock breaker */                             
                    159: #define TCP_ACK_TIME   (3*HZ)  /* time to delay before sending an ACK  */
                    160: #define TCP_DONE_TIME  (5*HZ/2)/* maximum time to wait before actually
                    161:                                 * destroying a socket                  */
                    162: #define TCP_WRITE_TIME (30*HZ) /* initial time to wait for an ACK,
                    163:                                 * after last transmit                  */
                    164: #define TCP_TIMEOUT_INIT (3*HZ)        /* RFC 1122 initial timeout value       */
                    165: #define TCP_SYN_RETRIES         5      /* number of times to retry opening a
                    166:                                 * connection   (TCP_RETR2-....)        */
                    167: #define TCP_PROBEWAIT_LEN (1*HZ)/* time to wait between probes when
                    168:                                 * I've got something to write and
                    169:                                 * there is no window                   */
                    170: 
                    171: #define TCP_NO_CHECK   0       /* turn to one if you want the default
                    172:                                 * to be no checksum                    */
                    173: 
                    174: 
                    175: /*
                    176:  *     TCP option
                    177:  */
                    178:  
                    179: #define TCPOPT_NOP             1       /* Padding */
                    180: #define TCPOPT_EOL             0       /* End of options */
                    181: #define TCPOPT_MSS             2       /* Segment size negotiating */
                    182: /*
                    183:  *     We don't use these yet, but they are for PAWS and big windows
                    184:  */
                    185: #define TCPOPT_WINDOW          3       /* Window scaling */
                    186: #define TCPOPT_TIMESTAMP       8       /* Better RTT estimations/PAWS */
                    187: 
                    188: 
                    189: /*
                    190:  * The next routines deal with comparing 32 bit unsigned ints
                    191:  * and worry about wraparound (automatic with unsigned arithmetic).
                    192:  */
                    193: 
                    194: extern __inline int before(__u32 seq1, __u32 seq2)
                    195: {
                    196:         return (__s32)(seq1-seq2) < 0;
                    197: }
                    198: 
                    199: extern __inline int after(__u32 seq1, __u32 seq2)
                    200: {
                    201:        return (__s32)(seq2-seq1) < 0;
                    202: }
                    203: 
                    204: 
                    205: /* is s2<=s1<=s3 ? */
                    206: extern __inline int between(__u32 seq1, __u32 seq2, __u32 seq3)
                    207: {
                    208:        return (after(seq1+1, seq2) && before(seq1, seq3+1));
                    209: }
                    210: 
                    211: static __inline__ int min(unsigned int a, unsigned int b)
                    212: {
                    213:        if (a > b)
                    214:                a = b;
                    215:        return a;
                    216: }
                    217: 
                    218: static __inline__ int max(unsigned int a, unsigned int b)
                    219: {
                    220:        if (a < b)
                    221:                a = b;
                    222:        return a;
                    223: }
                    224: 
                    225: extern struct proto tcp_prot;
                    226: extern struct tcp_mib tcp_statistics;
                    227: 
                    228: extern unsigned short          tcp_good_socknum(void);
                    229: 
                    230: extern void    tcp_err(int type, int code, unsigned char *header, __u32 daddr,
                    231:                        __u32, struct inet_protocol *protocol, int len);
                    232: extern void    tcp_shutdown (struct sock *sk, int how);
                    233: extern int     tcp_rcv(struct sk_buff *skb, struct device *dev,
                    234:                        struct options *opt, __u32 daddr,
                    235:                        unsigned short len, __u32 saddr, int redo,
                    236:                        struct inet_protocol *protocol);
                    237: 
                    238: extern int tcp_ioctl(struct sock *sk, int cmd, unsigned long arg);
                    239: 
                    240: extern void tcp_v4_unhash(struct sock *sk);
                    241: 
                    242: extern void tcp_read_wakeup(struct sock *);
                    243: extern void tcp_write_xmit(struct sock *);
                    244: extern void tcp_time_wait(struct sock *);
                    245: extern void tcp_retransmit(struct sock *, int);
                    246: extern void tcp_do_retransmit(struct sock *, int);
                    247: extern void tcp_send_check(struct tcphdr *th, unsigned long saddr, 
                    248:                unsigned long daddr, int len, struct sk_buff *skb);
                    249: 
                    250: /* tcp_output.c */
                    251: 
                    252: extern void tcp_send_probe0(struct sock *);
                    253: extern void tcp_send_partial(struct sock *);
                    254: extern void tcp_write_wakeup(struct sock *);
                    255: extern void tcp_send_fin(struct sock *sk);
                    256: extern void tcp_send_synack(struct sock *, struct sock *, struct sk_buff *, int);
                    257: extern void tcp_send_skb(struct sock *, struct sk_buff *);
                    258: extern void tcp_send_ack(struct sock *sk);
                    259: extern void tcp_send_delayed_ack(struct sock *sk, int max_timeout, unsigned long timeout);
                    260: extern void tcp_send_reset(unsigned long saddr, unsigned long daddr, struct tcphdr *th,
                    261:          struct proto *prot, struct options *opt, struct device *dev, int tos, int ttl);
                    262: 
                    263: extern void tcp_enqueue_partial(struct sk_buff *, struct sock *);
                    264: extern struct sk_buff * tcp_dequeue_partial(struct sock *);
                    265: extern void tcp_shrink_skb(struct sock *,struct sk_buff *,u32);
                    266: 
                    267: /* CONFIG_IP_TRANSPARENT_PROXY */
                    268: extern int tcp_chkaddr(struct sk_buff *);
                    269: 
                    270: /* tcp_timer.c */
                    271: #define     tcp_reset_msl_timer(x,y,z) reset_timer(x,y,z)
                    272: extern void tcp_reset_xmit_timer(struct sock *, int, unsigned long);
                    273: extern void tcp_delack_timer(unsigned long);
                    274: extern void tcp_retransmit_timer(unsigned long);
                    275: 
                    276: static __inline__ int tcp_old_window(struct sock * sk)
                    277: {
                    278:        return sk->window - (sk->acked_seq - sk->lastwin_seq);
                    279: }
                    280: 
                    281: extern int tcp_new_window(struct sock *);
                    282: 
                    283: /*
                    284:  * Return true if we should raise the window when we
                    285:  * have cleaned up the receive queue. We don't want to
                    286:  * do this normally, only if it makes sense to avoid
                    287:  * zero window probes..
                    288:  *
                    289:  * We do this only if we can raise the window noticeably.
                    290:  */
                    291: static __inline__ int tcp_raise_window(struct sock * sk)
                    292: {
                    293:        int new = tcp_new_window(sk);
                    294:        return new && (new >= 2*tcp_old_window(sk));
                    295: }
                    296: 
                    297: static __inline__ unsigned short tcp_select_window(struct sock *sk)
                    298: {
                    299:        int window = tcp_new_window(sk);
                    300:        int oldwin = tcp_old_window(sk);
                    301: 
                    302:        /* Don't allow a shrinking window */
                    303:        if (window > oldwin) {
                    304:                sk->window = window;
                    305:                sk->lastwin_seq = sk->acked_seq;
                    306:                oldwin = window;
                    307:        }
                    308:        return oldwin;
                    309: }
                    310: 
                    311: /*
                    312:  * List all states of a TCP socket that can be viewed as a "connected"
                    313:  * state.  This now includes TCP_SYN_RECV, although I am not yet fully
                    314:  * convinced that this is the solution for the 'getpeername(2)'
                    315:  * problem. Thanks to Stephen A. Wood <[email protected]>  -FvK
                    316:  */
                    317: 
                    318: extern __inline const int tcp_connected(const int state)
                    319: {
                    320:   return(state == TCP_ESTABLISHED || state == TCP_CLOSE_WAIT ||
                    321:         state == TCP_FIN_WAIT1   || state == TCP_FIN_WAIT2 ||
                    322:         state == TCP_SYN_RECV);
                    323: }
                    324: 
                    325: /*
                    326:  * Calculate(/check) TCP checksum
                    327:  */
                    328: static __inline__ u16 tcp_check(struct tcphdr *th, int len,
                    329:        unsigned long saddr, unsigned long daddr, unsigned long base)
                    330: {
                    331:        return csum_tcpudp_magic(saddr,daddr,len,IPPROTO_TCP,base);
                    332: }
                    333: 
                    334: #undef STATE_TRACE
                    335: 
                    336: #ifdef STATE_TRACE
                    337: static char *statename[]={
                    338:        "Unused","Established","Syn Sent","Syn Recv",
                    339:        "Fin Wait 1","Fin Wait 2","Time Wait", "Close",
                    340:        "Close Wait","Last ACK","Listen","Closing"
                    341: };
                    342: #endif
                    343: 
                    344: static __inline__ void tcp_set_state(struct sock *sk, int state)
                    345: {
                    346:        int oldstate = sk->state;
                    347: 
                    348:        sk->state = state;
                    349: 
                    350: #ifdef STATE_TRACE
                    351:        if(sk->debug)
                    352:                printk("TCP sk=%p, State %s -> %s\n",sk, statename[oldstate],statename[state]);
                    353: #endif 
                    354: 
                    355:        switch (state) {
                    356:        case TCP_ESTABLISHED:
                    357:                if (oldstate != TCP_ESTABLISHED) {
                    358:                        tcp_statistics.TcpCurrEstab++;
                    359:                }
                    360:                break;
                    361: 
                    362:        case TCP_CLOSE:
                    363:                /* Preserve the invariant */
                    364:                tcp_v4_unhash(sk);
                    365:                /* Should be about 2 rtt's */
                    366:                reset_timer(sk, TIME_DONE, min(sk->rtt * 2, TCP_DONE_TIME));
                    367:                /* fall through */
                    368:        default:
                    369:                if (oldstate==TCP_ESTABLISHED)
                    370:                        tcp_statistics.TcpCurrEstab--;
                    371:        }
                    372: }
                    373: 
                    374: #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.