| /* |
| * 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 2009 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 |
| |
| #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> |
| #include <inet/optcom.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 */ |
| ldi_ident_t is_ldi_ident; |
| }; |
| |
| typedef struct icmp_stack icmp_stack_t; |
| |
| /* Internal icmp control structure, one per open stream */ |
| typedef struct icmp_s { |
| krwlock_t icmp_rwlock; /* Protects most of icmp_t */ |
| t_scalar_t icmp_pending_op; /* The current TPI operation */ |
| /* |
| * Following fields up to icmp_ipversion protected by conn_lock. |
| */ |
| 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 */ |
| sin6_t icmp_v6dst; /* Connected destination */ |
| /* |
| * IP format that packets transmitted from this struct should use. |
| * Value can be IP4_VERSION or IPV6_VERSION. |
| */ |
| uchar_t icmp_ipversion; |
| |
| /* Written to only once at the time of opening the endpoint */ |
| sa_family_t icmp_family; /* Family from socket() call */ |
| |
| /* Following protected by icmp_rwlock */ |
| uint32_t icmp_max_hdr_len; /* For write offset in stream head */ |
| 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 */ |
| |
| /* Written to only once at the time of opening the endpoint */ |
| conn_t *icmp_connp; |
| |
| /* Following protected by icmp_rwlock */ |
| 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_hdrincl : 1, /* IP_HDRINCL option + RAW and IGMP */ |
| icmp_dgram_errind : 1, /* SO_DGRAM_ERRIND option */ |
| 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_ipv6_recvrtdstopts : 1, /* Obsolete IPV6_RECVRTHDRDSTOPTS */ |
| icmp_old_ipv6_recvdstopts : 1, /* Old ver of IPV6_RECVDSTOPTS */ |
| |
| icmp_timestamp : 1, /* SO_TIMESTAMP "socket" option */ |
| |
| icmp_pad_to_bit_31: 11; |
| |
| 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 */ |
| |
| 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 */ |
| icmp_stack_t *icmp_is; /* Stack instance */ |
| size_t icmp_xmit_hiwat; |
| size_t icmp_xmit_lowat; |
| size_t icmp_recv_hiwat; |
| size_t icmp_recv_lowat; |
| int icmp_delayed_error; |
| kmutex_t icmp_recv_lock; |
| mblk_t *icmp_fallback_queue_head; |
| mblk_t *icmp_fallback_queue_tail; |
| struct sockaddr_storage icmp_delayed_addr; |
| } icmp_t; |
| |
| /* |
| * Object to represent database of options to search passed to |
| * {sock,tpi}optcom_req() interface routine to take care of option |
| * management and associated methods. |
| */ |
| extern optdb_obj_t icmp_opt_obj; |
| extern uint_t icmp_max_optsize; |
| |
| extern mblk_t *icmp_snmp_get(queue_t *q, mblk_t *mpctl); |
| |
| extern void icmp_ddi_g_init(void); |
| extern void icmp_ddi_g_destroy(void); |
| |
| extern sock_lower_handle_t rawip_create(int, int, int, sock_downcalls_t **, |
| uint_t *, int *, int, cred_t *); |
| extern int rawip_fallback(sock_lower_handle_t, queue_t *, boolean_t, |
| so_proto_quiesced_cb_t); |
| |
| extern sock_downcalls_t sock_rawip_downcalls; |
| |
| #endif /* _KERNEL */ |
| |
| #ifdef __cplusplus |
| } |
| #endif |
| |
| #endif /* _RAWIP_IMPL_H */ |