Eliminate address family-specific route caches (struct route, struct
route_in6, struct route_iso), replacing all caches with a struct
route.
The principle benefit of this change is that all of the protocol
families can benefit from route cache-invalidation, which is
necessary for correct routing. Route-cache invalidation fixes an
ancient PR, kern/3508, at long last; it fixes various other PRs,
also.
Discussions with and ideas from Joerg Sonnenberger influenced this
work tremendously. Of course, all design oversights and bugs are
mine.
DETAILS
1 I added to each address family a pool of sockaddrs. I have
introduced routines for allocating, copying, and duplicating,
and freeing sockaddrs:
struct sockaddr *sockaddr_alloc(sa_family_t af, int flags);
struct sockaddr *sockaddr_copy(struct sockaddr *dst,
const struct sockaddr *src);
struct sockaddr *sockaddr_dup(const struct sockaddr *src, int flags);
void sockaddr_free(struct sockaddr *sa);
sockaddr_alloc() returns either a sockaddr from the pool belonging
to the specified family, or NULL if the pool is exhausted. The
returned sockaddr has the right size for that family; sa_family
and sa_len fields are initialized to the family and sockaddr
length---e.g., sa_family = AF_INET and sa_len = sizeof(struct
sockaddr_in). sockaddr_free() puts the given sockaddr back into
its family's pool.
sockaddr_dup() and sockaddr_copy() work analogously to strdup()
and strcpy(), respectively. sockaddr_copy() KASSERTs that the
family of the destination and source sockaddrs are alike.
The 'flags' argumet for sockaddr_alloc() and sockaddr_dup() is
passed directly to pool_get(9).
2 I added routines for initializing sockaddrs in each address
family, sockaddr_in_init(), sockaddr_in6_init(), sockaddr_iso_init(),
etc. They are fairly self-explanatory.
3 structs route_in6 and route_iso are no more. All protocol families
use struct route. I have changed the route cache, 'struct route',
so that it does not contain storage space for a sockaddr. Instead,
struct route points to a sockaddr coming from the pool the sockaddr
belongs to. I added a new method to struct route, rtcache_setdst(),
for setting the cache destination:
int rtcache_setdst(struct route *, const struct sockaddr *);
rtcache_setdst() returns 0 on success, or ENOMEM if no memory is
available to create the sockaddr storage.
It is now possible for rtcache_getdst() to return NULL if, say,
rtcache_setdst() failed. I check the return value for NULL
everywhere in the kernel.
4 Each routing domain (struct domain) has a list of live route
caches, dom_rtcache. rtflushall(sa_family_t af) looks up the
domain indicated by 'af', walks the domain's list of route caches
and invalidates each one.
2007-05-03 00:40:22 +04:00
|
|
|
/* $NetBSD: in.h,v 1.79 2007/05/02 20:40:24 dyoung Exp $ */
|
1994-06-29 10:29:24 +04:00
|
|
|
|
1993-03-21 12:45:37 +03:00
|
|
|
/*
|
1994-05-13 10:02:48 +04:00
|
|
|
* Copyright (c) 1982, 1986, 1990, 1993
|
|
|
|
* The Regents of the University of California. All rights reserved.
|
1993-03-21 12:45:37 +03:00
|
|
|
*
|
|
|
|
* Redistribution and use in source and binary forms, with or without
|
|
|
|
* modification, are permitted provided that the following conditions
|
|
|
|
* are met:
|
|
|
|
* 1. Redistributions of source code must retain the above copyright
|
|
|
|
* notice, this list of conditions and the following disclaimer.
|
|
|
|
* 2. Redistributions in binary form must reproduce the above copyright
|
|
|
|
* notice, this list of conditions and the following disclaimer in the
|
|
|
|
* documentation and/or other materials provided with the distribution.
|
2003-08-07 20:26:28 +04:00
|
|
|
* 3. Neither the name of the University nor the names of its contributors
|
1993-03-21 12:45:37 +03:00
|
|
|
* may be used to endorse or promote products derived from this software
|
|
|
|
* without specific prior written permission.
|
|
|
|
*
|
|
|
|
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
|
|
|
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
|
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
|
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
|
|
|
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
|
|
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
|
|
|
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
|
|
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
|
|
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
|
|
|
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
|
|
|
* SUCH DAMAGE.
|
|
|
|
*
|
1994-06-29 10:29:24 +04:00
|
|
|
* @(#)in.h 8.3 (Berkeley) 1/3/94
|
1993-03-21 12:45:37 +03:00
|
|
|
*/
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Constants and structures defined by the internet system,
|
1994-05-13 10:02:48 +04:00
|
|
|
* Per RFC 790, September 1981, and numerous additions.
|
1993-03-21 12:45:37 +03:00
|
|
|
*/
|
|
|
|
|
1994-05-14 10:25:32 +04:00
|
|
|
#ifndef _NETINET_IN_H_
|
|
|
|
#define _NETINET_IN_H_
|
1994-05-14 09:46:35 +04:00
|
|
|
|
2002-05-13 17:34:32 +04:00
|
|
|
#include <machine/int_types.h>
|
|
|
|
|
|
|
|
#ifndef uint8_t
|
|
|
|
typedef __uint8_t uint8_t;
|
|
|
|
#define uint8_t __uint8_t
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#ifndef uint32_t
|
|
|
|
typedef __uint32_t uint32_t;
|
|
|
|
#define uint32_t __uint32_t
|
|
|
|
#endif
|
|
|
|
|
2000-06-26 19:48:19 +04:00
|
|
|
#include <sys/ansi.h>
|
|
|
|
|
2002-05-13 03:04:15 +04:00
|
|
|
#ifndef in_addr_t
|
|
|
|
typedef __in_addr_t in_addr_t;
|
|
|
|
#define in_addr_t __in_addr_t
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#ifndef in_port_t
|
|
|
|
typedef __in_port_t in_port_t;
|
|
|
|
#define in_port_t __in_port_t
|
|
|
|
#endif
|
|
|
|
|
2000-06-26 19:48:19 +04:00
|
|
|
#ifndef sa_family_t
|
|
|
|
typedef __sa_family_t sa_family_t;
|
2000-08-28 06:12:22 +04:00
|
|
|
#define sa_family_t __sa_family_t
|
2000-06-26 19:48:19 +04:00
|
|
|
#endif
|
|
|
|
|
1993-03-21 12:45:37 +03:00
|
|
|
/*
|
|
|
|
* Protocols
|
|
|
|
*/
|
|
|
|
#define IPPROTO_IP 0 /* dummy for IP */
|
2000-08-28 06:12:22 +04:00
|
|
|
#define IPPROTO_HOPOPTS 0 /* IP6 hop-by-hop options */
|
1993-03-21 12:45:37 +03:00
|
|
|
#define IPPROTO_ICMP 1 /* control message protocol */
|
1994-01-09 00:21:28 +03:00
|
|
|
#define IPPROTO_IGMP 2 /* group mgmt protocol */
|
1993-03-21 12:45:37 +03:00
|
|
|
#define IPPROTO_GGP 3 /* gateway^2 (deprecated) */
|
2000-08-28 06:12:22 +04:00
|
|
|
#define IPPROTO_IPV4 4 /* IP header */
|
1995-05-31 11:39:33 +04:00
|
|
|
#define IPPROTO_IPIP 4 /* IP inside IP */
|
1993-03-21 12:45:37 +03:00
|
|
|
#define IPPROTO_TCP 6 /* tcp */
|
|
|
|
#define IPPROTO_EGP 8 /* exterior gateway protocol */
|
|
|
|
#define IPPROTO_PUP 12 /* pup */
|
|
|
|
#define IPPROTO_UDP 17 /* user datagram protocol */
|
|
|
|
#define IPPROTO_IDP 22 /* xns idp */
|
|
|
|
#define IPPROTO_TP 29 /* tp-4 w/ class negotiation */
|
2000-08-28 06:12:22 +04:00
|
|
|
#define IPPROTO_IPV6 41 /* IP6 header */
|
|
|
|
#define IPPROTO_ROUTING 43 /* IP6 routing header */
|
|
|
|
#define IPPROTO_FRAGMENT 44 /* IP6 fragmentation header */
|
|
|
|
#define IPPROTO_RSVP 46 /* resource reservation */
|
|
|
|
#define IPPROTO_GRE 47 /* GRE encaps RFC 1701 */
|
1997-08-27 21:05:34 +04:00
|
|
|
#define IPPROTO_ESP 50 /* encap. security payload */
|
|
|
|
#define IPPROTO_AH 51 /* authentication header */
|
2000-08-28 06:12:22 +04:00
|
|
|
#define IPPROTO_MOBILE 55 /* IP Mobility RFC 2004 */
|
|
|
|
#define IPPROTO_IPV6_ICMP 58 /* IPv6 ICMP */
|
|
|
|
#define IPPROTO_ICMPV6 58 /* ICMP6 */
|
|
|
|
#define IPPROTO_NONE 59 /* IP6 no next header */
|
|
|
|
#define IPPROTO_DSTOPTS 60 /* IP6 destination option */
|
1993-03-21 12:45:37 +03:00
|
|
|
#define IPPROTO_EON 80 /* ISO cnlp */
|
2005-02-01 02:49:36 +03:00
|
|
|
#define IPPROTO_ETHERIP 97 /* Ethernet-in-IP */
|
1994-05-13 10:02:48 +04:00
|
|
|
#define IPPROTO_ENCAP 98 /* encapsulation header */
|
2000-08-28 06:12:22 +04:00
|
|
|
#define IPPROTO_PIM 103 /* Protocol indep. multicast */
|
|
|
|
#define IPPROTO_IPCOMP 108 /* IP Payload Comp. Protocol */
|
2001-01-19 12:01:48 +03:00
|
|
|
#define IPPROTO_VRRP 112 /* VRRP RFC 2338 */
|
2006-05-18 13:05:49 +04:00
|
|
|
#define IPPROTO_CARP 112 /* Common Address Resolution Protocol */
|
1993-03-21 12:45:37 +03:00
|
|
|
#define IPPROTO_RAW 255 /* raw IP packet */
|
|
|
|
#define IPPROTO_MAX 256
|
|
|
|
|
2000-03-10 18:30:55 +03:00
|
|
|
/* last return value of *_input(), meaning "all job for this pkt is done". */
|
|
|
|
#define IPPROTO_DONE 257
|
|
|
|
|
2004-05-07 04:55:14 +04:00
|
|
|
/* sysctl placeholder for (FAST_)IPSEC */
|
|
|
|
#define CTL_IPPROTO_IPSEC 258
|
|
|
|
|
1993-03-21 12:45:37 +03:00
|
|
|
|
|
|
|
/*
|
|
|
|
* Local port number conventions:
|
1998-01-08 01:51:22 +03:00
|
|
|
*
|
|
|
|
* Ports < IPPORT_RESERVED are reserved for privileged processes (e.g. root),
|
|
|
|
* unless a kernel is compiled with IPNOPRIVPORTS defined.
|
|
|
|
*
|
|
|
|
* When a user does a bind(2) or connect(2) with a port number of zero,
|
|
|
|
* a non-conflicting local port address is chosen.
|
|
|
|
*
|
2001-05-28 03:46:51 +04:00
|
|
|
* The default range is IPPORT_ANONMIN to IPPORT_ANONMAX, although
|
1998-01-08 01:51:22 +03:00
|
|
|
* that is settable by sysctl(3); net.inet.ip.anonportmin and
|
|
|
|
* net.inet.ip.anonportmax respectively.
|
|
|
|
*
|
|
|
|
* A user may set the IPPROTO_IP option IP_PORTRANGE to change this
|
|
|
|
* default assignment range.
|
|
|
|
*
|
|
|
|
* The value IP_PORTRANGE_DEFAULT causes the default behavior.
|
|
|
|
*
|
|
|
|
* The value IP_PORTRANGE_HIGH is the same as IP_PORTRANGE_DEFAULT,
|
|
|
|
* and exists only for FreeBSD compatibility purposes.
|
|
|
|
*
|
|
|
|
* The value IP_PORTRANGE_LOW changes the range to the "low" are
|
|
|
|
* that is (by convention) restricted to privileged processes.
|
|
|
|
* This convention is based on "vouchsafe" principles only.
|
|
|
|
* It is only secure if you trust the remote host to restrict these ports.
|
|
|
|
* The range is IPPORT_RESERVEDMIN to IPPORT_RESERVEDMAX.
|
1993-03-21 12:45:37 +03:00
|
|
|
*/
|
1998-01-08 01:51:22 +03:00
|
|
|
|
1993-03-21 12:45:37 +03:00
|
|
|
#define IPPORT_RESERVED 1024
|
1998-01-05 12:52:02 +03:00
|
|
|
#define IPPORT_ANONMIN 49152
|
|
|
|
#define IPPORT_ANONMAX 65535
|
1998-01-08 01:51:22 +03:00
|
|
|
#define IPPORT_RESERVEDMIN 600
|
|
|
|
#define IPPORT_RESERVEDMAX (IPPORT_RESERVED-1)
|
1993-03-21 12:45:37 +03:00
|
|
|
|
|
|
|
/*
|
|
|
|
* Internet address (a structure for historical reasons)
|
|
|
|
*/
|
|
|
|
struct in_addr {
|
2002-05-13 03:04:15 +04:00
|
|
|
in_addr_t s_addr;
|
1999-11-20 03:37:58 +03:00
|
|
|
} __attribute__((__packed__));
|
1993-03-21 12:45:37 +03:00
|
|
|
|
|
|
|
/*
|
|
|
|
* Definitions of bits in internet address integers.
|
|
|
|
* On subnets, the decomposition of addresses to host and net parts
|
|
|
|
* is done according to subnet mask, not the masks here.
|
1995-06-02 01:35:34 +04:00
|
|
|
*
|
|
|
|
* By byte-swapping the constants, we avoid ever having to byte-swap IP
|
|
|
|
* addresses inside the kernel. Unfortunately, user-level programs rely
|
|
|
|
* on these macros not doing byte-swapping.
|
1993-03-21 12:45:37 +03:00
|
|
|
*/
|
1995-06-02 01:35:34 +04:00
|
|
|
#ifdef _KERNEL
|
2002-05-13 17:34:32 +04:00
|
|
|
#define __IPADDR(x) ((uint32_t) htonl((uint32_t)(x)))
|
1995-06-02 01:35:34 +04:00
|
|
|
#else
|
2002-05-13 17:34:32 +04:00
|
|
|
#define __IPADDR(x) ((uint32_t)(x))
|
1995-06-02 01:35:34 +04:00
|
|
|
#endif
|
|
|
|
|
2002-05-13 17:34:32 +04:00
|
|
|
#define IN_CLASSA(i) (((uint32_t)(i) & __IPADDR(0x80000000)) == \
|
1995-06-02 01:35:34 +04:00
|
|
|
__IPADDR(0x00000000))
|
|
|
|
#define IN_CLASSA_NET __IPADDR(0xff000000)
|
1993-03-21 12:45:37 +03:00
|
|
|
#define IN_CLASSA_NSHIFT 24
|
1995-06-02 01:35:34 +04:00
|
|
|
#define IN_CLASSA_HOST __IPADDR(0x00ffffff)
|
1993-03-21 12:45:37 +03:00
|
|
|
#define IN_CLASSA_MAX 128
|
|
|
|
|
2002-05-13 17:34:32 +04:00
|
|
|
#define IN_CLASSB(i) (((uint32_t)(i) & __IPADDR(0xc0000000)) == \
|
1995-06-02 01:35:34 +04:00
|
|
|
__IPADDR(0x80000000))
|
|
|
|
#define IN_CLASSB_NET __IPADDR(0xffff0000)
|
1993-03-21 12:45:37 +03:00
|
|
|
#define IN_CLASSB_NSHIFT 16
|
1995-06-02 01:35:34 +04:00
|
|
|
#define IN_CLASSB_HOST __IPADDR(0x0000ffff)
|
1993-03-21 12:45:37 +03:00
|
|
|
#define IN_CLASSB_MAX 65536
|
|
|
|
|
2002-05-13 17:34:32 +04:00
|
|
|
#define IN_CLASSC(i) (((uint32_t)(i) & __IPADDR(0xe0000000)) == \
|
1995-06-02 01:35:34 +04:00
|
|
|
__IPADDR(0xc0000000))
|
|
|
|
#define IN_CLASSC_NET __IPADDR(0xffffff00)
|
1993-03-21 12:45:37 +03:00
|
|
|
#define IN_CLASSC_NSHIFT 8
|
1995-06-02 01:35:34 +04:00
|
|
|
#define IN_CLASSC_HOST __IPADDR(0x000000ff)
|
1993-03-21 12:45:37 +03:00
|
|
|
|
2002-05-13 17:34:32 +04:00
|
|
|
#define IN_CLASSD(i) (((uint32_t)(i) & __IPADDR(0xf0000000)) == \
|
1995-06-02 01:35:34 +04:00
|
|
|
__IPADDR(0xe0000000))
|
|
|
|
/* These ones aren't really net and host fields, but routing needn't know. */
|
|
|
|
#define IN_CLASSD_NET __IPADDR(0xf0000000)
|
|
|
|
#define IN_CLASSD_NSHIFT 28
|
|
|
|
#define IN_CLASSD_HOST __IPADDR(0x0fffffff)
|
1993-03-21 12:45:37 +03:00
|
|
|
#define IN_MULTICAST(i) IN_CLASSD(i)
|
|
|
|
|
2002-05-13 17:34:32 +04:00
|
|
|
#define IN_EXPERIMENTAL(i) (((uint32_t)(i) & __IPADDR(0xf0000000)) == \
|
1995-06-02 01:35:34 +04:00
|
|
|
__IPADDR(0xf0000000))
|
2002-05-13 17:34:32 +04:00
|
|
|
#define IN_BADCLASS(i) (((uint32_t)(i) & __IPADDR(0xf0000000)) == \
|
1995-06-02 01:35:34 +04:00
|
|
|
__IPADDR(0xf0000000))
|
|
|
|
|
2006-11-13 08:13:38 +03:00
|
|
|
#define IN_LINKLOCAL(i) (((uint32_t)(i) & __IPADDR(0xffff0000)) == \
|
|
|
|
__IPADDR(0xa9fe0000))
|
|
|
|
|
|
|
|
#define IN_PRIVATE(i) ((((uint32_t)(i) & __IPADDR(0xff000000)) == \
|
|
|
|
__IPADDR(0x0a000000)) || \
|
|
|
|
(((uint32_t)(i) & __IPADDR(0xfff00000)) == \
|
|
|
|
__IPADDR(0xac100000)) || \
|
|
|
|
(((uint32_t)(i) & __IPADDR(0xffff0000)) == \
|
|
|
|
__IPADDR(0xc0a80000)))
|
|
|
|
|
2002-05-13 17:34:32 +04:00
|
|
|
#define IN_LOCAL_GROUP(i) (((uint32_t)(i) & __IPADDR(0xffffff00)) == \
|
1995-06-02 01:35:34 +04:00
|
|
|
__IPADDR(0xe0000000))
|
1993-03-21 12:45:37 +03:00
|
|
|
|
2006-11-13 08:13:38 +03:00
|
|
|
#define IN_ANY_LOCAL(i) (IN_LINKLOCAL(i) || IN_LOCAL_GROUP(i))
|
|
|
|
|
1995-06-02 01:35:34 +04:00
|
|
|
#define INADDR_ANY __IPADDR(0x00000000)
|
|
|
|
#define INADDR_LOOPBACK __IPADDR(0x7f000001)
|
|
|
|
#define INADDR_BROADCAST __IPADDR(0xffffffff) /* must be masked */
|
|
|
|
#define INADDR_NONE __IPADDR(0xffffffff) /* -1 return */
|
1993-03-21 12:45:37 +03:00
|
|
|
|
1995-06-02 01:35:34 +04:00
|
|
|
#define INADDR_UNSPEC_GROUP __IPADDR(0xe0000000) /* 224.0.0.0 */
|
|
|
|
#define INADDR_ALLHOSTS_GROUP __IPADDR(0xe0000001) /* 224.0.0.1 */
|
1997-12-16 03:02:05 +03:00
|
|
|
#define INADDR_ALLRTRS_GROUP __IPADDR(0xe0000002) /* 224.0.0.2 */
|
2006-05-18 13:05:49 +04:00
|
|
|
#define INADDR_CARP_GROUP __IPADDR(0xe0000012) /* 224.0.0.18 */
|
1997-12-16 03:02:05 +03:00
|
|
|
#define INADDR_MAX_LOCAL_GROUP __IPADDR(0xe00000ff) /* 224.0.0.255 */
|
1993-12-06 08:46:37 +03:00
|
|
|
|
1993-03-21 12:45:37 +03:00
|
|
|
#define IN_LOOPBACKNET 127 /* official! */
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Socket address, internet style.
|
|
|
|
*/
|
|
|
|
struct sockaddr_in {
|
2002-05-13 17:34:32 +04:00
|
|
|
uint8_t sin_len;
|
2000-06-26 19:48:19 +04:00
|
|
|
sa_family_t sin_family;
|
2002-05-13 03:04:15 +04:00
|
|
|
in_port_t sin_port;
|
2000-06-26 19:48:19 +04:00
|
|
|
struct in_addr sin_addr;
|
2002-05-13 17:34:32 +04:00
|
|
|
__int8_t sin_zero[8];
|
1993-03-21 12:45:37 +03:00
|
|
|
};
|
|
|
|
|
2000-08-28 06:12:22 +04:00
|
|
|
#define INET_ADDRSTRLEN 16
|
1999-07-01 12:12:45 +04:00
|
|
|
|
1993-03-21 12:45:37 +03:00
|
|
|
/*
|
|
|
|
* Structure used to describe IP options.
|
|
|
|
* Used to store options internally, to pass them to a process,
|
|
|
|
* or to restore options retrieved earlier.
|
|
|
|
* The ip_dst is used for the first-hop gateway when using a source route
|
|
|
|
* (this gets put into the header proper).
|
|
|
|
*/
|
|
|
|
struct ip_opts {
|
1995-04-13 10:25:36 +04:00
|
|
|
struct in_addr ip_dst; /* first hop, 0 w/o src rt */
|
2003-01-27 12:57:09 +03:00
|
|
|
#if defined(__cplusplus)
|
|
|
|
__int8_t Ip_opts[40]; /* actually variable in size */
|
|
|
|
#else
|
2002-05-13 17:34:32 +04:00
|
|
|
__int8_t ip_opts[40]; /* actually variable in size */
|
2003-01-27 12:57:09 +03:00
|
|
|
#endif
|
1993-03-21 12:45:37 +03:00
|
|
|
};
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Options for use with [gs]etsockopt at the IP level.
|
|
|
|
* First word of comment is data type; bool is stored in int.
|
|
|
|
*/
|
1994-05-13 10:02:48 +04:00
|
|
|
#define IP_OPTIONS 1 /* buf/ip_opts; set/get IP options */
|
|
|
|
#define IP_HDRINCL 2 /* int; header is included with data */
|
|
|
|
#define IP_TOS 3 /* int; IP type of service and preced. */
|
|
|
|
#define IP_TTL 4 /* int; IP time to live */
|
|
|
|
#define IP_RECVOPTS 5 /* bool; receive all IP opts w/dgram */
|
|
|
|
#define IP_RECVRETOPTS 6 /* bool; receive IP opts for response */
|
|
|
|
#define IP_RECVDSTADDR 7 /* bool; receive IP dst addr w/dgram */
|
|
|
|
#define IP_RETOPTS 8 /* ip_opts; set/get IP options */
|
1995-05-31 11:39:33 +04:00
|
|
|
#define IP_MULTICAST_IF 9 /* in_addr; set/get IP multicast i/f */
|
1994-05-13 10:02:48 +04:00
|
|
|
#define IP_MULTICAST_TTL 10 /* u_char; set/get IP multicast ttl */
|
|
|
|
#define IP_MULTICAST_LOOP 11 /* u_char; set/get IP multicast loopback */
|
|
|
|
#define IP_ADD_MEMBERSHIP 12 /* ip_mreq; add an IP group membership */
|
|
|
|
#define IP_DROP_MEMBERSHIP 13 /* ip_mreq; drop an IP group membership */
|
2000-08-28 06:12:22 +04:00
|
|
|
#define IP_PORTRANGE 19 /* int; range to use for ephemeral port */
|
1997-01-11 08:21:07 +03:00
|
|
|
#define IP_RECVIF 20 /* bool; receive reception if w/dgram */
|
1997-10-14 04:52:39 +04:00
|
|
|
#define IP_ERRORMTU 21 /* int; get MTU of last xmit = EMSGSIZE */
|
1999-07-01 12:12:45 +04:00
|
|
|
#if 1 /*IPSEC*/
|
2000-08-28 06:12:22 +04:00
|
|
|
#define IP_IPSEC_POLICY 22 /* struct; get/set security policy */
|
1999-07-01 12:12:45 +04:00
|
|
|
#endif
|
1994-05-13 10:02:48 +04:00
|
|
|
|
|
|
|
/*
|
|
|
|
* Defaults and limits for options
|
|
|
|
*/
|
|
|
|
#define IP_DEFAULT_MULTICAST_TTL 1 /* normally limit m'casts to 1 hop */
|
|
|
|
#define IP_DEFAULT_MULTICAST_LOOP 1 /* normally hear sends if a member */
|
|
|
|
#define IP_MAX_MEMBERSHIPS 20 /* per socket; must fit in one mbuf */
|
1993-12-06 08:46:37 +03:00
|
|
|
|
|
|
|
/*
|
|
|
|
* Argument structure for IP_ADD_MEMBERSHIP and IP_DROP_MEMBERSHIP.
|
|
|
|
*/
|
|
|
|
struct ip_mreq {
|
1994-01-09 00:21:28 +03:00
|
|
|
struct in_addr imr_multiaddr; /* IP multicast address of group */
|
|
|
|
struct in_addr imr_interface; /* local IP address of interface */
|
1993-12-06 08:46:37 +03:00
|
|
|
};
|
1993-03-21 12:45:37 +03:00
|
|
|
|
1998-01-08 01:51:22 +03:00
|
|
|
/*
|
|
|
|
* Argument for IP_PORTRANGE:
|
|
|
|
* - which range to search when port is unspecified at bind() or connect()
|
|
|
|
*/
|
|
|
|
#define IP_PORTRANGE_DEFAULT 0 /* default range */
|
|
|
|
#define IP_PORTRANGE_HIGH 1 /* same as DEFAULT (FreeBSD compat) */
|
|
|
|
#define IP_PORTRANGE_LOW 2 /* use privileged range */
|
|
|
|
|
Add a new feature-test macro, _NETBSD_SOURCE. If this is defined
by the application, all NetBSD interfaces are made visible, even
if some other feature-test macro (like _POSIX_C_SOURCE) is defined.
<sys/featuretest.h> defined _NETBSD_SOURCE if none of _ANSI_SOURCE,
_POSIX_C_SOURCE and _XOPEN_SOURCE is defined, so as to preserve
existing behaviour.
This has two major advantages:
+ Programs that require non-POSIX facilities but define _POSIX_C_SOURCE
can trivially be overruled by putting -D_NETBSD_SOURCE in their CFLAGS.
+ It makes most of the #ifs simpler, in that they're all now ORs of the
various macros, rather than having checks for (!defined(_ANSI_SOURCE) ||
!defined(_POSIX_C_SOURCE) || !defined(_XOPEN_SOURCE)) all over the place.
I've tried not to change the semantics of the headers in any case where
_NETBSD_SOURCE wasn't defined, but there were some places where the
current semantics were clearly mad, and retaining them was harder than
correcting them. In particular, I've mostly normalised things so that
_ANSI_SOURCE gets you the smallest set of stuff, then _POSIX_C_SOURCE,
_XOPEN_SOURCE and _NETBSD_SOURCE in that order.
Tested by building for vax, encouraged by thorpej, and uncontested in
tech-userlevel for a week.
2003-04-29 03:16:11 +04:00
|
|
|
#if defined(_NETBSD_SOURCE)
|
1994-05-13 10:02:48 +04:00
|
|
|
/*
|
|
|
|
* Definitions for inet sysctl operations.
|
|
|
|
*
|
|
|
|
* Third level is protocol number.
|
|
|
|
* Fourth level is desired variable within that protocol.
|
|
|
|
*/
|
1999-07-02 12:46:47 +04:00
|
|
|
#define IPPROTO_MAXID (IPPROTO_AH + 1) /* don't list to IPPROTO_MAX */
|
1994-05-13 10:02:48 +04:00
|
|
|
|
|
|
|
#define CTL_IPPROTO_NAMES { \
|
|
|
|
{ "ip", CTLTYPE_NODE }, \
|
|
|
|
{ "icmp", CTLTYPE_NODE }, \
|
|
|
|
{ "igmp", CTLTYPE_NODE }, \
|
|
|
|
{ "ggp", CTLTYPE_NODE }, \
|
|
|
|
{ 0, 0 }, \
|
|
|
|
{ 0, 0 }, \
|
|
|
|
{ "tcp", CTLTYPE_NODE }, \
|
|
|
|
{ 0, 0 }, \
|
|
|
|
{ "egp", CTLTYPE_NODE }, \
|
|
|
|
{ 0, 0 }, \
|
|
|
|
{ 0, 0 }, \
|
|
|
|
{ 0, 0 }, \
|
|
|
|
{ "pup", CTLTYPE_NODE }, \
|
|
|
|
{ 0, 0 }, \
|
|
|
|
{ 0, 0 }, \
|
|
|
|
{ 0, 0 }, \
|
|
|
|
{ 0, 0 }, \
|
|
|
|
{ "udp", CTLTYPE_NODE }, \
|
|
|
|
{ 0, 0 }, \
|
|
|
|
{ 0, 0 }, \
|
|
|
|
{ 0, 0 }, \
|
|
|
|
{ 0, 0 }, \
|
|
|
|
{ "idp", CTLTYPE_NODE }, \
|
1999-07-01 12:12:45 +04:00
|
|
|
{ 0, 0 }, \
|
|
|
|
{ 0, 0 }, \
|
|
|
|
{ 0, 0 }, \
|
|
|
|
{ 0, 0 }, \
|
|
|
|
{ 0, 0 }, \
|
|
|
|
{ 0, 0 }, \
|
|
|
|
{ 0, 0 }, \
|
|
|
|
{ 0, 0 }, \
|
|
|
|
{ 0, 0 }, \
|
|
|
|
{ 0, 0 }, \
|
|
|
|
{ 0, 0 }, \
|
|
|
|
{ 0, 0 }, \
|
|
|
|
{ 0, 0 }, \
|
|
|
|
{ 0, 0 }, \
|
|
|
|
{ 0, 0 }, \
|
|
|
|
{ 0, 0 }, \
|
|
|
|
{ 0, 0 }, \
|
|
|
|
{ 0, 0 }, \
|
|
|
|
{ 0, 0 }, \
|
|
|
|
{ 0, 0 }, \
|
|
|
|
{ 0, 0 }, \
|
|
|
|
{ 0, 0 }, \
|
|
|
|
{ 0, 0 }, \
|
|
|
|
{ 0, 0 }, \
|
|
|
|
{ 0, 0 }, \
|
|
|
|
{ 0, 0 }, \
|
|
|
|
{ 0, 0 }, \
|
1999-07-02 12:46:47 +04:00
|
|
|
{ 0, 0 }, \
|
1999-07-01 12:12:45 +04:00
|
|
|
{ "ipsec", CTLTYPE_NODE }, \
|
2004-09-05 03:29:44 +04:00
|
|
|
{ 0, 0 }, \
|
|
|
|
{ 0, 0 }, \
|
|
|
|
{ 0, 0 }, \
|
|
|
|
{ 0, 0 }, \
|
|
|
|
{ 0, 0 }, \
|
|
|
|
{ 0, 0 }, \
|
|
|
|
{ 0, 0 }, \
|
|
|
|
{ 0, 0 }, \
|
|
|
|
{ 0, 0 }, \
|
|
|
|
{ 0, 0 }, \
|
|
|
|
{ 0, 0 }, \
|
|
|
|
{ 0, 0 }, \
|
|
|
|
{ 0, 0 }, \
|
|
|
|
{ 0, 0 }, \
|
|
|
|
{ 0, 0 }, \
|
|
|
|
{ 0, 0 }, \
|
|
|
|
{ 0, 0 }, \
|
|
|
|
{ 0, 0 }, \
|
|
|
|
{ 0, 0 }, \
|
|
|
|
{ 0, 0 }, \
|
|
|
|
{ 0, 0 }, \
|
|
|
|
{ 0, 0 }, \
|
|
|
|
{ 0, 0 }, \
|
|
|
|
{ 0, 0 }, \
|
|
|
|
{ 0, 0 }, \
|
|
|
|
{ 0, 0 }, \
|
|
|
|
{ 0, 0 }, \
|
|
|
|
{ 0, 0 }, \
|
|
|
|
{ 0, 0 }, \
|
|
|
|
{ 0, 0 }, \
|
|
|
|
{ 0, 0 }, \
|
|
|
|
{ 0, 0 }, \
|
|
|
|
{ 0, 0 }, \
|
|
|
|
{ 0, 0 }, \
|
|
|
|
{ 0, 0 }, \
|
|
|
|
{ 0, 0 }, \
|
|
|
|
{ 0, 0 }, \
|
|
|
|
{ 0, 0 }, \
|
|
|
|
{ 0, 0 }, \
|
|
|
|
{ 0, 0 }, \
|
|
|
|
{ 0, 0 }, \
|
|
|
|
{ 0, 0 }, \
|
|
|
|
{ 0, 0 }, \
|
|
|
|
{ 0, 0 }, \
|
|
|
|
{ 0, 0 }, \
|
|
|
|
{ 0, 0 }, \
|
|
|
|
{ 0, 0 }, \
|
|
|
|
{ 0, 0 }, \
|
|
|
|
{ 0, 0 }, \
|
|
|
|
{ 0, 0 }, \
|
|
|
|
{ 0, 0 }, \
|
|
|
|
{ "pim", CTLTYPE_NODE }, \
|
1994-05-13 10:02:48 +04:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Names for IP sysctl objects
|
|
|
|
*/
|
|
|
|
#define IPCTL_FORWARDING 1 /* act as router */
|
|
|
|
#define IPCTL_SENDREDIRECTS 2 /* may send redirects when forwarding */
|
|
|
|
#define IPCTL_DEFTTL 3 /* default TTL */
|
|
|
|
#ifdef notyet
|
|
|
|
#define IPCTL_DEFMTU 4 /* default MTU */
|
1993-03-21 12:45:37 +03:00
|
|
|
#endif
|
1997-02-25 11:35:41 +03:00
|
|
|
#define IPCTL_FORWSRCRT 5 /* forward source-routed packets */
|
1996-01-16 07:17:30 +03:00
|
|
|
#define IPCTL_DIRECTEDBCAST 6 /* default broadcast behavior */
|
1997-02-25 11:35:41 +03:00
|
|
|
#define IPCTL_ALLOWSRCRT 7 /* allow/drop all source-routed pkts */
|
1997-10-18 01:20:49 +04:00
|
|
|
#define IPCTL_SUBNETSARELOCAL 8 /* treat subnets as local addresses */
|
1997-10-19 01:18:28 +04:00
|
|
|
#define IPCTL_MTUDISC 9 /* allow path MTU discovery */
|
1998-01-05 12:52:02 +03:00
|
|
|
#define IPCTL_ANONPORTMIN 10 /* minimum ephemeral port */
|
|
|
|
#define IPCTL_ANONPORTMAX 11 /* maximum ephemeral port */
|
1998-04-29 07:44:11 +04:00
|
|
|
#define IPCTL_MTUDISCTIMEOUT 12 /* allow path MTU discovery */
|
1998-05-04 23:24:53 +04:00
|
|
|
#define IPCTL_MAXFLOWS 13 /* maximum ip flows allowed */
|
1999-06-26 10:16:47 +04:00
|
|
|
#define IPCTL_HOSTZEROBROADCAST 14 /* is host zero a broadcast addr? */
|
2000-08-28 06:12:22 +04:00
|
|
|
#define IPCTL_GIF_TTL 15 /* default TTL for gif encap packet */
|
|
|
|
#define IPCTL_LOWPORTMIN 16 /* minimum reserved port */
|
|
|
|
#define IPCTL_LOWPORTMAX 17 /* maximum reserved port */
|
2001-03-27 06:24:38 +04:00
|
|
|
#define IPCTL_MAXFRAGPACKETS 18 /* max packets reassembly queue */
|
2003-04-12 04:17:49 +04:00
|
|
|
#define IPCTL_GRE_TTL 19 /* default TTL for gre encap packet */
|
|
|
|
#define IPCTL_CHECKINTERFACE 20 /* drop pkts in from 'wrong' iface */
|
2003-11-10 23:50:29 +03:00
|
|
|
#define IPCTL_IFQ 21 /* ipintrq node */
|
2003-11-19 21:39:34 +03:00
|
|
|
#define IPCTL_RANDOMID 22 /* use random IP ids (if configured) */
|
2004-12-15 07:25:19 +03:00
|
|
|
#define IPCTL_LOOPBACKCKSUM 23 /* do IP checksum on loopback */
|
2005-08-05 13:21:25 +04:00
|
|
|
#define IPCTL_STATS 24 /* IP statistics */
|
|
|
|
#define IPCTL_MAXID 25
|
1993-04-19 07:45:34 +04:00
|
|
|
|
1994-05-13 10:02:48 +04:00
|
|
|
#define IPCTL_NAMES { \
|
|
|
|
{ 0, 0 }, \
|
|
|
|
{ "forwarding", CTLTYPE_INT }, \
|
|
|
|
{ "redirect", CTLTYPE_INT }, \
|
|
|
|
{ "ttl", CTLTYPE_INT }, \
|
|
|
|
{ "mtu", CTLTYPE_INT }, \
|
1996-01-16 00:11:46 +03:00
|
|
|
{ "forwsrcrt", CTLTYPE_INT }, \
|
1996-01-16 07:17:30 +03:00
|
|
|
{ "directed-broadcast", CTLTYPE_INT }, \
|
1997-02-25 11:35:41 +03:00
|
|
|
{ "allowsrcrt", CTLTYPE_INT }, \
|
1997-10-18 01:20:49 +04:00
|
|
|
{ "subnetsarelocal", CTLTYPE_INT }, \
|
1997-10-19 01:18:28 +04:00
|
|
|
{ "mtudisc", CTLTYPE_INT }, \
|
1998-01-05 12:52:02 +03:00
|
|
|
{ "anonportmin", CTLTYPE_INT }, \
|
|
|
|
{ "anonportmax", CTLTYPE_INT }, \
|
1998-04-29 07:44:11 +04:00
|
|
|
{ "mtudisctimeout", CTLTYPE_INT }, \
|
1998-05-04 23:24:53 +04:00
|
|
|
{ "maxflows", CTLTYPE_INT }, \
|
1999-06-26 10:16:47 +04:00
|
|
|
{ "hostzerobroadcast", CTLTYPE_INT }, \
|
1999-07-01 12:12:45 +04:00
|
|
|
{ "gifttl", CTLTYPE_INT }, \
|
2000-08-25 17:35:05 +04:00
|
|
|
{ "lowportmin", CTLTYPE_INT }, \
|
|
|
|
{ "lowportmax", CTLTYPE_INT }, \
|
2001-03-27 06:24:38 +04:00
|
|
|
{ "maxfragpackets", CTLTYPE_INT }, \
|
2002-02-24 20:22:20 +03:00
|
|
|
{ "grettl", CTLTYPE_INT }, \
|
2003-04-12 04:17:49 +04:00
|
|
|
{ "checkinterface", CTLTYPE_INT }, \
|
2003-11-10 23:50:29 +03:00
|
|
|
{ "ifq", CTLTYPE_NODE }, \
|
2003-11-19 21:39:34 +03:00
|
|
|
{ "random_id", CTLTYPE_INT }, \
|
2004-12-15 07:25:19 +03:00
|
|
|
{ "do_loopback_cksum", CTLTYPE_INT }, \
|
2005-08-05 13:21:25 +04:00
|
|
|
{ "stats", CTLTYPE_STRUCT }, \
|
1994-05-13 10:02:48 +04:00
|
|
|
}
|
Add a new feature-test macro, _NETBSD_SOURCE. If this is defined
by the application, all NetBSD interfaces are made visible, even
if some other feature-test macro (like _POSIX_C_SOURCE) is defined.
<sys/featuretest.h> defined _NETBSD_SOURCE if none of _ANSI_SOURCE,
_POSIX_C_SOURCE and _XOPEN_SOURCE is defined, so as to preserve
existing behaviour.
This has two major advantages:
+ Programs that require non-POSIX facilities but define _POSIX_C_SOURCE
can trivially be overruled by putting -D_NETBSD_SOURCE in their CFLAGS.
+ It makes most of the #ifs simpler, in that they're all now ORs of the
various macros, rather than having checks for (!defined(_ANSI_SOURCE) ||
!defined(_POSIX_C_SOURCE) || !defined(_XOPEN_SOURCE)) all over the place.
I've tried not to change the semantics of the headers in any case where
_NETBSD_SOURCE wasn't defined, but there were some places where the
current semantics were clearly mad, and retaining them was harder than
correcting them. In particular, I've mostly normalised things so that
_ANSI_SOURCE gets you the smallest set of stuff, then _POSIX_C_SOURCE,
_XOPEN_SOURCE and _NETBSD_SOURCE in that order.
Tested by building for vax, encouraged by thorpej, and uncontested in
tech-userlevel for a week.
2003-04-29 03:16:11 +04:00
|
|
|
#endif /* _NETBSD_SOURCE */
|
1994-05-13 10:02:48 +04:00
|
|
|
|
1999-07-01 12:12:45 +04:00
|
|
|
/* INET6 stuff */
|
2000-08-28 06:12:22 +04:00
|
|
|
#define __KAME_NETINET_IN_H_INCLUDED_
|
1999-07-01 12:12:45 +04:00
|
|
|
#include <netinet6/in6.h>
|
2000-02-09 03:54:55 +03:00
|
|
|
#undef __KAME_NETINET_IN_H_INCLUDED_
|
1994-05-13 10:02:48 +04:00
|
|
|
|
1995-03-27 00:23:52 +04:00
|
|
|
#ifdef _KERNEL
|
2001-06-02 20:17:09 +04:00
|
|
|
/*
|
|
|
|
* in_cksum_phdr:
|
|
|
|
*
|
|
|
|
* Compute significant parts of the IPv4 checksum pseudo-header
|
|
|
|
* for use in a delayed TCP/UDP checksum calculation.
|
|
|
|
*
|
|
|
|
* Args:
|
|
|
|
*
|
|
|
|
* src Source IP address
|
|
|
|
* dst Destination IP address
|
|
|
|
* lenproto htons(proto-hdr-len + proto-number)
|
|
|
|
*/
|
2006-02-16 23:17:12 +03:00
|
|
|
static __inline u_int16_t __attribute__((__unused__))
|
2001-06-02 20:17:09 +04:00
|
|
|
in_cksum_phdr(u_int32_t src, u_int32_t dst, u_int32_t lenproto)
|
|
|
|
{
|
|
|
|
u_int32_t sum;
|
|
|
|
|
|
|
|
sum = lenproto +
|
|
|
|
(u_int16_t)(src >> 16) +
|
|
|
|
(u_int16_t)(src /*& 0xffff*/) +
|
|
|
|
(u_int16_t)(dst >> 16) +
|
|
|
|
(u_int16_t)(dst /*& 0xffff*/);
|
|
|
|
|
|
|
|
sum = (u_int16_t)(sum >> 16) + (u_int16_t)(sum /*& 0xffff*/);
|
|
|
|
|
|
|
|
if (sum > 0xffff)
|
|
|
|
sum -= 0xffff;
|
|
|
|
|
|
|
|
return (sum);
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* in_cksum_addword:
|
|
|
|
*
|
|
|
|
* Add the two 16-bit network-order values, carry, and return.
|
|
|
|
*/
|
2006-02-16 23:17:12 +03:00
|
|
|
static __inline u_int16_t __attribute__((__unused__))
|
2001-06-02 20:17:09 +04:00
|
|
|
in_cksum_addword(u_int16_t a, u_int16_t b)
|
|
|
|
{
|
|
|
|
u_int32_t sum = a + b;
|
|
|
|
|
|
|
|
if (sum > 0xffff)
|
|
|
|
sum -= 0xffff;
|
|
|
|
|
|
|
|
return (sum);
|
|
|
|
}
|
|
|
|
|
1996-09-09 18:51:07 +04:00
|
|
|
extern struct in_addr zeroin_addr;
|
2000-02-17 13:59:32 +03:00
|
|
|
extern u_char ip_protox[];
|
1996-09-09 18:51:07 +04:00
|
|
|
|
2004-04-21 21:49:46 +04:00
|
|
|
int in_broadcast(struct in_addr, struct ifnet *);
|
|
|
|
int in_canforward(struct in_addr);
|
|
|
|
int in_cksum(struct mbuf *, int);
|
|
|
|
int in4_cksum(struct mbuf *, u_int8_t, int, int);
|
|
|
|
void in_delayed_cksum(struct mbuf *);
|
|
|
|
int in_localaddr(struct in_addr);
|
|
|
|
void in_socktrim(struct sockaddr_in *);
|
1996-09-09 18:51:07 +04:00
|
|
|
|
|
|
|
#define in_hosteq(s,t) ((s).s_addr == (t).s_addr)
|
|
|
|
#define in_nullhost(x) ((x).s_addr == INADDR_ANY)
|
1995-06-04 09:06:49 +04:00
|
|
|
|
|
|
|
#define satosin(sa) ((struct sockaddr_in *)(sa))
|
KNF: de-__P, bzero -> memset, bcmp -> memcmp. Remove extraneous
parentheses in return statements.
Cosmetic: don't open-code TAILQ_FOREACH().
Cosmetic: change types of variables to avoid oodles of casts: in
in6_src.c, avoid casts by changing several route_in6 pointers
to struct route pointers. Remove unnecessary casts to caddr_t
elsewhere.
Pave the way for eliminating address family-specific route caches:
soon, struct route will not embed a sockaddr, but it will hold
a reference to an external sockaddr, instead. We will set the
destination sockaddr using rtcache_setdst(). (I created a stub
for it, but it isn't used anywhere, yet.) rtcache_free() will
free the sockaddr. I have extracted from rtcache_free() a helper
subroutine, rtcache_clear(). rtcache_clear() will "forget" a
cached route, but it will not forget the destination by releasing
the sockaddr. I use rtcache_clear() instead of rtcache_free()
in rtcache_update(), because rtcache_update() is not supposed
to forget the destination.
Constify:
1 Introduce const accessor for route->ro_dst, rtcache_getdst().
2 Constify the 'dst' argument to ifnet->if_output(). This
led me to constify a lot of code called by output routines.
3 Constify the sockaddr argument to protosw->pr_ctlinput. This
led me to constify a lot of code called by ctlinput routines.
4 Introduce const macros for converting from a generic sockaddr
to family-specific sockaddrs, e.g., sockaddr_in: satocsin6,
satocsin, et cetera.
2007-02-18 01:34:07 +03:00
|
|
|
#define satocsin(sa) ((const struct sockaddr_in *)(sa))
|
1995-06-04 09:06:49 +04:00
|
|
|
#define sintosa(sin) ((struct sockaddr *)(sin))
|
Eliminate address family-specific route caches (struct route, struct
route_in6, struct route_iso), replacing all caches with a struct
route.
The principle benefit of this change is that all of the protocol
families can benefit from route cache-invalidation, which is
necessary for correct routing. Route-cache invalidation fixes an
ancient PR, kern/3508, at long last; it fixes various other PRs,
also.
Discussions with and ideas from Joerg Sonnenberger influenced this
work tremendously. Of course, all design oversights and bugs are
mine.
DETAILS
1 I added to each address family a pool of sockaddrs. I have
introduced routines for allocating, copying, and duplicating,
and freeing sockaddrs:
struct sockaddr *sockaddr_alloc(sa_family_t af, int flags);
struct sockaddr *sockaddr_copy(struct sockaddr *dst,
const struct sockaddr *src);
struct sockaddr *sockaddr_dup(const struct sockaddr *src, int flags);
void sockaddr_free(struct sockaddr *sa);
sockaddr_alloc() returns either a sockaddr from the pool belonging
to the specified family, or NULL if the pool is exhausted. The
returned sockaddr has the right size for that family; sa_family
and sa_len fields are initialized to the family and sockaddr
length---e.g., sa_family = AF_INET and sa_len = sizeof(struct
sockaddr_in). sockaddr_free() puts the given sockaddr back into
its family's pool.
sockaddr_dup() and sockaddr_copy() work analogously to strdup()
and strcpy(), respectively. sockaddr_copy() KASSERTs that the
family of the destination and source sockaddrs are alike.
The 'flags' argumet for sockaddr_alloc() and sockaddr_dup() is
passed directly to pool_get(9).
2 I added routines for initializing sockaddrs in each address
family, sockaddr_in_init(), sockaddr_in6_init(), sockaddr_iso_init(),
etc. They are fairly self-explanatory.
3 structs route_in6 and route_iso are no more. All protocol families
use struct route. I have changed the route cache, 'struct route',
so that it does not contain storage space for a sockaddr. Instead,
struct route points to a sockaddr coming from the pool the sockaddr
belongs to. I added a new method to struct route, rtcache_setdst(),
for setting the cache destination:
int rtcache_setdst(struct route *, const struct sockaddr *);
rtcache_setdst() returns 0 on success, or ENOMEM if no memory is
available to create the sockaddr storage.
It is now possible for rtcache_getdst() to return NULL if, say,
rtcache_setdst() failed. I check the return value for NULL
everywhere in the kernel.
4 Each routing domain (struct domain) has a list of live route
caches, dom_rtcache. rtflushall(sa_family_t af) looks up the
domain indicated by 'af', walks the domain's list of route caches
and invalidates each one.
2007-05-03 00:40:22 +04:00
|
|
|
#define sintocsa(sin) ((const struct sockaddr *)(sin))
|
1995-06-04 09:06:49 +04:00
|
|
|
#define ifatoia(ifa) ((struct in_ifaddr *)(ifa))
|
Eliminate address family-specific route caches (struct route, struct
route_in6, struct route_iso), replacing all caches with a struct
route.
The principle benefit of this change is that all of the protocol
families can benefit from route cache-invalidation, which is
necessary for correct routing. Route-cache invalidation fixes an
ancient PR, kern/3508, at long last; it fixes various other PRs,
also.
Discussions with and ideas from Joerg Sonnenberger influenced this
work tremendously. Of course, all design oversights and bugs are
mine.
DETAILS
1 I added to each address family a pool of sockaddrs. I have
introduced routines for allocating, copying, and duplicating,
and freeing sockaddrs:
struct sockaddr *sockaddr_alloc(sa_family_t af, int flags);
struct sockaddr *sockaddr_copy(struct sockaddr *dst,
const struct sockaddr *src);
struct sockaddr *sockaddr_dup(const struct sockaddr *src, int flags);
void sockaddr_free(struct sockaddr *sa);
sockaddr_alloc() returns either a sockaddr from the pool belonging
to the specified family, or NULL if the pool is exhausted. The
returned sockaddr has the right size for that family; sa_family
and sa_len fields are initialized to the family and sockaddr
length---e.g., sa_family = AF_INET and sa_len = sizeof(struct
sockaddr_in). sockaddr_free() puts the given sockaddr back into
its family's pool.
sockaddr_dup() and sockaddr_copy() work analogously to strdup()
and strcpy(), respectively. sockaddr_copy() KASSERTs that the
family of the destination and source sockaddrs are alike.
The 'flags' argumet for sockaddr_alloc() and sockaddr_dup() is
passed directly to pool_get(9).
2 I added routines for initializing sockaddrs in each address
family, sockaddr_in_init(), sockaddr_in6_init(), sockaddr_iso_init(),
etc. They are fairly self-explanatory.
3 structs route_in6 and route_iso are no more. All protocol families
use struct route. I have changed the route cache, 'struct route',
so that it does not contain storage space for a sockaddr. Instead,
struct route points to a sockaddr coming from the pool the sockaddr
belongs to. I added a new method to struct route, rtcache_setdst(),
for setting the cache destination:
int rtcache_setdst(struct route *, const struct sockaddr *);
rtcache_setdst() returns 0 on success, or ENOMEM if no memory is
available to create the sockaddr storage.
It is now possible for rtcache_getdst() to return NULL if, say,
rtcache_setdst() failed. I check the return value for NULL
everywhere in the kernel.
4 Each routing domain (struct domain) has a list of live route
caches, dom_rtcache. rtflushall(sa_family_t af) looks up the
domain indicated by 'af', walks the domain's list of route caches
and invalidates each one.
2007-05-03 00:40:22 +04:00
|
|
|
|
|
|
|
int sockaddr_in_cmp(const struct sockaddr *, const struct sockaddr *);
|
|
|
|
|
|
|
|
static inline void
|
|
|
|
sockaddr_in_init1(struct sockaddr_in *sin, const struct in_addr *addr,
|
|
|
|
in_port_t port)
|
|
|
|
{
|
|
|
|
sin->sin_port = port;
|
|
|
|
sin->sin_addr = *addr;
|
|
|
|
memset(sin->sin_zero, 0, sizeof(sin->sin_zero));
|
|
|
|
}
|
|
|
|
|
|
|
|
static inline void
|
|
|
|
sockaddr_in_init(struct sockaddr_in *sin, const struct in_addr *addr,
|
|
|
|
in_port_t port)
|
|
|
|
{
|
|
|
|
sin->sin_family = AF_INET;
|
|
|
|
sin->sin_len = sizeof(*sin);
|
|
|
|
sockaddr_in_init1(sin, addr, port);
|
|
|
|
}
|
|
|
|
|
|
|
|
static inline struct sockaddr *
|
|
|
|
sockaddr_in_alloc(const struct in_addr *addr, in_port_t port, int flags)
|
|
|
|
{
|
|
|
|
struct sockaddr *sa;
|
|
|
|
|
|
|
|
if ((sa = sockaddr_alloc(AF_INET, flags)) == NULL)
|
|
|
|
return NULL;
|
|
|
|
|
|
|
|
sockaddr_in_init1(satosin(sa), addr, port);
|
|
|
|
|
|
|
|
return sa;
|
|
|
|
}
|
1998-09-05 23:03:25 +04:00
|
|
|
#endif /* _KERNEL */
|
1998-02-10 04:26:19 +03:00
|
|
|
|
1994-05-14 10:25:32 +04:00
|
|
|
#endif /* !_NETINET_IN_H_ */
|