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