xref: /utopia/UTPA2-700.0.x/projects/tools/lint/mips-linux-gnu_include/netinet/in.h (revision 53ee8cc121a030b8d368113ac3e966b4705770ef)
1*53ee8cc1Swenshuai.xi /* Copyright (C) 1991-2001, 2003, 2004, 2006, 2007
2*53ee8cc1Swenshuai.xi    Free Software Foundation, Inc.
3*53ee8cc1Swenshuai.xi    This file is part of the GNU C Library.
4*53ee8cc1Swenshuai.xi 
5*53ee8cc1Swenshuai.xi    The GNU C Library is free software; you can redistribute it and/or
6*53ee8cc1Swenshuai.xi    modify it under the terms of the GNU Lesser General Public
7*53ee8cc1Swenshuai.xi    License as published by the Free Software Foundation; either
8*53ee8cc1Swenshuai.xi    version 2.1 of the License, or (at your option) any later version.
9*53ee8cc1Swenshuai.xi 
10*53ee8cc1Swenshuai.xi    The GNU C Library is distributed in the hope that it will be useful,
11*53ee8cc1Swenshuai.xi    but WITHOUT ANY WARRANTY; without even the implied warranty of
12*53ee8cc1Swenshuai.xi    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13*53ee8cc1Swenshuai.xi    Lesser General Public License for more details.
14*53ee8cc1Swenshuai.xi 
15*53ee8cc1Swenshuai.xi    You should have received a copy of the GNU Lesser General Public
16*53ee8cc1Swenshuai.xi    License along with the GNU C Library; if not, write to the Free
17*53ee8cc1Swenshuai.xi    Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
18*53ee8cc1Swenshuai.xi    02111-1307 USA.  */
19*53ee8cc1Swenshuai.xi 
20*53ee8cc1Swenshuai.xi #ifndef	_NETINET_IN_H
21*53ee8cc1Swenshuai.xi #define	_NETINET_IN_H	1
22*53ee8cc1Swenshuai.xi 
23*53ee8cc1Swenshuai.xi #include <features.h>
24*53ee8cc1Swenshuai.xi #include <stdint.h>
25*53ee8cc1Swenshuai.xi #include <sys/socket.h>
26*53ee8cc1Swenshuai.xi #include <bits/types.h>
27*53ee8cc1Swenshuai.xi 
28*53ee8cc1Swenshuai.xi 
29*53ee8cc1Swenshuai.xi __BEGIN_DECLS
30*53ee8cc1Swenshuai.xi 
31*53ee8cc1Swenshuai.xi /* Standard well-defined IP protocols.  */
32*53ee8cc1Swenshuai.xi enum
33*53ee8cc1Swenshuai.xi   {
34*53ee8cc1Swenshuai.xi     IPPROTO_IP = 0,	   /* Dummy protocol for TCP.  */
35*53ee8cc1Swenshuai.xi #define IPPROTO_IP		IPPROTO_IP
36*53ee8cc1Swenshuai.xi     IPPROTO_HOPOPTS = 0,   /* IPv6 Hop-by-Hop options.  */
37*53ee8cc1Swenshuai.xi #define IPPROTO_HOPOPTS		IPPROTO_HOPOPTS
38*53ee8cc1Swenshuai.xi     IPPROTO_ICMP = 1,	   /* Internet Control Message Protocol.  */
39*53ee8cc1Swenshuai.xi #define IPPROTO_ICMP		IPPROTO_ICMP
40*53ee8cc1Swenshuai.xi     IPPROTO_IGMP = 2,	   /* Internet Group Management Protocol. */
41*53ee8cc1Swenshuai.xi #define IPPROTO_IGMP		IPPROTO_IGMP
42*53ee8cc1Swenshuai.xi     IPPROTO_IPIP = 4,	   /* IPIP tunnels (older KA9Q tunnels use 94).  */
43*53ee8cc1Swenshuai.xi #define IPPROTO_IPIP		IPPROTO_IPIP
44*53ee8cc1Swenshuai.xi     IPPROTO_TCP = 6,	   /* Transmission Control Protocol.  */
45*53ee8cc1Swenshuai.xi #define IPPROTO_TCP		IPPROTO_TCP
46*53ee8cc1Swenshuai.xi     IPPROTO_EGP = 8,	   /* Exterior Gateway Protocol.  */
47*53ee8cc1Swenshuai.xi #define IPPROTO_EGP		IPPROTO_EGP
48*53ee8cc1Swenshuai.xi     IPPROTO_PUP = 12,	   /* PUP protocol.  */
49*53ee8cc1Swenshuai.xi #define IPPROTO_PUP		IPPROTO_PUP
50*53ee8cc1Swenshuai.xi     IPPROTO_UDP = 17,	   /* User Datagram Protocol.  */
51*53ee8cc1Swenshuai.xi #define IPPROTO_UDP		IPPROTO_UDP
52*53ee8cc1Swenshuai.xi     IPPROTO_IDP = 22,	   /* XNS IDP protocol.  */
53*53ee8cc1Swenshuai.xi #define IPPROTO_IDP		IPPROTO_IDP
54*53ee8cc1Swenshuai.xi     IPPROTO_TP = 29,	   /* SO Transport Protocol Class 4.  */
55*53ee8cc1Swenshuai.xi #define IPPROTO_TP		IPPROTO_TP
56*53ee8cc1Swenshuai.xi     IPPROTO_IPV6 = 41,     /* IPv6 header.  */
57*53ee8cc1Swenshuai.xi #define IPPROTO_IPV6		IPPROTO_IPV6
58*53ee8cc1Swenshuai.xi     IPPROTO_ROUTING = 43,  /* IPv6 routing header.  */
59*53ee8cc1Swenshuai.xi #define IPPROTO_ROUTING		IPPROTO_ROUTING
60*53ee8cc1Swenshuai.xi     IPPROTO_FRAGMENT = 44, /* IPv6 fragmentation header.  */
61*53ee8cc1Swenshuai.xi #define IPPROTO_FRAGMENT	IPPROTO_FRAGMENT
62*53ee8cc1Swenshuai.xi     IPPROTO_RSVP = 46,	   /* Reservation Protocol.  */
63*53ee8cc1Swenshuai.xi #define IPPROTO_RSVP		IPPROTO_RSVP
64*53ee8cc1Swenshuai.xi     IPPROTO_GRE = 47,	   /* General Routing Encapsulation.  */
65*53ee8cc1Swenshuai.xi #define IPPROTO_GRE		IPPROTO_GRE
66*53ee8cc1Swenshuai.xi     IPPROTO_ESP = 50,      /* encapsulating security payload.  */
67*53ee8cc1Swenshuai.xi #define IPPROTO_ESP		IPPROTO_ESP
68*53ee8cc1Swenshuai.xi     IPPROTO_AH = 51,       /* authentication header.  */
69*53ee8cc1Swenshuai.xi #define IPPROTO_AH		IPPROTO_AH
70*53ee8cc1Swenshuai.xi     IPPROTO_ICMPV6 = 58,   /* ICMPv6.  */
71*53ee8cc1Swenshuai.xi #define IPPROTO_ICMPV6		IPPROTO_ICMPV6
72*53ee8cc1Swenshuai.xi     IPPROTO_NONE = 59,     /* IPv6 no next header.  */
73*53ee8cc1Swenshuai.xi #define IPPROTO_NONE		IPPROTO_NONE
74*53ee8cc1Swenshuai.xi     IPPROTO_DSTOPTS = 60,  /* IPv6 destination options.  */
75*53ee8cc1Swenshuai.xi #define IPPROTO_DSTOPTS		IPPROTO_DSTOPTS
76*53ee8cc1Swenshuai.xi     IPPROTO_MTP = 92,	   /* Multicast Transport Protocol.  */
77*53ee8cc1Swenshuai.xi #define IPPROTO_MTP		IPPROTO_MTP
78*53ee8cc1Swenshuai.xi     IPPROTO_ENCAP = 98,	   /* Encapsulation Header.  */
79*53ee8cc1Swenshuai.xi #define IPPROTO_ENCAP		IPPROTO_ENCAP
80*53ee8cc1Swenshuai.xi     IPPROTO_PIM = 103,	   /* Protocol Independent Multicast.  */
81*53ee8cc1Swenshuai.xi #define IPPROTO_PIM		IPPROTO_PIM
82*53ee8cc1Swenshuai.xi     IPPROTO_COMP = 108,	   /* Compression Header Protocol.  */
83*53ee8cc1Swenshuai.xi #define IPPROTO_COMP		IPPROTO_COMP
84*53ee8cc1Swenshuai.xi     IPPROTO_SCTP = 132,	   /* Stream Control Transmission Protocol.  */
85*53ee8cc1Swenshuai.xi #define IPPROTO_SCTP		IPPROTO_SCTP
86*53ee8cc1Swenshuai.xi     IPPROTO_RAW = 255,	   /* Raw IP packets.  */
87*53ee8cc1Swenshuai.xi #define IPPROTO_RAW		IPPROTO_RAW
88*53ee8cc1Swenshuai.xi     IPPROTO_MAX
89*53ee8cc1Swenshuai.xi   };
90*53ee8cc1Swenshuai.xi 
91*53ee8cc1Swenshuai.xi 
92*53ee8cc1Swenshuai.xi /* Type to represent a port.  */
93*53ee8cc1Swenshuai.xi typedef uint16_t in_port_t;
94*53ee8cc1Swenshuai.xi 
95*53ee8cc1Swenshuai.xi /* Standard well-known ports.  */
96*53ee8cc1Swenshuai.xi enum
97*53ee8cc1Swenshuai.xi   {
98*53ee8cc1Swenshuai.xi     IPPORT_ECHO = 7,		/* Echo service.  */
99*53ee8cc1Swenshuai.xi     IPPORT_DISCARD = 9,		/* Discard transmissions service.  */
100*53ee8cc1Swenshuai.xi     IPPORT_SYSTAT = 11,		/* System status service.  */
101*53ee8cc1Swenshuai.xi     IPPORT_DAYTIME = 13,	/* Time of day service.  */
102*53ee8cc1Swenshuai.xi     IPPORT_NETSTAT = 15,	/* Network status service.  */
103*53ee8cc1Swenshuai.xi     IPPORT_FTP = 21,		/* File Transfer Protocol.  */
104*53ee8cc1Swenshuai.xi     IPPORT_TELNET = 23,		/* Telnet protocol.  */
105*53ee8cc1Swenshuai.xi     IPPORT_SMTP = 25,		/* Simple Mail Transfer Protocol.  */
106*53ee8cc1Swenshuai.xi     IPPORT_TIMESERVER = 37,	/* Timeserver service.  */
107*53ee8cc1Swenshuai.xi     IPPORT_NAMESERVER = 42,	/* Domain Name Service.  */
108*53ee8cc1Swenshuai.xi     IPPORT_WHOIS = 43,		/* Internet Whois service.  */
109*53ee8cc1Swenshuai.xi     IPPORT_MTP = 57,
110*53ee8cc1Swenshuai.xi 
111*53ee8cc1Swenshuai.xi     IPPORT_TFTP = 69,		/* Trivial File Transfer Protocol.  */
112*53ee8cc1Swenshuai.xi     IPPORT_RJE = 77,
113*53ee8cc1Swenshuai.xi     IPPORT_FINGER = 79,		/* Finger service.  */
114*53ee8cc1Swenshuai.xi     IPPORT_TTYLINK = 87,
115*53ee8cc1Swenshuai.xi     IPPORT_SUPDUP = 95,		/* SUPDUP protocol.  */
116*53ee8cc1Swenshuai.xi 
117*53ee8cc1Swenshuai.xi 
118*53ee8cc1Swenshuai.xi     IPPORT_EXECSERVER = 512,	/* execd service.  */
119*53ee8cc1Swenshuai.xi     IPPORT_LOGINSERVER = 513,	/* rlogind service.  */
120*53ee8cc1Swenshuai.xi     IPPORT_CMDSERVER = 514,
121*53ee8cc1Swenshuai.xi     IPPORT_EFSSERVER = 520,
122*53ee8cc1Swenshuai.xi 
123*53ee8cc1Swenshuai.xi     /* UDP ports.  */
124*53ee8cc1Swenshuai.xi     IPPORT_BIFFUDP = 512,
125*53ee8cc1Swenshuai.xi     IPPORT_WHOSERVER = 513,
126*53ee8cc1Swenshuai.xi     IPPORT_ROUTESERVER = 520,
127*53ee8cc1Swenshuai.xi 
128*53ee8cc1Swenshuai.xi     /* Ports less than this value are reserved for privileged processes.  */
129*53ee8cc1Swenshuai.xi     IPPORT_RESERVED = 1024,
130*53ee8cc1Swenshuai.xi 
131*53ee8cc1Swenshuai.xi     /* Ports greater this value are reserved for (non-privileged) servers.  */
132*53ee8cc1Swenshuai.xi     IPPORT_USERRESERVED = 5000
133*53ee8cc1Swenshuai.xi   };
134*53ee8cc1Swenshuai.xi 
135*53ee8cc1Swenshuai.xi 
136*53ee8cc1Swenshuai.xi /* Internet address.  */
137*53ee8cc1Swenshuai.xi typedef uint32_t in_addr_t;
138*53ee8cc1Swenshuai.xi struct in_addr
139*53ee8cc1Swenshuai.xi   {
140*53ee8cc1Swenshuai.xi     in_addr_t s_addr;
141*53ee8cc1Swenshuai.xi   };
142*53ee8cc1Swenshuai.xi 
143*53ee8cc1Swenshuai.xi 
144*53ee8cc1Swenshuai.xi /* Definitions of the bits in an Internet address integer.
145*53ee8cc1Swenshuai.xi 
146*53ee8cc1Swenshuai.xi    On subnets, host and network parts are found according to
147*53ee8cc1Swenshuai.xi    the subnet mask, not these masks.  */
148*53ee8cc1Swenshuai.xi 
149*53ee8cc1Swenshuai.xi #define	IN_CLASSA(a)		((((in_addr_t)(a)) & 0x80000000) == 0)
150*53ee8cc1Swenshuai.xi #define	IN_CLASSA_NET		0xff000000
151*53ee8cc1Swenshuai.xi #define	IN_CLASSA_NSHIFT	24
152*53ee8cc1Swenshuai.xi #define	IN_CLASSA_HOST		(0xffffffff & ~IN_CLASSA_NET)
153*53ee8cc1Swenshuai.xi #define	IN_CLASSA_MAX		128
154*53ee8cc1Swenshuai.xi 
155*53ee8cc1Swenshuai.xi #define	IN_CLASSB(a)		((((in_addr_t)(a)) & 0xc0000000) == 0x80000000)
156*53ee8cc1Swenshuai.xi #define	IN_CLASSB_NET		0xffff0000
157*53ee8cc1Swenshuai.xi #define	IN_CLASSB_NSHIFT	16
158*53ee8cc1Swenshuai.xi #define	IN_CLASSB_HOST		(0xffffffff & ~IN_CLASSB_NET)
159*53ee8cc1Swenshuai.xi #define	IN_CLASSB_MAX		65536
160*53ee8cc1Swenshuai.xi 
161*53ee8cc1Swenshuai.xi #define	IN_CLASSC(a)		((((in_addr_t)(a)) & 0xe0000000) == 0xc0000000)
162*53ee8cc1Swenshuai.xi #define	IN_CLASSC_NET		0xffffff00
163*53ee8cc1Swenshuai.xi #define	IN_CLASSC_NSHIFT	8
164*53ee8cc1Swenshuai.xi #define	IN_CLASSC_HOST		(0xffffffff & ~IN_CLASSC_NET)
165*53ee8cc1Swenshuai.xi 
166*53ee8cc1Swenshuai.xi #define	IN_CLASSD(a)		((((in_addr_t)(a)) & 0xf0000000) == 0xe0000000)
167*53ee8cc1Swenshuai.xi #define	IN_MULTICAST(a)		IN_CLASSD(a)
168*53ee8cc1Swenshuai.xi 
169*53ee8cc1Swenshuai.xi #define	IN_EXPERIMENTAL(a)	((((in_addr_t)(a)) & 0xe0000000) == 0xe0000000)
170*53ee8cc1Swenshuai.xi #define	IN_BADCLASS(a)		((((in_addr_t)(a)) & 0xf0000000) == 0xf0000000)
171*53ee8cc1Swenshuai.xi 
172*53ee8cc1Swenshuai.xi /* Address to accept any incoming messages.  */
173*53ee8cc1Swenshuai.xi #define	INADDR_ANY		((in_addr_t) 0x00000000)
174*53ee8cc1Swenshuai.xi /* Address to send to all hosts.  */
175*53ee8cc1Swenshuai.xi #define	INADDR_BROADCAST	((in_addr_t) 0xffffffff)
176*53ee8cc1Swenshuai.xi /* Address indicating an error return.  */
177*53ee8cc1Swenshuai.xi #define	INADDR_NONE		((in_addr_t) 0xffffffff)
178*53ee8cc1Swenshuai.xi 
179*53ee8cc1Swenshuai.xi /* Network number for local host loopback.  */
180*53ee8cc1Swenshuai.xi #define	IN_LOOPBACKNET		127
181*53ee8cc1Swenshuai.xi /* Address to loopback in software to local host.  */
182*53ee8cc1Swenshuai.xi #ifndef INADDR_LOOPBACK
183*53ee8cc1Swenshuai.xi # define INADDR_LOOPBACK	((in_addr_t) 0x7f000001) /* Inet 127.0.0.1.  */
184*53ee8cc1Swenshuai.xi #endif
185*53ee8cc1Swenshuai.xi 
186*53ee8cc1Swenshuai.xi /* Defines for Multicast INADDR.  */
187*53ee8cc1Swenshuai.xi #define INADDR_UNSPEC_GROUP	((in_addr_t) 0xe0000000) /* 224.0.0.0 */
188*53ee8cc1Swenshuai.xi #define INADDR_ALLHOSTS_GROUP	((in_addr_t) 0xe0000001) /* 224.0.0.1 */
189*53ee8cc1Swenshuai.xi #define INADDR_ALLRTRS_GROUP    ((in_addr_t) 0xe0000002) /* 224.0.0.2 */
190*53ee8cc1Swenshuai.xi #define INADDR_MAX_LOCAL_GROUP  ((in_addr_t) 0xe00000ff) /* 224.0.0.255 */
191*53ee8cc1Swenshuai.xi 
192*53ee8cc1Swenshuai.xi 
193*53ee8cc1Swenshuai.xi /* IPv6 address */
194*53ee8cc1Swenshuai.xi struct in6_addr
195*53ee8cc1Swenshuai.xi   {
196*53ee8cc1Swenshuai.xi     union
197*53ee8cc1Swenshuai.xi       {
198*53ee8cc1Swenshuai.xi 	uint8_t	__u6_addr8[16];
199*53ee8cc1Swenshuai.xi #if defined __USE_MISC || defined __USE_GNU
200*53ee8cc1Swenshuai.xi 	uint16_t __u6_addr16[8];
201*53ee8cc1Swenshuai.xi 	uint32_t __u6_addr32[4];
202*53ee8cc1Swenshuai.xi #endif
203*53ee8cc1Swenshuai.xi       } __in6_u;
204*53ee8cc1Swenshuai.xi #define s6_addr			__in6_u.__u6_addr8
205*53ee8cc1Swenshuai.xi #if defined __USE_MISC || defined __USE_GNU
206*53ee8cc1Swenshuai.xi # define s6_addr16		__in6_u.__u6_addr16
207*53ee8cc1Swenshuai.xi # define s6_addr32		__in6_u.__u6_addr32
208*53ee8cc1Swenshuai.xi #endif
209*53ee8cc1Swenshuai.xi   };
210*53ee8cc1Swenshuai.xi 
211*53ee8cc1Swenshuai.xi extern const struct in6_addr in6addr_any;        /* :: */
212*53ee8cc1Swenshuai.xi extern const struct in6_addr in6addr_loopback;   /* ::1 */
213*53ee8cc1Swenshuai.xi #define IN6ADDR_ANY_INIT { { { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 } } }
214*53ee8cc1Swenshuai.xi #define IN6ADDR_LOOPBACK_INIT { { { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 } } }
215*53ee8cc1Swenshuai.xi 
216*53ee8cc1Swenshuai.xi #define INET_ADDRSTRLEN 16
217*53ee8cc1Swenshuai.xi #define INET6_ADDRSTRLEN 46
218*53ee8cc1Swenshuai.xi 
219*53ee8cc1Swenshuai.xi 
220*53ee8cc1Swenshuai.xi /* Structure describing an Internet socket address.  */
221*53ee8cc1Swenshuai.xi struct sockaddr_in
222*53ee8cc1Swenshuai.xi   {
223*53ee8cc1Swenshuai.xi     __SOCKADDR_COMMON (sin_);
224*53ee8cc1Swenshuai.xi     in_port_t sin_port;			/* Port number.  */
225*53ee8cc1Swenshuai.xi     struct in_addr sin_addr;		/* Internet address.  */
226*53ee8cc1Swenshuai.xi 
227*53ee8cc1Swenshuai.xi     /* Pad to size of `struct sockaddr'.  */
228*53ee8cc1Swenshuai.xi     unsigned char sin_zero[sizeof (struct sockaddr) -
229*53ee8cc1Swenshuai.xi 			   __SOCKADDR_COMMON_SIZE -
230*53ee8cc1Swenshuai.xi 			   sizeof (in_port_t) -
231*53ee8cc1Swenshuai.xi 			   sizeof (struct in_addr)];
232*53ee8cc1Swenshuai.xi   };
233*53ee8cc1Swenshuai.xi 
234*53ee8cc1Swenshuai.xi /* Ditto, for IPv6.  */
235*53ee8cc1Swenshuai.xi struct sockaddr_in6
236*53ee8cc1Swenshuai.xi   {
237*53ee8cc1Swenshuai.xi     __SOCKADDR_COMMON (sin6_);
238*53ee8cc1Swenshuai.xi     in_port_t sin6_port;	/* Transport layer port # */
239*53ee8cc1Swenshuai.xi     uint32_t sin6_flowinfo;	/* IPv6 flow information */
240*53ee8cc1Swenshuai.xi     struct in6_addr sin6_addr;	/* IPv6 address */
241*53ee8cc1Swenshuai.xi     uint32_t sin6_scope_id;	/* IPv6 scope-id */
242*53ee8cc1Swenshuai.xi   };
243*53ee8cc1Swenshuai.xi 
244*53ee8cc1Swenshuai.xi 
245*53ee8cc1Swenshuai.xi #if defined __USE_MISC || defined __USE_GNU
246*53ee8cc1Swenshuai.xi /* IPv4 multicast request.  */
247*53ee8cc1Swenshuai.xi struct ip_mreq
248*53ee8cc1Swenshuai.xi   {
249*53ee8cc1Swenshuai.xi     /* IP multicast address of group.  */
250*53ee8cc1Swenshuai.xi     struct in_addr imr_multiaddr;
251*53ee8cc1Swenshuai.xi 
252*53ee8cc1Swenshuai.xi     /* Local IP address of interface.  */
253*53ee8cc1Swenshuai.xi     struct in_addr imr_interface;
254*53ee8cc1Swenshuai.xi   };
255*53ee8cc1Swenshuai.xi 
256*53ee8cc1Swenshuai.xi struct ip_mreq_source
257*53ee8cc1Swenshuai.xi   {
258*53ee8cc1Swenshuai.xi     /* IP multicast address of group.  */
259*53ee8cc1Swenshuai.xi     struct in_addr imr_multiaddr;
260*53ee8cc1Swenshuai.xi 
261*53ee8cc1Swenshuai.xi     /* IP address of source.  */
262*53ee8cc1Swenshuai.xi     struct in_addr imr_interface;
263*53ee8cc1Swenshuai.xi 
264*53ee8cc1Swenshuai.xi     /* IP address of interface.  */
265*53ee8cc1Swenshuai.xi     struct in_addr imr_sourceaddr;
266*53ee8cc1Swenshuai.xi   };
267*53ee8cc1Swenshuai.xi #endif
268*53ee8cc1Swenshuai.xi 
269*53ee8cc1Swenshuai.xi 
270*53ee8cc1Swenshuai.xi /* Likewise, for IPv6.  */
271*53ee8cc1Swenshuai.xi struct ipv6_mreq
272*53ee8cc1Swenshuai.xi   {
273*53ee8cc1Swenshuai.xi     /* IPv6 multicast address of group */
274*53ee8cc1Swenshuai.xi     struct in6_addr ipv6mr_multiaddr;
275*53ee8cc1Swenshuai.xi 
276*53ee8cc1Swenshuai.xi     /* local interface */
277*53ee8cc1Swenshuai.xi     unsigned int ipv6mr_interface;
278*53ee8cc1Swenshuai.xi   };
279*53ee8cc1Swenshuai.xi 
280*53ee8cc1Swenshuai.xi 
281*53ee8cc1Swenshuai.xi #if defined __USE_MISC || defined __USE_GNU
282*53ee8cc1Swenshuai.xi /* Multicast group request.  */
283*53ee8cc1Swenshuai.xi struct group_req
284*53ee8cc1Swenshuai.xi   {
285*53ee8cc1Swenshuai.xi     /* Interface index.  */
286*53ee8cc1Swenshuai.xi     uint32_t gr_interface;
287*53ee8cc1Swenshuai.xi 
288*53ee8cc1Swenshuai.xi     /* Group address.  */
289*53ee8cc1Swenshuai.xi     struct sockaddr_storage gr_group;
290*53ee8cc1Swenshuai.xi   };
291*53ee8cc1Swenshuai.xi 
292*53ee8cc1Swenshuai.xi struct group_source_req
293*53ee8cc1Swenshuai.xi   {
294*53ee8cc1Swenshuai.xi     /* Interface index.  */
295*53ee8cc1Swenshuai.xi     uint32_t gsr_interface;
296*53ee8cc1Swenshuai.xi 
297*53ee8cc1Swenshuai.xi     /* Group address.  */
298*53ee8cc1Swenshuai.xi     struct sockaddr_storage gsr_group;
299*53ee8cc1Swenshuai.xi 
300*53ee8cc1Swenshuai.xi     /* Source address.  */
301*53ee8cc1Swenshuai.xi     struct sockaddr_storage gsr_source;
302*53ee8cc1Swenshuai.xi   };
303*53ee8cc1Swenshuai.xi 
304*53ee8cc1Swenshuai.xi 
305*53ee8cc1Swenshuai.xi /* Full-state filter operations.  */
306*53ee8cc1Swenshuai.xi struct ip_msfilter
307*53ee8cc1Swenshuai.xi   {
308*53ee8cc1Swenshuai.xi     /* IP multicast address of group.  */
309*53ee8cc1Swenshuai.xi     struct in_addr imsf_multiaddr;
310*53ee8cc1Swenshuai.xi 
311*53ee8cc1Swenshuai.xi     /* Local IP address of interface.  */
312*53ee8cc1Swenshuai.xi     struct in_addr imsf_interface;
313*53ee8cc1Swenshuai.xi 
314*53ee8cc1Swenshuai.xi     /* Filter mode.  */
315*53ee8cc1Swenshuai.xi     uint32_t imsf_fmode;
316*53ee8cc1Swenshuai.xi 
317*53ee8cc1Swenshuai.xi     /* Number of source addresses.  */
318*53ee8cc1Swenshuai.xi     uint32_t imsf_numsrc;
319*53ee8cc1Swenshuai.xi     /* Source addresses.  */
320*53ee8cc1Swenshuai.xi     struct in_addr imsf_slist[1];
321*53ee8cc1Swenshuai.xi   };
322*53ee8cc1Swenshuai.xi 
323*53ee8cc1Swenshuai.xi #define IP_MSFILTER_SIZE(numsrc) (sizeof (struct ip_msfilter) \
324*53ee8cc1Swenshuai.xi 				  - sizeof (struct in_addr)		      \
325*53ee8cc1Swenshuai.xi 				  + (numsrc) * sizeof (struct in_addr))
326*53ee8cc1Swenshuai.xi 
327*53ee8cc1Swenshuai.xi struct group_filter
328*53ee8cc1Swenshuai.xi   {
329*53ee8cc1Swenshuai.xi     /* Interface index.  */
330*53ee8cc1Swenshuai.xi     uint32_t gf_interface;
331*53ee8cc1Swenshuai.xi 
332*53ee8cc1Swenshuai.xi     /* Group address.  */
333*53ee8cc1Swenshuai.xi     struct sockaddr_storage gf_group;
334*53ee8cc1Swenshuai.xi 
335*53ee8cc1Swenshuai.xi     /* Filter mode.  */
336*53ee8cc1Swenshuai.xi     uint32_t gf_fmode;
337*53ee8cc1Swenshuai.xi 
338*53ee8cc1Swenshuai.xi     /* Number of source addresses.  */
339*53ee8cc1Swenshuai.xi     uint32_t gf_numsrc;
340*53ee8cc1Swenshuai.xi     /* Source addresses.  */
341*53ee8cc1Swenshuai.xi     struct sockaddr_storage gf_slist[1];
342*53ee8cc1Swenshuai.xi };
343*53ee8cc1Swenshuai.xi 
344*53ee8cc1Swenshuai.xi #define GROUP_FILTER_SIZE(numsrc) (sizeof (struct group_filter) \
345*53ee8cc1Swenshuai.xi 				   - sizeof (struct sockaddr_storage)	      \
346*53ee8cc1Swenshuai.xi 				   + ((numsrc)				      \
347*53ee8cc1Swenshuai.xi 				      * sizeof (struct sockaddr_storage)))
348*53ee8cc1Swenshuai.xi #endif
349*53ee8cc1Swenshuai.xi 
350*53ee8cc1Swenshuai.xi 
351*53ee8cc1Swenshuai.xi /* Get system-specific definitions.  */
352*53ee8cc1Swenshuai.xi #include <bits/in.h>
353*53ee8cc1Swenshuai.xi 
354*53ee8cc1Swenshuai.xi /* Functions to convert between host and network byte order.
355*53ee8cc1Swenshuai.xi 
356*53ee8cc1Swenshuai.xi    Please note that these functions normally take `unsigned long int' or
357*53ee8cc1Swenshuai.xi    `unsigned short int' values as arguments and also return them.  But
358*53ee8cc1Swenshuai.xi    this was a short-sighted decision since on different systems the types
359*53ee8cc1Swenshuai.xi    may have different representations but the values are always the same.  */
360*53ee8cc1Swenshuai.xi 
361*53ee8cc1Swenshuai.xi extern uint32_t ntohl (uint32_t __netlong) __THROW __attribute__ ((__const__));
362*53ee8cc1Swenshuai.xi extern uint16_t ntohs (uint16_t __netshort)
363*53ee8cc1Swenshuai.xi      __THROW __attribute__ ((__const__));
364*53ee8cc1Swenshuai.xi extern uint32_t htonl (uint32_t __hostlong)
365*53ee8cc1Swenshuai.xi      __THROW __attribute__ ((__const__));
366*53ee8cc1Swenshuai.xi extern uint16_t htons (uint16_t __hostshort)
367*53ee8cc1Swenshuai.xi      __THROW __attribute__ ((__const__));
368*53ee8cc1Swenshuai.xi 
369*53ee8cc1Swenshuai.xi #include <endian.h>
370*53ee8cc1Swenshuai.xi 
371*53ee8cc1Swenshuai.xi /* Get machine dependent optimized versions of byte swapping functions.  */
372*53ee8cc1Swenshuai.xi #include <bits/byteswap.h>
373*53ee8cc1Swenshuai.xi 
374*53ee8cc1Swenshuai.xi #ifdef __OPTIMIZE__
375*53ee8cc1Swenshuai.xi /* We can optimize calls to the conversion functions.  Either nothing has
376*53ee8cc1Swenshuai.xi    to be done or we are using directly the byte-swapping functions which
377*53ee8cc1Swenshuai.xi    often can be inlined.  */
378*53ee8cc1Swenshuai.xi # if __BYTE_ORDER == __BIG_ENDIAN
379*53ee8cc1Swenshuai.xi /* The host byte order is the same as network byte order,
380*53ee8cc1Swenshuai.xi    so these functions are all just identity.  */
381*53ee8cc1Swenshuai.xi # define ntohl(x)	(x)
382*53ee8cc1Swenshuai.xi # define ntohs(x)	(x)
383*53ee8cc1Swenshuai.xi # define htonl(x)	(x)
384*53ee8cc1Swenshuai.xi # define htons(x)	(x)
385*53ee8cc1Swenshuai.xi # else
386*53ee8cc1Swenshuai.xi #  if __BYTE_ORDER == __LITTLE_ENDIAN
387*53ee8cc1Swenshuai.xi #   define ntohl(x)	__bswap_32 (x)
388*53ee8cc1Swenshuai.xi #   define ntohs(x)	__bswap_16 (x)
389*53ee8cc1Swenshuai.xi #   define htonl(x)	__bswap_32 (x)
390*53ee8cc1Swenshuai.xi #   define htons(x)	__bswap_16 (x)
391*53ee8cc1Swenshuai.xi #  endif
392*53ee8cc1Swenshuai.xi # endif
393*53ee8cc1Swenshuai.xi #endif
394*53ee8cc1Swenshuai.xi 
395*53ee8cc1Swenshuai.xi #define IN6_IS_ADDR_UNSPECIFIED(a) \
396*53ee8cc1Swenshuai.xi 	(((__const uint32_t *) (a))[0] == 0				      \
397*53ee8cc1Swenshuai.xi 	 && ((__const uint32_t *) (a))[1] == 0				      \
398*53ee8cc1Swenshuai.xi 	 && ((__const uint32_t *) (a))[2] == 0				      \
399*53ee8cc1Swenshuai.xi 	 && ((__const uint32_t *) (a))[3] == 0)
400*53ee8cc1Swenshuai.xi 
401*53ee8cc1Swenshuai.xi #define IN6_IS_ADDR_LOOPBACK(a) \
402*53ee8cc1Swenshuai.xi 	(((__const uint32_t *) (a))[0] == 0				      \
403*53ee8cc1Swenshuai.xi 	 && ((__const uint32_t *) (a))[1] == 0				      \
404*53ee8cc1Swenshuai.xi 	 && ((__const uint32_t *) (a))[2] == 0				      \
405*53ee8cc1Swenshuai.xi 	 && ((__const uint32_t *) (a))[3] == htonl (1))
406*53ee8cc1Swenshuai.xi 
407*53ee8cc1Swenshuai.xi #define IN6_IS_ADDR_MULTICAST(a) (((__const uint8_t *) (a))[0] == 0xff)
408*53ee8cc1Swenshuai.xi 
409*53ee8cc1Swenshuai.xi #define IN6_IS_ADDR_LINKLOCAL(a) \
410*53ee8cc1Swenshuai.xi 	((((__const uint32_t *) (a))[0] & htonl (0xffc00000))		      \
411*53ee8cc1Swenshuai.xi 	 == htonl (0xfe800000))
412*53ee8cc1Swenshuai.xi 
413*53ee8cc1Swenshuai.xi #define IN6_IS_ADDR_SITELOCAL(a) \
414*53ee8cc1Swenshuai.xi 	((((__const uint32_t *) (a))[0] & htonl (0xffc00000))		      \
415*53ee8cc1Swenshuai.xi 	 == htonl (0xfec00000))
416*53ee8cc1Swenshuai.xi 
417*53ee8cc1Swenshuai.xi #define IN6_IS_ADDR_V4MAPPED(a) \
418*53ee8cc1Swenshuai.xi 	((((__const uint32_t *) (a))[0] == 0)				      \
419*53ee8cc1Swenshuai.xi 	 && (((__const uint32_t *) (a))[1] == 0)			      \
420*53ee8cc1Swenshuai.xi 	 && (((__const uint32_t *) (a))[2] == htonl (0xffff)))
421*53ee8cc1Swenshuai.xi 
422*53ee8cc1Swenshuai.xi #define IN6_IS_ADDR_V4COMPAT(a) \
423*53ee8cc1Swenshuai.xi 	((((__const uint32_t *) (a))[0] == 0)				      \
424*53ee8cc1Swenshuai.xi 	 && (((__const uint32_t *) (a))[1] == 0)			      \
425*53ee8cc1Swenshuai.xi 	 && (((__const uint32_t *) (a))[2] == 0)			      \
426*53ee8cc1Swenshuai.xi 	 && (ntohl (((__const uint32_t *) (a))[3]) > 1))
427*53ee8cc1Swenshuai.xi 
428*53ee8cc1Swenshuai.xi #define IN6_ARE_ADDR_EQUAL(a,b) \
429*53ee8cc1Swenshuai.xi 	((((__const uint32_t *) (a))[0] == ((__const uint32_t *) (b))[0])     \
430*53ee8cc1Swenshuai.xi 	 && (((__const uint32_t *) (a))[1] == ((__const uint32_t *) (b))[1])  \
431*53ee8cc1Swenshuai.xi 	 && (((__const uint32_t *) (a))[2] == ((__const uint32_t *) (b))[2])  \
432*53ee8cc1Swenshuai.xi 	 && (((__const uint32_t *) (a))[3] == ((__const uint32_t *) (b))[3]))
433*53ee8cc1Swenshuai.xi 
434*53ee8cc1Swenshuai.xi #if defined __USE_MISC || defined __USE_GNU
435*53ee8cc1Swenshuai.xi /* Bind socket to a privileged IP port.  */
436*53ee8cc1Swenshuai.xi extern int bindresvport (int __sockfd, struct sockaddr_in *__sock_in) __THROW;
437*53ee8cc1Swenshuai.xi 
438*53ee8cc1Swenshuai.xi /* The IPv6 version of this function.  */
439*53ee8cc1Swenshuai.xi extern int bindresvport6 (int __sockfd, struct sockaddr_in6 *__sock_in)
440*53ee8cc1Swenshuai.xi      __THROW;
441*53ee8cc1Swenshuai.xi #endif
442*53ee8cc1Swenshuai.xi 
443*53ee8cc1Swenshuai.xi 
444*53ee8cc1Swenshuai.xi #define IN6_IS_ADDR_MC_NODELOCAL(a) \
445*53ee8cc1Swenshuai.xi 	(IN6_IS_ADDR_MULTICAST(a)					      \
446*53ee8cc1Swenshuai.xi 	 && ((((__const uint8_t *) (a))[1] & 0xf) == 0x1))
447*53ee8cc1Swenshuai.xi 
448*53ee8cc1Swenshuai.xi #define IN6_IS_ADDR_MC_LINKLOCAL(a) \
449*53ee8cc1Swenshuai.xi 	(IN6_IS_ADDR_MULTICAST(a)					      \
450*53ee8cc1Swenshuai.xi 	 && ((((__const uint8_t *) (a))[1] & 0xf) == 0x2))
451*53ee8cc1Swenshuai.xi 
452*53ee8cc1Swenshuai.xi #define IN6_IS_ADDR_MC_SITELOCAL(a) \
453*53ee8cc1Swenshuai.xi 	(IN6_IS_ADDR_MULTICAST(a)					      \
454*53ee8cc1Swenshuai.xi 	 && ((((__const uint8_t *) (a))[1] & 0xf) == 0x5))
455*53ee8cc1Swenshuai.xi 
456*53ee8cc1Swenshuai.xi #define IN6_IS_ADDR_MC_ORGLOCAL(a) \
457*53ee8cc1Swenshuai.xi 	(IN6_IS_ADDR_MULTICAST(a)					      \
458*53ee8cc1Swenshuai.xi 	 && ((((__const uint8_t *) (a))[1] & 0xf) == 0x8))
459*53ee8cc1Swenshuai.xi 
460*53ee8cc1Swenshuai.xi #define IN6_IS_ADDR_MC_GLOBAL(a) \
461*53ee8cc1Swenshuai.xi 	(IN6_IS_ADDR_MULTICAST(a)					      \
462*53ee8cc1Swenshuai.xi 	 && ((((__const uint8_t *) (a))[1] & 0xf) == 0xe))
463*53ee8cc1Swenshuai.xi 
464*53ee8cc1Swenshuai.xi 
465*53ee8cc1Swenshuai.xi #ifdef __USE_GNU
466*53ee8cc1Swenshuai.xi /* IPv6 packet information.  */
467*53ee8cc1Swenshuai.xi struct in6_pktinfo
468*53ee8cc1Swenshuai.xi   {
469*53ee8cc1Swenshuai.xi     struct in6_addr ipi6_addr;	/* src/dst IPv6 address */
470*53ee8cc1Swenshuai.xi     unsigned int ipi6_ifindex;	/* send/recv interface index */
471*53ee8cc1Swenshuai.xi   };
472*53ee8cc1Swenshuai.xi 
473*53ee8cc1Swenshuai.xi /* IPv6 MTU information.  */
474*53ee8cc1Swenshuai.xi struct ip6_mtuinfo
475*53ee8cc1Swenshuai.xi   {
476*53ee8cc1Swenshuai.xi     struct sockaddr_in6 ip6m_addr; /* dst address including zone ID */
477*53ee8cc1Swenshuai.xi     uint32_t ip6m_mtu;		   /* path MTU in host byte order */
478*53ee8cc1Swenshuai.xi   };
479*53ee8cc1Swenshuai.xi 
480*53ee8cc1Swenshuai.xi 
481*53ee8cc1Swenshuai.xi /* Obsolete hop-by-hop and Destination Options Processing (RFC 2292).  */
482*53ee8cc1Swenshuai.xi extern int inet6_option_space (int __nbytes)
483*53ee8cc1Swenshuai.xi      __THROW __attribute_deprecated__;
484*53ee8cc1Swenshuai.xi extern int inet6_option_init (void *__bp, struct cmsghdr **__cmsgp,
485*53ee8cc1Swenshuai.xi 			      int __type) __THROW __attribute_deprecated__;
486*53ee8cc1Swenshuai.xi extern int inet6_option_append (struct cmsghdr *__cmsg,
487*53ee8cc1Swenshuai.xi 				__const uint8_t *__typep, int __multx,
488*53ee8cc1Swenshuai.xi 				int __plusy) __THROW __attribute_deprecated__;
489*53ee8cc1Swenshuai.xi extern uint8_t *inet6_option_alloc (struct cmsghdr *__cmsg, int __datalen,
490*53ee8cc1Swenshuai.xi 				    int __multx, int __plusy)
491*53ee8cc1Swenshuai.xi      __THROW __attribute_deprecated__;
492*53ee8cc1Swenshuai.xi extern int inet6_option_next (__const struct cmsghdr *__cmsg,
493*53ee8cc1Swenshuai.xi 			      uint8_t **__tptrp)
494*53ee8cc1Swenshuai.xi      __THROW __attribute_deprecated__;
495*53ee8cc1Swenshuai.xi extern int inet6_option_find (__const struct cmsghdr *__cmsg,
496*53ee8cc1Swenshuai.xi 			      uint8_t **__tptrp, int __type)
497*53ee8cc1Swenshuai.xi      __THROW __attribute_deprecated__;
498*53ee8cc1Swenshuai.xi 
499*53ee8cc1Swenshuai.xi 
500*53ee8cc1Swenshuai.xi /* Hop-by-Hop and Destination Options Processing (RFC 3542).  */
501*53ee8cc1Swenshuai.xi extern int inet6_opt_init (void *__extbuf, socklen_t __extlen) __THROW;
502*53ee8cc1Swenshuai.xi extern int inet6_opt_append (void *__extbuf, socklen_t __extlen, int __offset,
503*53ee8cc1Swenshuai.xi 			     uint8_t __type, socklen_t __len, uint8_t __align,
504*53ee8cc1Swenshuai.xi 			     void **__databufp) __THROW;
505*53ee8cc1Swenshuai.xi extern int inet6_opt_finish (void *__extbuf, socklen_t __extlen, int __offset)
506*53ee8cc1Swenshuai.xi      __THROW;
507*53ee8cc1Swenshuai.xi extern int inet6_opt_set_val (void *__databuf, int __offset, void *__val,
508*53ee8cc1Swenshuai.xi 			      socklen_t __vallen) __THROW;
509*53ee8cc1Swenshuai.xi extern int inet6_opt_next (void *__extbuf, socklen_t __extlen, int __offset,
510*53ee8cc1Swenshuai.xi 			   uint8_t *__typep, socklen_t *__lenp,
511*53ee8cc1Swenshuai.xi 			   void **__databufp) __THROW;
512*53ee8cc1Swenshuai.xi extern int inet6_opt_find (void *__extbuf, socklen_t __extlen, int __offset,
513*53ee8cc1Swenshuai.xi 			   uint8_t __type, socklen_t *__lenp,
514*53ee8cc1Swenshuai.xi 			   void **__databufp) __THROW;
515*53ee8cc1Swenshuai.xi extern int inet6_opt_get_val (void *__databuf, int __offset, void *__val,
516*53ee8cc1Swenshuai.xi 			      socklen_t __vallen) __THROW;
517*53ee8cc1Swenshuai.xi 
518*53ee8cc1Swenshuai.xi 
519*53ee8cc1Swenshuai.xi /* Routing Header Option (RFC 3542).  */
520*53ee8cc1Swenshuai.xi extern socklen_t inet6_rth_space (int __type, int __segments) __THROW;
521*53ee8cc1Swenshuai.xi extern void *inet6_rth_init (void *__bp, socklen_t __bp_len, int __type,
522*53ee8cc1Swenshuai.xi 			     int __segments) __THROW;
523*53ee8cc1Swenshuai.xi extern int inet6_rth_add (void *__bp, __const struct in6_addr *__addr) __THROW;
524*53ee8cc1Swenshuai.xi extern int inet6_rth_reverse (__const void *__in, void *__out) __THROW;
525*53ee8cc1Swenshuai.xi extern int inet6_rth_segments (__const void *__bp) __THROW;
526*53ee8cc1Swenshuai.xi extern struct in6_addr *inet6_rth_getaddr (__const void *__bp, int __index)
527*53ee8cc1Swenshuai.xi      __THROW;
528*53ee8cc1Swenshuai.xi 
529*53ee8cc1Swenshuai.xi 
530*53ee8cc1Swenshuai.xi /* Multicast source filter support.  */
531*53ee8cc1Swenshuai.xi 
532*53ee8cc1Swenshuai.xi /* Get IPv4 source filter.  */
533*53ee8cc1Swenshuai.xi extern int getipv4sourcefilter (int __s, struct in_addr __interface_addr,
534*53ee8cc1Swenshuai.xi 				struct in_addr __group, uint32_t *__fmode,
535*53ee8cc1Swenshuai.xi 				uint32_t *__numsrc, struct in_addr *__slist)
536*53ee8cc1Swenshuai.xi      __THROW;
537*53ee8cc1Swenshuai.xi 
538*53ee8cc1Swenshuai.xi /* Set IPv4 source filter.  */
539*53ee8cc1Swenshuai.xi extern int setipv4sourcefilter (int __s, struct in_addr __interface_addr,
540*53ee8cc1Swenshuai.xi 				struct in_addr __group, uint32_t __fmode,
541*53ee8cc1Swenshuai.xi 				uint32_t __numsrc,
542*53ee8cc1Swenshuai.xi 				__const struct in_addr *__slist)
543*53ee8cc1Swenshuai.xi      __THROW;
544*53ee8cc1Swenshuai.xi 
545*53ee8cc1Swenshuai.xi 
546*53ee8cc1Swenshuai.xi /* Get source filter.  */
547*53ee8cc1Swenshuai.xi extern int getsourcefilter (int __s, uint32_t __interface_addr,
548*53ee8cc1Swenshuai.xi 			    __const struct sockaddr *__group,
549*53ee8cc1Swenshuai.xi 			    socklen_t __grouplen, uint32_t *__fmode,
550*53ee8cc1Swenshuai.xi 			    uint32_t *__numsrc,
551*53ee8cc1Swenshuai.xi 			    struct sockaddr_storage *__slist) __THROW;
552*53ee8cc1Swenshuai.xi 
553*53ee8cc1Swenshuai.xi /* Set source filter.  */
554*53ee8cc1Swenshuai.xi extern int setsourcefilter (int __s, uint32_t __interface_addr,
555*53ee8cc1Swenshuai.xi 			    __const struct sockaddr *__group,
556*53ee8cc1Swenshuai.xi 			    socklen_t __grouplen, uint32_t __fmode,
557*53ee8cc1Swenshuai.xi 			    uint32_t __numsrc,
558*53ee8cc1Swenshuai.xi 			    __const struct sockaddr_storage *__slist) __THROW;
559*53ee8cc1Swenshuai.xi #endif	/* use GNU */
560*53ee8cc1Swenshuai.xi 
561*53ee8cc1Swenshuai.xi __END_DECLS
562*53ee8cc1Swenshuai.xi 
563*53ee8cc1Swenshuai.xi #endif	/* netinet/in.h */
564