Annotation of Gnu-Mach/linux/src/include/net/sock.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 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:  *             David S. Miller :       New socket lookup architecture for ISS.
        !            26:  *              Elliot Poger    :       New field for SO_BINDTODEVICE option.
        !            27:  *
        !            28:  *             This program is free software; you can redistribute it and/or
        !            29:  *             modify it under the terms of the GNU General Public License
        !            30:  *             as published by the Free Software Foundation; either version
        !            31:  *             2 of the License, or (at your option) any later version.
        !            32:  */
        !            33: #ifndef _SOCK_H
        !            34: #define _SOCK_H
        !            35: 
        !            36: #include <linux/timer.h>
        !            37: #include <linux/ip.h>          /* struct options */
        !            38: #include <linux/in.h>          /* struct sockaddr_in */
        !            39: #include <linux/tcp.h>         /* struct tcphdr */
        !            40: #include <linux/config.h>
        !            41: 
        !            42: #include <linux/netdevice.h>
        !            43: #include <linux/skbuff.h>      /* struct sk_buff */
        !            44: #include <net/protocol.h>              /* struct inet_protocol */
        !            45: #if defined(CONFIG_AX25) || defined(CONFIG_AX25_MODULE)
        !            46: #include <net/ax25.h>
        !            47: #if defined(CONFIG_NETROM) || defined(CONFIG_NETROM_MODULE)
        !            48: #include <net/netrom.h>
        !            49: #endif
        !            50: #if defined(CONFIG_ROSE) || defined(CONFIG_ROSE_MODULE)
        !            51: #include <net/rose.h>
        !            52: #endif
        !            53: #endif
        !            54: 
        !            55: #if defined(CONFIG_IPX) || defined(CONFIG_IPX_MODULE)
        !            56: #include <net/ipx.h>
        !            57: #endif
        !            58: 
        !            59: #if defined(CONFIG_ATALK) || defined(CONFIG_ATALK_MODULE)
        !            60: #include <linux/atalk.h>
        !            61: #endif
        !            62: 
        !            63: #include <linux/igmp.h>
        !            64: 
        !            65: #include <asm/atomic.h>
        !            66: 
        !            67: /*
        !            68:  *     The AF_UNIX specific socket options
        !            69:  */
        !            70:  
        !            71: struct unix_opt
        !            72: {
        !            73:        int                     family;
        !            74:        char *                  name;
        !            75:        int                     locks;
        !            76:        struct inode *          inode;
        !            77:        struct semaphore        readsem;
        !            78:        struct sock *           other;
        !            79:        int                     marksweep;
        !            80: #define MARKED                 1
        !            81:        int                     inflight;
        !            82: };
        !            83: 
        !            84: /*
        !            85:  *     IP packet socket options
        !            86:  */
        !            87: 
        !            88: struct inet_packet_opt
        !            89: {
        !            90:        struct notifier_block   notifier;               /* Used when bound */
        !            91:        struct device           *bound_dev;
        !            92:        unsigned long           dev_stamp;
        !            93:        struct packet_type      *prot_hook;
        !            94:        char                    device_name[15];
        !            95: };
        !            96: 
        !            97: /*
        !            98:  *     Once the IPX ncpd patches are in these are going into protinfo
        !            99:  */
        !           100: 
        !           101: #if defined(CONFIG_IPX) || defined(CONFIG_IPX_MODULE)
        !           102: struct ipx_opt
        !           103: {
        !           104:        ipx_address             dest_addr;
        !           105:        ipx_interface           *intrfc;
        !           106:        unsigned short          port;
        !           107: #ifdef CONFIG_IPX_INTERN
        !           108:        unsigned char           node[IPX_NODE_LEN];
        !           109: #endif
        !           110:        unsigned short          type;
        !           111: /* 
        !           112:  * To handle asynchronous messages from the NetWare server, we have to
        !           113:  * know the connection this socket belongs to. 
        !           114:  */
        !           115:        struct ncp_server       *ncp_server;
        !           116: /* 
        !           117:  * To handle special ncp connection-handling sockets for mars_nwe,
        !           118:  * the connection number must be stored in the socket.
        !           119:  */
        !           120:        unsigned short          ipx_ncp_conn;
        !           121: };
        !           122: #endif
        !           123: 
        !           124: #ifdef CONFIG_NUTCP
        !           125: struct tcp_opt
        !           126: {
        !           127: /*
        !           128:  *     RFC793 variables by their proper names. This means you can
        !           129:  *     read the code and the spec side by side (and laugh ...)
        !           130:  *     See RFC793 and RFC1122. The RFC writes these in capitals.
        !           131:  */
        !           132:        __u32   rcv_nxt;        /* What we want to receive next         */
        !           133:        __u32   rcv_up;         /* The urgent point (may not be valid)  */
        !           134:        __u32   rcv_wnd;        /* Current receiver window              */
        !           135:        __u32   snd_nxt;        /* Next sequence we send                */
        !           136:        __u32   snd_una;        /* First byte we want an ack for        */
        !           137:        __u32   snd_up;         /* Outgoing urgent pointer              */
        !           138:        __u32   snd_wl1;        /* Sequence for window update           */
        !           139:        __u32   snd_wl2;        /* Ack sequence for update              */
        !           140: /*
        !           141:  *     Slow start and congestion control (see also Nagle, and Karn & Partridge)
        !           142:  */
        !           143:        __u32   snd_cwnd;       /* Sending congestion window            */
        !           144:        __u32   snd_ssthresh;   /* Slow start size threshold            */
        !           145: /*
        !           146:  *     Timers used by the TCP protocol layer
        !           147:  */
        !           148:        struct timer_list       delack_timer;           /* Ack delay    */
        !           149:        struct timer_list       idle_timer;             /* Idle watch   */
        !           150:        struct timer_list       completion_timer;       /* Up/Down timer */
        !           151:        struct timer_list       probe_timer;            /* Probes       */
        !           152:        struct timer_list       retransmit_timer;       /* Resend (no ack) */
        !           153: };
        !           154: #endif
        !           155:        
        !           156: /*
        !           157:  * This structure really needs to be cleaned up.
        !           158:  * Most of it is for TCP, and not used by any of
        !           159:  * the other protocols.
        !           160:  */
        !           161: struct sock 
        !           162: {
        !           163:        /* This must be first. */
        !           164:        struct sock             *sklist_next;
        !           165:        struct sock             *sklist_prev;
        !           166: 
        !           167:        struct options          *opt;
        !           168:        atomic_t                wmem_alloc;
        !           169:        atomic_t                rmem_alloc;
        !           170:        unsigned long           allocation;             /* Allocation mode */
        !           171:        __u32                   write_seq;
        !           172:        __u32                   sent_seq;
        !           173:        __u32                   acked_seq;
        !           174:        __u32                   copied_seq;
        !           175:        __u32                   rcv_ack_seq;
        !           176:        unsigned short          rcv_ack_cnt;            /* count of same ack */
        !           177:        __u32                   window_seq;
        !           178:        __u32                   fin_seq;
        !           179:        __u32                   urg_seq;
        !           180:        __u32                   urg_data;
        !           181:        __u32                   syn_seq;
        !           182:        int                     users;                  /* user count */
        !           183:   /*
        !           184:    *   Not all are volatile, but some are, so we
        !           185:    *   might as well say they all are.
        !           186:    */
        !           187:        volatile char           dead,
        !           188:                                urginline,
        !           189:                                intr,
        !           190:                                blog,
        !           191:                                done,
        !           192:                                reuse,
        !           193:                                keepopen,
        !           194:                                linger,
        !           195:                                delay_acks,
        !           196:                                destroy,
        !           197:                                ack_timed,
        !           198:                                no_check,
        !           199:                                zapped, /* In ax25 & ipx means not linked */
        !           200:                                broadcast,
        !           201:                                nonagle,
        !           202:                                bsdism;
        !           203:        struct device           * bound_device;
        !           204:        unsigned long           lingertime;
        !           205:        int                     proc;
        !           206: 
        !           207:        struct sock             *next;
        !           208:        struct sock             **pprev;
        !           209:        struct sock             *bind_next;
        !           210:        struct sock             **bind_pprev;
        !           211:        struct sock             *pair;
        !           212:        int                     hashent;
        !           213:        struct sock             *prev;
        !           214:        struct sk_buff          * volatile send_head;
        !           215:        struct sk_buff          * volatile send_next;
        !           216:        struct sk_buff          * volatile send_tail;
        !           217:        struct sk_buff_head     back_log;
        !           218:        struct sk_buff          *partial;
        !           219:        struct timer_list       partial_timer;
        !           220:        long                    retransmits;
        !           221:        struct sk_buff_head     write_queue,
        !           222:                                receive_queue;
        !           223:        struct proto            *prot;
        !           224:        struct wait_queue       **sleep;
        !           225:        __u32                   daddr;
        !           226:        __u32                   saddr;          /* Sending source */
        !           227:        __u32                   rcv_saddr;      /* Bound address */
        !           228:        unsigned short          max_unacked;
        !           229:        unsigned short          window;
        !           230:        __u32                   lastwin_seq;    /* sequence number when we last updated the window we offer */
        !           231:        __u32                   high_seq;       /* sequence number when we did current fast retransmit */
        !           232:        volatile unsigned long  ato;            /* ack timeout */
        !           233:        volatile unsigned long  lrcvtime;       /* jiffies at last data rcv */
        !           234:        volatile unsigned long  idletime;       /* jiffies at last rcv */
        !           235:        unsigned int            bytes_rcv;
        !           236: /*
        !           237:  *     mss is min(mtu, max_window) 
        !           238:  */
        !           239:        unsigned short          mtu;       /* mss negotiated in the syn's */
        !           240:        volatile unsigned short mss;       /* current eff. mss - can change */
        !           241:        volatile unsigned short user_mss;  /* mss requested by user in ioctl */
        !           242:        volatile unsigned short max_window;
        !           243:        unsigned long           window_clamp;
        !           244:        unsigned int            ssthresh;
        !           245:        unsigned short          num;
        !           246:        volatile unsigned short cong_window;
        !           247:        volatile unsigned short cong_count;
        !           248:        volatile unsigned short packets_out;
        !           249:        volatile unsigned short shutdown;
        !           250:        volatile unsigned long  rtt;
        !           251:        volatile unsigned long  mdev;
        !           252:        volatile unsigned long  rto;
        !           253: 
        !           254: /*
        !           255:  *     currently backoff isn't used, but I'm maintaining it in case
        !           256:  *     we want to go back to a backoff formula that needs it
        !           257:  */
        !           258:  
        !           259:        volatile unsigned short backoff;
        !           260:        int                     err, err_soft;  /* Soft holds errors that don't
        !           261:                                                   cause failure but are the cause
        !           262:                                                   of a persistent failure not just
        !           263:                                                   'timed out' */
        !           264:        unsigned char           protocol;
        !           265:        volatile unsigned char  state;
        !           266:        unsigned short          ack_backlog;
        !           267:        unsigned char           priority;
        !           268:        unsigned char           debug;
        !           269:        int                     rcvbuf;
        !           270:        int                     sndbuf;
        !           271:        unsigned short          type;
        !           272:        unsigned char           localroute;     /* Route locally only */
        !           273:   
        !           274: /*
        !           275:  *     This is where all the private (optional) areas that don't
        !           276:  *     overlap will eventually live. 
        !           277:  */
        !           278: 
        !           279:        union
        !           280:        {
        !           281:                struct unix_opt af_unix;
        !           282: #if defined(CONFIG_AX25) || defined(CONFIG_AX25_MODULE)
        !           283:                ax25_cb                 *ax25;
        !           284: #if defined(CONFIG_NETROM) || defined(CONFIG_NETROM_MODULE)
        !           285:                nr_cb                   *nr;
        !           286: #endif
        !           287: #if defined(CONFIG_ROSE) || defined(CONFIG_ROSE_MODULE)
        !           288:                rose_cb                 *rose;
        !           289: #endif
        !           290: #endif
        !           291: #if defined(CONFIG_ATALK) || defined(CONFIG_ATALK_MODULE)
        !           292:                struct atalk_sock       af_at;
        !           293: #endif
        !           294: #if defined(CONFIG_IPX) || defined(CONFIG_IPX_MODULE)
        !           295:                struct ipx_opt          af_ipx;
        !           296: #endif
        !           297: #ifdef CONFIG_INET
        !           298:                struct inet_packet_opt  af_packet;
        !           299: #ifdef CONFIG_NUTCP            
        !           300:                struct tcp_opt          af_tcp;
        !           301: #endif         
        !           302: #endif
        !           303:        } protinfo;             
        !           304: 
        !           305: /* 
        !           306:  *     IP 'private area' or will be eventually 
        !           307:  */
        !           308:        int                     ip_ttl;                 /* TTL setting */
        !           309:        int                     ip_tos;                 /* TOS */
        !           310:        struct tcphdr           dummy_th;
        !           311:        struct timer_list       keepalive_timer;        /* TCP keepalive hack */
        !           312:        struct timer_list       retransmit_timer;       /* TCP retransmit timer */
        !           313:        struct timer_list       delack_timer;           /* TCP delayed ack timer */
        !           314:        int                     ip_xmit_timeout;        /* Why the timeout is running */
        !           315:        struct rtable           *ip_route_cache;        /* Cached output route */
        !           316:        unsigned char           ip_hdrincl;             /* Include headers ? */
        !           317: #ifdef CONFIG_IP_MULTICAST  
        !           318:        int                     ip_mc_ttl;              /* Multicasting TTL */
        !           319:        int                     ip_mc_loop;             /* Loopback */
        !           320:        char                    ip_mc_name[MAX_ADDR_LEN];/* Multicast device name */
        !           321:        struct ip_mc_socklist   *ip_mc_list;            /* Group array */
        !           322: #endif  
        !           323: 
        !           324: /*
        !           325:  *     This part is used for the timeout functions (timer.c). 
        !           326:  */
        !           327:  
        !           328:        int                     timeout;        /* What are we waiting for? */
        !           329:        struct timer_list       timer;          /* This is the TIME_WAIT/receive timer
        !           330:                                         * when we are doing IP
        !           331:                                         */
        !           332:        struct timeval          stamp;
        !           333: 
        !           334:  /*
        !           335:   *    Identd 
        !           336:   */
        !           337:   
        !           338:        struct socket           *socket;
        !           339:   
        !           340:   /*
        !           341:    *   Callbacks 
        !           342:    */
        !           343:    
        !           344:        void                    (*state_change)(struct sock *sk);
        !           345:        void                    (*data_ready)(struct sock *sk,int bytes);
        !           346:        void                    (*write_space)(struct sock *sk);
        !           347:        void                    (*error_report)(struct sock *sk);
        !           348: 
        !           349:   /*
        !           350:    *   Moved solely for 2.0 to keep binary module compatibility stuff straight.
        !           351:    */
        !           352:    
        !           353:        unsigned short          max_ack_backlog;
        !           354:        struct sock             *listening;
        !           355: };
        !           356: 
        !           357: /*
        !           358:  *     IP protocol blocks we attach to sockets.
        !           359:  */
        !           360:  
        !           361: struct proto 
        !           362: {
        !           363:        /* These must be first. */
        !           364:        struct sock             *sklist_next;
        !           365:        struct sock             *sklist_prev;
        !           366: 
        !           367:        void                    (*close)(struct sock *sk, unsigned long timeout);
        !           368:        int                     (*build_header)(struct sk_buff *skb,
        !           369:                                        __u32 saddr,
        !           370:                                        __u32 daddr,
        !           371:                                        struct device **dev, int type,
        !           372:                                        struct options *opt, int len,
        !           373:                                        int tos, int ttl, struct rtable ** rp);
        !           374:        int                     (*connect)(struct sock *sk,
        !           375:                                        struct sockaddr_in *usin, int addr_len);
        !           376:        struct sock *           (*accept) (struct sock *sk, int flags);
        !           377:        void                    (*queue_xmit)(struct sock *sk,
        !           378:                                        struct device *dev, struct sk_buff *skb,
        !           379:                                        int free);
        !           380:        void                    (*retransmit)(struct sock *sk, int all);
        !           381:        void                    (*write_wakeup)(struct sock *sk);
        !           382:        void                    (*read_wakeup)(struct sock *sk);
        !           383:        int                     (*rcv)(struct sk_buff *buff, struct device *dev,
        !           384:                                        struct options *opt, __u32 daddr,
        !           385:                                        unsigned short len, __u32 saddr,
        !           386:                                        int redo, struct inet_protocol *protocol);
        !           387:        int                     (*select)(struct sock *sk, int which,
        !           388:                                        select_table *wait);
        !           389:        int                     (*ioctl)(struct sock *sk, int cmd,
        !           390:                                        unsigned long arg);
        !           391:        int                     (*init)(struct sock *sk);
        !           392:        void                    (*shutdown)(struct sock *sk, int how);
        !           393:        int                     (*setsockopt)(struct sock *sk, int level, int optname,
        !           394:                                        char *optval, int optlen);
        !           395:        int                     (*getsockopt)(struct sock *sk, int level, int optname,
        !           396:                                        char *optval, int *option);      
        !           397:        int                     (*sendmsg)(struct sock *sk, struct msghdr *msg, int len,
        !           398:                                        int noblock, int flags);
        !           399:        int                     (*recvmsg)(struct sock *sk, struct msghdr *msg, int len,
        !           400:                                        int noblock, int flags, int *addr_len);
        !           401:        int                     (*bind)(struct sock *sk, struct sockaddr *uaddr, int addr_len);
        !           402: 
        !           403:        /* Keeping track of sk's, looking them up, and port selection methods. */
        !           404:        void                    (*hash)(struct sock *sk);
        !           405:        void                    (*unhash)(struct sock *sk);
        !           406:        void                    (*rehash)(struct sock *sk);
        !           407:        unsigned short          (*good_socknum)(void);
        !           408:        int                     (*verify_bind)(struct sock *sk, unsigned short snum);
        !           409: 
        !           410:        unsigned short          max_header;
        !           411:        unsigned long           retransmits;
        !           412:        char                    name[32];
        !           413:        int                     inuse, highestinuse;
        !           414: };
        !           415: 
        !           416: #define TIME_WRITE     1
        !           417: #define TIME_CLOSE     2
        !           418: #define TIME_KEEPOPEN  3
        !           419: #define TIME_DESTROY   4
        !           420: #define TIME_DONE      5       /* Used to absorb those last few packets */
        !           421: #define TIME_PROBE0    6
        !           422: 
        !           423: /*
        !           424:  *     About 10 seconds 
        !           425:  */
        !           426: 
        !           427: #define SOCK_DESTROY_TIME (10*HZ)
        !           428: 
        !           429: /*
        !           430:  *     Sockets 0-1023 can't be bound to unless you are superuser 
        !           431:  */
        !           432:  
        !           433: #define PROT_SOCK      1024
        !           434: 
        !           435: #define SHUTDOWN_MASK  3
        !           436: #define RCV_SHUTDOWN   1
        !           437: #define SEND_SHUTDOWN  2
        !           438: 
        !           439: /* Per-protocol hash table implementations use this to make sure
        !           440:  * nothing changes.
        !           441:  */
        !           442: #define SOCKHASH_LOCK()                start_bh_atomic()
        !           443: #define SOCKHASH_UNLOCK()      end_bh_atomic()
        !           444: 
        !           445: /* Some things in the kernel just want to get at a protocols
        !           446:  * entire socket list commensurate, thus...
        !           447:  */
        !           448: static __inline__ void add_to_prot_sklist(struct sock *sk)
        !           449: {
        !           450:        SOCKHASH_LOCK();
        !           451:        if(!sk->sklist_next) {
        !           452:                struct proto *p = sk->prot;
        !           453: 
        !           454:                sk->sklist_prev = (struct sock *) p;
        !           455:                sk->sklist_next = p->sklist_next;
        !           456:                p->sklist_next->sklist_prev = sk;
        !           457:                p->sklist_next = sk;
        !           458: 
        !           459:                /* Charge the protocol. */
        !           460:                sk->prot->inuse += 1;
        !           461:                if(sk->prot->highestinuse < sk->prot->inuse)
        !           462:                        sk->prot->highestinuse = sk->prot->inuse;
        !           463:        }
        !           464:        SOCKHASH_UNLOCK();
        !           465: }
        !           466: 
        !           467: static __inline__ void del_from_prot_sklist(struct sock *sk)
        !           468: {
        !           469:        SOCKHASH_LOCK();
        !           470:        if(sk->sklist_next) {
        !           471:                sk->sklist_next->sklist_prev = sk->sklist_prev;
        !           472:                sk->sklist_prev->sklist_next = sk->sklist_next;
        !           473:                sk->sklist_next = NULL;
        !           474:                sk->prot->inuse--;
        !           475:        }
        !           476:        SOCKHASH_UNLOCK();
        !           477: }
        !           478: 
        !           479: /*
        !           480:  * Used by processes to "lock" a socket state, so that
        !           481:  * interrupts and bottom half handlers won't change it
        !           482:  * from under us. It essentially blocks any incoming
        !           483:  * packets, so that we won't get any new data or any
        !           484:  * packets that change the state of the socket.
        !           485:  *
        !           486:  * Note the 'barrier()' calls: gcc may not move a lock
        !           487:  * "downwards" or a unlock "upwards" when optimizing.
        !           488:  */
        !           489: extern void __release_sock(struct sock *sk);
        !           490: 
        !           491: static inline void lock_sock(struct sock *sk)
        !           492: {
        !           493: #if 0
        !           494: /* debugging code: the test isn't even 100% correct, but it can catch bugs */
        !           495: /* Note that a double lock is ok in theory - it's just _usually_ a bug */
        !           496:        if (sk->users) {
        !           497:                __label__ here;
        !           498:                printk("double lock on socket at %p\n", &&here);
        !           499: here:
        !           500:        }
        !           501: #endif
        !           502:        sk->users++;
        !           503:        barrier();
        !           504: }
        !           505: 
        !           506: static inline void release_sock(struct sock *sk)
        !           507: {
        !           508:        barrier();
        !           509: #if 0
        !           510: /* debugging code: remove me when ok */
        !           511:        if (sk->users == 0) {
        !           512:                __label__ here;
        !           513:                sk->users = 1;
        !           514:                printk("trying to unlock unlocked socket at %p\n", &&here);
        !           515: here:
        !           516:        }
        !           517: #endif
        !           518:        if ((sk->users = sk->users-1) == 0)
        !           519:                __release_sock(sk);
        !           520: }
        !           521: 
        !           522: 
        !           523: extern struct sock *           sk_alloc(int priority);
        !           524: extern void                    sk_free(struct sock *sk);
        !           525: extern void                    destroy_sock(struct sock *sk);
        !           526: 
        !           527: extern struct sk_buff          *sock_wmalloc(struct sock *sk,
        !           528:                                              unsigned long size, int force,
        !           529:                                              int priority);
        !           530: extern struct sk_buff          *sock_rmalloc(struct sock *sk,
        !           531:                                              unsigned long size, int force,
        !           532:                                              int priority);
        !           533: extern void                    sock_wfree(struct sock *sk,
        !           534:                                           struct sk_buff *skb);
        !           535: extern void                    sock_rfree(struct sock *sk,
        !           536:                                           struct sk_buff *skb);
        !           537: extern unsigned long           sock_rspace(struct sock *sk);
        !           538: extern unsigned long           sock_wspace(struct sock *sk);
        !           539: 
        !           540: extern int                     sock_setsockopt(struct sock *sk, int level,
        !           541:                                                int op, char *optval,
        !           542:                                                int optlen);
        !           543: 
        !           544: extern int                     sock_getsockopt(struct sock *sk, int level,
        !           545:                                                int op, char *optval, 
        !           546:                                                int *optlen);
        !           547: extern struct sk_buff          *sock_alloc_send_skb(struct sock *skb,
        !           548:                                                     unsigned long size,
        !           549:                                                     unsigned long fallback,
        !           550:                                                     int noblock,
        !           551:                                                     int *errcode);
        !           552: 
        !           553: /*
        !           554:  *     Queue a received datagram if it will fit. Stream and sequenced
        !           555:  *     protocols can't normally use this as they need to fit buffers in
        !           556:  *     and play with them.
        !           557:  *
        !           558:  *     Inlined as it's very short and called for pretty much every
        !           559:  *     packet ever received.
        !           560:  */
        !           561: 
        !           562: extern __inline__ int sock_queue_rcv_skb(struct sock *sk, struct sk_buff *skb)
        !           563: {
        !           564:        if (sk->rmem_alloc + skb->truesize >= sk->rcvbuf)
        !           565:                return -ENOMEM;
        !           566:        atomic_add(skb->truesize, &sk->rmem_alloc);
        !           567:        skb->sk=sk;
        !           568:        skb_queue_tail(&sk->receive_queue,skb);
        !           569:        if (!sk->dead)
        !           570:                sk->data_ready(sk,skb->len);
        !           571:        return 0;
        !           572: }
        !           573: 
        !           574: extern __inline__ int __sock_queue_rcv_skb(struct sock *sk, struct sk_buff *skb)
        !           575: {
        !           576:        if (sk->rmem_alloc + skb->truesize >= sk->rcvbuf)
        !           577:                return -ENOMEM;
        !           578:        atomic_add(skb->truesize, &sk->rmem_alloc);
        !           579:        skb->sk=sk;
        !           580:        __skb_queue_tail(&sk->receive_queue,skb);
        !           581:        if (!sk->dead)
        !           582:                sk->data_ready(sk,skb->len);
        !           583:        return 0;
        !           584: }
        !           585: 
        !           586: /*
        !           587:  *     Recover an error report and clear atomically
        !           588:  */
        !           589:  
        !           590: extern __inline__ int sock_error(struct sock *sk)
        !           591: {
        !           592:        int err=xchg(&sk->err,0);
        !           593:        return -err;
        !           594: }
        !           595: 
        !           596: /* 
        !           597:  *     Declarations from timer.c 
        !           598:  */
        !           599:  
        !           600: extern struct sock *timer_base;
        !           601: 
        !           602: extern void delete_timer (struct sock *);
        !           603: extern void reset_timer (struct sock *, int, unsigned long);
        !           604: extern void net_timer (unsigned long);
        !           605: 
        !           606: 
        !           607: /* 
        !           608:  *     Enable debug/info messages 
        !           609:  */
        !           610: 
        !           611: #define NETDEBUG(x)    do { } while (0)
        !           612: 
        !           613: #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.