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 30d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry Strudel#ifndef IPACM_CONNTRACK_LISTENER 31d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry Strudel#define IPACM_CONNTRACK_LISTENER 32d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry Strudel 33d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry Strudel#include <stdio.h> 34d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry Strudel#include <stdlib.h> 35d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry Strudel#include <string.h> 36d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry Strudel#include <fcntl.h> 37d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry Strudel 38d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry Strudel#include <arpa/inet.h> 39d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry Strudel#include <netinet/in.h> 40d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry Strudel#include <errno.h> 41d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry Strudel 42d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry Strudel#include "IPACM_CmdQueue.h" 43d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry Strudel#include "IPACM_Conntrack_NATApp.h" 44d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry Strudel#include "IPACM_Listener.h" 45d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry Strudel#ifdef CT_OPT 46d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry Strudel#include "IPACM_LanToLan.h" 47d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry Strudel#endif 48d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry Strudel 49d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry Strudel#define MAX_IFACE_ADDRESS 50 50d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry Strudel#define MAX_STA_CLNT_IFACES 10 51d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry Strudel#define STA_CLNT_SUBNET_MASK 0xFFFFFF00 52d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry Strudel 53d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry Strudelusing namespace std; 54d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry Strudel 55d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry Strudeltypedef struct _nat_entry_bundle 56d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry Strudel{ 57d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry Strudel struct nf_conntrack *ct; 58d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry Strudel enum nf_conntrack_msg_type type; 59d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry Strudel nat_table_entry *rule; 60d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry Strudel bool isTempEntry; 61d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry Strudel 62d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry Strudel}nat_entry_bundle; 63d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry Strudel 64d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry Strudelclass IPACM_ConntrackListener : public IPACM_Listener 65d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry Strudel{ 66d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry Strudel 67d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry Strudelprivate: 68d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry Strudel bool isCTReg; 69d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry Strudel bool isNatThreadStart; 70d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry Strudel bool WanUp; 71d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry Strudel NatApp *nat_inst; 72d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry Strudel 73d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry Strudel int NatIfaceCnt; 74d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry Strudel int StaClntCnt; 75d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry Strudel NatIfaces *pNatIfaces; 76d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry Strudel uint32_t nat_iface_ipv4_addr[MAX_IFACE_ADDRESS]; 77d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry Strudel uint32_t nonnat_iface_ipv4_addr[MAX_IFACE_ADDRESS]; 78d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry Strudel uint32_t sta_clnt_ipv4_addr[MAX_STA_CLNT_IFACES]; 79d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry Strudel IPACM_Config *pConfig; 80d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry Strudel#ifdef CT_OPT 81d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry Strudel IPACM_LanToLan *p_lan2lan; 82d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry Strudel#endif 83d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry Strudel 84d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry Strudel void ProcessCTMessage(void *); 85d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry Strudel void ProcessTCPorUDPMsg(struct nf_conntrack *, 86d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry Strudel enum nf_conntrack_msg_type, u_int8_t); 87d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry Strudel void TriggerWANUp(void *); 88d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry Strudel void TriggerWANDown(uint32_t); 89d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry Strudel int CreateNatThreads(void); 90d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry Strudel bool AddIface(nat_table_entry *, bool *); 91d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry Strudel void AddORDeleteNatEntry(const nat_entry_bundle *); 92d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry Strudel void PopulateTCPorUDPEntry(struct nf_conntrack *, uint32_t, nat_table_entry *); 93d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry Strudel void CheckSTAClient(const nat_table_entry *, bool *); 94d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry Strudel int CheckNatIface(ipacm_event_data_all *, bool *); 95d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry Strudel void HandleNonNatIPAddr(void *, bool); 96d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry Strudel 97d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry Strudel#ifdef CT_OPT 98d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry Strudel void ProcessCTV6Message(void *); 99d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry Strudel void HandleLan2Lan(struct nf_conntrack *, 100d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry Strudel enum nf_conntrack_msg_type, nat_table_entry* ); 101d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry Strudel#endif 102d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry Strudel 103d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry Strudelpublic: 104d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry Strudel char wan_ifname[IPA_IFACE_NAME_LEN]; 105d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry Strudel uint32_t wan_ipaddr; 106d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry Strudel bool isStaMode; 107d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry Strudel IPACM_ConntrackListener(); 108d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry Strudel void event_callback(ipa_cm_event_id, void *data); 109d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry Strudel inline bool isWanUp() 110d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry Strudel { 111d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry Strudel return WanUp; 112d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry Strudel } 113d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry Strudel 114d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry Strudel void HandleNeighIpAddrAddEvt(ipacm_event_data_all *); 115d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry Strudel void HandleNeighIpAddrDelEvt(uint32_t); 116d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry Strudel void HandleSTAClientAddEvt(uint32_t); 117d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry Strudel void HandleSTAClientDelEvt(uint32_t); 118582b9e5c388f74eeafad876c81492c81bf1f3945Thierry Strudel int CreateConnTrackThreads(void); 119d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry Strudel}; 120d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry Strudel 121d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry Strudelextern IPACM_ConntrackListener *CtList; 122d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry Strudel 123d512f4232dc6c7105b0f8088c56f277132ca2ab3Thierry Strudel#endif /* IPACM_CONNTRACK_LISTENER */ 124