Annotation of Gnu-Mach/i386/i386at/gpl/linux/include/net/sock.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 AF_INET socket handler.
                      7:  *
                      8:  * Version:    @(#)sock.h      1.0.4   05/13/93
                      9:  *
                     10:  * Authors:    Ross Biro, <[email protected]>
                     11:  *             Fred N. van Kempen, <[email protected]>
                     12:  *             Corey Minyard <[email protected]>
                     13:  *             Florian La Roche <[email protected]>
                     14:  *
                     15:  * Fixes:
                     16:  *             Alan Cox        :       Volatiles in skbuff pointers. See
                     17:  *                                     skbuff comments. May be overdone,
                     18:  *                                     better to prove they can be removed
                     19:  *                                     than the reverse.
                     20:  *             Alan Cox        :       Added a zapped field for tcp to note
                     21:  *                                     a socket is reset and must stay shut up
                     22:  *             Alan Cox        :       New fields for options
                     23:  *     Pauline Middelink       :       identd support
                     24:  *             Alan Cox        :       Eliminate low level recv/recvfrom
                     25:  *
                     26:  *             This program is free software; you can redistribute it and/or
                     27:  *             modify it under the terms of the GNU General Public License
                     28:  *             as published by the Free Software Foundation; either version
                     29:  *             2 of the License, or (at your option) any later version.
                     30:  */
                     31: #ifndef _SOCK_H
                     32: #define _SOCK_H
                     33: 
                     34: #include <linux/timer.h>
                     35: #include <linux/ip.h>          /* struct options */
                     36: #include <linux/in.h>          /* struct sockaddr_in */
                     37: #include <linux/tcp.h>         /* struct tcphdr */
                     38: #include <linux/config.h>
                     39: 
                     40: #include <linux/netdevice.h>
                     41: #include <linux/skbuff.h>      /* struct sk_buff */
                     42: #include <net/protocol.h>              /* struct inet_protocol */
                     43: #ifdef CONFIG_AX25
                     44: #include <net/ax25.h>
                     45: #ifdef CONFIG_NETROM
                     46: #include <net/netrom.h>
                     47: #endif
                     48: #endif
                     49: #ifdef CONFIG_IPX
                     50: #include <net/ipx.h>
                     51: #endif
                     52: #ifdef CONFIG_ATALK
                     53: #include <linux/atalk.h>
                     54: #endif
                     55: 
                     56: #include <linux/igmp.h>
                     57: 
                     58: /* Think big (also on some systems a byte is faster) */
                     59: #define SOCK_ARRAY_SIZE        256
                     60: 
                     61: 
                     62: /*
                     63:  *     The AF_UNIX specific socket options
                     64:  */
                     65:  
                     66: struct unix_opt
                     67: {
                     68:        int                     family;
                     69:        char *                  name;
                     70:        int                     locks;
                     71:        struct inode *          inode;
                     72:        struct semaphore        readsem;
                     73:        struct sock *           other;
                     74: };
                     75: 
                     76: /*
                     77:  *     IP packet socket options
                     78:  */
                     79: 
                     80: struct inet_packet_opt
                     81: {
                     82:        struct notifier_block   notifier;               /* Used when bound */
                     83:        struct device           *bound_dev;
                     84:        unsigned long           dev_stamp;
                     85:        struct packet_type      *prot_hook;
                     86:        char                    device_name[15];
                     87: };
                     88: 
                     89: 
                     90: /*
                     91:  * This structure really needs to be cleaned up.
                     92:  * Most of it is for TCP, and not used by any of
                     93:  * the other protocols.
                     94:  */
                     95: struct sock 
                     96: {
                     97:        struct options          *opt;
                     98:        volatile unsigned long  wmem_alloc;
                     99:        volatile unsigned long  rmem_alloc;
                    100:        unsigned long           allocation;             /* Allocation mode */
                    101:        __u32                   write_seq;
                    102:        __u32                   sent_seq;
                    103:        __u32                   acked_seq;
                    104:        __u32                   copied_seq;
                    105:        __u32                   rcv_ack_seq;
                    106:        __u32                   window_seq;
                    107:        __u32                   fin_seq;
                    108:        __u32                   urg_seq;
                    109:        __u32                   urg_data;
                    110:        int                     users;                  /* user count */
                    111:   /*
                    112:    *   Not all are volatile, but some are, so we
                    113:    *   might as well say they all are.
                    114:    */
                    115:        volatile char           dead,
                    116:                                urginline,
                    117:                                intr,
                    118:                                blog,
                    119:                                done,
                    120:                                reuse,
                    121:                                keepopen,
                    122:                                linger,
                    123:                                delay_acks,
                    124:                                destroy,
                    125:                                ack_timed,
                    126:                                no_check,
                    127:                                zapped, /* In ax25 & ipx means not linked */
                    128:                                broadcast,
                    129:                                nonagle,
                    130:                                bsdism;
                    131:        unsigned long           lingertime;
                    132:        int                     proc;
                    133:        struct sock             *next;
                    134:        struct sock             *prev; /* Doubly linked chain.. */
                    135:        struct sock             *pair;
                    136:        struct sk_buff          * volatile send_head;
                    137:        struct sk_buff          * volatile send_tail;
                    138:        struct sk_buff_head     back_log;
                    139:        struct sk_buff          *partial;
                    140:        struct timer_list       partial_timer;
                    141:        long                    retransmits;
                    142:        struct sk_buff_head     write_queue,
                    143:                                receive_queue;
                    144:        struct proto            *prot;
                    145:        struct wait_queue       **sleep;
                    146:        __u32                   daddr;
                    147:        __u32                   saddr;          /* Sending source */
                    148:        __u32                   rcv_saddr;      /* Bound address */
                    149:        unsigned short          max_unacked;
                    150:        unsigned short          window;
                    151:        __u32                   lastwin_seq;    /* sequence number when we last updated the window we offer */
                    152:        volatile unsigned long  ato;            /* ack timeout */
                    153:        volatile unsigned long  lrcvtime;       /* jiffies at last rcv */
                    154:        unsigned short          bytes_rcv;
                    155: /*
                    156:  *     mss is min(mtu, max_window) 
                    157:  */
                    158:        unsigned short          mtu;       /* mss negotiated in the syn's */
                    159:        volatile unsigned short mss;       /* current eff. mss - can change */
                    160:        volatile unsigned short user_mss;  /* mss requested by user in ioctl */
                    161:        volatile unsigned short max_window;
                    162:        unsigned long           window_clamp;
                    163:        unsigned short          num;
                    164:        volatile unsigned short cong_window;
                    165:        volatile unsigned short cong_count;
                    166:        volatile unsigned short ssthresh;
                    167:        volatile unsigned short packets_out;
                    168:        volatile unsigned short shutdown;
                    169:        volatile unsigned long  rtt;
                    170:        volatile unsigned long  mdev;
                    171:        volatile unsigned long  rto;
                    172: 
                    173: /*
                    174:  *     currently backoff isn't used, but I'm maintaining it in case
                    175:  *     we want to go back to a backoff formula that needs it
                    176:  */
                    177:  
                    178:        volatile unsigned short backoff;
                    179:        volatile int            err, err_soft;  /* Soft holds errors that don't
                    180:                                                   cause failure but are the cause
                    181:                                                   of a persistent failure not just
                    182:                                                   'timed out' */
                    183:        unsigned char           protocol;
                    184:        volatile unsigned char  state;
                    185:        volatile unsigned char  ack_backlog;
                    186:        unsigned char           max_ack_backlog;
                    187:        unsigned char           priority;
                    188:        unsigned char           debug;
                    189:        unsigned short          rcvbuf;
                    190:        unsigned short          sndbuf;
                    191:        unsigned short          type;
                    192:        unsigned char           localroute;     /* Route locally only */
                    193: #ifdef CONFIG_IPX
                    194: /*
                    195:  *     Once the IPX ncpd patches are in these are going into protinfo
                    196:  */
                    197:        ipx_address             ipx_dest_addr;
                    198:        ipx_interface           *ipx_intrfc;
                    199:        unsigned short          ipx_port;
                    200: 
                    201: /* To handle asynchronous messages from the NetWare server, we have to
                    202:  * know the connection this socket belongs to. Sorry to blow up this
                    203:  * structure even more. */
                    204:        struct ncp_server       *ipx_ncp_server;
                    205: 
                    206: #ifdef CONFIG_IPX_INTERN
                    207:        unsigned char           ipx_node[IPX_NODE_LEN];
                    208: #endif
                    209:        unsigned short          ipx_type;
                    210: #endif
                    211: #ifdef CONFIG_AX25
                    212:        ax25_cb                 *ax25;
                    213: #ifdef CONFIG_NETROM
                    214:        nr_cb                   *nr;
                    215: #endif
                    216: #endif
                    217:   
                    218: /*
                    219:  *     This is where all the private (optional) areas that don't
                    220:  *     overlap will eventually live. 
                    221:  */
                    222: 
                    223:        union
                    224:        {
                    225:                struct unix_opt af_unix;
                    226: #ifdef CONFIG_ATALK
                    227:                struct atalk_sock       af_at;
                    228: #endif
                    229: #ifdef CONFIG_INET
                    230:                struct inet_packet_opt  af_packet;
                    231: #endif
                    232:        } protinfo;             
                    233: 
                    234: /* 
                    235:  *     IP 'private area' or will be eventually 
                    236:  */
                    237:        int                     ip_ttl;                 /* TTL setting */
                    238:        int                     ip_tos;                 /* TOS */
                    239:        struct tcphdr           dummy_th;
                    240:        struct timer_list       keepalive_timer;        /* TCP keepalive hack */
                    241:        struct timer_list       retransmit_timer;       /* TCP retransmit timer */
                    242:        struct timer_list       ack_timer;              /* TCP delayed ack timer */
                    243:        int                     ip_xmit_timeout;        /* Why the timeout is running */
                    244:        struct rtable           *ip_route_cache;        /* Cached output route */
                    245:        unsigned char           ip_hdrincl;             /* Include headers ? */
                    246: #ifdef CONFIG_IP_MULTICAST  
                    247:        int                     ip_mc_ttl;              /* Multicasting TTL */
                    248:        int                     ip_mc_loop;             /* Loopback */
                    249:        char                    ip_mc_name[MAX_ADDR_LEN];/* Multicast device name */
                    250:        struct ip_mc_socklist   *ip_mc_list;            /* Group array */
                    251: #endif  
                    252: 
                    253: /*
                    254:  *     This part is used for the timeout functions (timer.c). 
                    255:  */
                    256:  
                    257:        int                     timeout;        /* What are we waiting for? */
                    258:        struct timer_list       timer;          /* This is the TIME_WAIT/receive timer
                    259:                                         * when we are doing IP
                    260:                                         */
                    261:        struct timeval          stamp;
                    262: 
                    263:  /*
                    264:   *    Identd 
                    265:   */
                    266:   
                    267:        struct socket           *socket;
                    268:   
                    269:   /*
                    270:    *   Callbacks 
                    271:    */
                    272:    
                    273:        void                    (*state_change)(struct sock *sk);
                    274:        void                    (*data_ready)(struct sock *sk,int bytes);
                    275:        void                    (*write_space)(struct sock *sk);
                    276:        void                    (*error_report)(struct sock *sk);
                    277:   
                    278: };
                    279: 
                    280: /*
                    281:  *     IP protocol blocks we attach to sockets.
                    282:  */
                    283:  
                    284: struct proto 
                    285: {
                    286:        void                    (*close)(struct sock *sk, unsigned long timeout);
                    287:        int                     (*build_header)(struct sk_buff *skb,
                    288:                                        __u32 saddr,
                    289:                                        __u32 daddr,
                    290:                                        struct device **dev, int type,
                    291:                                        struct options *opt, int len,
                    292:                                        int tos, int ttl, struct rtable ** rp);
                    293:        int                     (*connect)(struct sock *sk,
                    294:                                        struct sockaddr_in *usin, int addr_len);
                    295:        struct sock *           (*accept) (struct sock *sk, int flags);
                    296:        void                    (*queue_xmit)(struct sock *sk,
                    297:                                        struct device *dev, struct sk_buff *skb,
                    298:                                        int free);
                    299:        void                    (*retransmit)(struct sock *sk, int all);
                    300:        void                    (*write_wakeup)(struct sock *sk);
                    301:        void                    (*read_wakeup)(struct sock *sk);
                    302:        int                     (*rcv)(struct sk_buff *buff, struct device *dev,
                    303:                                        struct options *opt, __u32 daddr,
                    304:                                        unsigned short len, __u32 saddr,
                    305:                                        int redo, struct inet_protocol *protocol);
                    306:        int                     (*select)(struct sock *sk, int which,
                    307:                                        select_table *wait);
                    308:        int                     (*ioctl)(struct sock *sk, int cmd,
                    309:                                        unsigned long arg);
                    310:        int                     (*init)(struct sock *sk);
                    311:        void                    (*shutdown)(struct sock *sk, int how);
                    312:        int                     (*setsockopt)(struct sock *sk, int level, int optname,
                    313:                                        char *optval, int optlen);
                    314:        int                     (*getsockopt)(struct sock *sk, int level, int optname,
                    315:                                        char *optval, int *option);      
                    316:        int                     (*sendmsg)(struct sock *sk, struct msghdr *msg, int len,
                    317:                                        int noblock, int flags);
                    318:        int                     (*recvmsg)(struct sock *sk, struct msghdr *msg, int len,
                    319:                                        int noblock, int flags, int *addr_len);
                    320:        int                     (*bind)(struct sock *sk, struct sockaddr *uaddr, int addr_len);
                    321:        unsigned short          max_header;
                    322:        unsigned long           retransmits;
                    323:        char                    name[32];
                    324:        int                     inuse, highestinuse;
                    325:        struct sock *           sock_array[SOCK_ARRAY_SIZE];
                    326: };
                    327: 
                    328: #define TIME_WRITE     1
                    329: #define TIME_CLOSE     2
                    330: #define TIME_KEEPOPEN  3
                    331: #define TIME_DESTROY   4
                    332: #define TIME_DONE      5       /* Used to absorb those last few packets */
                    333: #define TIME_PROBE0    6
                    334: /*
                    335:  *     About 10 seconds 
                    336:  */
                    337: #define SOCK_DESTROY_TIME (10*HZ)
                    338: 
                    339: 
                    340: /*
                    341:  *     Sockets 0-1023 can't be bound too unless you are superuser 
                    342:  */
                    343:  
                    344: #define PROT_SOCK      1024
                    345: 
                    346: 
                    347: #define SHUTDOWN_MASK  3
                    348: #define RCV_SHUTDOWN   1
                    349: #define SEND_SHUTDOWN  2
                    350: 
                    351: /*
                    352:  * Used by processes to "lock" a socket state, so that
                    353:  * interrupts and bottom half handlers won't change it
                    354:  * from under us. It essentially blocks any incoming
                    355:  * packets, so that we won't get any new data or any
                    356:  * packets that change the state of the socket.
                    357:  *
                    358:  * Note the 'barrier()' calls: gcc may not move a lock
                    359:  * "downwards" or a unlock "upwards" when optimizing.
                    360:  */
                    361: extern void __release_sock(struct sock *sk);
                    362: 
                    363: static inline void lock_sock(struct sock *sk)
                    364: {
                    365: #if 1
                    366: /* debugging code: the test isn't even 100% correct, but it can catch bugs */
                    367: /* Note that a double lock is ok in theory - it's just _usually_ a bug */
                    368:        if (sk->users) {
                    369:                __label__ here;
                    370:                printk("double lock on socket at %p\n", &&here);
                    371: here:
                    372:        }
                    373: #endif
                    374:        sk->users++;
                    375:        barrier();
                    376: }
                    377: 
                    378: static inline void release_sock(struct sock *sk)
                    379: {
                    380:        barrier();
                    381: #if 1
                    382: /* debugging code: remove me when ok */
                    383:        if (sk->users == 0) {
                    384:                __label__ here;
                    385:                sk->users = 1;
                    386:                printk("trying to unlock unlocked socket at %p\n", &&here);
                    387: here:
                    388:        }
                    389: #endif
                    390:        if (!--sk->users)
                    391:                __release_sock(sk);
                    392: }
                    393: 
                    394: 
                    395: extern void                    destroy_sock(struct sock *sk);
                    396: extern unsigned short          get_new_socknum(struct proto *,
                    397:                                                unsigned short);
                    398: extern void                    put_sock(unsigned short, struct sock *); 
                    399: extern struct sock             *get_sock(struct proto *, unsigned short,
                    400:                                          unsigned long, unsigned short,
                    401:                                          unsigned long);
                    402: extern struct sock             *get_sock_mcast(struct sock *, unsigned short,
                    403:                                          unsigned long, unsigned short,
                    404:                                          unsigned long);
                    405: extern struct sock             *get_sock_raw(struct sock *, unsigned short,
                    406:                                          unsigned long, unsigned long);
                    407: 
                    408: extern struct sk_buff          *sock_wmalloc(struct sock *sk,
                    409:                                              unsigned long size, int force,
                    410:                                              int priority);
                    411: extern struct sk_buff          *sock_rmalloc(struct sock *sk,
                    412:                                              unsigned long size, int force,
                    413:                                              int priority);
                    414: extern void                    sock_wfree(struct sock *sk,
                    415:                                           struct sk_buff *skb);
                    416: extern void                    sock_rfree(struct sock *sk,
                    417:                                           struct sk_buff *skb);
                    418: extern unsigned long           sock_rspace(struct sock *sk);
                    419: extern unsigned long           sock_wspace(struct sock *sk);
                    420: 
                    421: extern int                     sock_setsockopt(struct sock *sk, int level,
                    422:                                                int op, char *optval,
                    423:                                                int optlen);
                    424: 
                    425: extern int                     sock_getsockopt(struct sock *sk, int level,
                    426:                                                int op, char *optval, 
                    427:                                                int *optlen);
                    428: extern struct sk_buff          *sock_alloc_send_skb(struct sock *skb,
                    429:                                                     unsigned long size,
                    430:                                                     unsigned long fallback,
                    431:                                                     int noblock,
                    432:                                                     int *errcode);
                    433: 
                    434: /*
                    435:  *     Queue a received datagram if it will fit. Stream and sequenced
                    436:  *     protocols can't normally use this as they need to fit buffers in
                    437:  *     and play with them.
                    438:  *
                    439:  *     Inlined as its very short and called for pretty much every
                    440:  *     packet ever received.
                    441:  */
                    442: 
                    443: extern __inline__ int sock_queue_rcv_skb(struct sock *sk, struct sk_buff *skb)
                    444: {
                    445:        unsigned long flags;
                    446:        if(sk->rmem_alloc + skb->truesize >= sk->rcvbuf)
                    447:                return -ENOMEM;
                    448:        save_flags(flags);
                    449:        cli();
                    450:        sk->rmem_alloc+=skb->truesize;
                    451:        skb->sk=sk;
                    452:        restore_flags(flags);
                    453:        skb_queue_tail(&sk->receive_queue,skb);
                    454:        if(!sk->dead)
                    455:                sk->data_ready(sk,skb->len);
                    456:        return 0;
                    457: }
                    458: 
                    459: /*
                    460:  *     Recover an error report and clear atomically
                    461:  */
                    462:  
                    463: extern __inline__ int sock_error(struct sock *sk)
                    464: {
                    465:        int err=xchg(&sk->err,0);
                    466:        return -err;
                    467: }
                    468: 
                    469: /* 
                    470:  *     Declarations from timer.c 
                    471:  */
                    472:  
                    473: extern struct sock *timer_base;
                    474: 
                    475: extern void delete_timer (struct sock *);
                    476: extern void reset_timer (struct sock *, int, unsigned long);
                    477: extern void net_timer (unsigned long);
                    478: 
                    479: 
                    480: /* 
                    481:  *     Enable debug/info messages 
                    482:  */
                    483: 
                    484: #define NETDEBUG(x)            x
                    485: 
                    486: #endif /* _SOCK_H */

unix.superglobalmegacorp.com

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