Merge "This fix includes:"
diff --git a/ipacm/src/IPACM_Iface.cpp b/ipacm/src/IPACM_Iface.cpp
index 381262e..a713679 100644
--- a/ipacm/src/IPACM_Iface.cpp
+++ b/ipacm/src/IPACM_Iface.cpp
@@ -226,6 +226,12 @@
ipa_ip_type ip;
uint32_t flt_hdl;
+ if (rx_prop == NULL)
+ {
+ IPACMDBG("No rx properties registered for iface %s\n", dev_name);
+ return IPACM_SUCCESS;
+ }
+
if (softwarerouting_act == false)
{
IPACMDBG("already delete AMPDU software_routing rule for (%s)iface ip-family %d\n", IPACM_Iface::ipacmcfg->iface_table[ipa_if_num].iface_name, ip_type);
@@ -446,12 +452,6 @@
struct ipa_flt_rule_add flt_rule_entry;
ipa_ioc_add_flt_rule *m_pFilteringTable;
- if (rx_prop == NULL)
- {
- IPACMDBG("No rx properties registered for iface %s\n", dev_name);
- return IPACM_SUCCESS;
- }
-
/* update the iface ip-type to be IPA_IP_v4, IPA_IP_v6 or both*/
if (iptype == IPA_IP_v4)
{
@@ -493,7 +493,12 @@
IPACMDBG(" interface(%s:%d) now ip-type is %d\n", dev_name, ipa_if_num, ip_type);
}
-
+
+ if (rx_prop == NULL)
+ {
+ IPACMDBG("No rx properties registered for iface %s\n", dev_name);
+ return IPACM_SUCCESS;
+ }
/* construct ipa_ioc_add_flt_rule with default filter rules */
if (iptype == IPA_IP_v4)
diff --git a/ipacm/src/IPACM_Lan.cpp b/ipacm/src/IPACM_Lan.cpp
index 9845409..6934c13 100644
--- a/ipacm/src/IPACM_Lan.cpp
+++ b/ipacm/src/IPACM_Lan.cpp
@@ -1160,14 +1160,14 @@
}
/* check software routing fl rule hdl */
- if (softwarerouting_act == true)
+ if (softwarerouting_act == true && rx_prop != NULL)
{
handle_software_routing_disable();
}
/* delete default filter rules */
- if (ip_type != IPA_IP_v6)
+ if (ip_type != IPA_IP_v6 && rx_prop != NULL)
{
if (m_filtering.DeleteFilteringHdls(dft_v4fl_rule_hdl,
IPA_IP_v4,
@@ -1191,7 +1191,7 @@
}
- if (ip_type != IPA_IP_v4)
+ if (ip_type != IPA_IP_v4 && rx_prop != NULL)
{
if (m_filtering.DeleteFilteringHdls(dft_v6fl_rule_hdl,
IPA_IP_v6,
@@ -1204,7 +1204,7 @@
}
/* delete wan filter rule */
- if (IPACM_Wan::isWanUP())
+ if (IPACM_Wan::isWanUP() && rx_prop != NULL)
{
handle_wan_down();
}
diff --git a/ipacm/src/IPACM_Netlink.cpp b/ipacm/src/IPACM_Netlink.cpp
index 896511d..c2536a3 100644
--- a/ipacm/src/IPACM_Netlink.cpp
+++ b/ipacm/src/IPACM_Netlink.cpp
@@ -1077,7 +1077,6 @@
IPACM_EvtDispatcher::PostEvt(&evt_data);
/* finish command queue */
}
-#if 1
if(msg_ptr->nl_route_info.attr_info.param_mask & IPA_RTA_PARAM_GATEWAY)
{
IPACMDBG("Route ADD ::/0 Next Hop: %04x:%04x:%04x:%04x:%04x:%04x:%04x:%04x, metric %d, dev %s\n",
@@ -1126,7 +1125,6 @@
IPACM_EvtDispatcher::PostEvt(&evt_data);
/* finish command queue */
}
-#endif
}
break;
diff --git a/ipacm/src/IPACM_Wan.cpp b/ipacm/src/IPACM_Wan.cpp
index 54be866..87c84ac 100644
--- a/ipacm/src/IPACM_Wan.cpp
+++ b/ipacm/src/IPACM_Wan.cpp
@@ -58,8 +58,8 @@
active_v4 = false;
active_v6 = false;
- header_set_v4 = false;
- header_set_v6 = false;
+ header_set_v4 = false;
+ header_set_v6 = false;
header_partial_default_wan_v4 = false;
header_partial_default_wan_v6 = false;
hdr_hdl_sta_v4 = 0;
@@ -118,21 +118,21 @@
rt_rule_entry->at_rear = false;
rt_rule_entry->rule.dst = IPA_CLIENT_A5_LAN_WAN_CONS; //go to A5
rt_rule_entry->rule.attrib.attrib_mask = IPA_FLT_DST_ADDR;
- rt_rule_entry->rule.attrib.u.v6.dst_addr[0] = data->ipv6_addr[0];
- rt_rule_entry->rule.attrib.u.v6.dst_addr[1] = data->ipv6_addr[1];
- rt_rule_entry->rule.attrib.u.v6.dst_addr[2] = data->ipv6_addr[2];
- rt_rule_entry->rule.attrib.u.v6.dst_addr[3] = data->ipv6_addr[3];
- rt_rule_entry->rule.attrib.u.v6.dst_addr_mask[0] = 0xFFFFFFFF;
- rt_rule_entry->rule.attrib.u.v6.dst_addr_mask[1] = 0xFFFFFFFF;
- rt_rule_entry->rule.attrib.u.v6.dst_addr_mask[2] = 0xFFFFFFFF;
- rt_rule_entry->rule.attrib.u.v6.dst_addr_mask[3] = 0xFFFFFFFF;
- ipv6_addr[num_dft_rt_v6][0] = data->ipv6_addr[0];
- 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];
+ rt_rule_entry->rule.attrib.u.v6.dst_addr[0] = data->ipv6_addr[0];
+ rt_rule_entry->rule.attrib.u.v6.dst_addr[1] = data->ipv6_addr[1];
+ rt_rule_entry->rule.attrib.u.v6.dst_addr[2] = data->ipv6_addr[2];
+ rt_rule_entry->rule.attrib.u.v6.dst_addr[3] = data->ipv6_addr[3];
+ rt_rule_entry->rule.attrib.u.v6.dst_addr_mask[0] = 0xFFFFFFFF;
+ rt_rule_entry->rule.attrib.u.v6.dst_addr_mask[1] = 0xFFFFFFFF;
+ rt_rule_entry->rule.attrib.u.v6.dst_addr_mask[2] = 0xFFFFFFFF;
+ rt_rule_entry->rule.attrib.u.v6.dst_addr_mask[3] = 0xFFFFFFFF;
+ ipv6_addr[num_dft_rt_v6][0] = data->ipv6_addr[0];
+ 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))
- {
+ if (false == m_routing.AddRoutingRule(rt_rule))
+ {
IPACMERR("Routing rule addition failed!\n");
res = IPACM_FAILURE;
goto fail;
@@ -142,8 +142,8 @@
IPACMERR("rt rule adding failed. Result=%d\n", rt_rule_entry->status);
res = rt_rule_entry->status;
goto fail;
- }
- dft_rt_rule_hdl[MAX_DEFAULT_v4_ROUTE_RULES + 2*num_dft_rt_v6] = rt_rule_entry->rt_rule_hdl;
+ }
+ 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);
@@ -274,7 +274,7 @@
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);
+ IPACMDBG("Got IPA_ADDR_ADD_EVENT ip-family:%d, v6 num %d: \n",data->iptype,num_dft_rt_v6);
handle_addr_evt(data);
}
}
@@ -292,23 +292,18 @@
IPACMDBG("ipv4 addr mask 0x%x\n", data->ipv4_addr_mask);
/* The special below condition is to handle default gateway */
- if ((data->iptype == IPA_IP_v4) && (!data->ipv4_addr) && (!data->ipv4_addr_mask))
+ if ((data->iptype == IPA_IP_v4) && (!data->ipv4_addr) && (!data->ipv4_addr_mask) && (active_v4 == false))
{
IPACMDBG("adding routing table\n");
handle_route_add_evt(data->iptype);
- IPACM_Wan::wan_up = true;
- active_v4 = true;
- config_dft_firewall_rules(IPA_IP_v4);
}
else if ((data->iptype == IPA_IP_v6) &&
- (!data->ipv6_addr[0]) && (!data->ipv6_addr[1]) && (!data->ipv6_addr[2]) && (!data->ipv6_addr[3]))
+ (!data->ipv6_addr[0]) && (!data->ipv6_addr[1]) && (!data->ipv6_addr[2]) && (!data->ipv6_addr[3]) && (active_v6 == false))
{
IPACMDBG("\n get default v6 route (dst:00.00.00.00)\n");
IPACMDBG(" IPV6 value: %08x:%08x:%08x:%08x \n",
data->ipv6_addr[0], data->ipv6_addr[1], data->ipv6_addr[2], data->ipv6_addr[3]);
handle_route_add_evt(data->iptype);
- active_v6 = true;
- config_dft_firewall_rules(IPA_IP_v6);
}
}
}
@@ -436,6 +431,7 @@
}
return IPACM_SUCCESS;
}
+ else
{
if(iptype==IPA_IP_v4)
{
@@ -543,7 +539,7 @@
IPACMERR("Routing rule addition failed!\n");
free(rt_rule);
return IPACM_FAILURE;
- }
+ }
wan_route_rule_v6_hdl[tx_index] = rt_rule_entry->rt_rule_hdl;
IPACMDBG("Set ipv6 wan-route rule hdl for v6_lan_table:0x%x,tx:%d,ip-type: %d \n",
wan_route_rule_v6_hdl[tx_index],
@@ -585,8 +581,11 @@
{
ipacm_event_iface_up *wanup_data;
- wanup_data =
- (ipacm_event_iface_up *)malloc(sizeof(ipacm_event_iface_up));
+ IPACM_Wan::wan_up = true;
+ active_v4 = true;
+ config_dft_firewall_rules(IPA_IP_v4);
+
+ wanup_data = (ipacm_event_iface_up *)malloc(sizeof(ipacm_event_iface_up));
if (wanup_data == NULL)
{
IPACMERR("Unable to allocate memory\n");
@@ -603,6 +602,11 @@
evt_data.evt_data = (void *)wanup_data;
IPACM_EvtDispatcher::PostEvt(&evt_data);
}
+ else
+ {
+ active_v6 = true;
+ config_dft_firewall_rules(IPA_IP_v6);
+ }
return IPACM_SUCCESS;
}
@@ -632,6 +636,8 @@
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);
if (m_routing.DeleteRoutingHdl(wan_route_rule_v4_hdl[tx_index], IPA_IP_v4)
== false)
@@ -643,6 +649,9 @@
}
else
{
+ 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)
{
@@ -920,6 +929,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));
@@ -1516,14 +1532,22 @@
/* make sure default routing rules and firewall rules are deleted*/
if (ip_type != IPA_IP_v6)
{
- del_dft_firewall_rules(IPA_IP_v4);
+ if (rx_prop != NULL)
+ {
+ del_dft_firewall_rules(IPA_IP_v4);
+ }
handle_route_del_evt(IPA_IP_v4);
+ IPACMDBG("Delete default v4 routing rules\n");
}
if (ip_type != IPA_IP_v4)
{
- del_dft_firewall_rules(IPA_IP_v6);
+ if (rx_prop != NULL)
+ {
+ del_dft_firewall_rules(IPA_IP_v6);
+ }
handle_route_del_evt(IPA_IP_v6);
+ IPACMDBG("Delete default v6 routing rules\n");
}
/* Delete default v4 RT rule */
@@ -1565,7 +1589,7 @@
}
/* free filter rule handlers */
- if (ip_type != IPA_IP_v6)
+ if (ip_type != IPA_IP_v6 && rx_prop != NULL)
{
if (m_filtering.DeleteFilteringHdls(dft_v4fl_rule_hdl,
IPA_IP_v4,
@@ -1580,7 +1604,7 @@
}
- if (ip_type != IPA_IP_v4)
+ if (ip_type != IPA_IP_v4 && rx_prop != NULL)
{
if (m_filtering.DeleteFilteringHdls(dft_v6fl_rule_hdl,
IPA_IP_v6,
@@ -1626,6 +1650,13 @@
int IPACM_Wan::del_dft_firewall_rules(ipa_ip_type iptype)
{
/* free v4 firewall filter rule */
+ if (rx_prop == NULL)
+ {
+ 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)
diff --git a/ipacm/src/IPACM_Wlan.cpp b/ipacm/src/IPACM_Wlan.cpp
index cb73879..828ad15 100644
--- a/ipacm/src/IPACM_Wlan.cpp
+++ b/ipacm/src/IPACM_Wlan.cpp
@@ -1057,6 +1057,12 @@
{
IPACMDBG("\n");
+ if (rx_prop == NULL)
+ {
+ IPACMDBG("No rx properties registered for iface %s\n", dev_name);
+ return IPACM_SUCCESS;
+ }
+
if (m_filtering.DeleteFilteringHdls(&wlan_ampdu_flt_rule.hdl[0],
IPA_IP_v4, 1) == false)
{
@@ -1209,6 +1215,11 @@
return IPACM_SUCCESS;
}
+ if (rx_prop == NULL)
+ {
+ IPACMDBG("No rx properties registered for iface %s\n", dev_name);
+ return IPACM_SUCCESS;
+ }
if (ip_type == IPA_IP_MAX)
{
@@ -1633,7 +1644,7 @@
}
/* Delete v6 filtering rules */
- if (ip_type != IPA_IP_v6)
+ if (ip_type != IPA_IP_v6 && rx_prop != NULL)
{
IPACMDBG("Delete default v4 filter rules\n");
/* delete default filter rules */
@@ -1658,7 +1669,7 @@
}
/* Delete v4 filtering rules */
- if (ip_type != IPA_IP_v4)
+ if (ip_type != IPA_IP_v4 && rx_prop != NULL)
{
IPACMDBG("Delete default %d v6 filter rules\n", IPV6_DEFAULT_FILTERTING_RULES);
/* delete default filter rules */
@@ -1673,19 +1684,21 @@
}
IPACMDBG("finished delte default filtering rules\n ");
- /* delete WLAN IPA_CLIENT_A5_WLAN_AMPDU_PROD filter rules*/
- for (i = 3; i < wlan_ampdu_flt_rule.num_rules; i++)
+ if (rx_prop != NULL)
{
- IPACMDBG("Delete WLAN IPA_CLIENT_A5_WLAN_AMPDU_PROD filter rules\n");
- if (m_filtering.DeleteFilteringHdls(&wlan_ampdu_flt_rule.hdl[i],
- wlan_ampdu_flt_rule.ip[i], 1) == false)
- {
- res = IPACM_FAILURE;
- goto fail;
- }
- }
- IPACMDBG("finished delte AMPDU filtering rules\n ");
-
+ /* delete WLAN IPA_CLIENT_A5_WLAN_AMPDU_PROD filter rules*/
+ for (i = 3; i < wlan_ampdu_flt_rule.num_rules; i++)
+ {
+ IPACMDBG("Delete WLAN IPA_CLIENT_A5_WLAN_AMPDU_PROD filter rules\n");
+ if (m_filtering.DeleteFilteringHdls(&wlan_ampdu_flt_rule.hdl[i],
+ wlan_ampdu_flt_rule.ip[i], 1) == false)
+ {
+ res = IPACM_FAILURE;
+ goto fail;
+ }
+ }
+ IPACMDBG("finished delte AMPDU filtering rules\n ");
+ }
/* Delete default v4 RT rule */
if (ip_type != IPA_IP_v6)
@@ -1720,7 +1733,7 @@
/* delete wan filter rule */
- if (IPACM_Wan::isWanUP())
+ if (IPACM_Wan::isWanUP() && rx_prop != NULL)
{
IPACMDBG("Delete wan filtering rules\n");
@@ -1731,7 +1744,7 @@
/* check software routing fl rule hdl */
- if (softwarerouting_act == true)
+ if (softwarerouting_act == true && rx_prop != NULL )
{
IPACMDBG("Delete sw routing filtering rules\n");
IPACM_Iface::handle_software_routing_disable();