usr/src/uts/common/inet/ip.h
author masputra
Sat, 22 Oct 2005 22:50:14 -0700
changeset 741 40027a3621ac
parent 679 f2c9450b58f4
child 898 64b2a371a6bd
permissions -rw-r--r--
PSARC 2005/082 Yosemite: UDP Performance Enhancement 4796051 Solaris needs a more complete HW checksumming support 4905227 duplicate macros in ipclassifier.h and ip.h 4915681 need hardware checksum offload for the case of IP/UDP reassembly 6201076 outbound flow-control dysfunctional, ip to ce using mdt 6223331 ipv6 flow control may corrupt UDP packets 6223809 16-bit aligned IP header should be allowed for all x86 platforms 6275398 Galaxy hangs when running lmbench 6281836 Yosemite project integration into Solaris 6281885 xge needs to support IPv6 checksum offload 6282776 IPv6 NCE fast path is not created for incoming solicitation 6304890 IP transmit-side checksum logic needs to be tightened 6304902 IP6_IN_NOCKSUM is obsolete and should be torched 6304904 UDP should reject TI_GETPEERNAME for non-connected endpoint 6306768 IP and UDP device and module definitions need to be centralized
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     1
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     2
 * CDDL HEADER START
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     3
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     4
 * The contents of this file are subject to the terms of the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     5
 * Common Development and Distribution License, Version 1.0 only
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     6
 * (the "License").  You may not use this file except in compliance
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     7
 * with the License.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     8
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     9
 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    10
 * or http://www.opensolaris.org/os/licensing.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    11
 * See the License for the specific language governing permissions
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    12
 * and limitations under the License.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    13
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    14
 * When distributing Covered Code, include this CDDL HEADER in each
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    15
 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    16
 * If applicable, add the following below this CDDL HEADER, with the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    17
 * fields enclosed by brackets "[]" replaced with your own identifying
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    18
 * information: Portions Copyright [yyyy] [name of copyright owner]
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    19
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    20
 * CDDL HEADER END
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    21
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    22
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    23
 * Copyright 2005 Sun Microsystems, Inc.  All rights reserved.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    24
 * Use is subject to license terms.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    25
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    26
/* Copyright (c) 1990 Mentat Inc. */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    27
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    28
#ifndef	_INET_IP_H
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    29
#define	_INET_IP_H
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    30
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    31
#pragma ident	"%Z%%M%	%I%	%E% SMI"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    32
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    33
#ifdef	__cplusplus
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    34
extern "C" {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    35
#endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    36
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    37
#include <sys/isa_defs.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    38
#include <sys/types.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    39
#include <inet/mib2.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    40
#include <inet/nd.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    41
#include <sys/atomic.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    42
#include <sys/socket.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    43
#include <net/if_dl.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    44
#include <net/if.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    45
#include <netinet/ip.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    46
#include <sys/dlpi.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    47
#include <netinet/igmp.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    48
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    49
#ifdef _KERNEL
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    50
#include <netinet/ip6.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    51
#include <sys/avl.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    52
#include <sys/vmem.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    53
#include <sys/squeue.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    54
#include <sys/systm.h>
741
40027a3621ac PSARC 2005/082 Yosemite: UDP Performance Enhancement
masputra
parents: 679
diff changeset
    55
#include <sys/multidata.h>
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    56
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    57
#ifdef DEBUG
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    58
#define	ILL_DEBUG
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    59
#define	IRE_DEBUG
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    60
#define	NCE_DEBUG
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    61
#define	CONN_DEBUG
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    62
#endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    63
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    64
#define	IP_DEBUG
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    65
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    66
 * The mt-streams(9F) flags for the IP module; put here so that other
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    67
 * "drivers" that are actually IP (e.g., ICMP, UDP) can use the same set
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    68
 * of flags.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    69
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    70
#define	IP_DEVMTFLAGS D_MP
741
40027a3621ac PSARC 2005/082 Yosemite: UDP Performance Enhancement
masputra
parents: 679
diff changeset
    71
#endif	/* _KERNEL */
40027a3621ac PSARC 2005/082 Yosemite: UDP Performance Enhancement
masputra
parents: 679
diff changeset
    72
40027a3621ac PSARC 2005/082 Yosemite: UDP Performance Enhancement
masputra
parents: 679
diff changeset
    73
#define	IP_MOD_NAME	"ip"
40027a3621ac PSARC 2005/082 Yosemite: UDP Performance Enhancement
masputra
parents: 679
diff changeset
    74
#define	IP_DEV_NAME	"/dev/ip"
40027a3621ac PSARC 2005/082 Yosemite: UDP Performance Enhancement
masputra
parents: 679
diff changeset
    75
#define	IP6_DEV_NAME	"/dev/ip6"
40027a3621ac PSARC 2005/082 Yosemite: UDP Performance Enhancement
masputra
parents: 679
diff changeset
    76
40027a3621ac PSARC 2005/082 Yosemite: UDP Performance Enhancement
masputra
parents: 679
diff changeset
    77
#define	UDP_MOD_NAME	"udp"
40027a3621ac PSARC 2005/082 Yosemite: UDP Performance Enhancement
masputra
parents: 679
diff changeset
    78
#define	UDP_DEV_NAME	"/dev/udp"
40027a3621ac PSARC 2005/082 Yosemite: UDP Performance Enhancement
masputra
parents: 679
diff changeset
    79
#define	UDP6_DEV_NAME	"/dev/udp6"
40027a3621ac PSARC 2005/082 Yosemite: UDP Performance Enhancement
masputra
parents: 679
diff changeset
    80
40027a3621ac PSARC 2005/082 Yosemite: UDP Performance Enhancement
masputra
parents: 679
diff changeset
    81
#define	TCP_MOD_NAME	"tcp"
40027a3621ac PSARC 2005/082 Yosemite: UDP Performance Enhancement
masputra
parents: 679
diff changeset
    82
#define	TCP_DEV_NAME	"/dev/tcp"
40027a3621ac PSARC 2005/082 Yosemite: UDP Performance Enhancement
masputra
parents: 679
diff changeset
    83
#define	TCP6_DEV_NAME	"/dev/tcp6"
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    84
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    85
/* Minor numbers */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    86
#define	IPV4_MINOR	0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    87
#define	IPV6_MINOR	1
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    88
#define	TCP_MINOR	2
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    89
#define	TCP_MINOR6	3
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    90
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    91
#ifndef	_IPADDR_T
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    92
#define	_IPADDR_T
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    93
typedef uint32_t ipaddr_t;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    94
#endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    95
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    96
/* Number of bits in an address */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    97
#define	IP_ABITS		32
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    98
#define	IPV6_ABITS		128
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    99
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   100
#define	IP_HOST_MASK		(ipaddr_t)0xffffffffU
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   101
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   102
#define	IP_CSUM(mp, off, sum)		(~ip_cksum(mp, off, sum) & 0xFFFF)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   103
#define	IP_CSUM_PARTIAL(mp, off, sum)	ip_cksum(mp, off, sum)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   104
#define	IP_BCSUM_PARTIAL(bp, len, sum)	bcksum(bp, len, sum)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   105
#define	IP_MD_CSUM(pd, off, sum)	(~ip_md_cksum(pd, off, sum) & 0xffff)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   106
#define	IP_MD_CSUM_PARTIAL(pd, off, sum) ip_md_cksum(pd, off, sum)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   107
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   108
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   109
 * Flag to IP write side to indicate that the appln has sent in a pre-built
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   110
 * IP header. Stored in ipha_ident (which is otherwise zero).
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   111
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   112
#define	IP_HDR_INCLUDED			0xFFFF
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   113
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   114
#define	ILL_FRAG_HASH_TBL_COUNT	((unsigned int)64)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   115
#define	ILL_FRAG_HASH_TBL_SIZE	(ILL_FRAG_HASH_TBL_COUNT * sizeof (ipfb_t))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   116
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   117
#define	IPV4_ADDR_LEN			4
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   118
#define	IP_ADDR_LEN			IPV4_ADDR_LEN
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   119
#define	IP_ARP_PROTO_TYPE		0x0800
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   120
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   121
#define	IPV4_VERSION			4
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   122
#define	IP_VERSION			IPV4_VERSION
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   123
#define	IP_SIMPLE_HDR_LENGTH_IN_WORDS	5
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   124
#define	IP_SIMPLE_HDR_LENGTH		20
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   125
#define	IP_MAX_HDR_LENGTH		60
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   126
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   127
#define	IP_MIN_MTU			(IP_MAX_HDR_LENGTH + 8)	/* 68 bytes */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   128
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   129
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   130
 * XXX IP_MAXPACKET is defined in <netinet/ip.h> as well. At some point the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   131
 * 2 files should be cleaned up to remove all redundant definitions.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   132
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   133
#define	IP_MAXPACKET			65535
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   134
#define	IP_SIMPLE_HDR_VERSION \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   135
	((IP_VERSION << 4) | IP_SIMPLE_HDR_LENGTH_IN_WORDS)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   136
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   137
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   138
 * Constants and type definitions to support IP IOCTL commands
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   139
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   140
#define	IP_IOCTL			(('i'<<8)|'p')
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   141
#define	IP_IOC_IRE_DELETE		4
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   142
#define	IP_IOC_IRE_DELETE_NO_REPLY	5
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   143
#define	IP_IOC_IRE_ADVISE_NO_REPLY	6
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   144
#define	IP_IOC_RTS_REQUEST		7
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   145
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   146
/* Common definitions used by IP IOCTL data structures */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   147
typedef struct ipllcmd_s {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   148
	uint_t	ipllc_cmd;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   149
	uint_t	ipllc_name_offset;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   150
	uint_t	ipllc_name_length;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   151
} ipllc_t;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   152
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   153
/* IP IRE Change Command Structure. */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   154
typedef struct ipic_s {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   155
	ipllc_t	ipic_ipllc;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   156
	uint_t	ipic_ire_type;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   157
	uint_t	ipic_max_frag;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   158
	uint_t	ipic_addr_offset;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   159
	uint_t	ipic_addr_length;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   160
	uint_t	ipic_mask_offset;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   161
	uint_t	ipic_mask_length;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   162
	uint_t	ipic_src_addr_offset;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   163
	uint_t	ipic_src_addr_length;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   164
	uint_t	ipic_ll_hdr_offset;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   165
	uint_t	ipic_ll_hdr_length;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   166
	uint_t	ipic_gateway_addr_offset;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   167
	uint_t	ipic_gateway_addr_length;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   168
	clock_t	ipic_rtt;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   169
	uint32_t ipic_ssthresh;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   170
	clock_t	ipic_rtt_sd;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   171
	uchar_t ipic_ire_marks;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   172
} ipic_t;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   173
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   174
#define	ipic_cmd		ipic_ipllc.ipllc_cmd
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   175
#define	ipic_ll_name_length	ipic_ipllc.ipllc_name_length
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   176
#define	ipic_ll_name_offset	ipic_ipllc.ipllc_name_offset
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   177
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   178
/* IP IRE Delete Command Structure. */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   179
typedef struct ipid_s {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   180
	ipllc_t	ipid_ipllc;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   181
	uint_t	ipid_ire_type;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   182
	uint_t	ipid_addr_offset;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   183
	uint_t	ipid_addr_length;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   184
	uint_t	ipid_mask_offset;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   185
	uint_t	ipid_mask_length;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   186
} ipid_t;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   187
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   188
#define	ipid_cmd		ipid_ipllc.ipllc_cmd
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   189
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   190
#ifdef _KERNEL
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   191
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   192
 * Temporary state for ip options parser.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   193
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   194
typedef struct ipoptp_s
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   195
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   196
	uint8_t		*ipoptp_next;	/* next option to look at */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   197
	uint8_t		*ipoptp_end;	/* end of options */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   198
	uint8_t		*ipoptp_cur;	/* start of current option */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   199
	uint8_t		ipoptp_len;	/* length of current option */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   200
	uint32_t	ipoptp_flags;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   201
} ipoptp_t;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   202
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   203
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   204
 * Flag(s) for ipoptp_flags
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   205
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   206
#define	IPOPTP_ERROR	0x00000001
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   207
#endif	/* _KERNEL */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   208
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   209
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   210
/* Controls forwarding of IP packets, set via ndd */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   211
#define	IP_FORWARD_NEVER	0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   212
#define	IP_FORWARD_ALWAYS	1
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   213
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   214
#define	WE_ARE_FORWARDING	(ip_g_forward == IP_FORWARD_ALWAYS)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   215
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   216
#define	IPH_HDR_LENGTH(ipha)						\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   217
	((int)(((ipha_t *)ipha)->ipha_version_and_hdr_length & 0xF) << 2)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   218
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   219
#define	IPH_HDR_VERSION(ipha)						\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   220
	((int)(((ipha_t *)ipha)->ipha_version_and_hdr_length) >> 4)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   221
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   222
#ifdef _KERNEL
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   223
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   224
 * IP reassembly macros.  We hide starting and ending offsets in b_next and
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   225
 * b_prev of messages on the reassembly queue.	The messages are chained using
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   226
 * b_cont.  These macros are used in ip_reassemble() so we don't have to see
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   227
 * the ugly casts and assignments.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   228
 * Note that the offsets are <= 64k i.e. a uint_t is sufficient to represent
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   229
 * them.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   230
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   231
#define	IP_REASS_START(mp)		((uint_t)(uintptr_t)((mp)->b_next))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   232
#define	IP_REASS_SET_START(mp, u)	\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   233
	((mp)->b_next = (mblk_t *)(uintptr_t)(u))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   234
#define	IP_REASS_END(mp)		((uint_t)(uintptr_t)((mp)->b_prev))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   235
#define	IP_REASS_SET_END(mp, u)		\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   236
	((mp)->b_prev = (mblk_t *)(uintptr_t)(u))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   237
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   238
#define	IP_REASS_COMPLETE	0x1
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   239
#define	IP_REASS_PARTIAL	0x2
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   240
#define	IP_REASS_FAILED		0x4
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   241
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   242
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   243
 * Test to determine whether this is a module instance of IP or a
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   244
 * driver instance of IP.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   245
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   246
#define	CONN_Q(q)	(WR(q)->q_next == NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   247
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   248
#define	Q_TO_CONN(q)	((conn_t *)(q)->q_ptr)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   249
#define	Q_TO_TCP(q)	(Q_TO_CONN((q))->conn_tcp)
741
40027a3621ac PSARC 2005/082 Yosemite: UDP Performance Enhancement
masputra
parents: 679
diff changeset
   250
#define	Q_TO_UDP(q)	(Q_TO_CONN((q))->conn_udp)
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   251
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   252
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   253
 * The following two macros are used by IP to get the appropriate
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   254
 * wq and rq for a conn. If it is a TCP conn, then we need
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   255
 * tcp_wq/tcp_rq else, conn_wq/conn_rq. IP can use conn_wq and conn_rq
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   256
 * from a conn directly if it knows that the conn is not TCP.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   257
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   258
#define	CONNP_TO_WQ(connp)	\
741
40027a3621ac PSARC 2005/082 Yosemite: UDP Performance Enhancement
masputra
parents: 679
diff changeset
   259
	(IPCL_IS_TCP(connp) ? (connp)->conn_tcp->tcp_wq : (connp)->conn_wq)
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   260
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   261
#define	CONNP_TO_RQ(connp)	RD(CONNP_TO_WQ(connp))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   262
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   263
#define	GRAB_CONN_LOCK(q)	{				\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   264
	if (q != NULL && CONN_Q(q))				\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   265
		mutex_enter(&(Q_TO_CONN(q))->conn_lock);	\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   266
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   267
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   268
#define	RELEASE_CONN_LOCK(q)	{				\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   269
	if (q != NULL && CONN_Q(q))				\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   270
		mutex_exit(&(Q_TO_CONN(q))->conn_lock);		\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   271
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   272
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   273
/* "Congestion controlled" protocol */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   274
#define	IP_FLOW_CONTROLLED_ULP(p)   ((p) == IPPROTO_TCP || (p) == IPPROTO_SCTP)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   275
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   276
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   277
 * Complete the pending operation. Usually an ioctl. Can also
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   278
 * be a bind or option management request that got enqueued
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   279
 * in an ipsq_t. Called on completion of the operation.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   280
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   281
#define	CONN_OPER_PENDING_DONE(connp)	{			\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   282
	mutex_enter(&(connp)->conn_lock);			\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   283
	(connp)->conn_oper_pending_ill = NULL;			\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   284
	cv_broadcast(&(connp)->conn_refcv);			\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   285
	mutex_exit(&(connp)->conn_lock);			\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   286
	CONN_DEC_REF(connp);					\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   287
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   288
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   289
/* Get the credential of an IP queue of unknown type */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   290
#define	GET_QUEUE_CRED(wq)						\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   291
	((wq)->q_next ? (((ill_t *)(wq)->q_ptr)->ill_credp) \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   292
	    : ((Q_TO_CONN((wq)))->conn_cred))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   293
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   294
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   295
 * Flags for the various ip_fanout_* routines.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   296
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   297
#define	IP_FF_SEND_ICMP		0x01	/* Send an ICMP error */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   298
#define	IP_FF_HDR_COMPLETE	0x02	/* Call ip_hdr_complete if error */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   299
#define	IP_FF_CKSUM		0x04	/* Recompute ipha_cksum if error */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   300
#define	IP_FF_RAWIP		0x08	/* Use rawip mib variable */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   301
#define	IP_FF_SRC_QUENCH	0x10	/* OK to send ICMP_SOURCE_QUENCH */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   302
#define	IP_FF_SYN_ADDIRE	0x20	/* Add IRE if TCP syn packet */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   303
#define	IP_FF_IP6INFO		0x80	/* Add ip6i_t if needed */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   304
#define	IP_FF_SEND_SLLA		0x100	/* Send source link layer info ? */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   305
#define	IPV6_REACHABILITY_CONFIRMATION	0x200	/* Flags for ip_xmit_v6 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   306
#define	IP_FF_NO_MCAST_LOOP	0x400	/* No multicasts for sending zone */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   307
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   308
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   309
 * Following flags are used by IPQoS to determine if policy processing is
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   310
 * required.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   311
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   312
#define	IP6_NO_IPPOLICY		0x800	/* Don't do IPQoS processing */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   313
#define	IP6_IN_LLMCAST		0x1000	/* Multicast */
741
40027a3621ac PSARC 2005/082 Yosemite: UDP Performance Enhancement
masputra
parents: 679
diff changeset
   314
40027a3621ac PSARC 2005/082 Yosemite: UDP Performance Enhancement
masputra
parents: 679
diff changeset
   315
#define	IP_FF_LOOPBACK		0x2000	/* Loopback fanout */
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   316
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   317
#ifndef	IRE_DB_TYPE
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   318
#define	IRE_DB_TYPE	M_SIG
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   319
#endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   320
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   321
#ifndef	IRE_DB_REQ_TYPE
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   322
#define	IRE_DB_REQ_TYPE	M_PCSIG
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   323
#endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   324
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   325
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   326
 * Values for squeue switch:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   327
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   328
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   329
#define	IP_SQUEUE_ENTER_NODRAIN	1
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   330
#define	IP_SQUEUE_ENTER	2
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   331
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   332
 * This is part of the interface between Transport provider and
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   333
 * IP which can be used to set policy information. This is usually
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   334
 * accompanied with O_T_BIND_REQ/T_BIND_REQ.ip_bind assumes that
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   335
 * only IPSEC_POLICY_SET is there when it is found in the chain.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   336
 * The information contained is an struct ipsec_req_t. On success
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   337
 * or failure, either the T_BIND_ACK or the T_ERROR_ACK is returned.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   338
 * IPSEC_POLICY_SET is never returned.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   339
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   340
#define	IPSEC_POLICY_SET	M_SETOPTS
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   341
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   342
#define	IRE_IS_LOCAL(ire)	((ire != NULL) && \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   343
				((ire)->ire_type & (IRE_LOCAL | IRE_LOOPBACK)))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   344
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   345
#define	IRE_IS_TARGET(ire)	((ire != NULL) && \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   346
				((ire)->ire_type != IRE_BROADCAST))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   347
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   348
/* IP Fragmentation Reassembly Header */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   349
typedef struct ipf_s {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   350
	struct ipf_s	*ipf_hash_next;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   351
	struct ipf_s	**ipf_ptphn;	/* Pointer to previous hash next. */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   352
	uint32_t	ipf_ident;	/* Ident to match. */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   353
	uint8_t		ipf_protocol;	/* Protocol to match. */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   354
	uchar_t		ipf_last_frag_seen : 1;	/* Last fragment seen ? */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   355
	time_t		ipf_timestamp;	/* Reassembly start time. */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   356
	mblk_t		*ipf_mp;	/* mblk we live in. */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   357
	mblk_t		*ipf_tail_mp;	/* Frag queue tail pointer. */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   358
	int		ipf_hole_cnt;	/* Number of holes (hard-case). */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   359
	int		ipf_end;	/* Tail end offset (0 -> hard-case). */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   360
	uint_t		ipf_gen;	/* Frag queue generation */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   361
	size_t		ipf_count;	/* Count of bytes used by frag */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   362
	uint_t		ipf_nf_hdr_len; /* Length of nonfragmented header */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   363
	in6_addr_t	ipf_v6src;	/* IPv6 source address */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   364
	in6_addr_t	ipf_v6dst;	/* IPv6 dest address */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   365
	uint_t		ipf_prev_nexthdr_offset; /* Offset for nexthdr value */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   366
	uint8_t		ipf_ecn;	/* ECN info for the fragments */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   367
	uint8_t		ipf_num_dups;	/* Number of times dup frags recvd */
741
40027a3621ac PSARC 2005/082 Yosemite: UDP Performance Enhancement
masputra
parents: 679
diff changeset
   368
	uint16_t	ipf_checksum_flags; /* Hardware checksum flags */
40027a3621ac PSARC 2005/082 Yosemite: UDP Performance Enhancement
masputra
parents: 679
diff changeset
   369
	uint32_t	ipf_checksum;	/* Partial checksum of fragment data */
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   370
} ipf_t;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   371
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   372
#define	ipf_src	V4_PART_OF_V6(ipf_v6src)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   373
#define	ipf_dst	V4_PART_OF_V6(ipf_v6dst)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   374
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   375
typedef enum {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   376
	IB_PKT =  0x01,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   377
	OB_PKT = 0x02
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   378
} ip_pkt_t;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   379
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   380
#define	UPDATE_IB_PKT_COUNT(ire)\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   381
	{ \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   382
	(ire)->ire_ib_pkt_count++; \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   383
	if ((ire)->ire_ipif != NULL) { \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   384
		/* \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   385
		 * forwarding packet \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   386
		 */ \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   387
		if ((ire)->ire_type & (IRE_LOCAL|IRE_BROADCAST)) \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   388
			atomic_add_32(&(ire)->ire_ipif->ipif_ib_pkt_count, 1);\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   389
		else \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   390
			atomic_add_32(&(ire)->ire_ipif->ipif_fo_pkt_count, 1);\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   391
	} \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   392
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   393
#define	UPDATE_OB_PKT_COUNT(ire)\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   394
	{ \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   395
	(ire)->ire_ob_pkt_count++;\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   396
	if ((ire)->ire_ipif != NULL) { \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   397
		atomic_add_32(&(ire)->ire_ipif->ipif_ob_pkt_count, 1); \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   398
	} \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   399
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   400
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   401
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   402
#define	IP_RPUT_LOCAL(q, mp, ipha, ire, recv_ill) \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   403
{ \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   404
	switch (ipha->ipha_protocol) { \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   405
		case IPPROTO_UDP: \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   406
			ip_udp_input(q, mp, ipha, ire, recv_ill); \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   407
			break; \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   408
		default: \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   409
			ip_proto_input(q, mp, ipha, ire, recv_ill); \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   410
			break; \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   411
	} \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   412
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   413
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   414
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   415
#endif /* _KERNEL */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   416
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   417
/* ICMP types */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   418
#define	ICMP_ECHO_REPLY			0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   419
#define	ICMP_DEST_UNREACHABLE		3
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   420
#define	ICMP_SOURCE_QUENCH		4
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   421
#define	ICMP_REDIRECT			5
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   422
#define	ICMP_ECHO_REQUEST		8
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   423
#define	ICMP_ROUTER_ADVERTISEMENT	9
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   424
#define	ICMP_ROUTER_SOLICITATION	10
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   425
#define	ICMP_TIME_EXCEEDED		11
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   426
#define	ICMP_PARAM_PROBLEM		12
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   427
#define	ICMP_TIME_STAMP_REQUEST		13
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   428
#define	ICMP_TIME_STAMP_REPLY		14
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   429
#define	ICMP_INFO_REQUEST		15
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   430
#define	ICMP_INFO_REPLY			16
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   431
#define	ICMP_ADDRESS_MASK_REQUEST	17
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   432
#define	ICMP_ADDRESS_MASK_REPLY		18
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   433
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   434
/* ICMP_TIME_EXCEEDED codes */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   435
#define	ICMP_TTL_EXCEEDED		0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   436
#define	ICMP_REASSEMBLY_TIME_EXCEEDED	1
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   437
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   438
/* ICMP_DEST_UNREACHABLE codes */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   439
#define	ICMP_NET_UNREACHABLE		0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   440
#define	ICMP_HOST_UNREACHABLE		1
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   441
#define	ICMP_PROTOCOL_UNREACHABLE	2
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   442
#define	ICMP_PORT_UNREACHABLE		3
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   443
#define	ICMP_FRAGMENTATION_NEEDED	4
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   444
#define	ICMP_SOURCE_ROUTE_FAILED	5
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   445
#define	ICMP_DEST_NET_UNKNOWN		6
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   446
#define	ICMP_DEST_HOST_UNKNOWN		7
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   447
#define	ICMP_SRC_HOST_ISOLATED		8
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   448
#define	ICMP_DEST_NET_UNREACH_ADMIN	9
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   449
#define	ICMP_DEST_HOST_UNREACH_ADMIN	10
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   450
#define	ICMP_DEST_NET_UNREACH_TOS	11
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   451
#define	ICMP_DEST_HOST_UNREACH_TOS	12
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   452
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   453
/* ICMP Header Structure */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   454
typedef struct icmph_s {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   455
	uint8_t		icmph_type;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   456
	uint8_t		icmph_code;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   457
	uint16_t	icmph_checksum;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   458
	union {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   459
		struct { /* ECHO request/response structure */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   460
			uint16_t	u_echo_ident;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   461
			uint16_t	u_echo_seqnum;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   462
		} u_echo;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   463
		struct { /* Destination unreachable structure */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   464
			uint16_t	u_du_zero;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   465
			uint16_t	u_du_mtu;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   466
		} u_du;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   467
		struct { /* Parameter problem structure */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   468
			uint8_t		u_pp_ptr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   469
			uint8_t		u_pp_rsvd[3];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   470
		} u_pp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   471
		struct { /* Redirect structure */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   472
			ipaddr_t	u_rd_gateway;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   473
		} u_rd;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   474
	} icmph_u;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   475
} icmph_t;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   476
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   477
#define	icmph_echo_ident	icmph_u.u_echo.u_echo_ident
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   478
#define	icmph_echo_seqnum	icmph_u.u_echo.u_echo_seqnum
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   479
#define	icmph_du_zero		icmph_u.u_du.u_du_zero
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   480
#define	icmph_du_mtu		icmph_u.u_du.u_du_mtu
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   481
#define	icmph_pp_ptr		icmph_u.u_pp.u_pp_ptr
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   482
#define	icmph_rd_gateway	icmph_u.u_rd.u_rd_gateway
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   483
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   484
#define	ICMPH_SIZE	8
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   485
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   486
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   487
 * Minimum length of transport layer header included in an ICMP error
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   488
 * message for it to be considered valid.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   489
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   490
#define	ICMP_MIN_TP_HDR_LEN	8
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   491
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   492
/* Aligned IP header */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   493
typedef struct ipha_s {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   494
	uint8_t		ipha_version_and_hdr_length;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   495
	uint8_t		ipha_type_of_service;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   496
	uint16_t	ipha_length;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   497
	uint16_t	ipha_ident;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   498
	uint16_t	ipha_fragment_offset_and_flags;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   499
	uint8_t		ipha_ttl;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   500
	uint8_t		ipha_protocol;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   501
	uint16_t	ipha_hdr_checksum;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   502
	ipaddr_t	ipha_src;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   503
	ipaddr_t	ipha_dst;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   504
} ipha_t;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   505
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   506
#define	IPH_DF		0x4000	/* Don't fragment */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   507
#define	IPH_MF		0x2000	/* More fragments to come */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   508
#define	IPH_OFFSET	0x1FFF	/* Where the offset lives */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   509
#define	IPH_FRAG_HDR	0x8000	/* IPv6 don't fragment bit */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   510
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   511
/* ECN code points for IPv4 TOS byte and IPv6 traffic class octet. */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   512
#define	IPH_ECN_NECT	0x0	/* Not ECN-Capabable Transport */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   513
#define	IPH_ECN_ECT1	0x1	/* ECN-Capable Transport, ECT(1) */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   514
#define	IPH_ECN_ECT0	0x2	/* ECN-Capable Transport, ECT(0) */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   515
#define	IPH_ECN_CE	0x3	/* ECN-Congestion Experienced (CE) */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   516
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   517
/* IP Mac info structure */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   518
typedef struct ip_m_s {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   519
	t_uscalar_t	ip_m_mac_type;	/* From <sys/dlpi.h> */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   520
	int		ip_m_type;	/* From <net/if_types.h> */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   521
	boolean_t	(*ip_m_v4mapinfo)(uint_t, uint8_t *, uint8_t *,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   522
			    uint32_t *, ipaddr_t *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   523
	boolean_t	(*ip_m_v6mapinfo)(uint_t, uint8_t *, uint8_t *,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   524
			    uint32_t *, in6_addr_t *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   525
	boolean_t	(*ip_m_v6intfid)(uint_t, uint8_t *, in6_addr_t *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   526
} ip_m_t;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   527
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   528
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   529
 * The following functions attempt to reduce the link layer dependency
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   530
 * of the IP stack. The current set of link specific operations are:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   531
 * a. map from IPv4 class D (224.0/4) multicast address range to the link
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   532
 * layer multicast address range.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   533
 * b. map from IPv6 multicast address range (ff00::/8) to the link
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   534
 * layer multicast address range.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   535
 * c. derive the default IPv6 interface identifier from the link layer
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   536
 * address.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   537
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   538
#define	MEDIA_V4MINFO(ip_m, plen, bphys, maddr, hwxp, v4ptr) \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   539
	(((ip_m)->ip_m_v4mapinfo != NULL) && \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   540
	(*(ip_m)->ip_m_v4mapinfo)(plen, bphys, maddr, hwxp, v4ptr))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   541
#define	MEDIA_V6INTFID(ip_m, plen, phys, v6ptr) \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   542
	(((ip_m)->ip_m_v6intfid != NULL) && \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   543
	(*(ip_m)->ip_m_v6intfid)(plen, phys, v6ptr))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   544
#define	MEDIA_V6MINFO(ip_m, plen, bphys, maddr, hwxp, v6ptr) \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   545
	(((ip_m)->ip_m_v6mapinfo != NULL) && \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   546
	(*(ip_m)->ip_m_v6mapinfo)(plen, bphys, maddr, hwxp, v6ptr))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   547
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   548
/* Router entry types */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   549
#define	IRE_BROADCAST		0x0001	/* Route entry for broadcast address */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   550
#define	IRE_DEFAULT		0x0002	/* Route entry for default gateway */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   551
#define	IRE_LOCAL		0x0004	/* Route entry for local address */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   552
#define	IRE_LOOPBACK		0x0008	/* Route entry for loopback address */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   553
#define	IRE_PREFIX		0x0010	/* Route entry for prefix routes */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   554
#define	IRE_CACHE		0x0020	/* Cached Route entry */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   555
#define	IRE_IF_NORESOLVER	0x0040	/* Route entry for local interface */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   556
					/* net without any address mapping. */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   557
#define	IRE_IF_RESOLVER		0x0080	/* Route entry for local interface */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   558
					/* net with resolver. */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   559
#define	IRE_HOST		0x0100	/* Host route entry */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   560
#define	IRE_HOST_REDIRECT	0x0200	/* Host route entry from redirects */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   561
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   562
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   563
 * IRE_MIPRTUN is only set on the ires in the ip_mrtun_table.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   564
 * This ire_type must not be set for ftable and ctable routing entries.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   565
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   566
#define	IRE_MIPRTUN		0x0400	/* Reverse tunnel route entry */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   567
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   568
#define	IRE_INTERFACE		(IRE_IF_NORESOLVER | IRE_IF_RESOLVER)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   569
#define	IRE_OFFSUBNET		(IRE_DEFAULT | IRE_PREFIX | IRE_HOST | \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   570
				IRE_HOST_REDIRECT)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   571
#define	IRE_CACHETABLE		(IRE_CACHE | IRE_BROADCAST | IRE_LOCAL | \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   572
				IRE_LOOPBACK)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   573
#define	IRE_FORWARDTABLE	(IRE_INTERFACE | IRE_OFFSUBNET)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   574
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   575
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   576
 * If an IRE is marked with IRE_MARK_CONDEMNED, the last walker of
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   577
 * the bucket should delete this IRE from this bucket.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   578
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   579
#define	IRE_MARK_CONDEMNED	0x0001
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   580
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   581
 * If a broadcast IRE is marked with IRE_MARK_NORECV, ip_rput will drop the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   582
 * broadcast packets received on that interface. This is marked only
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   583
 * on broadcast ires. Employed by IPMP, where we have multiple NICs on the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   584
 * same subnet receiving the same broadcast packet.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   585
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   586
#define	IRE_MARK_NORECV		0x0002
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   587
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   588
 * IRE_CACHE marked this way won't be returned by ire_cache_lookup. Need
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   589
 * to look specifically using MATCH_IRE_MARK_HIDDEN. Used by IPMP.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   590
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   591
#define	IRE_MARK_HIDDEN		0x0004	/* Typically Used by in.mpathd */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   592
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   593
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   594
 * ire with IRE_MARK_NOADD is  created in ip_newroute_ipif, when outgoing
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   595
 * interface is specified by IP_XMIT_IF socket option. This ire is not
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   596
 * added in IRE_CACHE.  For example, this is used by mipagent to prevent
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   597
 * any entry to be added in the cache table. We do not want to add any
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   598
 * entry for a mobile-node in the routing table for foreign agent originated
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   599
 * packets. Adding routes in cache table in this case, may run the risks of
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   600
 * incorrect routing path in case of private overlapping addresses.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   601
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   602
#define	IRE_MARK_NOADD		0x0008	/* Mark not to add ire in cache */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   603
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   604
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   605
 * IRE marked with IRE_MARK_TEMPORARY means that this IRE has been used
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   606
 * either for forwarding a packet or has not been used for sending
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   607
 * traffic on TCP connections terminated on this system.  In both
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   608
 * cases, this IRE is the first to go when IRE is being cleaned up.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   609
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   610
#define	IRE_MARK_TEMPORARY	0x0010
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   611
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   612
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   613
 * IRE marked with IRE_MARK_USESRC_CHECK means that while adding an IRE with
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   614
 * this mark, additional atomic checks need to be performed. For eg: by the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   615
 * time an IRE_CACHE is created, sent up to ARP and then comes back to IP; the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   616
 * usesrc grouping could have changed in which case we want to fail adding
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   617
 * the IRE_CACHE entry
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   618
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   619
#define	IRE_MARK_USESRC_CHECK	0x0020
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   620
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   621
/* Flags with ire_expire routine */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   622
#define	FLUSH_ARP_TIME		0x0001	/* ARP info potentially stale timer */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   623
#define	FLUSH_REDIRECT_TIME	0x0002	/* Redirects potentially stale */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   624
#define	FLUSH_MTU_TIME		0x0004	/* Include path MTU per RFC 1191 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   625
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   626
/* Arguments to ire_flush_cache() */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   627
#define	IRE_FLUSH_DELETE	0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   628
#define	IRE_FLUSH_ADD		1
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   629
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   630
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   631
 * Open/close synchronization flags.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   632
 * These are kept in a separate field in the conn and the synchronization
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   633
 * depends on the atomic 32 bit access to that field.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   634
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   635
#define	CONN_CLOSING		0x01	/* ip_close waiting for ip_wsrv */
741
40027a3621ac PSARC 2005/082 Yosemite: UDP Performance Enhancement
masputra
parents: 679
diff changeset
   636
#define	CONN_IPSEC_LOAD_WAIT	0x02	/* waiting for load */
40027a3621ac PSARC 2005/082 Yosemite: UDP Performance Enhancement
masputra
parents: 679
diff changeset
   637
#define	CONN_CONDEMNED		0x04	/* conn is closing, no more refs */
40027a3621ac PSARC 2005/082 Yosemite: UDP Performance Enhancement
masputra
parents: 679
diff changeset
   638
#define	CONN_INCIPIENT		0x08	/* conn not yet visible, no refs */
40027a3621ac PSARC 2005/082 Yosemite: UDP Performance Enhancement
masputra
parents: 679
diff changeset
   639
#define	CONN_QUIESCED		0x10	/* conn is now quiescent */
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   640
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   641
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   642
 * Parameter to ip_output giving the identity of the caller.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   643
 * IP_WSRV means the packet was enqueued in the STREAMS queue
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   644
 * due to flow control and is now being reprocessed in the context of
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   645
 * the STREAMS service procedure, consequent to flow control relief.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   646
 * IRE_SEND means the packet is being reprocessed consequent to an
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   647
 * ire cache creation and addition and this may or may not be happening
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   648
 * in the service procedure context. Anything other than the above 2
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   649
 * cases is identified as IP_WPUT. Most commonly this is the case of
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   650
 * packets coming down from the application.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   651
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   652
#ifdef _KERNEL
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   653
#define	IP_WSRV			1	/* Called from ip_wsrv */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   654
#define	IP_WPUT			2	/* Called from ip_wput */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   655
#define	IRE_SEND		3	/* Called from ire_send */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   656
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   657
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   658
 * Extra structures need for per-src-addr filtering (IGMPv3/MLDv2)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   659
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   660
#define	MAX_FILTER_SIZE	64
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   661
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   662
typedef struct slist_s {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   663
	int		sl_numsrc;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   664
	in6_addr_t	sl_addr[MAX_FILTER_SIZE];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   665
} slist_t;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   666
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   667
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   668
 * Following struct is used to maintain retransmission state for
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   669
 * a multicast group.  One rtx_state_t struct is an in-line field
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   670
 * of the ilm_t struct; the slist_ts in the rtx_state_t struct are
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   671
 * alloc'd as needed.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   672
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   673
typedef struct rtx_state_s {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   674
	uint_t		rtx_timer;	/* retrans timer */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   675
	int		rtx_cnt;	/* retrans count */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   676
	int		rtx_fmode_cnt;	/* retrans count for fmode change */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   677
	slist_t		*rtx_allow;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   678
	slist_t		*rtx_block;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   679
} rtx_state_t;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   680
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   681
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   682
 * Used to construct list of multicast address records that will be
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   683
 * sent in a single listener report.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   684
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   685
typedef struct mrec_s {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   686
	struct mrec_s	*mrec_next;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   687
	uint8_t		mrec_type;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   688
	uint8_t		mrec_auxlen;	/* currently unused */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   689
	in6_addr_t	mrec_group;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   690
	slist_t		mrec_srcs;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   691
} mrec_t;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   692
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   693
/* Group membership list per upper conn */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   694
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   695
 * XXX add ilg info for ifaddr/ifindex.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   696
 * XXX can we make ilg survive an ifconfig unplumb + plumb
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   697
 * by setting the ipif/ill to NULL and recover that later?
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   698
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   699
 * ilg_ipif is used by IPv4 as multicast groups are joined using an interface
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   700
 * address (ipif).
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   701
 * ilg_ill is used by IPv6 as multicast groups are joined using an interface
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   702
 * index (phyint->phyint_ifindex).
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   703
 * ilg_ill is NULL for IPv4 and ilg_ipif is NULL for IPv6.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   704
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   705
 * ilg records the state of multicast memberships of a socket end point.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   706
 * ilm records the state of multicast memberships with the driver and is
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   707
 * maintained per interface.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   708
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   709
 * Notes :
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   710
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   711
 * 1) There is no direct link between a given ilg and ilm. If the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   712
 *    application has joined a group G with ifindex I, we will have
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   713
 *    an ilg with ilg_v6group and ilg_ill. There will be a corresponding
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   714
 *    ilm with ilm_ill/ilm_v6addr recording the multicast membership.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   715
 *    To delete the membership,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   716
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   717
 *		a) Search for ilg matching on G and I with ilg_v6group
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   718
 *		   and ilg_ill. Delete ilg_ill.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   719
 *		b) Search the corresponding ilm matching on G and I with
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   720
 *		   ilm_v6addr and ilm_ill. Delete ilm.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   721
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   722
 *    In IPv4, the only difference is, we look using ipifs instead of
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   723
 *    ills.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   724
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   725
 * 2) With IP multipathing, we want to keep receiving even after the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   726
 *    interface has failed. We do this by moving multicast memberships
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   727
 *    to a new_ill within the group. This is acheived by sending
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   728
 *    DL_DISABMULTI_REQS on ilg_ill/ilm_ill and sending DL_ENABMULTIREQS
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   729
 *    on the new_ill and changing ilg_ill/ilm_ill to new_ill. But, we
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   730
 *    need to be able to delete memberships which will still come down
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   731
 *    with the ifindex of the old ill which is what the application
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   732
 *    knows of. Thus we store the ilm_/ilg_orig_ifindex to keep track
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   733
 *    of where we joined initially so that we can lookup even after we
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   734
 *    moved the membership. It is also used for moving back the membership
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   735
 *    when the old ill has been repaired. This is done by looking up for
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   736
 *    ilms with ilm_orig_ifindex matching on the old ill's ifindex. Only
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   737
 *    ilms actually move from old ill to new ill. ilgs don't move (just
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   738
 *    the ilg_ill is changed when it moves) as it just records the state
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   739
 *    of the application that has joined a group G where as ilm records
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   740
 *    the state joined with the driver. Thus when we send DL_XXXMULTI_REQs
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   741
 *    we also need to keep the ilm in the right ill.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   742
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   743
 *    In IPv4, as ipifs move from old ill to new_ill, ilgs and ilms move
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   744
 *    implicitly as we use only ipifs in IPv4. Thus, one can always lookup
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   745
 *    a given ilm/ilg even after it fails without the support of
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   746
 *    orig_ifindex. We move ilms still to record the driver state as
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   747
 *    mentioned above.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   748
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   749
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   750
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   751
 * The ilg_t and ilm_t members are protected by ipsq. They can be changed only
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   752
 * by a thread executing in the ipsq. In other words add/delete of a
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   753
 * multicast group has to execute in the ipsq.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   754
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   755
#define	ILG_DELETED	0x1		/* ilg_flags */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   756
typedef struct ilg_s {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   757
	in6_addr_t	ilg_v6group;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   758
	struct ipif_s	*ilg_ipif;	/* Logical interface we are member on */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   759
	struct ill_s	*ilg_ill;	/* Used by IPv6 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   760
	int		ilg_orig_ifindex; /* Interface originally joined on */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   761
	uint_t		ilg_flags;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   762
	mcast_record_t	ilg_fmode;	/* MODE_IS_INCLUDE/MODE_IS_EXCLUDE */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   763
	slist_t		*ilg_filter;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   764
} ilg_t;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   765
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   766
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   767
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   768
 * Multicast address list entry for lower ill.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   769
 * ilm_ipif is used by IPv4 as multicast groups are joined using ipif.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   770
 * ilm_ill is used by IPv6 as multicast groups are joined using ill.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   771
 * ilm_ill is NULL for IPv4 and ilm_ipif is NULL for IPv6.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   772
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   773
#define	ILM_DELETED	0x1		/* ilm_flags */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   774
typedef struct ilm_s {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   775
	in6_addr_t	ilm_v6addr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   776
	int		ilm_refcnt;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   777
	uint_t		ilm_timer;	/* IGMP/MLD query resp timer, in msec */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   778
	struct ipif_s	*ilm_ipif;	/* Back pointer to ipif for IPv4 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   779
	struct ilm_s	*ilm_next;	/* Linked list for each ill */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   780
	uint_t		ilm_state;	/* state of the membership */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   781
	struct ill_s	*ilm_ill;	/* Back pointer to ill for IPv6 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   782
	int		ilm_orig_ifindex;  /* V6_MULTICAST_IF/ilm_ipif index */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   783
	uint_t		ilm_flags;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   784
	boolean_t	ilm_is_new;	/* new ilm */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   785
	boolean_t	ilm_notify_driver; /* Need to notify the driver */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   786
	boolean_t	ilm_join_mld;	/* call mld_joingroup */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   787
	zoneid_t	ilm_zoneid;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   788
	int		ilm_no_ilg_cnt;	/* number of joins w/ no ilg */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   789
	mcast_record_t	ilm_fmode;	/* MODE_IS_INCLUDE/MODE_IS_EXCLUDE */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   790
	slist_t		*ilm_filter;	/* source filter list */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   791
	slist_t		*ilm_pendsrcs;	/* relevant src addrs for pending req */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   792
	rtx_state_t	ilm_rtx;	/* SCR retransmission state */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   793
} ilm_t;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   794
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   795
#define	ilm_addr	V4_PART_OF_V6(ilm_v6addr)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   796
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   797
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   798
 * ilm_walker_cleanup needs to execute when the ilm_walker_cnt goes down to
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   799
 * zero. In addition it needs to block new walkers while it is unlinking ilm's
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   800
 * from the list. Thus simple atomics for the ill_ilm_walker_cnt don't suffice.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   801
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   802
#define	ILM_WALKER_HOLD(ill)    {               \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   803
	mutex_enter(&(ill)->ill_lock);          \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   804
	ill->ill_ilm_walker_cnt++;              \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   805
	mutex_exit(&(ill)->ill_lock);           \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   806
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   807
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   808
#define	ILM_WALKER_RELE(ill)	{ 		\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   809
	mutex_enter(&(ill)->ill_lock);		\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   810
	(ill)->ill_ilm_walker_cnt--;		\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   811
	if ((ill)->ill_ilm_walker_cnt == 0 && (ill)->ill_ilm_cleanup_reqd) \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   812
		ilm_walker_cleanup(ill);	\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   813
	mutex_exit(&(ill)->ill_lock);		\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   814
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   815
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   816
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   817
 * Soft reference to an IPsec SA.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   818
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   819
 * On relative terms, conn's can be persistant (living as long as the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   820
 * processes which create them), while SA's are ephemeral (dying when
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   821
 * they hit their time-based or byte-based lifetimes).
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   822
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   823
 * We could hold a hard reference to an SA from an ipsec_latch_t,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   824
 * but this would cause expired SA's to linger for a potentially
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   825
 * unbounded time.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   826
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   827
 * Instead, we remember the hash bucket number and bucket generation
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   828
 * in addition to the pointer.  The bucket generation is incremented on
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   829
 * each deletion.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   830
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   831
typedef struct ipsa_ref_s
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   832
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   833
	struct ipsa_s	*ipsr_sa;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   834
	struct isaf_s	*ipsr_bucket;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   835
	uint64_t	ipsr_gen;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   836
} ipsa_ref_t;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   837
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   838
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   839
 * IPsec "latching" state.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   840
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   841
 * In the presence of IPsec policy, fully-bound conn's bind a connection
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   842
 * to more than just the 5-tuple, but also a specific IPsec action and
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   843
 * identity-pair.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   844
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   845
 * As an optimization, we also cache soft references to IPsec SA's
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   846
 * here so that we can fast-path around most of the work needed for
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   847
 * outbound IPsec SA selection.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   848
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   849
 * Were it not for TCP's detached connections, this state would be
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   850
 * in-line in conn_t; instead, this is in a separate structure so it
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   851
 * can be handed off to TCP when a connection is detached.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   852
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   853
typedef struct ipsec_latch_s
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   854
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   855
	kmutex_t	ipl_lock;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   856
	uint32_t	ipl_refcnt;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   857
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   858
	uint64_t	ipl_unique;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   859
	struct ipsec_policy_s	*ipl_in_policy; /* latched policy (in) */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   860
	struct ipsec_policy_s	*ipl_out_policy; /* latched policy (out) */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   861
	struct ipsec_action_s	*ipl_in_action;	/* latched action (in) */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   862
	struct ipsec_action_s	*ipl_out_action; /* latched action (out) */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   863
	cred_t		*ipl_local_id;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   864
	struct ipsid_s	*ipl_local_cid;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   865
	struct ipsid_s	*ipl_remote_cid;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   866
	unsigned int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   867
			ipl_out_action_latched : 1,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   868
			ipl_in_action_latched : 1,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   869
			ipl_out_policy_latched : 1,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   870
			ipl_in_policy_latched : 1,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   871
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   872
			ipl_ids_latched : 1,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   873
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   874
			ipl_pad_to_bit_31 : 27;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   875
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   876
	ipsa_ref_t	ipl_ref[2]; /* 0: ESP, 1: AH */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   877
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   878
} ipsec_latch_t;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   879
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   880
#define	IPLATCH_REFHOLD(ipl) { \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   881
	atomic_add_32(&(ipl)->ipl_refcnt, 1);		\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   882
	ASSERT((ipl)->ipl_refcnt != 0);			\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   883
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   884
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   885
#define	IPLATCH_REFRELE(ipl) {					\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   886
	ASSERT((ipl)->ipl_refcnt != 0);				\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   887
	membar_exit();						\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   888
	if (atomic_add_32_nv(&(ipl)->ipl_refcnt, -1) == 0)	\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   889
		iplatch_free(ipl);				\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   890
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   891
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   892
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   893
 * peer identity structure.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   894
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   895
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   896
typedef struct conn_s conn_t;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   897
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   898
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   899
 * The old IP client structure "ipc_t" is gone. All the data is stored in the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   900
 * connection structure "conn_t" now. The mapping of old and new fields looks
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   901
 * like this:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   902
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   903
 * ipc_ulp			conn_ulp
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   904
 * ipc_rq			conn_rq
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   905
 * ipc_wq			conn_wq
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   906
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   907
 * ipc_laddr			conn_src
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   908
 * ipc_faddr			conn_rem
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   909
 * ipc_v6laddr			conn_srcv6
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   910
 * ipc_v6faddr			conn_remv6
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   911
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   912
 * ipc_lport			conn_lport
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   913
 * ipc_fport			conn_fport
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   914
 * ipc_ports			conn_ports
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   915
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   916
 * ipc_policy			conn_policy
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   917
 * ipc_latch			conn_latch
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   918
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   919
 * ipc_irc_lock			conn_lock
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   920
 * ipc_ire_cache		conn_ire_cache
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   921
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   922
 * ipc_state_flags		conn_state_flags
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   923
 * ipc_outgoing_ill		conn_outgoing_ill
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   924
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   925
 * ipc_dontroute 		conn_dontroute
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   926
 * ipc_loopback 		conn_loopback
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   927
 * ipc_broadcast		conn_broadcast
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   928
 * ipc_reuseaddr		conn_reuseaddr
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   929
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   930
 * ipc_multicast_loop		conn_multicast_loop
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   931
 * ipc_multi_router		conn_multi_router
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   932
 * ipc_priv_stream 		conn_priv_stream
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   933
 * ipc_draining 		conn_draining
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   934
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   935
 * ipc_did_putbq		conn_did_putbq
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   936
 * ipc_unspec_src		conn_unspec_src
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   937
 * ipc_policy_cached		conn_policy_cached
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   938
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   939
 * ipc_in_enforce_policy 	conn_in_enforce_policy
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   940
 * ipc_out_enforce_policy 	conn_out_enforce_policy
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   941
 * ipc_af_isv6			conn_af_isv6
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   942
 * ipc_pkt_isv6			conn_pkt_isv6
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   943
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   944
 * ipc_ipv6_recvpktinfo		conn_ipv6_recvpktinfo
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   945
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   946
 * ipc_ipv6_recvhoplimit	conn_ipv6_recvhoplimit
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   947
 * ipc_ipv6_recvhopopts		conn_ipv6_recvhopopts
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   948
 * ipc_ipv6_recvdstopts		conn_ipv6_recvdstopts
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   949
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   950
 * ipc_ipv6_recvrthdr 		conn_ipv6_recvrthdr
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   951
 * ipc_ipv6_recvrtdstopts	conn_ipv6_recvrtdstopts
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   952
 * ipc_fully_bound		conn_fully_bound
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   953
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   954
 * ipc_recvif			conn_recvif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   955
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   956
 * ipc_recvslla 		conn_recvslla
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   957
 * ipc_acking_unbind 		conn_acking_unbind
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   958
 * ipc_pad_to_bit_31 		conn_pad_to_bit_31
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   959
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   960
 * ipc_xmit_if_ill		conn_xmit_if_ill
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   961
 * ipc_nofailover_ill		conn_nofailover_ill
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   962
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   963
 * ipc_proto			conn_proto
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   964
 * ipc_incoming_ill		conn_incoming_ill
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   965
 * ipc_outgoing_pill		conn_outgoing_pill
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   966
 * ipc_pending_ill		conn_pending_ill
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   967
 * ipc_unbind_mp		conn_unbind_mp
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   968
 * ipc_ilg			conn_ilg
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   969
 * ipc_ilg_allocated		conn_ilg_allocated
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   970
 * ipc_ilg_inuse		conn_ilg_inuse
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   971
 * ipc_ilg_walker_cnt		conn_ilg_walker_cnt
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   972
 * ipc_refcv			conn_refcv
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   973
 * ipc_multicast_ipif		conn_multicast_ipif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   974
 * ipc_multicast_ill		conn_multicast_ill
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   975
 * ipc_orig_bound_ifindex	conn_orig_bound_ifindex
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   976
 * ipc_orig_multicast_ifindex	conn_orig_multicast_ifindex
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   977
 * ipc_orig_xmit_ifindex	conn_orig_xmit_ifindex
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   978
 * ipc_drain_next		conn_drain_next
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   979
 * ipc_drain_prev		conn_drain_prev
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   980
 * ipc_idl			conn_idl
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   981
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   982
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   983
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   984
 * This is used to match an inbound/outbound datagram with
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   985
 * policy.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   986
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   987
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   988
typedef	struct ipsec_selector {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   989
	in6_addr_t	ips_local_addr_v6;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   990
	in6_addr_t	ips_remote_addr_v6;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   991
	uint16_t	ips_local_port;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   992
	uint16_t	ips_remote_port;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   993
	uint8_t		ips_icmp_type;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   994
	uint8_t		ips_icmp_code;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   995
	uint8_t		ips_protocol;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   996
	uint8_t		ips_isv4 : 1,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   997
			ips_is_icmp_inv_acq: 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   998
} ipsec_selector_t;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   999
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1000
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1001
 * Note that we put v4 addresses in the *first* 32-bit word of the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1002
 * selector rather than the last to simplify the prefix match/mask code
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1003
 * in spd.c
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1004
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1005
#define	ips_local_addr_v4 ips_local_addr_v6.s6_addr32[0]
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1006
#define	ips_remote_addr_v4 ips_remote_addr_v6.s6_addr32[0]
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1007
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1008
/* Values used in IP by IPSEC Code */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1009
#define		IPSEC_OUTBOUND		B_TRUE
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1010
#define		IPSEC_INBOUND		B_FALSE
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1011
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1012
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1013
 * There are two variants in policy failures. The packet may come in
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1014
 * secure when not needed (IPSEC_POLICY_???_NOT_NEEDED) or it may not
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1015
 * have the desired level of protection (IPSEC_POLICY_MISMATCH).
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1016
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1017
#define	IPSEC_POLICY_NOT_NEEDED		0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1018
#define	IPSEC_POLICY_MISMATCH		1
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1019
#define	IPSEC_POLICY_AUTH_NOT_NEEDED	2
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1020
#define	IPSEC_POLICY_ENCR_NOT_NEEDED	3
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1021
#define	IPSEC_POLICY_SE_NOT_NEEDED	4
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1022
#define	IPSEC_POLICY_MAX		5	/* Always max + 1. */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1023
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1024
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1025
 * Folowing macro is used whenever the code does not know whether there
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1026
 * is a M_CTL present in the front and it needs to examine the actual mp
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1027
 * i.e the IP header. As a M_CTL message could be in the front, this
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1028
 * extracts the packet into mp and the M_CTL mp into first_mp. If M_CTL
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1029
 * mp is not present, both first_mp and mp point to the same message.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1030
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1031
#define	EXTRACT_PKT_MP(mp, first_mp, mctl_present)	\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1032
	(first_mp) = (mp);				\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1033
	if ((mp)->b_datap->db_type == M_CTL) {		\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1034
		(mp) = (mp)->b_cont;			\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1035
		(mctl_present) = B_TRUE;		\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1036
	} else {					\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1037
		(mctl_present) = B_FALSE;		\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1038
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1039
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1040
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1041
 * Check with IPSEC inbound policy if
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1042
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1043
 * 1) per-socket policy is present - indicated by conn_in_enforce_policy.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1044
 * 2) Or if we have not cached policy on the conn and the global policy is
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1045
 *    non-empty.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1046
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1047
#define	CONN_INBOUND_POLICY_PRESENT(connp)	\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1048
	((connp)->conn_in_enforce_policy ||	\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1049
	(!((connp)->conn_policy_cached) &&	\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1050
	ipsec_inbound_v4_policy_present))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1051
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1052
#define	CONN_INBOUND_POLICY_PRESENT_V6(connp)	\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1053
	((connp)->conn_in_enforce_policy ||	\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1054
	(!(connp)->conn_policy_cached &&	\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1055
	ipsec_inbound_v6_policy_present))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1056
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1057
#define	CONN_OUTBOUND_POLICY_PRESENT(connp)	\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1058
	((connp)->conn_out_enforce_policy ||	\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1059
	(!((connp)->conn_policy_cached) &&	\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1060
	ipsec_outbound_v4_policy_present))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1061
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1062
#define	CONN_OUTBOUND_POLICY_PRESENT_V6(connp)	\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1063
	((connp)->conn_out_enforce_policy ||	\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1064
	(!(connp)->conn_policy_cached &&	\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1065
	ipsec_outbound_v6_policy_present))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1066
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1067
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1068
 * Information cached in IRE for upper layer protocol (ULP).
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1069
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1070
 * Notice that ire_max_frag is not included in the iulp_t structure, which
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1071
 * it may seem that it should.  But ire_max_frag cannot really be cached.  It
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1072
 * is fixed for each interface.  For MTU found by PMTUd, we may want to cache
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1073
 * it.  But currently, we do not do that.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1074
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1075
typedef struct iulp_s {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1076
	boolean_t	iulp_set;	/* Is any metric set? */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1077
	uint32_t	iulp_ssthresh;	/* Slow start threshold (TCP). */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1078
	clock_t		iulp_rtt;	/* Guestimate in millisecs. */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1079
	clock_t		iulp_rtt_sd;	/* Cached value of RTT variance. */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1080
	uint32_t	iulp_spipe;	/* Send pipe size. */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1081
	uint32_t	iulp_rpipe;	/* Receive pipe size. */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1082
	uint32_t	iulp_rtomax;	/* Max round trip timeout. */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1083
	uint32_t	iulp_sack;	/* Use SACK option (TCP)? */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1084
	uint32_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1085
		iulp_tstamp_ok : 1,	/* Use timestamp option (TCP)? */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1086
		iulp_wscale_ok : 1,	/* Use window scale option (TCP)? */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1087
		iulp_ecn_ok : 1,	/* Enable ECN (for TCP)? */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1088
		iulp_pmtud_ok : 1,	/* Enable PMTUd? */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1089
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1090
		iulp_not_used : 28;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1091
} iulp_t;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1092
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1093
/* Zero iulp_t. */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1094
extern const iulp_t ire_uinfo_null;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1095
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1096
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1097
 * The conn drain list structure.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1098
 * The list is protected by idl_lock. Each conn_t inserted in the list
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1099
 * points back at this idl_t using conn_idl. IP primes the draining of the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1100
 * conns queued in these lists, by qenabling the 1st conn of each list. This
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1101
 * occurs when STREAMS backenables ip_wsrv on the IP module. Each conn instance
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1102
 * of ip_wsrv successively qenables the next conn in the list.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1103
 * idl_lock protects all other members of idl_t and conn_drain_next
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1104
 * and conn_drain_prev of conn_t. The conn_lock protects IPCF_DRAIN_DISABLED
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1105
 * flag of the conn_t and conn_idl.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1106
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1107
typedef struct idl_s {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1108
	conn_t		*idl_conn;		/* Head of drain list */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1109
	kmutex_t	idl_lock;		/* Lock for this list */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1110
	conn_t		*idl_conn_draining;	/* conn that is draining */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1111
	uint32_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1112
		idl_repeat : 1,			/* Last conn must re-enable */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1113
						/* drain list again */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1114
		idl_unused : 31;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1115
} idl_t;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1116
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1117
#define	CONN_DRAIN_LIST_LOCK(connp)	(&((connp)->conn_idl->idl_lock))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1118
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1119
 * Interface route structure which holds the necessary information to recreate
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1120
 * routes that are tied to an interface (namely where ire_ipif != NULL).
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1121
 * These routes which were initially created via a routing socket or via the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1122
 * SIOCADDRT ioctl may be gateway routes (RTF_GATEWAY being set) or may be
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1123
 * traditional interface routes.  When an interface comes back up after being
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1124
 * marked down, this information will be used to recreate the routes.  These
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1125
 * are part of an mblk_t chain that hangs off of the IPIF (ipif_saved_ire_mp).
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1126
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1127
typedef struct ifrt_s {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1128
	ushort_t	ifrt_type;		/* Type of IRE */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1129
	in6_addr_t	ifrt_v6addr;		/* Address IRE represents. */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1130
	in6_addr_t	ifrt_v6gateway_addr;	/* Gateway if IRE_OFFSUBNET */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1131
	in6_addr_t	ifrt_v6src_addr;	/* Src addr if RTF_SETSRC */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1132
	in6_addr_t	ifrt_v6mask;		/* Mask for matching IRE. */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1133
	uint32_t	ifrt_flags;		/* flags related to route */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1134
	uint_t		ifrt_max_frag;		/* MTU (next hop or path). */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1135
	iulp_t		ifrt_iulp_info;		/* Cached IRE ULP info. */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1136
} ifrt_t;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1137
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1138
#define	ifrt_addr		V4_PART_OF_V6(ifrt_v6addr)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1139
#define	ifrt_gateway_addr	V4_PART_OF_V6(ifrt_v6gateway_addr)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1140
#define	ifrt_src_addr		V4_PART_OF_V6(ifrt_v6src_addr)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1141
#define	ifrt_mask		V4_PART_OF_V6(ifrt_v6mask)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1142
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1143
/* Number of IP addresses that can be hosted on a physical interface */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1144
#define	MAX_ADDRS_PER_IF	8192
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1145
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1146
 * Number of Source addresses to be considered for source address
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1147
 * selection. Used by ipif_select_source[_v6].
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1148
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1149
#define	MAX_IPIF_SELECT_SOURCE	50
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1150
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1151
#ifdef IP_DEBUG
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1152
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1153
 * Tracing refholds and refreleases for debugging. Existing tracing mechanisms
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1154
 * do not allow the granularity need to trace refrences to ipif/ill/ire's. This
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1155
 * mechanism should be revisited once dtrace is available.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1156
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1157
#define	IP_STACK_DEPTH	15
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1158
typedef struct tr_buf_s {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1159
	int	tr_depth;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1160
	pc_t	tr_stack[IP_STACK_DEPTH];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1161
} tr_buf_t;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1162
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1163
typedef struct th_trace_s {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1164
	struct	th_trace_s *th_next;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1165
	struct	th_trace_s **th_prev;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1166
	kthread_t	*th_id;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1167
	int	th_refcnt;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1168
	uint_t	th_trace_lastref;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1169
#define	TR_BUF_MAX	38
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1170
	tr_buf_t th_trbuf[TR_BUF_MAX];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1171
} th_trace_t;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1172
#endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1173
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1174
/* The following are ipif_state_flags */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1175
#define	IPIF_CONDEMNED		0x1	/* The ipif is being removed */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1176
#define	IPIF_CHANGING		0x2	/* A critcal ipif field is changing */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1177
#define	IPIF_MOVING		0x8	/* The ipif is being moved */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1178
#define	IPIF_SET_LINKLOCAL	0x10	/* transient flag during bringup */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1179
#define	IPIF_ZERO_SOURCE	0x20	/* transient flag during bringup */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1180
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1181
/* IP interface structure, one per local address */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1182
typedef struct ipif_s {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1183
	struct	ipif_s	*ipif_next;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1184
	struct	ill_s	*ipif_ill;	/* Back pointer to our ill */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1185
	int	ipif_id;		/* Logical unit number */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1186
	uint_t	ipif_mtu;		/* Starts at ipif_ill->ill_max_frag */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1187
	uint_t	ipif_saved_mtu;		/* Save of mtu during ipif_move() */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1188
	in6_addr_t ipif_v6lcl_addr;	/* Local IP address for this if. */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1189
	in6_addr_t ipif_v6src_addr;	/* Source IP address for this if. */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1190
	in6_addr_t ipif_v6subnet;	/* Subnet prefix for this if. */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1191
	in6_addr_t ipif_v6net_mask;	/* Net mask for this interface. */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1192
	in6_addr_t ipif_v6brd_addr;	/* Broadcast addr for this interface. */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1193
	in6_addr_t ipif_v6pp_dst_addr;	/* Point-to-point dest address. */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1194
	uint64_t ipif_flags;		/* Interface flags. */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1195
	uint_t	ipif_metric;		/* BSD if metric, for compatibility. */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1196
	uint_t	ipif_ire_type;		/* IRE_LOCAL or IRE_LOOPBACK */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1197
	mblk_t	*ipif_arp_del_mp;	/* Allocated at time arp comes up, to */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1198
					/* prevent awkward out of mem */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1199
					/* condition later */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1200
	mblk_t	*ipif_saved_ire_mp;	/* Allocated for each extra */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1201
					/* IRE_IF_NORESOLVER/IRE_IF_RESOLVER */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1202
					/* on this interface so that they */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1203
					/* can survive ifconfig down. */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1204
	kmutex_t ipif_saved_ire_lock;	/* Protects ipif_saved_ire_mp */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1205
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1206
	mrec_t	*ipif_igmp_rpt;		/* List of group memberships which */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1207
					/* will be reported on.  Used when */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1208
					/* handling an igmp timeout.	   */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1209
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1210
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1211
	 * The packet counts in the ipif contain the sum of the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1212
	 * packet counts in dead IREs that were affiliated with
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1213
	 * this ipif.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1214
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1215
	uint_t	ipif_fo_pkt_count;	/* Forwarded thru our dead IREs */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1216
	uint_t	ipif_ib_pkt_count;	/* Inbound packets for our dead IREs */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1217
	uint_t	ipif_ob_pkt_count;	/* Outbound packets to our dead IREs */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1218
	/* Exclusive bit fields, protected by ipsq_t */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1219
	unsigned int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1220
		ipif_multicast_up : 1,	/* We have joined the allhosts group */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1221
		ipif_solmcast_up : 1,	/* We joined solicited node mcast */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1222
		ipif_replace_zero : 1,	/* Replacement for zero */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1223
		ipif_was_up : 1,	/* ipif was up before */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1224
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1225
		ipif_pad_to_31 : 28;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1226
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1227
	int	ipif_orig_ifindex;	/* ifindex before SLIFFAILOVER */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1228
	uint_t	ipif_seqid;		/* unique index across all ills */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1229
	uint_t	ipif_orig_ipifid;	/* ipif_id before SLIFFAILOVER */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1230
	uint_t	ipif_state_flags;	/* See IPIF_* flag defs above */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1231
	uint_t	ipif_refcnt;		/* active consistent reader cnt */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1232
	uint_t	ipif_ire_cnt;		/* Number of ire's referencing ipif */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1233
	uint_t	ipif_saved_ire_cnt;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1234
	zoneid_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1235
		ipif_zoneid;		/* zone ID number */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1236
#ifdef ILL_DEBUG
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1237
#define	IP_TR_HASH_MAX	64
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1238
	th_trace_t *ipif_trace[IP_TR_HASH_MAX];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1239
	boolean_t	ipif_trace_disable;	/* True when alloc fails */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1240
#endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1241
} ipif_t;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1242
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1243
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1244
 * The following table lists the protection levels of the various members
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1245
 * of the ipif_t. The following notation is used.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1246
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1247
 * Write once - Written to only once at the time of bringing up
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1248
 * the interface and can be safely read after the bringup without any lock.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1249
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1250
 * ipsq - Need to execute in the ipsq to perform the indicated access.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1251
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1252
 * ill_lock - Need to hold this mutex to perform the indicated access.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1253
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1254
 * ill_g_lock - Need to hold this rw lock as reader/writer for read access or
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1255
 * write access respectively.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1256
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1257
 * down ill - Written to only when the ill is down (i.e all ipifs are down)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1258
 * up ill - Read only when the ill is up (i.e. at least 1 ipif is up)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1259
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1260
 *		 Table of ipif_t members and their protection
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1261
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1262
 * ipif_next		ill_g_lock		ill_g_lock
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1263
 * ipif_ill		ipsq + down ipif		write once
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1264
 * ipif_id		ipsq + down ipif		write once
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1265
 * ipif_mtu		ipsq
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1266
 * ipif_v6lcl_addr	ipsq + down ipif		up ipif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1267
 * ipif_v6src_addr	ipsq + down ipif		up ipif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1268
 * ipif_v6subnet	ipsq + down ipif		up ipif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1269
 * ipif_v6net_mask	ipsq + down ipif		up ipif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1270
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1271
 * ipif_v6brd_addr
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1272
 * ipif_v6pp_dst_addr
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1273
 * ipif_flags		ill_lock		ill_lock
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1274
 * ipif_metric
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1275
 * ipif_ire_type	ipsq + down ill		up ill
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1276
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1277
 * ipif_arp_del_mp	ipsq			ipsq
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1278
 * ipif_saved_ire_mp	ipif_saved_ire_lock	ipif_saved_ire_lock
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1279
 * ipif_igmp_rpt	ipsq			ipsq
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1280
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1281
 * ipif_fo_pkt_count	Approx
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1282
 * ipif_ib_pkt_count	Approx
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1283
 * ipif_ob_pkt_count	Approx
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1284
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1285
 * bit fields		ill_lock		ill_lock
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1286
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1287
 * ipif_orig_ifindex	ipsq			None
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1288
 * ipif_orig_ipifid	ipsq			None
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1289
 * ipif_seqid		ipsq			Write once
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1290
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1291
 * ipif_state_flags	ill_lock		ill_lock
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1292
 * ipif_refcnt		ill_lock		ill_lock
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1293
 * ipif_ire_cnt		ill_lock		ill_lock
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1294
 * ipif_saved_ire_cnt
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1295
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1296
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1297
#define	IP_TR_HASH(tid)	((((uintptr_t)tid) >> 6) & (IP_TR_HASH_MAX - 1))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1298
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1299
#ifdef ILL_DEBUG
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1300
#define	IPIF_TRACE_REF(ipif)	ipif_trace_ref(ipif)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1301
#define	ILL_TRACE_REF(ill)	ill_trace_ref(ill)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1302
#define	IPIF_UNTRACE_REF(ipif)	ipif_untrace_ref(ipif)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1303
#define	ILL_UNTRACE_REF(ill)	ill_untrace_ref(ill)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1304
#define	ILL_TRACE_CLEANUP(ill)	ill_trace_cleanup(ill)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1305
#define	IPIF_TRACE_CLEANUP(ipif)	ipif_trace_cleanup(ipif)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1306
#else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1307
#define	IPIF_TRACE_REF(ipif)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1308
#define	ILL_TRACE_REF(ill)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1309
#define	IPIF_UNTRACE_REF(ipif)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1310
#define	ILL_UNTRACE_REF(ill)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1311
#define	ILL_TRACE_CLEANUP(ill)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1312
#define	IPIF_TRACE_CLEANUP(ipif)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1313
#endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1314
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1315
/* IPv4 compatability macros */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1316
#define	ipif_lcl_addr		V4_PART_OF_V6(ipif_v6lcl_addr)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1317
#define	ipif_src_addr		V4_PART_OF_V6(ipif_v6src_addr)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1318
#define	ipif_subnet		V4_PART_OF_V6(ipif_v6subnet)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1319
#define	ipif_net_mask		V4_PART_OF_V6(ipif_v6net_mask)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1320
#define	ipif_brd_addr		V4_PART_OF_V6(ipif_v6brd_addr)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1321
#define	ipif_pp_dst_addr	V4_PART_OF_V6(ipif_v6pp_dst_addr)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1322
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1323
/* Macros for easy backreferences to the ill. */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1324
#define	ipif_wq			ipif_ill->ill_wq
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1325
#define	ipif_rq			ipif_ill->ill_rq
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1326
#define	ipif_net_type		ipif_ill->ill_net_type
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1327
#define	ipif_resolver_mp	ipif_ill->ill_resolver_mp
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1328
#define	ipif_ipif_up_count	ipif_ill->ill_ipif_up_count
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1329
#define	ipif_bcast_mp		ipif_ill->ill_bcast_mp
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1330
#define	ipif_type		ipif_ill->ill_type
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1331
#define	ipif_isv6		ipif_ill->ill_isv6
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1332
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1333
#define	SIOCLIFADDR_NDX 112	/* ndx of SIOCLIFADDR in the ndx ioctl table */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1334
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1335
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1336
 * mode value for ip_ioctl_finish for finishing an ioctl
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1337
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1338
#define	CONN_CLOSE	1		/* No mi_copy */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1339
#define	COPYOUT		2		/* do an mi_copyout if needed */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1340
#define	NO_COPYOUT	3		/* do an mi_copy_done */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1341
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1342
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1343
 * The IP-MT design revolves around the serialization object ipsq_t.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1344
 * It is associated with an IPMP group. If IPMP is not enabled, there is
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1345
 * 1 ipsq_t per phyint. Eg. an ipsq_t would cover both hme0's IPv4 stream
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1346
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1347
 * ipsq_lock protects
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1348
 *	ipsq_reentry_cnt, ipsq_writer, ipsq_xopq_mphead, ipsq_xopq_mptail,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1349
 *	ipsq_mphead, ipsq_mptail, ipsq_split
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1350
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1351
 *	ipsq_pending_ipif, ipsq_current_ipif, ipsq_pending_mp, ipsq_flags,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1352
 *	ipsq_waitfor
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1353
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1354
 * The fields in the last line above below are set mostly by a writer thread
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1355
 * But there is an exception in the last call to ipif_ill_refrele_tail which
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1356
 * could also race with a conn close which could be cleaning up the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1357
 * fields. So we choose to protect using ipsq_lock instead of depending on
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1358
 * the property of the writer.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1359
 * ill_g_lock protects
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1360
 *	ipsq_refs, ipsq_phyint_list
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1361
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1362
typedef struct ipsq_s {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1363
	kmutex_t ipsq_lock;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1364
	int	ipsq_reentry_cnt;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1365
	kthread_t	*ipsq_writer;	/* current owner (thread id) */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1366
	int	ipsq_flags;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1367
	mblk_t	*ipsq_xopq_mphead;	/* list of excl ops mostly ioctls */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1368
	mblk_t	*ipsq_xopq_mptail;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1369
	mblk_t	*ipsq_mphead;		/* msgs on ipsq linked thru b_next */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1370
	mblk_t	*ipsq_mptail;		/* msgs on ipsq linked thru b_next */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1371
	ipif_t	*ipsq_pending_ipif;	/* ipif associated w. ipsq_pending_mp */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1372
	ipif_t	*ipsq_current_ipif;	/* ipif associated with current ioctl */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1373
	mblk_t	*ipsq_pending_mp;	/* current ioctl mp while waiting for */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1374
					/* response from another module */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1375
	struct	ipsq_s	*ipsq_next;	/* list of all syncq's (ipsq_g_list) */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1376
	uint_t		ipsq_refs;	/* Number of phyints on this ipsq */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1377
	struct phyint	*ipsq_phyint_list; /* List of phyints on this ipsq */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1378
	boolean_t	ipsq_split;	/* ipsq may need to be split */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1379
	int		ipsq_waitfor;	/* Values encoded below */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1380
	char		ipsq_name[LIFNAMSIZ+1];	/* same as phyint_groupname */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1381
	int		ipsq_last_cmd;	/* debugging aid */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1382
#ifdef ILL_DEBUG
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1383
	int		ipsq_depth;	/* debugging aid */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1384
	pc_t		ipsq_stack[IP_STACK_DEPTH];	/* debugging aid */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1385
#endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1386
} ipsq_t;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1387
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1388
/* ipsq_flags */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1389
#define	IPSQ_GROUP	0x1	/* This ipsq belongs to an IPMP group */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1390
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1391
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1392
 * ipsq_waitfor:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1393
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1394
 * IPIF_DOWN	1	ipif_down waiting for refcnts to drop
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1395
 * ILL_DOWN	2	ill_down waiting for refcnts to drop
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1396
 * IPIF_FREE	3	ipif_free waiting for refcnts to drop
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1397
 * ILL_FREE	4	ill unplumb waiting for refcnts to drop
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1398
 * ILL_MOVE_OK	5	failover waiting for refcnts to drop
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1399
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1400
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1401
enum { IPIF_DOWN = 1, ILL_DOWN, IPIF_FREE, ILL_FREE, ILL_MOVE_OK };
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1402
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1403
/* Flags passed to ipsq_try_enter */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1404
#define	CUR_OP 0		/* Current ioctl continuing again */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1405
#define	NEW_OP 1		/* New ioctl starting afresh */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1406
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1407
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1408
 * phyint represents state that is common to both IPv4 and IPv6 interfaces.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1409
 * There is a separate ill_t representing IPv4 and IPv6 which has a
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1410
 * backpointer to the phyint structure for acessing common state.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1411
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1412
 * NOTE : It just stores the group name as there is only one name for
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1413
 *	  IPv4 and IPv6 i.e it is a underlying link property. Actually
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1414
 *        IPv4 and IPv6 ill are grouped together when their phyints have
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1415
 *        the same name.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1416
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1417
typedef struct phyint {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1418
	struct ill_s	*phyint_illv4;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1419
	struct ill_s	*phyint_illv6;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1420
	uint_t		phyint_ifindex;		/* SIOCLSLIFINDEX */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1421
	uint_t		phyint_notify_delay;	/* SIOCSLIFNOTIFYDELAY */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1422
	char		*phyint_groupname;	/* SIOCSLIFGROUPNAME */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1423
	uint_t		phyint_groupname_len;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1424
	uint64_t	phyint_flags;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1425
	avl_node_t	phyint_avl_by_index;	/* avl tree by index */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1426
	avl_node_t	phyint_avl_by_name;	/* avl tree by name */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1427
	kmutex_t	phyint_lock;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1428
	struct ipsq_s	*phyint_ipsq;		/* back pointer to ipsq */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1429
	struct phyint	*phyint_ipsq_next;	/* phyint list on this ipsq */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1430
} phyint_t;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1431
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1432
#define	CACHE_ALIGN_SIZE 64
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1433
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1434
#define	CACHE_ALIGN(align_struct)	P2ROUNDUP(sizeof (struct align_struct),\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1435
							CACHE_ALIGN_SIZE)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1436
struct _phyint_list_s_ {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1437
	avl_tree_t	phyint_list_avl_by_index;	/* avl tree by index */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1438
	avl_tree_t	phyint_list_avl_by_name;	/* avl tree by name */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1439
};
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1440
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1441
typedef union phyint_list_u {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1442
	struct	_phyint_list_s_ phyint_list_s;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1443
	char	phyint_list_filler[CACHE_ALIGN(_phyint_list_s_)];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1444
} phyint_list_t;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1445
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1446
#define	phyint_list_avl_by_index	phyint_list_s.phyint_list_avl_by_index
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1447
#define	phyint_list_avl_by_name		phyint_list_s.phyint_list_avl_by_name
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1448
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1449
 * ILL groups. We group ills,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1450
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1451
 * - if the ills have the same group name. (New way)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1452
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1453
 * ill_group locking notes:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1454
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1455
 * illgrp_lock protects ill_grp_ill_schednext.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1456
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1457
 * ill_g_lock protects ill_grp_next, illgrp_ill, illgrp_ill_count.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1458
 * Holding ill_g_lock freezes the memberships of ills in IPMP groups.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1459
 * It also freezes the global list of ills and all ipifs in all ills.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1460
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1461
 * To remove an ipif from the linked list of ipifs of that ill ipif_free_tail
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1462
 * holds both ill_g_lock, and ill_lock. Similarly to remove an ill from the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1463
 * global list of ills, ill_delete_glist holds ill_g_lock as writer.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1464
 * This simplifies things for ipif_select_source, illgrp_scheduler etc.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1465
 * that need to walk the members of an illgrp. They just hold ill_g_lock
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1466
 * as reader to do the walk.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1467
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1468
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1469
typedef	struct ill_group {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1470
	kmutex_t	illgrp_lock;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1471
	struct ill_group *illgrp_next;		/* Next ill_group */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1472
	struct ill_s	*illgrp_ill_schednext;	/* Next ill to be scheduled */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1473
	struct ill_s	*illgrp_ill;		/* First ill in the group */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1474
	int		illgrp_ill_count;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1475
} ill_group_t;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1476
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1477
extern	ill_group_t	*illgrp_head_v6;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1478
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1479
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1480
 * Fragmentation hash bucket
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1481
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1482
typedef struct ipfb_s {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1483
	struct ipf_s	*ipfb_ipf;	/* List of ... */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1484
	size_t		ipfb_count;	/* Count of bytes used by frag(s) */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1485
	kmutex_t	ipfb_lock;	/* Protect all ipf in list */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1486
	uint_t		ipfb_frag_pkts; /* num of distinct fragmented pkts */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1487
} ipfb_t;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1488
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1489
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1490
 * IRE bucket structure. Usually there is an array of such structures,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1491
 * each pointing to a linked list of ires. irb_refcnt counts the number
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1492
 * of walkers of a given hash bucket. Usually the reference count is
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1493
 * bumped up if the walker wants no IRES to be DELETED while walking the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1494
 * list. Bumping up does not PREVENT ADDITION. This allows walking a given
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1495
 * hash bucket without stumbling up on a free pointer.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1496
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1497
typedef struct irb {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1498
	struct ire_s	*irb_ire;	/* First ire in this bucket */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1499
					/* Should be first in this struct */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1500
	krwlock_t	irb_lock;	/* Protect this bucket */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1501
	uint_t		irb_refcnt;	/* Protected by irb_lock */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1502
	uchar_t		irb_marks;	/* CONDEMNED ires in this bucket ? */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1503
	uint_t		irb_ire_cnt;	/* Num of IRE in this bucket */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1504
	uint_t		irb_tmp_ire_cnt; /* Num of temporary IRE */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1505
} irb_t;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1506
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1507
#define	IP_V4_G_HEAD	0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1508
#define	IP_V6_G_HEAD	1
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1509
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1510
#define	MAX_G_HEADS	2
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1511
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1512
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1513
 * unpadded ill_if structure
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1514
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1515
struct 	_ill_if_s_ {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1516
	union ill_if_u	*illif_next;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1517
	union ill_if_u	*illif_prev;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1518
	avl_tree_t	illif_avl_by_ppa;	/* AVL tree sorted on ppa */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1519
	vmem_t		*illif_ppa_arena;	/* ppa index space */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1520
	uint16_t	illif_mcast_v1;		/* hints for		  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1521
	uint16_t	illif_mcast_v2;		/* [igmp|mld]_slowtimo	  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1522
	int		illif_name_len;		/* name length */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1523
	char		illif_name[LIFNAMSIZ];	/* name of interface type */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1524
};
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1525
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1526
/* cache aligned ill_if structure */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1527
typedef union 	ill_if_u {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1528
	struct  _ill_if_s_ ill_if_s;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1529
	char 	illif_filler[CACHE_ALIGN(_ill_if_s_)];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1530
} ill_if_t;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1531
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1532
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1533
#define	illif_next		ill_if_s.illif_next
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1534
#define	illif_prev		ill_if_s.illif_prev
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1535
#define	illif_avl_by_ppa	ill_if_s.illif_avl_by_ppa
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1536
#define	illif_ppa_arena		ill_if_s.illif_ppa_arena
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1537
#define	illif_mcast_v1		ill_if_s.illif_mcast_v1
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1538
#define	illif_mcast_v2		ill_if_s.illif_mcast_v2
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1539
#define	illif_name		ill_if_s.illif_name
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1540
#define	illif_name_len		ill_if_s.illif_name_len
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1541
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1542
typedef struct ill_walk_context_s {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1543
	int	ctx_current_list; /* current list being searched */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1544
	int	ctx_last_list;	 /* last list to search */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1545
} ill_walk_context_t;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1546
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1547
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1548
 * ill_gheads structure, one for IPV4 and one for IPV6
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1549
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1550
struct _ill_g_head_s_ {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1551
	ill_if_t	*ill_g_list_head;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1552
	ill_if_t	*ill_g_list_tail;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1553
};
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1554
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1555
typedef union ill_g_head_u {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1556
	struct _ill_g_head_s_ ill_g_head_s;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1557
	char	ill_g_head_filler[CACHE_ALIGN(_ill_g_head_s_)];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1558
} ill_g_head_t;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1559
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1560
#define	ill_g_list_head	ill_g_head_s.ill_g_list_head
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1561
#define	ill_g_list_tail	ill_g_head_s.ill_g_list_tail
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1562
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1563
#pragma align CACHE_ALIGN_SIZE(ill_g_heads)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1564
extern ill_g_head_t	ill_g_heads[];	/* ILL List Head */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1565
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1566
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1567
#define	IP_V4_ILL_G_LIST	ill_g_heads[IP_V4_G_HEAD].ill_g_list_head
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1568
#define	IP_V6_ILL_G_LIST	ill_g_heads[IP_V6_G_HEAD].ill_g_list_head
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1569
#define	IP_VX_ILL_G_LIST(i)	ill_g_heads[i].ill_g_list_head
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1570
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1571
#define	ILL_START_WALK_V4(ctx_ptr)	ill_first(IP_V4_G_HEAD, IP_V4_G_HEAD, \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1572
					ctx_ptr)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1573
#define	ILL_START_WALK_V6(ctx_ptr)	ill_first(IP_V6_G_HEAD, IP_V6_G_HEAD, \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1574
					ctx_ptr)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1575
#define	ILL_START_WALK_ALL(ctx_ptr)	ill_first(MAX_G_HEADS, MAX_G_HEADS, \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1576
					ctx_ptr)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1577
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1578
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1579
 * Capabilities, possible flags for ill_capabilities.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1580
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1581
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1582
#define	ILL_CAPAB_AH		0x01		/* IPsec AH acceleration */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1583
#define	ILL_CAPAB_ESP		0x02		/* IPsec ESP acceleration */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1584
#define	ILL_CAPAB_MDT		0x04		/* Multidata Transmit */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1585
#define	ILL_CAPAB_HCKSUM	0x08		/* Hardware checksumming */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1586
#define	ILL_CAPAB_ZEROCOPY	0x10		/* Zero-copy */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1587
#define	ILL_CAPAB_POLL		0x20		/* Polling Toggle */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1588
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1589
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1590
 * Per-ill Multidata Transmit capabilities.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1591
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1592
typedef struct ill_mdt_capab_s ill_mdt_capab_t;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1593
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1594
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1595
 * Per-ill IPsec capabilities.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1596
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1597
typedef struct ill_ipsec_capab_s ill_ipsec_capab_t;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1598
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1599
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1600
 * Per-ill Hardware Checksumming capbilities.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1601
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1602
typedef struct ill_hcksum_capab_s ill_hcksum_capab_t;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1603
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1604
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1605
 * Per-ill Zero-copy capabilities.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1606
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1607
typedef struct ill_zerocopy_capab_s ill_zerocopy_capab_t;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1608
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1609
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1610
 * Per-ill Polling capbilities.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1611
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1612
typedef struct ill_poll_capab_s ill_poll_capab_t;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1613
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1614
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1615
 * Per-ill polling resource map.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1616
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1617
typedef struct ill_rx_ring ill_rx_ring_t;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1618
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1619
/* The following are ill_state_flags */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1620
#define	ILL_LL_SUBNET_PENDING	0x01	/* Waiting for DL_INFO_ACK from drv */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1621
#define	ILL_CONDEMNED		0x02	/* No more new ref's to the ILL */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1622
#define	ILL_CHANGING		0x04	/* ILL not globally visible */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1623
#define	ILL_DL_UNBIND_DONE	0x08	/* UNBIND_REQ has been Acked */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1624
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1625
/* Is this an ILL whose source address is used by other ILL's ? */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1626
#define	IS_USESRC_ILL(ill)			\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1627
	(((ill)->ill_usesrc_ifindex == 0) &&	\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1628
	((ill)->ill_usesrc_grp_next != NULL))	\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1629
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1630
/* Is this a client/consumer of the usesrc ILL ? */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1631
#define	IS_USESRC_CLI_ILL(ill)			\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1632
	(((ill)->ill_usesrc_ifindex != 0) &&	\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1633
	((ill)->ill_usesrc_grp_next != NULL))	\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1634
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1635
/* Is this an virtual network interface (vni) ILL ? */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1636
#define	IS_VNI(ill)							\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1637
	(((ill) != NULL) && !((ill)->ill_phyint->phyint_flags &		\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1638
	PHYI_LOOPBACK) && ((ill)->ill_phyint->phyint_flags &		\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1639
	PHYI_VIRTUAL))							\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1640
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1641
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1642
 * IP Lower level Structure.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1643
 * Instance data structure in ip_open when there is a device below us.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1644
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1645
typedef struct ill_s {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1646
	ill_if_t *ill_ifptr;		/* pointer to interface type */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1647
	queue_t	*ill_rq;		/* Read queue. */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1648
	queue_t	*ill_wq;		/* Write queue. */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1649
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1650
	int	ill_error;		/* Error value sent up by device. */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1651
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1652
	ipif_t	*ill_ipif;		/* Interface chain for this ILL. */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1653
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1654
	uint_t	ill_ipif_up_count;	/* Number of IPIFs currently up. */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1655
	uint_t	ill_max_frag;		/* Max IDU from DLPI. */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1656
	char	*ill_name;		/* Our name. */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1657
	uint_t	ill_name_length;	/* Name length, incl. terminator. */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1658
	char	*ill_ndd_name;		/* Name + ":ip?_forwarding" for NDD. */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1659
	uint_t	ill_net_type;		/* IRE_IF_RESOLVER/IRE_IF_NORESOLVER. */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1660
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1661
	 * Physical Point of Attachment num.  If DLPI style 1 provider
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1662
	 * then this is derived from the devname.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1663
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1664
	uint_t	ill_ppa;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1665
	t_uscalar_t	ill_sap;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1666
	t_scalar_t	ill_sap_length;	/* Including sign (for position) */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1667
	uint_t	ill_phys_addr_length;	/* Excluding the sap. */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1668
	uint_t	ill_bcast_addr_length;	/* Only set when the DL provider */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1669
					/* supports broadcast. */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1670
	t_uscalar_t	ill_mactype;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1671
	uint8_t	*ill_frag_ptr;		/* Reassembly state. */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1672
	timeout_id_t ill_frag_timer_id; /* timeout id for the frag timer */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1673
	ipfb_t	*ill_frag_hash_tbl;	/* Fragment hash list head. */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1674
	ipif_t	*ill_pending_ipif;	/* IPIF waiting for DL operation. */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1675
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1676
	ilm_t	*ill_ilm;		/* Multicast mebership for lower ill */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1677
	uint_t	ill_global_timer;	/* for IGMPv3/MLDv2 general queries */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1678
	int	ill_mcast_type;		/* type of router which is querier */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1679
					/* on this interface */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1680
	uint16_t ill_mcast_v1_time;	/* # slow timeouts since last v1 qry */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1681
	uint16_t ill_mcast_v2_time;	/* # slow timeouts since last v2 qry */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1682
	uint8_t	ill_mcast_v1_tset;	/* 1 => timer is set; 0 => not set */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1683
	uint8_t	ill_mcast_v2_tset;	/* 1 => timer is set; 0 => not set */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1684
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1685
	uint8_t	ill_mcast_rv;		/* IGMPv3/MLDv2 robustness variable */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1686
	int	ill_mcast_qi;		/* IGMPv3/MLDv2 query interval var */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1687
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1688
	mblk_t	*ill_pending_mp;	/* IOCTL/DLPI awaiting completion. */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1689
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1690
	 * All non-NULL cells between 'ill_first_mp_to_free' and
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1691
	 * 'ill_last_mp_to_free' are freed in ill_delete.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1692
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1693
#define	ill_first_mp_to_free	ill_bcast_mp
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1694
	mblk_t	*ill_bcast_mp;		/* DLPI header for broadcasts. */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1695
	mblk_t	*ill_resolver_mp;	/* Resolver template. */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1696
	mblk_t	*ill_detach_mp;		/* detach mp, or NULL if style1 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1697
	mblk_t	*ill_unbind_mp;		/* unbind mp from ill_dl_up() */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1698
	mblk_t	*ill_dlpi_deferred;	/* b_next chain of control messages */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1699
	mblk_t	*ill_phys_addr_mp;	/* mblk which holds ill_phys_addr */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1700
#define	ill_last_mp_to_free	ill_phys_addr_mp
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1701
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1702
	cred_t	*ill_credp;		/* opener's credentials */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1703
	uint8_t	*ill_phys_addr;		/* ill_phys_addr_mp->b_rptr + off */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1704
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1705
	uint_t	ill_state_flags;	/* see ILL_* flags above */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1706
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1707
	/* Following bit fields protected by ipsq_t */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1708
	uint_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1709
		ill_needs_attach : 1,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1710
		ill_reserved : 1,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1711
		ill_isv6 : 1,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1712
		ill_dlpi_style_set : 1,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1713
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1714
		ill_ifname_pending : 1,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1715
		ill_move_in_progress : 1, /* FAILOVER/FAILBACK in progress */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1716
		ill_join_allmulti : 1,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1717
		ill_logical_down : 1,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1718
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1719
		ill_is_6to4tun : 1,	/* Interface is a 6to4 tunnel */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1720
		ill_promisc_on_phys : 1, /* phys interface in promisc mode */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1721
		ill_dl_up : 1,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1722
		ill_up_ipifs : 1,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1723
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1724
		ill_pad_to_bit_31 : 20;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1725
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1726
	/* Following bit fields protected by ill_lock */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1727
	uint_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1728
		ill_fragtimer_executing : 1,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1729
		ill_fragtimer_needrestart : 1,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1730
		ill_ilm_cleanup_reqd : 1,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1731
		ill_arp_closing : 1,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1732
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1733
		ill_arp_bringup_pending : 1,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1734
		ill_mtu_userspecified : 1, /* SIOCSLNKINFO has set the mtu */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1735
		ill_pad_bit_31 : 26;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1736
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1737
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1738
	 * Used in SIOCSIFMUXID and SIOCGIFMUXID for 'ifconfig unplumb'.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1739
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1740
	int	ill_arp_muxid;		/* muxid returned from plink for arp */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1741
	int	ill_ip_muxid;		/* muxid returned from plink for ip */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1742
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1743
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1744
	 * Used for IP frag reassembly throttling on a per ILL basis.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1745
	 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1746
	 * Note: frag_count is approximate, its added to and subtracted from
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1747
	 *	 without any locking, so simultaneous load/modify/stores can
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1748
	 *	 collide, also ill_frag_purge() recalculates its value by
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1749
	 *	 summing all the ipfb_count's without locking out updates
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1750
	 *	 to the ipfb's.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1751
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1752
	uint_t	ill_ipf_gen;		/* Generation of next fragment queue */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1753
	uint_t	ill_frag_count;		/* Approx count of all mblk bytes */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1754
	uint_t	ill_frag_free_num_pkts;	 /* num of fragmented packets to free */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1755
	clock_t	ill_last_frag_clean_time; /* time when frag's were pruned */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1756
	int	ill_type;		/* From <net/if_types.h> */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1757
	uint_t	ill_dlpi_multicast_state;	/* See below IDMS_* */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1758
	uint_t	ill_dlpi_fastpath_state;	/* See below IDMS_* */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1759
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1760
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1761
	 * Capabilities related fields.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1762
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1763
	uint_t  ill_capab_state;	/* State of capability query, IDMS_* */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1764
	uint64_t ill_capabilities;	/* Enabled capabilities, ILL_CAPAB_* */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1765
	ill_mdt_capab_t	*ill_mdt_capab;	/* Multidata Transmit capabilities */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1766
	ill_ipsec_capab_t *ill_ipsec_capab_ah;	/* IPsec AH capabilities */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1767
	ill_ipsec_capab_t *ill_ipsec_capab_esp;	/* IPsec ESP capabilities */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1768
	ill_hcksum_capab_t *ill_hcksum_capab; /* H/W cksumming capabilities */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1769
	ill_zerocopy_capab_t *ill_zerocopy_capab; /* Zero-copy capabilities */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1770
	ill_poll_capab_t *ill_poll_capab; /* Polling capabilities */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1771
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1772
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1773
	 * New fields for IPv6
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1774
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1775
	uint8_t	ill_max_hops;	/* Maximum hops for any logical interface */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1776
	uint_t	ill_max_mtu;	/* Maximum MTU for any logical interface */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1777
	uint32_t ill_reachable_time;	/* Value for ND algorithm in msec */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1778
	uint32_t ill_reachable_retrans_time; /* Value for ND algorithm msec */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1779
	uint_t	ill_max_buf;		/* Max # of req to buffer for ND */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1780
	in6_addr_t	ill_token;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1781
	uint_t		ill_token_length;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1782
	uint32_t	ill_xmit_count;		/* ndp max multicast xmits */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1783
	mib2_ipv6IfStatsEntry_t	*ill_ip6_mib;	/* Per interface mib */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1784
	mib2_ipv6IfIcmpEntry_t	*ill_icmp6_mib;	/* Per interface mib */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1785
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1786
	 * Following two mblks are allocated common to all
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1787
	 * the ipifs when the first interface is coming up.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1788
	 * It is sent up to arp when the last ipif is coming
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1789
	 * down.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1790
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1791
	mblk_t			*ill_arp_down_mp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1792
	mblk_t			*ill_arp_del_mapping_mp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1793
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1794
	 * Used for implementing IFF_NOARP. As IFF_NOARP is used
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1795
	 * to turn off for all the logicals, it is here instead
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1796
	 * of the ipif.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1797
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1798
	mblk_t			*ill_arp_on_mp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1799
	/* Peer ill of an IPMP move operation */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1800
	struct ill_s		*ill_move_peer;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1801
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1802
	phyint_t		*ill_phyint;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1803
	uint64_t		ill_flags;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1804
	ill_group_t		*ill_group;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1805
	struct ill_s		*ill_group_next;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1806
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1807
	 * Reverse tunnel related count. This count
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1808
	 * determines how many mobile nodes are using this
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1809
	 * ill to send packet to reverse tunnel via foreign
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1810
	 * agent. A non-zero count specifies presence of
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1811
	 * mobile node(s) using reverse tunnel through this
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1812
	 * interface.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1813
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1814
	uint32_t		ill_mrtun_refcnt;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1815
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1816
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1817
	 * This count is bumped up when a route is added with
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1818
	 * RTA_SRCIFP bit flag using routing socket.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1819
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1820
	uint32_t		ill_srcif_refcnt;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1821
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1822
	 * Pointer to the special interface based routing table.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1823
	 * This routing table is created dynamically when RTA_SRCIFP
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1824
	 * is set by the routing socket.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1825
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1826
	irb_t			*ill_srcif_table;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1827
	kmutex_t	ill_lock;	/* Please see table below */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1828
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1829
	 * The ill_nd_lla* fields handle the link layer address option
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1830
	 * from neighbor discovery. This is used for external IPv6
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1831
	 * address resolution.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1832
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1833
	mblk_t		*ill_nd_lla_mp;	/* mblk which holds ill_nd_lla */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1834
	uint8_t		*ill_nd_lla;	/* Link Layer Address */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1835
	uint_t		ill_nd_lla_len;	/* Link Layer Address length */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1836
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1837
	 * We now have 3 phys_addr_req's sent down. This field keeps track
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1838
	 * of which one is pending.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1839
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1840
	t_uscalar_t	ill_phys_addr_pend; /* which dl_phys_addr_req pending */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1841
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1842
	 * Used to save errors that occur during plumbing
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1843
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1844
	uint_t		ill_ifname_pending_err;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1845
	avl_node_t	ill_avl_byppa; /* avl node based on ppa */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1846
	void		*ill_fastpath_list; /* both ire and nce hang off this */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1847
	uint_t		ill_refcnt;	/* active refcnt by threads */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1848
	uint_t		ill_ire_cnt;	/* ires associated with this ill */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1849
	kcondvar_t	ill_cv;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1850
	uint_t		ill_ilm_walker_cnt;	/* snmp ilm walkers */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1851
	uint_t		ill_nce_cnt;	/* nces associated with this ill */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1852
	uint_t		ill_waiters;	/* threads waiting in ipsq_enter */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1853
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1854
	 * Contains the upper read queue pointer of the module immediately
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1855
	 * beneath IP.  This field allows IP to validate sub-capability
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1856
	 * acknowledgments coming up from downstream.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1857
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1858
	queue_t		*ill_lmod_rq;	/* read queue pointer of module below */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1859
	uint_t		ill_lmod_cnt;	/* number of modules beneath IP */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1860
	ip_m_t		*ill_media;	/* media specific params/functions */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1861
	t_uscalar_t	ill_dlpi_pending; /* Last DLPI primitive issued */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1862
	uint_t		ill_usesrc_ifindex; /* use src addr from this ILL */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1863
	struct ill_s	*ill_usesrc_grp_next; /* Next ILL in the usesrc group */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1864
#ifdef ILL_DEBUG
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1865
	th_trace_t	*ill_trace[IP_TR_HASH_MAX];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1866
	boolean_t	ill_trace_disable;	/* True when alloc fails */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1867
#endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1868
} ill_t;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1869
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1870
extern	void	ill_delete_glist(ill_t *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1871
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1872
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1873
 * The following table lists the protection levels of the various members
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1874
 * of the ill_t. Same notation as that used for ipif_t above is used.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1875
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1876
 *				Write			Read
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1877
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1878
 * ill_ifptr			ill_g_lock + s		Write once
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1879
 * ill_rq			ipsq			Write once
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1880
 * ill_wq			ipsq			Write once
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1881
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1882
 * ill_error			ipsq			None
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1883
 * ill_ipif			ill_g_lock + ipsq	ill_g_lock OR ipsq
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1884
 * ill_ipif_up_count		ill_lock + ipsq		ill_lock
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1885
 * ill_max_frag			ipsq			Write once
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1886
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1887
 * ill_name			ill_g_lock + ipsq		Write once
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1888
 * ill_name_length		ill_g_lock + ipsq		Write once
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1889
 * ill_ndd_name			ipsq			Write once
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1890
 * ill_net_type			ipsq			Write once
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1891
 * ill_ppa			ill_g_lock + ipsq		Write once
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1892
 * ill_sap			ipsq + down ill		Write once
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1893
 * ill_sap_length		ipsq + down ill		Write once
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1894
 * ill_phys_addr_length		ipsq + down ill		Write once
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1895
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1896
 * ill_bcast_addr_length	ipsq			ipsq
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1897
 * ill_mactype			ipsq			ipsq
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1898
 * ill_frag_ptr			ipsq			ipsq
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1899
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1900
 * ill_frag_timer_id		ill_lock		ill_lock
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1901
 * ill_frag_hash_tbl		ipsq			up ill
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1902
 * ill_ilm			ipsq + ill_lock		ill_lock
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1903
 * ill_mcast_type		ill_lock		ill_lock
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1904
 * ill_mcast_v1_time		ill_lock		ill_lock
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1905
 * ill_mcast_v2_time		ill_lock		ill_lock
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1906
 * ill_mcast_v1_tset		ill_lock		ill_lock
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1907
 * ill_mcast_v2_tset		ill_lock		ill_lock
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1908
 * ill_mcast_rv			ill_lock		ill_lock
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1909
 * ill_mcast_qi			ill_lock		ill_lock
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1910
 * ill_pending_mp		ill_lock		ill_lock
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1911
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1912
 * ill_bcast_mp			ipsq			ipsq
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1913
 * ill_resolver_mp		ipsq			only when ill is up
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1914
 * ill_down_mp			ipsq			ipsq
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1915
 * ill_dlpi_deferred		ipsq			ipsq
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1916
 * ill_phys_addr_mp		ipsq			ipsq
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1917
 * ill_phys_addr		ipsq			up ill
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1918
 * ill_ick			ipsq + down ill		only when ill is up
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1919
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1920
 * ill_state_flags		ill_lock		ill_lock
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1921
 * exclusive bit flags		ipsq_t			ipsq_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1922
 * shared bit flags		ill_lock		ill_lock
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1923
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1924
 * ill_arp_muxid		ipsq			Not atomic
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1925
 * ill_ip_muxid			ipsq			Not atomic
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1926
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1927
 * ill_ipf_gen			Not atomic
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1928
 * ill_frag_count		Approx. not protected
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1929
 * ill_type			ipsq + down ill		only when ill is up
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1930
 * ill_dlpi_multicast_state	ill_lock		ill_lock
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1931
 * ill_dlpi_fastpath_state	ill_lock		ill_lock
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1932
 * ill_max_hops			ipsq			Not atomic
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1933
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1934
 * ill_max_mtu
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1935
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1936
 * ill_reachable_time		ipsq + ill_lock		ill_lock
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1937
 * ill_reachable_retrans_time	ipsq  + ill_lock		ill_lock
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1938
 * ill_max_buf			ipsq + ill_lock		ill_lock
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1939
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1940
 * Next 2 fields need ill_lock because of the get ioctls. They should not
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1941
 * report partially updated results without executing in the ipsq.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1942
 * ill_token			ipsq + ill_lock		ill_lock
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1943
 * ill_token_length		ipsq + ill_lock		ill_lock
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1944
 * ill_xmit_count		ipsq + down ill		write once
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1945
 * ill_ip6_mib			ipsq + down ill		only when ill is up
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1946
 * ill_icmp6_mib		ipsq + down ill		only when ill is up
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1947
 * ill_arp_down_mp		ipsq			ipsq
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1948
 * ill_arp_del_mapping_mp	ipsq			ipsq
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1949
 * ill_arp_on_mp		ipsq			ipsq
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1950
 * ill_move_peer		ipsq			ipsq
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1951
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1952
 * ill_phyint			ipsq, ill_g_lock, ill_lock	Any of them
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1953
 * ill_flags			ill_lock		ill_lock
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1954
 * ill_group			ipsq, ill_g_lock, ill_lock	Any of them
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1955
 * ill_group_next		ipsq, ill_g_lock, ill_lock	Any of them
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1956
 * ill_mrtun_refcnt		ill_lock		ill_lock
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1957
 * ill_srcif_refcnt		ill_lock		ill_lock
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1958
 * ill_srcif_table		ill_lock		ill_lock
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1959
 * ill_nd_lla_mp		ill_lock		ill_lock
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1960
 * ill_nd_lla			ill_lock		ill_lock
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1961
 * ill_nd_lla_len		ill_lock		ill_lock
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1962
 * ill_phys_addr_pend		ipsq + down ill		only when ill is up
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1963
 * ill_ifname_pending_err	ipsq			ipsq
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1964
 * ill_avl_byppa		ipsq, ill_g_lock		Write once
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1965
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1966
 * ill_fastpath_list		ill_lock		ill_lock
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1967
 * ill_refcnt			ill_lock		ill_lock
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1968
 * ill_ire_cnt			ill_lock		ill_lock
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1969
 * ill_cv			ill_lock		ill_lock
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1970
 * ill_ilm_walker_cnt		ill_lock		ill_lock
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1971
 * ill_nce_cnt			ill_lock		ill_lock
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1972
 * ill_trace			ill_lock		ill_lock
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1973
 * ill_usesrc_grp_next		ill_g_usesrc_lock	ill_g_usesrc_lock
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1974
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1975
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1976
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1977
 * For ioctl restart mechanism see ip_reprocess_ioctl()
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1978
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1979
struct ip_ioctl_cmd_s;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1980
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1981
typedef	int (*ifunc_t)(ipif_t *, struct sockaddr_in *, queue_t *, mblk_t *,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1982
    struct ip_ioctl_cmd_s *, void *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1983
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1984
typedef struct ip_ioctl_cmd_s {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1985
	int	ipi_cmd;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1986
	size_t	ipi_copyin_size;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1987
	uint_t	ipi_flags;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1988
	uint_t	ipi_cmd_type;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1989
	ifunc_t	ipi_func;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1990
	ifunc_t	ipi_func_restart;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1991
} ip_ioctl_cmd_t;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1992
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1993
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1994
 * ipi_cmd_type:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1995
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1996
 * IF_CMD		1	old style ifreq cmd
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1997
 * LIF_CMD		2	new style lifreq cmd
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1998
 * MISC_CMD		3	Misc. (non [l]ifreq, tun) cmds
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1999
 * TUN_CMD		4	tunnel related
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2000
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2001
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2002
enum { IF_CMD = 1, LIF_CMD, MISC_CMD, TUN_CMD };
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2003
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2004
#define	IPI_DONTCARE	0	/* For ioctl encoded values that don't matter */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2005
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2006
/* Flag values in ipi_flags */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2007
#define	IPI_PRIV	0x1		/* Root only command */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2008
#define	IPI_MODOK	0x2		/* Permitted on mod instance of IP */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2009
#define	IPI_WR		0x4		/* Need to grab writer access */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2010
#define	IPI_GET_CMD	0x8		/* branch to mi_copyout on success */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2011
#define	IPI_REPL	0x10	/* valid for replacement ipif created in MOVE */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2012
#define	IPI_NULL_BCONT	0x20	/* ioctl has not data and hence no b_cont */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2013
#define	IPI_PASS_DOWN	0x40	/* pass this ioctl down when a module only */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2014
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2015
extern ip_ioctl_cmd_t	ip_ndx_ioctl_table[];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2016
extern ip_ioctl_cmd_t	ip_misc_ioctl_table[];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2017
extern int ip_ndx_ioctl_count;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2018
extern int ip_misc_ioctl_count;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2019
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2020
#define	ILL_CLEAR_MOVE(ill) {				\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2021
	ill_t *peer_ill;				\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2022
							\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2023
	peer_ill = (ill)->ill_move_peer;		\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2024
	ASSERT(peer_ill != NULL);			\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2025
	(ill)->ill_move_in_progress = B_FALSE;		\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2026
	peer_ill->ill_move_in_progress = B_FALSE;	\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2027
	(ill)->ill_move_peer = NULL;			\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2028
	peer_ill->ill_move_peer = NULL;			\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2029
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2030
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2031
/* Passed down by ARP to IP during I_PLINK/I_PUNLINK */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2032
typedef struct ipmx_s {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2033
	char	ipmx_name[LIFNAMSIZ];		/* if name */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2034
	uint_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2035
		ipmx_arpdev_stream : 1,		/* This is the arp stream */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2036
		ipmx_notused : 31;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2037
} ipmx_t;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2038
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2039
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2040
 * State for detecting if a driver supports certain features.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2041
 * Support for DL_ENABMULTI_REQ uses ill_dlpi_multicast_state.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2042
 * Support for DLPI M_DATA fastpath uses ill_dlpi_fastpath_state.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2043
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2044
#define	IDMS_UNKNOWN	0	/* No DL_ENABMULTI_REQ sent */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2045
#define	IDMS_INPROGRESS	1	/* Sent DL_ENABMULTI_REQ */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2046
#define	IDMS_OK		2	/* DL_ENABMULTI_REQ ok */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2047
#define	IDMS_FAILED	3	/* DL_ENABMULTI_REQ failed */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2048
#define	IDMS_RENEG	4	/* Driver asked for a renegotiation */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2049
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2050
/* Named Dispatch Parameter Management Structure */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2051
typedef struct ipparam_s {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2052
	uint_t	ip_param_min;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2053
	uint_t	ip_param_max;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2054
	uint_t	ip_param_value;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2055
	char	*ip_param_name;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2056
} ipparam_t;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2057
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2058
/* Extended NDP Management Structure */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2059
typedef struct ipndp_s {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2060
	ndgetf_t	ip_ndp_getf;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2061
	ndsetf_t	ip_ndp_setf;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2062
	caddr_t		ip_ndp_data;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2063
	char		*ip_ndp_name;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2064
} ipndp_t;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2065
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2066
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2067
 * Following are the macros to increment/decrement the reference
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2068
 * count of the IREs and IRBs (ire bucket).
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2069
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2070
 * 1) We bump up the reference count of an IRE to make sure that
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2071
 *    it does not get deleted and freed while we are using it.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2072
 *    Typically all the lookup functions hold the bucket lock,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2073
 *    and look for the IRE. If it finds an IRE, it bumps up the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2074
 *    reference count before dropping the lock. Sometimes we *may* want
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2075
 *    to bump up the reference count after we *looked* up i.e without
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2076
 *    holding the bucket lock. So, the IRE_REFHOLD macro does not assert
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2077
 *    on the bucket lock being held. Any thread trying to delete from
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2078
 *    the hash bucket can still do so but cannot free the IRE if
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2079
 *    ire_refcnt is not 0.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2080
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2081
 * 2) We bump up the reference count on the bucket where the IRE resides
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2082
 *    (IRB), when we want to prevent the IREs getting deleted from a given
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2083
 *    hash bucket. This makes life easier for ire_walk type functions which
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2084
 *    wants to walk the IRE list, call a function, but needs to drop
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2085
 *    the bucket lock to prevent recursive rw_enters. While the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2086
 *    lock is dropped, the list could be changed by other threads or
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2087
 *    the same thread could end up deleting the ire or the ire pointed by
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2088
 *    ire_next. IRE_REFHOLDing the ire or ire_next is not sufficient as
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2089
 *    a delete will still remove the ire from the bucket while we have
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2090
 *    dropped the lock and hence the ire_next would be NULL. Thus, we
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2091
 *    need a mechanism to prevent deletions from a given bucket.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2092
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2093
 *    To prevent deletions, we bump up the reference count on the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2094
 *    bucket. If the bucket is held, ire_delete just marks IRE_MARK_CONDEMNED
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2095
 *    both on the ire's ire_marks and the bucket's irb_marks. When the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2096
 *    reference count on the bucket drops to zero, all the CONDEMNED ires
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2097
 *    are deleted. We don't have to bump up the reference count on the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2098
 *    bucket if we are walking the bucket and never have to drop the bucket
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2099
 *    lock. Note that IRB_REFHOLD does not prevent addition of new ires
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2100
 *    in the list. It is okay because addition of new ires will not cause
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2101
 *    ire_next to point to freed memory. We do IRB_REFHOLD only when
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2102
 *    all of the 3 conditions are true :
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2103
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2104
 *    1) The code needs to walk the IRE bucket from start to end.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2105
 *    2) It may have to drop the bucket lock sometimes while doing (1)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2106
 *    3) It does not want any ires to be deleted meanwhile.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2107
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2108
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2109
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2110
 * Bump up the reference count on the IRE. We cannot assert that the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2111
 * bucket lock is being held as it is legal to bump up the reference
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2112
 * count after the first lookup has returned the IRE without
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2113
 * holding the lock. Currently ip_wput does this for caching IRE_CACHEs.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2114
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2115
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2116
#ifndef IRE_DEBUG
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2117
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2118
#define	IRE_REFHOLD_NOTR(ire)	IRE_REFHOLD(ire)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2119
#define	IRE_UNTRACE_REF(ire)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2120
#define	IRE_TRACE_REF(ire)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2121
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2122
#else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2123
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2124
#define	IRE_REFHOLD_NOTR(ire) {				\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2125
	atomic_add_32(&(ire)->ire_refcnt, 1);		\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2126
	ASSERT((ire)->ire_refcnt != 0);			\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2127
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2128
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2129
#define	IRE_UNTRACE_REF(ire)	ire_untrace_ref(ire);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2130
#define	IRE_TRACE_REF(ire)	ire_trace_ref(ire);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2131
#endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2132
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2133
#define	IRE_REFHOLD(ire) {				\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2134
	atomic_add_32(&(ire)->ire_refcnt, 1);		\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2135
	ASSERT((ire)->ire_refcnt != 0);			\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2136
	IRE_TRACE_REF(ire);				\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2137
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2138
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2139
#define	IRE_REFHOLD_LOCKED(ire)	{			\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2140
	IRE_TRACE_REF(ire);				\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2141
	(ire)->ire_refcnt++;				\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2142
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2143
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2144
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2145
 * Decrement the reference count on the IRE.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2146
 * In architectures e.g sun4u, where atomic_add_32_nv is just
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2147
 * a cas, we need to maintain the right memory barrier semantics
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2148
 * as that of mutex_exit i.e all the loads and stores should complete
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2149
 * before the cas is executed. membar_exit() does that here.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2150
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2151
 * NOTE : This macro is used only in places where we want performance.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2152
 *	  To avoid bloating the code, we use the function "ire_refrele"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2153
 *	  which essentially calls the macro.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2154
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2155
#ifndef IRE_DEBUG
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2156
#define	IRE_REFRELE(ire) {					\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2157
	ASSERT((ire)->ire_refcnt != 0);				\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2158
	membar_exit();						\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2159
	if (atomic_add_32_nv(&(ire)->ire_refcnt, -1) == 0)	\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2160
		ire_inactive(ire);				\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2161
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2162
#define	IRE_REFRELE_NOTR(ire)	IRE_REFRELE(ire)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2163
#else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2164
#define	IRE_REFRELE(ire) {					\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2165
	if (ire->ire_bucket != NULL)				\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2166
		ire_untrace_ref(ire);				\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2167
	ASSERT((ire)->ire_refcnt != 0);				\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2168
	membar_exit();						\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2169
	if (atomic_add_32_nv(&(ire)->ire_refcnt, -1) == 0)	\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2170
		ire_inactive(ire);				\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2171
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2172
#define	IRE_REFRELE_NOTR(ire) {					\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2173
	ASSERT((ire)->ire_refcnt != 0);				\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2174
	membar_exit();						\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2175
	if (atomic_add_32_nv(&(ire)->ire_refcnt, -1) == 0)	\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2176
		ire_inactive(ire);				\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2177
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2178
#endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2179
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2180
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2181
 * Bump up the reference count on the hash bucket - IRB to
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2182
 * prevent ires from being deleted in this bucket.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2183
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2184
#define	IRB_REFHOLD(irb) {				\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2185
	rw_enter(&(irb)->irb_lock, RW_WRITER);		\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2186
	(irb)->irb_refcnt++;				\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2187
	ASSERT((irb)->irb_refcnt != 0);			\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2188
	rw_exit(&(irb)->irb_lock);			\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2189
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2190
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2191
#define	IRB_REFRELE(irb) {				\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2192
	rw_enter(&(irb)->irb_lock, RW_WRITER);		\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2193
	ASSERT((irb)->irb_refcnt != 0);			\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2194
	if (--(irb)->irb_refcnt	== 0 &&			\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2195
	    ((irb)->irb_marks & IRE_MARK_CONDEMNED)) {	\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2196
		ire_t *ire_list;			\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2197
							\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2198
		ire_list = ire_unlink(irb);		\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2199
		rw_exit(&(irb)->irb_lock);		\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2200
		ASSERT(ire_list != NULL);		\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2201
		ire_cleanup(ire_list);			\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2202
	} else {					\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2203
		rw_exit(&(irb)->irb_lock);		\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2204
	}						\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2205
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2206
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2207
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2208
 * Lock the fast path mp for access, since the ire_fp_mp can be deleted
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2209
 * due a DL_NOTE_FASTPATH_FLUSH in the case of IRE_BROADCAST and IRE_MIPRTUN
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2210
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2211
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2212
#define	LOCK_IRE_FP_MP(ire) {				\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2213
		if ((ire)->ire_type == IRE_BROADCAST ||	\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2214
		    (ire)->ire_type == IRE_MIPRTUN)	\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2215
			mutex_enter(&ire->ire_lock);	\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2216
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2217
#define	UNLOCK_IRE_FP_MP(ire) {				\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2218
		if ((ire)->ire_type == IRE_BROADCAST ||	\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2219
		    (ire)->ire_type == IRE_MIPRTUN)	\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2220
			mutex_exit(&ire->ire_lock);	\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2221
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2222
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2223
typedef struct ire4 {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2224
	ipaddr_t ire4_src_addr;		/* Source address to use. */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2225
	ipaddr_t ire4_mask;		/* Mask for matching this IRE. */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2226
	ipaddr_t ire4_addr;		/* Address this IRE represents. */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2227
	ipaddr_t ire4_gateway_addr;	/* Gateway if IRE_CACHE/IRE_OFFSUBNET */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2228
	ipaddr_t ire4_cmask;		/* Mask from parent prefix route */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2229
} ire4_t;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2230
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2231
typedef struct ire6 {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2232
	in6_addr_t ire6_src_addr;	/* Source address to use. */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2233
	in6_addr_t ire6_mask;		/* Mask for matching this IRE. */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2234
	in6_addr_t ire6_addr;		/* Address this IRE represents. */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2235
	in6_addr_t ire6_gateway_addr;	/* Gateway if IRE_CACHE/IRE_OFFSUBNET */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2236
	in6_addr_t ire6_cmask;		/* Mask from parent prefix route */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2237
} ire6_t;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2238
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2239
typedef union ire_addr {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2240
	ire6_t	ire6_u;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2241
	ire4_t	ire4_u;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2242
} ire_addr_u_t;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2243
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2244
/* Internet Routing Entry */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2245
typedef struct ire_s {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2246
	struct	ire_s	*ire_next;	/* The hash chain must be first. */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2247
	struct	ire_s	**ire_ptpn;	/* Pointer to previous next. */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2248
	uint32_t	ire_refcnt;	/* Number of references */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2249
	mblk_t		*ire_mp;	/* Non-null if allocated as mblk */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2250
	mblk_t		*ire_fp_mp;	/* Fast path header */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2251
	queue_t		*ire_rfq;	/* recv from this queue */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2252
	queue_t		*ire_stq;	/* send to this queue */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2253
	union {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2254
		uint_t	*max_fragp;	/* Used only during ire creation */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2255
		uint_t	max_frag;	/* MTU (next hop or path). */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2256
	} imf_u;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2257
#define	ire_max_frag	imf_u.max_frag
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2258
#define	ire_max_fragp	imf_u.max_fragp
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2259
	uint32_t	ire_frag_flag;	/* IPH_DF or zero. */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2260
	uint32_t	ire_ident;	/* Per IRE IP ident. */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2261
	uint32_t	ire_tire_mark;	/* Used for reclaim of unused. */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2262
	uchar_t		ire_ipversion;	/* IPv4/IPv6 version */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2263
	uchar_t		ire_marks;	/* IRE_MARK_CONDEMNED etc. */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2264
	ushort_t	ire_type;	/* Type of IRE */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2265
	uint_t	ire_ib_pkt_count;	/* Inbound packets for ire_addr */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2266
	uint_t	ire_ob_pkt_count;	/* Outbound packets to ire_addr */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2267
	uint_t	ire_ll_hdr_length;	/* Non-zero if we do M_DATA prepends */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2268
	time_t	ire_create_time;	/* Time (in secs) IRE was created. */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2269
	mblk_t		*ire_dlureq_mp;	/* DL_UNIT_DATA_REQ/RESOLVER mp */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2270
	uint32_t	ire_phandle;	/* Associate prefix IREs to cache */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2271
	uint32_t	ire_ihandle;	/* Associate interface IREs to cache */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2272
	ipif_t		*ire_ipif;	/* the interface that this ire uses */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2273
	uint32_t	ire_flags;	/* flags related to route (RTF_*) */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2274
	uint_t	ire_ipsec_overhead;	/* IPSEC overhead */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2275
	struct	nce_s	*ire_nce;	/* Neighbor Cache Entry for IPv6 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2276
	uint_t		ire_masklen;	/* # bits in ire_mask{,_v6} */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2277
	ire_addr_u_t	ire_u;		/* IPv4/IPv6 address info. */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2278
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2279
	irb_t		*ire_bucket;	/* Hash bucket when ire_ptphn is set */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2280
	iulp_t		ire_uinfo;	/* Upper layer protocol info. */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2281
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2282
	 * Protects ire_uinfo, ire_max_frag, and ire_frag_flag.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2283
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2284
	kmutex_t	ire_lock;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2285
	uint_t		ire_ipif_seqid; /* ipif_seqid of ire_ipif */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2286
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2287
	 * For regular routes in forwarding table and cache table the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2288
	 * the following entries are NULL/zero. Only reverse tunnel
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2289
	 * table and interface based forwarding table use these fields.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2290
	 * Routes added with RTA_SRCIFP and RTA_SRC respectively have
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2291
	 * non-zero values for the following fields.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2292
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2293
	ill_t		*ire_in_ill;	/* Incoming ill interface */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2294
	ipaddr_t	ire_in_src_addr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2295
					/* source ip-addr of incoming packet */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2296
	clock_t		ire_last_used_time;	/* Last used time */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2297
	struct ire_s 	*ire_fastpath;	/* Pointer to next ire in fastpath */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2298
	zoneid_t	ire_zoneid;	/* for local address discrimination */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2299
#ifdef IRE_DEBUG
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2300
	th_trace_t	*ire_trace[IP_TR_HASH_MAX];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2301
	boolean_t	ire_trace_disable;	/* True when alloc fails */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2302
#endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2303
} ire_t;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2304
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2305
/* IPv4 compatiblity macros */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2306
#define	ire_src_addr		ire_u.ire4_u.ire4_src_addr
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2307
#define	ire_mask		ire_u.ire4_u.ire4_mask
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2308
#define	ire_addr		ire_u.ire4_u.ire4_addr
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2309
#define	ire_gateway_addr	ire_u.ire4_u.ire4_gateway_addr
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2310
#define	ire_cmask		ire_u.ire4_u.ire4_cmask
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2311
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2312
#define	ire_src_addr_v6		ire_u.ire6_u.ire6_src_addr
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2313
#define	ire_mask_v6		ire_u.ire6_u.ire6_mask
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2314
#define	ire_addr_v6		ire_u.ire6_u.ire6_addr
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2315
#define	ire_gateway_addr_v6	ire_u.ire6_u.ire6_gateway_addr
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2316
#define	ire_cmask_v6		ire_u.ire6_u.ire6_cmask
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2317
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2318
/* Convenient typedefs for sockaddrs */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2319
typedef	struct sockaddr_in	sin_t;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2320
typedef	struct sockaddr_in6	sin6_t;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2321
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2322
/* Address structure used for internal bind with IP */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2323
typedef struct ipa_conn_s {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2324
	ipaddr_t	ac_laddr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2325
	ipaddr_t	ac_faddr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2326
	uint16_t	ac_fport;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2327
	uint16_t	ac_lport;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2328
} ipa_conn_t;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2329
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2330
typedef struct ipa6_conn_s {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2331
	in6_addr_t	ac6_laddr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2332
	in6_addr_t	ac6_faddr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2333
	uint16_t	ac6_fport;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2334
	uint16_t	ac6_lport;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2335
} ipa6_conn_t;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2336
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2337
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2338
 * Using ipa_conn_x_t or ipa6_conn_x_t allows us to modify the behavior of IP's
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2339
 * bind handler.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2340
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2341
typedef struct ipa_conn_extended_s {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2342
	uint64_t	acx_flags;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2343
	ipa_conn_t	acx_conn;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2344
} ipa_conn_x_t;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2345
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2346
typedef struct ipa6_conn_extended_s {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2347
	uint64_t	ac6x_flags;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2348
	ipa6_conn_t	ac6x_conn;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2349
} ipa6_conn_x_t;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2350
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2351
/* flag values for ipa_conn_x_t and ipa6_conn_x_t. */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2352
#define	ACX_VERIFY_DST	0x1ULL	/* verify destination address is reachable */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2353
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2354
/* Name/Value Descriptor. */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2355
typedef struct nv_s {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2356
	uint64_t nv_value;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2357
	char	*nv_name;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2358
} nv_t;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2359
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2360
/* IP Forwarding Ticket */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2361
typedef	struct ipftk_s {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2362
	queue_t	*ipftk_queue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2363
	ipaddr_t ipftk_dst;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2364
} ipftk_t;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2365
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2366
typedef struct ipt_s {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2367
	pfv_t	func;		/* Routine to call */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2368
	uchar_t	*arg;		/* ire or nce passed in */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2369
} ipt_t;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2370
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2371
#define	ILL_FRAG_HASH(s, i) \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2372
	((ntohl(s) ^ ((i) ^ ((i) >> 8))) % ILL_FRAG_HASH_TBL_COUNT)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2373
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2374
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2375
 * The MAX number of allowed fragmented packets per hash bucket
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2376
 * calculation is based on the most common mtu size of 1500. This limit
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2377
 * will work well for other mtu sizes as well.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2378
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2379
#define	COMMON_IP_MTU 1500
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2380
#define	MAX_FRAG_MIN 10
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2381
#define	MAX_FRAG_PKTS	\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2382
	MAX(MAX_FRAG_MIN, (2 * (ip_reass_queue_bytes / \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2383
	    (COMMON_IP_MTU * ILL_FRAG_HASH_TBL_COUNT))))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2384
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2385
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2386
 * Maximum dups allowed per packet.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2387
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2388
extern uint_t ip_max_frag_dups;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2389
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2390
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2391
 * Per-packet information for received packets and transmitted.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2392
 * Used by the transport protocols when converting between the packet
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2393
 * and ancillary data and socket options.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2394
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2395
 * Note: This private data structure and related IPPF_* constant
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2396
 * definitions are exposed to enable compilation of some debugging tools
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2397
 * like lsof which use struct tcp_t in <inet/tcp.h>. This is intended to be
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2398
 * a temporary hack and long term alternate interfaces should be defined
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2399
 * to support the needs of such tools and private definitions moved to
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2400
 * private headers.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2401
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2402
struct ip6_pkt_s {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2403
	uint_t		ipp_fields;		/* Which fields are valid */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2404
	uint_t		ipp_sticky_ignored;	/* sticky fields to ignore */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2405
	uint_t		ipp_ifindex;		/* pktinfo ifindex */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2406
	in6_addr_t	ipp_addr;		/* pktinfo src/dst addr */
679
f2c9450b58f4 6201425 setting IPV6_UNICAST_HOPS on SCTP socket doesn't do anything
seb
parents: 449
diff changeset
  2407
	uint_t		ipp_unicast_hops;	/* IPV6_UNICAST_HOPS */
f2c9450b58f4 6201425 setting IPV6_UNICAST_HOPS on SCTP socket doesn't do anything
seb
parents: 449
diff changeset
  2408
	uint_t		ipp_multicast_hops;	/* IPV6_MULTICAST_HOPS */
f2c9450b58f4 6201425 setting IPV6_UNICAST_HOPS on SCTP socket doesn't do anything
seb
parents: 449
diff changeset
  2409
	uint_t		ipp_hoplimit;		/* IPV6_HOPLIMIT */
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2410
	uint_t		ipp_hopoptslen;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2411
	uint_t		ipp_rtdstoptslen;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2412
	uint_t		ipp_rthdrlen;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2413
	uint_t		ipp_dstoptslen;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2414
	uint_t		ipp_pathmtulen;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2415
	ip6_hbh_t	*ipp_hopopts;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2416
	ip6_dest_t	*ipp_rtdstopts;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2417
	ip6_rthdr_t	*ipp_rthdr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2418
	ip6_dest_t	*ipp_dstopts;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2419
	struct ip6_mtuinfo *ipp_pathmtu;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2420
	in6_addr_t	ipp_nexthop;		/* Transmit only */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2421
	uint8_t		ipp_tclass;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2422
	int8_t		ipp_use_min_mtu;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2423
};
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2424
typedef struct ip6_pkt_s ip6_pkt_t;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2425
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2426
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2427
 * This structure is used to convey information from IP and the ULP.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2428
 * Currently used for the IP_RECVSLLA and IP_RECVIF options. The
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2429
 * type of information field is set to IN_PKTINFO (i.e inbound pkt info)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2430
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2431
typedef struct in_pktinfo {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2432
	uint32_t		in_pkt_ulp_type;	/* type of info sent */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2433
							/* to UDP */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2434
	uint32_t		in_pkt_flags;	/* what is sent up by IP */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2435
	uint32_t		in_pkt_ifindex;	/* inbound interface index */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2436
	struct sockaddr_dl	in_pkt_slla;	/* has source link layer addr */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2437
} in_pktinfo_t;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2438
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2439
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2440
 * flags to tell UDP what IP is sending
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2441
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2442
#define	IPF_RECVIF	0x01	/* inbound interface index */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2443
#define	IPF_RECVSLLA	0x02	/* source link layer address */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2444
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2445
/* ipp_fields values */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2446
#define	IPPF_IFINDEX	0x0001	/* Part of in6_pktinfo: ifindex */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2447
#define	IPPF_ADDR	0x0002	/* Part of in6_pktinfo: src/dst addr */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2448
#define	IPPF_SCOPE_ID	0x0004	/* Add xmit ip6i_t for sin6_scope_id */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2449
#define	IPPF_NO_CKSUM	0x0008	/* Add xmit ip6i_t for IP6I_NO_*_CKSUM */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2450
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2451
#define	IPPF_RAW_CKSUM	0x0010	/* Add xmit ip6i_t for IP6I_RAW_CHECKSUM */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2452
#define	IPPF_HOPLIMIT	0x0020
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2453
#define	IPPF_HOPOPTS	0x0040
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2454
#define	IPPF_RTHDR	0x0080
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2455
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2456
#define	IPPF_RTDSTOPTS	0x0100
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2457
#define	IPPF_DSTOPTS	0x0200
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2458
#define	IPPF_NEXTHOP	0x0400
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2459
#define	IPPF_PATHMTU	0x0800
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2460
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2461
#define	IPPF_TCLASS	0x1000
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2462
#define	IPPF_DONTFRAG	0x2000
679
f2c9450b58f4 6201425 setting IPV6_UNICAST_HOPS on SCTP socket doesn't do anything
seb
parents: 449
diff changeset
  2463
#define	IPPF_USE_MIN_MTU	0x04000
f2c9450b58f4 6201425 setting IPV6_UNICAST_HOPS on SCTP socket doesn't do anything
seb
parents: 449
diff changeset
  2464
#define	IPPF_MULTICAST_HOPS	0x08000
f2c9450b58f4 6201425 setting IPV6_UNICAST_HOPS on SCTP socket doesn't do anything
seb
parents: 449
diff changeset
  2465
#define	IPPF_UNICAST_HOPS	0x10000
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2466
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2467
#define	IPPF_HAS_IP6I \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2468
	(IPPF_IFINDEX|IPPF_ADDR|IPPF_NEXTHOP|IPPF_SCOPE_ID| \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2469
	IPPF_NO_CKSUM|IPPF_RAW_CKSUM|IPPF_HOPLIMIT|IPPF_DONTFRAG| \
679
f2c9450b58f4 6201425 setting IPV6_UNICAST_HOPS on SCTP socket doesn't do anything
seb
parents: 449
diff changeset
  2470
	IPPF_USE_MIN_MTU|IPPF_MULTICAST_HOPS|IPPF_UNICAST_HOPS)
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2471
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2472
#define	TCP_PORTS_OFFSET	0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2473
#define	UDP_PORTS_OFFSET	0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2474
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2475
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2476
 * lookups return the ill/ipif only if the flags are clear OR Iam writer.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2477
 * ill / ipif lookup functions increment the refcnt on the ill / ipif only
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2478
 * after calling these macros. This ensures that the refcnt on the ipif or
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2479
 * ill will eventually drop down to zero.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2480
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2481
#define	ILL_LOOKUP_FAILED	1	/* Used as error code */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2482
#define	IPIF_LOOKUP_FAILED	2	/* Used as error code */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2483
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2484
#define	ILL_CAN_LOOKUP(ill) 						\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2485
	(!((ill)->ill_state_flags & (ILL_CONDEMNED | ILL_CHANGING)) ||	\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2486
	IAM_WRITER_ILL(ill))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2487
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2488
#define	ILL_CAN_WAIT(ill, q)	\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2489
	(((q) != NULL) && !((ill)->ill_state_flags & (ILL_CONDEMNED)))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2490
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2491
#define	ILL_CAN_LOOKUP_WALKER(ill)	\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2492
	(!((ill)->ill_state_flags & ILL_CONDEMNED))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2493
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2494
#define	IPIF_CAN_LOOKUP(ipif)						\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2495
	(!((ipif)->ipif_state_flags & (IPIF_CONDEMNED | IPIF_CHANGING)) || \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2496
	IAM_WRITER_IPIF(ipif))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2497
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2498
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2499
 * If the parameter 'q' is NULL, the caller is not interested in wait and
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2500
 * restart of the operation if the ILL or IPIF cannot be looked up when it is
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2501
 * marked as 'CHANGING'. Typically a thread that tries to send out data  will
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2502
 * end up passing NULLs as the last 4 parameters to ill_lookup_on_ifindex and
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2503
 * in this case 'q' is NULL
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2504
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2505
#define	IPIF_CAN_WAIT(ipif, q)	\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2506
	(((q) != NULL) && !((ipif)->ipif_state_flags & (IPIF_CONDEMNED)))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2507
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2508
#define	IPIF_CAN_LOOKUP_WALKER(ipif)					\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2509
	(!((ipif)->ipif_state_flags & (IPIF_CONDEMNED)) ||		\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2510
	IAM_WRITER_IPIF(ipif))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2511
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2512
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2513
 * These macros are used by critical set ioctls and failover ioctls to
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2514
 * mark the ipif appropriately before starting the operation and to clear the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2515
 * marks after completing the operation.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2516
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2517
#define	IPIF_UNMARK_MOVING(ipif)                                \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2518
	(ipif)->ipif_state_flags &= ~IPIF_MOVING & ~IPIF_CHANGING;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2519
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2520
#define	ILL_UNMARK_CHANGING(ill)                                \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2521
	(ill)->ill_state_flags &= ~ILL_CHANGING;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2522
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2523
/* Macros used to assert that this thread is a writer  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2524
#define	IAM_WRITER_IPSQ(ipsq)	((ipsq)->ipsq_writer == curthread)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2525
#define	IAM_WRITER_ILL(ill)					\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2526
	((ill)->ill_phyint->phyint_ipsq->ipsq_writer == curthread)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2527
#define	IAM_WRITER_IPIF(ipif)					\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2528
	((ipif)->ipif_ill->ill_phyint->phyint_ipsq->ipsq_writer == curthread)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2529
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2530
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2531
 * Grab ill locks in the proper order. The order is highest addressed
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2532
 * ill is locked first.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2533
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2534
#define	GRAB_ILL_LOCKS(ill_1, ill_2)				\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2535
{								\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2536
	if ((ill_1) > (ill_2)) {				\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2537
		if (ill_1 != NULL)				\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2538
			mutex_enter(&(ill_1)->ill_lock);	\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2539
		if (ill_2 != NULL)				\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2540
			mutex_enter(&(ill_2)->ill_lock);	\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2541
	} else {						\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2542
		if (ill_2 != NULL)				\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2543
			mutex_enter(&(ill_2)->ill_lock);	\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2544
		if (ill_1 != NULL && ill_1 != ill_2)		\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2545
			mutex_enter(&(ill_1)->ill_lock);	\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2546
	}							\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2547
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2548
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2549
#define	RELEASE_ILL_LOCKS(ill_1, ill_2)		\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2550
{						\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2551
	if (ill_1 != NULL)			\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2552
		mutex_exit(&(ill_1)->ill_lock);	\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2553
	if (ill_2 != NULL && ill_2 != ill_1)	\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2554
		mutex_exit(&(ill_2)->ill_lock);	\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2555
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2556
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2557
/* Get the other protocol instance ill */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2558
#define	ILL_OTHER(ill)						\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2559
	((ill)->ill_isv6 ? (ill)->ill_phyint->phyint_illv4 :	\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2560
	    (ill)->ill_phyint->phyint_illv6)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2561
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2562
#define	MATCH_V4_ONLY	0x1
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2563
#define	MATCH_V6_ONLY	0x2
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2564
#define	MATCH_ILL_ONLY	0x4
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2565
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2566
/* ioctl command info: Ioctl properties extracted and stored in here */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2567
typedef struct cmd_info_s
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2568
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2569
	char    ci_groupname[LIFNAMSIZ + 1];	/* SIOCSLIFGROUPNAME */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2570
	ipif_t  *ci_ipif;	/* ipif associated with [l]ifreq ioctl's */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2571
	sin_t	*ci_sin;	/* the sin struct passed down */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2572
	sin6_t	*ci_sin6;	/* the sin6_t struct passed down */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2573
	struct lifreq *ci_lifr;	/* the lifreq struct passed down */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2574
} cmd_info_t;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2575
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2576
extern krwlock_t ill_g_lock;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2577
extern kmutex_t ip_addr_avail_lock;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2578
extern ipsq_t	*ipsq_g_head;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2579
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2580
extern ill_t	*ip_timer_ill;		/* ILL for IRE expiration timer. */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2581
extern timeout_id_t ip_ire_expire_id;	/* IRE expiration timeout id. */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2582
extern timeout_id_t ip_ire_reclaim_id;	/* IRE recalaim timeout id. */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2583
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2584
extern kmutex_t	ip_mi_lock;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2585
extern krwlock_t ip_g_nd_lock;		/* For adding/removing nd variables */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2586
extern kmutex_t ip_trash_timer_lock;	/* Protects ip_ire_expire_id */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2587
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2588
extern kmutex_t igmp_timer_lock;	/* Protects the igmp timer */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2589
extern kmutex_t mld_timer_lock;		/* Protects the mld timer */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2590
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2591
extern krwlock_t ill_g_usesrc_lock;	/* Protects usesrc related fields */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2592
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2593
extern struct kmem_cache *ire_cache;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2594
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2595
extern uint_t	ip_ire_default_count;	/* Number of IPv4 IRE_DEFAULT entries */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2596
extern uint_t	ip_ire_default_index;	/* Walking index used to mod in */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2597
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2598
extern ipaddr_t	ip_g_all_ones;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2599
extern caddr_t	ip_g_nd;		/* Named Dispatch List Head */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2600
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2601
extern uint_t	ip_loopback_mtu;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2602
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2603
extern ipparam_t	*ip_param_arr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2604
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2605
extern int ip_g_forward;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2606
extern int ipv6_forward;
741
40027a3621ac PSARC 2005/082 Yosemite: UDP Performance Enhancement
masputra
parents: 679
diff changeset
  2607
extern vmem_t *ip_minor_arena;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2608
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2609
#define	ip_respond_to_address_mask_broadcast ip_param_arr[0].ip_param_value
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2610
#define	ip_g_send_redirects		ip_param_arr[5].ip_param_value
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2611
#define	ip_debug			ip_param_arr[7].ip_param_value
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2612
#define	ip_mrtdebug			ip_param_arr[8].ip_param_value
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2613
#define	ip_timer_interval		ip_param_arr[9].ip_param_value
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2614
#define	ip_ire_arp_interval		ip_param_arr[10].ip_param_value
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2615
#define	ip_def_ttl			ip_param_arr[12].ip_param_value
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2616
#define	ip_wroff_extra			ip_param_arr[14].ip_param_value
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2617
#define	ip_path_mtu_discovery		ip_param_arr[17].ip_param_value
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2618
#define	ip_ignore_delete_time		ip_param_arr[18].ip_param_value
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2619
#define	ip_output_queue			ip_param_arr[20].ip_param_value
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2620
#define	ip_broadcast_ttl		ip_param_arr[21].ip_param_value
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2621
#define	ip_icmp_err_interval		ip_param_arr[22].ip_param_value
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2622
#define	ip_icmp_err_burst		ip_param_arr[23].ip_param_value
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2623
#define	ip_reass_queue_bytes		ip_param_arr[24].ip_param_value
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2624
#define	ip_addrs_per_if			ip_param_arr[26].ip_param_value
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2625
#define	ipsec_override_persocket_policy	ip_param_arr[27].ip_param_value
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2626
#define	icmp_accept_clear_messages	ip_param_arr[28].ip_param_value
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2627
#define	delay_first_probe_time		ip_param_arr[30].ip_param_value
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2628
#define	max_unicast_solicit		ip_param_arr[31].ip_param_value
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2629
#define	ipv6_def_hops			ip_param_arr[32].ip_param_value
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2630
#define	ipv6_icmp_return		ip_param_arr[33].ip_param_value
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2631
#define	ipv6_forward_src_routed		ip_param_arr[34].ip_param_value
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2632
#define	ipv6_resp_echo_mcast		ip_param_arr[35].ip_param_value
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2633
#define	ipv6_send_redirects		ip_param_arr[36].ip_param_value
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2634
#define	ipv6_ignore_redirect		ip_param_arr[37].ip_param_value
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2635
#define	ipv6_strict_dst_multihoming	ip_param_arr[38].ip_param_value
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2636
#define	ip_ire_reclaim_fraction		ip_param_arr[39].ip_param_value
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2637
#define	ipsec_policy_log_interval	ip_param_arr[40].ip_param_value
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2638
#define	ip_ndp_unsolicit_interval	ip_param_arr[42].ip_param_value
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2639
#define	ip_ndp_unsolicit_count		ip_param_arr[43].ip_param_value
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2640
#define	ipv6_ignore_home_address_opt	ip_param_arr[44].ip_param_value
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2641
#define	ip_policy_mask			ip_param_arr[45].ip_param_value
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2642
#define	ip_multirt_resolution_interval	ip_param_arr[46].ip_param_value
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2643
#define	ip_multirt_ttl			ip_param_arr[47].ip_param_value
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2644
#define	ip_multidata_outbound		ip_param_arr[48].ip_param_value
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2645
#ifdef DEBUG
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2646
#define	ipv6_drop_inbound_icmpv6	ip_param_arr[49].ip_param_value
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2647
#else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2648
#define	ipv6_drop_inbound_icmpv6	0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2649
#endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2650
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2651
extern hrtime_t	ipsec_policy_failure_last;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2652
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2653
extern int	dohwcksum;	/* use h/w cksum if supported by the h/w */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2654
#ifdef ZC_TEST
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2655
extern int	noswcksum;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2656
#endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2657
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2658
extern char	ipif_loopback_name[];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2659
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2660
extern nv_t	*ire_nv_tbl;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2661
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2662
extern time_t	ip_g_frag_timeout;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2663
extern clock_t	ip_g_frag_timo_ms;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2664
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2665
extern mib2_ip_t	ip_mib;	/* For tcpInErrs and udpNoPorts */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2666
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2667
extern struct module_info ip_mod_info;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2668
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2669
extern timeout_id_t	igmp_slowtimeout_id;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2670
extern timeout_id_t	mld_slowtimeout_id;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2671
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2672
extern uint_t	loopback_packets;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2673
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2674
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2675
 * Network byte order macros
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2676
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2677
#ifdef	_BIG_ENDIAN
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2678
#define	N_IN_CLASSD_NET		IN_CLASSD_NET
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2679
#define	N_INADDR_UNSPEC_GROUP	INADDR_UNSPEC_GROUP
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2680
#else /* _BIG_ENDIAN */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2681
#define	N_IN_CLASSD_NET		(ipaddr_t)0x000000f0U
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2682
#define	N_INADDR_UNSPEC_GROUP	(ipaddr_t)0x000000e0U
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2683
#endif /* _BIG_ENDIAN */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2684
#define	CLASSD(addr)	(((addr) & N_IN_CLASSD_NET) == N_INADDR_UNSPEC_GROUP)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2685
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2686
#ifdef DEBUG
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2687
/* IPsec HW acceleration debugging support */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2688
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2689
#define	IPSECHW_CAPAB		0x0001	/* capability negotiation */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2690
#define	IPSECHW_SADB		0x0002	/* SADB exchange */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2691
#define	IPSECHW_PKT		0x0004	/* general packet flow */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2692
#define	IPSECHW_PKTIN		0x0008	/* driver in pkt processing details */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2693
#define	IPSECHW_PKTOUT		0x0010	/* driver out pkt processing details */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2694
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2695
#define	IPSECHW_DEBUG(f, x)	if (ipsechw_debug & (f)) { (void) printf x; }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2696
#define	IPSECHW_CALL(f, r, x)	if (ipsechw_debug & (f)) { (void) r x; }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2697
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2698
extern uint32_t ipsechw_debug;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2699
#else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2700
#define	IPSECHW_DEBUG(f, x)	{}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2701
#define	IPSECHW_CALL(f, r, x)	{}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2702
#endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2703
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2704
#ifdef IP_DEBUG
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2705
#include <sys/debug.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2706
#include <sys/promif.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2707
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2708
#define	ip0dbg(a)	printf a
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2709
#define	ip1dbg(a)	if (ip_debug > 2) printf a
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2710
#define	ip2dbg(a)	if (ip_debug > 3) printf a
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2711
#define	ip3dbg(a)	if (ip_debug > 4) printf a
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2712
#else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2713
#define	ip0dbg(a)	/* */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2714
#define	ip1dbg(a)	/* */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2715
#define	ip2dbg(a)	/* */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2716
#define	ip3dbg(a)	/* */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2717
#endif	/* IP_DEBUG */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2718
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2719
extern const char *dlpi_prim_str(int);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2720
extern const char *dlpi_err_str(int);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2721
extern void	ill_frag_timer(void *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2722
extern ill_t	*ill_first(int, int, ill_walk_context_t *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2723
extern ill_t	*ill_next(ill_walk_context_t *, ill_t *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2724
extern void	ill_frag_timer_start(ill_t *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2725
extern mblk_t	*ip_carve_mp(mblk_t **, ssize_t);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2726
extern mblk_t	*ip_dlpi_alloc(size_t, t_uscalar_t);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2727
extern char	*ip_dot_addr(ipaddr_t, char *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2728
extern void	ip_lwput(queue_t *, mblk_t *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2729
extern boolean_t icmp_err_rate_limit(void);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2730
extern void	icmp_time_exceeded(queue_t *, mblk_t *, uint8_t);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2731
extern void	icmp_unreachable(queue_t *, mblk_t *, uint8_t);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2732
extern mblk_t	*ip_add_info(mblk_t *, ill_t *, uint_t);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2733
extern mblk_t	*ip_bind_v4(queue_t *, mblk_t *, conn_t *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2734
extern int	ip_bind_connected(conn_t *, mblk_t *, ipaddr_t *, uint16_t,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2735
    ipaddr_t, uint16_t, boolean_t, boolean_t, boolean_t,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2736
    boolean_t);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2737
extern boolean_t ip_bind_ipsec_policy_set(conn_t *, mblk_t *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2738
extern int	ip_bind_laddr(conn_t *, mblk_t *, ipaddr_t, uint16_t,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2739
    boolean_t, boolean_t, boolean_t);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2740
extern uint_t	ip_cksum(mblk_t *, int, uint32_t);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2741
extern int	ip_close(queue_t *, int);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2742
extern uint16_t	ip_csum_hdr(ipha_t *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2743
extern void	ip_proto_not_sup(queue_t *, mblk_t *, uint_t, zoneid_t);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2744
extern void	ip_ire_fini(void);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2745
extern void	ip_ire_init(void);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2746
extern int	ip_open(queue_t *, dev_t *, int, int, cred_t *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2747
extern int	ip_reassemble(mblk_t *, ipf_t *, uint_t, boolean_t, ill_t *,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2748
    size_t);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2749
extern int	ip_opt_set_ill(conn_t *, int, boolean_t, boolean_t,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2750
    int, int, mblk_t *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2751
extern void	ip_rput(queue_t *, mblk_t *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2752
extern void	ip_input(ill_t *, ill_rx_ring_t *, mblk_t *, size_t);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2753
extern void	ip_rput_dlpi(queue_t *, mblk_t *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2754
extern void	ip_rput_forward(ire_t *, ipha_t *, mblk_t *, ill_t *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2755
extern void	ip_rput_forward_multicast(ipaddr_t, mblk_t *, ipif_t *);
741
40027a3621ac PSARC 2005/082 Yosemite: UDP Performance Enhancement
masputra
parents: 679
diff changeset
  2756
40027a3621ac PSARC 2005/082 Yosemite: UDP Performance Enhancement
masputra
parents: 679
diff changeset
  2757
extern int	ip_snmpmod_close(queue_t *);
40027a3621ac PSARC 2005/082 Yosemite: UDP Performance Enhancement
masputra
parents: 679
diff changeset
  2758
extern void	ip_snmpmod_wput(queue_t *, mblk_t *);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2759
extern void	ip_udp_input(queue_t *, mblk_t *, ipha_t *, ire_t *, ill_t *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2760
extern void	ip_proto_input(queue_t *, mblk_t *, ipha_t *, ire_t *, ill_t *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2761
extern void	ip_rput_other(ipsq_t *, queue_t *, mblk_t *, void *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2762
extern void	ip_setqinfo(queue_t *, minor_t, boolean_t);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2763
extern void	ip_trash_ire_reclaim(void *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2764
extern void	ip_trash_timer_expire(void *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2765
extern void	ip_wput(queue_t *, mblk_t *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2766
extern void	ip_output(void *, mblk_t *, void *, int);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2767
extern void	ip_wput_md(queue_t *, mblk_t *, conn_t *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2768
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2769
extern void	ip_wput_ire(queue_t *, mblk_t *, ire_t *, conn_t *, int);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2770
extern void	ip_wput_local(queue_t *, ill_t *, ipha_t *, mblk_t *, ire_t *,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2771
    int, zoneid_t);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2772
extern void	ip_wput_multicast(queue_t *, mblk_t *, ipif_t *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2773
extern void	ip_wput_nondata(ipsq_t *, queue_t *, mblk_t *, void *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2774
extern void	ip_wsrv(queue_t *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2775
extern char	*ip_nv_lookup(nv_t *, int);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2776
extern boolean_t ip_local_addr_ok_v6(const in6_addr_t *, const in6_addr_t *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2777
extern boolean_t ip_remote_addr_ok_v6(const in6_addr_t *, const in6_addr_t *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2778
extern ipaddr_t ip_massage_options(ipha_t *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2779
extern ipaddr_t ip_net_mask(ipaddr_t);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2780
extern void	ip_newroute(queue_t *, mblk_t *, ipaddr_t, ill_t *, conn_t *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2781
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2782
extern struct qinit rinit_ipv6;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2783
extern struct qinit winit_ipv6;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2784
extern struct qinit rinit_tcp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2785
extern struct qinit rinit_tcp6;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2786
extern struct qinit winit_tcp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2787
extern struct qinit rinit_acceptor_tcp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2788
extern struct qinit winit_acceptor_tcp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2789
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2790
extern void	conn_drain_insert(conn_t *connp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2791
extern	int	conn_ipsec_length(conn_t *connp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2792
extern void	ip_wput_ipsec_out(queue_t *, mblk_t *, ipha_t *, ill_t *,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2793
    ire_t *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2794
extern ipaddr_t	ip_get_dst(ipha_t *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2795
extern int	ipsec_out_extra_length(mblk_t *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2796
extern int	ipsec_in_extra_length(mblk_t *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2797
extern mblk_t	*ipsec_in_alloc();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2798
extern boolean_t ipsec_in_is_secure(mblk_t *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2799
extern void	ipsec_out_process(queue_t *, mblk_t *, ire_t *, uint_t);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2800
extern void	ipsec_out_to_in(mblk_t *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2801
extern int	ill_forward_set(queue_t *, mblk_t *, boolean_t, caddr_t);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2802
extern void	ip_fanout_proto_again(mblk_t *, ill_t *, ill_t *, ire_t *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2803
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2804
extern void	ire_cleanup(ire_t *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2805
extern void	ire_inactive(ire_t *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2806
extern ire_t	*ire_unlink(irb_t *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2807
#ifdef IRE_DEBUG
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2808
extern	void	ire_trace_ref(ire_t *ire);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2809
extern	void	ire_untrace_ref(ire_t *ire);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2810
extern	void	ire_thread_exit(ire_t *ire, caddr_t);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2811
#endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2812
#ifdef ILL_DEBUG
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2813
extern	void	ill_trace_cleanup(ill_t *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2814
extern	void	ipif_trace_cleanup(ipif_t *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2815
#endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2816
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2817
extern int	ip_srcid_insert(const in6_addr_t *, zoneid_t);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2818
extern int	ip_srcid_remove(const in6_addr_t *, zoneid_t);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2819
extern void	ip_srcid_find_id(uint_t, in6_addr_t *, zoneid_t);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2820
extern uint_t	ip_srcid_find_addr(const in6_addr_t *, zoneid_t);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2821
extern int	ip_srcid_report(queue_t *, mblk_t *, caddr_t, cred_t *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2822
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2823
extern uint8_t	ipoptp_next(ipoptp_t *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2824
extern uint8_t	ipoptp_first(ipoptp_t *, ipha_t *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2825
extern ill_t	*ip_grab_attach_ill(ill_t *, mblk_t *, int, boolean_t);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2826
extern ire_t	*conn_set_outgoing_ill(conn_t *, ire_t *, ill_t **);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2827
extern int	ipsec_req_from_conn(conn_t *, ipsec_req_t *, int);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2828
extern int	ip_snmp_get(queue_t *q, mblk_t *mctl);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2829
extern int	ip_snmp_set(queue_t *q, int, int, uchar_t *, int);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2830
extern void	ip_process_ioctl(ipsq_t *, queue_t *, mblk_t *, void *);
741
40027a3621ac PSARC 2005/082 Yosemite: UDP Performance Enhancement
masputra
parents: 679
diff changeset
  2831
extern void	ip_quiesce_conn(conn_t *);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2832
extern  void    ip_reprocess_ioctl(ipsq_t *, queue_t *, mblk_t *, void *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2833
extern void	ip_restart_optmgmt(ipsq_t *, queue_t *, mblk_t *, void *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2834
extern void	ip_ioctl_finish(queue_t *, mblk_t *, int, int, ipif_t *,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2835
    ipsq_t *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2836
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2837
extern boolean_t	ipsq_pending_mp_cleanup(ill_t *, conn_t *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2838
extern void	conn_ioctl_cleanup(conn_t *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2839
extern ill_t	*conn_get_held_ill(conn_t *, ill_t **, int *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2840
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2841
struct multidata_s;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2842
struct pdesc_s;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2843
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2844
extern mblk_t	*ip_mdinfo_alloc(ill_mdt_capab_t *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2845
extern mblk_t	*ip_mdinfo_return(ire_t *, conn_t *, char *, ill_mdt_capab_t *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2846
extern uint_t	ip_md_cksum(struct pdesc_s *, int, uint_t);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2847
extern boolean_t ip_md_addr_attr(struct multidata_s *, struct pdesc_s *,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2848
			const mblk_t *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2849
extern boolean_t ip_md_hcksum_attr(struct multidata_s *, struct pdesc_s *,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2850
			uint32_t, uint32_t, uint32_t, uint32_t);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2851
extern boolean_t ip_md_zcopy_attr(struct multidata_s *, struct pdesc_s *,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2852
			uint_t);
741
40027a3621ac PSARC 2005/082 Yosemite: UDP Performance Enhancement
masputra
parents: 679
diff changeset
  2853
extern mblk_t	*ip_unbind(queue_t *, mblk_t *);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2854
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2855
/* Hooks for CGTP (multirt routes) filtering module */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2856
#define	CGTP_FILTER_REV_1	1
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2857
#define	CGTP_FILTER_REV_2	2
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2858
#define	CGTP_FILTER_REV		CGTP_FILTER_REV_2
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2859
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2860
/* cfo_filter, cfo_filter_fp, cfo_filter_v6 hooks return values */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2861
#define	CGTP_IP_PKT_NOT_CGTP	0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2862
#define	CGTP_IP_PKT_PREMIUM	1
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2863
#define	CGTP_IP_PKT_DUPLICATE	2
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2864
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2865
typedef struct cgtp_filter_ops {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2866
	int	cfo_filter_rev;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2867
	int	(*cfo_change_state)(int);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2868
	int	(*cfo_add_dest_v4)(ipaddr_t, ipaddr_t, ipaddr_t, ipaddr_t);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2869
	int	(*cfo_del_dest_v4)(ipaddr_t, ipaddr_t);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2870
	int	(*cfo_add_dest_v6)(in6_addr_t *, in6_addr_t *, in6_addr_t *,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2871
		    in6_addr_t *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2872
	int	(*cfo_del_dest_v6)(in6_addr_t *, in6_addr_t *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2873
	int	(*cfo_filter)(queue_t *, mblk_t *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2874
	int	(*cfo_filter_fp)(queue_t *, mblk_t *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2875
	int	(*cfo_filter_v6)(queue_t *, ip6_t *, ip6_frag_t *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2876
} cgtp_filter_ops_t;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2877
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2878
#define	CGTP_MCAST_SUCCESS	1
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2879
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2880
extern cgtp_filter_ops_t *ip_cgtp_filter_ops;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2881
extern boolean_t ip_cgtp_filter;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2882
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2883
extern int	ip_cgtp_filter_supported(void);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2884
extern int	ip_cgtp_filter_register(cgtp_filter_ops_t *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2885
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2886
/* Flags for ire_multirt_lookup() */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2887
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2888
#define	MULTIRT_USESTAMP	0x0001
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2889
#define	MULTIRT_SETSTAMP	0x0002
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2890
#define	MULTIRT_CACHEGW		0x0004
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2891
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2892
/* Debug stuff for multirt route resolution. */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2893
#if defined(DEBUG) && !defined(__lint)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2894
/* Our "don't send, rather drop" flag. */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2895
#define	MULTIRT_DEBUG_FLAG	0x8000
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2896
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2897
#define	MULTIRT_TRACE(x)	ip2dbg(x)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2898
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2899
#define	MULTIRT_DEBUG_TAG(mblk)	\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2900
	do { \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2901
		ASSERT(mblk != NULL); \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2902
		MULTIRT_TRACE(("%s[%d]: tagging mblk %p, tag was %d\n", \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2903
		__FILE__, __LINE__, \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2904
		(void *)(mblk), (mblk)->b_flag & MULTIRT_DEBUG_FLAG)); \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2905
		(mblk)->b_flag |= MULTIRT_DEBUG_FLAG; \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2906
	} while (0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2907
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2908
#define	MULTIRT_DEBUG_UNTAG(mblk) \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2909
	do { \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2910
		ASSERT(mblk != NULL); \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2911
		MULTIRT_TRACE(("%s[%d]: untagging mblk %p, tag was %d\n", \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2912
		__FILE__, __LINE__, \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2913
		(void *)(mblk), (mblk)->b_flag & MULTIRT_DEBUG_FLAG)); \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2914
		(mblk)->b_flag &= ~MULTIRT_DEBUG_FLAG; \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2915
	} while (0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2916
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2917
#define	MULTIRT_DEBUG_TAGGED(mblk) \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2918
	(((mblk)->b_flag & MULTIRT_DEBUG_FLAG) ? B_TRUE : B_FALSE)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2919
#else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2920
#define	MULTIRT_DEBUG_TAG(mblk)		ASSERT(mblk != NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2921
#define	MULTIRT_DEBUG_UNTAG(mblk)	ASSERT(mblk != NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2922
#define	MULTIRT_DEBUG_TAGGED(mblk)	B_FALSE
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2923
#endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2924
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2925
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2926
 * Per-ILL Multidata Transmit capabilities.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2927
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2928
struct ill_mdt_capab_s {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2929
	uint_t ill_mdt_version;  /* interface version */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2930
	uint_t ill_mdt_on;	 /* on/off switch for MDT on this ILL */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2931
	uint_t ill_mdt_hdr_head; /* leading header fragment extra space */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2932
	uint_t ill_mdt_hdr_tail; /* trailing header fragment extra space */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2933
	uint_t ill_mdt_max_pld;	 /* maximum payload buffers per Multidata */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2934
	uint_t ill_mdt_span_limit; /* maximum payload span per packet */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2935
};
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2936
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2937
struct ill_hcksum_capab_s {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2938
	uint_t	ill_hcksum_version;	/* interface version */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2939
	uint_t	ill_hcksum_txflags;	/* capabilities on transmit */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2940
};
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2941
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2942
struct ill_zerocopy_capab_s {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2943
	uint_t	ill_zerocopy_version;	/* interface version */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2944
	uint_t	ill_zerocopy_flags;	/* capabilities */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2945
};
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2946
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2947
/* Possible ill_states */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2948
#define	ILL_RING_INPROC		3	/* Being assigned to squeue */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2949
#define	ILL_RING_INUSE		2	/* Already Assigned to Rx Ring */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2950
#define	ILL_RING_BEING_FREED	1	/* Being Unassigned */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2951
#define	ILL_RING_FREE		0	/* Available to be assigned to Ring */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2952
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2953
#define	ILL_MAX_RINGS		256	/* Max num of rx rings we can manage */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2954
#define	ILL_POLLING		0x01	/* Polling in use */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2955
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2956
/*
449
8625752bb102 6252036 dladm show-link outputs nothing for regular users
ericheng
parents: 269
diff changeset
  2957
 * This function pointer type is exported by the mac layer.
8625752bb102 6252036 dladm show-link outputs nothing for regular users
ericheng
parents: 269
diff changeset
  2958
 * we need to duplicate the definition here because we cannot
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2959
 * include mac.h in this file.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2960
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2961
typedef void	(*ip_mac_blank_t)(void *, time_t, uint_t);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2962
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2963
struct ill_rx_ring {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2964
	ip_mac_blank_t		rr_blank; /* Driver interrupt blanking func */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2965
	void			*rr_handle; /* Handle for Rx ring */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2966
	squeue_t		*rr_sqp; /* Squeue the ring is bound to */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2967
	ill_t			*rr_ill; /* back pointer to ill */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2968
	clock_t			rr_poll_time; /* Last lbolt polling was used */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2969
	uint32_t		rr_poll_state; /* polling state flags */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2970
	uint32_t		rr_max_blank_time; /* Max interrupt blank */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2971
	uint32_t		rr_min_blank_time; /* Min interrupt blank */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2972
	uint32_t		rr_max_pkt_cnt; /* Max pkts before interrupt */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2973
	uint32_t		rr_min_pkt_cnt; /* Mix pkts before interrupt */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2974
	uint32_t		rr_normal_blank_time; /* Normal intr freq */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2975
	uint32_t		rr_normal_pkt_cnt; /* Normal intr pkt cnt */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2976
	uint32_t		rr_ring_state; /* State of this ring */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2977
};
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2978
449
8625752bb102 6252036 dladm show-link outputs nothing for regular users
ericheng
parents: 269
diff changeset
  2979
/*
8625752bb102 6252036 dladm show-link outputs nothing for regular users
ericheng
parents: 269
diff changeset
  2980
 * This is exported by dld and is meant to be invoked from a ULP.
8625752bb102 6252036 dladm show-link outputs nothing for regular users
ericheng
parents: 269
diff changeset
  2981
 */
8625752bb102 6252036 dladm show-link outputs nothing for regular users
ericheng
parents: 269
diff changeset
  2982
typedef void	(*ip_dld_tx_t)(void *, mblk_t *);
8625752bb102 6252036 dladm show-link outputs nothing for regular users
ericheng
parents: 269
diff changeset
  2983
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2984
struct ill_poll_capab_s {
449
8625752bb102 6252036 dladm show-link outputs nothing for regular users
ericheng
parents: 269
diff changeset
  2985
	ip_dld_tx_t		ill_tx;		/* dld-supplied tx routine */
8625752bb102 6252036 dladm show-link outputs nothing for regular users
ericheng
parents: 269
diff changeset
  2986
	void			*ill_tx_handle;	/* dld-supplied tx handle */
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2987
	ill_rx_ring_t		*ill_ring_tbl; /* Ring to Sqp mapping table */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2988
	conn_t			*ill_unbind_conn; /* Conn used during unplumb */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2989
};
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2990
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2991
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2992
 * IP squeues exports
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2993
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2994
extern int 		ip_squeue_profile;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2995
extern int 		ip_squeue_bind;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2996
extern boolean_t 	ip_squeue_fanout;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2997
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2998
typedef struct squeue_set_s {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2999
	kmutex_t	sqs_lock;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3000
	struct squeue_s	**sqs_list;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3001
	int		sqs_size;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3002
	int		sqs_max_size;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3003
	processorid_t	sqs_bind;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3004
} squeue_set_t;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3005
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3006
#define	IP_SQUEUE_GET(hint) 						\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3007
	(!ip_squeue_fanout ?						\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3008
	(CPU->cpu_squeue_set->sqs_list[hint %				\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3009
					CPU->cpu_squeue_set->sqs_size]) : \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3010
	ip_squeue_random(hint))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3011
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3012
typedef void (*squeue_func_t)(squeue_t *, mblk_t *, sqproc_t, void *, uint8_t);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3013
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3014
extern void ip_squeue_init(void (*)(squeue_t *));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3015
extern squeue_t	*ip_squeue_random(uint_t);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3016
extern squeue_t *ip_squeue_get(ill_rx_ring_t *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3017
extern void ip_squeue_get_pkts(squeue_t *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3018
extern int ip_squeue_bind_set(queue_t *, mblk_t *, char *, caddr_t, cred_t *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3019
extern int ip_squeue_bind_get(queue_t *, mblk_t *, caddr_t, cred_t *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3020
extern void ip_squeue_clean(void *, mblk_t *, void *);
741
40027a3621ac PSARC 2005/082 Yosemite: UDP Performance Enhancement
masputra
parents: 679
diff changeset
  3021
extern void ip_resume_tcp_bind(void *, mblk_t *, void *);
40027a3621ac PSARC 2005/082 Yosemite: UDP Performance Enhancement
masputra
parents: 679
diff changeset
  3022
40027a3621ac PSARC 2005/082 Yosemite: UDP Performance Enhancement
masputra
parents: 679
diff changeset
  3023
extern void tcp_wput(queue_t *, mblk_t *);
40027a3621ac PSARC 2005/082 Yosemite: UDP Performance Enhancement
masputra
parents: 679
diff changeset
  3024
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3025
extern int	ip_fill_mtuinfo(struct in6_addr *, in_port_t,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3026
	struct ip6_mtuinfo *);
741
40027a3621ac PSARC 2005/082 Yosemite: UDP Performance Enhancement
masputra
parents: 679
diff changeset
  3027
extern	ipif_t *conn_get_held_ipif(conn_t *, ipif_t **, int *);
40027a3621ac PSARC 2005/082 Yosemite: UDP Performance Enhancement
masputra
parents: 679
diff changeset
  3028
40027a3621ac PSARC 2005/082 Yosemite: UDP Performance Enhancement
masputra
parents: 679
diff changeset
  3029
typedef void    (*ipsq_func_t)(ipsq_t *, queue_t *, mblk_t *, void *);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3030
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3031
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3032
 * Squeue tags. Tags only need to be unique when the callback function is the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3033
 * same to distinguish between different calls, but we use unique tags for
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3034
 * convenience anyway.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3035
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3036
#define	SQTAG_IP_INPUT			1
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3037
#define	SQTAG_TCP_INPUT_ICMP_ERR	2
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3038
#define	SQTAG_TCP6_INPUT_ICMP_ERR	3
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3039
#define	SQTAG_IP_TCP_INPUT		4
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3040
#define	SQTAG_IP6_TCP_INPUT		5
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3041
#define	SQTAG_IP_TCP_CLOSE		6
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3042
#define	SQTAG_TCP_OUTPUT		7
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3043
#define	SQTAG_TCP_TIMER			8
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3044
#define	SQTAG_TCP_TIMEWAIT		9
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3045
#define	SQTAG_TCP_ACCEPT_FINISH		10
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3046
#define	SQTAG_TCP_ACCEPT_FINISH_Q0	11
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3047
#define	SQTAG_TCP_ACCEPT_PENDING	12
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3048
#define	SQTAG_TCP_LISTEN_DISCON		13
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3049
#define	SQTAG_TCP_CONN_REQ		14
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3050
#define	SQTAG_TCP_EAGER_BLOWOFF		15
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3051
#define	SQTAG_TCP_EAGER_CLEANUP		16
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3052
#define	SQTAG_TCP_EAGER_CLEANUP_Q0	17
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3053
#define	SQTAG_TCP_CONN_IND		18
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3054
#define	SQTAG_TCP_RSRV			19
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3055
#define	SQTAG_TCP_ABORT_BUCKET		20
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3056
#define	SQTAG_TCP_REINPUT		21
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3057
#define	SQTAG_TCP_REINPUT_EAGER		22
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3058
#define	SQTAG_TCP_INPUT_MCTL		23
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3059
#define	SQTAG_TCP_RPUTOTHER		24
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3060
#define	SQTAG_IP_PROTO_AGAIN		25
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3061
#define	SQTAG_IP_FANOUT_TCP		26
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3062
#define	SQTAG_IPSQ_CLEAN_RING		27
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3063
#define	SQTAG_TCP_WPUT_OTHER		28
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3064
#define	SQTAG_TCP_CONN_REQ_UNBOUND	29
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3065
#define	SQTAG_TCP_SEND_PENDING		30
741
40027a3621ac PSARC 2005/082 Yosemite: UDP Performance Enhancement
masputra
parents: 679
diff changeset
  3066
#define	SQTAG_BIND_RETRY		31
40027a3621ac PSARC 2005/082 Yosemite: UDP Performance Enhancement
masputra
parents: 679
diff changeset
  3067
#define	SQTAG_UDP_FANOUT		32
40027a3621ac PSARC 2005/082 Yosemite: UDP Performance Enhancement
masputra
parents: 679
diff changeset
  3068
#define	SQTAG_UDP_INPUT			33
40027a3621ac PSARC 2005/082 Yosemite: UDP Performance Enhancement
masputra
parents: 679
diff changeset
  3069
#define	SQTAG_UDP_WPUT			34
40027a3621ac PSARC 2005/082 Yosemite: UDP Performance Enhancement
masputra
parents: 679
diff changeset
  3070
#define	SQTAG_UDP_OUTPUT		35
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3071
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3072
#endif	/* _KERNEL */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3073
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3074
#ifdef	__cplusplus
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3075
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3076
#endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3077
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3078
#endif	/* _INET_IP_H */