aboutsummaryrefslogtreecommitdiff
path: root/data-ipa-cfg-mgr/ipacm/src/IPACM_Wlan.cpp
diff options
context:
space:
mode:
authorBruno Martins <bgcngm@gmail.com>2016-12-04 16:15:12 +0000
committerdavidevinavil <davidevinavil@gmail.com>2017-01-21 18:22:42 +0100
commit06852dbddd5a722d965e6a211916027cb97de6bf (patch)
tree8453619818a941d032d1ae1f0106ab6ea27fce34 /data-ipa-cfg-mgr/ipacm/src/IPACM_Wlan.cpp
parent818d87b312de5d56937381b551abe084bba72c9f (diff)
z2_plus: Update IPACM from upstream
* Tag: LA.UM.5.5.r1-01300-8x96.0 Change-Id: I3891d0c62c622fd0a0f43f25f63deb4d4ba508d6
Diffstat (limited to 'data-ipa-cfg-mgr/ipacm/src/IPACM_Wlan.cpp')
-rw-r--r--data-ipa-cfg-mgr/ipacm/src/IPACM_Wlan.cpp86
1 files changed, 46 insertions, 40 deletions
diff --git a/data-ipa-cfg-mgr/ipacm/src/IPACM_Wlan.cpp b/data-ipa-cfg-mgr/ipacm/src/IPACM_Wlan.cpp
index 375a718..c067550 100644
--- a/data-ipa-cfg-mgr/ipacm/src/IPACM_Wlan.cpp
+++ b/data-ipa-cfg-mgr/ipacm/src/IPACM_Wlan.cpp
@@ -157,7 +157,7 @@ void IPACM_Wlan::event_callback(ipa_cm_event_id event, void *param)
IPACMDBG_H("Received IPA_WLAN_LINK_DOWN_EVENT\n");
handle_down_evt();
/* reset the AP-iface category to unknown */
- ipa_if_cate = UNKNOWN_IF;
+ IPACM_Iface::ipacmcfg->iface_table[ipa_if_num].if_cat = UNKNOWN_IF;
IPACM_Iface::ipacmcfg->DelNatIfaces(dev_name); // delete NAT-iface
IPACM_Wlan::total_num_wifi_clients = (IPACM_Wlan::total_num_wifi_clients) - \
(num_wifi_client);
@@ -284,6 +284,7 @@ void IPACM_Wlan::event_callback(ipa_cm_event_id event, void *param)
{
if((data->iptype == IPA_IP_v6 || data->iptype == IPA_IP_MAX) && num_dft_rt_v6 == 1)
{
+ memcpy(ipv6_prefix, IPACM_Wan::backhaul_ipv6_prefix, sizeof(ipv6_prefix));
install_ipv6_prefix_flt_rule(IPACM_Wan::backhaul_ipv6_prefix);
if(IPACM_Wan::backhaul_is_sta_mode == false)
@@ -356,6 +357,7 @@ void IPACM_Wlan::event_callback(ipa_cm_event_id event, void *param)
{
if(ip_type == IPA_IP_v6 || ip_type == IPA_IP_MAX)
{
+ memcpy(ipv6_prefix, data_wan_tether->ipv6_prefix, sizeof(ipv6_prefix));
install_ipv6_prefix_flt_rule(data_wan_tether->ipv6_prefix);
if(data_wan_tether->is_sta == false)
@@ -463,6 +465,7 @@ void IPACM_Wlan::event_callback(ipa_cm_event_id event, void *param)
IPACMDBG_H("Backhaul is sta mode?%d\n", data_wan->is_sta);
if(ip_type == IPA_IP_v6 || ip_type == IPA_IP_MAX)
{
+ memcpy(ipv6_prefix, data_wan->ipv6_prefix, sizeof(ipv6_prefix));
install_ipv6_prefix_flt_rule(data_wan->ipv6_prefix);
if(data_wan->is_sta == false)
@@ -1038,6 +1041,8 @@ int IPACM_Wlan::handle_wlan_client_ipaddr(ipacm_event_data_all *data)
{
int clnt_indx;
int v6_num;
+ uint32_t ipv6_link_local_prefix = 0xFE800000;
+ uint32_t ipv6_link_local_prefix_mask = 0xFFC00000;
IPACMDBG_H("number of wifi clients: %d\n", num_wifi_client);
IPACMDBG_H(" event MAC %02x:%02x:%02x:%02x:%02x:%02x\n",
@@ -1097,22 +1102,29 @@ int IPACM_Wlan::handle_wlan_client_ipaddr(ipacm_event_data_all *data)
if ((data->ipv6_addr[0] != 0) || (data->ipv6_addr[1] != 0) ||
(data->ipv6_addr[2] != 0) || (data->ipv6_addr[3] || 0)) /* check if all 0 not valid ipv6 address */
{
- IPACMDBG_H("ipv6 address: 0x%x:%x:%x:%x\n", data->ipv6_addr[0], data->ipv6_addr[1], data->ipv6_addr[2], data->ipv6_addr[3]);
- if(get_client_memptr(wlan_client, clnt_indx)->ipv6_set < IPV6_NUM_ADDR)
- {
+ IPACMDBG_H("ipv6 address: 0x%x:%x:%x:%x\n", data->ipv6_addr[0], data->ipv6_addr[1], data->ipv6_addr[2], data->ipv6_addr[3]);
+ if( (data->ipv6_addr[0] & ipv6_link_local_prefix_mask) != (ipv6_link_local_prefix & ipv6_link_local_prefix_mask) &&
+ memcmp(ipv6_prefix, data->ipv6_addr, sizeof(ipv6_prefix)) != 0)
+ {
+ IPACMDBG_H("This IPv6 address is not global IPv6 address with correct prefix, ignore.\n");
+ return IPACM_FAILURE;
+ }
+
+ if(get_client_memptr(wlan_client, clnt_indx)->ipv6_set < IPV6_NUM_ADDR)
+ {
for(v6_num=0;v6_num < get_client_memptr(wlan_client, clnt_indx)->ipv6_set;v6_num++)
- {
- if( data->ipv6_addr[0] == get_client_memptr(wlan_client, clnt_indx)->v6_addr[v6_num][0] &&
+ {
+ if( data->ipv6_addr[0] == get_client_memptr(wlan_client, clnt_indx)->v6_addr[v6_num][0] &&
data->ipv6_addr[1] == get_client_memptr(wlan_client, clnt_indx)->v6_addr[v6_num][1] &&
data->ipv6_addr[2]== get_client_memptr(wlan_client, clnt_indx)->v6_addr[v6_num][2] &&
data->ipv6_addr[3] == get_client_memptr(wlan_client, clnt_indx)->v6_addr[v6_num][3])
- {
+ {
IPACMDBG_H("Already see this ipv6 addr for client:%d\n", clnt_indx);
return IPACM_FAILURE; /* not setup the RT rules*/
break;
- }
- }
+ }
+ }
/* not see this ipv6 before for wifi client*/
get_client_memptr(wlan_client, clnt_indx)->v6_addr[get_client_memptr(wlan_client, clnt_indx)->ipv6_set][0] = data->ipv6_addr[0];
@@ -1123,8 +1135,8 @@ int IPACM_Wlan::handle_wlan_client_ipaddr(ipacm_event_data_all *data)
}
else
{
- IPACMDBG_H("Already got 3 ipv6 addr for client:%d\n", clnt_indx);
- return IPACM_FAILURE; /* not setup the RT rules*/
+ IPACMDBG_H("Already got %d ipv6 addr for client:%d\n", IPV6_NUM_ADDR, clnt_indx);
+ return IPACM_FAILURE; /* not setup the RT rules*/
}
}
}
@@ -1641,21 +1653,30 @@ int IPACM_Wlan::handle_down_evt()
}
IPACMDBG_H("finished deleting default RT rules\n ");
- /* check software routing fl rule hdl */
- if (softwarerouting_act == true && rx_prop != NULL )
+ eth_bridge_post_event(IPA_ETH_BRIDGE_IFACE_DOWN, IPA_IP_MAX, NULL);
+
+ /* free the wlan clients cache */
+ IPACMDBG_H("Free wlan clients cache\n");
+
+ /* Delete private subnet*/
+#ifdef FEATURE_IPA_ANDROID
+ if (ip_type != IPA_IP_v6)
{
- IPACMDBG_H("Delete sw routing filtering rules\n");
- IPACM_Iface::handle_software_routing_disable();
+ IPACMDBG_H("current IPACM private subnet_addr number(%d)\n", IPACM_Iface::ipacmcfg->ipa_num_private_subnet);
+ IPACMDBG_H(" Delete IPACM private subnet_addr as: 0x%x \n", if_ipv4_subnet);
+ if(IPACM_Iface::ipacmcfg->DelPrivateSubnet(if_ipv4_subnet, ipa_if_num) == false)
+ {
+ IPACMERR(" can't Delete IPACM private subnet_addr as: 0x%x \n", if_ipv4_subnet);
+ }
}
- IPACMDBG_H("finished delete software-routing filtering rules\n ");
-
+ /* reset the IPA-client pipe enum */
+ handle_tethering_client(true, IPACM_CLIENT_WLAN);
+#endif /* defined(FEATURE_IPA_ANDROID)*/
+fail:
/* clean wifi-client header, routing rules */
/* clean wifi client rule*/
IPACMDBG_H("left %d wifi clients need to be deleted \n ", num_wifi_client);
-
- eth_bridge_post_event(IPA_ETH_BRIDGE_IFACE_DOWN, IPA_IP_MAX, NULL);
-
for (i = 0; i < num_wifi_client; i++)
{
/* First reset nat rules and then route rules */
@@ -1669,14 +1690,12 @@ int IPACM_Wlan::handle_down_evt()
{
IPACMERR("unbale to delete v4 default qos route rules for index: %d\n", i);
res = IPACM_FAILURE;
- goto fail;
}
if (delete_default_qos_rtrules(i, IPA_IP_v6))
{
IPACMERR("unbale to delete v6 default qos route rules for index: %d\n", i);
res = IPACM_FAILURE;
- goto fail;
}
IPACMDBG_H("Delete %d client header\n", num_wifi_client);
@@ -1687,7 +1706,6 @@ int IPACM_Wlan::handle_down_evt()
== false)
{
res = IPACM_FAILURE;
- goto fail;
}
}
@@ -1697,30 +1715,18 @@ int IPACM_Wlan::handle_down_evt()
== false)
{
res = IPACM_FAILURE;
- goto fail;
}
}
} /* end of for loop */
- /* free the wlan clients cache */
- IPACMDBG_H("Free wlan clients cache\n");
-
- /* Delete private subnet*/
-#ifdef FEATURE_IPA_ANDROID
- if (ip_type != IPA_IP_v6)
+ /* check software routing fl rule hdl */
+ if (softwarerouting_act == true && rx_prop != NULL )
{
- IPACMDBG_H("current IPACM private subnet_addr number(%d)\n", IPACM_Iface::ipacmcfg->ipa_num_private_subnet);
- IPACMDBG_H(" Delete IPACM private subnet_addr as: 0x%x \n", if_ipv4_subnet);
- if(IPACM_Iface::ipacmcfg->DelPrivateSubnet(if_ipv4_subnet, ipa_if_num) == false)
- {
- IPACMERR(" can't Delete IPACM private subnet_addr as: 0x%x \n", if_ipv4_subnet);
- }
+ IPACMDBG_H("Delete sw routing filtering rules\n");
+ IPACM_Iface::handle_software_routing_disable();
}
- /* reset the IPA-client pipe enum */
- handle_tethering_client(true, IPACM_CLIENT_WLAN);
-#endif /* defined(FEATURE_IPA_ANDROID)*/
+ IPACMDBG_H("finished delete software-routing filtering rules\n ");
-fail:
/* Delete corresponding ipa_rm_resource_name of RX-endpoint after delete all IPV4V6 FT-rule */
if (rx_prop != NULL)
{