Project

General

Profile

Statistics
| Revision:

root / lab4 / .minix-src / include / sys / socketvar.h @ 14

History | View | Annotate | Download (18.9 KB)

1 13 up20180614
/*        $NetBSD: socketvar.h,v 1.139 2015/05/09 15:22:47 rtr Exp $        */
2
3
/*-
4
 * Copyright (c) 2008, 2009 The NetBSD Foundation, Inc.
5
 * All rights reserved.
6
 *
7
 * This code is derived from software contributed to The NetBSD Foundation
8
 * by Andrew Doran.
9
 *
10
 * Redistribution and use in source and binary forms, with or without
11
 * modification, are permitted provided that the following conditions
12
 * are met:
13
 * 1. Redistributions of source code must retain the above copyright
14
 *    notice, this list of conditions and the following disclaimer.
15
 * 2. Redistributions in binary form must reproduce the above copyright
16
 *    notice, this list of conditions and the following disclaimer in the
17
 *    documentation and/or other materials provided with the distribution.
18
 *
19
 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
20
 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
21
 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22
 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
23
 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29
 * POSSIBILITY OF SUCH DAMAGE.
30
 */
31
32
/*-
33
 * Copyright (c) 1982, 1986, 1990, 1993
34
 *        The Regents of the University of California.  All rights reserved.
35
 *
36
 * Redistribution and use in source and binary forms, with or without
37
 * modification, are permitted provided that the following conditions
38
 * are met:
39
 * 1. Redistributions of source code must retain the above copyright
40
 *    notice, this list of conditions and the following disclaimer.
41
 * 2. Redistributions in binary form must reproduce the above copyright
42
 *    notice, this list of conditions and the following disclaimer in the
43
 *    documentation and/or other materials provided with the distribution.
44
 * 3. Neither the name of the University nor the names of its contributors
45
 *    may be used to endorse or promote products derived from this software
46
 *    without specific prior written permission.
47
 *
48
 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
49
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
50
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
51
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
52
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
53
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
54
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
55
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
56
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
57
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
58
 * SUCH DAMAGE.
59
 *
60
 *        @(#)socketvar.h        8.3 (Berkeley) 2/19/95
61
 */
62
63
#ifndef _SYS_SOCKETVAR_H_
64
#define        _SYS_SOCKETVAR_H_
65
66
#include <sys/select.h>
67
#include <sys/selinfo.h>                /* for struct selinfo */
68
#include <sys/queue.h>
69
#include <sys/mutex.h>
70
#include <sys/condvar.h>
71
72
#if !defined(_KERNEL)
73
struct uio;
74
struct lwp;
75
struct uidinfo;
76
#else
77
#include <sys/uidinfo.h>
78
#endif
79
80
TAILQ_HEAD(soqhead, socket);
81
82
/*
83
 * Variables for socket buffering.
84
 */
85
struct sockbuf {
86
        struct selinfo sb_sel;                /* process selecting read/write */
87
        struct mowner *sb_mowner;        /* who owns data for this sockbuf */
88
        struct socket *sb_so;                /* back pointer to socket */
89
        kcondvar_t sb_cv;                /* notifier */
90
        /* When re-zeroing this struct, we zero from sb_startzero to the end */
91
#define        sb_startzero        sb_cc
92
        u_long        sb_cc;                        /* actual chars in buffer */
93
        u_long        sb_hiwat;                /* max actual char count */
94
        u_long        sb_mbcnt;                /* chars of mbufs used */
95
        u_long        sb_mbmax;                /* max chars of mbufs to use */
96
        long        sb_lowat;                /* low water mark */
97
        struct mbuf *sb_mb;                /* the mbuf chain */
98
        struct mbuf *sb_mbtail;                /* the last mbuf in the chain */
99
        struct mbuf *sb_lastrecord;        /* first mbuf of last record in
100
                                           socket buffer */
101
        int        sb_flags;                /* flags, see below */
102
        int        sb_timeo;                /* timeout for read/write */
103
        u_long        sb_overflowed;                /* # of drops due to full buffer */
104
};
105
106
#ifndef SB_MAX
107
#define        SB_MAX                (256*1024)        /* default for max chars in sockbuf */
108
#endif
109
110
#define        SB_LOCK                0x01                /* lock on data queue */
111
#define        SB_NOTIFY        0x04                /* someone is waiting for data/space */
112
#define        SB_ASYNC        0x10                /* ASYNC I/O, need signals */
113
#define        SB_UPCALL        0x20                /* someone wants an upcall */
114
#define        SB_NOINTR        0x40                /* operations not interruptible */
115
#define        SB_KNOTE        0x100                /* kernel note attached */
116
#define        SB_AUTOSIZE        0x800                /* automatically size socket buffer */
117
118
/*
119
 * Kernel structure per socket.
120
 * Contains send and receive buffer queues,
121
 * handle on protocol and pointer to protocol
122
 * private data and error information.
123
 */
124
struct so_accf {
125
        struct accept_filter        *so_accept_filter;
126
        void        *so_accept_filter_arg;        /* saved filter args */
127
        char        *so_accept_filter_str;        /* saved user args */
128
};
129
130
struct sockaddr;
131
132
struct socket {
133
        kmutex_t * volatile so_lock;        /* pointer to lock on structure */
134
        kcondvar_t        so_cv;                /* notifier */
135
        short                so_type;        /* generic type, see socket.h */
136
        short                so_options;        /* from socket call, see socket.h */
137
        u_short                so_linger;        /* time to linger while closing */
138
        short                so_state;        /* internal state flags SS_*, below */
139
        int                so_unused;        /* used to be so_nbio */
140
        void                *so_pcb;        /* protocol control block */
141
        const struct protosw *so_proto;        /* protocol handle */
142
/*
143
 * Variables for connection queueing.
144
 * Socket where accepts occur is so_head in all subsidiary sockets.
145
 * If so_head is 0, socket is not related to an accept.
146
 * For head socket so_q0 queues partially completed connections,
147
 * while so_q is a queue of connections ready to be accepted.
148
 * If a connection is aborted and it has so_head set, then
149
 * it has to be pulled out of either so_q0 or so_q.
150
 * We allow connections to queue up based on current queue lengths
151
 * and limit on number of queued connections for this socket.
152
 */
153
        struct socket        *so_head;        /* back pointer to accept socket */
154
        struct soqhead        *so_onq;        /* queue (q or q0) that we're on */
155
        struct soqhead        so_q0;                /* queue of partial connections */
156
        struct soqhead        so_q;                /* queue of incoming connections */
157
        TAILQ_ENTRY(socket) so_qe;        /* our queue entry (q or q0) */
158
        short                so_q0len;        /* partials on so_q0 */
159
        short                so_qlen;        /* number of connections on so_q */
160
        short                so_qlimit;        /* max number queued connections */
161
        short                so_timeo;        /* connection timeout */
162
        u_short                so_error;        /* error affecting connection */
163
        u_short                so_aborting;        /* references from soabort() */
164
        pid_t                so_pgid;        /* pgid for signals */
165
        u_long                so_oobmark;        /* chars to oob mark */
166
        struct sockbuf        so_snd;                /* send buffer */
167
        struct sockbuf        so_rcv;                /* receive buffer */
168
169
        void                *so_internal;        /* Space for svr4 stream data */
170
        void                (*so_upcall) (struct socket *, void *, int, int);
171
        void *                so_upcallarg;        /* Arg for above */
172
        int                (*so_send) (struct socket *, struct sockaddr *,
173
                                        struct uio *, struct mbuf *,
174
                                        struct mbuf *, int, struct lwp *);
175
        int                (*so_receive) (struct socket *,
176
                                        struct mbuf **,
177
                                        struct uio *, struct mbuf **,
178
                                        struct mbuf **, int *);
179
        struct mowner        *so_mowner;        /* who owns mbufs for this socket */
180
        struct uidinfo        *so_uidinfo;        /* who opened the socket */
181
        gid_t                so_egid;        /* creator effective gid */
182
        pid_t                so_cpid;        /* creator pid */
183
        struct so_accf        *so_accf;
184
        kauth_cred_t        so_cred;        /* socket credentials */
185
};
186
187
#define        SB_EMPTY_FIXUP(sb)                                                \
188
do {                                                                        \
189
        KASSERT(solocked((sb)->sb_so));                                        \
190
        if ((sb)->sb_mb == NULL) {                                        \
191
                (sb)->sb_mbtail = NULL;                                        \
192
                (sb)->sb_lastrecord = NULL;                                \
193
        }                                                                \
194
} while (/*CONSTCOND*/0)
195
196
/*
197
 * Socket state bits.
198
 */
199
#define        SS_NOFDREF                0x001        /* no file table ref any more */
200
#define        SS_ISCONNECTED                0x002        /* socket connected to a peer */
201
#define        SS_ISCONNECTING                0x004        /* in process of connecting to peer */
202
#define        SS_ISDISCONNECTING        0x008        /* in process of disconnecting */
203
#define        SS_CANTSENDMORE                0x010        /* can't send more data to peer */
204
#define        SS_CANTRCVMORE                0x020        /* can't receive more data from peer */
205
#define        SS_RCVATMARK                0x040        /* at mark on input */
206
#define        SS_ISABORTING                0x080        /* aborting fd references - close() */
207
#define        SS_RESTARTSYS                0x100        /* restart blocked system calls */
208
#define        SS_ISDISCONNECTED        0x800        /* socket disconnected from peer */
209
210
#define        SS_ASYNC                0x100        /* async i/o notify */
211
#define        SS_MORETOCOME                0x400        /*
212
                                         * hint from sosend to lower layer;
213
                                         * more data coming
214
                                         */
215
#define        SS_ISAPIPE                 0x1000        /* socket is implementing a pipe */
216
#define        SS_NBIO                        0x2000        /* socket is in non blocking I/O */
217
218
#ifdef _KERNEL
219
220
struct accept_filter {
221
        char        accf_name[16];
222
        void        (*accf_callback)
223
                (struct socket *, void *, int, int);
224
        void *        (*accf_create)
225
                (struct socket *, char *);
226
        void        (*accf_destroy)
227
                (struct socket *);
228
        LIST_ENTRY(accept_filter) accf_next;
229
        u_int        accf_refcnt;
230
};
231
232
struct sockopt {
233
        int                sopt_level;                /* option level */
234
        int                sopt_name;                /* option name */
235
        size_t                sopt_size;                /* data length */
236
        void *                sopt_data;                /* data pointer */
237
        uint8_t                sopt_buf[sizeof(int)];        /* internal storage */
238
};
239
240
extern u_long                sb_max;
241
extern int                somaxkva;
242
extern int                sock_loan_thresh;
243
extern kmutex_t                *softnet_lock;
244
245
struct mbuf;
246
struct lwp;
247
struct msghdr;
248
struct stat;
249
struct knote;
250
251
struct        mbuf *getsombuf(struct socket *, int);
252
253
/*
254
 * File operations on sockets.
255
 */
256
int        soo_read(file_t *, off_t *, struct uio *, kauth_cred_t, int);
257
int        soo_write(file_t *, off_t *, struct uio *, kauth_cred_t, int);
258
int        soo_fcntl(file_t *, u_int cmd, void *);
259
int        soo_ioctl(file_t *, u_long cmd, void *);
260
int        soo_poll(file_t *, int);
261
int        soo_kqfilter(file_t *, struct knote *);
262
int         soo_close(file_t *);
263
int        soo_stat(file_t *, struct stat *);
264
void        soo_restart(file_t *);
265
void        sbappend(struct sockbuf *, struct mbuf *);
266
void        sbappendstream(struct sockbuf *, struct mbuf *);
267
int        sbappendaddr(struct sockbuf *, const struct sockaddr *, struct mbuf *,
268
            struct mbuf *);
269
int        sbappendaddrchain(struct sockbuf *, const struct sockaddr *,
270
             struct mbuf *, int);
271
int        sbappendcontrol(struct sockbuf *, struct mbuf *, struct mbuf *);
272
void        sbappendrecord(struct sockbuf *, struct mbuf *);
273
void        sbcheck(struct sockbuf *);
274
void        sbcompress(struct sockbuf *, struct mbuf *, struct mbuf *);
275
struct mbuf *
276
        sbcreatecontrol(void *, int, int, int);
277
struct mbuf *
278
        sbcreatecontrol1(void **, int, int, int, int);
279
void        sbdrop(struct sockbuf *, int);
280
void        sbdroprecord(struct sockbuf *);
281
void        sbflush(struct sockbuf *);
282
void        sbinsertoob(struct sockbuf *, struct mbuf *);
283
void        sbrelease(struct sockbuf *, struct socket *);
284
int        sbreserve(struct sockbuf *, u_long, struct socket *);
285
int        sbwait(struct sockbuf *);
286
int        sb_max_set(u_long);
287
void        soinit(void);
288
void        soinit1(void);
289
void        soinit2(void);
290
int        soabort(struct socket *);
291
int        soaccept(struct socket *, struct sockaddr *);
292
int        sofamily(const struct socket *);
293
int        sobind(struct socket *, struct sockaddr *, struct lwp *);
294
void        socantrcvmore(struct socket *);
295
void        socantsendmore(struct socket *);
296
int        soclose(struct socket *);
297
int        soconnect(struct socket *, struct sockaddr *, struct lwp *);
298
int        soconnect2(struct socket *, struct socket *);
299
int        socreate(int, struct socket **, int, int, struct lwp *,
300
                 struct socket *);
301
int        fsocreate(int, struct socket **, int, int, int *);
302
int        sodisconnect(struct socket *);
303
void        sofree(struct socket *);
304
int        sogetopt(struct socket *, struct sockopt *);
305
void        sohasoutofband(struct socket *);
306
void        soisconnected(struct socket *);
307
void        soisconnecting(struct socket *);
308
void        soisdisconnected(struct socket *);
309
void        soisdisconnecting(struct socket *);
310
int        solisten(struct socket *, int, struct lwp *);
311
struct socket *
312
        sonewconn(struct socket *, bool);
313
void        soqinsque(struct socket *, struct socket *, int);
314
bool        soqremque(struct socket *, int);
315
int        soreceive(struct socket *, struct mbuf **, struct uio *,
316
            struct mbuf **, struct mbuf **, int *);
317
int        soreserve(struct socket *, u_long, u_long);
318
void        sorflush(struct socket *);
319
int        sosend(struct socket *, struct sockaddr *, struct uio *,
320
            struct mbuf *, struct mbuf *, int, struct lwp *);
321
int        sosetopt(struct socket *, struct sockopt *);
322
int        so_setsockopt(struct lwp *, struct socket *, int, int, const void *, size_t);
323
int        soshutdown(struct socket *, int);
324
void        sorestart(struct socket *);
325
void        sowakeup(struct socket *, struct sockbuf *, int);
326
int        sockargs(struct mbuf **, const void *, size_t, int);
327
int        sopoll(struct socket *, int);
328
struct        socket *soget(bool);
329
void        soput(struct socket *);
330
bool        solocked(struct socket *);
331
bool        solocked2(struct socket *, struct socket *);
332
int        sblock(struct sockbuf *, int);
333
void        sbunlock(struct sockbuf *);
334
int        sowait(struct socket *, bool, int);
335
void        solockretry(struct socket *, kmutex_t *);
336
void        sosetlock(struct socket *);
337
void        solockreset(struct socket *, kmutex_t *);
338
339
void        sockopt_init(struct sockopt *, int, int, size_t);
340
void        sockopt_destroy(struct sockopt *);
341
int        sockopt_set(struct sockopt *, const void *, size_t);
342
int        sockopt_setint(struct sockopt *, int);
343
int        sockopt_get(const struct sockopt *, void *, size_t);
344
int        sockopt_getint(const struct sockopt *, int *);
345
int        sockopt_setmbuf(struct sockopt *, struct mbuf *);
346
struct mbuf *sockopt_getmbuf(const struct sockopt *);
347
348
int        copyout_sockname(struct sockaddr *, unsigned int *, int, struct mbuf *);
349
int        copyout_msg_control(struct lwp *, struct msghdr *, struct mbuf *);
350
void        free_control_mbuf(struct lwp *, struct mbuf *, struct mbuf *);
351
352
int        do_sys_getpeername(int, struct sockaddr *);
353
int        do_sys_getsockname(int, struct sockaddr *);
354
int        do_sys_sendmsg(struct lwp *, int, struct msghdr *, int, register_t *);
355
int        do_sys_recvmsg(struct lwp *, int, struct msghdr *, struct mbuf **,
356
            struct mbuf **, register_t *);
357
358
int        do_sys_bind(struct lwp *, int, struct sockaddr *);
359
int        do_sys_connect(struct lwp *, int, struct sockaddr *);
360
int        do_sys_accept(struct lwp *, int, struct sockaddr *, register_t *,
361
            const sigset_t *, int, int);
362
363
/*
364
 * Inline functions for sockets and socket buffering.
365
 */
366
367
#include <sys/protosw.h>
368
#include <sys/mbuf.h>
369
370
/*
371
 * Do we need to notify the other side when I/O is possible?
372
 */
373
static inline int
374
sb_notify(struct sockbuf *sb)
375
{
376
377
        KASSERT(solocked(sb->sb_so));
378
379
        return sb->sb_flags & (SB_NOTIFY | SB_ASYNC | SB_UPCALL | SB_KNOTE);
380
}
381
382
/*
383
 * How much space is there in a socket buffer (so->so_snd or so->so_rcv)?
384
 * This is problematical if the fields are unsigned, as the space might
385
 * still be negative (cc > hiwat or mbcnt > mbmax).  Should detect
386
 * overflow and return 0.
387
 */
388
static inline long
389
sbspace(struct sockbuf *sb)
390
{
391
392
        KASSERT(solocked(sb->sb_so));
393
394
        return lmin(sb->sb_hiwat - sb->sb_cc, sb->sb_mbmax - sb->sb_mbcnt);
395
}
396
397
/* do we have to send all at once on a socket? */
398
static inline int
399
sosendallatonce(struct socket *so)
400
{
401
402
        return so->so_proto->pr_flags & PR_ATOMIC;
403
}
404
405
/* can we read something from so? */
406
static inline int
407
soreadable(struct socket *so)
408
{
409
410
        KASSERT(solocked(so));
411
412
        return so->so_rcv.sb_cc >= so->so_rcv.sb_lowat ||
413
            (so->so_state & SS_CANTRCVMORE) != 0 ||
414
            so->so_qlen != 0 || so->so_error != 0;
415
}
416
417
/* can we write something to so? */
418
static inline int
419
sowritable(struct socket *so)
420
{
421
422
        KASSERT(solocked(so));
423
424
        return (sbspace(&so->so_snd) >= so->so_snd.sb_lowat &&
425
            ((so->so_state & SS_ISCONNECTED) != 0 ||
426
            (so->so_proto->pr_flags & PR_CONNREQUIRED) == 0)) ||
427
            (so->so_state & SS_CANTSENDMORE) != 0 ||
428
            so->so_error != 0;
429
}
430
431
/* adjust counters in sb reflecting allocation of m */
432
static inline void
433
sballoc(struct sockbuf *sb, struct mbuf *m)
434
{
435
436
        KASSERT(solocked(sb->sb_so));
437
438
        sb->sb_cc += m->m_len;
439
        sb->sb_mbcnt += MSIZE;
440
        if (m->m_flags & M_EXT)
441
                sb->sb_mbcnt += m->m_ext.ext_size;
442
}
443
444
/* adjust counters in sb reflecting freeing of m */
445
static inline void
446
sbfree(struct sockbuf *sb, struct mbuf *m)
447
{
448
449
        KASSERT(solocked(sb->sb_so));
450
451
        sb->sb_cc -= m->m_len;
452
        sb->sb_mbcnt -= MSIZE;
453
        if (m->m_flags & M_EXT)
454
                sb->sb_mbcnt -= m->m_ext.ext_size;
455
}
456
457
static inline void
458
sorwakeup(struct socket *so)
459
{
460
461
        KASSERT(solocked(so));
462
463
        if (sb_notify(&so->so_rcv))
464
                sowakeup(so, &so->so_rcv, POLL_IN);
465
}
466
467
static inline void
468
sowwakeup(struct socket *so)
469
{
470
471
        KASSERT(solocked(so));
472
473
        if (sb_notify(&so->so_snd))
474
                sowakeup(so, &so->so_snd, POLL_OUT);
475
}
476
477
static inline void
478
solock(struct socket *so)
479
{
480
        kmutex_t *lock;
481
482
        lock = so->so_lock;
483
        mutex_enter(lock);
484
        if (__predict_false(lock != so->so_lock))
485
                solockretry(so, lock);
486
}
487
488
static inline void
489
sounlock(struct socket *so)
490
{
491
492
        mutex_exit(so->so_lock);
493
}
494
495
#ifdef SOCKBUF_DEBUG
496
/*
497
 * SBLASTRECORDCHK: check sb->sb_lastrecord is maintained correctly.
498
 * SBLASTMBUFCHK: check sb->sb_mbtail is maintained correctly.
499
 *
500
 * => panic if the socket buffer is inconsistent.
501
 * => 'where' is used for a panic message.
502
 */
503
void        sblastrecordchk(struct sockbuf *, const char *);
504
#define        SBLASTRECORDCHK(sb, where)        sblastrecordchk((sb), (where))
505
506
void        sblastmbufchk(struct sockbuf *, const char *);
507
#define        SBLASTMBUFCHK(sb, where)        sblastmbufchk((sb), (where))
508
#define        SBCHECK(sb)                        sbcheck(sb)
509
#else
510
#define        SBLASTRECORDCHK(sb, where)        /* nothing */
511
#define        SBLASTMBUFCHK(sb, where)        /* nothing */
512
#define        SBCHECK(sb)                        /* nothing */
513
#endif /* SOCKBUF_DEBUG */
514
515
/* sosend loan */
516
vaddr_t        sokvaalloc(vaddr_t, vsize_t, struct socket *);
517
void        sokvafree(vaddr_t, vsize_t);
518
void        soloanfree(struct mbuf *, void *, size_t, void *);
519
520
/*
521
 * Values for socket-buffer-append priority argument to sbappendaddrchain().
522
 * The following flags are reserved for future implementation:
523
 *
524
 *  SB_PRIO_NONE:  honour normal socket-buffer limits.
525
 *
526
 *  SB_PRIO_ONESHOT_OVERFLOW:  if the socket has any space,
527
 *        deliver the entire chain. Intended for large requests
528
 *      that should be delivered in their entirety, or not at all.
529
 *
530
 * SB_PRIO_OVERDRAFT:  allow a small (2*MLEN) overflow, over and
531
 *        aboce normal socket limits. Intended messages indicating
532
 *      buffer overflow in earlier normal/lower-priority messages .
533
 *
534
 * SB_PRIO_BESTEFFORT: Ignore  limits entirely.  Intended only for
535
 *         kernel-generated messages to specially-marked scokets which
536
 *        require "reliable" delivery, nd where the source socket/protocol
537
 *        message generator enforce some hard limit (but possibly well
538
 *        above kern.sbmax). It is entirely up to the in-kernel source to
539
 *        avoid complete mbuf exhaustion or DoS scenarios.
540
 */
541
#define SB_PRIO_NONE                  0
542
#define SB_PRIO_ONESHOT_OVERFLOW 1
543
#define SB_PRIO_OVERDRAFT        2
544
#define SB_PRIO_BESTEFFORT        3
545
546
/*
547
 * Accept filter functions (duh).
548
 */
549
int        accept_filt_getopt(struct socket *, struct sockopt *);
550
int        accept_filt_setopt(struct socket *, const struct sockopt *);
551
int        accept_filt_clear(struct socket *);
552
int        accept_filt_add(struct accept_filter *);
553
int        accept_filt_del(struct accept_filter *);
554
struct        accept_filter *accept_filt_get(char *);
555
#ifdef ACCEPT_FILTER_MOD
556
#ifdef SYSCTL_DECL
557
SYSCTL_DECL(_net_inet_accf);
558
#endif
559
void        accept_filter_init(void);
560
#endif
561
562
#endif /* _KERNEL */
563
564
#endif /* !_SYS_SOCKETVAR_H_ */