Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
4680 right-hear 1
#ifndef _NETINET_IN_H
2
#define _NETINET_IN_H
3
 
4
#include 
5
#include 
6
#include 
7
 
8
__BEGIN_DECLS
9
 
10
/* Standard well-defined IP protocols.  */
11
enum {
12
  IPPROTO_IP = 0,		/* Dummy protocol for TCP		*/
13
#define IPPROTO_IP IPPROTO_IP
14
  IPPROTO_ICMP = 1,		/* Internet Control Message Protocol	*/
15
#define IPPROTO_ICMP IPPROTO_ICMP
16
  IPPROTO_IGMP = 2,		/* Internet Group Management Protocol	*/
17
#define IPPROTO_IGMP IPPROTO_IGMP
18
  IPPROTO_IPIP = 4,		/* IPIP tunnels (older KA9Q tunnels use 94) */
19
#define IPPROTO_IPIP IPPROTO_IPIP
20
  IPPROTO_TCP = 6,		/* Transmission Control Protocol	*/
21
#define IPPROTO_TCP IPPROTO_TCP
22
  IPPROTO_EGP = 8,		/* Exterior Gateway Protocol		*/
23
#define IPPROTO_EGP IPPROTO_EGP
24
  IPPROTO_PUP = 12,		/* PUP protocol				*/
25
#define IPPROTO_PUP IPPROTO_PUP
26
  IPPROTO_UDP = 17,		/* User Datagram Protocol		*/
27
#define IPPROTO_UDP IPPROTO_UDP
28
  IPPROTO_IDP = 22,		/* XNS IDP protocol			*/
29
#define IPPROTO_IDP IPPROTO_IDP
30
  IPPROTO_RSVP = 46,		/* RSVP protocol			*/
31
#define IPPROTO_RSVP IPPROTO_RSVP
32
  IPPROTO_GRE = 47,		/* Cisco GRE tunnels (rfc 1701,1702)	*/
33
#define IPPROTO_GRE IPPROTO_GRE
34
  IPPROTO_IPV6 = 41,		/* IPv6-in-IPv4 tunnelling		*/
35
#define IPPROTO_IPV6 IPPROTO_IPV6
36
  IPPROTO_PIM    = 103,		/* Protocol Independent Multicast	*/
37
#define IPPROTO_PIM IPPROTO_PIM
38
  IPPROTO_ESP = 50,            /* Encapsulation Security Payload protocol */
39
#define IPPROTO_ESP IPPROTO_ESP
40
  IPPROTO_AH = 51,             /* Authentication Header protocol       */
41
#define IPPROTO_AH IPPROTO_AH
42
  IPPROTO_COMP   = 108,                /* Compression Header protocol */
43
#define IPPROTO_COMP IPPROTO_COMP
44
  IPPROTO_RAW	 = 255,		/* Raw IP packets			*/
45
#define IPPROTO_RAW IPPROTO_RAW
46
  IPPROTO_MAX
47
};
48
 
49
#define IP_TOS		1
50
#define IP_TTL		2
51
#define IP_HDRINCL	3
52
#define IP_OPTIONS	4
53
#define IP_ROUTER_ALERT	5
54
#define IP_RECVOPTS	6
55
#define IP_RETOPTS	7
56
#define IP_PKTINFO	8
57
#define IP_PKTOPTIONS	9
58
#define IP_MTU_DISCOVER	10
59
#define IP_RECVERR	11
60
#define IP_RECVTTL	12
61
#define IP_RECVTOS	13
62
#define IP_MTU		14
63
#define IP_FREEBIND	15
64
 
65
/* BSD compatibility */
66
#define IP_RECVRETOPTS	IP_RETOPTS
67
 
68
/* IP_MTU_DISCOVER values */
69
#define IP_PMTUDISC_DONT		0	/* Never send DF frames */
70
#define IP_PMTUDISC_WANT		1	/* Use per route hints	*/
71
#define IP_PMTUDISC_DO			2	/* Always DF		*/
72
 
73
#define IP_MULTICAST_IF			32
74
#define IP_MULTICAST_TTL 		33
75
#define IP_MULTICAST_LOOP 		34
76
#define IP_ADD_MEMBERSHIP		35
77
#define IP_DROP_MEMBERSHIP		36
78
 
79
/* These need to appear somewhere around here */
80
#define IP_DEFAULT_MULTICAST_TTL        1
81
#define IP_DEFAULT_MULTICAST_LOOP       1
82
 
83
#define IN6ADDR_ANY_INIT {{{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }}}
84
#define IN6ADDR_LOOPBACK_INIT {{{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 }}}
85
extern const struct in6_addr in6addr_any;
86
extern const struct in6_addr in6addr_loopback;
87
 
88
typedef uint16_t in_port_t;
89
typedef uint32_t in_addr_t;
90
 
91
struct in_addr {
92
  in_addr_t s_addr;
93
};
94
 
95
struct ip_mreq {
96
  struct in_addr imr_multiaddr;	/* IP multicast address of group */
97
  struct in_addr imr_interface;	/* local IP address of interface */
98
};
99
 
100
struct ip_mreqn {
101
  struct in_addr	imr_multiaddr;		/* IP multicast address of group */
102
  struct in_addr	imr_address;		/* local IP address of interface */
103
  int			imr_ifindex;		/* Interface index */
104
};
105
 
106
struct in_pktinfo {
107
  int			ipi_ifindex;
108
  struct in_addr	ipi_spec_dst;
109
  struct in_addr	ipi_addr;
110
};
111
 
112
/* Structure describing an Internet (IP) socket address. */
113
#define __SOCK_SIZE__	16		/* sizeof(struct sockaddr)	*/
114
struct sockaddr_in {
115
  sa_family_t		sin_family;	/* Address family		*/
116
  in_port_t		sin_port;	/* Port number			*/
117
  struct in_addr	sin_addr;	/* Internet address		*/
118
  /* Pad to size of `struct sockaddr'. */
119
  unsigned char		sin_zero[__SOCK_SIZE__ - sizeof(short int) -
120
			sizeof(unsigned short int) - sizeof(struct in_addr)];
121
};
122
 
123
 
124
/*
125
 * Definitions of the bits in an Internet address integer.
126
 * On subnets, host and network parts are found according
127
 * to the subnet mask, not these masks.
128
 */
129
#define	IN_CLASSA(a)		((((long int) (a)) & 0x80000000) == 0)
130
#define	IN_CLASSA_NET		0xff000000
131
#define	IN_CLASSA_NSHIFT	24
132
#define	IN_CLASSA_HOST		(0xffffffff & ~IN_CLASSA_NET)
133
#define	IN_CLASSA_MAX		128
134
 
135
#define	IN_CLASSB(a)		((((long int) (a)) & 0xc0000000) == 0x80000000)
136
#define	IN_CLASSB_NET		0xffff0000
137
#define	IN_CLASSB_NSHIFT	16
138
#define	IN_CLASSB_HOST		(0xffffffff & ~IN_CLASSB_NET)
139
#define	IN_CLASSB_MAX		65536
140
 
141
#define	IN_CLASSC(a)		((((long int) (a)) & 0xe0000000) == 0xc0000000)
142
#define	IN_CLASSC_NET		0xffffff00
143
#define	IN_CLASSC_NSHIFT	8
144
#define	IN_CLASSC_HOST		(0xffffffff & ~IN_CLASSC_NET)
145
 
146
#define	IN_CLASSD(a)		((((long int) (a)) & 0xf0000000) == 0xe0000000)
147
#define	IN_MULTICAST(a)		IN_CLASSD(a)
148
#define IN_MULTICAST_NET	0xF0000000
149
 
150
#define	IN_EXPERIMENTAL(a)	((((long int) (a)) & 0xf0000000) == 0xf0000000)
151
#define	IN_BADCLASS(a)		IN_EXPERIMENTAL((a))
152
 
153
/* Address to accept any incoming messages. */
154
#define	INADDR_ANY		((unsigned long int) 0x00000000)
155
 
156
/* Address to send to all hosts. */
157
#define	INADDR_BROADCAST	((unsigned long int) 0xffffffff)
158
 
159
/* Address indicating an error return. */
160
#define	INADDR_NONE		((unsigned long int) 0xffffffff)
161
 
162
/* Network number for local host loopback. */
163
#define	IN_LOOPBACKNET		127
164
 
165
/* Address to loopback in software to local host.  */
166
#define	INADDR_LOOPBACK		0x7f000001	/* 127.0.0.1   */
167
#define	IN_LOOPBACK(a)		((((long int) (a)) & 0xff000000) == 0x7f000000)
168
 
169
/* Defines for Multicast INADDR */
170
#define INADDR_UNSPEC_GROUP   	0xe0000000U	/* 224.0.0.0   */
171
#define INADDR_ALLHOSTS_GROUP 	0xe0000001U	/* 224.0.0.1   */
172
#define INADDR_ALLRTRS_GROUP    0xe0000002U	/* 224.0.0.2 */
173
#define INADDR_MAX_LOCAL_GROUP  0xe00000ffU	/* 224.0.0.255 */
174
 
175
struct in6_addr {
176
  union {
177
    uint8_t		u6_addr8[16];
178
    uint16_t		u6_addr16[8];
179
    uint32_t		u6_addr32[4];
180
  } in6_u;
181
#define s6_addr			in6_u.u6_addr8
182
#define s6_addr16		in6_u.u6_addr16
183
#define s6_addr32		in6_u.u6_addr32
184
};
185
 
186
struct sockaddr_in6 {
187
  unsigned short int	sin6_family;    /* AF_INET6 */
188
  uint16_t		sin6_port;      /* Transport layer port # */
189
  uint32_t		sin6_flowinfo;  /* IPv6 flow information */
190
  struct in6_addr	sin6_addr;      /* IPv6 address */
191
  uint32_t		sin6_scope_id;  /* scope id (new in RFC2553) */
192
};
193
 
194
struct sockaddr_in_pad {
195
  sa_family_t		sin_family;	/* Address family		*/
196
  in_port_t		sin_port;	/* Port number			*/
197
  struct in_addr	sin_addr;	/* Internet address		*/
198
  /* Pad to size of `struct sockaddr_in6'. */
199
  unsigned char		sin_zero[sizeof(struct sockaddr_in6) - sizeof(short int) -
200
			sizeof(unsigned short int) - sizeof(struct in_addr)];
201
};
202
 
203
struct ipv6_mreq {
204
  /* IPv6 multicast address of group */
205
  struct in6_addr ipv6mr_multiaddr;
206
  /* local IPv6 address of interface */
207
  int ipv6mr_interface;
208
};
209
 
210
struct in6_flowlabel_req {
211
  struct in6_addr	flr_dst;
212
  uint32_t	flr_label;
213
  uint8_t	flr_action;
214
  uint8_t	flr_share;
215
  uint16_t	flr_flags;
216
  uint16_t 	flr_expires;
217
  uint16_t	flr_linger;
218
  uint32_t	__flr_pad;
219
  /* Options in format of IPV6_PKTOPTIONS */
220
};
221
 
222
#define IPV6_FL_A_GET	0
223
#define IPV6_FL_A_PUT	1
224
#define IPV6_FL_A_RENEW	2
225
 
226
#define IPV6_FL_F_CREATE	1
227
#define IPV6_FL_F_EXCL		2
228
 
229
#define IPV6_FL_S_NONE		0
230
#define IPV6_FL_S_EXCL		1
231
#define IPV6_FL_S_PROCESS	2
232
#define IPV6_FL_S_USER		3
233
#define IPV6_FL_S_ANY		255
234
 
235
#define IPV6_FLOWINFO_FLOWLABEL		0x000fffff
236
#define IPV6_FLOWINFO_PRIORITY		0x0ff00000
237
 
238
/*
239
 *	IPV6 extension headers
240
 */
241
#define IPPROTO_HOPOPTS		0	/* IPv6 hop-by-hop options	*/
242
#define IPPROTO_ROUTING		43	/* IPv6 routing header		*/
243
#define IPPROTO_FRAGMENT	44	/* IPv6 fragmentation header	*/
244
#define IPPROTO_ICMPV6		58	/* ICMPv6			*/
245
#define IPPROTO_NONE		59	/* IPv6 no next header		*/
246
#define IPPROTO_DSTOPTS		60	/* IPv6 destination options	*/
247
 
248
/* IPv6 TLV options. */
249
#define IPV6_TLV_PAD0		0
250
#define IPV6_TLV_PADN		1
251
#define IPV6_TLV_ROUTERALERT	5
252
#define IPV6_TLV_JUMBO		194
253
 
254
/* IPV6 socket options. */
255
#define IPV6_ADDRFORM		1
256
#define IPV6_PKTINFO		2
257
#define IPV6_HOPOPTS		3
258
#define IPV6_DSTOPTS		4
259
#define IPV6_RTHDR		5
260
#define IPV6_PKTOPTIONS		6
261
#define IPV6_CHECKSUM		7
262
#define IPV6_HOPLIMIT		8
263
#define IPV6_NEXTHOP		9
264
#define IPV6_AUTHHDR		10
265
#define IPV6_FLOWINFO		11
266
 
267
#define IPV6_UNICAST_HOPS	16
268
#define IPV6_MULTICAST_IF	17
269
#define IPV6_MULTICAST_HOPS	18
270
#define IPV6_MULTICAST_LOOP	19
271
#define IPV6_ADD_MEMBERSHIP	20
272
#define IPV6_DROP_MEMBERSHIP	21
273
#define IPV6_ROUTER_ALERT	22
274
#define IPV6_MTU_DISCOVER	23
275
#define IPV6_MTU		24
276
#define IPV6_RECVERR		25
277
 
278
/* IPV6_MTU_DISCOVER values */
279
#define IPV6_PMTUDISC_DONT		0
280
#define IPV6_PMTUDISC_WANT		1
281
#define IPV6_PMTUDISC_DO		2
282
 
283
/* Flowlabel */
284
#define IPV6_FLOWLABEL_MGR	32
285
#define IPV6_FLOWINFO_SEND	33
286
 
287
#define IPV6_MIN_MTU	1280
288
 
289
struct in6_pktinfo {
290
  struct in6_addr	ipi6_addr;
291
  int		ipi6_ifindex;
292
};
293
 
294
struct in6_ifreq {
295
  struct in6_addr	ifr6_addr;
296
  uint32_t		ifr6_prefixlen;
297
  int		ifr6_ifindex;
298
};
299
 
300
#define IPV6_SRCRT_STRICT	0x01	/* this hop must be a neighbor	*/
301
#define IPV6_SRCRT_TYPE_0	0	/* IPv6 type 0 Routing Header	*/
302
 
303
/* routing header */
304
struct ipv6_rt_hdr {
305
  uint8_t		nexthdr;
306
  uint8_t		hdrlen;
307
  uint8_t		type;
308
  uint8_t		segments_left;
309
  /* type specific data, variable length field */
310
};
311
 
312
struct ipv6_opt_hdr {
313
  uint8_t 		nexthdr;
314
  uint8_t 		hdrlen;
315
  /* TLV encoded option data follows. */
316
};
317
 
318
#define ipv6_destopt_hdr ipv6_opt_hdr
319
#define ipv6_hopopt_hdr  ipv6_opt_hdr
320
 
321
/* routing header type 0 (used in cmsghdr struct) */
322
 
323
#ifndef __STRICT_ANSI__
324
struct rt0_hdr {
325
  struct ipv6_rt_hdr	rt_hdr;
326
  uint32_t		bitmap;		/* strict/loose bit map */
327
  struct in6_addr	addr[0];
328
#define rt0_type		rt_hdr.type;
329
};
330
#endif
331
 
332
struct ipv6hdr {
333
#if __BYTE_ORDER == __LITTLE_ENDIAN
334
  unsigned int		flow_lbl:20,
335
			priority:8,
336
			version:4;
337
#else
338
  unsigned int		version:4,
339
			priority:8,
340
			flow_lbl:20;
341
#endif
342
 
343
  uint16_t		payload_len;
344
  uint8_t		nexthdr;
345
  uint8_t		hop_limit;
346
 
347
  struct in6_addr	saddr;
348
  struct in6_addr	daddr;
349
};
350
/* fnord */
351
 
352
#define IPPORT_RESERVED 1024
353
#define INET6_ADDRSTRLEN 46
354
 
355
#undef htonl
356
#undef htons
357
#undef ntohl
358
#undef ntohs
359
uint32_t htonl(uint32_t hostlong);
360
uint16_t htons(uint16_t hostshort);
361
uint32_t ntohl(uint32_t netlong);
362
uint16_t ntohs(uint16_t netshort);
363
 
364
#define IN6_IS_ADDR_UNSPECIFIED(a) \
365
	(((__const uint32_t *) (a))[0] == 0				      \
366
	 && ((__const uint32_t *) (a))[1] == 0				      \
367
	 && ((__const uint32_t *) (a))[2] == 0				      \
368
	 && ((__const uint32_t *) (a))[3] == 0)
369
 
370
#define IN6_IS_ADDR_LOOPBACK(a) \
371
	(((__const uint32_t *) (a))[0] == 0				      \
372
	 && ((__const uint32_t *) (a))[1] == 0				      \
373
	 && ((__const uint32_t *) (a))[2] == 0				      \
374
	 && ((__const uint32_t *) (a))[3] == htonl (1))
375
 
376
#define IN6_IS_ADDR_MULTICAST(a) (((__const uint8_t *) (a))[0] == 0xff)
377
 
378
#define IN6_IS_ADDR_LINKLOCAL(a) \
379
	((((__const uint32_t *) (a))[0] & htonl (0xffc00000))		      \
380
	 == htonl (0xfe800000))
381
 
382
#define IN6_IS_ADDR_SITELOCAL(a) \
383
	((((__const uint32_t *) (a))[0] & htonl (0xffc00000))		      \
384
	 == htonl (0xfec00000))
385
 
386
#define IN6_IS_ADDR_V4MAPPED(a) \
387
	((((__const uint32_t *) (a))[0] == 0)				      \
388
	 && (((__const uint32_t *) (a))[1] == 0)			      \
389
	 && (((__const uint32_t *) (a))[2] == htonl (0xffff)))
390
 
391
#define IN6_IS_ADDR_V4COMPAT(a) \
392
	((((__const uint32_t *) (a))[0] == 0)				      \
393
	 && (((__const uint32_t *) (a))[1] == 0)			      \
394
	 && (((__const uint32_t *) (a))[2] == 0)			      \
395
	 && (ntohl (((__const uint32_t *) (a))[3]) > 1))
396
 
397
#define IN6_ARE_ADDR_EQUAL(a,b) \
398
	((((__const uint32_t *) (a))[0] == ((__const uint32_t *) (b))[0])     \
399
	 && (((__const uint32_t *) (a))[1] == ((__const uint32_t *) (b))[1])  \
400
	 && (((__const uint32_t *) (a))[2] == ((__const uint32_t *) (b))[2])  \
401
	 && (((__const uint32_t *) (a))[3] == ((__const uint32_t *) (b))[3]))
402
 
403
/* old legacy bullshit */
404
int bindresvport(int sd, struct sockaddr_in* _sin);
405
 
406
#define IN6_IS_ADDR_MC_NODELOCAL(a) \
407
	(IN6_IS_ADDR_MULTICAST(a)					      \
408
	 && ((((__const uint8_t *) (a))[1] & 0xf) == 0x1))
409
 
410
#define IN6_IS_ADDR_MC_LINKLOCAL(a) \
411
	(IN6_IS_ADDR_MULTICAST(a)					      \
412
	 && ((((__const uint8_t *) (a))[1] & 0xf) == 0x2))
413
 
414
#define IN6_IS_ADDR_MC_SITELOCAL(a) \
415
	(IN6_IS_ADDR_MULTICAST(a)					      \
416
	 && ((((__const uint8_t *) (a))[1] & 0xf) == 0x5))
417
 
418
#define IN6_IS_ADDR_MC_ORGLOCAL(a) \
419
	(IN6_IS_ADDR_MULTICAST(a)					      \
420
	 && ((((__const uint8_t *) (a))[1] & 0xf) == 0x8))
421
 
422
#define IN6_IS_ADDR_MC_GLOBAL(a) \
423
	(IN6_IS_ADDR_MULTICAST(a)					      \
424
	 && ((((__const uint8_t *) (a))[1] & 0xf) == 0xe))
425
 
426
__END_DECLS
427
 
428
#endif