summaryrefslogtreecommitdiff
path: root/usr/src/uts/common/inet/rawip_impl.h
blob: d323b6651779c121c110550bcae0f37eab1341da (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
/*
 * CDDL HEADER START
 *
 * The contents of this file are subject to the terms of the
 * Common Development and Distribution License (the "License").
 * You may not use this file except in compliance with the License.
 *
 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
 * or http://www.opensolaris.org/os/licensing.
 * See the License for the specific language governing permissions
 * and limitations under the License.
 *
 * When distributing Covered Code, include this CDDL HEADER in each
 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
 * If applicable, add the following below this CDDL HEADER, with the
 * fields enclosed by brackets "[]" replaced with your own identifying
 * information: Portions Copyright [yyyy] [name of copyright owner]
 *
 * CDDL HEADER END
 */
/*
 * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
 * Use is subject to license terms.
 */
/* Copyright (c) 1990 Mentat Inc. */

#ifndef	_RAWIP_IMPL_H
#define	_RAWIP_IMPL_H

#pragma ident	"%Z%%M%	%I%	%E% SMI"

#ifdef	__cplusplus
extern "C" {
#endif

#ifdef _KERNEL

#include <sys/types.h>
#include <sys/netstack.h>

#include <netinet/in.h>
#include <netinet/icmp6.h>
#include <netinet/ip6.h>

#include <inet/common.h>
#include <inet/ip.h>

/* Named Dispatch Parameter Management Structure */
typedef struct icmpparam_s {
	uint_t	icmp_param_min;
	uint_t	icmp_param_max;
	uint_t	icmp_param_value;
	char	*icmp_param_name;
} icmpparam_t;

/*
 * ICMP stack instances
 */
struct icmp_stack {
	netstack_t	*is_netstack;	/* Common netstack */
	void		*is_head;	/* Head for list of open icmps */
	IDP		is_nd;	/* Points to table of ICMP ND variables. */
	icmpparam_t	*is_param_arr; 	/* ndd variable table */
	kstat_t		*is_ksp;	/* kstats */
	mib2_rawip_t	is_rawip_mib;	/* SNMP fixed size info */
};
typedef struct icmp_stack icmp_stack_t;

/* Internal icmp control structure, one per open stream */
typedef	struct icmp_s {
	uint_t		icmp_state;	/* TPI state */
	in6_addr_t	icmp_v6src;	/* Source address of this stream */
	in6_addr_t	icmp_bound_v6src; /* Explicitely bound to address */
	in6_addr_t 	icmp_v6dst;	/* Connected destination */
	uint32_t	icmp_flowinfo;	/* Connected flow id and tclass */
	uint32_t 	icmp_max_hdr_len; /* For write offset in stream head */
	sa_family_t	icmp_family;	/* Family from socket() call */
	/*
	 * IP format that packets transmitted from this struct should use.
	 * Value can be IP4_VERSION or IPV6_VERSION.
	 */
	uchar_t	icmp_ipversion;

	uint_t		icmp_proto;
	uint_t		icmp_ip_snd_options_len; /* Len of IPv4 options */
	uint8_t		*icmp_ip_snd_options;	/* Ptr to IPv4 options */
	uint8_t		icmp_multicast_ttl;	/* IP*_MULTICAST_TTL/HOPS */
	ipaddr_t	icmp_multicast_if_addr; /* IP_MULTICAST_IF option */
	uint_t		icmp_multicast_if_index; /* IPV6_MULTICAST_IF option */
	int		icmp_bound_if;		/* IP*_BOUND_IF option */
	int		icmp_xmit_if;		/* IP_XMIT_IF option */

	uint_t
	    icmp_debug : 1,		/* SO_DEBUG "socket" option. */
	    icmp_dontroute : 1,		/* SO_DONTROUTE "socket" option. */
	    icmp_broadcast : 1,		/* SO_BROADCAST "socket" option. */
	    icmp_reuseaddr : 1,		/* SO_REUSEADDR "socket" option. */

	    icmp_useloopback : 1,	/* SO_USELOOPBACK "socket" option. */
	    icmp_multicast_loop : 1,	/* IP_MULTICAST_LOOP option */
	    icmp_hdrincl : 1,		/* IP_HDRINCL option + RAW and IGMP */
	    icmp_dgram_errind : 1,	/* SO_DGRAM_ERRIND option */

	    icmp_discon_pending : 1,	/* T_DISCON_REQ in progress */
	    icmp_unspec_source : 1,	/* IP*_UNSPEC_SRC option */
	    icmp_raw_checksum : 1,	/* raw checksum per IPV6_CHECKSUM */
	    icmp_no_tp_cksum : 1,	/* icmp_proto is UDP or TCP */

	    icmp_ip_recvpktinfo : 1,	/* IPV[4,6]_RECVPKTINFO option  */
	    icmp_ipv6_recvhoplimit : 1,	/* IPV6_RECVHOPLIMIT option */
	    icmp_ipv6_recvhopopts : 1,	/* IPV6_RECVHOPOPTS option */
	    icmp_ipv6_recvdstopts : 1,	/* IPV6_RECVDSTOPTS option */

	    icmp_ipv6_recvrthdr : 1,	/* IPV6_RECVRTHDR option */
	    icmp_ipv6_recvpathmtu : 1,	/* IPV6_RECVPATHMTU option */
	    icmp_recvif:1,		/* IP_RECVIF for raw sockets option */
	    icmp_ipv6_recvtclass : 1,	/* IPV6_RECVTCLASS option */

	    icmp_restricted : 1,	/* opened by non-privileged user */
	    icmp_ipv6_recvrtdstopts : 1, /* Obsolete IPV6_RECVRTHDRDSTOPTS */
	    icmp_old_ipv6_recvdstopts : 1, /* Old ver of IPV6_RECVDSTOPTS */
	    icmp_timestamp : 1,  	/* SO_TIMESTAMP "socket" option */
	    icmp_mac_exempt : 1,	/* SO_MAC_EXEMPT option */

	    icmp_pad_to_bit_31: 7;

	uint8_t		icmp_type_of_service;
	uint8_t		icmp_ttl;		/* TTL or hoplimit */
	uint32_t	icmp_checksum_off; /* user supplied checksum offset */
	icmp6_filter_t	*icmp_filter;		/* ICMP6_FILTER option */
	cred_t		*icmp_credp;		/* Opener's credentials */

	ip6_pkt_t	icmp_sticky_ipp;	/* Sticky options */
	uint8_t		*icmp_sticky_hdrs;	/* Prebuilt IPv6 hdrs */
	uint_t		icmp_sticky_hdrs_len;	/* Incl. ip6h and any ip6i */
	zoneid_t	icmp_zoneid;		/* ID of owning zone */
	uint_t		icmp_label_len;		/* length of security label */
	uint_t		icmp_label_len_v6;	/* sec. part of sticky opt */
	in6_addr_t 	icmp_v6lastdst;		/* most recent destination */
	mblk_t		*icmp_delabel;		/* send this on close */
	icmp_stack_t	*icmp_is;		/* Stack instance */
} icmp_t;
#define	icmp_rawip_mib	icmp_is->is_rawip_mib

#endif	/* _KERNEL */

#ifdef	__cplusplus
}
#endif

#endif	/* _RAWIP_IMPL_H */