4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License (the "License").
6 * You may not use this file except in compliance with the License.
8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9 * or http://www.opensolaris.org/os/licensing.
10 * See the License for the specific language governing permissions
11 * and limitations under the License.
13 * When distributing Covered Code, include this CDDL HEADER in each
14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15 * If applicable, add the following below this CDDL HEADER, with the
16 * fields enclosed by brackets "[]" replaced with your own identifying
17 * information: Portions Copyright [yyyy] [name of copyright owner]
22 * Copyright 2010 Sun Microsystems, Inc. All rights reserved.
23 * Use is subject to license terms.
26 #ifndef _INET_IP_IMPL_H
27 #define _INET_IP_IMPL_H
30 * IP implementation private declarations. These interfaces are
31 * used to build the IP module and are not meant to be accessed
32 * by any modules except IP itself. They are undocumented and are
33 * subject to change without notice.
44 #include <inet/tunables.h>
46 #define IP_MOD_ID 5701
48 #define INET_NAME "ip"
51 #define IP_HDR_CSUM_TTL_ADJUST 256
52 #define IP_TCP_CSUM_COMP IPPROTO_TCP
53 #define IP_UDP_CSUM_COMP IPPROTO_UDP
54 #define IP_ICMPV6_CSUM_COMP IPPROTO_ICMPV6
56 #define IP_HDR_CSUM_TTL_ADJUST 1
57 #define IP_TCP_CSUM_COMP (IPPROTO_TCP << 8)
58 #define IP_UDP_CSUM_COMP (IPPROTO_UDP << 8)
59 #define IP_ICMPV6_CSUM_COMP (IPPROTO_ICMPV6 << 8)
62 #define TCP_CHECKSUM_OFFSET 16
63 #define TCP_CHECKSUM_SIZE 2
65 #define UDP_CHECKSUM_OFFSET 6
66 #define UDP_CHECKSUM_SIZE 2
68 #define ICMPV6_CHECKSUM_OFFSET 2
69 #define ICMPV6_CHECKSUM_SIZE 2
71 #define IPH_TCPH_CHECKSUMP(ipha, hlen) \
72 ((uint16_t *)(((uchar_t *)(ipha)) + ((hlen) + TCP_CHECKSUM_OFFSET)))
74 #define IPH_UDPH_CHECKSUMP(ipha, hlen) \
75 ((uint16_t *)(((uchar_t *)(ipha)) + ((hlen) + UDP_CHECKSUM_OFFSET)))
77 #define IPH_ICMPV6_CHECKSUMP(ipha, hlen) \
78 ((uint16_t *)(((uchar_t *)(ipha)) + ((hlen) + ICMPV6_CHECKSUM_OFFSET)))
80 #define ILL_HCKSUM_CAPABLE(ill) \
81 (((ill)->ill_capabilities & ILL_CAPAB_HCKSUM) != 0)
84 * Macro to adjust a given checksum value depending on any prepended
85 * or postpended data on the packet. It expects the start offset to
86 * begin at an even boundary and that the packet consists of at most
89 #define IP_ADJCKSUM_PARTIAL(cksum_start, mp, mp1, len, adj) { \
91 * Prepended extraneous data; adjust checksum. \
94 (adj) = IP_BCSUM_PARTIAL(cksum_start, len, 0); \
98 * len is now the total length of mblk(s) \
104 (len) += MBLKL(mp1); \
106 * Postpended extraneous data; adjust checksum. \
108 if (((len) = (DB_CKSUMEND(mp) - len)) > 0) { \
111 _pad = IP_BCSUM_PARTIAL((mp1)->b_wptr, len, 0); \
113 * If the postpended extraneous data was odd \
114 * byte aligned, swap resulting checksum bytes. \
116 if ((uintptr_t)(mp1)->b_wptr & 1) \
117 (adj) += ((_pad << 8) & 0xFFFF) | (_pad >> 8); \
120 (adj) = ((adj) & 0xFFFF) + ((int)(adj) >> 16); \
124 #define IS_SIMPLE_IPH(ipha) \
125 ((ipha)->ipha_version_and_hdr_length == IP_SIMPLE_HDR_VERSION)
128 * Currently supported flags for LSO.
130 #define LSO_BASIC_TCP_IPV4 DLD_LSO_BASIC_TCP_IPV4
131 #define LSO_BASIC_TCP_IPV6 DLD_LSO_BASIC_TCP_IPV6
133 #define ILL_LSO_CAPABLE(ill) \
134 (((ill)->ill_capabilities & ILL_CAPAB_LSO) != 0)
136 #define ILL_LSO_USABLE(ill) \
137 (ILL_LSO_CAPABLE(ill) && \
138 ill->ill_lso_capab != NULL)
140 #define ILL_LSO_TCP_IPV4_USABLE(ill) \
141 (ILL_LSO_USABLE(ill) && \
142 ill->ill_lso_capab->ill_lso_flags & LSO_BASIC_TCP_IPV4)
144 #define ILL_LSO_TCP_IPV6_USABLE(ill) \
145 (ILL_LSO_USABLE(ill) && \
146 ill->ill_lso_capab->ill_lso_flags & LSO_BASIC_TCP_IPV6)
148 #define ILL_ZCOPY_CAPABLE(ill) \
149 (((ill)->ill_capabilities & ILL_CAPAB_ZEROCOPY) != 0)
151 #define ILL_ZCOPY_USABLE(ill) \
152 (ILL_ZCOPY_CAPABLE(ill) && (ill->ill_zerocopy_capab != NULL) && \
153 (ill->ill_zerocopy_capab->ill_zerocopy_flags != 0))
156 /* Macro that follows definitions of flags for mac_tx() (see mac_client.h) */
157 #define IP_DROP_ON_NO_DESC 0x01 /* Equivalent to MAC_DROP_ON_NO_DESC */
159 #define ILL_DIRECT_CAPABLE(ill) \
160 (((ill)->ill_capabilities & ILL_CAPAB_DLD_DIRECT) != 0)
162 /* This macro is used by the mac layer */
163 #define MBLK_RX_FANOUT_SLOWPATH(mp, ipha) \
164 (DB_TYPE(mp) != M_DATA || DB_REF(mp) != 1 || !OK_32PTR(ipha) || \
165 (((uchar_t *)ipha + IP_SIMPLE_HDR_LENGTH) >= (mp)->b_wptr))
168 * In non-global zone exclusive IP stacks, data structures such as IRE
169 * entries pretend that they're in the global zone. The following
170 * macro evaluates to the real zoneid instead of a pretend
173 #define IP_REAL_ZONEID(zoneid, ipst) \
174 (((zoneid) == GLOBAL_ZONEID) ? \
175 netstackid_to_zoneid((ipst)->ips_netstack->netstack_stackid) : \
178 extern void ill_flow_enable(void *, ip_mac_tx_cookie_t
);
179 extern zoneid_t
ip_get_zoneid_v4(ipaddr_t
, mblk_t
*, ip_recv_attr_t
*,
181 extern zoneid_t
ip_get_zoneid_v6(in6_addr_t
*, mblk_t
*, const ill_t
*,
182 ip_recv_attr_t
*, zoneid_t
);
183 extern void conn_ire_revalidate(conn_t
*, void *);
184 extern void ip_ire_unbind_walker(ire_t
*, void *);
185 extern void ip_ire_rebind_walker(ire_t
*, void *);
188 * flag passed in by IP based protocols to get a private ip stream with
189 * no conn_t. Note this flag has the same value as SO_FALLBACK
191 #define IP_HELPER_STR SO_FALLBACK
193 #define IP_MOD_MINPSZ 1
194 #define IP_MOD_MAXPSZ INFPSZ
195 #define IP_MOD_HIWAT 65536
196 #define IP_MOD_LOWAT 1024
198 #define DEV_IP "/devices/pseudo/ip@0:ip"
199 #define DEV_IP6 "/devices/pseudo/ip6@0:ip6"
207 #endif /* _INET_IP_IMPL_H */