IPACM: fix filtering rule index for WLAN APAP mode
Previously on WLAN AP-AP mode, modem static UL filtering
rules were be added 2 times which is not correct. The fix
is to add dummy filtering rules when WLAN AP is up and
IPACM only add modem static UL filtering rules in the end
for only once.
Change-Id: Ic08facd69f9601eac3beea6b790b31bd56ec50c7
diff --git a/ipacm/inc/IPACM_Iface.h b/ipacm/inc/IPACM_Iface.h
index d0ba6cc..2f36714 100644
--- a/ipacm/inc/IPACM_Iface.h
+++ b/ipacm/inc/IPACM_Iface.h
@@ -1,4 +1,4 @@
-/*
+/*
Copyright (c) 2013, The Linux Foundation. All rights reserved.
Redistribution and use in source and binary forms, with or without
@@ -64,61 +64,60 @@
#define INVALID_IFACE -1
/* iface */
-class IPACM_Iface : public IPACM_Listener
+class IPACM_Iface :public IPACM_Listener
{
public:
- /* Static class for reading IPACM configuration from XML file*/
- static IPACM_Config *ipacmcfg;
+ /* Static class for reading IPACM configuration from XML file*/
+ static IPACM_Config *ipacmcfg;
- /* IPACM interface id */
- int ipa_if_num;
+ /* IPACM interface id */
+ int ipa_if_num;
- /* IPACM interface name */
- char dev_name[IF_NAME_LEN];
+ /* IPACM interface name */
+ char dev_name[IF_NAME_LEN];
- /* IPACM interface iptype v4, v6 or both */
- ipa_ip_type ip_type;
+ /* IPACM interface iptype v4, v6 or both */
+ ipa_ip_type ip_type;
- /* IPACM interface v6 ip-address*/
- uint32_t ipv6_addr[MAX_DEFAULT_v6_ROUTE_RULES][4];
-
- uint32_t header_hdl;
+ /* IPACM interface v6 ip-address*/
+ uint32_t ipv6_addr[MAX_DEFAULT_v6_ROUTE_RULES][4];
- uint32_t software_routing_fl_rule_hdl[MAX_SOFTWAREROUTING_FILTERTING_RULES];
+ uint32_t header_hdl;
- bool softwarerouting_act;
+ uint32_t software_routing_fl_rule_hdl[MAX_SOFTWAREROUTING_FILTERTING_RULES];
- /* IPACM number of default route rules for ipv6*/
- int num_dft_rt_v6;
+ bool softwarerouting_act;
- uint32_t dft_v4fl_rule_hdl[IPV4_DEFAULT_FILTERTING_RULES];
- uint32_t dft_v6fl_rule_hdl[IPV6_DEFAULT_FILTERTING_RULES + IPV6_DEFAULT_LAN_FILTERTING_RULES];
- /* create additional set of v6 RT-rules in Wanv6RT table*/
- uint32_t dft_rt_rule_hdl[MAX_DEFAULT_v4_ROUTE_RULES+2*MAX_DEFAULT_v6_ROUTE_RULES];
+ /* IPACM number of default route rules for ipv6*/
+ int num_dft_rt_v6;
- ipa_ioc_query_intf *iface_query;
- ipa_ioc_query_intf_tx_props *tx_prop;
- ipa_ioc_query_intf_rx_props *rx_prop;
+ uint32_t dft_v4fl_rule_hdl[IPV4_DEFAULT_FILTERTING_RULES];
+ uint32_t dft_v6fl_rule_hdl[IPV6_DEFAULT_FILTERTING_RULES + IPV6_DEFAULT_LAN_FILTERTING_RULES];
+ /* create additional set of v6 RT-rules in Wanv6RT table*/
+ uint32_t dft_rt_rule_hdl[MAX_DEFAULT_v4_ROUTE_RULES+2*MAX_DEFAULT_v6_ROUTE_RULES];
- virtual int handle_down_evt() = 0;
+ ipa_ioc_query_intf *iface_query;
+ ipa_ioc_query_intf_tx_props *tx_prop;
+ ipa_ioc_query_intf_rx_props *rx_prop;
- virtual int handle_addr_evt(ipacm_event_data_addr *data) = 0;
+ virtual int handle_down_evt() = 0;
- IPACM_Iface(int iface_index);
+ virtual int handle_addr_evt(ipacm_event_data_addr *data) = 0;
- virtual void event_callback(ipa_cm_event_id event,
- void *data) = 0;
+ IPACM_Iface(int iface_index);
-
- /* Query ipa_interface_index by given linux interface_index */
- static int iface_ipa_index_query(int interface_index);
-
- /* Query ipa_interface ipv4_addr by given linux interface_index */
- static void iface_addr_query(int interface_index);
+ virtual void event_callback(ipa_cm_event_id event,
+ void *data) = 0;
- /*Query the IPA endpoint property */
- int query_iface_property(void);
+ /* Query ipa_interface_index by given linux interface_index */
+ static int iface_ipa_index_query(int interface_index);
+
+ /* Query ipa_interface ipv4_addr by given linux interface_index */
+ static void iface_addr_query(int interface_index);
+
+ /*Query the IPA endpoint property */
+ int query_iface_property(void);
/*Configure the initial filter rules */
virtual int init_fl_rule(ipa_ip_type iptype);
@@ -135,13 +134,12 @@
/* used to get filtering rule index in table */
int flt_rule_count_v4;
-
- int flt_rule_count_v6;
+ int flt_rule_count_v6;
private:
- static const char *DEVICE_NAME;
+ static const char *DEVICE_NAME;
};
#endif /* IPACM_IFACE_H */
diff --git a/ipacm/inc/IPACM_Lan.h b/ipacm/inc/IPACM_Lan.h
index 9f8ffee..6c41863 100644
--- a/ipacm/inc/IPACM_Lan.h
+++ b/ipacm/inc/IPACM_Lan.h
@@ -136,7 +136,7 @@
int handle_addr_evt(ipacm_event_data_addr *data);
/* install UL filter rule from Q6 */
- int handle_uplink_filter_rule(ipacm_ext_prop* prop, ipa_ip_type iptype);
+ virtual int handle_uplink_filter_rule(ipacm_ext_prop* prop, ipa_ip_type iptype);
int add_lan2lan_flt_rule(ipa_ip_type iptype, uint32_t src_v4_addr, uint32_t dst_v4_addr, uint32_t* src_v6_addr, uint32_t* dst_v6_addr, uint32_t* rule_hdl);
@@ -153,9 +153,9 @@
protected:
- int add_dummy_lan2lan_flt_rule(ipa_ip_type iptype);
+ virtual int add_dummy_lan2lan_flt_rule(ipa_ip_type iptype);
- int reset_lan2lan_dummy_flt_rule(ipa_ip_type iptype, uint32_t rule_hdl);
+ int reset_to_dummy_flt_rule(ipa_ip_type iptype, uint32_t rule_hdl);
/*handle lan2lan client active*/
int handle_lan2lan_client_active(ipacm_event_data_all *data, ipa_cm_event_id event);
@@ -171,6 +171,15 @@
lan2lan_hdr_hdl lan2lan_hdr_hdl_v4[MAX_OFFLOAD_PAIR];
lan2lan_hdr_hdl lan2lan_hdr_hdl_v6[MAX_OFFLOAD_PAIR];
+ /* store ipv4 UL filter rule handlers from Q6*/
+ uint32_t wan_ul_fl_rule_hdl_v4[MAX_WAN_UL_FILTER_RULES];
+
+ /* store ipv6 UL filter rule handlers from Q6*/
+ uint32_t wan_ul_fl_rule_hdl_v6[MAX_WAN_UL_FILTER_RULES];
+
+ int num_wan_ul_fl_rule_v4;
+ int num_wan_ul_fl_rule_v6;
+
bool is_active;
private:
@@ -302,16 +311,7 @@
/*handle lan iface down event*/
int handle_down_evt();
- /* store ipv4 UL filter rule handlers from Q6*/
- uint32_t wan_ul_fl_rule_hdl_v4[MAX_WAN_UL_FILTER_RULES];
-
- /* store ipv6 UL filter rule handlers from Q6*/
- uint32_t wan_ul_fl_rule_hdl_v6[MAX_WAN_UL_FILTER_RULES];
-
void post_lan2lan_client_disconnect_msg();
-
- int num_wan_ul_fl_rule_v4;
- int num_wan_ul_fl_rule_v6;
};
#endif /* IPACM_LAN_H */
diff --git a/ipacm/inc/IPACM_Wlan.h b/ipacm/inc/IPACM_Wlan.h
index 78b7950..b351a68 100644
--- a/ipacm/inc/IPACM_Wlan.h
+++ b/ipacm/inc/IPACM_Wlan.h
@@ -87,7 +87,8 @@
static int total_num_wifi_clients;
- void event_callback(ipa_cm_event_id event, void *data);
+ void event_callback(ipa_cm_event_id event,
+ void *data);
virtual int add_lan2lan_hdr(ipa_ip_type iptype, uint8_t* src_mac, uint8_t* dst_mac, uint32_t* hdr_hdl);
@@ -98,6 +99,13 @@
int header_name_count;
int num_wifi_client;
+ int wlan_ap_index;
+
+ static uint32_t* dummy_flt_rule_hdl_v4;
+ static uint32_t* dummy_flt_rule_hdl_v6;
+
+ static int num_wlan_ap_iface;
+
NatApp *Nat_App;
inline ipa_wlan_client* get_client_memptr(ipa_wlan_client *param, int cnt)
@@ -149,7 +157,7 @@
{
if((tx_prop->tx[tx_index].ip == IPA_IP_v4) && (get_client_memptr(wlan_client, clt_indx)->route_rule_set_v4==true)) /* for ipv4 */
{
- IPACMDBG("Delete client index %d ipv4 Qos rules for tx:%d \n", clt_indx,tx_index);
+ IPACMDBG("Delete client index %d ipv4 Qos rules for tx:%d \n",clt_indx,tx_index);
rt_hdl = get_client_memptr(wlan_client, clt_indx)->wifi_rt_hdl[tx_index].wifi_rt_rule_hdl_v4;
if(m_routing.DeleteRoutingHdl(rt_hdl, IPA_IP_v4) == false)
@@ -222,6 +230,26 @@
/*handle wlan iface down event*/
int handle_down_evt();
+
+ /* add dummy filtering rules for WLAN AP-AP mode support */
+ void add_dummy_flt_rule();
+
+ /* install dummy filtering rules for WLAN AP-AP mode support */
+ int install_dummy_flt_rule(ipa_ip_type iptype, int num_rule);
+
+ /* delete dummy flt rule for WLAN AP-AP mode support*/
+ void del_dummy_flt_rule();
+
+ /*Configure the initial filter rules */
+ virtual int init_fl_rule(ipa_ip_type iptype);
+
+ virtual int add_dummy_lan2lan_flt_rule(ipa_ip_type iptype);
+
+ /*configure private subnet filter rules*/
+ virtual int handle_private_subnet(ipa_ip_type iptype);
+
+ /* install UL filter rule from Q6 */
+ virtual int handle_uplink_filter_rule(ipacm_ext_prop* prop, ipa_ip_type iptype);
};
diff --git a/ipacm/src/IPACM_Iface.cpp b/ipacm/src/IPACM_Iface.cpp
index 79c99e8..c274a3d 100644
--- a/ipacm/src/IPACM_Iface.cpp
+++ b/ipacm/src/IPACM_Iface.cpp
@@ -39,6 +39,7 @@
*/
#include <fcntl.h>
#include <sys/ioctl.h>
+#include <ifaddrs.h>
#include <IPACM_Netlink.h>
#include <IPACM_Iface.h>
diff --git a/ipacm/src/IPACM_Lan.cpp b/ipacm/src/IPACM_Lan.cpp
index c71042a..5063e36 100644
--- a/ipacm/src/IPACM_Lan.cpp
+++ b/ipacm/src/IPACM_Lan.cpp
@@ -169,11 +169,10 @@
|| ((data->iptype==IPA_IP_v6) && (num_dft_rt_v6!=MAX_DEFAULT_v6_ROUTE_RULES)))
{
IPACMDBG("Got IPA_ADDR_ADD_EVENT ip-family:%d, v6 num %d: \n",data->iptype,num_dft_rt_v6);
- if(handle_addr_evt(data)==IPACM_FAILURE)
+ if(handle_addr_evt(data) == IPACM_FAILURE)
{
return;
}
-
handle_private_subnet(data->iptype);
if (IPACM_Wan::isWanUP())
@@ -478,7 +477,7 @@
dft_rt_rule_hdl[0] = rt_rule_entry->rt_rule_hdl;
IPACMDBG("ipv4 iface rt-rule hdl1=0x%x\n", dft_rt_rule_hdl[0]);
/* initial multicast/broadcast/fragment filter rule */
- IPACM_Iface::init_fl_rule(data->iptype);
+ init_fl_rule(data->iptype);
add_dummy_lan2lan_flt_rule(data->iptype);
}
else
@@ -565,7 +564,7 @@
if (num_dft_rt_v6 == 0)
{
/* initial multicast/broadcast/fragment filter rule */
- IPACM_Iface::init_fl_rule(data->iptype);
+ init_fl_rule(data->iptype);
add_dummy_lan2lan_flt_rule(data->iptype);
}
num_dft_rt_v6++;
@@ -851,7 +850,7 @@
if ((num_dft_rt_v6 ==1 && iptype ==IPA_IP_v6) ||
(iptype ==IPA_IP_v4))
{
- IPACMDBG("num_dft_rt_v6 %d iptype %d\n", num_dft_rt_v6,iptype);
+ IPACMDBG("num_dft_rt_v6 %d iptype %d\n", num_dft_rt_v6, iptype);
ret = handle_uplink_filter_rule(ext_prop, iptype);
}
return ret;
@@ -1517,7 +1516,6 @@
int IPACM_Lan::handle_down_evt()
{
int i;
- uint32_t tx_index;
int res = IPACM_SUCCESS;
/* no iface address up, directly close iface*/
@@ -2321,7 +2319,7 @@
if(lan2lan_flt_rule_hdl_v4[i].rule_hdl == rule_hdl)
{
assert(lan2lan_flt_rule_hdl_v4[i].valid == true);
- if(reset_lan2lan_dummy_flt_rule(IPA_IP_v4, rule_hdl) == IPACM_FAILURE)
+ if(reset_to_dummy_flt_rule(IPA_IP_v4, rule_hdl) == IPACM_FAILURE)
{
IPACMERR("Failed to delete lan2lan v4 flt rule %d\n", rule_hdl);
return IPACM_FAILURE;
@@ -2346,7 +2344,7 @@
if(lan2lan_flt_rule_hdl_v6[i].rule_hdl == rule_hdl)
{
assert(lan2lan_flt_rule_hdl_v6[i].valid == true);
- if(reset_lan2lan_dummy_flt_rule(IPA_IP_v6, rule_hdl) == IPACM_FAILURE)
+ if(reset_to_dummy_flt_rule(IPA_IP_v6, rule_hdl) == IPACM_FAILURE)
{
IPACMERR("Failed to delete lan2lan v6 flt rule %d\n", rule_hdl);
return IPACM_FAILURE;
@@ -2373,7 +2371,7 @@
return IPACM_SUCCESS;
}
-int IPACM_Lan::reset_lan2lan_dummy_flt_rule(ipa_ip_type iptype, uint32_t rule_hdl)
+int IPACM_Lan::reset_to_dummy_flt_rule(ipa_ip_type iptype, uint32_t rule_hdl)
{
int len, res = IPACM_SUCCESS;
struct ipa_flt_rule_mdfy flt_rule;
@@ -2385,7 +2383,7 @@
if (pFilteringTable == NULL)
{
- IPACMERR("Error allocate lan2lan flt rule memory...\n");
+ IPACMERR("Error allocate flt rule memory...\n");
return IPACM_FAILURE;
}
memset(pFilteringTable, 0, len);
@@ -2403,7 +2401,7 @@
if(iptype == IPA_IP_v4)
{
- IPACMDBG("Reset IPv4 lan2lan flt rule to dummy\n");
+ IPACMDBG("Reset IPv4 flt rule to dummy\n");
flt_rule.rule.attrib.attrib_mask = IPA_FLT_SRC_ADDR | IPA_FLT_DST_ADDR;
flt_rule.rule.attrib.u.v4.dst_addr = ~0;
@@ -2426,7 +2424,7 @@
}
else if(iptype == IPA_IP_v6)
{
- IPACMDBG("Reset IPv6 lan2lan flt rule to dummy\n");
+ IPACMDBG("Reset IPv6 flt rule to dummy\n");
flt_rule.rule.attrib.attrib_mask = IPA_FLT_SRC_ADDR | IPA_FLT_DST_ADDR;
flt_rule.rule.attrib.u.v6.src_addr[0] = ~0;
diff --git a/ipacm/src/IPACM_Wan.cpp b/ipacm/src/IPACM_Wan.cpp
index bd58563..4df0467 100644
--- a/ipacm/src/IPACM_Wan.cpp
+++ b/ipacm/src/IPACM_Wan.cpp
@@ -1,4 +1,4 @@
-/*
+/*
Copyright (c) 2013, The Linux Foundation. All rights reserved.
Redistribution and use in source and binary forms, with or without
@@ -67,9 +67,9 @@
num_firewall_v6 = 0;
wan_route_rule_v4_hdl = (uint32_t *)calloc(iface_query->num_tx_props, sizeof(uint32_t));
- wan_route_rule_v6_hdl = (uint32_t *)calloc(iface_query->num_tx_props, sizeof(uint32_t));
+ wan_route_rule_v6_hdl = (uint32_t *)calloc(iface_query->num_tx_props, sizeof(uint32_t));
wan_route_rule_v6_hdl_a5 = (uint32_t *)calloc(iface_query->num_tx_props, sizeof(uint32_t));
-
+
m_is_sta_mode = is_sta_mode;
active_v4 = false;
@@ -83,8 +83,13 @@
if(m_is_sta_mode == false)
{
+ IPACMDBG("The new WAN interface is modem.\n");
query_ext_prop();
}
+ else
+ {
+ IPACMDBG("The new WAN interface is WLAN STA.\n");
+ }
m_fd_ipa = open(IPA_DEVICE_NAME, O_RDWR);
if(0 == m_fd_ipa)
@@ -110,36 +115,36 @@
const int NUM_RULES = 1;
int num_ipv6_addr;
int res = IPACM_SUCCESS;
-
+
if (data->iptype == IPA_IP_v6)
{
for(num_ipv6_addr=0;num_ipv6_addr<num_dft_rt_v6;num_ipv6_addr++)
{
- if((ipv6_addr[num_ipv6_addr][0] == data->ipv6_addr[0]) &&
- (ipv6_addr[num_ipv6_addr][1] == data->ipv6_addr[1]) &&
- (ipv6_addr[num_ipv6_addr][2] == data->ipv6_addr[2]) &&
+ if((ipv6_addr[num_ipv6_addr][0] == data->ipv6_addr[0]) &&
+ (ipv6_addr[num_ipv6_addr][1] == data->ipv6_addr[1]) &&
+ (ipv6_addr[num_ipv6_addr][2] == data->ipv6_addr[2]) &&
(ipv6_addr[num_ipv6_addr][3] == data->ipv6_addr[3]))
{
IPACMDBG("find matched ipv6 address, index:%d \n", num_ipv6_addr);
return IPACM_SUCCESS;
- break;
+ break;
}
- }
+ }
rt_rule = (struct ipa_ioc_add_rt_rule *)
calloc(1, sizeof(struct ipa_ioc_add_rt_rule) +
NUM_RULES * sizeof(struct ipa_rt_rule_add));
-
+
if (!rt_rule)
{
IPACMERR("Error Locate ipa_ioc_add_rt_rule memory...\n");
return IPACM_FAILURE;
}
-
+
rt_rule->commit = 1;
rt_rule->num_rules = NUM_RULES;
rt_rule->ip = data->iptype;
strcpy(rt_rule->rt_tbl_name, IPACM_Iface::ipacmcfg->rt_tbl_v6.name);
-
+
rt_rule_entry = &rt_rule->rules[0];
rt_rule_entry->at_rear = false;
rt_rule_entry->rule.dst = iface_query->excp_pipe; //go to A5
@@ -156,7 +161,7 @@
ipv6_addr[num_dft_rt_v6][1] = data->ipv6_addr[1];
ipv6_addr[num_dft_rt_v6][2] = data->ipv6_addr[2];
ipv6_addr[num_dft_rt_v6][3] = data->ipv6_addr[3];
-
+
if (false == m_routing.AddRoutingRule(rt_rule))
{
IPACMERR("Routing rule addition failed!\n");
@@ -170,7 +175,7 @@
goto fail;
}
dft_rt_rule_hdl[MAX_DEFAULT_v4_ROUTE_RULES + 2*num_dft_rt_v6] = rt_rule_entry->rt_rule_hdl;
-
+
/* setup same rule for v6_wan table*/
strcpy(rt_rule->rt_tbl_name, IPACM_Iface::ipacmcfg->rt_tbl_wan_v6.name);
if (false == m_routing.AddRoutingRule(rt_rule))
@@ -187,23 +192,22 @@
}
dft_rt_rule_hdl[MAX_DEFAULT_v4_ROUTE_RULES + 2*num_dft_rt_v6+1] = rt_rule_entry->rt_rule_hdl;
- IPACMDBG("ipv6 wan iface rt-rule hdl=0x%x hdl=0x%x, num_dft_rt_v6: %d \n",
+ IPACMDBG("ipv6 wan iface rt-rule hdl=0x%x hdl=0x%x, num_dft_rt_v6: %d \n",
dft_rt_rule_hdl[MAX_DEFAULT_v4_ROUTE_RULES + 2*num_dft_rt_v6],
dft_rt_rule_hdl[MAX_DEFAULT_v4_ROUTE_RULES + 2*num_dft_rt_v6+1],num_dft_rt_v6);
-
-
+
if (num_dft_rt_v6 == 0)
{
if(m_is_sta_mode == false)
{
- init_fl_rule_ex(data->iptype);
+ init_fl_rule_ex(data->iptype);
}
else
{
init_fl_rule(data->iptype);
}
- }
- num_dft_rt_v6++;
+ }
+ num_dft_rt_v6++;
}
else
{
@@ -223,7 +227,7 @@
rt_rule_entry = &rt_rule->rules[0];
rt_rule_entry->at_rear = false;
rt_rule_entry->rule.dst = iface_query->excp_pipe; //go to A5
- rt_rule_entry->rule.attrib.attrib_mask = IPA_FLT_DST_ADDR;
+ rt_rule_entry->rule.attrib.attrib_mask = IPA_FLT_DST_ADDR;
/* still need setup v4 default routing rule to A5*/
strcpy(rt_rule->rt_tbl_name, IPACM_Iface::ipacmcfg->rt_tbl_lan_v4.name);
rt_rule_entry->rule.attrib.u.v4.dst_addr = data->ipv4_addr;
@@ -242,7 +246,7 @@
goto fail;
}
dft_rt_rule_hdl[0] = rt_rule_entry->rt_rule_hdl;
- IPACMDBG("ipv4 wan iface rt-rule hdll=0x%x\n", dft_rt_rule_hdl[0]);
+ IPACMDBG("ipv4 wan iface rt-rule hdll=0x%x\n", dft_rt_rule_hdl[0]);
/* initial multicast/broadcast/fragment filter rule */
if(m_is_sta_mode == false)
@@ -253,11 +257,11 @@
{
init_fl_rule(data->iptype);
}
-
+
wan_v4_addr = data->ipv4_addr;
IPACMDBG("Receved wan address:0x%x\n",wan_v4_addr);
}
-
+
IPACMDBG("number of default route rules %d\n", num_dft_rt_v6);
fail:
@@ -318,8 +322,8 @@
ipa_interface_index = iface_ipa_index_query(data->if_index);
if ( (data->iptype == IPA_IP_v4 && data->ipv4_addr == 0) ||
- (data->iptype == IPA_IP_v6 &&
- data->ipv6_addr[0] == 0 && data->ipv6_addr[1] == 0 &&
+ (data->iptype == IPA_IP_v6 &&
+ data->ipv6_addr[0] == 0 && data->ipv6_addr[1] == 0 &&
data->ipv6_addr[2] == 0 && data->ipv6_addr[3] == 0) )
{
IPACMDBG("Invalid address, ignore IPA_ADDR_ADD_EVENT event\n");
@@ -330,8 +334,8 @@
{
IPACMDBG("Get IPA_ADDR_ADD_EVENT: IF ip type %d, incoming ip type %d\n", ip_type, data->iptype);
/* check v4 not setup before, v6 can have 2 iface ip */
- if( ((data->iptype != ip_type) && (ip_type != IPA_IP_MAX))
- || ((data->iptype==IPA_IP_v6) && (num_dft_rt_v6!=MAX_DEFAULT_v6_ROUTE_RULES)))
+ if( ((data->iptype != ip_type) && (ip_type != IPA_IP_MAX))
+ || ((data->iptype==IPA_IP_v6) && (num_dft_rt_v6!=MAX_DEFAULT_v6_ROUTE_RULES)))
{
IPACMDBG("Got IPA_ADDR_ADD_EVENT ip-family:%d, v6 num %d: \n",data->iptype,num_dft_rt_v6);
handle_addr_evt(data);
@@ -456,7 +460,7 @@
{
del_wan_firewall_rule(IPA_IP_v4);
config_wan_firewall_rule(IPA_IP_v4);
-
+
del_wan_firewall_rule(IPA_IP_v6);
config_wan_firewall_rule(IPA_IP_v6);
install_wan_filtering_rule();
@@ -501,7 +505,7 @@
const int NUM = 1;
ipacm_cmd_q_data evt_data;
struct ipa_ioc_copy_hdr sCopyHeader; /* checking if partial header*/
-
+
IPACMDBG("ip-type:%d\n", iptype);
/* copy header from tx-property, see if partial or not */
@@ -514,12 +518,12 @@
}
IPACM_Wan::backhaul_is_sta_mode = m_is_sta_mode;
-
+
for (cnt=0; cnt<tx_prop->num_tx_props; cnt++)
{
if(tx_prop->tx[cnt].ip==iptype)
- break;
- }
+ break;
+ }
if(tx_prop->tx[cnt].hdr_name != NULL)
{
@@ -527,13 +531,13 @@
memcpy(sCopyHeader.name,
tx_prop->tx[cnt].hdr_name,
sizeof(sCopyHeader.name));
-
+
IPACMDBG("header name: %s\n", sCopyHeader.name);
if (m_header.CopyHeader(&sCopyHeader) == false)
{
IPACMERR("ioctl copy header failed");
return IPACM_FAILURE;
- }
+ }
IPACMDBG("header length: %d, paritial: %d\n", sCopyHeader.hdr_len, sCopyHeader.is_partial);
if(sCopyHeader.is_partial)
{
@@ -542,7 +546,7 @@
{
header_partial_default_wan_v4 = true;
}
- else
+ else
{
header_partial_default_wan_v6 = true;
}
@@ -554,10 +558,10 @@
{
header_partial_default_wan_v4 = false;
}
- else
+ else
{
header_partial_default_wan_v6 = false;
- }
+ }
}
}
@@ -579,7 +583,7 @@
IPACMDBG(" WAN table created %s \n", rt_rule->rt_tbl_name);
rt_rule_entry = &rt_rule->rules[0];
rt_rule_entry->at_rear = true;
-
+
if(m_is_sta_mode == true)
{
IPACMDBG(" WAN instance is in STA mode \n");
@@ -587,20 +591,20 @@
{
if(iptype != tx_prop->tx[tx_index].ip)
{
- IPACMDBG("Tx:%d, ip-type: %d conflict ip-type: %d no RT-rule added\n",
- tx_index, tx_prop->tx[tx_index].ip,iptype);
+ IPACMDBG("Tx:%d, ip-type: %d conflict ip-type: %d no RT-rule added\n",
+ tx_index, tx_prop->tx[tx_index].ip,iptype);
continue;
}
- if (iptype == IPA_IP_v4)
+ if (iptype == IPA_IP_v4)
{
strcpy(rt_rule->rt_tbl_name, IPACM_Iface::ipacmcfg->rt_tbl_wan_v4.name);
}
- else
+ else
{
strcpy(rt_rule->rt_tbl_name, IPACM_Iface::ipacmcfg->rt_tbl_v6.name);
- }
-
+ }
+
if (tx_prop->tx[tx_index].hdr_name != NULL)
{
IPACMDBG(" TX- header hdl %s \n", tx_prop->tx[tx_index].hdr_name);
@@ -627,7 +631,7 @@
{
rt_rule_entry->rule.attrib.u.v4.dst_addr = 0;
rt_rule_entry->rule.attrib.u.v4.dst_addr_mask = 0;
-
+
if (false == m_routing.AddRoutingRule(rt_rule))
{
IPACMERR("Routing rule addition failed!\n");
@@ -667,14 +671,14 @@
}
/* add a catch-all rule in wan dl routing table */
-
- if (iptype == IPA_IP_v6)
+
+ if (iptype == IPA_IP_v6)
{
strcpy(rt_rule->rt_tbl_name, IPACM_Iface::ipacmcfg->rt_tbl_wan_v6.name);
memset(rt_rule_entry, 0, sizeof(struct ipa_rt_rule_add));
rt_rule_entry->at_rear = true;
rt_rule_entry->rule.dst = iface_query->excp_pipe; //go to A5
- rt_rule_entry->rule.attrib.attrib_mask = IPA_FLT_DST_ADDR;
+ rt_rule_entry->rule.attrib.attrib_mask = IPA_FLT_DST_ADDR;
rt_rule_entry->rule.attrib.u.v6.dst_addr[0] = 0;
rt_rule_entry->rule.attrib.u.v6.dst_addr[1] = 0;
rt_rule_entry->rule.attrib.u.v6.dst_addr[2] = 0;
@@ -760,7 +764,7 @@
/* Add corresponding ipa_rm_resource_name of TX-endpoint up before IPV6 RT-rule set */
IPACM_Iface::ipacmcfg->AddRmDepend(IPACM_Iface::ipacmcfg->ipa_client_rm_map_tbl[tx_prop->tx[0].dst_pipe],false);
-
+
return IPACM_SUCCESS;
}
@@ -768,7 +772,7 @@
int IPACM_Wan::handle_header_add_evt(uint8_t mac_addr[6])
{
#define WAN_IFACE_INDEX_LEN 2
-
+
uint32_t tx_index,cnt;
int res = IPACM_SUCCESS, len = 0;
char index[WAN_IFACE_INDEX_LEN];
@@ -776,7 +780,7 @@
struct ipa_ioc_add_hdr *pHeaderDescriptor = NULL;
/* start of adding header */
-
+
IPACMDBG("Received Client MAC %02x:%02x:%02x:%02x:%02x:%02x\n",
mac_addr[0], mac_addr[1], mac_addr[2],
mac_addr[3], mac_addr[4], mac_addr[5]);
@@ -785,8 +789,7 @@
{
IPACMDBG("Already add STA full header\n");
return IPACM_SUCCESS;
- }
-
+ }
/* add header to IPA */
len = sizeof(struct ipa_ioc_add_hdr) + (1 * sizeof(struct ipa_hdr_add));
pHeaderDescriptor = (struct ipa_ioc_add_hdr *)calloc(1, len);
@@ -800,7 +803,7 @@
for (cnt=0; cnt<tx_prop->num_tx_props; cnt++)
{
if(tx_prop->tx[cnt].ip==IPA_IP_v4)
- {
+ {
memset(&sCopyHeader, 0, sizeof(sCopyHeader));
memcpy(sCopyHeader.name,
tx_prop->tx[cnt].hdr_name,
@@ -824,14 +827,14 @@
else
{
memcpy(pHeaderDescriptor->hdr[0].hdr,
- sCopyHeader.hdr,
+ sCopyHeader.hdr,
sCopyHeader.hdr_len);
}
/* copy client mac_addr to partial header */
memcpy(&pHeaderDescriptor->hdr[0].hdr[IPA_WLAN_PARTIAL_HDR_OFFSET], mac_addr,
- IPA_MAC_ADDR_SIZE); /* only copy 6 bytes mac-address */
-
+ IPA_MAC_ADDR_SIZE); /* only copy 6 bytes mac-address */
+
pHeaderDescriptor->commit = true;
pHeaderDescriptor->num_hdrs = 1;
@@ -864,21 +867,19 @@
IPACMDBG("add full header name: %s (%x)\n", pHeaderDescriptor->hdr[0].name, pHeaderDescriptor->hdr[0].hdr_hdl);
}
- /* copy ipv4 full header to each TX endpoint property*/
+ /* copy ipv4 full header to each TX endpoint property*/
for (tx_index = 0; tx_index < iface_query->num_tx_props; tx_index++)
{
if(tx_prop->tx[tx_index].ip==IPA_IP_v4)
- {
+ {
memcpy(tx_prop->tx[tx_index].hdr_name, pHeaderDescriptor->hdr[0].name,
sizeof(tx_prop->tx[tx_index].hdr_name));
IPACMDBG("replace full header name: %s (%x) in tx:%d\n", tx_prop->tx[tx_index].hdr_name, pHeaderDescriptor->hdr[0].hdr_hdl,tx_index);
}
- }
- break;
+ }
+ break;
}
- }
-
-
+ }
/* copy partial header for v6 */
for (cnt=0; cnt<tx_prop->num_tx_props; cnt++)
@@ -909,32 +910,30 @@
else
{
memcpy(pHeaderDescriptor->hdr[0].hdr,
- sCopyHeader.hdr,
+ sCopyHeader.hdr,
sCopyHeader.hdr_len);
}
-
+
/* copy client mac_addr to partial header */
memcpy(&pHeaderDescriptor->hdr[0].hdr[IPA_WLAN_PARTIAL_HDR_OFFSET], mac_addr,
- IPA_MAC_ADDR_SIZE); /* only copy 6 bytes mac-address */
-
+ IPA_MAC_ADDR_SIZE); /* only copy 6 bytes mac-address */
pHeaderDescriptor->commit = true;
pHeaderDescriptor->num_hdrs = 1;
-
+
memset(pHeaderDescriptor->hdr[0].name, 0,
sizeof(pHeaderDescriptor->hdr[0].name));
-
+
sprintf(index, "%d", ipa_if_num);
strncpy(pHeaderDescriptor->hdr[0].name, index, sizeof(index));
-
strncat(pHeaderDescriptor->hdr[0].name,
IPA_WAN_PARTIAL_HDR_NAME_v6,
sizeof(IPA_WAN_PARTIAL_HDR_NAME_v6));
-
+
pHeaderDescriptor->hdr[0].hdr_len = sCopyHeader.hdr_len;
pHeaderDescriptor->hdr[0].hdr_hdl = -1;
pHeaderDescriptor->hdr[0].is_partial = 0;
pHeaderDescriptor->hdr[0].status = -1;
-
+
if (m_header.AddHeader(pHeaderDescriptor) == false ||
pHeaderDescriptor->hdr[0].status != 0)
{
@@ -948,33 +947,31 @@
hdr_hdl_sta_v6 = pHeaderDescriptor->hdr[0].hdr_hdl;
IPACMDBG("add full header name: %s (%x)\n", pHeaderDescriptor->hdr[0].name, pHeaderDescriptor->hdr[0].hdr_hdl);
}
-
- /* copy ipv6 full header to each TX endpoint property*/
+ /* copy ipv6 full header to each TX endpoint property*/
for (tx_index = 0; tx_index < iface_query->num_tx_props; tx_index++)
{
if(tx_prop->tx[tx_index].ip==IPA_IP_v6)
- {
+ {
memcpy(tx_prop->tx[tx_index].hdr_name, pHeaderDescriptor->hdr[0].name,
sizeof(tx_prop->tx[tx_index].hdr_name));
IPACMDBG("replace full header name: %s (%x) in tx:%d\n", tx_prop->tx[tx_index].hdr_name, pHeaderDescriptor->hdr[0].hdr_hdl,tx_index);
}
- }
- break;
+ }
+ break;
}
- }
-
-
+ }
+
/* see if default routes are setup before constructing full header */
if(header_partial_default_wan_v4 == true)
- {
- handle_route_add_evt(IPA_IP_v4);
+ {
+ handle_route_add_evt(IPA_IP_v4);
}
-
+
if(header_partial_default_wan_v6 == true)
- {
- handle_route_add_evt(IPA_IP_v6);
+ {
+ handle_route_add_evt(IPA_IP_v6);
}
-
+
fail:
free(pHeaderDescriptor);
@@ -988,13 +985,13 @@
int i, rule_v4 = 0, rule_v6 = 0;
IPACMDBG("ip-family: %d; \n", iptype);
-
+
if (rx_prop == NULL)
{
IPACMDBG("No rx properties registered for iface %s\n", dev_name);
return IPACM_SUCCESS;
}
-
+
/* default firewall is disable and the rule action is drop */
memset(&firewall_config, 0, sizeof(firewall_config));
strncpy(firewall_config.firewall_config_file, "/etc/mobileap_firewall.xml", sizeof(firewall_config.firewall_config_file));
@@ -1068,23 +1065,23 @@
/* firewall disable, all traffic are allowed */
if(firewall_config.firewall_enable == true)
{
- flt_rule_entry.at_rear = true;
+ flt_rule_entry.at_rear = true;
/* default action for v4 is go DST_NAT unless user set to exception*/
if(firewall_config.rule_action_accept == true)
{
- flt_rule_entry.rule.action = IPA_PASS_TO_EXCEPTION;
+ flt_rule_entry.rule.action = IPA_PASS_TO_EXCEPTION;
}
else
{
flt_rule_entry.rule.action = IPA_PASS_TO_DST_NAT;
- }
+ }
}
else
{
flt_rule_entry.at_rear = true;
flt_rule_entry.rule.action = IPA_PASS_TO_DST_NAT;
- }
+ }
flt_rule_entry.rule.rt_tbl_hdl = IPACM_Iface::ipacmcfg->rt_tbl_lan_v4.hdl;
memcpy(&flt_rule_entry.rule.attrib,
@@ -1142,7 +1139,7 @@
IPACMDBG("Routing handle for wan routing table:0x%x\n", IPACM_Iface::ipacmcfg->rt_tbl_lan_v4.hdl);
if(firewall_config.firewall_enable == true)
- {
+ {
rule_v4 = 0;
for (i = 0; i < firewall_config.num_extd_firewall_entries; i++)
{
@@ -1158,13 +1155,13 @@
/* Accept v4 matched rules*/
if(firewall_config.rule_action_accept == true)
{
- flt_rule_entry.rule.action = IPA_PASS_TO_DST_NAT;
+ flt_rule_entry.rule.action = IPA_PASS_TO_DST_NAT;
}
else
{
flt_rule_entry.rule.action = IPA_PASS_TO_EXCEPTION;
- }
-
+ }
+
memcpy(&flt_rule_entry.rule.attrib,
&firewall_config.extd_firewall_entries[i].attrib,
sizeof(struct ipa_rule_attrib));
@@ -1259,24 +1256,24 @@
/* firewall disable, all traffic are allowed */
if(firewall_config.firewall_enable == true)
{
- flt_rule_entry.at_rear = true;
+ flt_rule_entry.at_rear = true;
/* default action for v4 is go DST_NAT unless user set to exception*/
if(firewall_config.rule_action_accept == true)
{
- flt_rule_entry.rule.action = IPA_PASS_TO_EXCEPTION;
+ flt_rule_entry.rule.action = IPA_PASS_TO_EXCEPTION;
}
else
{
flt_rule_entry.rule.action = IPA_PASS_TO_DST_NAT;
- }
+ }
}
else
{
flt_rule_entry.at_rear = true;
flt_rule_entry.rule.action = IPA_PASS_TO_DST_NAT;
- }
-
+ }
+
flt_rule_entry.rule.rt_tbl_hdl = IPACM_Iface::ipacmcfg->rt_tbl_lan_v4.hdl;
memcpy(&flt_rule_entry.rule.attrib,
&rx_prop->rx[0].attrib,
@@ -1342,23 +1339,23 @@
/* firewall disable, all traffic are allowed */
if(firewall_config.firewall_enable == true)
{
- flt_rule_entry.at_rear = true;
+ flt_rule_entry.at_rear = true;
/* default action for v6 is PASS_TO_ROUTE unless user set to exception*/
if(firewall_config.rule_action_accept == true)
{
- flt_rule_entry.rule.action = IPA_PASS_TO_EXCEPTION;
+ flt_rule_entry.rule.action = IPA_PASS_TO_EXCEPTION;
}
else
{
flt_rule_entry.rule.action = IPA_PASS_TO_ROUTING;
- }
+ }
}
else
{
flt_rule_entry.at_rear = true;
flt_rule_entry.rule.action = IPA_PASS_TO_ROUTING;
- }
+ }
memcpy(&flt_rule_entry.rule.attrib,
&rx_prop->rx[0].attrib,
@@ -1417,7 +1414,7 @@
}
if(firewall_config.firewall_enable == true)
- {
+ {
rule_v6 = 0;
for (i = 0; i < firewall_config.num_extd_firewall_entries; i++)
{
@@ -1437,8 +1434,8 @@
else
{
flt_rule_entry.rule.action = IPA_PASS_TO_EXCEPTION;
- }
-
+ }
+
flt_rule_entry.rule.rt_tbl_hdl = IPACM_Iface::ipacmcfg->rt_tbl_wan_v6.hdl;
memcpy(&flt_rule_entry.rule.attrib,
&firewall_config.extd_firewall_entries[i].attrib,
@@ -1519,23 +1516,23 @@
/* firewall disable, all traffic are allowed */
if(firewall_config.firewall_enable == true)
{
- flt_rule_entry.at_rear = true;
+ flt_rule_entry.at_rear = true;
/* default action for v6 is PASS_TO_ROUTE unless user set to exception*/
if(firewall_config.rule_action_accept == true)
{
- flt_rule_entry.rule.action = IPA_PASS_TO_EXCEPTION;
+ flt_rule_entry.rule.action = IPA_PASS_TO_EXCEPTION;
}
else
{
flt_rule_entry.rule.action = IPA_PASS_TO_ROUTING;
- }
+ }
}
else
{
flt_rule_entry.at_rear = true;
flt_rule_entry.rule.action = IPA_PASS_TO_ROUTING;
- }
+ }
memcpy(&flt_rule_entry.rule.attrib,
&rx_prop->rx[0].attrib,
@@ -1615,12 +1612,12 @@
IPACMERR("No firewall xml mentioned \n");
return IPACM_FAILURE;
}
-
+
if (iptype == IPA_IP_v4)
{
original_num_rules = IPACM_Wan::num_v4_flt_rule;
if(firewall_config.firewall_enable == true)
- {
+ {
for (i = 0; i < firewall_config.num_extd_firewall_entries; i++)
{
if (firewall_config.extd_firewall_entries[i].ip_vsn == 4)
@@ -1629,7 +1626,7 @@
flt_rule_entry.at_rear = true;
flt_rule_entry.flt_rule_hdl = -1;
- flt_rule_entry.status = -1;
+ flt_rule_entry.status = -1;
flt_rule_entry.rule.retain_hdr = 1;
flt_rule_entry.rule.to_uc = 0;
@@ -1638,14 +1635,14 @@
/* Accept v4 matched rules*/
if(firewall_config.rule_action_accept == true)
{
- flt_rule_entry.rule.action = IPA_PASS_TO_DST_NAT;
+ flt_rule_entry.rule.action = IPA_PASS_TO_DST_NAT;
}
else
{
flt_rule_entry.rule.action = IPA_PASS_TO_ROUTING;
- }
+ }
- memset(&rt_tbl_idx, 0, sizeof(rt_tbl_idx));
+ memset(&rt_tbl_idx, 0, sizeof(rt_tbl_idx));
rt_tbl_idx.ip = iptype;
if(flt_rule_entry.rule.action == IPA_PASS_TO_ROUTING)
{
@@ -1661,7 +1658,7 @@
IPACMERR("Failed to get routing table index from name\n");
return IPACM_FAILURE;
}
- flt_rule_entry.rule.rt_tbl_idx = rt_tbl_idx.idx;
+ flt_rule_entry.rule.rt_tbl_idx = rt_tbl_idx.idx;
IPACMDBG("Routing table %s has index %d\n", rt_tbl_idx.name, rt_tbl_idx.idx);
@@ -1746,7 +1743,7 @@
/* configure default filter rule */
memset(&flt_rule_entry, 0, sizeof(struct ipa_flt_rule_add));
- flt_rule_entry.at_rear = true;
+ flt_rule_entry.at_rear = true;
flt_rule_entry.flt_rule_hdl = -1;
flt_rule_entry.status = -1;
@@ -1756,23 +1753,23 @@
/* firewall disable, all traffic are allowed */
if(firewall_config.firewall_enable == true)
- {
+ {
/* default action for v4 is go DST_NAT unless user set to exception*/
if(firewall_config.rule_action_accept == true)
{
- flt_rule_entry.rule.action = IPA_PASS_TO_ROUTING;
+ flt_rule_entry.rule.action = IPA_PASS_TO_ROUTING;
}
else
{
flt_rule_entry.rule.action = IPA_PASS_TO_DST_NAT;
- }
+ }
}
else
{
flt_rule_entry.rule.action = IPA_PASS_TO_DST_NAT;
- }
+ }
- memset(&rt_tbl_idx, 0, sizeof(rt_tbl_idx));
+ memset(&rt_tbl_idx, 0, sizeof(rt_tbl_idx));
rt_tbl_idx.ip = iptype;
if(flt_rule_entry.rule.action == IPA_PASS_TO_ROUTING)
@@ -1783,7 +1780,7 @@
{
strncpy(rt_tbl_idx.name, IPACM_Iface::ipacmcfg->rt_tbl_lan_v4.name, IPA_RESOURCE_NAME_MAX);
}
-
+
if(0 != ioctl(m_fd_ipa, IPA_IOC_QUERY_RT_TBL_INDEX, &rt_tbl_idx))
{
IPACMERR("Failed to get routing table index from name\n");
@@ -1792,7 +1789,7 @@
flt_rule_entry.rule.rt_tbl_idx = rt_tbl_idx.idx;
IPACMDBG("Routing table %s has index %d\n", rt_tbl_idx.name, rt_tbl_idx.idx);
-
+
memcpy(&flt_rule_entry.rule.attrib,
&rx_prop->rx[0].attrib,
sizeof(struct ipa_rule_attrib));
@@ -1820,15 +1817,15 @@
pos++;
num_firewall_v4++;
IPACM_Wan::num_v4_flt_rule++;
-
+
num_rules = IPACM_Wan::num_v4_flt_rule - original_num_rules;
}
else
{
original_num_rules = IPACM_Wan::num_v6_flt_rule;
-
+
if(firewall_config.firewall_enable == true)
- {
+ {
for (i = 0; i < firewall_config.num_extd_firewall_entries; i++)
{
if (firewall_config.extd_firewall_entries[i].ip_vsn == 6)
@@ -1844,7 +1841,7 @@
flt_rule_entry.rule.eq_attrib_type = 1;
flt_rule_entry.rule.action = IPA_PASS_TO_ROUTING;
- memset(&rt_tbl_idx, 0, sizeof(rt_tbl_idx));
+ memset(&rt_tbl_idx, 0, sizeof(rt_tbl_idx));
rt_tbl_idx.ip = iptype;
/* matched rules for v6 go PASS_TO_ROUTE */
@@ -1855,7 +1852,7 @@
else
{
strncpy(rt_tbl_idx.name, IPACM_Iface::ipacmcfg->rt_tbl_wan_dl.name, IPA_RESOURCE_NAME_MAX);
- }
+ }
if(0 != ioctl(m_fd_ipa, IPA_IOC_QUERY_RT_TBL_INDEX, &rt_tbl_idx))
{
IPACMERR("Failed to get routing table index from name\n");
@@ -1864,7 +1861,7 @@
flt_rule_entry.rule.rt_tbl_idx = rt_tbl_idx.idx;
IPACMDBG("Routing table %s has index %d\n", rt_tbl_idx.name, rt_tbl_idx.idx);
-
+
memcpy(&flt_rule_entry.rule.attrib,
&firewall_config.extd_firewall_entries[i].attrib,
sizeof(struct ipa_rule_attrib));
@@ -1953,25 +1950,25 @@
flt_rule_entry.rule.eq_attrib_type = 1;
flt_rule_entry.rule.action = IPA_PASS_TO_ROUTING;
- memset(&rt_tbl_idx, 0, sizeof(rt_tbl_idx));
+ memset(&rt_tbl_idx, 0, sizeof(rt_tbl_idx));
rt_tbl_idx.ip = iptype;
/* firewall disable, all traffic are allowed */
if(firewall_config.firewall_enable == true)
- {
+ {
/* default action for v6 is PASS_TO_ROUTE unless user set to exception*/
if(firewall_config.rule_action_accept == true)
{
- strncpy(rt_tbl_idx.name, IPACM_Iface::ipacmcfg->rt_tbl_wan_dl.name, IPA_RESOURCE_NAME_MAX);
+ strncpy(rt_tbl_idx.name, IPACM_Iface::ipacmcfg->rt_tbl_wan_dl.name, IPA_RESOURCE_NAME_MAX);
}
else
{
- strncpy(rt_tbl_idx.name, IPACM_Iface::ipacmcfg->rt_tbl_wan_v6.name, IPA_RESOURCE_NAME_MAX);
- }
+ strncpy(rt_tbl_idx.name, IPACM_Iface::ipacmcfg->rt_tbl_wan_v6.name, IPA_RESOURCE_NAME_MAX);
+ }
}
else
{
- strncpy(rt_tbl_idx.name, IPACM_Iface::ipacmcfg->rt_tbl_wan_v6.name, IPA_RESOURCE_NAME_MAX);
- }
+ strncpy(rt_tbl_idx.name, IPACM_Iface::ipacmcfg->rt_tbl_wan_v6.name, IPA_RESOURCE_NAME_MAX);
+ }
if(0 != ioctl(m_fd_ipa, IPA_IOC_QUERY_RT_TBL_INDEX, &rt_tbl_idx))
{
IPACMERR("Failed to get routing table index from name\n");
@@ -1980,7 +1977,7 @@
flt_rule_entry.rule.rt_tbl_idx = rt_tbl_idx.idx;
IPACMDBG("Routing table %s has index %d\n", rt_tbl_idx.name, rt_tbl_idx.idx);
-
+
memcpy(&flt_rule_entry.rule.attrib,
&rx_prop->rx[1].attrib,
sizeof(struct ipa_rule_attrib));
@@ -2011,7 +2008,7 @@
pos++;
num_firewall_v6++;
IPACM_Wan::num_v6_flt_rule++;
-
+
num_rules = IPACM_Wan::num_v6_flt_rule - original_num_rules;
}
IPACMDBG("Constructed %d firewall rules for ip type %d\n", num_rules, iptype);
@@ -2036,13 +2033,13 @@
return res;
}
- if (ip_type == IPA_IP_v6)
+ if (ip_type == IPA_IP_v6)
{
ip_type = IPA_IP_MAX;
}
- else
+ else
{
- ip_type = IPA_IP_v4;
+ ip_type = IPA_IP_v4;
}
IPACMDBG(" interface(%s:%d) now ip-type is %d\n", dev_name, ipa_if_num, ip_type);
}
@@ -2054,11 +2051,11 @@
return res;
}
- if (ip_type == IPA_IP_v4)
+ if (ip_type == IPA_IP_v4)
{
ip_type = IPA_IP_MAX;
}
- else
+ else
{
ip_type = IPA_IP_v6;
}
@@ -2077,13 +2074,13 @@
/* only wlan may take software-path, not register Rx-property*/
if(strcmp(dev_name,dev_wlan0) == 0 || strcmp(dev_name,dev_wlan1) == 0)
{
- IPACM_Iface::ipacmcfg->AddRmDepend(IPA_RM_RESOURCE_HSIC_PROD,true);
+ IPACM_Iface::ipacmcfg->AddRmDepend(IPA_RM_RESOURCE_HSIC_PROD,true);
IPACMDBG(" add producer dependency from %s without registered rx-prop \n", dev_name);
}
if(strcmp(dev_name,dev_ecm0) == 0)
{
- IPACM_Iface::ipacmcfg->AddRmDepend(IPA_RM_RESOURCE_USB_PROD,true);
+ IPACM_Iface::ipacmcfg->AddRmDepend(IPA_RM_RESOURCE_USB_PROD,true);
IPACMDBG(" add producer dependency from %s without registered rx-prop \n", dev_name);
}
}
@@ -2125,7 +2122,7 @@
if(iptype == IPA_IP_v4)
{
original_num_rules = IPACM_Wan::num_v4_flt_rule;
-
+
memset(&rt_tbl_idx, 0, sizeof(rt_tbl_idx));
strncpy(rt_tbl_idx.name, IPACM_Iface::ipacmcfg->rt_tbl_wan_dl.name, IPA_RESOURCE_NAME_MAX);
rt_tbl_idx.ip = iptype;
@@ -2137,7 +2134,7 @@
}
IPACMDBG("WAN DL routing table %s has index %d\n", IPACM_Iface::ipacmcfg->rt_tbl_wan_dl.name, rt_tbl_idx.idx);
-
+
memset(&flt_rule_entry, 0, sizeof(struct ipa_flt_rule_add));
flt_rule_entry.at_rear = true;
@@ -2227,7 +2224,7 @@
sizeof(flt_rule_entry.rule.eq_attrib));
memcpy(&(rules[rule_offset + ipacm_config->ipa_num_alg_ports + 1 + i]),
- &flt_rule_entry,
+ &flt_rule_entry,
sizeof(struct ipa_flt_rule_add));
IPACM_Wan::num_v4_flt_rule++;
}
@@ -2236,7 +2233,7 @@
else /* IPv6 case */
{
original_num_rules = IPACM_Wan::num_v6_flt_rule;
-
+
memset(&rt_tbl_idx, 0, sizeof(rt_tbl_idx));
strncpy(rt_tbl_idx.name, IPACM_Iface::ipacmcfg->rt_tbl_wan_dl.name, IPA_RESOURCE_NAME_MAX);
rt_tbl_idx.ip = iptype;
@@ -2248,7 +2245,7 @@
}
IPACMDBG("WAN DL routing table %s has index %d\n", IPACM_Iface::ipacmcfg->rt_tbl_wan_dl.name, rt_tbl_idx.idx);
-
+
memset(&flt_rule_entry, 0, sizeof(struct ipa_flt_rule_add));
flt_rule_entry.at_rear = true;
@@ -2284,7 +2281,7 @@
memcpy(&(rules[rule_offset]), &flt_rule_entry, sizeof(struct ipa_flt_rule_add));
IPACM_Wan::num_v6_flt_rule++;
-
+
num_rules = IPACM_Wan::num_v6_flt_rule - original_num_rules;
}
@@ -2325,7 +2322,7 @@
free(ext_prop);
return ret;
}
-
+
IPACMDBG("Wan interface has %d tx props, %d rx props and %d ext props\n", iface_query->num_tx_props, iface_query->num_rx_props, iface_query->num_ext_props);
for (cnt = 0; cnt < ext_prop->num_ext_props; cnt++)
@@ -2333,12 +2330,12 @@
IPACMDBG("Ex(%d): ip-type: %d, mux_id: %d, flt_action: %d\n, rt_tbl_idx: %d, flt_hdr: %d \n",
cnt, ext_prop->ext[cnt].ip, ext_prop->ext[cnt].mux_id, ext_prop->ext[cnt].action, ext_prop->ext[cnt].rt_tbl_idx, ext_prop->ext[cnt].filter_hdl);
}
-
+
IPACM_Iface::ipacmcfg->SetQmapId(ext_prop->ext[0].mux_id);
- if(is_ext_prop_set == false)
+ if(IPACM_Wan::is_ext_prop_set == false)
{
- IPACM_Iface::ipacmcfg->SetExtProp(ext_prop);
- is_ext_prop_set = true;
+ IPACM_Iface::ipacmcfg->SetExtProp(ext_prop);
+ IPACM_Wan::is_ext_prop_set = true;
}
free(ext_prop);
}
@@ -2350,7 +2347,7 @@
int res = IPACM_SUCCESS;
IPACMDBG("Configure WAN DL firewall rules.\n");
-
+
if(iptype == IPA_IP_v4)
{
if(IPACM_FAILURE == add_icmp_alg_rules(flt_rule_v4, IPACM_Wan::num_v4_flt_rule, IPA_IP_v4))
@@ -2428,7 +2425,7 @@
}
IPACMDBG("Routing table %s has index %d\n", rt_tbl_idx.name, rt_tbl_idx.idx);
-
+
memset(&flt_rule_entry, 0, sizeof(struct ipa_flt_rule_add));
flt_rule_entry.at_rear = true;
@@ -2505,7 +2502,7 @@
}
IPACMDBG("Routing table %s has index %d\n", rt_tbl_idx.name, rt_tbl_idx.idx);
-
+
memset(&flt_rule_entry, 0, sizeof(struct ipa_flt_rule_add));
flt_rule_entry.at_rear = true;
@@ -2576,8 +2573,8 @@
sizeof(flt_rule_entry.rule.eq_attrib));
memcpy(&(rules[rule_offset + 1]), &flt_rule_entry, sizeof(struct ipa_flt_rule_add));
-
- /* Configuring fec0::/10 Reserved by IETF Filtering Rule */
+
+ /* Configuring fec0::/10 Reserved by IETF Filtering Rule */
flt_rule_entry.rule.attrib.u.v6.dst_addr_mask[0] = 0xFFC00000;
flt_rule_entry.rule.attrib.u.v6.dst_addr_mask[1] = 0x00000000;
flt_rule_entry.rule.attrib.u.v6.dst_addr_mask[2] = 0x00000000;
@@ -2618,13 +2615,13 @@
if(iptype == IPA_IP_v4)
{
IPACM_Wan::num_v4_flt_rule = IPA_V2_NUM_DEFAULT_WAN_FILTER_RULE_IPV4;
- memset(&IPACM_Wan::flt_rule_v4[IPA_V2_NUM_DEFAULT_WAN_FILTER_RULE_IPV4], 0,
+ memset(&IPACM_Wan::flt_rule_v4[IPA_V2_NUM_DEFAULT_WAN_FILTER_RULE_IPV4], 0,
(IPA_MAX_FLT_RULE - IPA_V2_NUM_DEFAULT_WAN_FILTER_RULE_IPV4) * sizeof(struct ipa_flt_rule_add));
}
else if(iptype == IPA_IP_v6)
{
IPACM_Wan::num_v6_flt_rule = IPA_V2_NUM_DEFAULT_WAN_FILTER_RULE_IPV6;
- memset(&IPACM_Wan::flt_rule_v6[IPA_V2_NUM_DEFAULT_WAN_FILTER_RULE_IPV6], 0,
+ memset(&IPACM_Wan::flt_rule_v6[IPA_V2_NUM_DEFAULT_WAN_FILTER_RULE_IPV6], 0,
(IPA_MAX_FLT_RULE - IPA_V2_NUM_DEFAULT_WAN_FILTER_RULE_IPV6) * sizeof(struct ipa_flt_rule_add));
}
else
@@ -2645,8 +2642,7 @@
IPACMDBG("No rx properties registered for iface %s\n", dev_name);
return IPACM_SUCCESS;
}
-
-
+
if ((iptype == IPA_IP_v4) && (active_v4 == true))
{
if (num_firewall_v4 != 0)
@@ -2714,27 +2710,27 @@
{
IPACMDBG("No tx properties, ignore delete default route setting\n");
return IPACM_SUCCESS;
- }
-
+ }
+
if (((iptype == IPA_IP_v4) && (active_v4 == true)) ||
((iptype == IPA_IP_v6) && (active_v6 == true)))
{
/* Delete corresponding ipa_rm_resource_name of TX-endpoint after delete IPV4/V6 RT-rule */
- IPACM_Iface::ipacmcfg->DelRmDepend(IPACM_Iface::ipacmcfg->ipa_client_rm_map_tbl[tx_prop->tx[0].dst_pipe]);
-
+ IPACM_Iface::ipacmcfg->DelRmDepend(IPACM_Iface::ipacmcfg->ipa_client_rm_map_tbl[tx_prop->tx[0].dst_pipe]);
+
for (tx_index = 0; tx_index < iface_query->num_tx_props; tx_index++)
- {
+ {
if(iptype != tx_prop->tx[tx_index].ip)
{
- IPACMDBG("Tx:%d, ip-type: %d conflict ip-type: %d, no RT-rule deleted\n",
- tx_index, tx_prop->tx[tx_index].ip,iptype);
+ IPACMDBG("Tx:%d, ip-type: %d conflict ip-type: %d, no RT-rule deleted\n",
+ tx_index, tx_prop->tx[tx_index].ip,iptype);
continue;
- }
-
+ }
+
if (iptype == IPA_IP_v4)
{
- IPACMDBG("Tx:%d, ip-type: %d match ip-type: %d, RT-rule deleted\n", tx_index, tx_prop->tx[tx_index].ip,iptype);
+ IPACMDBG("Tx:%d, ip-type: %d match ip-type: %d, RT-rule deleted\n", tx_index, tx_prop->tx[tx_index].ip,iptype);
if (m_routing.DeleteRoutingHdl(wan_route_rule_v4_hdl[tx_index], IPA_IP_v4) == false)
{
@@ -2744,30 +2740,26 @@
}
else
{
- IPACMDBG("Tx:%d, ip-type: %d match ip-type: %d, RT-rule deleted\n", tx_index, tx_prop->tx[tx_index].ip,iptype);
+ IPACMDBG("Tx:%d, ip-type: %d match ip-type: %d, RT-rule deleted\n", tx_index, tx_prop->tx[tx_index].ip,iptype);
if (m_routing.DeleteRoutingHdl(wan_route_rule_v6_hdl[tx_index], IPA_IP_v6) == false)
{
IPACMDBG("IP-family:%d, Routing rule(hdl:0x%x) deletion failed with tx_index %d!\n", IPA_IP_v6, wan_route_rule_v6_hdl[tx_index], tx_index);
return IPACM_FAILURE;
}
-
}
}
-
- /* Delete the default wan route*/
-
+
+ /* Delete the default wan route*/
if (iptype == IPA_IP_v6)
{
- IPACMDBG("ip-type %d: default v6 wan RT-rule deleted\n",iptype);
-
- if (m_routing.DeleteRoutingHdl(wan_route_rule_v6_hdl_a5[0], IPA_IP_v6) == false)
- {
- IPACMDBG("IP-family:%d, Routing rule(hdl:0x%x) deletion failed!\n",IPA_IP_v6,wan_route_rule_v6_hdl_a5[0]);
- return IPACM_FAILURE;
- }
+ IPACMDBG("ip-type %d: default v6 wan RT-rule deleted\n",iptype);
+ if (m_routing.DeleteRoutingHdl(wan_route_rule_v6_hdl_a5[0], IPA_IP_v6) == false)
+ {
+ IPACMDBG("IP-family:%d, Routing rule(hdl:0x%x) deletion failed!\n",IPA_IP_v6,wan_route_rule_v6_hdl_a5[0]);
+ return IPACM_FAILURE;
}
-
+ }
ipacm_event_iface_up *wandown_data;
wandown_data = (ipacm_event_iface_up *)malloc(sizeof(ipacm_event_iface_up));
if (wandown_data == NULL)
@@ -2786,7 +2778,7 @@
/* Insert IPA_HANDLE_WAN_DOWN to command queue */
IPACMDBG("posting IPA_HANDLE_WAN_DOWN for IPv4 \n");
IPACM_EvtDispatcher::PostEvt(&evt_data);
- IPACMDBG("setup wan_up/active_v4= false \n");
+ IPACMDBG("setup wan_up/active_v4= false \n");
IPACM_Wan::wan_up = false;
active_v4 = false;
}
@@ -2798,8 +2790,7 @@
/* Insert IPA_HANDLE_WAN_DOWN to command queue */
IPACMDBG("posting IPA_HANDLE_WAN_DOWN for IPv6 \n");
IPACM_EvtDispatcher::PostEvt(&evt_data);
-
- IPACMDBG("setup wan_up_v6/active_v6= false \n");
+ IPACMDBG("setup wan_up_v6/active_v6= false \n");
IPACM_Wan::wan_up_v6 = false;
active_v6 = false;
}
@@ -2822,27 +2813,25 @@
{
IPACMDBG("No tx properties, ignore delete default route setting\n");
return IPACM_SUCCESS;
- }
+ }
if (((iptype == IPA_IP_v4) && (active_v4 == true)) ||
((iptype == IPA_IP_v6) && (active_v6 == true)))
{
/* Delete corresponding ipa_rm_resource_name of TX-endpoint after delete IPV4/V6 RT-rule */
- IPACM_Iface::ipacmcfg->DelRmDepend(IPACM_Iface::ipacmcfg->ipa_client_rm_map_tbl[tx_prop->tx[0].dst_pipe]);
+ IPACM_Iface::ipacmcfg->DelRmDepend(IPACM_Iface::ipacmcfg->ipa_client_rm_map_tbl[tx_prop->tx[0].dst_pipe]);
- /* Delete the default route*/
-
- if (iptype == IPA_IP_v6)
+ /* Delete the default route*/
+ if (iptype == IPA_IP_v6)
+ {
+ IPACMDBG("ip-type %d: default v6 wan RT-rule deleted\n",iptype);
+ if (m_routing.DeleteRoutingHdl(wan_route_rule_v6_hdl_a5[0], IPA_IP_v6) == false)
{
- IPACMDBG("ip-type %d: default v6 wan RT-rule deleted\n",iptype);
-
- if (m_routing.DeleteRoutingHdl(wan_route_rule_v6_hdl_a5[0], IPA_IP_v6) == false)
- {
- IPACMDBG("IP-family:%d, Routing rule(hdl:0x%x) deletion failed!\n",IPA_IP_v6,wan_route_rule_v6_hdl_a5[0]);
- return IPACM_FAILURE;
- }
+ IPACMDBG("IP-family:%d, Routing rule(hdl:0x%x) deletion failed!\n",IPA_IP_v6,wan_route_rule_v6_hdl_a5[0]);
+ return IPACM_FAILURE;
}
+ }
ipacm_event_iface_up *wandown_data;
wandown_data = (ipacm_event_iface_up *)malloc(sizeof(ipacm_event_iface_up));
@@ -2852,7 +2841,7 @@
return IPACM_FAILURE;
}
memset(wandown_data, 0, sizeof(ipacm_event_iface_up));
-
+
if (iptype == IPA_IP_v4)
{
wandown_data->ipv4_addr = wan_v4_addr;
@@ -2863,7 +2852,7 @@
IPACMDBG("posting IPA_HANDLE_WAN_DOWN for IPv4 with address: 0x%x\n", wan_v4_addr);
IPACM_EvtDispatcher::PostEvt(&evt_data);
- IPACMDBG("setup wan_up/active_v4= false \n");
+ IPACMDBG("setup wan_up/active_v4= false \n");
IPACM_Wan::wan_up = false;
active_v4 = false;
}
@@ -2877,7 +2866,7 @@
IPACMDBG("setup wan_up_v6/active_v6= false \n");
IPACM_Wan::wan_up_v6 = false;
- active_v6 = false;
+ active_v6 = false;
}
}
else
@@ -2958,7 +2947,7 @@
{
handle_software_routing_disable();
}
-
+
/* free filter rule handlers */
if (ip_type != IPA_IP_v6 && rx_prop != NULL)
{
@@ -2989,7 +2978,6 @@
IPACMDBG("finished delete default v6 filtering rules\n ");
}
-
/* delete the complete header for STA mode*/
if((header_set_v4 == true) || (header_set_v6 == true))
{
@@ -2999,7 +2987,7 @@
res = IPACM_FAILURE;
goto fail;
}
-
+
if (m_header.DeleteHeaderHdl(hdr_hdl_sta_v6) == false)
{
IPACMERR("ErrorDeleting STA header for v6, aborting...\n");
@@ -3011,7 +2999,7 @@
fail:
if (tx_prop != NULL)
{
- free(tx_prop);
+ free(tx_prop);
}
if (rx_prop != NULL)
{
@@ -3143,7 +3131,7 @@
fail:
if (tx_prop != NULL)
{
- free(tx_prop);
+ free(tx_prop);
}
if (rx_prop != NULL)
{
@@ -3172,7 +3160,7 @@
int IPACM_Wan::install_wan_filtering_rule()
{
- int len, res;
+ int len, res = IPACM_SUCCESS;
uint8_t mux_id;
ipa_ioc_add_flt_rule *pFilteringTable_v4 = NULL;
ipa_ioc_add_flt_rule *pFilteringTable_v6 = NULL;
@@ -3185,7 +3173,7 @@
pFilteringTable_v4 = (struct ipa_ioc_add_flt_rule*)malloc(len);
IPACMDBG("Total number of WAN DL filtering rule for IPv4 is %d\n", IPACM_Wan::num_v4_flt_rule);
-
+
if (pFilteringTable_v4 == NULL)
{
IPACMERR("Error Locate ipa_flt_rule_add memory...\n");
@@ -3206,7 +3194,7 @@
pFilteringTable_v6 = (struct ipa_ioc_add_flt_rule*)malloc(len);
IPACMDBG("Total number of WAN DL filtering rule for IPv6 is %d\n", IPACM_Wan::num_v6_flt_rule);
-
+
if (pFilteringTable_v6 == NULL)
{
IPACMERR("Error Locate ipa_flt_rule_add memory...\n");
@@ -3232,11 +3220,11 @@
fail:
if(pFilteringTable_v4 != NULL)
{
- free(pFilteringTable_v4);
+ free(pFilteringTable_v4);
}
if(pFilteringTable_v6 != NULL)
{
- free(pFilteringTable_v6);
+ free(pFilteringTable_v6);
}
return res;
}
diff --git a/ipacm/src/IPACM_Wlan.cpp b/ipacm/src/IPACM_Wlan.cpp
index 2fb032a..a1a845a 100644
--- a/ipacm/src/IPACM_Wlan.cpp
+++ b/ipacm/src/IPACM_Wlan.cpp
@@ -52,10 +52,34 @@
/* static member to store the number of total wifi clients within all APs*/
int IPACM_Wlan::total_num_wifi_clients = 0;
+uint32_t* IPACM_Wlan::dummy_flt_rule_hdl_v4 = NULL;
+uint32_t* IPACM_Wlan::dummy_flt_rule_hdl_v6 = NULL;
+int IPACM_Wlan::num_wlan_ap_iface = 0;
+
IPACM_Wlan::IPACM_Wlan(int iface_index) : IPACM_Lan(iface_index)
{
#define WLAN_AMPDU_DEFAULT_FILTER_RULES 3
+ wlan_ap_index = IPACM_Wlan::num_wlan_ap_iface;
+ if(wlan_ap_index < 0 || wlan_ap_index > 1)
+ {
+ IPACMERR("Wlan_ap_index is not correct: %d, not creating instance.\n", wlan_ap_index);
+ if (tx_prop != NULL)
+ {
+ free(tx_prop);
+ }
+ if (rx_prop != NULL)
+ {
+ free(rx_prop);
+ }
+ if (iface_query != NULL)
+ {
+ free(iface_query);
+ }
+ delete this;
+ return;
+ }
+
num_wifi_client = 0;
header_name_count = 0;
@@ -74,6 +98,11 @@
return;
}
+
+ IPACM_Wlan::num_wlan_ap_iface++;
+ IPACMDBG("Now the number of wlan AP iface is %d\n", IPACM_Wlan::num_wlan_ap_iface);
+ add_dummy_flt_rule();
+
IPACMDBG("index:%d constructor: Tx properties:%d\n", iface_index, iface_query->num_tx_props);
return;
}
@@ -123,6 +152,10 @@
ipacm_event_data_fid *data = (ipacm_event_data_fid *)param;
if(data->if_index == ipa_if_num)
{
+ IPACM_Wlan::num_wlan_ap_iface--;
+ IPACMDBG("Now the number of wlan AP iface is %d\n", IPACM_Wlan::num_wlan_ap_iface);
+ del_dummy_flt_rule();
+
IPACMDBG("Received IPA_LAN_DELETE_SELF event.\n");
IPACMDBG("ipa_WLAN (%s):ipa_index (%d) instance close \n", IPACM_Iface::ipacmcfg->iface_table[ipa_if_num].iface_name, ipa_if_num);
delete this;
@@ -179,12 +212,11 @@
IPACM_EvtDispatcher::PostEvt(&evt_data);
}
- if(IPACM_Lan::handle_addr_evt(data)==IPACM_FAILURE)
+ if(handle_addr_evt(data) == IPACM_FAILURE)
{
return;
}
-
- IPACM_Lan::handle_private_subnet(data->iptype);
+ handle_private_subnet(data->iptype);
if (IPACM_Wan::isWanUP())
{
@@ -283,9 +315,14 @@
return;
}
IPACMDBG("Backhaul is sta mode?%d\n", data_wan->is_sta);
+ if(data_wan->is_sta == false && wlan_ap_index > 0)
+ {
+ IPACMDBG("This is not the first AP instance and not STA mode, ignore WAN_DOWN event.\n");
+ return;
+ }
if (rx_prop != NULL)
{
- IPACM_Lan::handle_wan_down(data_wan->is_sta);
+ handle_wan_down(data_wan->is_sta);
}
break;
@@ -298,7 +335,15 @@
return;
}
IPACMDBG("Backhaul is sta mode?%d\n", data_wan->is_sta);
- handle_wan_down_v6(data_wan->is_sta);
+ if(data_wan->is_sta == false && wlan_ap_index > 0)
+ {
+ IPACMDBG("This is not the first AP instance and not STA mode, ignore WAN_DOWN event.\n");
+ return;
+ }
+ if (rx_prop != NULL)
+ {
+ handle_wan_down_v6(data_wan->is_sta);
+ }
break;
case IPA_WLAN_CLIENT_ADD_EVENT_EX:
@@ -423,6 +468,518 @@
return;
}
+/*Configure the initial filter rules */
+int IPACM_Wlan::init_fl_rule(ipa_ip_type iptype)
+{
+ int res = IPACM_SUCCESS, len, offset;
+ struct ipa_flt_rule_mdfy flt_rule;
+ struct ipa_ioc_mdfy_flt_rule* pFilteringTable;
+
+ /* update the iface ip-type to be IPA_IP_v4, IPA_IP_v6 or both*/
+ if (iptype == IPA_IP_v4)
+ {
+ if ((ip_type == IPA_IP_v4) || (ip_type == IPA_IP_MAX))
+ {
+ IPACMDBG("Interface(%s:%d) already in ip-type %d\n", dev_name, ipa_if_num, ip_type);
+ return res;
+ }
+
+ if (ip_type == IPA_IP_v6)
+ {
+ ip_type = IPA_IP_MAX;
+ }
+ else
+ {
+ ip_type = IPA_IP_v4;
+ }
+ IPACMDBG("Interface(%s:%d) now ip-type is %d\n", dev_name, ipa_if_num, ip_type);
+ }
+ else
+ {
+ if ((ip_type == IPA_IP_v6) || (ip_type == IPA_IP_MAX))
+ {
+ IPACMDBG("Interface(%s:%d) already in ip-type %d\n", dev_name, ipa_if_num, ip_type);
+ return res;
+ }
+
+ if (ip_type == IPA_IP_v4)
+ {
+ ip_type = IPA_IP_MAX;
+ }
+ else
+ {
+ ip_type = IPA_IP_v6;
+ }
+
+ IPACMDBG("Interface(%s:%d) now ip-type is %d\n", dev_name, ipa_if_num, ip_type);
+ }
+
+ /* ADD corresponding ipa_rm_resource_name of RX-endpoint before adding all IPV4V6 FT-rules */
+ if(rx_prop != NULL)
+ {
+ IPACM_Iface::ipacmcfg->AddRmDepend(IPACM_Iface::ipacmcfg->ipa_client_rm_map_tbl[rx_prop->rx[0].src_pipe],false);
+ IPACMDBG("Add producer dependency from %s with registered rx-prop\n", dev_name);
+ }
+
+ /* construct ipa_ioc_add_flt_rule with default filter rules */
+ if (iptype == IPA_IP_v4)
+ {
+ if(IPACM_Wlan::dummy_flt_rule_hdl_v4 == NULL)
+ {
+ IPACMERR("Dummy ipv4 flt rule has not been installed.\n");
+ return IPACM_FAILURE;
+ }
+
+ offset = wlan_ap_index * (IPV4_DEFAULT_FILTERTING_RULES + MAX_OFFLOAD_PAIR + IPACM_Iface::ipacmcfg->ipa_num_private_subnet);
+ len = sizeof(struct ipa_ioc_mdfy_flt_rule) + (IPV4_DEFAULT_FILTERTING_RULES * sizeof(struct ipa_flt_rule_mdfy));
+ pFilteringTable = (struct ipa_ioc_mdfy_flt_rule *)calloc(1, len);
+ if (!pFilteringTable)
+ {
+ IPACMERR("Error Locate ipa_ioc_mdfy_flt_rule memory...\n");
+ return IPACM_FAILURE;
+ }
+ memset(pFilteringTable, 0, len);
+
+ pFilteringTable->commit = 1;
+ pFilteringTable->ip = iptype;
+ pFilteringTable->num_rules = (uint8_t)IPV4_DEFAULT_FILTERTING_RULES;
+
+ memset(&flt_rule, 0, sizeof(struct ipa_flt_rule_mdfy));
+
+ flt_rule.status = -1;
+
+ flt_rule.rule.retain_hdr = 1;
+ flt_rule.rule.to_uc = 0;
+ flt_rule.rule.action = IPA_PASS_TO_EXCEPTION;
+ flt_rule.rule.eq_attrib_type = 0;
+
+ /* Configuring Fragment Filtering Rule */
+ IPACMDBG("rx property attrib mask:0x%x\n", rx_prop->rx[0].attrib.attrib_mask);
+ memcpy(&flt_rule.rule.attrib, &rx_prop->rx[0].attrib, sizeof(flt_rule.rule.attrib));
+
+ flt_rule.rule.attrib.attrib_mask |= IPA_FLT_FRAGMENT;
+ flt_rule.rule_hdl = IPACM_Wlan::dummy_flt_rule_hdl_v4[offset];
+ memcpy(&(pFilteringTable->rules[0]), &flt_rule, sizeof(struct ipa_flt_rule_mdfy));
+
+ /* Configuring Multicast Filtering Rule */
+ memcpy(&flt_rule.rule.attrib, &rx_prop->rx[0].attrib, sizeof(flt_rule.rule.attrib));
+
+ flt_rule.rule.attrib.attrib_mask |= IPA_FLT_DST_ADDR;
+ flt_rule.rule.attrib.u.v4.dst_addr_mask = 0xF0000000;
+ flt_rule.rule.attrib.u.v4.dst_addr = 0xE0000000;
+ flt_rule.rule_hdl = IPACM_Wlan::dummy_flt_rule_hdl_v4[offset+1];
+ memcpy(&(pFilteringTable->rules[1]), &flt_rule, sizeof(struct ipa_flt_rule_mdfy));
+
+ /* Configuring Broadcast Filtering Rule */
+ flt_rule.rule.attrib.u.v4.dst_addr_mask = 0xFFFFFFFF;
+ flt_rule.rule.attrib.u.v4.dst_addr = 0xFFFFFFFF;
+ flt_rule.rule_hdl = IPACM_Wlan::dummy_flt_rule_hdl_v4[offset+2];
+ memcpy(&(pFilteringTable->rules[2]), &flt_rule, sizeof(struct ipa_flt_rule_mdfy));
+
+ if (false == m_filtering.ModifyFilteringRule(pFilteringTable))
+ {
+ IPACMERR("Failed to modify default ipv4 filtering rules.\n");
+ res = IPACM_FAILURE;
+ goto fail;
+ }
+ else
+ {
+ /* copy filter hdls */
+ for (int i = 0; i < IPV4_DEFAULT_FILTERTING_RULES; i++)
+ {
+ if (pFilteringTable->rules[i].status == 0)
+ {
+ dft_v4fl_rule_hdl[i] = pFilteringTable->rules[i].rule_hdl;
+ IPACMDBG("Default v4 filter Rule %d HDL:0x%x\n", i, dft_v4fl_rule_hdl[i]);
+ }
+ else
+ {
+ IPACMERR("Failed adding default v4 Filtering rule %d\n", i);
+ }
+ }
+ }
+ }
+ else
+ {
+ if(IPACM_Wlan::dummy_flt_rule_hdl_v6 == NULL)
+ {
+ IPACMERR("Dummy ipv6 flt rule has not been installed.\n");
+ return IPACM_FAILURE;
+ }
+
+ offset = wlan_ap_index * (IPV6_DEFAULT_FILTERTING_RULES + MAX_OFFLOAD_PAIR);
+ len = sizeof(struct ipa_ioc_mdfy_flt_rule) + (IPV6_DEFAULT_FILTERTING_RULES * sizeof(struct ipa_flt_rule_mdfy));
+ pFilteringTable = (struct ipa_ioc_mdfy_flt_rule *)calloc(1, len);
+ if (!pFilteringTable)
+ {
+ IPACMERR("Error Locate ipa_ioc_mdfy_flt_rule memory...\n");
+ return IPACM_FAILURE;
+ }
+ memset(pFilteringTable, 0, len);
+
+ pFilteringTable->commit = 1;
+ pFilteringTable->ip = iptype;
+ pFilteringTable->num_rules = (uint8_t)IPV6_DEFAULT_FILTERTING_RULES;
+
+ memset(&flt_rule, 0, sizeof(struct ipa_flt_rule_mdfy));
+
+ flt_rule.status = -1;
+
+ flt_rule.rule.retain_hdr = 1;
+ flt_rule.rule.to_uc = 0;
+ flt_rule.rule.action = IPA_PASS_TO_EXCEPTION;
+ flt_rule.rule.eq_attrib_type = 0;
+
+ /* Configuring Multicast Filtering Rule */
+ memcpy(&flt_rule.rule.attrib, &rx_prop->rx[0].attrib, sizeof(flt_rule.rule.attrib));
+ flt_rule.rule.attrib.attrib_mask |= IPA_FLT_DST_ADDR;
+ flt_rule.rule.attrib.u.v6.dst_addr_mask[0] = 0xFF000000;
+ flt_rule.rule.attrib.u.v6.dst_addr_mask[1] = 0x00000000;
+ flt_rule.rule.attrib.u.v6.dst_addr_mask[2] = 0x00000000;
+ flt_rule.rule.attrib.u.v6.dst_addr_mask[3] = 0x00000000;
+ flt_rule.rule.attrib.u.v6.dst_addr[0] = 0XFF000000;
+ flt_rule.rule.attrib.u.v6.dst_addr[1] = 0x00000000;
+ flt_rule.rule.attrib.u.v6.dst_addr[2] = 0x00000000;
+ flt_rule.rule.attrib.u.v6.dst_addr[3] = 0X00000000;
+ flt_rule.rule_hdl = IPACM_Wlan::dummy_flt_rule_hdl_v6[offset];
+ memcpy(&(pFilteringTable->rules[0]), &flt_rule, sizeof(struct ipa_flt_rule_mdfy));
+
+ /* Configuring fe80::/10 Link-Scoped Unicast Filtering Rule */
+ flt_rule.rule.attrib.u.v6.dst_addr_mask[0] = 0XFFC00000;
+ flt_rule.rule.attrib.u.v6.dst_addr_mask[1] = 0x00000000;
+ flt_rule.rule.attrib.u.v6.dst_addr_mask[2] = 0x00000000;
+ flt_rule.rule.attrib.u.v6.dst_addr_mask[3] = 0x00000000;
+ flt_rule.rule.attrib.u.v6.dst_addr[0] = 0xFE800000;
+ flt_rule.rule.attrib.u.v6.dst_addr[1] = 0x00000000;
+ flt_rule.rule.attrib.u.v6.dst_addr[2] = 0x00000000;
+ flt_rule.rule.attrib.u.v6.dst_addr[3] = 0X00000000;
+ flt_rule.rule_hdl = IPACM_Wlan::dummy_flt_rule_hdl_v6[offset+1];
+ memcpy(&(pFilteringTable->rules[1]), &flt_rule, sizeof(struct ipa_flt_rule_mdfy));
+
+ /* Configuring fec0::/10 Reserved by IETF Filtering Rule */
+ flt_rule.rule.attrib.u.v6.dst_addr_mask[0] = 0XFFC00000;
+ flt_rule.rule.attrib.u.v6.dst_addr_mask[1] = 0x00000000;
+ flt_rule.rule.attrib.u.v6.dst_addr_mask[2] = 0x00000000;
+ flt_rule.rule.attrib.u.v6.dst_addr_mask[3] = 0x00000000;
+ flt_rule.rule.attrib.u.v6.dst_addr[0] = 0xFEC00000;
+ flt_rule.rule.attrib.u.v6.dst_addr[1] = 0x00000000;
+ flt_rule.rule.attrib.u.v6.dst_addr[2] = 0x00000000;
+ flt_rule.rule.attrib.u.v6.dst_addr[3] = 0X00000000;
+ flt_rule.rule_hdl = IPACM_Wlan::dummy_flt_rule_hdl_v6[offset+2];
+ memcpy(&(pFilteringTable->rules[2]), &flt_rule, sizeof(struct ipa_flt_rule_mdfy));
+
+ if (m_filtering.ModifyFilteringRule(pFilteringTable) == false)
+ {
+ IPACMERR("Failed to modify default ipv6 filtering rules.\n");
+ res = IPACM_FAILURE;
+ goto fail;
+ }
+ else
+ {
+ for (int i = 0; i < IPV6_DEFAULT_FILTERTING_RULES; i++)
+ {
+ if (pFilteringTable->rules[i].status == 0)
+ {
+ dft_v6fl_rule_hdl[i] = pFilteringTable->rules[i].rule_hdl;
+ IPACMDBG("Default v6 Filter Rule %d HDL:0x%x\n", i, dft_v6fl_rule_hdl[i]);
+ }
+ else
+ {
+ IPACMERR("Failing adding v6 default IPV6 rule %d\n", i);
+ }
+ }
+ }
+ }
+
+fail:
+ free(pFilteringTable);
+ return res;
+}
+
+int IPACM_Wlan::add_dummy_lan2lan_flt_rule(ipa_ip_type iptype)
+{
+ if(rx_prop == NULL)
+ {
+ IPACMDBG("There is no rx_prop for iface %s, not able to add dummy lan2lan filtering rule.\n", dev_name);
+ return IPACM_FAILURE;
+ }
+
+ int offset;
+ if(iptype == IPA_IP_v4)
+ {
+ if(IPACM_Wlan::dummy_flt_rule_hdl_v4 == NULL)
+ {
+ IPACMERR("Dummy ipv4 flt rule has not been installed.\n");
+ return IPACM_FAILURE;
+ }
+
+ offset = wlan_ap_index * (IPV4_DEFAULT_FILTERTING_RULES + MAX_OFFLOAD_PAIR + IPACM_Iface::ipacmcfg->ipa_num_private_subnet);
+ for (int i = 0; i < MAX_OFFLOAD_PAIR; i++)
+ {
+ lan2lan_flt_rule_hdl_v4[i].rule_hdl = IPACM_Wlan::dummy_flt_rule_hdl_v4[offset+IPV4_DEFAULT_FILTERTING_RULES+i];
+ lan2lan_flt_rule_hdl_v4[i].valid = false;
+ IPACMDBG("Lan2lan v4 flt rule %d hdl:0x%x\n", i, lan2lan_flt_rule_hdl_v4[i].rule_hdl);
+ }
+ }
+ else if(iptype == IPA_IP_v6)
+ {
+ if(IPACM_Wlan::dummy_flt_rule_hdl_v6 == NULL)
+ {
+ IPACMERR("Dummy ipv6 flt rule has not been installed.\n");
+ return IPACM_FAILURE;
+ }
+
+ offset = wlan_ap_index * (IPV6_DEFAULT_FILTERTING_RULES + MAX_OFFLOAD_PAIR);
+ for (int i = 0; i < MAX_OFFLOAD_PAIR; i++)
+ {
+ lan2lan_flt_rule_hdl_v6[i].rule_hdl = IPACM_Wlan::dummy_flt_rule_hdl_v6[offset+IPV6_DEFAULT_FILTERTING_RULES+i];
+ lan2lan_flt_rule_hdl_v6[i].valid = false;
+ IPACMDBG("Lan2lan v6 flt rule %d hdl:0x%x\n", i, lan2lan_flt_rule_hdl_v6[i].rule_hdl);
+ }
+ }
+ else
+ {
+ IPACMERR("IP type is not expected.\n");
+ return IPACM_FAILURE;
+ }
+
+ return IPACM_SUCCESS;
+}
+
+/* configure private subnet filter rules*/
+int IPACM_Wlan::handle_private_subnet(ipa_ip_type iptype)
+{
+ int i, len, res = IPACM_SUCCESS, offset;
+ struct ipa_flt_rule_mdfy flt_rule;
+ struct ipa_ioc_mdfy_flt_rule* pFilteringTable;
+
+ if (rx_prop == NULL)
+ {
+ IPACMDBG("No rx properties registered for iface %s\n", dev_name);
+ return IPACM_SUCCESS;
+ }
+
+ if (iptype == IPA_IP_v4)
+ {
+ if(IPACM_Wlan::dummy_flt_rule_hdl_v4 == NULL)
+ {
+ IPACMERR("Dummy ipv4 flt rule has not been installed.\n");
+ return IPACM_FAILURE;
+ }
+
+ offset = wlan_ap_index * (IPV4_DEFAULT_FILTERTING_RULES + MAX_OFFLOAD_PAIR + IPACM_Iface::ipacmcfg->ipa_num_private_subnet);
+
+ len = sizeof(struct ipa_ioc_mdfy_flt_rule) + (IPACM_Iface::ipacmcfg->ipa_num_private_subnet) * sizeof(struct ipa_flt_rule_mdfy);
+ pFilteringTable = (struct ipa_ioc_mdfy_flt_rule*)malloc(len);
+ if (!pFilteringTable)
+ {
+ IPACMERR("Failed to allocate ipa_ioc_mdfy_flt_rule memory...\n");
+ return IPACM_FAILURE;
+ }
+ memset(pFilteringTable, 0, len);
+
+ pFilteringTable->commit = 1;
+ pFilteringTable->ip = iptype;
+ pFilteringTable->num_rules = (uint8_t)IPACM_Iface::ipacmcfg->ipa_num_private_subnet;
+
+ /* Make LAN-traffic always go A5, use default IPA-RT table */
+ if (false == m_routing.GetRoutingTable(&IPACM_Iface::ipacmcfg->rt_tbl_default_v4))
+ {
+ IPACMERR("Failed to get routing table handle.\n");
+ res = IPACM_FAILURE;
+ goto fail;
+ }
+
+ memset(&flt_rule, 0, sizeof(struct ipa_flt_rule_mdfy));
+ flt_rule.status = -1;
+
+ flt_rule.rule.retain_hdr = 1;
+ flt_rule.rule.to_uc = 0;
+ flt_rule.rule.action = IPA_PASS_TO_ROUTING;
+ flt_rule.rule.eq_attrib_type = 0;
+ flt_rule.rule.rt_tbl_hdl = IPACM_Iface::ipacmcfg->rt_tbl_default_v4.hdl;
+ IPACMDBG("Private filter rule use table: %s\n",IPACM_Iface::ipacmcfg->rt_tbl_default_v4.name);
+
+ memcpy(&flt_rule.rule.attrib, &rx_prop->rx[0].attrib, sizeof(flt_rule.rule.attrib));
+ flt_rule.rule.attrib.attrib_mask |= IPA_FLT_DST_ADDR;
+
+ for (i = 0; i < (IPACM_Iface::ipacmcfg->ipa_num_private_subnet); i++)
+ {
+ flt_rule.rule_hdl = IPACM_Wlan::dummy_flt_rule_hdl_v4[offset+IPV4_DEFAULT_FILTERTING_RULES + MAX_OFFLOAD_PAIR+i];
+ flt_rule.rule.attrib.u.v4.dst_addr_mask = IPACM_Iface::ipacmcfg->private_subnet_table[i].subnet_mask;
+ flt_rule.rule.attrib.u.v4.dst_addr = IPACM_Iface::ipacmcfg->private_subnet_table[i].subnet_addr;
+ memcpy(&(pFilteringTable->rules[i]), &flt_rule, sizeof(struct ipa_flt_rule_mdfy));
+ }
+
+ if (false == m_filtering.ModifyFilteringRule(pFilteringTable))
+ {
+ IPACMERR("Failed to modify private subnet filtering rules.\n");
+ res = IPACM_FAILURE;
+ goto fail;
+ }
+
+ /* copy filter rule hdls */
+ for (i = 0; i < IPACM_Iface::ipacmcfg->ipa_num_private_subnet; i++)
+ {
+ private_fl_rule_hdl[i] = pFilteringTable->rules[i].rule_hdl;
+ }
+ }
+fail:
+ free(pFilteringTable);
+ return res;
+}
+
+/* install UL filter rule from Q6 */
+int IPACM_Wlan::handle_uplink_filter_rule(ipacm_ext_prop* prop, ipa_ip_type iptype)
+{
+ ipa_flt_rule_add flt_rule_entry;
+ int len = 0, cnt, ret = IPACM_SUCCESS, offset;
+ ipa_ioc_add_flt_rule *pFilteringTable;
+ ipa_fltr_installed_notif_req_msg_v01 flt_index;
+ int fd;
+ int i;
+
+ IPACMDBG("Set extended property rules in LAN\n");
+
+ if (rx_prop == NULL)
+ {
+ IPACMDBG("No rx properties registered for iface %s\n", dev_name);
+ return IPACM_SUCCESS;
+ }
+
+ if(prop == NULL || prop->num_ext_props <= 0)
+ {
+ IPACMDBG("No extended property.\n");
+ return IPACM_SUCCESS;
+ }
+
+ if(wlan_ap_index > 0)
+ {
+ IPACMDBG("This is not the first WLAN AP, do not install modem UL rules.\n");
+ return IPACM_SUCCESS;
+ }
+
+ fd = open(IPA_DEVICE_NAME, O_RDWR);
+ if (0 == fd)
+ {
+ IPACMERR("Failed opening %s.\n", IPA_DEVICE_NAME);
+ }
+
+ memset(&flt_index, 0, sizeof(flt_index));
+ flt_index.source_pipe_index = ioctl(fd, IPA_IOC_QUERY_EP_MAPPING, rx_prop->rx[0].src_pipe);
+ flt_index.install_status = IPA_QMI_RESULT_SUCCESS_V01;
+ flt_index.filter_index_list_len = prop->num_ext_props;
+ flt_index.embedded_pipe_index_valid = 1;
+ flt_index.embedded_pipe_index = ioctl(fd, IPA_IOC_QUERY_EP_MAPPING, IPA_CLIENT_APPS_LAN_WAN_PROD);
+ flt_index.retain_header_valid = 1;
+ flt_index.retain_header = 0;
+ flt_index.embedded_call_mux_id_valid = 1;
+ flt_index.embedded_call_mux_id = IPACM_Iface::ipacmcfg->GetQmapId();
+
+ IPACMDBG("flt_index: src pipe: %d, num of rules: %d, ebd pipe: %d, mux id: %d\n", flt_index.source_pipe_index,
+ flt_index.filter_index_list_len, flt_index.embedded_pipe_index, flt_index.embedded_call_mux_id);
+
+ len = sizeof(struct ipa_ioc_add_flt_rule) + prop->num_ext_props * sizeof(struct ipa_flt_rule_add);
+ pFilteringTable = (struct ipa_ioc_add_flt_rule*)malloc(len);
+ if (pFilteringTable == NULL)
+ {
+ IPACMERR("Error Locate ipa_flt_rule_add memory...\n");
+ return IPACM_FAILURE;
+ }
+ memset(pFilteringTable, 0, len);
+
+ pFilteringTable->commit = 1;
+ pFilteringTable->ep = rx_prop->rx[0].src_pipe;
+ pFilteringTable->global = false;
+ pFilteringTable->ip = iptype;
+ pFilteringTable->num_rules = prop->num_ext_props;
+
+ memset(&flt_rule_entry, 0, sizeof(struct ipa_flt_rule_add)); // Zero All Fields
+ flt_rule_entry.at_rear = 1;
+ flt_rule_entry.flt_rule_hdl = -1;
+ flt_rule_entry.status = -1;
+
+ flt_rule_entry.rule.retain_hdr = 0;
+ flt_rule_entry.rule.to_uc = 0;
+ flt_rule_entry.rule.eq_attrib_type = 1;
+ if(iptype == IPA_IP_v4)
+ flt_rule_entry.rule.action = IPA_PASS_TO_SRC_NAT;
+ else if(iptype == IPA_IP_v6)
+ flt_rule_entry.rule.action = IPA_PASS_TO_ROUTING;
+ else
+ {
+ IPACMERR("IP type is not expected.\n");
+ ret = IPACM_FAILURE;
+ goto fail;
+ }
+
+ if(iptype == IPA_IP_v4)
+ {
+ offset = 2*(IPV4_DEFAULT_FILTERTING_RULES + MAX_OFFLOAD_PAIR + IPACM_Iface::ipacmcfg->ipa_num_private_subnet);
+ }
+ else
+ {
+ offset = 2*(IPV6_DEFAULT_FILTERTING_RULES + MAX_OFFLOAD_PAIR);
+ }
+
+ for(cnt=0; cnt<prop->num_ext_props; cnt++)
+ {
+ memcpy(&flt_rule_entry.rule.eq_attrib,
+ &prop->prop[cnt].eq_attrib,
+ sizeof(prop->prop[cnt].eq_attrib));
+ flt_rule_entry.rule.rt_tbl_idx = prop->prop[cnt].rt_tbl_idx;
+ memcpy(&pFilteringTable->rules[cnt], &flt_rule_entry, sizeof(flt_rule_entry));
+
+ flt_index.filter_index_list[cnt].filter_index = offset+cnt;
+ IPACMDBG("Modem UL filtering rule %d has index %d\n", cnt, offset+cnt);
+
+ flt_index.filter_index_list[cnt].filter_handle = prop->prop[cnt].filter_hdl;
+ }
+
+ if(false == m_filtering.SendFilteringRuleIndex(&flt_index))
+ {
+ IPACMERR("Error sending filtering rule index, aborting...\n");
+ ret = IPACM_FAILURE;
+ goto fail;
+ }
+
+ if(false == m_filtering.AddFilteringRule(pFilteringTable))
+ {
+ IPACMERR("Error Adding RuleTable to Filtering, aborting...\n");
+ ret = IPACM_FAILURE;
+ goto fail;
+ }
+ else
+ {
+ if(iptype == IPA_IP_v4)
+ {
+ for(i=0; i<pFilteringTable->num_rules; i++)
+ {
+ wan_ul_fl_rule_hdl_v4[num_wan_ul_fl_rule_v4] = pFilteringTable->rules[i].flt_rule_hdl;
+ num_wan_ul_fl_rule_v4++;
+ }
+ }
+ else if(iptype == IPA_IP_v6)
+ {
+ for(i=0; i<pFilteringTable->num_rules; i++)
+ {
+ wan_ul_fl_rule_hdl_v6[num_wan_ul_fl_rule_v6] = pFilteringTable->rules[i].flt_rule_hdl;
+ num_wan_ul_fl_rule_v6++;
+ }
+ }
+ else
+ {
+ IPACMERR("IP type is not expected.\n");
+ goto fail;
+ }
+ }
+
+fail:
+ free(pFilteringTable);
+ close(fd);
+ return ret;
+}
+
/* handle wifi client initial,copy all partial headers (tx property) */
int IPACM_Wlan::handle_wlan_client_init_ex(ipacm_event_data_wlan_ex *data)
{
@@ -1148,30 +1705,35 @@
{
IPACMDBG("Delete default v4 filter rules\n");
/* delete default filter rules */
- if (m_filtering.DeleteFilteringHdls(dft_v4fl_rule_hdl,
- IPA_IP_v4,
- IPV4_DEFAULT_FILTERTING_RULES) == false)
+ for(i=0; i<IPV4_DEFAULT_FILTERTING_RULES; i++)
{
- res = IPACM_FAILURE;
- goto fail;
+ if(reset_to_dummy_flt_rule(IPA_IP_v4, dft_v4fl_rule_hdl[i]) == IPACM_FAILURE)
+ {
+ IPACMERR("Error deleting dft IPv4 flt rules.\n");
+ res = IPACM_FAILURE;
+ goto fail;
+ }
+ }
+
+ IPACMDBG("Delete lan2lan v4 flt rules.\n");
+ /* delete lan2lan ipv4 flt rules */
+ for(i=0; i<MAX_OFFLOAD_PAIR; i++)
+ {
+ if(reset_to_dummy_flt_rule(IPA_IP_v4, lan2lan_flt_rule_hdl_v4[i].rule_hdl) == IPACM_FAILURE)
+ {
+ IPACMERR("Error deleting lan2lan IPv4 flt rules.\n");
+ res = IPACM_FAILURE;
+ goto fail;
+ }
}
IPACMDBG("Delete private v4 filter rules\n");
- /* free private-ipv4 filter rules */
- if (m_filtering.DeleteFilteringHdls(
- private_fl_rule_hdl,
- IPA_IP_v4,
- IPACM_Iface::ipacmcfg->ipa_num_private_subnet) == false)
+ /* delete private-ipv4 filter rules */
+ for(i=0; i<IPACM_Iface::ipacmcfg->ipa_num_private_subnet; i++)
{
- res = IPACM_FAILURE;
- goto fail;
- }
-
- for(i=0; i<MAX_OFFLOAD_PAIR; i++)
- {
- if(m_filtering.DeleteFilteringHdls(&(lan2lan_flt_rule_hdl_v4[i].rule_hdl), IPA_IP_v4, 1) == false)
+ if(reset_to_dummy_flt_rule(IPA_IP_v4, private_fl_rule_hdl[i]) == IPACM_FAILURE)
{
- IPACMERR("Error deleting lan2lan IPv4 flt rules.\n");
+ IPACMERR("Error deleting private subnet IPv4 flt rules.\n");
res = IPACM_FAILURE;
goto fail;
}
@@ -1183,25 +1745,28 @@
{
IPACMDBG("Delete default %d v6 filter rules\n", IPV6_DEFAULT_FILTERTING_RULES);
/* delete default filter rules */
- if (m_filtering.DeleteFilteringHdls(dft_v6fl_rule_hdl,
- IPA_IP_v6,
- (IPV6_DEFAULT_FILTERTING_RULES + IPV6_DEFAULT_LAN_FILTERTING_RULES)) == false)
-
+ for(i=0; i<IPV6_DEFAULT_FILTERTING_RULES; i++)
{
- res = IPACM_FAILURE;
- goto fail;
+ if(reset_to_dummy_flt_rule(IPA_IP_v6, dft_v6fl_rule_hdl[i]) == IPACM_FAILURE)
+ {
+ res = IPACM_FAILURE;
+ goto fail;
+ }
}
+
+ IPACMDBG("Delete lan2lan v6 filter rules\n");
+ /* delete lan2lan ipv6 filter rules */
for(i=0; i<MAX_OFFLOAD_PAIR; i++)
{
- if(m_filtering.DeleteFilteringHdls(&(lan2lan_flt_rule_hdl_v6[i].rule_hdl), IPA_IP_v6, 1) == false)
+ if(reset_to_dummy_flt_rule(IPA_IP_v6, lan2lan_flt_rule_hdl_v6[i].rule_hdl) == IPACM_FAILURE)
{
- IPACMERR("Error deleting lan2lan IPv4 flt rules.\n");
+ IPACMERR("Error deleting lan2lan IPv6 flt rules.\n");
res = IPACM_FAILURE;
goto fail;
}
}
}
- IPACMDBG("finished delte default filtering rules\n ");
+ IPACMDBG("finished delete default filtering rules\n ");
/* Delete default v4 RT rule */
if (ip_type != IPA_IP_v6)
@@ -1668,3 +2233,216 @@
free(pHeader);
return res;
}
+
+/* add dummy filtering rules for WLAN AP-AP mode support */
+void IPACM_Wlan::add_dummy_flt_rule()
+{
+ int num_v4_dummy_rule, num_v6_dummy_rule;
+
+ if(IPACM_Wlan::num_wlan_ap_iface == 1)
+ {
+ if(IPACM_Wlan::dummy_flt_rule_hdl_v4 != NULL || IPACM_Wlan::dummy_flt_rule_hdl_v6 != NULL)
+ {
+ IPACMERR("Either v4 or v6 dummy filtering rule handle is not empty.\n");
+ return;
+ }
+
+ num_v4_dummy_rule = 2*(IPV4_DEFAULT_FILTERTING_RULES + MAX_OFFLOAD_PAIR + IPACM_Iface::ipacmcfg->ipa_num_private_subnet);
+ num_v6_dummy_rule = 2*(IPV6_DEFAULT_FILTERTING_RULES + MAX_OFFLOAD_PAIR);
+
+ IPACM_Wlan::dummy_flt_rule_hdl_v4 = (uint32_t*)malloc(num_v4_dummy_rule * sizeof(uint32_t));
+ if(IPACM_Wlan::dummy_flt_rule_hdl_v4 == NULL)
+ {
+ IPACMERR("Failed to allocate memory.\n");
+ return;
+ }
+ IPACM_Wlan::dummy_flt_rule_hdl_v6 = (uint32_t*)malloc(num_v6_dummy_rule * sizeof(uint32_t));
+ if(IPACM_Wlan::dummy_flt_rule_hdl_v6 == NULL)
+ {
+ IPACMERR("Failed to allocate memory.\n");
+ free(IPACM_Wlan::dummy_flt_rule_hdl_v4);
+ IPACM_Wlan::dummy_flt_rule_hdl_v4 = NULL;
+ return;
+ }
+ memset(IPACM_Wlan::dummy_flt_rule_hdl_v4, 0, num_v4_dummy_rule * sizeof(uint32_t));
+ memset(IPACM_Wlan::dummy_flt_rule_hdl_v6, 0, num_v6_dummy_rule * sizeof(uint32_t));
+
+ install_dummy_flt_rule(IPA_IP_v4, num_v4_dummy_rule);
+ install_dummy_flt_rule(IPA_IP_v6, num_v6_dummy_rule);
+ }
+ return;
+}
+
+/* install dummy filtering rules for WLAN AP-AP mode support */
+int IPACM_Wlan::install_dummy_flt_rule(ipa_ip_type iptype, int num_rule)
+{
+ if(rx_prop == NULL)
+ {
+ IPACMDBG("There is no rx_prop for iface %s, not able to add dummy filtering rule.\n", dev_name);
+ return IPACM_FAILURE;
+ }
+
+ int i, len, res = IPACM_SUCCESS;
+ struct ipa_flt_rule_add flt_rule;
+ ipa_ioc_add_flt_rule* pFilteringTable;
+
+ len = sizeof(struct ipa_ioc_add_flt_rule) + num_rule * sizeof(struct ipa_flt_rule_add);
+
+ pFilteringTable = (struct ipa_ioc_add_flt_rule *)malloc(len);
+ if (pFilteringTable == NULL)
+ {
+ IPACMERR("Error allocate flt table memory...\n");
+ return IPACM_FAILURE;
+ }
+ memset(pFilteringTable, 0, len);
+
+ pFilteringTable->commit = 1;
+ pFilteringTable->ep = rx_prop->rx[0].src_pipe;
+ pFilteringTable->global = false;
+ pFilteringTable->ip = iptype;
+ pFilteringTable->num_rules = num_rule;
+
+ memset(&flt_rule, 0, sizeof(struct ipa_flt_rule_add));
+
+ flt_rule.rule.retain_hdr = 0;
+ flt_rule.at_rear = true;
+ flt_rule.flt_rule_hdl = -1;
+ flt_rule.status = -1;
+ flt_rule.rule.action = IPA_PASS_TO_EXCEPTION;
+
+ memcpy(&flt_rule.rule.attrib, &rx_prop->rx[0].attrib,
+ sizeof(flt_rule.rule.attrib));
+
+ if(iptype == IPA_IP_v4)
+ {
+ flt_rule.rule.attrib.attrib_mask = IPA_FLT_SRC_ADDR | IPA_FLT_DST_ADDR;
+ flt_rule.rule.attrib.u.v4.src_addr_mask = ~0;
+ flt_rule.rule.attrib.u.v4.src_addr = ~0;
+ flt_rule.rule.attrib.u.v4.dst_addr_mask = ~0;
+ flt_rule.rule.attrib.u.v4.dst_addr = ~0;
+
+ for(i=0; i<num_rule; i++)
+ {
+ memcpy(&(pFilteringTable->rules[i]), &flt_rule, sizeof(struct ipa_flt_rule_add));
+ }
+
+ if (false == m_filtering.AddFilteringRule(pFilteringTable))
+ {
+ IPACMERR("Error adding dummy ipv4 flt rule\n");
+ res = IPACM_FAILURE;
+ goto fail;
+ }
+ else
+ {
+ /* copy filter rule hdls */
+ for (int i = 0; i < num_rule; i++)
+ {
+ if (pFilteringTable->rules[i].status == 0)
+ {
+ IPACM_Wlan::dummy_flt_rule_hdl_v4[i] = pFilteringTable->rules[i].flt_rule_hdl;
+ IPACMDBG("Dummy v4 flt rule %d hdl:0x%x\n", i, IPACM_Wlan::dummy_flt_rule_hdl_v4[i]);
+ }
+ else
+ {
+ IPACMERR("Failed adding dummy v4 flt rule %d\n", i);
+ res = IPACM_FAILURE;
+ goto fail;
+ }
+ }
+ }
+ }
+ else if(iptype == IPA_IP_v6)
+ {
+ flt_rule.rule.attrib.attrib_mask = IPA_FLT_SRC_ADDR | IPA_FLT_DST_ADDR;
+ flt_rule.rule.attrib.u.v6.src_addr_mask[0] = ~0;
+ flt_rule.rule.attrib.u.v6.src_addr_mask[1] = ~0;
+ flt_rule.rule.attrib.u.v6.src_addr_mask[2] = ~0;
+ flt_rule.rule.attrib.u.v6.src_addr_mask[3] = ~0;
+ flt_rule.rule.attrib.u.v6.src_addr[0] = ~0;
+ flt_rule.rule.attrib.u.v6.src_addr[1] = ~0;
+ flt_rule.rule.attrib.u.v6.src_addr[2] = ~0;
+ flt_rule.rule.attrib.u.v6.src_addr[3] = ~0;
+ flt_rule.rule.attrib.u.v6.dst_addr_mask[0] = ~0;
+ flt_rule.rule.attrib.u.v6.dst_addr_mask[1] = ~0;
+ flt_rule.rule.attrib.u.v6.dst_addr_mask[2] = ~0;
+ flt_rule.rule.attrib.u.v6.dst_addr_mask[3] = ~0;
+ flt_rule.rule.attrib.u.v6.dst_addr[0] = ~0;
+ flt_rule.rule.attrib.u.v6.dst_addr[1] = ~0;
+ flt_rule.rule.attrib.u.v6.dst_addr[2] = ~0;
+ flt_rule.rule.attrib.u.v6.dst_addr[3] = ~0;
+
+ for(i=0; i<num_rule; i++)
+ {
+ memcpy(&(pFilteringTable->rules[i]), &flt_rule, sizeof(struct ipa_flt_rule_add));
+ }
+
+ if (false == m_filtering.AddFilteringRule(pFilteringTable))
+ {
+ IPACMERR("Error adding dummy ipv6 flt rule\n");
+ res = IPACM_FAILURE;
+ goto fail;
+ }
+ else
+ {
+ /* copy filter rule hdls */
+ for (int i = 0; i < num_rule; i++)
+ {
+ if (pFilteringTable->rules[i].status == 0)
+ {
+ IPACM_Wlan::dummy_flt_rule_hdl_v6[i] = pFilteringTable->rules[i].flt_rule_hdl;
+ IPACMDBG("Lan2lan v6 flt rule %d hdl:0x%x\n", i, IPACM_Wlan::dummy_flt_rule_hdl_v6[i]);
+ }
+ else
+ {
+ IPACMERR("Failed adding v6 flt rule %d\n", i);
+ res = IPACM_FAILURE;
+ goto fail;
+ }
+ }
+ }
+ }
+ else
+ {
+ IPACMERR("IP type is not expected.\n");
+ goto fail;
+ }
+
+fail:
+ free(pFilteringTable);
+ return res;
+}
+
+/* delete dummy flt rule for WLAN AP-AP mode support*/
+void IPACM_Wlan::del_dummy_flt_rule()
+{
+ int num_v4_dummy_rule, num_v6_dummy_rule;
+
+ if(IPACM_Wlan::num_wlan_ap_iface == 0)
+ {
+ if(IPACM_Wlan::dummy_flt_rule_hdl_v4 == NULL || IPACM_Wlan::dummy_flt_rule_hdl_v4 == NULL)
+ {
+ IPACMERR("Either v4 or v6 dummy flt rule is empty.\n");
+ return;
+ }
+
+ num_v4_dummy_rule = 2*(IPV4_DEFAULT_FILTERTING_RULES + MAX_OFFLOAD_PAIR + IPACM_Iface::ipacmcfg->ipa_num_private_subnet);
+ num_v6_dummy_rule = 2*(IPV6_DEFAULT_FILTERTING_RULES + MAX_OFFLOAD_PAIR);
+ if(m_filtering.DeleteFilteringHdls(IPACM_Wlan::dummy_flt_rule_hdl_v4, IPA_IP_v4, num_v4_dummy_rule) == false)
+ {
+ IPACMERR("Failed to delete ipv4 dummy flt rules.\n");
+ return;
+ }
+ if(m_filtering.DeleteFilteringHdls(IPACM_Wlan::dummy_flt_rule_hdl_v6, IPA_IP_v6, num_v6_dummy_rule) == false)
+ {
+ IPACMERR("Failed to delete ipv6 dummy flt rules.\n");
+ return;
+ }
+
+ free(IPACM_Wlan::dummy_flt_rule_hdl_v4);
+ IPACM_Wlan::dummy_flt_rule_hdl_v4 = NULL;
+ free(IPACM_Wlan::dummy_flt_rule_hdl_v6);
+ IPACM_Wlan::dummy_flt_rule_hdl_v6 = NULL;
+ }
+ return;
+}
+