1*dbed73cbSSangeeta Misra /* 2*dbed73cbSSangeeta Misra * CDDL HEADER START 3*dbed73cbSSangeeta Misra * 4*dbed73cbSSangeeta Misra * The contents of this file are subject to the terms of the 5*dbed73cbSSangeeta Misra * Common Development and Distribution License (the "License"). 6*dbed73cbSSangeeta Misra * You may not use this file except in compliance with the License. 7*dbed73cbSSangeeta Misra * 8*dbed73cbSSangeeta Misra * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9*dbed73cbSSangeeta Misra * or http://www.opensolaris.org/os/licensing. 10*dbed73cbSSangeeta Misra * See the License for the specific language governing permissions 11*dbed73cbSSangeeta Misra * and limitations under the License. 12*dbed73cbSSangeeta Misra * 13*dbed73cbSSangeeta Misra * When distributing Covered Code, include this CDDL HEADER in each 14*dbed73cbSSangeeta Misra * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15*dbed73cbSSangeeta Misra * If applicable, add the following below this CDDL HEADER, with the 16*dbed73cbSSangeeta Misra * fields enclosed by brackets "[]" replaced with your own identifying 17*dbed73cbSSangeeta Misra * information: Portions Copyright [yyyy] [name of copyright owner] 18*dbed73cbSSangeeta Misra * 19*dbed73cbSSangeeta Misra * CDDL HEADER END 20*dbed73cbSSangeeta Misra */ 21*dbed73cbSSangeeta Misra 22*dbed73cbSSangeeta Misra /* 23*dbed73cbSSangeeta Misra * Copyright 2009 Sun Microsystems, Inc. All rights reserved. 24*dbed73cbSSangeeta Misra * Use is subject to license terms. 25*dbed73cbSSangeeta Misra */ 26*dbed73cbSSangeeta Misra 27*dbed73cbSSangeeta Misra #ifndef _INET_ILB_NAT_H 28*dbed73cbSSangeeta Misra #define _INET_ILB_NAT_H 29*dbed73cbSSangeeta Misra 30*dbed73cbSSangeeta Misra #include <sys/vmem.h> 31*dbed73cbSSangeeta Misra 32*dbed73cbSSangeeta Misra #ifdef __cplusplus 33*dbed73cbSSangeeta Misra extern "C" { 34*dbed73cbSSangeeta Misra #endif 35*dbed73cbSSangeeta Misra 36*dbed73cbSSangeeta Misra /* Maximum number of NAT source address of a rule. */ 37*dbed73cbSSangeeta Misra #define ILB_MAX_NAT_SRC 10 38*dbed73cbSSangeeta Misra 39*dbed73cbSSangeeta Misra /* NAT source address hash table. */ 40*dbed73cbSSangeeta Misra typedef struct ilb_nat_src_hash_s { 41*dbed73cbSSangeeta Misra list_t nsh_head; 42*dbed73cbSSangeeta Misra kmutex_t nsh_lock; 43*dbed73cbSSangeeta Misra char nsh_pad[64 - sizeof (list_t) - sizeof (kmutex_t)]; 44*dbed73cbSSangeeta Misra } ilb_nat_src_hash_t; 45*dbed73cbSSangeeta Misra 46*dbed73cbSSangeeta Misra /* 47*dbed73cbSSangeeta Misra * NAT source entry. Hold the port space for a source addr/back end server 48*dbed73cbSSangeeta Misra * pair. 49*dbed73cbSSangeeta Misra */ 50*dbed73cbSSangeeta Misra typedef struct ilb_nat_src_entry_s { 51*dbed73cbSSangeeta Misra in6_addr_t nse_src_addr; 52*dbed73cbSSangeeta Misra in6_addr_t nse_serv_addr; 53*dbed73cbSSangeeta Misra in_port_t nse_port; 54*dbed73cbSSangeeta Misra vmem_t *nse_port_arena; 55*dbed73cbSSangeeta Misra uint32_t nse_refcnt; 56*dbed73cbSSangeeta Misra kmutex_t *nse_nsh_lock; 57*dbed73cbSSangeeta Misra list_node_t nse_link; 58*dbed73cbSSangeeta Misra } ilb_nat_src_entry_t; 59*dbed73cbSSangeeta Misra 60*dbed73cbSSangeeta Misra /* Struct to hold all NAT source entry of a back end server. */ 61*dbed73cbSSangeeta Misra typedef struct ilb_nat_src_s { 62*dbed73cbSSangeeta Misra uint16_t cur; 63*dbed73cbSSangeeta Misra uint16_t num_src; 64*dbed73cbSSangeeta Misra ilb_nat_src_entry_t *src_list[ILB_MAX_NAT_SRC]; 65*dbed73cbSSangeeta Misra } ilb_nat_src_t; 66*dbed73cbSSangeeta Misra 67*dbed73cbSSangeeta Misra extern int ilb_create_nat_src(ilb_stack_t *ilbs, ilb_nat_src_t **, 68*dbed73cbSSangeeta Misra const in6_addr_t *, in_port_t, const in6_addr_t *, int); 69*dbed73cbSSangeeta Misra extern void ilb_destroy_nat_src(ilb_nat_src_t **); 70*dbed73cbSSangeeta Misra extern void ilb_nat_src_timer(void *); 71*dbed73cbSSangeeta Misra extern void ilb_nat_src_init(ilb_stack_t *); 72*dbed73cbSSangeeta Misra extern void ilb_nat_src_fini(ilb_stack_t *); 73*dbed73cbSSangeeta Misra 74*dbed73cbSSangeeta Misra extern ilb_nat_src_entry_t *ilb_alloc_nat_addr(ilb_nat_src_t *, in6_addr_t *, 75*dbed73cbSSangeeta Misra in_port_t *, uint16_t *); 76*dbed73cbSSangeeta Misra 77*dbed73cbSSangeeta Misra extern void ilb_full_nat(int, void *, int, void *, ilb_nat_info_t *, uint32_t, 78*dbed73cbSSangeeta Misra uint32_t, boolean_t); 79*dbed73cbSSangeeta Misra extern void ilb_half_nat(int, void *, int, void *, ilb_nat_info_t *, uint32_t, 80*dbed73cbSSangeeta Misra uint32_t, boolean_t); 81*dbed73cbSSangeeta Misra 82*dbed73cbSSangeeta Misra extern void ilb_nat_icmpv4(mblk_t *, ipha_t *, icmph_t *, ipha_t *, 83*dbed73cbSSangeeta Misra in_port_t *, in_port_t *, ilb_nat_info_t *, uint32_t, boolean_t); 84*dbed73cbSSangeeta Misra extern void ilb_nat_icmpv6(mblk_t *, ip6_t *, icmp6_t *, ip6_t *, 85*dbed73cbSSangeeta Misra in_port_t *, in_port_t *, ilb_nat_info_t *, boolean_t); 86*dbed73cbSSangeeta Misra 87*dbed73cbSSangeeta Misra extern uint32_t ilb_pseudo_sum_v6(ip6_t *, uint8_t); 88*dbed73cbSSangeeta Misra 89*dbed73cbSSangeeta Misra #ifdef __cplusplus 90*dbed73cbSSangeeta Misra } 91*dbed73cbSSangeeta Misra #endif 92*dbed73cbSSangeeta Misra 93*dbed73cbSSangeeta Misra #endif /* _INET_ILB_NAT_H */ 94