1d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry Strudel/* 2d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry StrudelCopyright (c) 2013-2016, The Linux Foundation. All rights reserved. 3d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry Strudel 4d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry StrudelRedistribution and use in source and binary forms, with or without 5d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry Strudelmodification, are permitted provided that the following conditions are 6d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry Strudelmet: 7d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry Strudel * Redistributions of source code must retain the above copyright 8d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry Strudel notice, this list of conditions and the following disclaimer. 9d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry Strudel * Redistributions in binary form must reproduce the above 10d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry Strudel copyright notice, this list of conditions and the following 11d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry Strudel disclaimer in the documentation and/or other materials provided 12d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry Strudel with the distribution. 13d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry Strudel * Neither the name of The Linux Foundation nor the names of its 14d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry Strudel contributors may be used to endorse or promote products derived 15d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry Strudel from this software without specific prior written permission. 16d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry Strudel 17d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry StrudelTHIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED 18d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry StrudelWARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 19d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry StrudelMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT 20d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry StrudelARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS 21d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry StrudelBE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 22d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry StrudelCONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 23d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry StrudelSUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR 24d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry StrudelBUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 25d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry StrudelWHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE 26d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry StrudelOR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN 27d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry StrudelIF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 28d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry Strudel*/ 29d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry Strudel#ifndef IPACM_CONNTRACK_NATAPP_H 30d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry Strudel#define IPACM_CONNTRACK_NATAPP_H 31d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry Strudel 32d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry Strudel#include <string.h> /* for stderror */ 33d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry Strudel#include <stdlib.h> 34d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry Strudel#include <cstdio> /* for perror */ 35d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry Strudel 36d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry Strudel#include "IPACM_Config.h" 37d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry Strudel#include "IPACM_Xml.h" 38d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry Strudel 39d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry Strudelextern "C" 40d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry Strudel{ 41d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry Strudel#include <libnetfilter_conntrack/libnetfilter_conntrack.h> 42d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry Strudel#include <ipa_nat_drv.h> 43d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry Strudel} 44d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry Strudel 45d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry Strudel#define MAX_TEMP_ENTRIES 25 46d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry Strudel 47d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry Strudel#define IPACM_TCP_FULL_FILE_NAME "/proc/sys/net/ipv4/netfilter/ip_conntrack_tcp_timeout_established" 48d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry Strudel#define IPACM_UDP_FULL_FILE_NAME "/proc/sys/net/ipv4/netfilter/ip_conntrack_udp_timeout_stream" 49d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry Strudel 50d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry Strudeltypedef struct _nat_table_entry 51d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry Strudel{ 52d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry Strudel uint32_t private_ip; 53d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry Strudel uint16_t private_port; 54d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry Strudel 55d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry Strudel uint32_t target_ip; 56d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry Strudel uint16_t target_port; 57d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry Strudel 58d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry Strudel uint32_t public_ip; 59d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry Strudel uint16_t public_port; 60d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry Strudel 61d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry Strudel u_int8_t protocol; 62d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry Strudel uint32_t timestamp; 63d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry Strudel 64d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry Strudel bool dst_nat; 65d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry Strudel bool enabled; 66d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry Strudel uint32_t rule_hdl; 67d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry Strudel 68d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry Strudel}nat_table_entry; 69d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry Strudel 70d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry Strudel#define CHK_TBL_HDL() if(nat_table_hdl == 0){ return -1; } 71d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry Strudel 72d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry Strudelclass NatApp 73d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry Strudel{ 74d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry Strudelprivate: 75d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry Strudel 76d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry Strudel static NatApp *pInstance; 77d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry Strudel 78d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry Strudel nat_table_entry *cache; 79d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry Strudel nat_table_entry temp[MAX_TEMP_ENTRIES]; 80d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry Strudel uint32_t pub_ip_addr; 81d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry Strudel uint32_t pub_ip_addr_pre; 82d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry Strudel uint32_t nat_table_hdl; 83d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry Strudel 84d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry Strudel int curCnt, max_entries; 85d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry Strudel 86d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry Strudel ipacm_alg *pALGPorts; 87d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry Strudel uint16_t nALGPort; 88d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry Strudel 89d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry Strudel uint32_t tcp_timeout; 90d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry Strudel uint32_t udp_timeout; 91d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry Strudel 92d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry Strudel uint32_t PwrSaveIfs[IPA_MAX_NUM_WIFI_CLIENTS]; 93d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry Strudel 94d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry Strudel struct nf_conntrack *ct; 95d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry Strudel struct nfct_handle *ct_hdl; 96d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry Strudel 97d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry Strudel NatApp(); 98d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry Strudel int Init(); 99d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry Strudel 100d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry Strudel void UpdateCTUdpTs(nat_table_entry *, uint32_t); 101d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry Strudel bool ChkForDup(const nat_table_entry *); 102d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry Strudel bool isAlgPort(uint8_t, uint16_t); 103d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry Strudel void Reset(); 104d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry Strudel bool isPwrSaveIf(uint32_t); 105d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry Strudel 106d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry Strudelpublic: 107d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry Strudel static NatApp* GetInstance(); 108d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry Strudel 109d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry Strudel int AddTable(uint32_t); 110d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry Strudel uint32_t GetTableHdl(uint32_t); 111d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry Strudel int DeleteTable(uint32_t); 112d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry Strudel 113d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry Strudel int AddEntry(const nat_table_entry *); 114d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry Strudel int DeleteEntry(const nat_table_entry *); 115d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry Strudel 116d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry Strudel void UpdateUDPTimeStamp(); 117d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry Strudel 118d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry Strudel int UpdatePwrSaveIf(uint32_t); 119d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry Strudel int ResetPwrSaveIf(uint32_t); 120d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry Strudel int DelEntriesOnClntDiscon(uint32_t); 121d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry Strudel int DelEntriesOnSTAClntDiscon(uint32_t); 122d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry Strudel 123d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry Strudel void Read_TcpUdp_Timeout(void); 124d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry Strudel 125d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry Strudel void AddTempEntry(const nat_table_entry *); 126d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry Strudel void CacheEntry(const nat_table_entry *); 127d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry Strudel void DeleteTempEntry(const nat_table_entry *); 128d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry Strudel void FlushTempEntries(uint32_t, bool, bool isDummy = false); 129d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry Strudel}; 130d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry Strudel 131d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry Strudel 132d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry Strudel 133d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry Strudel#endif /* IPACM_CONNTRACK_NATAPP_H */ 134