usr/src/uts/common/inet/ipclassifier.h
author danmcd
Fri, 03 Nov 2006 07:10:24 -0800
changeset 3055 e5701846929e
parent 2263 fd48046384d0
child 3104 fba3fdffbc25
permissions -rw-r--r--
PSARC 2005/516 IPsec Tunnel Reform 4882852 tunnels vs. inverse acquire. 4970365 Support of ESP tunnel mode within Solaris 5027528 in.iked should be more intelligent about tunnel addresses 6180161 need to support multiple tunnels to a single nat 6208976 ipsecconf error messages make me think there are monsters under the bed 6313012 Clean up from removal of ipsec_inbound_debug_tag() 6351840 assertion failed: (ipha->ipha_protocol != 6) && (ipha->ipha_protocol != 17), ip.c, line: 15351 6359831 multicast tunnels don't get their IPsec policy checked. 6369094 ipseckey shouldn't accept/save-out encryption algorithm even it's none/any 6374560 ipseckey debug functions should be moved to libipsecutil 6374596 dump utilities need to be able to understand inner tunnel addresses and netmasks 6402781 Five dead declarations in IPsec code 6405338 spdsock leaks policy head references 6437366 NAT-OA payloads not processed early enough. 6465594 ipsec_policy_delete() uses wrong ipsec_selkey_t structure. 6467596 spdsock_ext_to_actvec() needs to reset "act" upon every SPD_ATTR_NEXT. 6470725 PF_POLICY shouldn't accept '0' for an algorithm value. 6475903 Outbound DROP rules are not enforced 6480815 INVERSE_ACQUIRE failures leak in in.iked 6482403 Race in in.iked, early door call vs. rest of initialization code 6482653 Don't accept UDP-encapsulated ESP on non-NAT SAs. 6487857 Post-ACQUIRE, AH+ESP packets misinitalized ipha/ip6
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
1503
9c3595b79c0d 6376992 IP Classifier hash function for UDP is broken, causing poor UDP performance when using many ports
ericheng
parents: 1216
diff changeset
     5
 * Common Development and Distribution License (the "License").
9c3595b79c0d 6376992 IP Classifier hash function for UDP is broken, causing poor UDP performance when using many ports
ericheng
parents: 1216
diff changeset
     6
 * You may not use this file except in compliance with the License.
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     7
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     8
 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     9
 * or http://www.opensolaris.org/os/licensing.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    10
 * See the License for the specific language governing permissions
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    11
 * and limitations under the License.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    12
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    13
 * When distributing Covered Code, include this CDDL HEADER in each
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    14
 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    15
 * If applicable, add the following below this CDDL HEADER, with the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    16
 * fields enclosed by brackets "[]" replaced with your own identifying
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    17
 * information: Portions Copyright [yyyy] [name of copyright owner]
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    18
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    19
 * CDDL HEADER END
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    20
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    21
/*
1216
bbbeae705cee 6340735 write() may hang on loopback tcp connections
masputra
parents: 1095
diff changeset
    22
 * Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    23
 * Use is subject to license terms.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    24
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    25
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    26
#ifndef	_INET_IPCLASSIFIER_H
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    27
#define	_INET_IPCLASSIFIER_H
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    28
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    29
#pragma ident	"%Z%%M%	%I%	%E% SMI"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    30
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    31
#ifdef	__cplusplus
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    32
extern "C" {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    33
#endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    34
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    35
#include <inet/common.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    36
#include <inet/ip.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    37
#include <inet/mi.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    38
#include <inet/tcp.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    39
#include <inet/ip6.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    40
#include <netinet/in.h>		/* for IPPROTO_* constants */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    41
#include <sys/sdt.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    42
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    43
typedef void (*edesc_spf)(void *, mblk_t *, void *, int);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    44
typedef void (*edesc_rpf)(void *, mblk_t *, void *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    45
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    46
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    47
 * ==============================
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    48
 * =	The CONNECTION		=
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    49
 * ==============================
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    50
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    51
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    52
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    53
 * The connection structure contains the common information/flags/ref needed.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    54
 * Implementation will keep the connection struct, the layers (with their
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    55
 * respective data for event i.e. tcp_t if event was tcp_input) all in one
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    56
 * contiguous memory location.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    57
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    58
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    59
/* Conn Flags */
741
40027a3621ac PSARC 2005/082 Yosemite: UDP Performance Enhancement
masputra
parents: 409
diff changeset
    60
#define	IPCL_UDPMOD		0x00020000	/* Is UDP module instance */
40027a3621ac PSARC 2005/082 Yosemite: UDP Performance Enhancement
masputra
parents: 409
diff changeset
    61
#define	IPCL_TCPMOD		0x00040000	/* Is TCP module instance */
40027a3621ac PSARC 2005/082 Yosemite: UDP Performance Enhancement
masputra
parents: 409
diff changeset
    62
#define	IPCL_FULLY_BOUND	0x00080000	/* Bound to correct squeue */
40027a3621ac PSARC 2005/082 Yosemite: UDP Performance Enhancement
masputra
parents: 409
diff changeset
    63
#define	IPCL_CHECK_POLICY	0x00100000	/* Needs policy checking */
40027a3621ac PSARC 2005/082 Yosemite: UDP Performance Enhancement
masputra
parents: 409
diff changeset
    64
#define	IPCL_SOCKET		0x00200000	/* Sockfs connection */
40027a3621ac PSARC 2005/082 Yosemite: UDP Performance Enhancement
masputra
parents: 409
diff changeset
    65
#define	IPCL_ACCEPTOR		0x00400000	/* Sockfs priv acceptor */
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    66
#define	IPCL_CL_LISTENER	0x00800000	/* Cluster listener */
741
40027a3621ac PSARC 2005/082 Yosemite: UDP Performance Enhancement
masputra
parents: 409
diff changeset
    67
#define	IPCL_EAGER		0x01000000	/* Incoming connection */
40027a3621ac PSARC 2005/082 Yosemite: UDP Performance Enhancement
masputra
parents: 409
diff changeset
    68
#define	IPCL_UDP		0x02000000	/* A UDP connection */
40027a3621ac PSARC 2005/082 Yosemite: UDP Performance Enhancement
masputra
parents: 409
diff changeset
    69
#define	IPCL_TCP6		0x04000000	/* A TCP6 connection */
40027a3621ac PSARC 2005/082 Yosemite: UDP Performance Enhancement
masputra
parents: 409
diff changeset
    70
#define	IPCL_TCP4		0x08000000	/* A TCP connection */
40027a3621ac PSARC 2005/082 Yosemite: UDP Performance Enhancement
masputra
parents: 409
diff changeset
    71
#define	IPCL_CONNECTED		0x40000000	/* Conn in connected table */
40027a3621ac PSARC 2005/082 Yosemite: UDP Performance Enhancement
masputra
parents: 409
diff changeset
    72
#define	IPCL_BOUND		0x80000000	/* Conn in bind table */
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    73
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    74
/* Flags identifying the type of conn */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    75
#define	IPCL_TCPCONN		0x00000001	/* Flag to indicate cache */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    76
#define	IPCL_SCTPCONN		0x00000002
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    77
#define	IPCL_IPCCONN		0x00000004
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    78
#define	IPCL_ISV6		0x00000008	/* Is a V6 connection */
3055
e5701846929e PSARC 2005/516 IPsec Tunnel Reform
danmcd
parents: 2263
diff changeset
    79
#define	IPCL_IPTUN		0x00000010	/* Has "tun" plumbed above it */
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    80
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    81
/* Conn Masks */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    82
#define	IPCL_TCP		(IPCL_TCP4|IPCL_TCP6)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    83
#define	IPCL_REMOVED		0x00000020
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    84
#define	IPCL_REUSED		0x00000040
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    85
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    86
#define	IPCL_IS_TCP4(connp)						\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    87
	(((connp)->conn_flags & IPCL_TCP4))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    88
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    89
#define	IPCL_IS_TCP4_CONNECTED_NO_POLICY(connp)				\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    90
	(((connp)->conn_flags &						\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    91
		(IPCL_TCP4|IPCL_CONNECTED|IPCL_CHECK_POLICY|IPCL_TCP6))	\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    92
		== (IPCL_TCP4|IPCL_CONNECTED))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    93
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    94
#define	IPCL_IS_CONNECTED(connp)					\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    95
	((connp)->conn_flags & IPCL_CONNECTED)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    96
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    97
#define	IPCL_IS_BOUND(connp)						\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    98
	((connp)->conn_flags & IPCL_BOUND)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    99
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   100
#define	IPCL_IS_TCP4_BOUND(connp)					\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   101
	(((connp)->conn_flags &						\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   102
		(IPCL_TCP4|IPCL_BOUND|IPCL_TCP6)) ==			\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   103
		(IPCL_TCP4|IPCL_BOUND))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   104
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   105
#define	IPCL_IS_FULLY_BOUND(connp)					\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   106
	((connp)->conn_flags & IPCL_FULLY_BOUND)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   107
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   108
#define	IPCL_IS_TCP(connp)						\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   109
	((connp)->conn_flags & (IPCL_TCP4|IPCL_TCP6))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   110
741
40027a3621ac PSARC 2005/082 Yosemite: UDP Performance Enhancement
masputra
parents: 409
diff changeset
   111
/*
40027a3621ac PSARC 2005/082 Yosemite: UDP Performance Enhancement
masputra
parents: 409
diff changeset
   112
 * IPCL_UDP is set on the conn when udp is directly above ip;
40027a3621ac PSARC 2005/082 Yosemite: UDP Performance Enhancement
masputra
parents: 409
diff changeset
   113
 * this flag is cleared the moment udp is popped.
40027a3621ac PSARC 2005/082 Yosemite: UDP Performance Enhancement
masputra
parents: 409
diff changeset
   114
 */
40027a3621ac PSARC 2005/082 Yosemite: UDP Performance Enhancement
masputra
parents: 409
diff changeset
   115
#define	IPCL_IS_UDP(connp)						\
40027a3621ac PSARC 2005/082 Yosemite: UDP Performance Enhancement
masputra
parents: 409
diff changeset
   116
	((connp)->conn_flags & IPCL_UDP)
40027a3621ac PSARC 2005/082 Yosemite: UDP Performance Enhancement
masputra
parents: 409
diff changeset
   117
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   118
#define	IPCL_IS_IPTUN(connp)						\
3055
e5701846929e PSARC 2005/516 IPsec Tunnel Reform
danmcd
parents: 2263
diff changeset
   119
	(((connp)->conn_ulp == IPPROTO_ENCAP ||				\
e5701846929e PSARC 2005/516 IPsec Tunnel Reform
danmcd
parents: 2263
diff changeset
   120
	(connp)->conn_ulp == IPPROTO_IPV6) &&				\
e5701846929e PSARC 2005/516 IPsec Tunnel Reform
danmcd
parents: 2263
diff changeset
   121
	((connp)->conn_flags & IPCL_IPTUN))
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   122
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   123
typedef struct connf_s connf_t;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   124
typedef struct
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   125
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   126
	int	ctb_depth;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   127
#define	IP_STACK_DEPTH	15
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   128
	pc_t	ctb_stack[IP_STACK_DEPTH];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   129
} conn_trace_t;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   130
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   131
struct conn_s {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   132
	kmutex_t	conn_lock;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   133
	uint32_t	conn_ref;		/* Reference counter */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   134
	uint_t		conn_state_flags;	/* IP state flags */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   135
	ire_t		*conn_ire_cache; 	/* outbound ire cache */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   136
	uint32_t	conn_flags;		/* Conn Flags */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   137
	unsigned int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   138
		conn_on_sqp : 1,		/* Conn is being processed */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   139
		conn_dontroute : 1,		/* SO_DONTROUTE state */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   140
		conn_loopback : 1,		/* SO_LOOPBACK state */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   141
		conn_broadcast : 1,		/* SO_BROADCAST state */
1676
37f4a3e2bd99 PSARC/2002/762 Layered Trusted Solaris
jpk
parents: 1503
diff changeset
   142
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   143
		conn_reuseaddr : 1,		/* SO_REUSEADDR state */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   144
		conn_multicast_loop : 1,	/* IP_MULTICAST_LOOP */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   145
		conn_multi_router : 1,		/* Wants all multicast pkts */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   146
		conn_draining : 1,		/* ip_wsrv running */
1676
37f4a3e2bd99 PSARC/2002/762 Layered Trusted Solaris
jpk
parents: 1503
diff changeset
   147
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   148
		conn_did_putbq : 1,		/* ip_wput did a putbq */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   149
		conn_unspec_src : 1,		/* IP_UNSPEC_SRC */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   150
		conn_policy_cached : 1,		/* Is policy cached/latched ? */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   151
		conn_in_enforce_policy : 1,	/* Enforce Policy on inbound */
1676
37f4a3e2bd99 PSARC/2002/762 Layered Trusted Solaris
jpk
parents: 1503
diff changeset
   152
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   153
		conn_out_enforce_policy : 1,	/* Enforce Policy on outbound */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   154
		conn_af_isv6 : 1,		/* ip address family ver 6 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   155
		conn_pkt_isv6 : 1,		/* ip packet format ver 6 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   156
		conn_ipv6_recvpktinfo : 1,	/* IPV6_RECVPKTINFO option */
1676
37f4a3e2bd99 PSARC/2002/762 Layered Trusted Solaris
jpk
parents: 1503
diff changeset
   157
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   158
		conn_ipv6_recvhoplimit : 1,	/* IPV6_RECVHOPLIMIT option */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   159
		conn_ipv6_recvhopopts : 1,	/* IPV6_RECVHOPOPTS option */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   160
		conn_ipv6_recvdstopts : 1,	/* IPV6_RECVDSTOPTS option */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   161
		conn_ipv6_recvrthdr : 1,	/* IPV6_RECVRTHDR option */
1676
37f4a3e2bd99 PSARC/2002/762 Layered Trusted Solaris
jpk
parents: 1503
diff changeset
   162
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   163
		conn_ipv6_recvrtdstopts : 1,	/* IPV6_RECVRTHDRDSTOPTS */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   164
		conn_ipv6_v6only : 1,		/* IPV6_V6ONLY */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   165
		conn_ipv6_recvtclass : 1,	/* IPV6_RECVTCLASS */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   166
		conn_ipv6_recvpathmtu : 1,	/* IPV6_RECVPATHMTU */
1676
37f4a3e2bd99 PSARC/2002/762 Layered Trusted Solaris
jpk
parents: 1503
diff changeset
   167
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   168
		conn_pathmtu_valid : 1,		/* The cached mtu is valid. */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   169
		conn_ipv6_dontfrag : 1,		/* IPV6_DONTFRAG */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   170
		conn_fully_bound : 1,		/* Fully bound connection */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   171
		conn_recvif : 1,		/* IP_RECVIF option */
1676
37f4a3e2bd99 PSARC/2002/762 Layered Trusted Solaris
jpk
parents: 1503
diff changeset
   172
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   173
		conn_recvslla : 1,		/* IP_RECVSLLA option */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   174
		conn_mdt_ok : 1,		/* MDT is permitted */
1095
2c2c46925493 PSARC 2005/603 IP_NEXTHOP socket option
priyanka
parents: 741
diff changeset
   175
		conn_nexthop_set : 1,
2263
fd48046384d0 PSARC 2006/073 PF_ROUTE: Include interface name with RTM_NEWADDR/RTM_DELADDR
sommerfe
parents: 1676
diff changeset
   176
		conn_allzones : 1;		/* SO_ALLZONES */
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   177
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   178
	tcp_t		*conn_tcp;		/* Pointer to the tcp struct */
1216
bbbeae705cee 6340735 write() may hang on loopback tcp connections
masputra
parents: 1095
diff changeset
   179
	struct udp_s	*conn_udp;		/* Pointer to the udp struct */
741
40027a3621ac PSARC 2005/082 Yosemite: UDP Performance Enhancement
masputra
parents: 409
diff changeset
   180
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   181
	squeue_t	*conn_sqp;		/* Squeue for processing */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   182
	edesc_rpf	conn_recv;		/* Pointer to recv routine */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   183
	void		*conn_pad1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   184
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   185
	ill_t		*conn_xmit_if_ill;	/* Outbound ill */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   186
	ill_t		*conn_nofailover_ill;	/* Failover ill */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   187
	ipsec_latch_t	*conn_latch;		/* latched state */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   188
	ill_t		*conn_outgoing_ill;	/* IP{,V6}_BOUND_IF */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   189
	edesc_spf	conn_send;		/* Pointer to send routine */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   190
	queue_t		*conn_rq;		/* Read queue */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   191
	queue_t		*conn_wq;		/* Write queue */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   192
	dev_t		conn_dev;		/* Minor number */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   193
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   194
	cred_t		*conn_cred;		/* Credentials */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   195
	connf_t		*conn_g_fanout;		/* Global Hash bucket head */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   196
	struct conn_s	*conn_g_next;		/* Global Hash chain next */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   197
	struct conn_s	*conn_g_prev;		/* Global Hash chain prev */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   198
	struct ipsec_policy_head_s *conn_policy; /* Configured policy */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   199
	in6_addr_t	conn_bound_source_v6;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   200
#define	conn_bound_source	V4_PART_OF_V6(conn_bound_source_v6)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   201
	void		*conn_void[1];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   202
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   203
	connf_t		*conn_fanout;		/* Hash bucket we're part of */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   204
	struct conn_s	*conn_next;		/* Hash chain next */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   205
	struct conn_s	*conn_prev;		/* Hash chain prev */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   206
	struct {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   207
		in6_addr_t connua_laddr;	/* Local address */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   208
		in6_addr_t connua_faddr;	/* Remote address */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   209
	} connua_v6addr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   210
#define	conn_src	V4_PART_OF_V6(connua_v6addr.connua_laddr)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   211
#define	conn_rem	V4_PART_OF_V6(connua_v6addr.connua_faddr)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   212
#define	conn_srcv6	connua_v6addr.connua_laddr
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   213
#define	conn_remv6	connua_v6addr.connua_faddr
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   214
	union {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   215
		/* Used for classifier match performance */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   216
		uint32_t		conn_ports2;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   217
		struct {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   218
			in_port_t	tcpu_fport;	/* Remote port */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   219
			in_port_t	tcpu_lport;	/* Local port */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   220
		} tcpu_ports;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   221
	} u_port;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   222
#define	conn_fport	u_port.tcpu_ports.tcpu_fport
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   223
#define	conn_lport	u_port.tcpu_ports.tcpu_lport
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   224
#define	conn_ports	u_port.conn_ports2
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   225
#define	conn_upq	conn_rq
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   226
	uint8_t		conn_ulp;		/* protocol type */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   227
	uint8_t		conn_unused_byte;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   228
	kcondvar_t	conn_cv;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   229
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   230
	uint_t		conn_proto;		/* SO_PROTOTYPE state */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   231
	ill_t		*conn_incoming_ill;	/* IP{,V6}_BOUND_IF */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   232
	ill_t		*conn_outgoing_pill;	/* IP{,V6}_BOUND_PIF */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   233
	ill_t		*conn_oper_pending_ill; /* pending shared ioctl */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   234
	ill_t		*conn_xioctl_pending_ill; /* pending excl ioctl */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   235
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   236
	/* this is used only when an unbind is in progress.. */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   237
	struct sq_s	*conn_pending_sq; /* waiting for ioctl on sq */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   238
	ilg_t	*conn_ilg;		/* Group memberships */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   239
	int	conn_ilg_allocated;	/* Number allocated */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   240
	int	conn_ilg_inuse;		/* Number currently used */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   241
	int	conn_ilg_walker_cnt;	/* No of ilg walkers */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   242
	/* XXXX get rid of this, once ilg_delete_all is fixed */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   243
	kcondvar_t	conn_refcv;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   244
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   245
	struct ipif_s	*conn_multicast_ipif;	/* IP_MULTICAST_IF */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   246
	ill_t		*conn_multicast_ill;	/* IPV6_MULTICAST_IF */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   247
	int		conn_orig_bound_ifindex; /* BOUND_IF before MOVE */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   248
	int		conn_orig_multicast_ifindex;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   249
						/* IPv6 MC IF before MOVE */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   250
	int		conn_orig_xmit_ifindex; /* IP_XMIT_IF before move */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   251
	struct conn_s 	*conn_drain_next;	/* Next conn in drain list */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   252
	struct conn_s	*conn_drain_prev;	/* Prev conn in drain list */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   253
	idl_t		*conn_idl;		/* Ptr to the drain list head */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   254
	mblk_t		*conn_ipsec_opt_mp;	/* ipsec option mblk */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   255
	uint32_t	conn_src_preferences;	/* prefs for src addr select */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   256
	/* mtuinfo from IPV6_PACKET_TOO_BIG conditional on conn_pathmtu_valid */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   257
	struct ip6_mtuinfo mtuinfo;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   258
	zoneid_t	conn_zoneid;		/* zone connection is in */
1095
2c2c46925493 PSARC 2005/603 IP_NEXTHOP socket option
priyanka
parents: 741
diff changeset
   259
	in6_addr_t	conn_nexthop_v6;	/* nexthop IP address */
2c2c46925493 PSARC 2005/603 IP_NEXTHOP socket option
priyanka
parents: 741
diff changeset
   260
#define	conn_nexthop_v4	V4_PART_OF_V6(conn_nexthop_v6)
1676
37f4a3e2bd99 PSARC/2002/762 Layered Trusted Solaris
jpk
parents: 1503
diff changeset
   261
	cred_t		*conn_peercred;		/* Peer credentials, if any */
37f4a3e2bd99 PSARC/2002/762 Layered Trusted Solaris
jpk
parents: 1503
diff changeset
   262
37f4a3e2bd99 PSARC/2002/762 Layered Trusted Solaris
jpk
parents: 1503
diff changeset
   263
	unsigned int
37f4a3e2bd99 PSARC/2002/762 Layered Trusted Solaris
jpk
parents: 1503
diff changeset
   264
		conn_ulp_labeled : 1,		/* ULP label is synced */
37f4a3e2bd99 PSARC/2002/762 Layered Trusted Solaris
jpk
parents: 1503
diff changeset
   265
		conn_mlp_type : 2,		/* mlp_type_t; tsol/tndb.h */
37f4a3e2bd99 PSARC/2002/762 Layered Trusted Solaris
jpk
parents: 1503
diff changeset
   266
		conn_anon_mlp : 1,		/* user wants anon MLP */
37f4a3e2bd99 PSARC/2002/762 Layered Trusted Solaris
jpk
parents: 1503
diff changeset
   267
37f4a3e2bd99 PSARC/2002/762 Layered Trusted Solaris
jpk
parents: 1503
diff changeset
   268
		conn_anon_port : 1,		/* user bound anonymously */
37f4a3e2bd99 PSARC/2002/762 Layered Trusted Solaris
jpk
parents: 1503
diff changeset
   269
		conn_mac_exempt : 1,		/* unlabeled with loose MAC */
37f4a3e2bd99 PSARC/2002/762 Layered Trusted Solaris
jpk
parents: 1503
diff changeset
   270
		conn_spare : 26;
37f4a3e2bd99 PSARC/2002/762 Layered Trusted Solaris
jpk
parents: 1503
diff changeset
   271
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   272
#ifdef CONN_DEBUG
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   273
#define	CONN_TRACE_MAX	10
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   274
	int		conn_trace_last;	/* ndx of last used tracebuf */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   275
	conn_trace_t	conn_trace_buf[CONN_TRACE_MAX];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   276
#endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   277
};
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   278
1676
37f4a3e2bd99 PSARC/2002/762 Layered Trusted Solaris
jpk
parents: 1503
diff changeset
   279
#define	CONN_CRED(connp) ((connp)->conn_peercred == NULL ? \
37f4a3e2bd99 PSARC/2002/762 Layered Trusted Solaris
jpk
parents: 1503
diff changeset
   280
	(connp)->conn_cred : (connp)->conn_peercred)
37f4a3e2bd99 PSARC/2002/762 Layered Trusted Solaris
jpk
parents: 1503
diff changeset
   281
#define	BEST_CRED(mp, connp) ((DB_CRED(mp) != NULL &&	\
37f4a3e2bd99 PSARC/2002/762 Layered Trusted Solaris
jpk
parents: 1503
diff changeset
   282
	crgetlabel(DB_CRED(mp)) != NULL) ? DB_CRED(mp) : CONN_CRED(connp))
37f4a3e2bd99 PSARC/2002/762 Layered Trusted Solaris
jpk
parents: 1503
diff changeset
   283
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   284
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   285
 * connf_t - connection fanout data.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   286
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   287
 * The hash tables and their linkage (conn_t.{hashnextp, hashprevp} are
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   288
 * protected by the per-bucket lock. Each conn_t inserted in the list
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   289
 * points back at the connf_t that heads the bucket.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   290
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   291
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   292
struct connf_s {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   293
	struct conn_s	*connf_head;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   294
	kmutex_t	connf_lock;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   295
};
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   296
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   297
#define	CONN_INC_REF(connp)	{				\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   298
	DTRACE_PROBE1(conn__inc__ref, conn_t *, connp);		\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   299
	mutex_enter(&(connp)->conn_lock);			\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   300
	ASSERT(conn_trace_ref(connp));				\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   301
	(connp)->conn_ref++;					\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   302
	ASSERT((connp)->conn_ref != 0);				\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   303
	mutex_exit(&(connp)->conn_lock);			\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   304
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   305
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   306
#define	CONN_INC_REF_LOCKED(connp)	{			\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   307
	DTRACE_PROBE1(conn__inc__ref, conn_t *, connp);		\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   308
	ASSERT(MUTEX_HELD(&(connp)->conn_lock));	 	\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   309
	ASSERT(conn_trace_ref(connp));				\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   310
	(connp)->conn_ref++;					\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   311
	ASSERT((connp)->conn_ref != 0);				\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   312
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   313
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   314
#define	CONN_DEC_REF(connp)	{					\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   315
	DTRACE_PROBE1(conn__dec__ref, conn_t *, connp);			\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   316
	mutex_enter(&(connp)->conn_lock);				\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   317
	if ((connp)->conn_ref <= 0)					\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   318
		cmn_err(CE_PANIC, "CONN_DEC_REF: connp(%p) has ref "	\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   319
			"= %d\n", (void *)(connp), (connp)->conn_ref);	\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   320
	ASSERT(conn_untrace_ref(connp));				\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   321
	(connp)->conn_ref--;						\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   322
	if ((connp)->conn_ref == 0) {					\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   323
		/* Refcnt can't increase again, safe to drop lock */	\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   324
		mutex_exit(&(connp)->conn_lock);			\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   325
		ipcl_conn_destroy(connp);				\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   326
	} else {							\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   327
		cv_broadcast(&(connp)->conn_cv);			\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   328
		mutex_exit(&(connp)->conn_lock);			\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   329
	}								\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   330
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   331
2263
fd48046384d0 PSARC 2006/073 PF_ROUTE: Include interface name with RTM_NEWADDR/RTM_DELADDR
sommerfe
parents: 1676
diff changeset
   332
/*
fd48046384d0 PSARC 2006/073 PF_ROUTE: Include interface name with RTM_NEWADDR/RTM_DELADDR
sommerfe
parents: 1676
diff changeset
   333
 * For use with subsystems within ip which use ALL_ZONES as a wildcard
fd48046384d0 PSARC 2006/073 PF_ROUTE: Include interface name with RTM_NEWADDR/RTM_DELADDR
sommerfe
parents: 1676
diff changeset
   334
 */
fd48046384d0 PSARC 2006/073 PF_ROUTE: Include interface name with RTM_NEWADDR/RTM_DELADDR
sommerfe
parents: 1676
diff changeset
   335
#define	IPCL_ZONEID(connp)						\
fd48046384d0 PSARC 2006/073 PF_ROUTE: Include interface name with RTM_NEWADDR/RTM_DELADDR
sommerfe
parents: 1676
diff changeset
   336
	((connp)->conn_allzones ? ALL_ZONES : (connp)->conn_zoneid)
fd48046384d0 PSARC 2006/073 PF_ROUTE: Include interface name with RTM_NEWADDR/RTM_DELADDR
sommerfe
parents: 1676
diff changeset
   337
fd48046384d0 PSARC 2006/073 PF_ROUTE: Include interface name with RTM_NEWADDR/RTM_DELADDR
sommerfe
parents: 1676
diff changeset
   338
/*
fd48046384d0 PSARC 2006/073 PF_ROUTE: Include interface name with RTM_NEWADDR/RTM_DELADDR
sommerfe
parents: 1676
diff changeset
   339
 * For matching between a conn_t and a zoneid.
fd48046384d0 PSARC 2006/073 PF_ROUTE: Include interface name with RTM_NEWADDR/RTM_DELADDR
sommerfe
parents: 1676
diff changeset
   340
 */
fd48046384d0 PSARC 2006/073 PF_ROUTE: Include interface name with RTM_NEWADDR/RTM_DELADDR
sommerfe
parents: 1676
diff changeset
   341
#define	IPCL_ZONE_MATCH(connp, zoneid) 					\
fd48046384d0 PSARC 2006/073 PF_ROUTE: Include interface name with RTM_NEWADDR/RTM_DELADDR
sommerfe
parents: 1676
diff changeset
   342
	(((connp)->conn_allzones) ||					\
fd48046384d0 PSARC 2006/073 PF_ROUTE: Include interface name with RTM_NEWADDR/RTM_DELADDR
sommerfe
parents: 1676
diff changeset
   343
	    ((zoneid) == ALL_ZONES) ||					\
fd48046384d0 PSARC 2006/073 PF_ROUTE: Include interface name with RTM_NEWADDR/RTM_DELADDR
sommerfe
parents: 1676
diff changeset
   344
	    (connp)->conn_zoneid == (zoneid))
fd48046384d0 PSARC 2006/073 PF_ROUTE: Include interface name with RTM_NEWADDR/RTM_DELADDR
sommerfe
parents: 1676
diff changeset
   345
fd48046384d0 PSARC 2006/073 PF_ROUTE: Include interface name with RTM_NEWADDR/RTM_DELADDR
sommerfe
parents: 1676
diff changeset
   346
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   347
#define	_IPCL_V4_MATCH(v6addr, v4addr)	\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   348
	(V4_PART_OF_V6((v6addr)) == (v4addr) && IN6_IS_ADDR_V4MAPPED(&(v6addr)))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   349
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   350
#define	_IPCL_V4_MATCH_ANY(addr)	\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   351
	(IN6_IS_ADDR_V4MAPPED_ANY(&(addr)) || IN6_IS_ADDR_UNSPECIFIED(&(addr)))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   352
2263
fd48046384d0 PSARC 2006/073 PF_ROUTE: Include interface name with RTM_NEWADDR/RTM_DELADDR
sommerfe
parents: 1676
diff changeset
   353
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   354
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   355
 * IPCL_PROTO_MATCH() only matches conns with the specified zoneid, while
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   356
 * IPCL_PROTO_MATCH_V6() can match other conns in the multicast case, see
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   357
 * ip_fanout_proto().
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   358
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   359
#define	IPCL_PROTO_MATCH(connp, protocol, ipha, ill,			\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   360
    fanout_flags, zoneid)						\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   361
	((((connp)->conn_src == INADDR_ANY) ||				\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   362
	(((connp)->conn_src == ((ipha)->ipha_dst)) &&			\
2263
fd48046384d0 PSARC 2006/073 PF_ROUTE: Include interface name with RTM_NEWADDR/RTM_DELADDR
sommerfe
parents: 1676
diff changeset
   363
	    (((connp)->conn_rem == INADDR_ANY) ||			\
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   364
	((connp)->conn_rem == ((ipha)->ipha_src))))) &&			\
2263
fd48046384d0 PSARC 2006/073 PF_ROUTE: Include interface name with RTM_NEWADDR/RTM_DELADDR
sommerfe
parents: 1676
diff changeset
   365
	IPCL_ZONE_MATCH(connp, zoneid) &&				\
fd48046384d0 PSARC 2006/073 PF_ROUTE: Include interface name with RTM_NEWADDR/RTM_DELADDR
sommerfe
parents: 1676
diff changeset
   366
	(conn_wantpacket((connp), (ill), (ipha), (fanout_flags), 	\
fd48046384d0 PSARC 2006/073 PF_ROUTE: Include interface name with RTM_NEWADDR/RTM_DELADDR
sommerfe
parents: 1676
diff changeset
   367
	    (zoneid)) || ((protocol) == IPPROTO_PIM) ||			\
fd48046384d0 PSARC 2006/073 PF_ROUTE: Include interface name with RTM_NEWADDR/RTM_DELADDR
sommerfe
parents: 1676
diff changeset
   368
	    ((protocol) == IPPROTO_RSVP)))
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   369
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   370
#define	IPCL_PROTO_MATCH_V6(connp, protocol, ip6h, ill,			   \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   371
    fanout_flags, zoneid)						   \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   372
	((IN6_IS_ADDR_UNSPECIFIED(&(connp)->conn_srcv6) ||		   \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   373
	(IN6_ARE_ADDR_EQUAL(&(connp)->conn_srcv6, &((ip6h)->ip6_dst)) &&   \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   374
	(IN6_IS_ADDR_UNSPECIFIED(&(connp)->conn_remv6) ||		   \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   375
	IN6_ARE_ADDR_EQUAL(&(connp)->conn_remv6, &((ip6h)->ip6_src))))) && \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   376
	(conn_wantpacket_v6((connp), (ill), (ip6h),			   \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   377
	(fanout_flags), (zoneid)) || ((protocol) == IPPROTO_RSVP)))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   378
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   379
#define	IPCL_CONN_HASH(src, ports)					\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   380
	((unsigned)(ntohl((src)) ^ ((ports) >> 24) ^ ((ports) >> 16) ^	\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   381
	((ports) >> 8) ^ (ports)) % ipcl_conn_fanout_size)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   382
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   383
#define	IPCL_CONN_HASH_V6(src, ports)			\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   384
	IPCL_CONN_HASH(V4_PART_OF_V6((src)), (ports))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   385
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   386
#define	IPCL_CONN_MATCH(connp, proto, src, dst, ports)			\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   387
	((connp)->conn_ulp == (proto) &&				\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   388
		(connp)->conn_ports == (ports) &&      			\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   389
		_IPCL_V4_MATCH((connp)->conn_remv6, (src)) &&		\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   390
		_IPCL_V4_MATCH((connp)->conn_srcv6, (dst)) &&		\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   391
		!(connp)->conn_ipv6_v6only)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   392
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   393
#define	IPCL_CONN_MATCH_V6(connp, proto, src, dst, ports)		\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   394
	((connp)->conn_ulp == (proto) &&				\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   395
		(connp)->conn_ports == (ports) &&      			\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   396
		IN6_ARE_ADDR_EQUAL(&(connp)->conn_remv6, &(src)) &&	\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   397
		IN6_ARE_ADDR_EQUAL(&(connp)->conn_srcv6, &(dst)))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   398
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   399
#define	IPCL_CONN_INIT(connp, protocol, src, rem, ports) {		\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   400
	(connp)->conn_ulp = protocol;					\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   401
	IN6_IPADDR_TO_V4MAPPED(src, &(connp)->conn_srcv6);		\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   402
	IN6_IPADDR_TO_V4MAPPED(rem, &(connp)->conn_remv6);		\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   403
	(connp)->conn_ports = ports;					\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   404
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   405
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   406
#define	IPCL_CONN_INIT_V6(connp, protocol, src, rem, ports) {		\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   407
	(connp)->conn_ulp = protocol;					\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   408
	(connp)->conn_srcv6 = src;					\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   409
	(connp)->conn_remv6 = rem;					\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   410
	(connp)->conn_ports = ports;					\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   411
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   412
1503
9c3595b79c0d 6376992 IP Classifier hash function for UDP is broken, causing poor UDP performance when using many ports
ericheng
parents: 1216
diff changeset
   413
#define	IPCL_PORT_HASH(port, size) \
9c3595b79c0d 6376992 IP Classifier hash function for UDP is broken, causing poor UDP performance when using many ports
ericheng
parents: 1216
diff changeset
   414
	((((port) >> 8) ^ (port)) & ((size) - 1))
9c3595b79c0d 6376992 IP Classifier hash function for UDP is broken, causing poor UDP performance when using many ports
ericheng
parents: 1216
diff changeset
   415
9c3595b79c0d 6376992 IP Classifier hash function for UDP is broken, causing poor UDP performance when using many ports
ericheng
parents: 1216
diff changeset
   416
#define	IPCL_BIND_HASH(lport)	IPCL_PORT_HASH(lport, ipcl_bind_fanout_size)
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   417
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   418
#define	IPCL_BIND_MATCH(connp, proto, laddr, lport)			\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   419
	((connp)->conn_ulp == (proto) &&				\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   420
		(connp)->conn_lport == (lport) &&			\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   421
		(_IPCL_V4_MATCH_ANY((connp)->conn_srcv6) ||		\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   422
		_IPCL_V4_MATCH((connp)->conn_srcv6, (laddr))) &&	\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   423
		!(connp)->conn_ipv6_v6only)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   424
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   425
#define	IPCL_BIND_MATCH_V6(connp, proto, laddr, lport)			\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   426
	((connp)->conn_ulp == (proto) &&				\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   427
		(connp)->conn_lport == (lport) &&			\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   428
		(IN6_ARE_ADDR_EQUAL(&(connp)->conn_srcv6, &(laddr)) ||	\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   429
		IN6_IS_ADDR_UNSPECIFIED(&(connp)->conn_srcv6)))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   430
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   431
#define	IPCL_UDP_MATCH(connp, lport, laddr, fport, faddr)		\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   432
	(((connp)->conn_lport == (lport)) &&				\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   433
	((_IPCL_V4_MATCH_ANY((connp)->conn_srcv6) ||			\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   434
	(_IPCL_V4_MATCH((connp)->conn_srcv6, (laddr)) &&		\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   435
	(_IPCL_V4_MATCH_ANY((connp)->conn_remv6) ||			\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   436
	(_IPCL_V4_MATCH((connp)->conn_remv6, (faddr)) &&		\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   437
	(connp)->conn_fport == (fport)))))) &&				\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   438
	!(connp)->conn_ipv6_v6only)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   439
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   440
#define	IPCL_UDP_MATCH_V6(connp, lport, laddr, fport, faddr)	\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   441
	(((connp)->conn_lport == (lport)) &&			\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   442
	(IN6_IS_ADDR_UNSPECIFIED(&(connp)->conn_srcv6) ||	\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   443
	(IN6_ARE_ADDR_EQUAL(&(connp)->conn_srcv6, &(laddr)) &&	\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   444
	(IN6_IS_ADDR_UNSPECIFIED(&(connp)->conn_remv6) ||	\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   445
	(IN6_ARE_ADDR_EQUAL(&(connp)->conn_remv6, &(faddr)) &&	\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   446
	(connp)->conn_fport == (fport))))))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   447
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   448
#define	IPCL_TCP_EAGER_INIT(connp, protocol, src, rem, ports) {		\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   449
	(connp)->conn_flags |= (IPCL_TCP4|IPCL_EAGER);			\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   450
	(connp)->conn_ulp = protocol;					\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   451
	IN6_IPADDR_TO_V4MAPPED(src, &(connp)->conn_srcv6);		\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   452
	IN6_IPADDR_TO_V4MAPPED(rem, &(connp)->conn_remv6);		\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   453
	(connp)->conn_ports = ports;					\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   454
	(connp)->conn_send = ip_output;					\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   455
	(connp)->conn_sqp = IP_SQUEUE_GET(lbolt);			\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   456
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   457
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   458
#define	IPCL_TCP_EAGER_INIT_V6(connp, protocol, src, rem, ports) {	\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   459
	(connp)->conn_flags |= (IPCL_TCP6|IPCL_EAGER);			\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   460
	(connp)->conn_ulp = protocol;					\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   461
	(connp)->conn_srcv6 = src;					\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   462
	(connp)->conn_remv6 = rem;					\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   463
	(connp)->conn_ports = ports;					\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   464
	(connp)->conn_send = ip_output_v6;				\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   465
	(connp)->conn_sqp = IP_SQUEUE_GET(lbolt);			\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   466
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   467
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   468
#define	ipcl_proto_search(protocol)					\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   469
	(ipcl_proto_fanout[(protocol)].connf_head)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   470
1503
9c3595b79c0d 6376992 IP Classifier hash function for UDP is broken, causing poor UDP performance when using many ports
ericheng
parents: 1216
diff changeset
   471
#define	IPCL_UDP_HASH(lport)	IPCL_PORT_HASH(lport, ipcl_udp_fanout_size)
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   472
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   473
#define	CONN_G_HASH_SIZE	1024
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   474
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   475
/* Raw socket hash function. */
1503
9c3595b79c0d 6376992 IP Classifier hash function for UDP is broken, causing poor UDP performance when using many ports
ericheng
parents: 1216
diff changeset
   476
#define	IPCL_RAW_HASH(lport)	IPCL_PORT_HASH(lport, ipcl_raw_fanout_size)
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   477
409
22012dc8ea5b 6294727 SCTP raw socket bind() failed for ports which are mutliples of 256
kcpoon
parents: 0
diff changeset
   478
/*
22012dc8ea5b 6294727 SCTP raw socket bind() failed for ports which are mutliples of 256
kcpoon
parents: 0
diff changeset
   479
 * This is similar to IPCL_BIND_MATCH except that the local port check
22012dc8ea5b 6294727 SCTP raw socket bind() failed for ports which are mutliples of 256
kcpoon
parents: 0
diff changeset
   480
 * is changed to a wildcard port check.
22012dc8ea5b 6294727 SCTP raw socket bind() failed for ports which are mutliples of 256
kcpoon
parents: 0
diff changeset
   481
 */
22012dc8ea5b 6294727 SCTP raw socket bind() failed for ports which are mutliples of 256
kcpoon
parents: 0
diff changeset
   482
#define	IPCL_RAW_MATCH(connp, proto, laddr)			\
22012dc8ea5b 6294727 SCTP raw socket bind() failed for ports which are mutliples of 256
kcpoon
parents: 0
diff changeset
   483
	((connp)->conn_ulp == (proto) &&			\
22012dc8ea5b 6294727 SCTP raw socket bind() failed for ports which are mutliples of 256
kcpoon
parents: 0
diff changeset
   484
	(connp)->conn_lport == 0 &&				\
22012dc8ea5b 6294727 SCTP raw socket bind() failed for ports which are mutliples of 256
kcpoon
parents: 0
diff changeset
   485
	(_IPCL_V4_MATCH_ANY((connp)->conn_srcv6) ||		\
22012dc8ea5b 6294727 SCTP raw socket bind() failed for ports which are mutliples of 256
kcpoon
parents: 0
diff changeset
   486
	_IPCL_V4_MATCH((connp)->conn_srcv6, (laddr))))
22012dc8ea5b 6294727 SCTP raw socket bind() failed for ports which are mutliples of 256
kcpoon
parents: 0
diff changeset
   487
22012dc8ea5b 6294727 SCTP raw socket bind() failed for ports which are mutliples of 256
kcpoon
parents: 0
diff changeset
   488
#define	IPCL_RAW_MATCH_V6(connp, proto, laddr)			\
22012dc8ea5b 6294727 SCTP raw socket bind() failed for ports which are mutliples of 256
kcpoon
parents: 0
diff changeset
   489
	((connp)->conn_ulp == (proto) &&			\
22012dc8ea5b 6294727 SCTP raw socket bind() failed for ports which are mutliples of 256
kcpoon
parents: 0
diff changeset
   490
	(connp)->conn_lport == 0 &&				\
22012dc8ea5b 6294727 SCTP raw socket bind() failed for ports which are mutliples of 256
kcpoon
parents: 0
diff changeset
   491
	(IN6_IS_ADDR_UNSPECIFIED(&(connp)->conn_srcv6) ||	\
22012dc8ea5b 6294727 SCTP raw socket bind() failed for ports which are mutliples of 256
kcpoon
parents: 0
diff changeset
   492
	IN6_ARE_ADDR_EQUAL(&(connp)->conn_srcv6, &(laddr))))
22012dc8ea5b 6294727 SCTP raw socket bind() failed for ports which are mutliples of 256
kcpoon
parents: 0
diff changeset
   493
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   494
/* hash tables */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   495
extern connf_t	rts_clients;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   496
extern connf_t	*ipcl_conn_fanout;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   497
extern connf_t	*ipcl_bind_fanout;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   498
extern connf_t	ipcl_proto_fanout[IPPROTO_MAX + 1];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   499
extern connf_t	ipcl_proto_fanout_v6[IPPROTO_MAX + 1];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   500
extern connf_t	*ipcl_udp_fanout;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   501
extern connf_t	*ipcl_globalhash_fanout;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   502
extern connf_t	*ipcl_raw_fanout;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   503
extern uint_t	ipcl_conn_fanout_size;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   504
extern uint_t	ipcl_bind_fanout_size;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   505
extern uint_t	ipcl_udp_fanout_size;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   506
extern uint_t	ipcl_raw_fanout_size;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   507
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   508
/* Function prototypes */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   509
extern void ipcl_init(void);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   510
extern void ipcl_destroy(void);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   511
extern conn_t *ipcl_conn_create(uint32_t, int);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   512
extern void ipcl_conn_destroy(conn_t *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   513
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   514
void ipcl_hash_insert_connected(connf_t *, conn_t *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   515
void ipcl_hash_insert_bound(connf_t *, conn_t *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   516
void ipcl_hash_insert_wildcard(connf_t *, conn_t *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   517
void ipcl_hash_remove(conn_t *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   518
void ipcl_hash_remove_locked(conn_t *connp, connf_t *connfp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   519
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   520
extern int	ipcl_bind_insert(conn_t *, uint8_t, ipaddr_t, uint16_t);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   521
extern int	ipcl_bind_insert_v6(conn_t *, uint8_t, const in6_addr_t *,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   522
		    uint16_t);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   523
extern int	ipcl_conn_insert(conn_t *, uint8_t, ipaddr_t, ipaddr_t,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   524
		    uint32_t);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   525
extern int	ipcl_conn_insert_v6(conn_t *, uint8_t, const in6_addr_t *,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   526
		    const in6_addr_t *, uint32_t, uint_t);
741
40027a3621ac PSARC 2005/082 Yosemite: UDP Performance Enhancement
masputra
parents: 409
diff changeset
   527
extern conn_t	*ipcl_get_next_conn(connf_t *, conn_t *, uint32_t);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   528
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   529
void ipcl_proto_insert(conn_t *, uint8_t);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   530
void ipcl_proto_insert_v6(conn_t *, uint8_t);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   531
conn_t *ipcl_classify_v4(mblk_t *, uint8_t, uint_t, zoneid_t);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   532
conn_t *ipcl_classify_v6(mblk_t *, uint8_t, uint_t, zoneid_t);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   533
conn_t *ipcl_classify(mblk_t *, zoneid_t);
1676
37f4a3e2bd99 PSARC/2002/762 Layered Trusted Solaris
jpk
parents: 1503
diff changeset
   534
conn_t *ipcl_classify_raw(mblk_t *, uint8_t, zoneid_t, uint32_t, ipha_t *);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   535
void	ipcl_globalhash_insert(conn_t *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   536
void	ipcl_globalhash_remove(conn_t *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   537
void	ipcl_walk(pfv_t, void *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   538
conn_t	*ipcl_tcp_lookup_reversed_ipv4(ipha_t *, tcph_t *, int);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   539
conn_t	*ipcl_tcp_lookup_reversed_ipv6(ip6_t *, tcpha_t *, int, uint_t);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   540
conn_t	*ipcl_lookup_listener_v4(uint16_t, ipaddr_t, zoneid_t);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   541
conn_t	*ipcl_lookup_listener_v6(uint16_t, in6_addr_t *, uint_t, zoneid_t);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   542
int	conn_trace_ref(conn_t *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   543
int	conn_untrace_ref(conn_t *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   544
conn_t *ipcl_conn_tcp_lookup_reversed_ipv4(conn_t *, ipha_t *, tcph_t *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   545
conn_t *ipcl_conn_tcp_lookup_reversed_ipv6(conn_t *, ip6_t *, tcph_t *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   546
#ifdef	__cplusplus
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   547
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   548
#endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   549
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   550
#endif	/* _INET_IPCLASSIFIER_H */