Project

General

Profile

Statistics
| Revision:

root / lab4 / .minix-src / include / netinet / in.h @ 14

History | View | Annotate | Download (19.2 KB)

1 13 up20180614
/*        $NetBSD: in.h,v 1.97 2015/05/02 14:41:32 roy Exp $        */
2
3
/*
4
 * Copyright (c) 1982, 1986, 1990, 1993
5
 *        The Regents of the University of California.  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 University 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 REGENTS 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 REGENTS 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
 *        @(#)in.h        8.3 (Berkeley) 1/3/94
32
 */
33
34
/*
35
 * Constants and structures defined by the internet system,
36
 * Per RFC 790, September 1981, and numerous additions.
37
 */
38
39
#ifndef _NETINET_IN_H_
40
#define        _NETINET_IN_H_
41
42
#include <sys/featuretest.h>
43
#include <machine/int_types.h>
44
45
#ifndef uint8_t
46
typedef __uint8_t        uint8_t;
47
#define        uint8_t                __uint8_t
48
#endif
49
50
#ifndef uint32_t
51
typedef __uint32_t        uint32_t;
52
#define        uint32_t        __uint32_t
53
#endif
54
55
#include <sys/ansi.h>
56
57
#ifndef in_addr_t
58
typedef __in_addr_t        in_addr_t;
59
#define        in_addr_t        __in_addr_t
60
#endif
61
62
#ifndef in_port_t
63
typedef __in_port_t        in_port_t;
64
#define        in_port_t        __in_port_t
65
#endif
66
67
#ifndef sa_family_t
68
typedef __sa_family_t        sa_family_t;
69
#define        sa_family_t        __sa_family_t
70
#endif
71
72
/*
73
 * Protocols
74
 */
75
#define        IPPROTO_IP                0                /* dummy for IP */
76
#define        IPPROTO_HOPOPTS                0                /* IP6 hop-by-hop options */
77
#define        IPPROTO_ICMP                1                /* control message protocol */
78
#define        IPPROTO_IGMP                2                /* group mgmt protocol */
79
#define        IPPROTO_GGP                3                /* gateway^2 (deprecated) */
80
#define        IPPROTO_IPV4                4                 /* IP header */
81
#define        IPPROTO_IPIP                4                /* IP inside IP */
82
#define        IPPROTO_TCP                6                /* tcp */
83
#define        IPPROTO_EGP                8                /* exterior gateway protocol */
84
#define        IPPROTO_PUP                12                /* pup */
85
#define        IPPROTO_UDP                17                /* user datagram protocol */
86
#define        IPPROTO_IDP                22                /* xns idp */
87
#define        IPPROTO_TP                29                 /* tp-4 w/ class negotiation */
88
#define        IPPROTO_DCCP                33                /* DCCP */
89
#define        IPPROTO_IPV6                41                /* IP6 header */
90
#define        IPPROTO_ROUTING                43                /* IP6 routing header */
91
#define        IPPROTO_FRAGMENT        44                /* IP6 fragmentation header */
92
#define        IPPROTO_RSVP                46                /* resource reservation */
93
#define        IPPROTO_GRE                47                /* GRE encaps RFC 1701 */
94
#define        IPPROTO_ESP                50                 /* encap. security payload */
95
#define        IPPROTO_AH                51                 /* authentication header */
96
#define        IPPROTO_MOBILE                55                /* IP Mobility RFC 2004 */
97
#define        IPPROTO_IPV6_ICMP        58                /* IPv6 ICMP */
98
#define        IPPROTO_ICMPV6                58                /* ICMP6 */
99
#define        IPPROTO_NONE                59                /* IP6 no next header */
100
#define        IPPROTO_DSTOPTS                60                /* IP6 destination option */
101
#define        IPPROTO_EON                80                /* ISO cnlp */
102
#define        IPPROTO_ETHERIP                97                /* Ethernet-in-IP */
103
#define        IPPROTO_ENCAP                98                /* encapsulation header */
104
#define        IPPROTO_PIM                103                /* Protocol indep. multicast */
105
#define        IPPROTO_IPCOMP                108                /* IP Payload Comp. Protocol */
106
#define        IPPROTO_VRRP                112                /* VRRP RFC 2338 */
107
#define        IPPROTO_CARP                112                /* Common Address Resolution Protocol */
108
#define IPPROTO_PFSYNC      240     /* PFSYNC */
109
#define        IPPROTO_RAW                255                /* raw IP packet */
110
#define        IPPROTO_MAX                256
111
112
/* last return value of *_input(), meaning "all job for this pkt is done".  */
113
#define        IPPROTO_DONE                257
114
115
/* sysctl placeholder for (FAST_)IPSEC */
116
#define CTL_IPPROTO_IPSEC        258
117
118
119
/*
120
 * Local port number conventions:
121
 *
122
 * Ports < IPPORT_RESERVED are reserved for privileged processes (e.g. root),
123
 * unless a kernel is compiled with IPNOPRIVPORTS defined.
124
 *
125
 * When a user does a bind(2) or connect(2) with a port number of zero,
126
 * a non-conflicting local port address is chosen.
127
 *
128
 * The default range is IPPORT_ANONMIN to IPPORT_ANONMAX, although
129
 * that is settable by sysctl(3); net.inet.ip.anonportmin and
130
 * net.inet.ip.anonportmax respectively.
131
 *
132
 * A user may set the IPPROTO_IP option IP_PORTRANGE to change this
133
 * default assignment range.
134
 *
135
 * The value IP_PORTRANGE_DEFAULT causes the default behavior.
136
 *
137
 * The value IP_PORTRANGE_HIGH is the same as IP_PORTRANGE_DEFAULT,
138
 * and exists only for FreeBSD compatibility purposes.
139
 *
140
 * The value IP_PORTRANGE_LOW changes the range to the "low" are
141
 * that is (by convention) restricted to privileged processes.
142
 * This convention is based on "vouchsafe" principles only.
143
 * It is only secure if you trust the remote host to restrict these ports.
144
 * The range is IPPORT_RESERVEDMIN to IPPORT_RESERVEDMAX.
145
 */
146
147
#define        IPPORT_RESERVED                1024
148
#define        IPPORT_ANONMIN                49152
149
#define        IPPORT_ANONMAX                65535
150
#define        IPPORT_RESERVEDMIN        600
151
#define        IPPORT_RESERVEDMAX        (IPPORT_RESERVED-1)
152
153
/*
154
 * Internet address (a structure for historical reasons)
155
 */
156
struct in_addr {
157
        in_addr_t s_addr;
158
} __packed;
159
160
/*
161
 * Definitions of bits in internet address integers.
162
 * On subnets, the decomposition of addresses to host and net parts
163
 * is done according to subnet mask, not the masks here.
164
 *
165
 * By byte-swapping the constants, we avoid ever having to byte-swap IP
166
 * addresses inside the kernel.  Unfortunately, user-level programs rely
167
 * on these macros not doing byte-swapping.
168
 */
169
#ifdef _KERNEL
170
#define        __IPADDR(x)        ((uint32_t) htonl((uint32_t)(x)))
171
#else
172
#define        __IPADDR(x)        ((uint32_t)(x))
173
#endif
174
175
#define        IN_CLASSA(i)                (((uint32_t)(i) & __IPADDR(0x80000000)) == \
176
                                 __IPADDR(0x00000000))
177
#define        IN_CLASSA_NET                __IPADDR(0xff000000)
178
#define        IN_CLASSA_NSHIFT        24
179
#define        IN_CLASSA_HOST                __IPADDR(0x00ffffff)
180
#define        IN_CLASSA_MAX                128
181
182
#define        IN_CLASSB(i)                (((uint32_t)(i) & __IPADDR(0xc0000000)) == \
183
                                 __IPADDR(0x80000000))
184
#define        IN_CLASSB_NET                __IPADDR(0xffff0000)
185
#define        IN_CLASSB_NSHIFT        16
186
#define        IN_CLASSB_HOST                __IPADDR(0x0000ffff)
187
#define        IN_CLASSB_MAX                65536
188
189
#define        IN_CLASSC(i)                (((uint32_t)(i) & __IPADDR(0xe0000000)) == \
190
                                 __IPADDR(0xc0000000))
191
#define        IN_CLASSC_NET                __IPADDR(0xffffff00)
192
#define        IN_CLASSC_NSHIFT        8
193
#define        IN_CLASSC_HOST                __IPADDR(0x000000ff)
194
195
#define        IN_CLASSD(i)                (((uint32_t)(i) & __IPADDR(0xf0000000)) == \
196
                                 __IPADDR(0xe0000000))
197
/* These ones aren't really net and host fields, but routing needn't know. */
198
#define        IN_CLASSD_NET                __IPADDR(0xf0000000)
199
#define        IN_CLASSD_NSHIFT        28
200
#define        IN_CLASSD_HOST                __IPADDR(0x0fffffff)
201
#define        IN_MULTICAST(i)                IN_CLASSD(i)
202
203
#define        IN_EXPERIMENTAL(i)        (((uint32_t)(i) & __IPADDR(0xf0000000)) == \
204
                                 __IPADDR(0xf0000000))
205
#define        IN_BADCLASS(i)                (((uint32_t)(i) & __IPADDR(0xf0000000)) == \
206
                                 __IPADDR(0xf0000000))
207
208
#define IN_LINKLOCAL(i)        (((uint32_t)(i) & __IPADDR(0xffff0000)) == \
209
                         __IPADDR(0xa9fe0000))
210
211
#define        IN_PRIVATE(i)        ((((uint32_t)(i) & __IPADDR(0xff000000)) ==        \
212
                          __IPADDR(0x0a000000))        ||                        \
213
                         (((uint32_t)(i) & __IPADDR(0xfff00000)) ==        \
214
                          __IPADDR(0xac100000))        ||                        \
215
                         (((uint32_t)(i) & __IPADDR(0xffff0000)) ==        \
216
                          __IPADDR(0xc0a80000)))
217
218
#define        IN_LOCAL_GROUP(i)        (((uint32_t)(i) & __IPADDR(0xffffff00)) == \
219
                                 __IPADDR(0xe0000000))
220
221
#define        IN_ANY_LOCAL(i)                (IN_LINKLOCAL(i) || IN_LOCAL_GROUP(i))
222
223
#define        INADDR_ANY                __IPADDR(0x00000000)
224
#define        INADDR_LOOPBACK                __IPADDR(0x7f000001)
225
#define        INADDR_BROADCAST        __IPADDR(0xffffffff)        /* must be masked */
226
#define        INADDR_NONE                __IPADDR(0xffffffff)        /* -1 return */
227
228
#define        INADDR_UNSPEC_GROUP        __IPADDR(0xe0000000)        /* 224.0.0.0 */
229
#define        INADDR_ALLHOSTS_GROUP        __IPADDR(0xe0000001)        /* 224.0.0.1 */
230
#define        INADDR_ALLRTRS_GROUP        __IPADDR(0xe0000002)        /* 224.0.0.2 */
231
#define        INADDR_CARP_GROUP        __IPADDR(0xe0000012)        /* 224.0.0.18 */
232
#define        INADDR_MAX_LOCAL_GROUP        __IPADDR(0xe00000ff)        /* 224.0.0.255 */
233
234
#define        IN_LOOPBACKNET                127                        /* official! */
235
236
/*
237
 * Socket address, internet style.
238
 */
239
struct sockaddr_in {
240
        uint8_t                sin_len;
241
        sa_family_t        sin_family;
242
        in_port_t        sin_port;
243
        struct in_addr        sin_addr;
244
        __int8_t        sin_zero[8];
245
};
246
247
#define        INET_ADDRSTRLEN                 16
248
249
/*
250
 * Structure used to describe IP options.
251
 * Used to store options internally, to pass them to a process,
252
 * or to restore options retrieved earlier.
253
 * The ip_dst is used for the first-hop gateway when using a source route
254
 * (this gets put into the header proper).
255
 */
256
struct ip_opts {
257
        struct in_addr        ip_dst;                /* first hop, 0 w/o src rt */
258
#if defined(__cplusplus)
259
        __int8_t        Ip_opts[40];        /* actually variable in size */
260
#else
261
        __int8_t        ip_opts[40];        /* actually variable in size */
262
#endif
263
};
264
265
/*
266
 * Options for use with [gs]etsockopt at the IP level.
267
 * First word of comment is data type; bool is stored in int.
268
 */
269
#define        IP_OPTIONS                1    /* buf/ip_opts; set/get IP options */
270
#define        IP_HDRINCL                2    /* int; header is included with data */
271
#define        IP_TOS                        3    /* int; IP type of service and preced. */
272
#define        IP_TTL                        4    /* int; IP time to live */
273
#define        IP_RECVOPTS                5    /* bool; receive all IP opts w/dgram */
274
#define        IP_RECVRETOPTS                6    /* bool; receive IP opts for response */
275
#define        IP_RECVDSTADDR                7    /* bool; receive IP dst addr w/dgram */
276
#define        IP_RETOPTS                8    /* ip_opts; set/get IP options */
277
#define        IP_MULTICAST_IF                9    /* in_addr; set/get IP multicast i/f  */
278
#define        IP_MULTICAST_TTL        10   /* u_char; set/get IP multicast ttl */
279
#define        IP_MULTICAST_LOOP        11   /* u_char; set/get IP multicast loopback */
280
/* The add and drop membership option numbers need to match with the v6 ones */
281
#define        IP_ADD_MEMBERSHIP        12   /* ip_mreq; add an IP group membership */
282
#define        IP_DROP_MEMBERSHIP        13   /* ip_mreq; drop an IP group membership */
283
#define        IP_PORTALGO                18   /* int; port selection algo (rfc6056) */
284
#define        IP_PORTRANGE                19   /* int; range to use for ephemeral port */
285
#define        IP_RECVIF                20   /* bool; receive reception if w/dgram */
286
#define        IP_ERRORMTU                21   /* int; get MTU of last xmit = EMSGSIZE */
287
#define        IP_IPSEC_POLICY                22   /* struct; get/set security policy */
288
#define        IP_RECVTTL                23   /* bool; receive IP TTL w/dgram */
289
#define        IP_MINTTL                24   /* minimum TTL for packet or drop */
290
#define        IP_PKTINFO                25   /* int; send interface and src addr */
291
#define        IP_RECVPKTINFO                26   /* int; send interface and dst addr */
292
293
/*
294
 * Information sent in the control message of a datagram socket for
295
 * IP_PKTINFO and IP_RECVPKTINFO.
296
 */
297
struct in_pktinfo {
298
        struct in_addr        ipi_addr;        /* src/dst address */
299
        unsigned int ipi_ifindex;        /* interface index */
300
};
301
302
/*
303
 * Defaults and limits for options
304
 */
305
#define        IP_DEFAULT_MULTICAST_TTL  1        /* normally limit m'casts to 1 hop  */
306
#define        IP_DEFAULT_MULTICAST_LOOP 1        /* normally hear sends if a member  */
307
#define        IP_MAX_MEMBERSHIPS        20        /* per socket; must fit in one mbuf */
308
309
/*
310
 * Argument structure for IP_ADD_MEMBERSHIP and IP_DROP_MEMBERSHIP.
311
 */
312
struct ip_mreq {
313
        struct        in_addr imr_multiaddr;        /* IP multicast address of group */
314
        struct        in_addr imr_interface;        /* local IP address of interface */
315
};
316
317
/*
318
 * Argument for IP_PORTRANGE:
319
 * - which range to search when port is unspecified at bind() or connect()
320
 */
321
#define        IP_PORTRANGE_DEFAULT        0        /* default range */
322
#define        IP_PORTRANGE_HIGH        1        /* same as DEFAULT (FreeBSD compat) */
323
#define        IP_PORTRANGE_LOW        2        /* use privileged range */
324
325
#if defined(_NETBSD_SOURCE)
326
/*
327
 * Definitions for inet sysctl operations.
328
 *
329
 * Third level is protocol number.
330
 * Fourth level is desired variable within that protocol.
331
 */
332
#define        IPPROTO_MAXID        (IPPROTO_AH + 1)        /* don't list to IPPROTO_MAX */
333
334
#define        CTL_IPPROTO_NAMES { \
335
        { "ip", CTLTYPE_NODE }, \
336
        { "icmp", CTLTYPE_NODE }, \
337
        { "igmp", CTLTYPE_NODE }, \
338
        { "ggp", CTLTYPE_NODE }, \
339
        { 0, 0 }, \
340
        { 0, 0 }, \
341
        { "tcp", CTLTYPE_NODE }, \
342
        { 0, 0 }, \
343
        { "egp", CTLTYPE_NODE }, \
344
        { 0, 0 }, \
345
        { 0, 0 }, \
346
        { 0, 0 }, \
347
        { "pup", CTLTYPE_NODE }, \
348
        { 0, 0 }, \
349
        { 0, 0 }, \
350
        { 0, 0 }, \
351
        { 0, 0 }, \
352
        { "udp", CTLTYPE_NODE }, \
353
        { 0, 0 }, \
354
        { 0, 0 }, \
355
        { 0, 0 }, \
356
        { 0, 0 }, \
357
        { "idp", CTLTYPE_NODE }, \
358
        { 0, 0 }, \
359
        { 0, 0 }, \
360
        { 0, 0 }, \
361
        { 0, 0 }, \
362
        { 0, 0 }, \
363
        { 0, 0 }, \
364
        { 0, 0 }, \
365
        { 0, 0 }, \
366
        { 0, 0 }, \
367
        { 0, 0 }, \
368
        { 0, 0 }, \
369
        { 0, 0 }, \
370
        { 0, 0 }, \
371
        { 0, 0 }, \
372
        { 0, 0 }, \
373
        { 0, 0 }, \
374
        { 0, 0 }, \
375
        { 0, 0 }, \
376
        { 0, 0 }, \
377
        { 0, 0 }, \
378
        { 0, 0 }, \
379
        { 0, 0 }, \
380
        { 0, 0 }, \
381
        { 0, 0 }, \
382
        { 0, 0 }, \
383
        { 0, 0 }, \
384
        { 0, 0 }, \
385
        { 0, 0 }, \
386
        { "ipsec", CTLTYPE_NODE }, \
387
        { 0, 0 }, \
388
        { 0, 0 }, \
389
        { 0, 0 }, \
390
        { 0, 0 }, \
391
        { 0, 0 }, \
392
        { 0, 0 }, \
393
        { 0, 0 }, \
394
        { 0, 0 }, \
395
        { 0, 0 }, \
396
        { 0, 0 }, \
397
        { 0, 0 }, \
398
        { 0, 0 }, \
399
        { 0, 0 }, \
400
        { 0, 0 }, \
401
        { 0, 0 }, \
402
        { 0, 0 }, \
403
        { 0, 0 }, \
404
        { 0, 0 }, \
405
        { 0, 0 }, \
406
        { 0, 0 }, \
407
        { 0, 0 }, \
408
        { 0, 0 }, \
409
        { 0, 0 }, \
410
        { 0, 0 }, \
411
        { 0, 0 }, \
412
        { 0, 0 }, \
413
        { 0, 0 }, \
414
        { 0, 0 }, \
415
        { 0, 0 }, \
416
        { 0, 0 }, \
417
        { 0, 0 }, \
418
        { 0, 0 }, \
419
        { 0, 0 }, \
420
        { 0, 0 }, \
421
        { 0, 0 }, \
422
        { 0, 0 }, \
423
        { 0, 0 }, \
424
        { 0, 0 }, \
425
        { 0, 0 }, \
426
        { 0, 0 }, \
427
        { 0, 0 }, \
428
        { 0, 0 }, \
429
        { 0, 0 }, \
430
        { 0, 0 }, \
431
        { 0, 0 }, \
432
        { 0, 0 }, \
433
        { 0, 0 }, \
434
        { 0, 0 }, \
435
        { 0, 0 }, \
436
        { 0, 0 }, \
437
        { 0, 0 }, \
438
        { "pim", CTLTYPE_NODE }, \
439
}
440
441
/*
442
 * Names for IP sysctl objects
443
 */
444
#define        IPCTL_FORWARDING        1        /* act as router */
445
#define        IPCTL_SENDREDIRECTS        2        /* may send redirects when forwarding */
446
#define        IPCTL_DEFTTL                3        /* default TTL */
447
#ifdef notyet
448
#define        IPCTL_DEFMTU                4        /* default MTU */
449
#endif
450
#define        IPCTL_FORWSRCRT                5        /* forward source-routed packets */
451
#define        IPCTL_DIRECTEDBCAST        6        /* default broadcast behavior */
452
#define        IPCTL_ALLOWSRCRT        7        /* allow/drop all source-routed pkts */
453
#define        IPCTL_SUBNETSARELOCAL        8        /* treat subnets as local addresses */
454
#define        IPCTL_MTUDISC                9        /* allow path MTU discovery */
455
#define        IPCTL_ANONPORTMIN      10        /* minimum ephemeral port */
456
#define        IPCTL_ANONPORTMAX      11        /* maximum ephemeral port */
457
#define        IPCTL_MTUDISCTIMEOUT   12        /* allow path MTU discovery */
458
#define        IPCTL_MAXFLOWS         13        /* maximum ip flows allowed */
459
#define        IPCTL_HOSTZEROBROADCAST 14        /* is host zero a broadcast addr? */
460
#define        IPCTL_GIF_TTL                15        /* default TTL for gif encap packet */
461
#define        IPCTL_LOWPORTMIN       16        /* minimum reserved port */
462
#define        IPCTL_LOWPORTMAX       17        /* maximum reserved port */
463
#define        IPCTL_MAXFRAGPACKETS   18        /* max packets reassembly queue */
464
#define        IPCTL_GRE_TTL          19        /* default TTL for gre encap packet */
465
#define        IPCTL_CHECKINTERFACE   20        /* drop pkts in from 'wrong' iface */
466
#define        IPCTL_IFQ               21        /* IP packet input queue */
467
#define        IPCTL_RANDOMID               22        /* use random IP ids (if configured) */
468
#define        IPCTL_LOOPBACKCKSUM    23        /* do IP checksum on loopback */
469
#define        IPCTL_STATS                24        /* IP statistics */
470
#define        IPCTL_DAD_COUNT        25        /* DAD packets to send */
471
#define        IPCTL_MAXID               26
472
473
#define        IPCTL_NAMES { \
474
        { 0, 0 }, \
475
        { "forwarding", CTLTYPE_INT }, \
476
        { "redirect", CTLTYPE_INT }, \
477
        { "ttl", CTLTYPE_INT }, \
478
        { "mtu", CTLTYPE_INT }, \
479
        { "forwsrcrt", CTLTYPE_INT }, \
480
        { "directed-broadcast", CTLTYPE_INT }, \
481
        { "allowsrcrt", CTLTYPE_INT }, \
482
        { "subnetsarelocal", CTLTYPE_INT }, \
483
        { "mtudisc", CTLTYPE_INT }, \
484
        { "anonportmin", CTLTYPE_INT }, \
485
        { "anonportmax", CTLTYPE_INT }, \
486
        { "mtudisctimeout", CTLTYPE_INT }, \
487
        { "maxflows", CTLTYPE_INT }, \
488
        { "hostzerobroadcast", CTLTYPE_INT }, \
489
        { "gifttl", CTLTYPE_INT }, \
490
        { "lowportmin", CTLTYPE_INT }, \
491
        { "lowportmax", CTLTYPE_INT }, \
492
        { "maxfragpackets", CTLTYPE_INT }, \
493
        { "grettl", CTLTYPE_INT }, \
494
        { "checkinterface", CTLTYPE_INT }, \
495
        { "ifq", CTLTYPE_NODE }, \
496
        { "random_id", CTLTYPE_INT }, \
497
        { "do_loopback_cksum", CTLTYPE_INT }, \
498
        { "stats", CTLTYPE_STRUCT }, \
499
        { "dad_count", CTLTYPE_INT }, \
500
}
501
#endif /* _NETBSD_SOURCE */
502
503
/* INET6 stuff */
504
#define        __KAME_NETINET_IN_H_INCLUDED_
505
#include <netinet6/in6.h>
506
#undef __KAME_NETINET_IN_H_INCLUDED_
507
508
#ifdef _KERNEL
509
/*
510
 * in_cksum_phdr:
511
 *
512
 *        Compute significant parts of the IPv4 checksum pseudo-header
513
 *        for use in a delayed TCP/UDP checksum calculation.
514
 *
515
 *        Args:
516
 *
517
 *                src                Source IP address
518
 *                dst                Destination IP address
519
 *                lenproto        htons(proto-hdr-len + proto-number)
520
 */
521
static __inline u_int16_t __unused
522
in_cksum_phdr(u_int32_t src, u_int32_t dst, u_int32_t lenproto)
523
{
524
        u_int32_t sum;
525
526
        sum = lenproto +
527
              (u_int16_t)(src >> 16) +
528
              (u_int16_t)(src /*& 0xffff*/) +
529
              (u_int16_t)(dst >> 16) +
530
              (u_int16_t)(dst /*& 0xffff*/);
531
532
        sum = (u_int16_t)(sum >> 16) + (u_int16_t)(sum /*& 0xffff*/);
533
534
        if (sum > 0xffff)
535
                sum -= 0xffff;
536
537
        return (sum);
538
}
539
540
/*
541
 * in_cksum_addword:
542
 *
543
 *        Add the two 16-bit network-order values, carry, and return.
544
 */
545
static __inline u_int16_t __unused
546
in_cksum_addword(u_int16_t a, u_int16_t b)
547
{
548
        u_int32_t sum = a + b;
549
550
        if (sum > 0xffff)
551
                sum -= 0xffff;
552
553
        return (sum);
554
}
555
556
extern        struct in_addr zeroin_addr;
557
extern        u_char        ip_protox[];
558
extern const struct sockaddr_in in_any;
559
560
int        in_broadcast(struct in_addr, struct ifnet *);
561
int        in_canforward(struct in_addr);
562
int        cpu_in_cksum(struct mbuf *, int, int, uint32_t);
563
int        in_cksum(struct mbuf *, int);
564
int        in4_cksum(struct mbuf *, u_int8_t, int, int);
565
void        in_delayed_cksum(struct mbuf *);
566
int        in_localaddr(struct in_addr);
567
void        in_socktrim(struct sockaddr_in *);
568
569
void        in_if_link_up(struct ifnet *);
570
void        in_if_link_down(struct ifnet *);
571
void        in_if_up(struct ifnet *);
572
void        in_if_down(struct ifnet *);
573
void        in_if_link_state_change(struct ifnet *, int);
574
575
struct route;
576
struct ip_moptions;
577
578
struct sockaddr_in *in_selectsrc(struct sockaddr_in *,
579
        struct route *, int, struct ip_moptions *, int *);
580
581
#define        in_hosteq(s,t)        ((s).s_addr == (t).s_addr)
582
#define        in_nullhost(x)        ((x).s_addr == INADDR_ANY)
583
584
#define        satosin(sa)        ((struct sockaddr_in *)(sa))
585
#define        satocsin(sa)        ((const struct sockaddr_in *)(sa))
586
#define        sintosa(sin)        ((struct sockaddr *)(sin))
587
#define        sintocsa(sin)        ((const struct sockaddr *)(sin))
588
#define        ifatoia(ifa)        ((struct in_ifaddr *)(ifa))
589
590
int sockaddr_in_cmp(const struct sockaddr *, const struct sockaddr *);
591
const void *sockaddr_in_const_addr(const struct sockaddr *, socklen_t *);
592
void *sockaddr_in_addr(struct sockaddr *, socklen_t *);
593
594
static inline void
595
sockaddr_in_init1(struct sockaddr_in *sin, const struct in_addr *addr,
596
    in_port_t port)
597
{
598
        sin->sin_port = port;
599
        sin->sin_addr = *addr;
600
        memset(sin->sin_zero, 0, sizeof(sin->sin_zero));
601
}
602
603
static inline void
604
sockaddr_in_init(struct sockaddr_in *sin, const struct in_addr *addr,
605
    in_port_t port)
606
{
607
        sin->sin_family = AF_INET;
608
        sin->sin_len = sizeof(*sin);
609
        sockaddr_in_init1(sin, addr, port);
610
}
611
612
static inline struct sockaddr *
613
sockaddr_in_alloc(const struct in_addr *addr, in_port_t port, int flags)
614
{
615
        struct sockaddr *sa;
616
617
        sa = sockaddr_alloc(AF_INET, sizeof(struct sockaddr_in), flags);
618
619
        if (sa == NULL)
620
                return NULL;
621
622
        sockaddr_in_init1(satosin(sa), addr, port);
623
624
        return sa;
625
}
626
#endif /* _KERNEL */
627
628
#if defined(_KERNEL) || defined(_TEST)
629
int        in_print(char *, size_t, const struct in_addr *);
630
#define IN_PRINT(b, a)        (in_print((b), sizeof(b), a), (b))
631
int        sin_print(char *, size_t, const void *);
632
#endif
633
634
#endif /* !_NETINET_IN_H_ */