Merge "IPACM: fix NAT-rules deleted before RT-rules when power-save"
diff --git a/ipacm/inc/IPACM_ConntrackListener.h b/ipacm/inc/IPACM_ConntrackListener.h
index dac3ea8..43b33c4 100755
--- a/ipacm/inc/IPACM_ConntrackListener.h
+++ b/ipacm/inc/IPACM_ConntrackListener.h
@@ -65,8 +65,6 @@
void TriggerWANDown(uint32_t wan_addr);
int CreateNatThreads(void);
- void HandlePowerSave(void *data);
- void HandleResetPower(void *data);
void HandleNeighIpAddrEvt(void *data, bool);
public:
diff --git a/ipacm/inc/IPACM_Defs.h b/ipacm/inc/IPACM_Defs.h
old mode 100644
new mode 100755
index 7def2e9..18c349a
--- a/ipacm/inc/IPACM_Defs.h
+++ b/ipacm/inc/IPACM_Defs.h
@@ -115,9 +115,7 @@
IPA_HANDLE_WAN_UP, /* 21 ipacm_event_iface_up */
IPA_HANDLE_WAN_DOWN, /* 22 unsigned long */
IPA_HANDLE_WLAN_UP, /* 23 ipacm_event_iface_up */
- IPA_HANDLE_LAN_UP, /* 24 ipacm_event_iface_up */
- IPA_HANDLE_POWER_SAVE, /* 25 ipacm_event_iface_up */
- IPA_HANDLE_RESET_POWER_SAVE /* 26 ipacm_event_iface_up */
+ IPA_HANDLE_LAN_UP /* 24 ipacm_event_iface_up */
} ipa_cm_event_id;
typedef enum
diff --git a/ipacm/inc/IPACM_Wlan.h b/ipacm/inc/IPACM_Wlan.h
old mode 100644
new mode 100755
index fcab846..20eec98
--- a/ipacm/inc/IPACM_Wlan.h
+++ b/ipacm/inc/IPACM_Wlan.h
@@ -47,6 +47,7 @@
#include "IPACM_Filtering.h"
#include "IPACM_Lan.h"
#include "IPACM_Iface.h"
+#include "IPACM_Conntrack_NATApp.h"
typedef struct _wlan_client_rt_hdl
{
@@ -103,6 +104,8 @@
int num_wifi_client;
wlan_ampdu_flt_rules wlan_ampdu_flt_rule;
+ NatApp *Nat_App;
+
inline ipa_wlan_client* get_client_memptr(ipa_wlan_client *param, int cnt)
{
char *ret = ((char *)param) + (wlan_client_len * cnt);
diff --git a/ipacm/src/IPACM_ConntrackListener.cpp b/ipacm/src/IPACM_ConntrackListener.cpp
index 8d9a0e4..56eeb4d 100755
--- a/ipacm/src/IPACM_ConntrackListener.cpp
+++ b/ipacm/src/IPACM_ConntrackListener.cpp
@@ -51,8 +51,6 @@
IPACM_EvtDispatcher::registr(IPA_HANDLE_WAN_DOWN, this);
IPACM_EvtDispatcher::registr(IPA_PROCESS_CT_MESSAGE, this);
IPACM_EvtDispatcher::registr(IPA_HANDLE_WLAN_UP, this);
- IPACM_EvtDispatcher::registr(IPA_HANDLE_POWER_SAVE, this);
- IPACM_EvtDispatcher::registr(IPA_HANDLE_RESET_POWER_SAVE, this);
IPACM_EvtDispatcher::registr(IPA_NEIGH_CLIENT_IP_ADDR_ADD_EVENT, this);
IPACM_EvtDispatcher::registr(IPA_NEIGH_CLIENT_IP_ADDR_DEL_EVENT, this);
}
@@ -118,17 +116,6 @@
}
break;
-
- case IPA_HANDLE_POWER_SAVE:
- IPACMDBG("Received IPA_HANDLE_POWER_SAVE event\n");
- HandlePowerSave(data);
- break;
-
- case IPA_HANDLE_RESET_POWER_SAVE:
- IPACMDBG("Received IPA_HANDLE_RESET_POWER_SAVE event\n");
- HandleResetPower(data);
- break;
-
default:
IPACMDBG("Ignore cmd %d\n", evt);
break;
@@ -254,27 +241,10 @@
}
-void IPACM_ConntrackListener::HandlePowerSave(void *in_param)
-{
- ipacm_event_iface_up *pwrsv_data = (ipacm_event_iface_up *)in_param;
-
- IPACM_ConntrackClient::iptodot("power save ip address",
- pwrsv_data->ipv4_addr);
- NatApp::GetInstance()->UpdatePwrSaveIf(pwrsv_data->ipv4_addr);
-}
-
-void IPACM_ConntrackListener::HandleResetPower(void *in_param)
-{
- ipacm_event_iface_up *pwrsv_data = (ipacm_event_iface_up *)in_param;
-
- IPACM_ConntrackClient::iptodot("Reset power save ip address",
- pwrsv_data->ipv4_addr);
- NatApp::GetInstance()->ResetPwrSaveIf(pwrsv_data->ipv4_addr);
-}
-
void IPACM_ConntrackListener::TriggerWANUp(void *in_param)
{
ipacm_event_iface_up *wanup_data = (ipacm_event_iface_up *)in_param;
+ NatApp *na;
IPACMDBG("Recevied below informatoin during wanup:\n");
IPACMDBG("if_name:%s, ipv4_address:0x%x\n",
@@ -286,12 +256,17 @@
return;
}
- isWanUp = true;
- wan_ipaddr = wanup_data->ipv4_addr;
IPACM_ConntrackClient::iptodot("public ip address", wanup_data->ipv4_addr);
+ isWanUp = true;
+ wan_ipaddr = wanup_data->ipv4_addr;
memcpy(wan_ifname, wanup_data->ifname, sizeof(wan_ifname));
- NatApp::GetInstance()->AddTable(wanup_data->ipv4_addr);
+
+ na = NatApp::GetInstance();
+ if(na != NULL)
+ {
+ na->AddTable(wanup_data->ipv4_addr);
+ }
IPACMDBG("creating nat threads\n");
CreateNatThreads();
@@ -395,8 +370,13 @@
IPACMDBG("Deleting ipv4 nat table with ");
IPACM_ConntrackClient::iptodot("public ip address", wan_addr);
isWanUp = false;
+ NatApp *na;
- NatApp::GetInstance()->DeleteTable(wan_addr);
+ na = NatApp::GetInstance();
+ if(na != NULL)
+ {
+ na->DeleteTable(wan_addr);
+ }
}
@@ -493,6 +473,7 @@
nat_table_entry rule;
u_int8_t tcp_state;
uint32_t status = 0;
+ NatApp *na = NULL;
status = nfct_get_attr_u32(ct, ATTR_STATUS);
@@ -612,16 +593,23 @@
if(IPPROTO_TCP == rule.protocol)
{
+ na = NatApp::GetInstance();
+ if(na == NULL)
+ {
+ IPACMERR("unable to get nat app instance");
+ return;
+ }
+
tcp_state = nfct_get_attr_u8(ct, ATTR_TCP_STATE);
if(TCP_CONNTRACK_ESTABLISHED == tcp_state)
{
IPACMDBG("TCP state TCP_CONNTRACK_ESTABLISHED(%d)\n", tcp_state);
- NatApp::GetInstance()->AddEntry(&rule);
+ na->AddEntry(&rule);
}
else if(TCP_CONNTRACK_FIN_WAIT == tcp_state)
{
IPACMDBG("TCP state TCP_CONNTRACK_FIN_WAIT(%d)\n", tcp_state);
- NatApp::GetInstance()->DeleteEntry(&rule);
+ na->DeleteEntry(&rule);
}
else
{
@@ -631,15 +619,22 @@
}
else if(IPPROTO_UDP == rule.protocol)
{
+ na = NatApp::GetInstance();
+ if(na == NULL)
+ {
+ IPACMERR("unable to get nat app instance");
+ return;
+ }
+
if(NFCT_T_NEW == type)
{
IPACMDBG("New UDP connection at time %ld\n", time(NULL));
- NatApp::GetInstance()->AddEntry(&rule);
+ na->AddEntry(&rule);
}
else if(NFCT_T_DESTROY == type)
{
IPACMDBG("UDP connection close at time %ld\n", time(NULL));
- NatApp::GetInstance()->DeleteEntry(&rule);
+ na->DeleteEntry(&rule);
}
}
else
diff --git a/ipacm/src/IPACM_Wlan.cpp b/ipacm/src/IPACM_Wlan.cpp
index 615d7b9..065f4b0 100755
--- a/ipacm/src/IPACM_Wlan.cpp
+++ b/ipacm/src/IPACM_Wlan.cpp
@@ -79,6 +79,13 @@
return;
}
+ Nat_App = NatApp::GetInstance();
+ if (Nat_App == NULL)
+ {
+ IPACMERR("unable to get Nat App instance \n");
+ return;
+ }
+
IPACMDBG("index:%d constructor: Tx properties:%d\n", iface_index, iface_query->num_tx_props);
return;
}
@@ -245,39 +252,30 @@
if ((wlan_index != IPACM_INVALID_INDEX) &&
(get_client_memptr(wlan_client, wlan_index)->power_save_set == true))
{
- if(get_client_memptr(wlan_client, wlan_index)->ipv4_set == true)
- {
- ipacm_cmd_q_data evt_data;
- ipacm_event_iface_up *data = NULL;
- data = (ipacm_event_iface_up *)malloc(sizeof(ipacm_event_iface_up));
- if (data == NULL)
- {
- IPACMERR("unable to allocate memory\n");
- return;
- }
-
- data->ipv4_addr = get_client_memptr(wlan_client, wlan_index)->v4_addr;
- evt_data.event = IPA_HANDLE_RESET_POWER_SAVE;
- evt_data.evt_data = (void *)data;
- IPACM_EvtDispatcher::PostEvt(&evt_data);
- IPACMDBG("recover client index(%d):ipv4 address: 0x%x\n", wlan_index, get_client_memptr(wlan_client, wlan_index)->v4_addr);
- }
IPACMDBG("change wlan client out of power safe mode \n");
get_client_memptr(wlan_client, wlan_index)->power_save_set = false;
- }
-
- if(get_client_memptr(wlan_client, wlan_index)->ipv4_set == true) /* for ipv4 */
- {
- handle_wlan_client_route_rule(data->mac_addr, IPA_IP_v4);
- }
+ /* First add route rules and then nat rules */
+ if(get_client_memptr(wlan_client, wlan_index)->ipv4_set == true) /* for ipv4 */
+ {
+ IPACMDBG("recover client index(%d):ipv4 address: 0x%x\n",
+ wlan_index,
+ get_client_memptr(wlan_client, wlan_index)->v4_addr);
- if(get_client_memptr(wlan_client, wlan_index)->ipv6_set == true) /* for ipv6 */
- {
- handle_wlan_client_route_rule(data->mac_addr, IPA_IP_v6);
- }
- }
+ IPACMDBG("Adding Route Rules\n");
+ handle_wlan_client_route_rule(data->mac_addr, IPA_IP_v4);
+
+ IPACMDBG("Adding Nat Rules\n");
+ Nat_App->ResetPwrSaveIf(get_client_memptr(wlan_client, wlan_index)->v4_addr);
+ }
+
+ if(get_client_memptr(wlan_client, wlan_index)->ipv6_set == true) /* for ipv6 */
+ {
+ handle_wlan_client_route_rule(data->mac_addr, IPA_IP_v6);
+ }
+ }
+ }
}
break;
@@ -852,8 +850,6 @@
int IPACM_Wlan::handle_wlan_client_pwrsave(uint8_t *mac_addr)
{
int clt_indx;
- ipacm_cmd_q_data evt_data;
- ipacm_event_iface_up *data;
IPACMDBG("wlan->handle_wlan_client_pwrsave();\n");
clt_indx = get_wlan_client_index(mac_addr);
@@ -865,24 +861,14 @@
if (get_client_memptr(wlan_client, clt_indx)->power_save_set == false)
{
+ /* First reset nat rules and then route rules */
if(get_client_memptr(wlan_client, clt_indx)->ipv4_set == true)
{
- data = (ipacm_event_iface_up *)malloc(sizeof(ipacm_event_iface_up));
- if (data == NULL)
- {
- IPACMERR("unable to allocate memory\n");
- return IPACM_FAILURE;
- }
-
- data->ipv4_addr = get_client_memptr(wlan_client, clt_indx)->v4_addr ;
- IPACMDBG("power-save client index(%d):ipv4 address: 0x%x\n", clt_indx, get_client_memptr(wlan_client, clt_indx)->v4_addr);
-
-
- evt_data.event = IPA_HANDLE_POWER_SAVE;
- evt_data.evt_data = (void *)data;
- IPACM_EvtDispatcher::PostEvt(&evt_data);
+ IPACMDBG("Deleting Nat Rules\n");
+ Nat_App->UpdatePwrSaveIf(get_client_memptr(wlan_client, clt_indx)->v4_addr);
}
+ IPACMDBG("Deleting default qos Route Rules\n");
delete_default_qos_rtrules(clt_indx, IPA_IP_v4);
delete_default_qos_rtrules(clt_indx, IPA_IP_v6);
get_client_memptr(wlan_client, clt_indx)->power_save_set = true;