in.h revision 12003
155714Skris/*
255714Skris * Copyright (c) 1982, 1986, 1990, 1993
355714Skris *	The Regents of the University of California.  All rights reserved.
455714Skris *
555714Skris * Redistribution and use in source and binary forms, with or without
655714Skris * modification, are permitted provided that the following conditions
755714Skris * are met:
855714Skris * 1. Redistributions of source code must retain the above copyright
955714Skris *    notice, this list of conditions and the following disclaimer.
1055714Skris * 2. Redistributions in binary form must reproduce the above copyright
1155714Skris *    notice, this list of conditions and the following disclaimer in the
1255714Skris *    documentation and/or other materials provided with the distribution.
1355714Skris * 3. All advertising materials mentioning features or use of this software
1455714Skris *    must display the following acknowledgement:
1555714Skris *	This product includes software developed by the University of
1655714Skris *	California, Berkeley and its contributors.
1755714Skris * 4. Neither the name of the University nor the names of its contributors
1855714Skris *    may be used to endorse or promote products derived from this software
1955714Skris *    without specific prior written permission.
2055714Skris *
2155714Skris * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
2255714Skris * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
2355714Skris * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
2455714Skris * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
2555714Skris * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
2655714Skris * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
2755714Skris * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
2855714Skris * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
2955714Skris * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
3055714Skris * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
3155714Skris * SUCH DAMAGE.
3255714Skris *
3355714Skris *	@(#)in.h	8.3 (Berkeley) 1/3/94
3455714Skris * $Id: in.h,v 1.11 1995/07/18 09:56:42 peter Exp $
3555714Skris */
3655714Skris
3755714Skris#ifndef _NETINET_IN_H_
3855714Skris#define _NETINET_IN_H_
3955714Skris
4055714Skris/*
4155714Skris * Constants and structures defined by the internet system,
4255714Skris * Per RFC 790, September 1981, and numerous additions.
4355714Skris */
4455714Skris
4555714Skris/*
4655714Skris * Protocols
4755714Skris */
4855714Skris#define	IPPROTO_IP		0		/* dummy for IP */
4955714Skris#define	IPPROTO_ICMP		1		/* control message protocol */
5055714Skris#define	IPPROTO_IGMP		2		/* group mgmt protocol */
5155714Skris#define	IPPROTO_GGP		3		/* gateway^2 (deprecated) */
5255714Skris#define IPPROTO_IPIP		4 		/* IP encapsulation in IP */
5355714Skris#define	IPPROTO_TCP		6		/* tcp */
5455714Skris#define	IPPROTO_EGP		8		/* exterior gateway protocol */
5555714Skris#define	IPPROTO_PUP		12		/* pup */
5655714Skris#define	IPPROTO_UDP		17		/* user datagram protocol */
5755714Skris#define	IPPROTO_IDP		22		/* xns idp */
5855714Skris#define	IPPROTO_TP		29 		/* tp-4 w/ class negotiation */
5955714Skris#define IPPROTO_RSVP		46 		/* resource reservation */
6055714Skris#define	IPPROTO_EON		80		/* ISO cnlp */
6155714Skris#define	IPPROTO_ENCAP		98		/* encapsulation header */
6255714Skris
6355714Skris#define	IPPROTO_RAW		255		/* raw IP packet */
6455714Skris#define	IPPROTO_MAX		256
6555714Skris
6655714Skris
6755714Skris/*
6855714Skris * Local port number conventions:
6955714Skris * Ports < IPPORT_RESERVED are reserved for
7055714Skris * privileged processes (e.g. root).
7155714Skris * Ports > IPPORT_USERRESERVED are reserved
7255714Skris * for servers, not necessarily privileged.
7355714Skris */
7455714Skris#define	IPPORT_RESERVED		1024
7555714Skris#define	IPPORT_USERRESERVED	5000
7655714Skris
7755714Skris/*
7855714Skris * Internet address (a structure for historical reasons)
7955714Skris */
8055714Skrisstruct in_addr {
8155714Skris	u_long s_addr;
8255714Skris};
8355714Skris
8455714Skris/*
8555714Skris * Definitions of bits in internet address integers.
8655714Skris * On subnets, the decomposition of addresses to host and net parts
8755714Skris * is done according to subnet mask, not the masks here.
8855714Skris */
8955714Skris#define	IN_CLASSA(i)		(((long)(i) & 0x80000000) == 0)
9055714Skris#define	IN_CLASSA_NET		0xff000000
9155714Skris#define	IN_CLASSA_NSHIFT	24
9255714Skris#define	IN_CLASSA_HOST		0x00ffffff
9355714Skris#define	IN_CLASSA_MAX		128
9455714Skris
9555714Skris#define	IN_CLASSB(i)		(((long)(i) & 0xc0000000) == 0x80000000)
9655714Skris#define	IN_CLASSB_NET		0xffff0000
9755714Skris#define	IN_CLASSB_NSHIFT	16
9855714Skris#define	IN_CLASSB_HOST		0x0000ffff
9955714Skris#define	IN_CLASSB_MAX		65536
10055714Skris
10155714Skris#define	IN_CLASSC(i)		(((long)(i) & 0xe0000000) == 0xc0000000)
10255714Skris#define	IN_CLASSC_NET		0xffffff00
10355714Skris#define	IN_CLASSC_NSHIFT	8
10455714Skris#define	IN_CLASSC_HOST		0x000000ff
10555714Skris
10655714Skris#define	IN_CLASSD(i)		(((long)(i) & 0xf0000000) == 0xe0000000)
10755714Skris#define	IN_CLASSD_NET		0xf0000000	/* These ones aren't really */
10855714Skris#define	IN_CLASSD_NSHIFT	28		/* net and host fields, but */
10955714Skris#define	IN_CLASSD_HOST		0x0fffffff	/* routing needn't know.    */
11055714Skris#define	IN_MULTICAST(i)		IN_CLASSD(i)
11155714Skris
11255714Skris#define	IN_EXPERIMENTAL(i)	(((long)(i) & 0xf0000000) == 0xf0000000)
11355714Skris#define	IN_BADCLASS(i)		(((long)(i) & 0xf0000000) == 0xf0000000)
11455714Skris
11555714Skris#define	INADDR_ANY		(u_long)0x00000000
11655714Skris#define	INADDR_BROADCAST	(u_long)0xffffffff	/* must be masked */
11755714Skris#ifndef KERNEL
11855714Skris#define	INADDR_NONE		0xffffffff		/* -1 return */
11955714Skris#endif
12055714Skris
12155714Skris#define	INADDR_UNSPEC_GROUP	(u_long)0xe0000000	/* 224.0.0.0 */
12255714Skris#define	INADDR_ALLHOSTS_GROUP	(u_long)0xe0000001	/* 224.0.0.1 */
12355714Skris#define	INADDR_MAX_LOCAL_GROUP	(u_long)0xe00000ff	/* 224.0.0.255 */
12455714Skris
12555714Skris#define	IN_LOOPBACKNET		127			/* official! */
12655714Skris
12755714Skris/*
12855714Skris * Socket address, internet style.
12955714Skris */
13055714Skrisstruct sockaddr_in {
13155714Skris	u_char	sin_len;
13255714Skris	u_char	sin_family;
13355714Skris	u_short	sin_port;
13455714Skris	struct	in_addr sin_addr;
13555714Skris	char	sin_zero[8];
13655714Skris};
13755714Skris
13855714Skris/*
13955714Skris * Structure used to describe IP options.
14055714Skris * Used to store options internally, to pass them to a process,
14155714Skris * or to restore options retrieved earlier.
14255714Skris * The ip_dst is used for the first-hop gateway when using a source route
14355714Skris * (this gets put into the header proper).
14455714Skris */
14555714Skrisstruct ip_opts {
14655714Skris	struct	in_addr ip_dst;		/* first hop, 0 w/o src rt */
14755714Skris	char	ip_opts[40];		/* actually variable in size */
14855714Skris};
14955714Skris
15055714Skris/*
15155714Skris * Options for use with [gs]etsockopt at the IP level.
15255714Skris * First word of comment is data type; bool is stored in int.
15355714Skris */
15455714Skris#define	IP_OPTIONS		1    /* buf/ip_opts; set/get IP options */
15555714Skris#define	IP_HDRINCL		2    /* int; header is included with data */
15655714Skris#define	IP_TOS			3    /* int; IP type of service and preced. */
15755714Skris#define	IP_TTL			4    /* int; IP time to live */
15855714Skris#define	IP_RECVOPTS		5    /* bool; receive all IP opts w/dgram */
15955714Skris#define	IP_RECVRETOPTS		6    /* bool; receive IP opts for response */
16055714Skris#define	IP_RECVDSTADDR		7    /* bool; receive IP dst addr w/dgram */
16155714Skris#define	IP_RETOPTS		8    /* ip_opts; set/get IP options */
16255714Skris#define	IP_MULTICAST_IF		9    /* u_char; set/get IP multicast i/f  */
16355714Skris#define	IP_MULTICAST_TTL	10   /* u_char; set/get IP multicast ttl */
16455714Skris#define	IP_MULTICAST_LOOP	11   /* u_char; set/get IP multicast loopback */
16555714Skris#define	IP_ADD_MEMBERSHIP	12   /* ip_mreq; add an IP group membership */
16655714Skris#define	IP_DROP_MEMBERSHIP	13   /* ip_mreq; drop an IP group membership */
16755714Skris#define IP_MULTICAST_VIF	14   /* set/get IP mcast virt. iface */
16855714Skris#define IP_RSVP_ON		15   /* enable RSVP in kernel */
16955714Skris#define IP_RSVP_OFF		16   /* disable RSVP in kernel */
17055714Skris#define IP_RSVP_VIF_ON		17   /* set RSVP per-vif socket */
17155714Skris#define IP_RSVP_VIF_OFF		18   /* unset RSVP per-vif socket */
17255714Skris
17355714Skris/*
17455714Skris * Defaults and limits for options
17555714Skris */
17655714Skris#define	IP_DEFAULT_MULTICAST_TTL  1	/* normally limit m'casts to 1 hop  */
17755714Skris#define	IP_DEFAULT_MULTICAST_LOOP 1	/* normally hear sends if a member  */
17855714Skris#define	IP_MAX_MEMBERSHIPS	20	/* per socket */
17955714Skris
18055714Skris/*
18155714Skris * Argument structure for IP_ADD_MEMBERSHIP and IP_DROP_MEMBERSHIP.
18255714Skris */
18355714Skrisstruct ip_mreq {
18455714Skris	struct	in_addr imr_multiaddr;	/* IP multicast address of group */
18555714Skris	struct	in_addr imr_interface;	/* local IP address of interface */
18655714Skris};
18755714Skris
18855714Skris/*
18955714Skris * Definitions for inet sysctl operations.
19055714Skris *
19155714Skris * Third level is protocol number.
19255714Skris * Fourth level is desired variable within that protocol.
19355714Skris */
19455714Skris#define	IPPROTO_MAXID	(IPPROTO_IDP + 1)	/* don't list to IPPROTO_MAX */
19555714Skris
19655714Skris#define	CTL_IPPROTO_NAMES { \
19755714Skris	{ "ip", CTLTYPE_NODE }, \
19855714Skris	{ "icmp", CTLTYPE_NODE }, \
19955714Skris	{ "igmp", CTLTYPE_NODE }, \
20055714Skris	{ "ggp", CTLTYPE_NODE }, \
20155714Skris	{ 0, 0 }, \
20255714Skris	{ 0, 0 }, \
20355714Skris	{ "tcp", CTLTYPE_NODE }, \
20455714Skris	{ 0, 0 }, \
20555714Skris	{ "egp", CTLTYPE_NODE }, \
20655714Skris	{ 0, 0 }, \
20755714Skris	{ 0, 0 }, \
20855714Skris	{ 0, 0 }, \
20955714Skris	{ "pup", CTLTYPE_NODE }, \
21055714Skris	{ 0, 0 }, \
21155714Skris	{ 0, 0 }, \
21255714Skris	{ 0, 0 }, \
21355714Skris	{ 0, 0 }, \
21455714Skris	{ "udp", CTLTYPE_NODE }, \
21555714Skris	{ 0, 0 }, \
21655714Skris	{ 0, 0 }, \
21755714Skris	{ 0, 0 }, \
21855714Skris	{ 0, 0 }, \
21955714Skris	{ "idp", CTLTYPE_NODE }, \
22055714Skris}
22155714Skris
22255714Skris/*
22355714Skris * Names for IP sysctl objects
22455714Skris */
22555714Skris#define	IPCTL_FORWARDING	1	/* act as router */
22655714Skris#define	IPCTL_SENDREDIRECTS	2	/* may send redirects when forwarding */
22755714Skris#define	IPCTL_DEFTTL		3	/* default TTL */
22855714Skris#ifdef notyet
22955714Skris#define	IPCTL_DEFMTU		4	/* default MTU */
23055714Skris#endif
23155714Skris#define IPCTL_RTEXPIRE		5	/* cloned route expiration time */
23255714Skris#define IPCTL_RTMINEXPIRE	6	/* min value for expiration time */
23355714Skris#define IPCTL_RTMAXCACHE	7	/* trigger level for dynamic expire */
23455714Skris#define	IPCTL_SOURCEROUTE	8	/* may perform source routes */
23555714Skris#define	IPCTL_DIRECTEDBROADCAST	9	/* may re-broadcast received packets */
23655714Skris#define IPCTL_INTRQMAXLEN	10	/* max length of netisr queue */
23755714Skris#define IPCTL_INTRQDROPS	11	/* number of netisr q drops */
23855714Skris#define	IPCTL_MAXID		12
23955714Skris
24055714Skris#define	IPCTL_NAMES { \
24155714Skris	{ 0, 0 }, \
24255714Skris	{ "forwarding", CTLTYPE_INT }, \
24355714Skris	{ "redirect", CTLTYPE_INT }, \
24455714Skris	{ "ttl", CTLTYPE_INT }, \
24555714Skris	{ "mtu", CTLTYPE_INT }, \
24655714Skris	{ "rtexpire", CTLTYPE_INT }, \
24755714Skris	{ "rtminexpire", CTLTYPE_INT }, \
24855714Skris	{ "rtmaxcache", CTLTYPE_INT }, \
24955714Skris	{ "sourceroute", CTLTYPE_INT }, \
25055714Skris 	{ "directed-broadcast", CTLTYPE_INT }, \
25155714Skris	{ "intr-queue-maxlen", CTLTYPE_INT }, \
25255714Skris	{ "intr-queue-drops", CTLTYPE_INT }, \
25355714Skris}
25455714Skris
25555714Skris
25655714Skris#ifdef KERNEL
25755714Skrisstruct ifnet; struct mbuf;	/* forward declarations for Standard C */
25855714Skris
25955714Skrisint	 in_broadcast __P((struct in_addr, struct ifnet *));
26055714Skrisint	 in_canforward __P((struct in_addr));
26155714Skrisint	 in_cksum __P((struct mbuf *, int));
26255714Skrisint	 in_localaddr __P((struct in_addr));
26355714Skrisu_long	 in_netof __P((struct in_addr));
26455714Skrisvoid	 in_socktrim __P((struct sockaddr_in *));
26555714Skrischar 	*inet_ntoa __P((struct in_addr)); /* in libkern */
26655714Skris#endif
26755714Skris
26855714Skris#endif
269
270