1/*
2 * Copyright (c) 2012, 2015, The Linux Foundation. All rights reserved.
3 * Permission to use, copy, modify, and/or distribute this software for
4 * any purpose with or without fee is hereby granted, provided that the
5 * above copyright notice and this permission notice appear in all copies.
6 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
7 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
8 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
9 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
10 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
11 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
12 * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
13 */
14
15
16#ifndef _NAT_HELPER_HSL_H
17#define _NAT_HELPER_HSL_H
18
19#ifdef KVER32
20#include <linux/kconfig.h>
21#include <generated/autoconf.h>
22#else
23#include <linux/autoconf.h>
24#endif
25
26#include <linux/if_ether.h>
27#include "fal_nat.h"
28
29
30#define NAT_HW_NUM 32
31#define NAT_HW_PORT_RANGE_MAX 255
32
33#define FAL_NAT_ENTRY_PROTOCOL_TCP         0x1
34#define FAL_NAT_ENTRY_PROTOCOL_UDP         0x2
35#define FAL_NAT_ENTRY_PROTOCOL_PPTP        0x4
36#define FAL_NAT_ENTRY_PROTOCOL_ANY         0x8
37#define FAL_NAT_ENTRY_PORT_CHECK           0x20
38
39#define MAX_INTF_NUM    4
40
41/* WAN connection types */
42#define NF_S17_WAN_TYPE_IP  0   /* DHCP, static IP connection */
43#define NF_S17_WAN_TYPE_PPPOE   1   /* PPPoE connection */
44#define NF_S17_WAN_TYPE_GRE 2   /* GRE connections, ex: PPTP */
45#define NF_S17_WAN_TYPE_PPPOEV6 3   /* IPv6 PPPoE connection  using the same session as IPv4 connection */
46#define NF_S17_WAN_TYPE_PPPOES0 4   /* PPPoE connection but not yet connected */
47/* define the H/W Age mode for NAPT entries */
48#define ARP_AGE_NEVER   7
49#define ARP_AGE 6
50
51extern int nf_athrs17_hnat;
52extern int nf_athrs17_hnat_wan_type;
53extern int nf_athrs17_hnat_ppp_id;
54extern int nf_athrs17_hnat_udp_thresh;
55extern a_uint32_t nf_athrs17_hnat_wan_ip;
56extern a_uint32_t nf_athrs17_hnat_ppp_peer_ip;
57extern unsigned char nf_athrs17_hnat_ppp_peer_mac[ETH_ALEN];
58extern unsigned char nf_athrs17_hnat_wan_mac[ETH_ALEN];
59extern int nf_athrs17_hnat_sync_counter_en;
60
61extern int nf_athrs17_hnat_ppp_id2;
62extern unsigned char nf_athrs17_hnat_ppp_peer_mac2[ETH_ALEN];
63
64typedef struct
65{
66    a_uint32_t entry_id;
67    a_uint32_t flags;
68    a_uint32_t src_addr;
69    a_uint32_t trans_addr;
70    a_uint16_t port_num;
71    a_uint16_t port_range;
72} nat_entry_t;
73
74typedef struct
75{
76    a_uint32_t entry_id;
77    a_uint32_t flags;
78    a_uint32_t status;
79    a_uint32_t src_addr;
80    a_uint32_t dst_addr;
81    a_uint16_t src_port;
82    a_uint16_t dst_port;
83    a_uint32_t trans_addr;
84    a_uint16_t trans_port;
85    a_uint32_t ingress_packet;
86    a_uint32_t ingress_byte;
87    a_uint32_t egress_packet;
88    a_uint32_t egress_byte;
89} napt_entry_t;
90
91#if defined (__BIG_ENDIAN)
92typedef struct
93{
94    a_uint16_t ver:2;
95    a_uint16_t pri:3;
96    a_uint16_t type:5;
97    a_uint16_t rev:2;
98    a_uint16_t with_tag:1;
99    a_uint16_t sport:3;
100    a_uint16_t vid;
101    a_uint16_t magic;
102} aos_header_t;
103#elif defined (__LITTLE_ENDIAN)
104typedef struct
105{
106    a_uint16_t vid;
107    a_uint16_t sport:3;
108    a_uint16_t with_tag:1;
109    a_uint16_t rev:2;
110    a_uint16_t type:5;
111    a_uint16_t pri:3;
112    a_uint16_t ver:2;
113} aos_header_t;
114#else
115#error "no ENDIAN"
116#endif
117
118a_int32_t
119nat_hw_add(nat_entry_t *nat);
120a_int32_t
121nat_hw_del_by_index(a_uint32_t index);
122a_int32_t
123nat_hw_flush(void);
124a_int32_t
125napt_hw_flush(void);
126a_int32_t
127nat_hw_prv_base_can_update(void);
128void
129nat_hw_prv_base_update_enable(void);
130void
131nat_hw_prv_base_update_disable(void);
132a_int32_t
133nat_hw_prv_base_set(a_uint32_t ip);
134a_uint32_t
135nat_hw_prv_base_get(void);
136a_int32_t
137nat_hw_prv_mask_set(a_uint32_t ipmask);
138a_uint32_t
139nat_hw_prv_mask_get(void);
140a_int32_t
141nat_hw_prv_base_is_match(a_uint32_t ip);
142a_int32_t
143if_mac_add(uint8_t *mac, uint32_t vid, uint32_t ipv6);
144a_int32_t
145arp_hw_add(a_uint32_t port, a_uint32_t intf_id, a_uint8_t *ip, a_uint8_t *mac, int is_ipv6_entry);
146a_int32_t
147arp_if_info_get(void *data, a_uint32_t *sport, a_uint32_t *vid);
148a_int32_t
149nat_hw_pub_ip_add(a_uint32_t ip, a_uint32_t *index);
150void
151napt_hw_mode_init(void);
152void
153napt_hw_mode_cleanup(void);
154a_int32_t
155nat_hw_pub_ip_del(a_uint32_t index);
156a_int32_t
157napt_hw_add(napt_entry_t *napt_entry);
158a_int32_t
159napt_hw_get(napt_entry_t *napt, fal_napt_entry_t *entry);
160a_int32_t
161napt_hw_dnat_cookie_add(napt_entry_t *napt, a_uint32_t cookie);
162a_int32_t
163napt_hw_snat_cookie_add(napt_entry_t *napt, a_uint32_t cookie);
164a_int32_t
165napt_hw_del(napt_entry_t *napt_entry);
166a_int32_t
167napt_hw_first_by_age(napt_entry_t *napt, a_uint32_t age);
168a_int32_t
169napt_hw_next_by_age(napt_entry_t *napt, a_uint32_t age);
170a_int32_t
171napt_hw_get_by_index(napt_entry_t *napt, a_uint16_t hw_index);
172a_uint32_t
173napt_hw_used_count_get(void);
174
175sw_error_t napt_l3_status_set(a_uint32_t dev_id, a_bool_t enable);
176sw_error_t napt_l3_status_get(a_uint32_t dev_id, a_bool_t * enable);
177
178sw_error_t napt_helper_hsl_init(void);
179
180
181#endif /*_NAT_HELPER_HSL_H*/
182
183