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