Project

General

Profile

Statistics
| Revision:

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

History | View | Annotate | Download (22 KB)

1 13 up20180614
/*        $NetBSD: socket.h,v 1.117 2015/04/03 20:01:08 rtr Exp $        */
2
3
/*
4
 * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
5
 * All rights reserved.
6
 *
7
 * Redistribution and use in source and binary forms, with or without
8
 * modification, are permitted provided that the following conditions
9
 * are met:
10
 * 1. Redistributions of source code must retain the above copyright
11
 *    notice, this list of conditions and the following disclaimer.
12
 * 2. Redistributions in binary form must reproduce the above copyright
13
 *    notice, this list of conditions and the following disclaimer in the
14
 *    documentation and/or other materials provided with the distribution.
15
 * 3. Neither the name of the project nor the names of its contributors
16
 *    may be used to endorse or promote products derived from this software
17
 *    without specific prior written permission.
18
 *
19
 * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
20
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
23
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
24
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
25
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
26
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
27
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
28
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
29
 * SUCH DAMAGE.
30
 */
31
32
/*
33
 * Copyright (c) 1982, 1985, 1986, 1988, 1993, 1994
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
 *        @(#)socket.h        8.6 (Berkeley) 5/3/95
61
 */
62
63
#ifndef _SYS_SOCKET_H_
64
#define        _SYS_SOCKET_H_
65
66
#include <sys/featuretest.h>
67
68
/*
69
 * Definitions related to sockets: types, address families, options.
70
 */
71
72
/*
73
 * Data types.
74
 */
75
#include <sys/ansi.h>
76
77
#ifndef sa_family_t
78
typedef __sa_family_t        sa_family_t;
79
#define sa_family_t        __sa_family_t
80
#endif
81
82
#ifndef socklen_t
83
typedef __socklen_t        socklen_t;
84
#define socklen_t        __socklen_t
85
#endif
86
87
#include <machine/ansi.h>
88
89
#ifdef        _BSD_SIZE_T_
90
typedef        _BSD_SIZE_T_        size_t;
91
#undef        _BSD_SIZE_T_
92
#endif
93
94
#ifdef        _BSD_SSIZE_T_
95
typedef        _BSD_SSIZE_T_        ssize_t;
96
#undef        _BSD_SSIZE_T_
97
#endif
98
99
#include <sys/uio.h>
100
#include <sys/sigtypes.h>
101
102
/*
103
 * Socket types.
104
 */
105
#define        SOCK_STREAM        1                /* stream socket */
106
#define        SOCK_DGRAM        2                /* datagram socket */
107
#define        SOCK_RAW        3                /* raw-protocol interface */
108
#define        SOCK_RDM        4                /* reliably-delivered message */
109
#define        SOCK_SEQPACKET        5                /* sequenced packet stream */
110
#define        SOCK_CONN_DGRAM        6                /* connection-orientated datagram */
111
#define        SOCK_DCCP        SOCK_CONN_DGRAM
112
113
#define        SOCK_CLOEXEC        0x10000000        /* set close on exec on socket */
114
#define        SOCK_NONBLOCK        0x20000000        /* set non blocking i/o socket */
115
#define        SOCK_NOSIGPIPE        0x40000000        /* don't send sigpipe */
116
#define        SOCK_FLAGS_MASK        0xf0000000        /* flags mask */
117
118
/*
119
 * Option flags per-socket.
120
 */
121
#define        SO_DEBUG        0x0001                /* turn on debugging info recording */
122
#define        SO_ACCEPTCONN        0x0002                /* socket has had listen() */
123
#define        SO_REUSEADDR        0x0004                /* allow local address reuse */
124
#define        SO_KEEPALIVE        0x0008                /* keep connections alive */
125
#define        SO_DONTROUTE        0x0010                /* just use interface addresses */
126
#define        SO_BROADCAST        0x0020                /* permit sending of broadcast msgs */
127
#define        SO_USELOOPBACK        0x0040                /* bypass hardware when possible */
128
#define        SO_LINGER        0x0080                /* linger on close if data present */
129
#define        SO_OOBINLINE        0x0100                /* leave received OOB data in line */
130
#define        SO_REUSEPORT        0x0200                /* allow local address & port reuse */
131
/*         SO_OTIMESTAMP        0x0400                */
132
#define        SO_NOSIGPIPE        0x0800                /* no SIGPIPE from EPIPE */
133
#define        SO_ACCEPTFILTER        0x1000                /* there is an accept filter */
134
#define        SO_TIMESTAMP        0x2000                /* timestamp received dgram traffic */
135
136
/*
137
 * Additional options, not kept in so_options.
138
 */
139
#define SO_SNDBUF        0x1001                /* send buffer size */
140
#define SO_RCVBUF        0x1002                /* receive buffer size */
141
#define SO_SNDLOWAT        0x1003                /* send low-water mark */
142
#define SO_RCVLOWAT        0x1004                /* receive low-water mark */
143
/* SO_OSNDTIMEO                0x1005 */
144
/* SO_ORCVTIMEO                0x1006 */
145
#define        SO_ERROR        0x1007                /* get error status and clear */
146
#define        SO_TYPE                0x1008                /* get socket type */
147
#define        SO_OVERFLOWED        0x1009                /* datagrams: return packets dropped */
148
149
#define        SO_NOHEADER        0x100a                /* user supplies no header to kernel;
150
                                         * kernel removes header and supplies
151
                                         * payload
152
                                         */
153
#define SO_SNDTIMEO        0x100b                /* send timeout */
154
#define SO_RCVTIMEO        0x100c                /* receive timeout */
155
/*
156
 * Structure used for manipulating linger option.
157
 */
158
struct        linger {
159
        int        l_onoff;                /* option on/off */
160
        int        l_linger;                /* linger time in seconds */
161
};
162
163
struct        accept_filter_arg {
164
        char        af_name[16];
165
        char        af_arg[256-16];
166
};
167
168
/*
169
 * Level number for (get/set)sockopt() to apply to socket itself.
170
 */
171
#define        SOL_SOCKET        0xffff                /* options for socket level */
172
173
/*
174
 * Address families.
175
 */
176
#define        AF_UNSPEC        0                /* unspecified */
177
#define        AF_LOCAL        1                /* local to host */
178
#define        AF_UNIX                AF_LOCAL        /* backward compatibility */
179
#define        AF_INET                2                /* internetwork: UDP, TCP, etc. */
180
#define        AF_IMPLINK        3                /* arpanet imp addresses */
181
#define        AF_PUP                4                /* pup protocols: e.g. BSP */
182
#define        AF_CHAOS        5                /* mit CHAOS protocols */
183
#define        AF_NS                6                /* XEROX NS protocols */
184
#define        AF_ISO                7                /* ISO protocols */
185
#define        AF_OSI                AF_ISO
186
#define        AF_ECMA                8                /* european computer manufacturers */
187
#define        AF_DATAKIT        9                /* datakit protocols */
188
#define        AF_CCITT        10                /* CCITT protocols, X.25 etc */
189
#define        AF_SNA                11                /* IBM SNA */
190
#define AF_DECnet        12                /* DECnet */
191
#define AF_DLI                13                /* DEC Direct data link interface */
192
#define AF_LAT                14                /* LAT */
193
#define        AF_HYLINK        15                /* NSC Hyperchannel */
194
#define        AF_APPLETALK        16                /* Apple Talk */
195
#define        AF_OROUTE        17                /* Internal Routing Protocol */
196
#define        AF_LINK                18                /* Link layer interface */
197
#if defined(_NETBSD_SOURCE)
198
#define        pseudo_AF_XTP        19                /* eXpress Transfer Protocol (no AF) */
199
#endif
200
#define        AF_COIP                20                /* connection-oriented IP, aka ST II */
201
#define        AF_CNT                21                /* Computer Network Technology */
202
#if defined(_NETBSD_SOURCE)
203
#define pseudo_AF_RTIP        22                /* Help Identify RTIP packets */
204
#endif
205
#define        AF_IPX                23                /* Novell Internet Protocol */
206
#define        AF_INET6        24                /* IP version 6 */
207
#if defined(_NETBSD_SOURCE)
208
#define pseudo_AF_PIP        25                /* Help Identify PIP packets */
209
#endif
210
#define AF_ISDN                26                /* Integrated Services Digital Network*/
211
#define AF_E164                AF_ISDN                /* CCITT E.164 recommendation */
212
#define AF_NATM                27                /* native ATM access */
213
#define AF_ARP                28                /* (rev.) addr. res. prot. (RFC 826) */
214
#if defined(_NETBSD_SOURCE)
215
#define pseudo_AF_KEY        29                /* Internal key management protocol  */
216
#define        pseudo_AF_HDRCMPLT 30                /* Used by BPF to not rewrite hdrs
217
                                           in interface output routine */
218
#endif
219
#define AF_BLUETOOTH        31                /* Bluetooth: HCI, SCO, L2CAP, RFCOMM */
220
#define        AF_IEEE80211        32                /* IEEE80211 */
221
#define        AF_MPLS                33                /* MultiProtocol Label Switching */
222
#define        AF_ROUTE        34                /* Internal Routing Protocol */
223
#define        AF_MAX                35
224
225
/*
226
 * Structure used by kernel to store most
227
 * addresses.
228
 */
229
struct sockaddr {
230
        __uint8_t        sa_len;                /* total length */
231
        sa_family_t        sa_family;        /* address family */
232
        char                sa_data[14];        /* actually longer; address value */
233
};
234
235
#if defined(_KERNEL)
236
/*
237
 * Structure used by kernel to pass protocol
238
 * information in raw sockets.
239
 */
240
struct sockproto {
241
        u_short        sp_family;                /* address family */
242
        u_short        sp_protocol;                /* protocol */
243
};
244
245
/*
246
 * we make the entire struct at least UCHAR_MAX + 1 in size since existing
247
 * use of sockaddr_un permits a path up to 253 bytes + '\0'.
248
 * sizeof(sb_len) + sizeof(sb_family) + 253 + '\0'
249
 */
250
#define _SB_DATASIZE        254
251
struct sockaddr_big {
252
    union {
253
        struct {
254
            __uint8_t        sb_len;
255
            sa_family_t        sb_family;
256
            char        sb_data[_SB_DATASIZE];
257
        };
258
        uint64_t dummy; /* solicit natural alignment */
259
    };
260
};
261
262
#endif /* _KERNEL */
263
264
#if 1
265
/*
266
 * RFC 2553: protocol-independent placeholder for socket addresses
267
 */
268
#define _SS_MAXSIZE        128
269
#define _SS_ALIGNSIZE        (sizeof(__int64_t))
270
#define _SS_PAD1SIZE        (_SS_ALIGNSIZE - 2)
271
#define _SS_PAD2SIZE        (_SS_MAXSIZE - 2 - \
272
                                _SS_PAD1SIZE - _SS_ALIGNSIZE)
273
274
#if (_XOPEN_SOURCE - 0) >= 500 || defined(_NETBSD_SOURCE)
275
struct sockaddr_storage {
276
        __uint8_t        ss_len;                /* address length */
277
        sa_family_t        ss_family;        /* address family */
278
        char                __ss_pad1[_SS_PAD1SIZE];
279
        __int64_t     __ss_align;/* force desired structure storage alignment */
280
        char                __ss_pad2[_SS_PAD2SIZE];
281
};
282
#define        sstosa(__ss)        ((struct sockaddr *)(__ss))
283
#define        sstocsa(__ss)        ((const struct sockaddr *)(__ss))
284
#endif /* _XOPEN_SOURCE >= 500 || _NETBSD_SOURCE */
285
#endif /* 1 */
286
287
/*
288
 * Protocol families, same as address families for now.
289
 */
290
#define        PF_UNSPEC        AF_UNSPEC
291
#define        PF_LOCAL        AF_LOCAL
292
#define        PF_UNIX                PF_LOCAL        /* backward compatibility */
293
#define        PF_INET                AF_INET
294
#define        PF_IMPLINK        AF_IMPLINK
295
#define        PF_PUP                AF_PUP
296
#define        PF_CHAOS        AF_CHAOS
297
#define        PF_NS                AF_NS
298
#define        PF_ISO                AF_ISO
299
#define        PF_OSI                AF_ISO
300
#define        PF_ECMA                AF_ECMA
301
#define        PF_DATAKIT        AF_DATAKIT
302
#define        PF_CCITT        AF_CCITT
303
#define        PF_SNA                AF_SNA
304
#define PF_DECnet        AF_DECnet
305
#define PF_DLI                AF_DLI
306
#define PF_LAT                AF_LAT
307
#define        PF_HYLINK        AF_HYLINK
308
#define        PF_APPLETALK        AF_APPLETALK
309
#define        PF_OROUTE        AF_OROUTE
310
#define        PF_LINK                AF_LINK
311
#if defined(_NETBSD_SOURCE)
312
#define        PF_XTP                pseudo_AF_XTP        /* really just proto family, no AF */
313
#endif
314
#define        PF_COIP                AF_COIP
315
#define        PF_CNT                AF_CNT
316
#define        PF_INET6        AF_INET6
317
#define        PF_IPX                AF_IPX                /* same format as AF_NS */
318
#if defined(_NETBSD_SOURCE)
319
#define PF_RTIP                pseudo_AF_RTIP        /* same format as AF_INET */
320
#define PF_PIP                pseudo_AF_PIP
321
#endif
322
#define PF_ISDN                AF_ISDN                /* same as E164 */
323
#define PF_E164                AF_E164
324
#define PF_NATM                AF_NATM
325
#define PF_ARP                AF_ARP
326
#if defined(_NETBSD_SOURCE)
327
#define PF_KEY                 pseudo_AF_KEY        /* like PF_ROUTE, only for key mgmt */
328
#endif
329
#define PF_BLUETOOTH        AF_BLUETOOTH
330
#define        PF_MPLS                AF_MPLS
331
#define        PF_ROUTE        AF_ROUTE
332
333
#define        PF_MAX                AF_MAX
334
335
#if defined(_NETBSD_SOURCE)
336
337
#ifndef        gid_t
338
typedef        __gid_t                gid_t;                /* group id */
339
#define        gid_t                __gid_t
340
#endif
341
342
#ifndef        uid_t
343
typedef        __uid_t                uid_t;                /* user id */
344
#define        uid_t                __uid_t
345
#endif
346
347
/*
348
 * Socket credentials.
349
 */
350
struct sockcred {
351
        uid_t        sc_uid;                        /* real user id */
352
        uid_t        sc_euid;                /* effective user id */
353
        gid_t        sc_gid;                        /* real group id */
354
        gid_t        sc_egid;                /* effective group id */
355
        int        sc_ngroups;                /* number of supplemental groups */
356
        gid_t        sc_groups[1];                /* variable length */
357
};
358
359
/*
360
 * Compute size of a sockcred structure with groups.
361
 */
362
#define        SOCKCREDSIZE(ngrps) \
363
        (/*CONSTCOND*/sizeof(struct sockcred) + (sizeof(gid_t) * \
364
            ((ngrps) ? ((ngrps) - 1) : 0)))
365
#endif /* _NETBSD_SOURCE */
366
367
368
#if defined(_NETBSD_SOURCE)
369
/*
370
 * Definitions for network related sysctl, CTL_NET.
371
 *
372
 * Second level is protocol family.
373
 * Third level is protocol number.
374
 *
375
 * Further levels are defined by the individual families below.
376
 */
377
#define NET_MAXID        AF_MAX
378
379
#define CTL_NET_NAMES { \
380
        { 0, 0 }, \
381
        { "local", CTLTYPE_NODE }, \
382
        { "inet", CTLTYPE_NODE }, \
383
        { "implink", CTLTYPE_NODE }, \
384
        { "pup", CTLTYPE_NODE }, \
385
        { "chaos", CTLTYPE_NODE }, \
386
        { "xerox_ns", CTLTYPE_NODE }, \
387
        { "iso", CTLTYPE_NODE }, \
388
        { "emca", CTLTYPE_NODE }, \
389
        { "datakit", CTLTYPE_NODE }, \
390
        { "ccitt", CTLTYPE_NODE }, \
391
        { "ibm_sna", CTLTYPE_NODE }, \
392
        { "decnet", CTLTYPE_NODE }, \
393
        { "dec_dli", CTLTYPE_NODE }, \
394
        { "lat", CTLTYPE_NODE }, \
395
        { "hylink", CTLTYPE_NODE }, \
396
        { "appletalk", CTLTYPE_NODE }, \
397
        { "oroute", CTLTYPE_NODE }, \
398
        { "link_layer", CTLTYPE_NODE }, \
399
        { "xtp", CTLTYPE_NODE }, \
400
        { "coip", CTLTYPE_NODE }, \
401
        { "cnt", CTLTYPE_NODE }, \
402
        { "rtip", CTLTYPE_NODE }, \
403
        { "ipx", CTLTYPE_NODE }, \
404
        { "inet6", CTLTYPE_NODE }, \
405
        { "pip", CTLTYPE_NODE }, \
406
        { "isdn", CTLTYPE_NODE }, \
407
        { "natm", CTLTYPE_NODE }, \
408
        { "arp", CTLTYPE_NODE }, \
409
        { "key", CTLTYPE_NODE }, \
410
        { "ieee80211", CTLTYPE_NODE }, \
411
        { "mlps", CTLTYPE_NODE }, \
412
        { "route", CTLTYPE_NODE }, \
413
}
414
415
struct kinfo_pcb {
416
        __uint64_t        ki_pcbaddr;        /* PTR: pcb addr */
417
        __uint64_t        ki_ppcbaddr;        /* PTR: ppcb addr */
418
        __uint64_t        ki_sockaddr;        /* PTR: socket addr */
419
420
        __uint32_t        ki_family;        /* INT: protocol family */
421
        __uint32_t        ki_type;        /* INT: socket type */
422
        __uint32_t        ki_protocol;        /* INT: protocol */
423
        __uint32_t        ki_pflags;        /* INT: generic protocol flags */
424
425
        __uint32_t        ki_sostate;        /* INT: socket state */
426
        __uint32_t        ki_prstate;        /* INT: protocol state */
427
        __int32_t        ki_tstate;        /* INT: tcp state */
428
        __uint32_t        ki_tflags;        /* INT: tcp flags */
429
430
        __uint64_t        ki_rcvq;        /* U_LONG: receive queue len */
431
        __uint64_t        ki_sndq;        /* U_LONG: send queue len */
432
433
        union {
434
                struct sockaddr        _kis_src; /* STRUCT: local address */
435
                char _kis_pad[256 + 8];                /* pad to max addr length */
436
        } ki_s;
437
        union {
438
                struct sockaddr        _kid_dst; /* STRUCT: remote address */
439
                char _kid_pad[256 + 8];                /* pad to max addr length */
440
        } ki_d;
441
442
        __uint64_t        ki_inode;        /* INO_T: fake inode number */
443
        __uint64_t        ki_vnode;        /* PTR: if associated with file */
444
        __uint64_t        ki_conn;        /* PTR: control block of peer */
445
        __uint64_t        ki_refs;        /* PTR: referencing socket */
446
        __uint64_t        ki_nextref;        /* PTR: link in refs list */
447
};
448
449
#define ki_src ki_s._kis_src
450
#define ki_dst ki_d._kid_dst
451
#define ki_spad ki_s._kis_pad
452
#define ki_dpad ki_d._kid_pad
453
454
#define PCB_SLOP                20
455
#define PCB_ALL                        0
456
457
#endif /* _NETBSD_SOURCE */
458
459
#if defined(_NETBSD_SOURCE)
460
/*
461
 * PF_ROUTE - Routing table
462
 *
463
 * Three additional levels are defined:
464
 *        Fourth: address family, 0 is wildcard
465
 *        Fifth: type of info, defined below
466
 *        Sixth: flag(s) to mask with for NET_RT_FLAGS
467
 */
468
#define NET_RT_DUMP        1                /* dump; may limit to a.f. */
469
#define NET_RT_FLAGS        2                /* by flags, e.g. RESOLVING */
470
#define NET_RT_OOIFLIST        3                /* old NET_RT_IFLIST (pre 1.5) */
471
#define NET_RT_OIFLIST        4                /* survey interface list */
472
#define        NET_RT_IFLIST        5
473
#define        NET_RT_MAXID        6
474
475
#define CTL_NET_RT_NAMES { \
476
        { 0, 0 }, \
477
        { "dump", CTLTYPE_STRUCT }, \
478
        { "flags", CTLTYPE_STRUCT }, \
479
        { 0, 0 }, \
480
        { 0, 0 }, \
481
        { "iflist", CTLTYPE_STRUCT }, \
482
}
483
#endif /* _NETBSD_SOURCE */
484
485
/*
486
 * Maximum queue length specifiable by listen(2).
487
 */
488
#ifndef SOMAXCONN
489
#define        SOMAXCONN        128
490
#endif
491
492
#include <sys/cdefs.h>
493
494
/*
495
 * Message header for recvmsg and sendmsg calls.
496
 * Used value-result for recvmsg, value only for sendmsg.
497
 */
498
struct msghdr {
499
        void                *msg_name;        /* optional address */
500
        socklen_t        msg_namelen;        /* size of address */
501
        struct iovec        *msg_iov;        /* scatter/gather array */
502
        int                msg_iovlen;        /* # elements in msg_iov */
503
        void                *msg_control;        /* ancillary data, see below */
504
        socklen_t        msg_controllen;        /* ancillary data buffer len */
505
        int                msg_flags;        /* flags on received message */
506
};
507
508
#define        MSG_OOB                0x0001                /* process out-of-band data */
509
#define        MSG_PEEK        0x0002                /* peek at incoming message */
510
#define        MSG_DONTROUTE        0x0004                /* send without using routing tables */
511
#define        MSG_EOR                0x0008                /* data completes record */
512
#define        MSG_TRUNC        0x0010                /* data discarded before delivery */
513
#define        MSG_CTRUNC        0x0020                /* control data lost before delivery */
514
#define        MSG_WAITALL        0x0040                /* wait for full request or error */
515
#define        MSG_DONTWAIT        0x0080                /* this message should be nonblocking */
516
#define        MSG_BCAST        0x0100                /* this message was rcvd using link-level brdcst */
517
#define        MSG_MCAST        0x0200                /* this message was rcvd using link-level mcast */
518
#define        MSG_NOSIGNAL        0x0400                /* do not generate SIGPIPE on EOF */
519
#if defined(_NETBSD_SOURCE)
520
#define        MSG_CMSG_CLOEXEC 0x0800                /* close on exec receiving fd */
521
#define        MSG_NBIO        0x1000                /* use non-blocking I/O */
522
#define        MSG_WAITFORONE        0x2000                /* recvmmsg() wait for one message */
523
524
struct mmsghdr {
525
        struct msghdr msg_hdr;
526
        unsigned int msg_len;
527
};
528
#endif
529
530
/* Extra flags used internally only */
531
#define        MSG_USERFLAGS        0x0ffffff
532
#define MSG_NAMEMBUF        0x1000000        /* msg_name is an mbuf */
533
#define MSG_CONTROLMBUF        0x2000000        /* msg_control is an mbuf */
534
#define MSG_IOVUSRSPACE        0x4000000        /* msg_iov is in user space */
535
#define MSG_LENUSRSPACE        0x8000000        /* address length is in user space */
536
537
/*
538
 * Header for ancillary data objects in msg_control buffer.
539
 * Used for additional information with/about a datagram
540
 * not expressible by flags.  The format is a sequence
541
 * of message elements headed by cmsghdr structures.
542
 */
543
struct cmsghdr {
544
        socklen_t        cmsg_len;        /* data byte count, including hdr */
545
        int                cmsg_level;        /* originating protocol */
546
        int                cmsg_type;        /* protocol-specific type */
547
/* followed by        u_char  cmsg_data[]; */
548
};
549
550
/*
551
 * Alignment requirement for CMSG struct manipulation.
552
 * This basically behaves the same as ALIGN() ARCH/include/param.h.
553
 * We declare it separately for two reasons:
554
 * (1) avoid dependency between machine/param.h, and (2) to sync with kernel's
555
 * idea of ALIGNBYTES at runtime.
556
 * without (2), we can't guarantee binary compatibility in case of future
557
 * changes in ALIGNBYTES.
558
 */
559
#define __CMSG_ALIGN(n)        (((n) + __ALIGNBYTES) & ~__ALIGNBYTES)
560
561
#ifdef _KERNEL
562
#define CMSG_ALIGN(n)        __CMSG_ALIGN(n)
563
#endif
564
565
#define __CMSG_ASIZE        __CMSG_ALIGN(sizeof(struct cmsghdr))
566
#define __CMSG_MSGNEXT(cmsg) \
567
    (__CASTV(char *, cmsg) + __CMSG_ALIGN((cmsg)->cmsg_len))
568
#define __CMSG_MSGEND(mhdr) \
569
    (__CASTV(char *, (mhdr)->msg_control) + (mhdr)->msg_controllen)
570
571
/* given pointer to struct cmsghdr, return pointer to data */
572
#define        CMSG_DATA(cmsg) (__CASTV(u_char *, cmsg) + __CMSG_ASIZE)
573
#define        CCMSG_DATA(cmsg) (__CASTCV(const u_char *, cmsg) + __CMSG_ASIZE)
574
575
/* given pointer to struct cmsghdr, return pointer to next cmsghdr */
576
#define        CMSG_NXTHDR(mhdr, cmsg)        \
577
    __CASTV(struct cmsghdr *,  \
578
        __CMSG_MSGNEXT(cmsg) + __CMSG_ASIZE > __CMSG_MSGEND(mhdr) ? 0 : \
579
        __CMSG_MSGNEXT(cmsg))
580
581
/*
582
 * RFC 2292 requires to check msg_controllen, in case that the kernel returns
583
 * an empty list for some reasons.
584
 */
585
#define        CMSG_FIRSTHDR(mhdr) \
586
    __CASTV(struct cmsghdr *, \
587
        (mhdr)->msg_controllen < sizeof(struct cmsghdr) ? 0 : \
588
        (mhdr)->msg_control)
589
590
#define CMSG_SPACE(l)        (__CMSG_ASIZE + __CMSG_ALIGN(l))
591
#define CMSG_LEN(l)        (__CMSG_ASIZE + (l))
592
593
/* "Socket"-level control message types: */
594
#define        SCM_RIGHTS        0x01                /* access rights (array of int) */
595
#if defined(_NETBSD_SOURCE)
596
/*                         0x02                   timestamp (struct timeval50) */
597
#define        SCM_CREDS        0x04                /* credentials (struct sockcred) */
598
#define        SCM_TIMESTAMP        0x08                /* timestamp (struct timeval) */
599
#endif
600
601
/*
602
 * Types of socket shutdown(2).
603
 */
604
#define        SHUT_RD                0                /* Disallow further receives. */
605
#define        SHUT_WR                1                /* Disallow further sends. */
606
#define        SHUT_RDWR        2                /* Disallow further sends/receives. */
607
608
#ifdef        _KERNEL
609
static inline socklen_t
610
sockaddr_getlen(const struct sockaddr *sa)
611
{
612
        return sa->sa_len;
613
}
614
615
__BEGIN_DECLS
616
struct sockaddr *sockaddr_copy(struct sockaddr *, socklen_t,
617
    const struct sockaddr *);
618
struct sockaddr *sockaddr_externalize(struct sockaddr *, socklen_t,
619
    const struct sockaddr *);
620
struct sockaddr *sockaddr_alloc(sa_family_t, socklen_t, int);
621
const void *sockaddr_const_addr(const struct sockaddr *, socklen_t *);
622
void *sockaddr_addr(struct sockaddr *, socklen_t *);
623
const struct sockaddr *sockaddr_any(const struct sockaddr *);
624
const struct sockaddr *sockaddr_any_by_family(int);
625
const void *sockaddr_anyaddr(const struct sockaddr *, socklen_t *);
626
int sockaddr_cmp(const struct sockaddr *, const struct sockaddr *);
627
struct sockaddr *sockaddr_dup(const struct sockaddr *, int);
628
int sockaddr_format(const struct sockaddr *, char *, size_t);
629
void sockaddr_free(struct sockaddr *);
630
__END_DECLS
631
#endif /* _KERNEL */
632
633
#ifndef        _KERNEL
634
635
__BEGIN_DECLS
636
int        accept(int, struct sockaddr * __restrict, socklen_t * __restrict);
637
int        bind(int, const struct sockaddr *, socklen_t);
638
int        connect(int, const struct sockaddr *, socklen_t);
639
int        getpeername(int, struct sockaddr * __restrict, socklen_t * __restrict);
640
int        getsockname(int, struct sockaddr * __restrict, socklen_t * __restrict);
641
int        getsockopt(int, int, int, void *__restrict, socklen_t * __restrict);
642
int        listen(int, int);
643
int        paccept(int, struct sockaddr * __restrict, socklen_t * __restrict,
644
        const sigset_t * __restrict, int);
645
ssize_t        recv(int, void *, size_t, int);
646
ssize_t        recvfrom(int, void *__restrict, size_t, int,
647
            struct sockaddr * __restrict, socklen_t * __restrict);
648
ssize_t        recvmsg(int, struct msghdr *, int);
649
ssize_t        send(int, const void *, size_t, int);
650
ssize_t        sendto(int, const void *,
651
            size_t, int, const struct sockaddr *, socklen_t);
652
ssize_t        sendmsg(int, const struct msghdr *, int);
653
int        setsockopt(int, int, int, const void *, socklen_t);
654
int        shutdown(int, int);
655
int        sockatmark(int);
656
int        socket(int, int, int)
657
#if !defined(__LIBC12_SOURCE__) && !defined(_STANDALONE)
658
__RENAME(__socket30)
659
#endif
660
                             ;
661
int        socketpair(int, int, int, int *);
662
663
#if defined(_NETBSD_SOURCE)
664
int        sendmmsg(int, struct mmsghdr *, unsigned int, unsigned int);
665
struct timespec;
666
int        recvmmsg(int, struct mmsghdr *, unsigned int, unsigned int,
667
    struct timespec *);
668
#endif
669
__END_DECLS
670
#endif /* !_KERNEL */
671
672
#endif /* !_SYS_SOCKET_H_ */