2021-02-03 21:13:13 +03:00
|
|
|
/* $NetBSD: in.h,v 1.114 2021/02/03 18:13:13 roy 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
|
|
|
|
2013-04-28 01:35:24 +04:00
|
|
|
#include <sys/featuretest.h>
|
2002-05-13 17:34:32 +04:00
|
|
|
#include <machine/int_types.h>
|
|
|
|
|
2018-11-09 14:46:28 +03:00
|
|
|
#ifndef _BSD_UINT8_T_
|
2002-05-13 17:34:32 +04:00
|
|
|
typedef __uint8_t uint8_t;
|
2018-11-09 14:46:28 +03:00
|
|
|
#define _BSD_UINT8_T_
|
2002-05-13 17:34:32 +04:00
|
|
|
#endif
|
|
|
|
|
2018-11-09 14:46:28 +03:00
|
|
|
#ifndef _BSD_UINT32_T_
|
2002-05-13 17:34:32 +04:00
|
|
|
typedef __uint32_t uint32_t;
|
2018-11-09 14:46:28 +03:00
|
|
|
#define _BSD_UINT32_T_
|
2002-05-13 17:34:32 +04:00
|
|
|
#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 */
|
2015-02-10 22:11:52 +03:00
|
|
|
#define IPPROTO_DCCP 33 /* DCCP */
|
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 */
|
2017-02-16 11:12:43 +03:00
|
|
|
#define IPPROTO_L2TP 115 /* L2TPv3 */
|
2015-10-14 00:28:34 +03:00
|
|
|
#define IPPROTO_SCTP 132 /* SCTP */
|
2009-09-14 14:36:48 +04:00
|
|
|
#define IPPROTO_PFSYNC 240 /* PFSYNC */
|
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;
|
2021-02-03 08:51:40 +03:00
|
|
|
};
|
2021-02-03 21:13:13 +03:00
|
|
|
#ifdef __CTASSERT
|
|
|
|
__CTASSERT(sizeof(struct in_addr) == 4);
|
2021-02-03 14:53:43 +03:00
|
|
|
#endif
|
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! */
|
|
|
|
|
2019-12-18 03:49:15 +03:00
|
|
|
#define IN_RFC3021_MASK __IPADDR(0xfffffffe)
|
|
|
|
|
1993-03-21 12:45:37 +03:00
|
|
|
/*
|
|
|
|
* 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 */
|
2014-10-12 23:02:18 +04:00
|
|
|
/* The add and drop membership option numbers need to match with the v6 ones */
|
1994-05-13 10:02:48 +04:00
|
|
|
#define IP_ADD_MEMBERSHIP 12 /* ip_mreq; add an IP group membership */
|
|
|
|
#define IP_DROP_MEMBERSHIP 13 /* ip_mreq; drop an IP group membership */
|
2012-06-22 18:54:34 +04:00
|
|
|
#define IP_PORTALGO 18 /* int; port selection algo (rfc6056) */
|
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 */
|
2014-05-30 05:39:03 +04:00
|
|
|
#define IP_IPSEC_POLICY 22 /* struct; get/set security policy */
|
2009-07-16 08:09:51 +04:00
|
|
|
#define IP_RECVTTL 23 /* bool; receive IP TTL w/dgram */
|
2009-07-18 02:02:54 +04:00
|
|
|
#define IP_MINTTL 24 /* minimum TTL for packet or drop */
|
1) "#define ipi_spec_dst ipi_addr" in <netinet/in.h>
2) Change the IP_RECVPKTINFO option to control the generation of
IP_PKTINFO control messages, the way it's done in Solaris.
3) Remove the superfluous IP_RECVPKTINFO control message.
4) Change the IP_PKTINFO option to do different things depending on
the parameter it's supplied with:
- If it's sizeof(int), assume it's being used as in Linux:
- If it's non-zero, turn on the IP_RECVPKTINFO option.
- If it's zero, turn off the IP_RECVPKTINFO option.
- If it's sizeof(struct in_pktinfo), assume it's being used as in
Solaris, to set a default for the source interface and/or
source address for outgoing packets on the socket.
5) Return what Linux or Solaris compatible code expects, depending
on data size, and just added a fallback to a Linux (and current NetBSD)
compatible value if the size is unknown (as it is now), or,
in the future, if the calling application specifies a receiving
buffer that doesn't match either data item.
From: Tom Ivar Helbekkmo
2018-01-01 03:51:36 +03:00
|
|
|
#define IP_PKTINFO 25 /* struct; set default src if/addr */
|
|
|
|
#define IP_RECVPKTINFO 26 /* int; receive dst if/addr w/dgram */
|
2020-09-08 17:12:57 +03:00
|
|
|
#define IP_BINDANY 27 /* bool: allow bind to any address */
|
1) "#define ipi_spec_dst ipi_addr" in <netinet/in.h>
2) Change the IP_RECVPKTINFO option to control the generation of
IP_PKTINFO control messages, the way it's done in Solaris.
3) Remove the superfluous IP_RECVPKTINFO control message.
4) Change the IP_PKTINFO option to do different things depending on
the parameter it's supplied with:
- If it's sizeof(int), assume it's being used as in Linux:
- If it's non-zero, turn on the IP_RECVPKTINFO option.
- If it's zero, turn off the IP_RECVPKTINFO option.
- If it's sizeof(struct in_pktinfo), assume it's being used as in
Solaris, to set a default for the source interface and/or
source address for outgoing packets on the socket.
5) Return what Linux or Solaris compatible code expects, depending
on data size, and just added a fallback to a Linux (and current NetBSD)
compatible value if the size is unknown (as it is now), or,
in the future, if the calling application specifies a receiving
buffer that doesn't match either data item.
From: Tom Ivar Helbekkmo
2018-01-01 03:51:36 +03:00
|
|
|
#define IP_SENDSRCADDR IP_RECVDSTADDR /* FreeBSD compatibility */
|
2013-06-27 23:38:16 +04:00
|
|
|
|
|
|
|
/*
|
|
|
|
* Information sent in the control message of a datagram socket for
|
|
|
|
* IP_PKTINFO and IP_RECVPKTINFO.
|
|
|
|
*/
|
|
|
|
struct in_pktinfo {
|
|
|
|
struct in_addr ipi_addr; /* src/dst address */
|
|
|
|
unsigned int ipi_ifindex; /* interface index */
|
|
|
|
};
|
1994-05-13 10:02:48 +04:00
|
|
|
|
1) "#define ipi_spec_dst ipi_addr" in <netinet/in.h>
2) Change the IP_RECVPKTINFO option to control the generation of
IP_PKTINFO control messages, the way it's done in Solaris.
3) Remove the superfluous IP_RECVPKTINFO control message.
4) Change the IP_PKTINFO option to do different things depending on
the parameter it's supplied with:
- If it's sizeof(int), assume it's being used as in Linux:
- If it's non-zero, turn on the IP_RECVPKTINFO option.
- If it's zero, turn off the IP_RECVPKTINFO option.
- If it's sizeof(struct in_pktinfo), assume it's being used as in
Solaris, to set a default for the source interface and/or
source address for outgoing packets on the socket.
5) Return what Linux or Solaris compatible code expects, depending
on data size, and just added a fallback to a Linux (and current NetBSD)
compatible value if the size is unknown (as it is now), or,
in the future, if the calling application specifies a receiving
buffer that doesn't match either data item.
From: Tom Ivar Helbekkmo
2018-01-01 03:51:36 +03:00
|
|
|
#define ipi_spec_dst ipi_addr /* Solaris/Linux compatibility */
|
|
|
|
|
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.
|
|
|
|
*/
|
|
|
|
|
|
|
|
/*
|
|
|
|
* 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 */
|
2018-02-09 21:31:52 +03:00
|
|
|
/* IPCTL_DEFMTU=4, never implemented */
|
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 */
|
2014-06-06 03:48:16 +04:00
|
|
|
#define IPCTL_IFQ 21 /* IP packet input queue */
|
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 */
|
2015-05-02 17:41:32 +03:00
|
|
|
#define IPCTL_DAD_COUNT 25 /* DAD packets to send */
|
2018-08-22 04:05:21 +03: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
|
2016-08-01 06:15:30 +03:00
|
|
|
#include <sys/psref.h>
|
|
|
|
|
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)
|
|
|
|
*/
|
2007-12-25 21:33:32 +03:00
|
|
|
static __inline u_int16_t __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.
|
|
|
|
*/
|
2007-12-25 21:33:32 +03:00
|
|
|
static __inline u_int16_t __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[];
|
1) Introduce a new socket option, (SOL_SOCKET, SO_NOHEADER), that
tells a socket that it should both add a protocol header to tx'd
datagrams and remove the header from rx'd datagrams:
int onoff = 1, s = socket(...);
setsockopt(s, SOL_SOCKET, SO_NOHEADER, &onoff);
2) Add an implementation of (SOL_SOCKET, SO_NOHEADER) for raw IPv4
sockets.
3) Reorganize the protocols' pr_ctloutput implementations a bit.
Consistently return ENOPROTOOPT when an option is unsupported,
and EINVAL if a supported option's arguments are incorrect.
Reorganize the flow of code so that it's more clear how/when
options are passed down the stack until they are handled.
Shorten some pr_ctloutput staircases for readability.
4) Extract common mbuf code into subroutines, add new sockaddr
methods, and introduce a new subroutine, fsocreate(), for reuse
later; use it first in sys_socket():
struct mbuf *m_getsombuf(struct socket *so)
Create an mbuf and make its owner the socket `so'.
struct mbuf *m_intopt(struct socket *so, int val)
Create an mbuf, make its owner the socket `so', put the
int `val' into it, and set its length to sizeof(int).
int fsocreate(..., int *fd)
Create a socket, a la socreate(9), put the socket into the
given LWP's descriptor table, return the descriptor at `fd'
on success.
void *sockaddr_addr(struct sockaddr *sa, socklen_t *slenp)
const void *sockaddr_const_addr(const struct sockaddr *sa, socklen_t *slenp)
Extract a pointer to the address part of a sockaddr. Write
the length of the address part at `slenp', if `slenp' is
not NULL.
socklen_t sockaddr_getlen(const struct sockaddr *sa)
Return the length of a sockaddr. This just evaluates to
sa->sa_len. I only add this for consistency with code that
appears in a portable userland library that I am going to
import.
const struct sockaddr *sockaddr_any(const struct sockaddr *sa)
Return the "don't care" sockaddr in the same family as
`sa'. This is the address a client should sobind(9) if it
does not care the source address and, if applicable, the
port et cetera that it uses.
const void *sockaddr_anyaddr(const struct sockaddr *sa, socklen_t *slenp)
Return the "don't care" sockaddr in the same family as
`sa'. This is the address a client should sobind(9) if it
does not care the source address and, if applicable, the
port et cetera that it uses.
2007-09-19 08:33:42 +04:00
|
|
|
extern const struct sockaddr_in in_any;
|
1996-09-09 18:51:07 +04:00
|
|
|
|
2004-04-21 21:49:46 +04:00
|
|
|
int in_broadcast(struct in_addr, struct ifnet *);
|
2017-08-10 07:31:58 +03:00
|
|
|
int in_direct(struct in_addr, struct ifnet *);
|
2004-04-21 21:49:46 +04:00
|
|
|
int in_canforward(struct in_addr);
|
2008-01-26 00:12:10 +03:00
|
|
|
int cpu_in_cksum(struct mbuf *, int, int, uint32_t);
|
2004-04-21 21:49:46 +04:00
|
|
|
int in_cksum(struct mbuf *, int);
|
|
|
|
int in4_cksum(struct mbuf *, u_int8_t, int, int);
|
|
|
|
int in_localaddr(struct in_addr);
|
|
|
|
void in_socktrim(struct sockaddr_in *);
|
1996-09-09 18:51:07 +04:00
|
|
|
|
2020-08-21 00:21:31 +03:00
|
|
|
void in_len2mask(struct in_addr *, u_int);
|
|
|
|
|
2015-05-02 17:41:32 +03:00
|
|
|
void in_if_link_up(struct ifnet *);
|
|
|
|
void in_if_link_down(struct ifnet *);
|
|
|
|
void in_if_up(struct ifnet *);
|
|
|
|
void in_if_down(struct ifnet *);
|
|
|
|
void in_if_link_state_change(struct ifnet *, int);
|
|
|
|
|
2014-05-23 02:01:12 +04:00
|
|
|
struct route;
|
|
|
|
struct ip_moptions;
|
|
|
|
|
2016-08-01 06:15:30 +03:00
|
|
|
struct in_ifaddr *in_selectsrc(struct sockaddr_in *,
|
|
|
|
struct route *, int, struct ip_moptions *, int *, struct psref *);
|
2014-05-23 02:01:12 +04:00
|
|
|
|
2018-01-10 13:56:30 +03:00
|
|
|
struct ip;
|
|
|
|
int in_tunnel_validate(const struct ip *, struct in_addr, struct in_addr);
|
|
|
|
|
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 *);
|
1) Introduce a new socket option, (SOL_SOCKET, SO_NOHEADER), that
tells a socket that it should both add a protocol header to tx'd
datagrams and remove the header from rx'd datagrams:
int onoff = 1, s = socket(...);
setsockopt(s, SOL_SOCKET, SO_NOHEADER, &onoff);
2) Add an implementation of (SOL_SOCKET, SO_NOHEADER) for raw IPv4
sockets.
3) Reorganize the protocols' pr_ctloutput implementations a bit.
Consistently return ENOPROTOOPT when an option is unsupported,
and EINVAL if a supported option's arguments are incorrect.
Reorganize the flow of code so that it's more clear how/when
options are passed down the stack until they are handled.
Shorten some pr_ctloutput staircases for readability.
4) Extract common mbuf code into subroutines, add new sockaddr
methods, and introduce a new subroutine, fsocreate(), for reuse
later; use it first in sys_socket():
struct mbuf *m_getsombuf(struct socket *so)
Create an mbuf and make its owner the socket `so'.
struct mbuf *m_intopt(struct socket *so, int val)
Create an mbuf, make its owner the socket `so', put the
int `val' into it, and set its length to sizeof(int).
int fsocreate(..., int *fd)
Create a socket, a la socreate(9), put the socket into the
given LWP's descriptor table, return the descriptor at `fd'
on success.
void *sockaddr_addr(struct sockaddr *sa, socklen_t *slenp)
const void *sockaddr_const_addr(const struct sockaddr *sa, socklen_t *slenp)
Extract a pointer to the address part of a sockaddr. Write
the length of the address part at `slenp', if `slenp' is
not NULL.
socklen_t sockaddr_getlen(const struct sockaddr *sa)
Return the length of a sockaddr. This just evaluates to
sa->sa_len. I only add this for consistency with code that
appears in a portable userland library that I am going to
import.
const struct sockaddr *sockaddr_any(const struct sockaddr *sa)
Return the "don't care" sockaddr in the same family as
`sa'. This is the address a client should sobind(9) if it
does not care the source address and, if applicable, the
port et cetera that it uses.
const void *sockaddr_anyaddr(const struct sockaddr *sa, socklen_t *slenp)
Return the "don't care" sockaddr in the same family as
`sa'. This is the address a client should sobind(9) if it
does not care the source address and, if applicable, the
port et cetera that it uses.
2007-09-19 08:33:42 +04:00
|
|
|
const void *sockaddr_in_const_addr(const struct sockaddr *, socklen_t *);
|
|
|
|
void *sockaddr_in_addr(struct sockaddr *, socklen_t *);
|
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
|
|
|
|
2018-04-20 00:20:43 +03:00
|
|
|
static __inline void
|
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
|
|
|
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));
|
|
|
|
}
|
|
|
|
|
2018-04-20 00:20:43 +03:00
|
|
|
static __inline void
|
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
|
|
|
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);
|
|
|
|
}
|
|
|
|
|
2018-04-20 00:20:43 +03:00
|
|
|
static __inline struct sockaddr *
|
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
|
|
|
sockaddr_in_alloc(const struct in_addr *addr, in_port_t port, int flags)
|
|
|
|
{
|
|
|
|
struct sockaddr *sa;
|
|
|
|
|
Use malloc(9) for sockaddrs instead of pool(9), and remove dom_sa_pool
and dom_sa_len members from struct domain. Pools of fixed-size
objects are too rigid for sockaddr_dls, whose size can vary over
a wide range.
Return sockaddr_dl to its "historical" size. Now that I'm using
malloc(9) instead of pool(9) to allocate sockaddr_dl, I can create
a sockaddr_dl of any size in the kernel, so expanding sockaddr_dl
is useless.
Avoid using sizeof(struct sockaddr_dl) in the kernel.
Introduce sockaddr_dl_alloc() for allocating & initializing an
arbitrary sockaddr_dl on the heap.
Add an argument, the sockaddr length, to sockaddr_alloc(),
sockaddr_copy(), and sockaddr_dl_setaddr().
Constify: LLADDR() -> CLLADDR().
Where the kernel overwrites LLADDR(), use sockaddr_dl_setaddr(),
instead. Used properly, sockaddr_dl_setaddr() will not overrun
the end of the sockaddr.
2007-08-30 06:17:34 +04:00
|
|
|
sa = sockaddr_alloc(AF_INET, sizeof(struct sockaddr_in), flags);
|
|
|
|
|
|
|
|
if (sa == NULL)
|
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
|
|
|
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
|
|
|
|
2014-12-02 22:35:27 +03:00
|
|
|
#if defined(_KERNEL) || defined(_TEST)
|
|
|
|
int in_print(char *, size_t, const struct in_addr *);
|
2014-12-02 23:25:47 +03:00
|
|
|
#define IN_PRINT(b, a) (in_print((b), sizeof(b), a), (b))
|
2014-12-02 22:35:27 +03:00
|
|
|
int sin_print(char *, size_t, const void *);
|
|
|
|
#endif
|
|
|
|
|
1994-05-14 10:25:32 +04:00
|
|
|
#endif /* !_NETINET_IN_H_ */
|