17c478bd9Sstevel@tonic-gate /* 27c478bd9Sstevel@tonic-gate * CDDL HEADER START 37c478bd9Sstevel@tonic-gate * 47c478bd9Sstevel@tonic-gate * The contents of this file are subject to the terms of the 545916cd2Sjpk * Common Development and Distribution License (the "License"). 645916cd2Sjpk * You may not use this file except in compliance with the License. 77c478bd9Sstevel@tonic-gate * 87c478bd9Sstevel@tonic-gate * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 97c478bd9Sstevel@tonic-gate * or http://www.opensolaris.org/os/licensing. 107c478bd9Sstevel@tonic-gate * See the License for the specific language governing permissions 117c478bd9Sstevel@tonic-gate * and limitations under the License. 127c478bd9Sstevel@tonic-gate * 137c478bd9Sstevel@tonic-gate * When distributing Covered Code, include this CDDL HEADER in each 147c478bd9Sstevel@tonic-gate * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 157c478bd9Sstevel@tonic-gate * If applicable, add the following below this CDDL HEADER, with the 167c478bd9Sstevel@tonic-gate * fields enclosed by brackets "[]" replaced with your own identifying 177c478bd9Sstevel@tonic-gate * information: Portions Copyright [yyyy] [name of copyright owner] 187c478bd9Sstevel@tonic-gate * 197c478bd9Sstevel@tonic-gate * CDDL HEADER END 207c478bd9Sstevel@tonic-gate */ 21*59927d31SYuri Pankov 227c478bd9Sstevel@tonic-gate /* 23e11c3f44Smeem * Copyright 2009 Sun Microsystems, Inc. All rights reserved. 247c478bd9Sstevel@tonic-gate * Use is subject to license terms. 25*59927d31SYuri Pankov * Copyright 2014 Nexenta Systems, Inc. All rights reserved. 267c478bd9Sstevel@tonic-gate */ 277c478bd9Sstevel@tonic-gate 287c478bd9Sstevel@tonic-gate #ifndef _INET_IP6_H 297c478bd9Sstevel@tonic-gate #define _INET_IP6_H 307c478bd9Sstevel@tonic-gate 317c478bd9Sstevel@tonic-gate #ifdef __cplusplus 327c478bd9Sstevel@tonic-gate extern "C" { 337c478bd9Sstevel@tonic-gate #endif 347c478bd9Sstevel@tonic-gate 357c478bd9Sstevel@tonic-gate #include <sys/isa_defs.h> 367c478bd9Sstevel@tonic-gate 377c478bd9Sstevel@tonic-gate #ifdef _KERNEL 387c478bd9Sstevel@tonic-gate /* icmp6_t is used in the prototype of icmp_inbound_error_fanout_v6() */ 397c478bd9Sstevel@tonic-gate #include <netinet/icmp6.h> 407c478bd9Sstevel@tonic-gate #endif /* _KERNEL */ 417c478bd9Sstevel@tonic-gate 427c478bd9Sstevel@tonic-gate /* version number for IPv6 - hard to get this one wrong! */ 437c478bd9Sstevel@tonic-gate #define IPV6_VERSION 6 447c478bd9Sstevel@tonic-gate 457c478bd9Sstevel@tonic-gate #define IPV6_HDR_LEN 40 467c478bd9Sstevel@tonic-gate 477c478bd9Sstevel@tonic-gate #define IPV6_ADDR_LEN 16 487c478bd9Sstevel@tonic-gate 497c478bd9Sstevel@tonic-gate /* 507c478bd9Sstevel@tonic-gate * IPv6 address scopes. The values of these enums also match the scope 517c478bd9Sstevel@tonic-gate * field of multicast addresses. 527c478bd9Sstevel@tonic-gate */ 537c478bd9Sstevel@tonic-gate typedef enum { 547c478bd9Sstevel@tonic-gate IP6_SCOPE_INTFLOCAL = 1, /* Multicast addresses only */ 557c478bd9Sstevel@tonic-gate IP6_SCOPE_LINKLOCAL, 567c478bd9Sstevel@tonic-gate IP6_SCOPE_SUBNETLOCAL, /* Multicast addresses only */ 577c478bd9Sstevel@tonic-gate IP6_SCOPE_ADMINLOCAL, /* Multicast addresses only */ 587c478bd9Sstevel@tonic-gate IP6_SCOPE_SITELOCAL, 597c478bd9Sstevel@tonic-gate IP6_SCOPE_GLOBAL 607c478bd9Sstevel@tonic-gate } in6addr_scope_t; 617c478bd9Sstevel@tonic-gate 62bd670b35SErik Nordmark /* From RFC 3542 - setting for IPV6_USE_MIN_MTU socket option */ 63bd670b35SErik Nordmark #define IPV6_USE_MIN_MTU_MULTICAST -1 /* Default */ 64bd670b35SErik Nordmark #define IPV6_USE_MIN_MTU_NEVER 0 65bd670b35SErik Nordmark #define IPV6_USE_MIN_MTU_ALWAYS 1 66bd670b35SErik Nordmark 677c478bd9Sstevel@tonic-gate #ifdef _KERNEL 687c478bd9Sstevel@tonic-gate 697c478bd9Sstevel@tonic-gate /* Extract the scope from a multicast address */ 707c478bd9Sstevel@tonic-gate #ifdef _BIG_ENDIAN 717c478bd9Sstevel@tonic-gate #define IN6_ADDR_MC_SCOPE(addr) \ 727c478bd9Sstevel@tonic-gate (((addr)->s6_addr32[0] & 0x000f0000) >> 16) 737c478bd9Sstevel@tonic-gate #else 747c478bd9Sstevel@tonic-gate #define IN6_ADDR_MC_SCOPE(addr) \ 757c478bd9Sstevel@tonic-gate (((addr)->s6_addr32[0] & 0x00000f00) >> 8) 767c478bd9Sstevel@tonic-gate #endif 777c478bd9Sstevel@tonic-gate 787c478bd9Sstevel@tonic-gate /* Default IPv4 TTL for IPv6-in-IPv4 encapsulated packets */ 797c478bd9Sstevel@tonic-gate #define IPV6_DEFAULT_HOPS 60 /* XXX What should it be? */ 807c478bd9Sstevel@tonic-gate 817c478bd9Sstevel@tonic-gate /* Max IPv6 TTL */ 827c478bd9Sstevel@tonic-gate #define IPV6_MAX_HOPS 255 837c478bd9Sstevel@tonic-gate 847c478bd9Sstevel@tonic-gate /* Minimum IPv6 MTU from rfc2460 */ 857c478bd9Sstevel@tonic-gate #define IPV6_MIN_MTU 1280 867c478bd9Sstevel@tonic-gate 877c478bd9Sstevel@tonic-gate /* EUI-64 based token length */ 887c478bd9Sstevel@tonic-gate #define IPV6_TOKEN_LEN 64 897c478bd9Sstevel@tonic-gate 907c478bd9Sstevel@tonic-gate /* Length of an advertised IPv6 prefix */ 917c478bd9Sstevel@tonic-gate #define IPV6_PREFIX_LEN 64 927c478bd9Sstevel@tonic-gate 937c478bd9Sstevel@tonic-gate /* Default and maximum tunnel encapsulation limits. See RFC 2473. */ 947c478bd9Sstevel@tonic-gate #define IPV6_DEFAULT_ENCAPLIMIT 4 957c478bd9Sstevel@tonic-gate #define IPV6_MAX_ENCAPLIMIT 255 967c478bd9Sstevel@tonic-gate 977c478bd9Sstevel@tonic-gate /* 987c478bd9Sstevel@tonic-gate * Minimum and maximum extension header lengths for IPv6. The 8-bit 997c478bd9Sstevel@tonic-gate * length field of each extension header (see rfc2460) specifies the 1007c478bd9Sstevel@tonic-gate * number of 8 octet units of data in the header not including the 1017c478bd9Sstevel@tonic-gate * first 8 octets. A value of 0 would indicate 8 bytes (0 * 8 + 8), 1027c478bd9Sstevel@tonic-gate * and 255 would indicate 2048 bytes (255 * 8 + 8). 1037c478bd9Sstevel@tonic-gate */ 1047c478bd9Sstevel@tonic-gate #define MIN_EHDR_LEN 8 1057c478bd9Sstevel@tonic-gate #define MAX_EHDR_LEN 2048 1067c478bd9Sstevel@tonic-gate 1077c478bd9Sstevel@tonic-gate #ifdef _BIG_ENDIAN 1087c478bd9Sstevel@tonic-gate #define IPV6_DEFAULT_VERS_AND_FLOW 0x60000000 1097c478bd9Sstevel@tonic-gate #define IPV6_VERS_AND_FLOW_MASK 0xF0000000 1107c478bd9Sstevel@tonic-gate #define V6_MCAST 0xFF000000 1117c478bd9Sstevel@tonic-gate #define V6_LINKLOCAL 0xFE800000 1127c478bd9Sstevel@tonic-gate 1137c478bd9Sstevel@tonic-gate #define IPV6_FLOW_TCLASS(x) (((x) & IPV6_FLOWINFO_TCLASS) >> 20) 1147c478bd9Sstevel@tonic-gate #define IPV6_TCLASS_FLOW(f, c) (((f) & ~IPV6_FLOWINFO_TCLASS) |\ 1157c478bd9Sstevel@tonic-gate ((c) << 20)) 1167c478bd9Sstevel@tonic-gate #else 1177c478bd9Sstevel@tonic-gate #define IPV6_DEFAULT_VERS_AND_FLOW 0x00000060 1187c478bd9Sstevel@tonic-gate #define IPV6_VERS_AND_FLOW_MASK 0x000000F0 1197c478bd9Sstevel@tonic-gate #define V6_MCAST 0x000000FF 1207c478bd9Sstevel@tonic-gate #define V6_LINKLOCAL 0x000080FE 1217c478bd9Sstevel@tonic-gate 1227c478bd9Sstevel@tonic-gate #define IPV6_FLOW_TCLASS(x) ((((x) & 0xf000U) >> 12) |\ 1237c478bd9Sstevel@tonic-gate (((x) & 0xf) << 4)) 1247c478bd9Sstevel@tonic-gate #define IPV6_TCLASS_FLOW(f, c) (((f) & ~IPV6_FLOWINFO_TCLASS) |\ 1257c478bd9Sstevel@tonic-gate ((((c) & 0xf) << 12) |\ 1267c478bd9Sstevel@tonic-gate (((c) & 0xf0) >> 4))) 1277c478bd9Sstevel@tonic-gate #endif 1287c478bd9Sstevel@tonic-gate 1297c478bd9Sstevel@tonic-gate /* 1307c478bd9Sstevel@tonic-gate * UTILITY MACROS FOR ADDRESSES. 1317c478bd9Sstevel@tonic-gate */ 1327c478bd9Sstevel@tonic-gate 1337c478bd9Sstevel@tonic-gate /* 1347c478bd9Sstevel@tonic-gate * Convert an IPv4 address mask to an IPv6 mask. Pad with 1-bits. 1357c478bd9Sstevel@tonic-gate */ 1367c478bd9Sstevel@tonic-gate #define V4MASK_TO_V6(v4, v6) ((v6).s6_addr32[0] = 0xffffffffUL, \ 1377c478bd9Sstevel@tonic-gate (v6).s6_addr32[1] = 0xffffffffUL, \ 1387c478bd9Sstevel@tonic-gate (v6).s6_addr32[2] = 0xffffffffUL, \ 1397c478bd9Sstevel@tonic-gate (v6).s6_addr32[3] = (v4)) 1407c478bd9Sstevel@tonic-gate 1417c478bd9Sstevel@tonic-gate /* 1427c478bd9Sstevel@tonic-gate * Convert aligned IPv4-mapped IPv6 address into an IPv4 address. 1437c478bd9Sstevel@tonic-gate * Note: We use "v6" here in definition of macro instead of "(v6)" 1447c478bd9Sstevel@tonic-gate * Not possible to use "(v6)" here since macro is used with struct 1457c478bd9Sstevel@tonic-gate * field names as arguments. 1467c478bd9Sstevel@tonic-gate */ 1477c478bd9Sstevel@tonic-gate #define V4_PART_OF_V6(v6) v6.s6_addr32[3] 1487c478bd9Sstevel@tonic-gate 1497c478bd9Sstevel@tonic-gate #ifdef _BIG_ENDIAN 1507c478bd9Sstevel@tonic-gate #define V6_OR_V4_INADDR_ANY(a) ((a).s6_addr32[3] == 0 && \ 1517c478bd9Sstevel@tonic-gate ((a).s6_addr32[2] == 0xffffU || \ 1527c478bd9Sstevel@tonic-gate (a).s6_addr32[2] == 0) && \ 1537c478bd9Sstevel@tonic-gate (a).s6_addr32[1] == 0 && \ 1547c478bd9Sstevel@tonic-gate (a).s6_addr32[0] == 0) 1557c478bd9Sstevel@tonic-gate 1567c478bd9Sstevel@tonic-gate #else 1577c478bd9Sstevel@tonic-gate #define V6_OR_V4_INADDR_ANY(a) ((a).s6_addr32[3] == 0 && \ 1587c478bd9Sstevel@tonic-gate ((a).s6_addr32[2] == 0xffff0000U || \ 1597c478bd9Sstevel@tonic-gate (a).s6_addr32[2] == 0) && \ 1607c478bd9Sstevel@tonic-gate (a).s6_addr32[1] == 0 && \ 1617c478bd9Sstevel@tonic-gate (a).s6_addr32[0] == 0) 1627c478bd9Sstevel@tonic-gate #endif /* _BIG_ENDIAN */ 1637c478bd9Sstevel@tonic-gate 1647c478bd9Sstevel@tonic-gate /* IPv4-mapped CLASSD addresses */ 1657c478bd9Sstevel@tonic-gate #ifdef _BIG_ENDIAN 1667c478bd9Sstevel@tonic-gate #define IN6_IS_ADDR_V4MAPPED_CLASSD(addr) \ 1677c478bd9Sstevel@tonic-gate (((addr)->_S6_un._S6_u32[2] == 0x0000ffff) && \ 1687c478bd9Sstevel@tonic-gate (CLASSD((addr)->_S6_un._S6_u32[3])) && \ 1697c478bd9Sstevel@tonic-gate ((addr)->_S6_un._S6_u32[1] == 0) && \ 1707c478bd9Sstevel@tonic-gate ((addr)->_S6_un._S6_u32[0] == 0)) 1717c478bd9Sstevel@tonic-gate #else /* _BIG_ENDIAN */ 1727c478bd9Sstevel@tonic-gate #define IN6_IS_ADDR_V4MAPPED_CLASSD(addr) \ 1737c478bd9Sstevel@tonic-gate (((addr)->_S6_un._S6_u32[2] == 0xffff0000U) && \ 1747c478bd9Sstevel@tonic-gate (CLASSD((addr)->_S6_un._S6_u32[3])) && \ 1757c478bd9Sstevel@tonic-gate ((addr)->_S6_un._S6_u32[1] == 0) && \ 1767c478bd9Sstevel@tonic-gate ((addr)->_S6_un._S6_u32[0] == 0)) 1777c478bd9Sstevel@tonic-gate #endif /* _BIG_ENDIAN */ 1787c478bd9Sstevel@tonic-gate 1797c478bd9Sstevel@tonic-gate /* Clear an IPv6 addr */ 1807c478bd9Sstevel@tonic-gate #define V6_SET_ZERO(a) ((a).s6_addr32[0] = 0, \ 1817c478bd9Sstevel@tonic-gate (a).s6_addr32[1] = 0, \ 1827c478bd9Sstevel@tonic-gate (a).s6_addr32[2] = 0, \ 1837c478bd9Sstevel@tonic-gate (a).s6_addr32[3] = 0) 1847c478bd9Sstevel@tonic-gate 1857c478bd9Sstevel@tonic-gate /* Mask comparison: is IPv6 addr a, and'ed with mask m, equal to addr b? */ 1867c478bd9Sstevel@tonic-gate #define V6_MASK_EQ(a, m, b) \ 1877c478bd9Sstevel@tonic-gate ((((a).s6_addr32[0] & (m).s6_addr32[0]) == (b).s6_addr32[0]) && \ 1887c478bd9Sstevel@tonic-gate (((a).s6_addr32[1] & (m).s6_addr32[1]) == (b).s6_addr32[1]) && \ 1897c478bd9Sstevel@tonic-gate (((a).s6_addr32[2] & (m).s6_addr32[2]) == (b).s6_addr32[2]) && \ 1907c478bd9Sstevel@tonic-gate (((a).s6_addr32[3] & (m).s6_addr32[3]) == (b).s6_addr32[3])) 1917c478bd9Sstevel@tonic-gate 1927c478bd9Sstevel@tonic-gate #define V6_MASK_EQ_2(a, m, b) \ 1937c478bd9Sstevel@tonic-gate ((((a).s6_addr32[0] & (m).s6_addr32[0]) == \ 1947c478bd9Sstevel@tonic-gate ((b).s6_addr32[0] & (m).s6_addr32[0])) && \ 1957c478bd9Sstevel@tonic-gate (((a).s6_addr32[1] & (m).s6_addr32[1]) == \ 1967c478bd9Sstevel@tonic-gate ((b).s6_addr32[1] & (m).s6_addr32[1])) && \ 1977c478bd9Sstevel@tonic-gate (((a).s6_addr32[2] & (m).s6_addr32[2]) == \ 1987c478bd9Sstevel@tonic-gate ((b).s6_addr32[2] & (m).s6_addr32[2])) && \ 1997c478bd9Sstevel@tonic-gate (((a).s6_addr32[3] & (m).s6_addr32[3]) == \ 2007c478bd9Sstevel@tonic-gate ((b).s6_addr32[3] & (m).s6_addr32[3]))) 2017c478bd9Sstevel@tonic-gate 2027c478bd9Sstevel@tonic-gate /* Copy IPv6 address (s), logically and'ed with mask (m), into (d) */ 2037c478bd9Sstevel@tonic-gate #define V6_MASK_COPY(s, m, d) \ 2047c478bd9Sstevel@tonic-gate ((d).s6_addr32[0] = (s).s6_addr32[0] & (m).s6_addr32[0], \ 2057c478bd9Sstevel@tonic-gate (d).s6_addr32[1] = (s).s6_addr32[1] & (m).s6_addr32[1], \ 2067c478bd9Sstevel@tonic-gate (d).s6_addr32[2] = (s).s6_addr32[2] & (m).s6_addr32[2], \ 2077c478bd9Sstevel@tonic-gate (d).s6_addr32[3] = (s).s6_addr32[3] & (m).s6_addr32[3]) 2087c478bd9Sstevel@tonic-gate 2097c478bd9Sstevel@tonic-gate #define ILL_FRAG_HASH_V6(v6addr, i) \ 2107c478bd9Sstevel@tonic-gate ((ntohl((v6addr).s6_addr32[3]) ^ (i ^ (i >> 8))) % \ 2117c478bd9Sstevel@tonic-gate ILL_FRAG_HASH_TBL_COUNT) 2127c478bd9Sstevel@tonic-gate 213f4b3ec61Sdh155122 2147c478bd9Sstevel@tonic-gate /* 2157c478bd9Sstevel@tonic-gate * GLOBAL EXTERNALS 2167c478bd9Sstevel@tonic-gate */ 2177c478bd9Sstevel@tonic-gate extern const in6_addr_t ipv6_all_ones; 2187c478bd9Sstevel@tonic-gate extern const in6_addr_t ipv6_all_zeros; 2197c478bd9Sstevel@tonic-gate extern const in6_addr_t ipv6_loopback; 2207c478bd9Sstevel@tonic-gate extern const in6_addr_t ipv6_all_hosts_mcast; 2217c478bd9Sstevel@tonic-gate extern const in6_addr_t ipv6_all_rtrs_mcast; 2227c478bd9Sstevel@tonic-gate extern const in6_addr_t ipv6_all_v2rtrs_mcast; 2237c478bd9Sstevel@tonic-gate extern const in6_addr_t ipv6_solicited_node_mcast; 2247c478bd9Sstevel@tonic-gate extern const in6_addr_t ipv6_unspecified_group; 2257c478bd9Sstevel@tonic-gate 2267c478bd9Sstevel@tonic-gate /* 2277c478bd9Sstevel@tonic-gate * FUNCTION PROTOTYPES 2287c478bd9Sstevel@tonic-gate */ 229bd670b35SErik Nordmark extern void icmp_param_problem_nexthdr_v6(mblk_t *, boolean_t, 230bd670b35SErik Nordmark ip_recv_attr_t *); 231bd670b35SErik Nordmark extern void icmp_pkt2big_v6(mblk_t *, uint32_t, boolean_t, 232bd670b35SErik Nordmark ip_recv_attr_t *); 233bd670b35SErik Nordmark extern void icmp_time_exceeded_v6(mblk_t *, uint8_t, boolean_t, 234bd670b35SErik Nordmark ip_recv_attr_t *); 235bd670b35SErik Nordmark extern void icmp_unreachable_v6(mblk_t *, uint8_t, boolean_t, 236bd670b35SErik Nordmark ip_recv_attr_t *); 237bd670b35SErik Nordmark extern mblk_t *icmp_inbound_v6(mblk_t *, ip_recv_attr_t *); 238bd670b35SErik Nordmark extern void icmp_inbound_error_fanout_v6(mblk_t *, icmp6_t *, 239bd670b35SErik Nordmark ip_recv_attr_t *); 240bd670b35SErik Nordmark extern void icmp_update_out_mib_v6(ill_t *, icmp6_t *); 241bd670b35SErik Nordmark 242bd670b35SErik Nordmark extern boolean_t conn_wantpacket_v6(conn_t *, ip_recv_attr_t *, ip6_t *); 243bd670b35SErik Nordmark 2447c478bd9Sstevel@tonic-gate extern in6addr_scope_t ip_addr_scope_v6(const in6_addr_t *); 245bd670b35SErik Nordmark extern void ip_build_hdrs_v6(uchar_t *, uint_t, const ip_pkt_t *, uint8_t, 246bd670b35SErik Nordmark uint32_t); 247bd670b35SErik Nordmark extern void ip_fanout_udp_multi_v6(mblk_t *, ip6_t *, uint16_t, uint16_t, 248bd670b35SErik Nordmark ip_recv_attr_t *); 249bd670b35SErik Nordmark extern void ip_fanout_send_icmp_v6(mblk_t *, uint_t, uint8_t, 250bd670b35SErik Nordmark ip_recv_attr_t *); 251bd670b35SErik Nordmark extern void ip_fanout_proto_v6(mblk_t *, ip6_t *, ip_recv_attr_t *); 252bd670b35SErik Nordmark extern int ip_find_hdr_v6(mblk_t *, ip6_t *, boolean_t, ip_pkt_t *, 253bd670b35SErik Nordmark uint8_t *); 254bd670b35SErik Nordmark extern in6_addr_t ip_get_dst_v6(ip6_t *, const mblk_t *, boolean_t *); 2557c478bd9Sstevel@tonic-gate extern ip6_rthdr_t *ip_find_rthdr_v6(ip6_t *, uint8_t *); 2567c478bd9Sstevel@tonic-gate extern boolean_t ip_hdr_length_nexthdr_v6(mblk_t *, ip6_t *, 2577c478bd9Sstevel@tonic-gate uint16_t *, uint8_t **); 2587c478bd9Sstevel@tonic-gate extern int ip_hdr_length_v6(mblk_t *, ip6_t *); 259f4b3ec61Sdh155122 extern uint32_t ip_massage_options_v6(ip6_t *, ip6_rthdr_t *, netstack_t *); 260bd670b35SErik Nordmark extern void ip_forward_xmit_v6(nce_t *, mblk_t *, ip6_t *, ip_recv_attr_t *, 261bd670b35SErik Nordmark uint32_t, uint32_t); 262bd670b35SErik Nordmark extern mblk_t *ip_fraghdr_add_v6(mblk_t *, uint32_t, ip_xmit_attr_t *); 263bd670b35SErik Nordmark extern int ip_fragment_v6(mblk_t *, nce_t *, iaflags_t, uint_t, uint32_t, 264bd670b35SErik Nordmark uint32_t, zoneid_t, zoneid_t, pfirepostfrag_t postfragfn, 265bd670b35SErik Nordmark uintptr_t *ixa_cookie); 266bd670b35SErik Nordmark extern int ip_process_options_v6(mblk_t *, ip6_t *, 267bd670b35SErik Nordmark uint8_t *, uint_t, uint8_t, ip_recv_attr_t *); 268bd670b35SErik Nordmark extern void ip_process_rthdr(mblk_t *, ip6_t *, ip6_rthdr_t *, 269bd670b35SErik Nordmark ip_recv_attr_t *); 270bd670b35SErik Nordmark extern int ip_total_hdrs_len_v6(const ip_pkt_t *); 271bd670b35SErik Nordmark extern mblk_t *ipsec_early_ah_v6(mblk_t *, ip_recv_attr_t *); 2727c478bd9Sstevel@tonic-gate extern int ipsec_ah_get_hdr_size_v6(mblk_t *, boolean_t); 273bd670b35SErik Nordmark extern void ip_send_potential_redirect_v6(mblk_t *, ip6_t *, ire_t *, 274bd670b35SErik Nordmark ip_recv_attr_t *); 275381a2a9aSdr146992 extern void ip_rput_v6(queue_t *, mblk_t *); 276bd670b35SErik Nordmark extern mblk_t *mld_input(mblk_t *, ip_recv_attr_t *); 2777c478bd9Sstevel@tonic-gate extern void mld_joingroup(ilm_t *); 2787c478bd9Sstevel@tonic-gate extern void mld_leavegroup(ilm_t *); 2797c478bd9Sstevel@tonic-gate extern void mld_timeout_handler(void *); 2807c478bd9Sstevel@tonic-gate 2817c478bd9Sstevel@tonic-gate extern void pr_addr_dbg(char *, int, const void *); 282f4b3ec61Sdh155122 extern void *ip6_kstat_init(netstackid_t, ip6_stat_t *); 283f4b3ec61Sdh155122 extern void ip6_kstat_fini(netstackid_t, kstat_t *); 284bd670b35SErik Nordmark extern size_t ip6_get_src_preferences(ip_xmit_attr_t *, uint32_t *); 285bd670b35SErik Nordmark extern int ip6_set_src_preferences(ip_xmit_attr_t *, uint32_t); 2867c478bd9Sstevel@tonic-gate 2877c478bd9Sstevel@tonic-gate #endif /* _KERNEL */ 2887c478bd9Sstevel@tonic-gate 2897c478bd9Sstevel@tonic-gate #ifdef __cplusplus 2907c478bd9Sstevel@tonic-gate } 2917c478bd9Sstevel@tonic-gate #endif 2927c478bd9Sstevel@tonic-gate 2937c478bd9Sstevel@tonic-gate #endif /* _INET_IP6_H */ 294