• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2 Copyright (c) 2013-2016, The Linux Foundation. All rights reserved.
3 
4 Redistribution and use in source and binary forms, with or without
5 modification, are permitted provided that the following conditions are
6 met:
7     * Redistributions of source code must retain the above copyright
8       notice, this list of conditions and the following disclaimer.
9     * Redistributions in binary form must reproduce the above
10       copyright notice, this list of conditions and the following
11       disclaimer in the documentation and/or other materials provided
12       with the distribution.
13     * Neither the name of The Linux Foundation nor the names of its
14       contributors may be used to endorse or promote products derived
15       from this software without specific prior written permission.
16 
17 THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
18 WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
19 MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
20 ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
21 BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
22 CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
23 SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
24 BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
25 WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
26 OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
27 IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28 */
29 /*!
30 		@file
31 		IPACM_Wlan.h
32 
33 		@brief
34 		This file implements the WLAN iface functionality.
35 
36 		@Author
37 		Skylar Chang
38 
39 */
40 #ifndef IPACM_WLAN_H
41 #define IPACM_WLAN_H
42 
43 #include <stdio.h>
44 #include <IPACM_CmdQueue.h>
45 #include <linux/msm_ipa.h>
46 #include "IPACM_Routing.h"
47 #include "IPACM_Filtering.h"
48 #include "IPACM_Lan.h"
49 #include "IPACM_Iface.h"
50 #include "IPACM_Conntrack_NATApp.h"
51 
52 typedef struct _wlan_client_rt_hdl
53 {
54 	uint32_t wifi_rt_rule_hdl_v4;
55 	uint32_t wifi_rt_rule_hdl_v6[IPV6_NUM_ADDR];
56 	uint32_t wifi_rt_rule_hdl_v6_wan[IPV6_NUM_ADDR];
57 }wlan_client_rt_hdl;
58 
59 typedef struct _ipa_wlan_client
60 {
61 	ipacm_event_data_wlan_ex* p_hdr_info;
62 	uint8_t mac[IPA_MAC_ADDR_SIZE];
63 	uint32_t v4_addr;
64 	uint32_t v6_addr[IPV6_NUM_ADDR][4];
65 	uint32_t hdr_hdl_v4;
66 	uint32_t hdr_hdl_v6;
67 	bool route_rule_set_v4;
68 	int route_rule_set_v6;
69 	bool ipv4_set;
70 	int ipv6_set;
71 	bool ipv4_header_set;
72 	bool ipv6_header_set;
73 	bool power_save_set;
74 	wlan_client_rt_hdl wifi_rt_hdl[0]; /* depends on number of tx properties */
75 }ipa_wlan_client;
76 
77 /* wlan iface */
78 class IPACM_Wlan : public IPACM_Lan
79 {
80 
81 public:
82 
83 	IPACM_Wlan(int iface_index);
84 	virtual ~IPACM_Wlan(void);
85 
86 	static int total_num_wifi_clients;
87 
88 	void event_callback(ipa_cm_event_id event, void *data);
89 
90 	bool is_guest_ap();
91 
92 private:
93 
94 	bool m_is_guest_ap;
95 
96 	/* handle wlan access mode switch in ethernet bridging*/
97 	void eth_bridge_handle_wlan_mode_switch();
98 
99 
100 	int wlan_client_len;
101 	ipa_wlan_client *wlan_client;
102 
103 	int header_name_count;
104 	uint32_t num_wifi_client;
105 
106 	int wlan_ap_index;
107 
108 	static int num_wlan_ap_iface;
109 
110 	NatApp *Nat_App;
111 
get_client_memptr(ipa_wlan_client * param,int cnt)112 	inline ipa_wlan_client* get_client_memptr(ipa_wlan_client *param, int cnt)
113 	{
114 	    char *ret = ((char *)param) + (wlan_client_len * cnt);
115 		return (ipa_wlan_client *)ret;
116 	}
117 
get_wlan_client_index(uint8_t * mac_addr)118 	inline int get_wlan_client_index(uint8_t *mac_addr)
119 	{
120 		int cnt;
121 		int num_wifi_client_tmp = num_wifi_client;
122 
123 		IPACMDBG_H("Passed MAC %02x:%02x:%02x:%02x:%02x:%02x\n",
124 						 mac_addr[0], mac_addr[1], mac_addr[2],
125 						 mac_addr[3], mac_addr[4], mac_addr[5]);
126 
127 		for(cnt = 0; cnt < num_wifi_client_tmp; cnt++)
128 		{
129 			IPACMDBG_H("stored MAC %02x:%02x:%02x:%02x:%02x:%02x\n",
130 							 get_client_memptr(wlan_client, cnt)->mac[0],
131 							 get_client_memptr(wlan_client, cnt)->mac[1],
132 							 get_client_memptr(wlan_client, cnt)->mac[2],
133 							 get_client_memptr(wlan_client, cnt)->mac[3],
134 							 get_client_memptr(wlan_client, cnt)->mac[4],
135 							 get_client_memptr(wlan_client, cnt)->mac[5]);
136 
137 			if(memcmp(get_client_memptr(wlan_client, cnt)->mac,
138 								mac_addr,
139 								sizeof(get_client_memptr(wlan_client, cnt)->mac)) == 0)
140 			{
141 				IPACMDBG_H("Matched client index: %d\n", cnt);
142 				return cnt;
143 			}
144 		}
145 
146 		return IPACM_INVALID_INDEX;
147 	}
148 
delete_default_qos_rtrules(int clt_indx,ipa_ip_type iptype)149 	inline int delete_default_qos_rtrules(int clt_indx, ipa_ip_type iptype)
150 	{
151 		uint32_t tx_index;
152 		uint32_t rt_hdl;
153 		int num_v6;
154 
155 		if(iptype == IPA_IP_v4)
156 		{
157 		     for(tx_index = 0; tx_index < iface_query->num_tx_props; tx_index++)
158 		     {
159 		        if((tx_prop->tx[tx_index].ip == IPA_IP_v4) && (get_client_memptr(wlan_client, clt_indx)->route_rule_set_v4==true)) /* for ipv4 */
160 			{
161 				IPACMDBG_H("Delete client index %d ipv4 Qos rules for tx:%d \n",clt_indx,tx_index);
162 				rt_hdl = get_client_memptr(wlan_client, clt_indx)->wifi_rt_hdl[tx_index].wifi_rt_rule_hdl_v4;
163 
164 				if(m_routing.DeleteRoutingHdl(rt_hdl, IPA_IP_v4) == false)
165 				{
166 					return IPACM_FAILURE;
167 				}
168 			}
169 		     } /* end of for loop */
170 
171 		     /* clean the 4 Qos ipv4 RT rules for client:clt_indx */
172 		     if(get_client_memptr(wlan_client, clt_indx)->route_rule_set_v4==true) /* for ipv4 */
173 		     {
174 				get_client_memptr(wlan_client, clt_indx)->route_rule_set_v4 = false;
175 		     }
176 		}
177 
178 		if(iptype == IPA_IP_v6)
179 		{
180 		    for(tx_index = 0; tx_index < iface_query->num_tx_props; tx_index++)
181 		    {
182 
183 				if((tx_prop->tx[tx_index].ip == IPA_IP_v6) && (get_client_memptr(wlan_client, clt_indx)->route_rule_set_v6 != 0)) /* for ipv6 */
184 				{
185 					for(num_v6 =0;num_v6 < get_client_memptr(wlan_client, clt_indx)->route_rule_set_v6;num_v6++)
186 					{
187 						IPACMDBG_H("Delete client index %d ipv6 Qos rules for %d-st ipv6 for tx:%d\n", clt_indx,num_v6,tx_index);
188 						rt_hdl = get_client_memptr(wlan_client, clt_indx)->wifi_rt_hdl[tx_index].wifi_rt_rule_hdl_v6[num_v6];
189 						if(m_routing.DeleteRoutingHdl(rt_hdl, IPA_IP_v6) == false)
190 						{
191 							return IPACM_FAILURE;
192 						}
193 
194 						rt_hdl = get_client_memptr(wlan_client, clt_indx)->wifi_rt_hdl[tx_index].wifi_rt_rule_hdl_v6_wan[num_v6];
195 						if(m_routing.DeleteRoutingHdl(rt_hdl, IPA_IP_v6) == false)
196 						{
197 							return IPACM_FAILURE;
198 						}
199 					}
200 
201 				}
202 			} /* end of for loop */
203 
204 		    /* clean the 4 Qos ipv6 RT rules for client:clt_indx */
205 		    if(get_client_memptr(wlan_client, clt_indx)->route_rule_set_v6 != 0) /* for ipv6 */
206 		    {
207 		                 get_client_memptr(wlan_client, clt_indx)->route_rule_set_v6 = 0;
208                     }
209 		}
210 
211 		return IPACM_SUCCESS;
212 	}
213 
214 	/* for handle wifi client initial,copy all partial headers (tx property) */
215 	int handle_wlan_client_init_ex(ipacm_event_data_wlan_ex *data);
216 
217 	/*handle wifi client */
218 	int handle_wlan_client_ipaddr(ipacm_event_data_all *data);
219 
220 	/*handle wifi client routing rule*/
221 	int handle_wlan_client_route_rule(uint8_t *mac_addr, ipa_ip_type iptype);
222 
223 	/*handle wifi client power-save mode*/
224 	int handle_wlan_client_pwrsave(uint8_t *mac_addr);
225 
226 	/*handle wifi client del mode*/
227 	int handle_wlan_client_down_evt(uint8_t *mac_addr);
228 
229 	/*handle wlan iface down event*/
230 	int handle_down_evt();
231 
232 	/*handle reset wifi-client rt-rules */
233 	int handle_wlan_client_reset_rt(ipa_ip_type iptype);
234 
235 	void handle_SCC_MCC_switch(ipa_ip_type);
236 
237 	/*query wlan-clients */
238 	int ipa_query_wlan_client();
239 
240 };
241 
242 
243 #endif /* IPACM_WLAN_H */
244