summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorXin Li <delphij@google.com>2017-12-06 11:52:04 -0800
committerXin Li <delphij@google.com>2017-12-06 14:24:51 -0800
commit41ee806c7f63745fed424c93e60fe9d3b97155b9 (patch)
tree0525a31ae05b46b580f350a806d3bd7a22dbd4af
parent6ddd298ba89a5dab0db5c63ced61ea511db7952d (diff)
parent109deb5cdc347d1bea64154fca9ac1751e841536 (diff)
downloadipacfg-mgr-41ee806c7f63745fed424c93e60fe9d3b97155b9.tar.gz
Exempt-From-Owner-Approval: Changes already landed internally Change-Id: I33b630ec5f11bf5de0f467a8cd14a5e55548ea8a
-rw-r--r--msm8998/hal/inc/HAL.h3
-rw-r--r--msm8998/hal/inc/LocalLogBuffer.h3
-rw-r--r--msm8998/hal/src/HAL.cpp39
-rw-r--r--msm8998/hal/src/LocalLogBuffer.cpp9
-rw-r--r--msm8998/ipacm/inc/IPACM_Config.h2
-rw-r--r--msm8998/ipacm/inc/IPACM_Defs.h4
-rw-r--r--msm8998/ipacm/inc/IPACM_Iface.h2
-rw-r--r--msm8998/ipacm/inc/IPACM_Lan.h2
-rw-r--r--msm8998/ipacm/inc/IPACM_OffloadManager.h22
-rw-r--r--msm8998/ipacm/inc/IPACM_Wan.h18
-rw-r--r--msm8998/ipacm/inc/IPACM_Wlan.h2
-rw-r--r--msm8998/ipacm/src/Android.mk2
-rw-r--r--msm8998/ipacm/src/IPACM_CmdQueue.cpp2
-rw-r--r--msm8998/ipacm/src/IPACM_Config.cpp24
-rw-r--r--msm8998/ipacm/src/IPACM_ConntrackClient.cpp5
-rw-r--r--msm8998/ipacm/src/IPACM_ConntrackListener.cpp2
-rw-r--r--msm8998/ipacm/src/IPACM_Conntrack_NATApp.cpp12
-rw-r--r--msm8998/ipacm/src/IPACM_Filtering.cpp3
-rw-r--r--msm8998/ipacm/src/IPACM_Iface.cpp65
-rw-r--r--msm8998/ipacm/src/IPACM_IfaceManager.cpp4
-rw-r--r--msm8998/ipacm/src/IPACM_Lan.cpp162
-rw-r--r--msm8998/ipacm/src/IPACM_Log.cpp9
-rw-r--r--msm8998/ipacm/src/IPACM_Main.cpp27
-rw-r--r--msm8998/ipacm/src/IPACM_Netlink.cpp30
-rw-r--r--msm8998/ipacm/src/IPACM_OffloadManager.cpp232
-rw-r--r--msm8998/ipacm/src/IPACM_Wan.cpp75
-rw-r--r--msm8998/ipacm/src/IPACM_Wlan.cpp38
-rw-r--r--msm8998/ipanat/src/Android.mk2
-rw-r--r--msm8998/ipanat/src/ipa_nat_drvi.c4
29 files changed, 607 insertions, 197 deletions
diff --git a/msm8998/hal/inc/HAL.h b/msm8998/hal/inc/HAL.h
index 24761dd..c7b7817 100644
--- a/msm8998/hal/inc/HAL.h
+++ b/msm8998/hal/inc/HAL.h
@@ -161,6 +161,9 @@ public:
const hidl_string& /* prefix */,
removeDownstream_cb /* hidl_cb */);
+ /* Common */
+ Return<void> debug(const hidl_handle& /* fd */, const hidl_vec<hidl_string>& /* options */);
+
private:
typedef struct BoolResult {
bool success;
diff --git a/msm8998/hal/inc/LocalLogBuffer.h b/msm8998/hal/inc/LocalLogBuffer.h
index c23ef7d..7cefe64 100644
--- a/msm8998/hal/inc/LocalLogBuffer.h
+++ b/msm8998/hal/inc/LocalLogBuffer.h
@@ -65,9 +65,10 @@ public:
LocalLogBuffer(string /* name */, int /* maxLogs */);
void addLog(FunctionLog /* log */);
void toLogcat();
+ void toFd(int fd);
private:
deque<FunctionLog> mLogs;
const string mName;
const size_t mMaxLogs;
}; /* LocalLogBuffer */
-#endif /* _LOCAL_LOG_BUFFER_H_ */ \ No newline at end of file
+#endif /* _LOCAL_LOG_BUFFER_H_ */
diff --git a/msm8998/hal/src/HAL.cpp b/msm8998/hal/src/HAL.cpp
index 22aff0f..e19a149 100644
--- a/msm8998/hal/src/HAL.cpp
+++ b/msm8998/hal/src/HAL.cpp
@@ -77,7 +77,7 @@ HAL* HAL::makeIPAHAL(int version, IOffloadManager* mgr) {
/* ------------------------------ PRIVATE ----------------------------------- */
-HAL::HAL(IOffloadManager* mgr) : mLogs("HAL Function Calls", 50) {
+HAL::HAL(IOffloadManager* mgr) : mLogs("HAL Function Calls", 100) {
mIPA = mgr;
mCb.clear();
mCbIpa = nullptr;
@@ -463,11 +463,17 @@ Return<void> HAL::setDataLimit
fl.addArg("upstream", upstream);
fl.addArg("limit", limit);
- RET ipaReturn = mIPA->setQuota(upstream.c_str(), limit);
- BoolResult res = ipaResultToBoolResult(ipaReturn);
- hidl_cb(res.success, res.errMsg);
+ if (!isInitialized()) {
+ BoolResult res = makeInputCheckFailure("Not initialized (setDataLimit)");
+ hidl_cb(res.success, res.errMsg);
+ fl.setResult(res.success, res.errMsg);
+ } else {
+ RET ipaReturn = mIPA->setQuota(upstream.c_str(), limit);
+ BoolResult res = ipaResultToBoolResult(ipaReturn);
+ hidl_cb(res.success, res.errMsg);
+ fl.setResult(res.success, res.errMsg);
+ }
- fl.setResult(res.success, res.errMsg);
mLogs.addLog(fl);
return Void();
} /* setDataLimit */
@@ -500,8 +506,7 @@ Return<void> HAL::setUpstreamParameters
BoolResult res = makeInputCheckFailure("Not initialized (setUpstreamParameters)");
hidl_cb(res.success, res.errMsg);
fl.setResult(res.success, res.errMsg);
- }
- else if (!v4AddrParser.addV4(v4Addr) && !v4Addr.empty()) {
+ } else if (!v4AddrParser.addV4(v4Addr) && !v4Addr.empty()) {
BoolResult res = makeInputCheckFailure(v4AddrParser.getLastErrAsStr());
hidl_cb(res.success, res.errMsg);
fl.setResult(res.success, res.errMsg);
@@ -513,7 +518,7 @@ Return<void> HAL::setUpstreamParameters
BoolResult res = makeInputCheckFailure(v6GwParser.getLastErrAsStr());
hidl_cb(res.success, res.errMsg);
fl.setResult(res.success, res.errMsg);
- } else {
+ } else if (iface.size()>= 1) {
RET ipaReturn = mIPA->setUpstream(
iface.c_str(),
v4GwParser.getFirstPrefix(),
@@ -521,6 +526,15 @@ Return<void> HAL::setUpstreamParameters
BoolResult res = ipaResultToBoolResult(ipaReturn);
hidl_cb(res.success, res.errMsg);
fl.setResult(res.success, res.errMsg);
+ } else {
+ /* send NULL iface string when upstream down */
+ RET ipaReturn = mIPA->setUpstream(
+ NULL,
+ v4GwParser.getFirstPrefix(),
+ v6GwParser.getFirstPrefix());
+ BoolResult res = ipaResultToBoolResult(ipaReturn);
+ hidl_cb(res.success, res.errMsg);
+ fl.setResult(res.success, res.errMsg);
}
mLogs.addLog(fl);
@@ -594,3 +608,12 @@ Return<void> HAL::removeDownstream
mLogs.addLog(fl);
return Void();
} /* removeDownstream */
+
+Return<void> HAL::debug
+(
+ const hidl_handle& fd,
+ const hidl_vec<hidl_string>& /* options */
+) {
+ mLogs.toFd(fd->data[0]);
+ return Void();
+} /* debug */
diff --git a/msm8998/hal/src/LocalLogBuffer.cpp b/msm8998/hal/src/LocalLogBuffer.cpp
index f556e40..5e89557 100644
--- a/msm8998/hal/src/LocalLogBuffer.cpp
+++ b/msm8998/hal/src/LocalLogBuffer.cpp
@@ -33,6 +33,7 @@
#include <deque>
#include <string>
#include <sys/types.h>
+#include <unistd.h>
#include <vector>
/* Internal Includes */
@@ -124,3 +125,11 @@ void LocalLogBuffer::toLogcat() {
for (size_t i = 0; i < mLogs.size(); i++)
ALOGD("%s: %s", mName.c_str(), mLogs[i].toString().c_str());
} /* toLogcat */
+
+void LocalLogBuffer::toFd(int fd) {
+ for (size_t i = 0; i < mLogs.size(); i++) {
+ string line = mName + " " + mLogs[i].toString();
+ write(fd, line.c_str(), line.size());
+ write(fd, "\n", 1);
+ }
+} /* toFd */
diff --git a/msm8998/ipacm/inc/IPACM_Config.h b/msm8998/ipacm/inc/IPACM_Config.h
index 5bcb4eb..ae66c95 100644
--- a/msm8998/ipacm/inc/IPACM_Config.h
+++ b/msm8998/ipacm/inc/IPACM_Config.h
@@ -234,6 +234,8 @@ public:
int DelNatIfaces(char *dev_name);
+ int CheckNatIfaces(const char *dev_name);
+
inline void SetQmapId(uint8_t id)
{
qmap_id = id;
diff --git a/msm8998/ipacm/inc/IPACM_Defs.h b/msm8998/ipacm/inc/IPACM_Defs.h
index 74ed3bf..9ab0893 100644
--- a/msm8998/ipacm/inc/IPACM_Defs.h
+++ b/msm8998/ipacm/inc/IPACM_Defs.h
@@ -166,6 +166,8 @@ typedef enum
IPA_WAN_XLAT_CONNECT_EVENT, /* ipacm_event_data_fid */
IPA_TETHERING_STATS_UPDATE_EVENT, /* ipacm_event_data_fid */
IPA_NETWORK_STATS_UPDATE_EVENT, /* ipacm_event_data_fid */
+ IPA_DOWNSTREAM_ADD, /* ipacm_event_ipahal_stream */
+ IPA_DOWNSTREAM_DEL, /* ipacm_event_ipahal_stream */
IPA_EXTERNAL_EVENT_MAX,
@@ -185,8 +187,6 @@ typedef enum
IPA_ETH_BRIDGE_CLIENT_DEL, /* ipacm_event_eth_bridge*/
IPA_ETH_BRIDGE_WLAN_SCC_MCC_SWITCH, /* ipacm_event_eth_bridge*/
IPA_LAN_DELETE_SELF, /* ipacm_event_data_fid */
- IPA_DOWNSTREAM_ADD, /* ipacm_event_ipahal_stream */
- IPA_DOWNSTREAM_DEL, /* ipacm_event_ipahal_stream */
IPACM_EVENT_MAX
} ipa_cm_event_id;
diff --git a/msm8998/ipacm/inc/IPACM_Iface.h b/msm8998/ipacm/inc/IPACM_Iface.h
index 43b0da6..0d714c8 100644
--- a/msm8998/ipacm/inc/IPACM_Iface.h
+++ b/msm8998/ipacm/inc/IPACM_Iface.h
@@ -97,7 +97,7 @@ public:
bool softwarerouting_act;
/* IPACM number of default route rules for ipv6*/
- int num_dft_rt_v6;
+ uint32_t num_dft_rt_v6;
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];
diff --git a/msm8998/ipacm/inc/IPACM_Lan.h b/msm8998/ipacm/inc/IPACM_Lan.h
index 85ea927..7957154 100644
--- a/msm8998/ipacm/inc/IPACM_Lan.h
+++ b/msm8998/ipacm/inc/IPACM_Lan.h
@@ -247,7 +247,7 @@ private:
int header_name_count;
- int num_eth_client;
+ uint32_t num_eth_client;
NatApp *Nat_App;
diff --git a/msm8998/ipacm/inc/IPACM_OffloadManager.h b/msm8998/ipacm/inc/IPACM_OffloadManager.h
index 85a2063..bade0aa 100644
--- a/msm8998/ipacm/inc/IPACM_OffloadManager.h
+++ b/msm8998/ipacm/inc/IPACM_OffloadManager.h
@@ -29,7 +29,7 @@
#ifndef _IPACM_OFFLOAD_MANAGER_H_
#define _IPACM_OFFLOAD_MANAGER_H_
-
+#include <list>
#include <stdint.h>
#include <IOffloadManager.h>
#include "IPACM_Defs.h"
@@ -43,7 +43,17 @@ using natTimeoutUpdate_t = ::IOffloadManager::ConntrackTimeoutUpdater::natTimeou
//using UDP = ::IOffloadManager::ConntrackTimeoutUpdater::UDP;
//using TCP = ::IOffloadManager::ConntrackTimeoutUpdater::TCP;
+#define MAX_EVENT_CACHE 10
+typedef struct _framework_event_cache
+{
+ /* IPACM interface name */
+ ipa_cm_event_id event;
+ char dev_name[IF_NAME_LEN];
+ Prefix prefix_cache;
+ Prefix prefix_cache_v6; //for setupstream use
+ bool valid;
+}framework_event_cache;
class IPACM_OffloadManager : public IOffloadManager
{
@@ -82,8 +92,12 @@ public:
ConntrackTimeoutUpdater *touInstance;
+ bool search_framwork_cache(char * interface_name);
+
private:
+ std::list<std::string> valid_ifaces;
+
bool upstream_v4_up;
bool upstream_v6_up;
@@ -98,6 +112,12 @@ private:
static const char *DEVICE_NAME;
+ /* cache the add_downstream events if netdev is not ready */
+ framework_event_cache event_cache[MAX_EVENT_CACHE];
+
+ /* latest update cache entry */
+ int latest_cache_index;
+
}; /* IPACM_OffloadManager */
#endif /* _IPACM_OFFLOAD_MANAGER_H_ */
diff --git a/msm8998/ipacm/inc/IPACM_Wan.h b/msm8998/ipacm/inc/IPACM_Wan.h
index 3ed58fe..fa4114b 100644
--- a/msm8998/ipacm/inc/IPACM_Wan.h
+++ b/msm8998/ipacm/inc/IPACM_Wan.h
@@ -105,10 +105,12 @@ public:
{
#ifdef FEATURE_IPA_ANDROID
#ifdef FEATURE_IPACM_HAL
+ /*To avoid -Wall -Werror error */
+ IPACMDBG_H("ipa_if_num_tether: %d\n",ipa_if_num_tether);
return wan_up;
#else
- int i;
+ uint32_t i;
for (i=0; i < ipa_if_num_tether_v4_total;i++)
{
if (ipa_if_num_tether_v4[i] == ipa_if_num_tether)
@@ -129,7 +131,12 @@ public:
static bool isWanUP_V6(int ipa_if_num_tether)
{
#ifdef FEATURE_IPA_ANDROID
- int i;
+#ifdef FEATURE_IPACM_HAL
+ /*To avoid -Wall -Werror error */
+ IPACMDBG_H("ipa_if_num_tether: %d\n",ipa_if_num_tether);
+ return wan_up_v6;
+#else
+ uint32_t i;
for (i=0; i < ipa_if_num_tether_v6_total;i++)
{
if (ipa_if_num_tether_v6[i] == ipa_if_num_tether)
@@ -141,6 +148,7 @@ public:
}
}
return false;
+#endif
#else
return wan_up_v6;
#endif
@@ -179,9 +187,9 @@ public:
}
#ifdef FEATURE_IPA_ANDROID
/* IPACM interface id */
- static int ipa_if_num_tether_v4_total;
+ static uint32_t ipa_if_num_tether_v4_total;
static int ipa_if_num_tether_v4[IPA_MAX_IFACE_ENTRIES];
- static int ipa_if_num_tether_v6_total;
+ static uint32_t ipa_if_num_tether_v6_total;
static int ipa_if_num_tether_v6[IPA_MAX_IFACE_ENTRIES];
#endif
@@ -235,7 +243,7 @@ private:
int wan_client_len;
ipa_wan_client *wan_client;
int header_name_count;
- int num_wan_client;
+ uint32_t num_wan_client;
uint8_t invalid_mac[IPA_MAC_ADDR_SIZE];
bool is_xlat;
diff --git a/msm8998/ipacm/inc/IPACM_Wlan.h b/msm8998/ipacm/inc/IPACM_Wlan.h
index eb911ac..5fee0fa 100644
--- a/msm8998/ipacm/inc/IPACM_Wlan.h
+++ b/msm8998/ipacm/inc/IPACM_Wlan.h
@@ -101,7 +101,7 @@ private:
ipa_wlan_client *wlan_client;
int header_name_count;
- int num_wifi_client;
+ uint32_t num_wifi_client;
int wlan_ap_index;
diff --git a/msm8998/ipacm/src/Android.mk b/msm8998/ipacm/src/Android.mk
index a481ab0..71c2aa1 100644
--- a/msm8998/ipacm/src/Android.mk
+++ b/msm8998/ipacm/src/Android.mk
@@ -30,7 +30,7 @@ endif
LOCAL_CFLAGS := -v
LOCAL_CFLAGS += -DFEATURE_IPA_ANDROID
-LOCAL_CFLAGS += -DFEATURE_IPACM_HAL
+LOCAL_CFLAGS += -DFEATURE_IPACM_HAL -Wall -Werror
ifneq (,$(filter userdebug eng, $(TARGET_BUILD_VARIANT)))
LOCAL_CFLAGS += -DDEBUG
endif
diff --git a/msm8998/ipacm/src/IPACM_CmdQueue.cpp b/msm8998/ipacm/src/IPACM_CmdQueue.cpp
index a17fb08..c612b7f 100644
--- a/msm8998/ipacm/src/IPACM_CmdQueue.cpp
+++ b/msm8998/ipacm/src/IPACM_CmdQueue.cpp
@@ -122,6 +122,8 @@ void* MessageQueue::Process(void *param)
MessageQueue *MsgQueueInternal = NULL;
MessageQueue *MsgQueueExternal = NULL;
Message *item = NULL;
+ param = NULL;
+
IPACMDBG("MessageQueue::Process()\n");
MsgQueueInternal = MessageQueue::getInstanceInternal();
diff --git a/msm8998/ipacm/src/IPACM_Config.cpp b/msm8998/ipacm/src/IPACM_Config.cpp
index 6218fb6..895005f 100644
--- a/msm8998/ipacm/src/IPACM_Config.cpp
+++ b/msm8998/ipacm/src/IPACM_Config.cpp
@@ -88,6 +88,8 @@ const char *ipacm_event_name[] = {
__stringify(IPA_WAN_XLAT_CONNECT_EVENT), /* ipacm_event_data_fid */
__stringify(IPA_TETHERING_STATS_UPDATE_EVENT), /* ipacm_event_data_fid */
__stringify(IPA_NETWORK_STATS_UPDATE_EVENT), /* ipacm_event_data_fid */
+ __stringify(IPA_DOWNSTREAM_ADD), /* ipacm_event_ipahal_stream */
+ __stringify(IPA_DOWNSTREAM_DEL), /* ipacm_event_ipahal_stream */
__stringify(IPA_EXTERNAL_EVENT_MAX),
__stringify(IPA_HANDLE_WAN_UP), /* ipacm_event_iface_up */
__stringify(IPA_HANDLE_WAN_DOWN), /* ipacm_event_iface_up */
@@ -499,7 +501,7 @@ int IPACM_Config::DelNatIfaces(char *dev_name)
{
if (strcmp(dev_name, pNatIfaces[i].iface_name) == 0)
{
- IPACMDBG_H("Find Nat IfaceName: %s ,previous nat-ifaces number: %d\n",
+ IPACMDBG_H("Found Nat IfaceName: %s with nat-ifaces number: %d\n",
pNatIfaces[i].iface_name, ipa_nat_iface_entries);
/* Reset the matched entry */
@@ -524,6 +526,26 @@ int IPACM_Config::DelNatIfaces(char *dev_name)
return 0;
}
+int IPACM_Config::CheckNatIfaces(const char *dev_name)
+{
+ int i = 0;
+ IPACMDBG_H("Check iface %s from NAT-ifaces, currently it has %d nat ifaces\n",
+ dev_name, ipa_nat_iface_entries);
+
+ for (i = 0; i < ipa_nat_iface_entries; i++)
+ {
+ if (strcmp(dev_name, pNatIfaces[i].iface_name) == 0)
+ {
+ IPACMDBG_H("Find Nat IfaceName: %s ,previous nat-ifaces number: %d\n",
+ pNatIfaces[i].iface_name, ipa_nat_iface_entries);
+ return 0;
+ }
+ }
+ IPACMDBG_H("Can't find Nat IfaceName: %s with total nat-ifaces number: %d\n",
+ dev_name, ipa_nat_iface_entries);
+ return -1;
+}
+
/* for IPACM resource manager dependency usage
add either Tx or Rx ipa_rm_resource_name and
also indicate that endpoint property if valid */
diff --git a/msm8998/ipacm/src/IPACM_ConntrackClient.cpp b/msm8998/ipacm/src/IPACM_ConntrackClient.cpp
index ffb0088..d8f7f73 100644
--- a/msm8998/ipacm/src/IPACM_ConntrackClient.cpp
+++ b/msm8998/ipacm/src/IPACM_ConntrackClient.cpp
@@ -104,6 +104,7 @@ int IPACM_ConntrackClient::IPAConntrackEventCB
ipacm_cmd_q_data evt_data;
ipacm_ct_evt_data *ct_data;
uint8_t ip_type = 0;
+ data = NULL;
IPACMDBG("Event callback called with msgtype: %d\n",type);
@@ -175,7 +176,7 @@ int IPACM_ConntrackClient::IPA_Conntrack_Filters_Ignore_Bridge_Addrs
if(strlen(IPACM_Iface::ipacmcfg->ipa_virtual_iface_name) >= sizeof(ifr.ifr_name))
{
- IPACMERR("interface name overflows: len %d\n",
+ IPACMERR("interface name overflows: len %zu\n",
strlen(IPACM_Iface::ipacmcfg->ipa_virtual_iface_name));
close(fd);
return -1;
@@ -388,6 +389,7 @@ void* IPACM_ConntrackClient::UDPConnTimeoutUpdate(void *ptr)
{
NatApp *nat_inst = NULL;
+ ptr = NULL;
#ifdef IPACM_DEBUG
IPACMDBG("\n");
#endif
@@ -601,7 +603,6 @@ ctcatch:
/* Thread to initialize TCP Conntrack Filters*/
void IPACM_ConntrackClient::UNRegisterWithConnTrack(void)
{
- int ret;
IPACM_ConntrackClient *pClient = NULL;
IPACMDBG("\n");
diff --git a/msm8998/ipacm/src/IPACM_ConntrackListener.cpp b/msm8998/ipacm/src/IPACM_ConntrackListener.cpp
index de0e7e7..4f83b3d 100644
--- a/msm8998/ipacm/src/IPACM_ConntrackListener.cpp
+++ b/msm8998/ipacm/src/IPACM_ConntrackListener.cpp
@@ -142,7 +142,7 @@ void IPACM_ConntrackListener::event_callback(ipa_cm_event_id evt,
int IPACM_ConntrackListener::CheckNatIface(
ipacm_event_data_all *data, bool *NatIface)
{
- int fd = 0, len = 0, cnt, i, j;
+ int fd = 0, len = 0, cnt, i;
struct ifreq ifr;
*NatIface = false;
diff --git a/msm8998/ipacm/src/IPACM_Conntrack_NATApp.cpp b/msm8998/ipacm/src/IPACM_Conntrack_NATApp.cpp
index a831f8e..f6dda67 100644
--- a/msm8998/ipacm/src/IPACM_Conntrack_NATApp.cpp
+++ b/msm8998/ipacm/src/IPACM_Conntrack_NATApp.cpp
@@ -402,17 +402,16 @@ int NatApp::AddEntry(const nat_table_entry *rule)
void NatApp::UpdateCTUdpTs(nat_table_entry *rule, uint32_t new_ts)
{
- int ret;
#ifdef FEATURE_IPACM_HAL
IOffloadManager::ConntrackTimeoutUpdater::natTimeoutUpdate_t entry;
IPACM_OffloadManager* OffloadMng;
#endif
-
iptodot("Private IP:", rule->private_ip);
iptodot("Target IP:", rule->target_ip);
IPACMDBG("Private Port: %d, Target Port: %d\n", rule->private_port, rule->target_port);
#ifndef FEATURE_IPACM_HAL
+ int ret;
if(!ct_hdl)
{
ct_hdl = nfct_open(CONNTRACK, 0);
@@ -977,8 +976,13 @@ void NatApp::CacheEntry(const nat_table_entry *rule)
}
void NatApp::Read_TcpUdp_Timeout(void) {
+#ifdef FEATURE_IPACM_HAL
+ tcp_timeout = 432000;
+ udp_timeout = 180;
+ IPACMDBG_H("udp timeout value: %d\n", udp_timeout);
+ IPACMDBG_H("tcp timeout value: %d\n", tcp_timeout);
+#else
FILE *udp_fd = NULL, *tcp_fd = NULL;
-
/* Read UDP timeout value */
udp_fd = fopen(IPACM_UDP_FULL_FILE_NAME, "r");
if (udp_fd == NULL) {
@@ -1012,6 +1016,6 @@ fail:
if (tcp_fd) {
fclose(tcp_fd);
}
-
+#endif
return;
}
diff --git a/msm8998/ipacm/src/IPACM_Filtering.cpp b/msm8998/ipacm/src/IPACM_Filtering.cpp
index 22eb19c..260871f 100644
--- a/msm8998/ipacm/src/IPACM_Filtering.cpp
+++ b/msm8998/ipacm/src/IPACM_Filtering.cpp
@@ -264,6 +264,7 @@ bool IPACM_Filtering::AddWanDLFilteringRule(struct ipa_ioc_add_flt_rule const *r
ipa_install_fltr_rule_req_ex_msg_v01 qmi_rule_ex_msg;
#endif
+ memset(&qmi_rule_msg, 0, sizeof(qmi_rule_msg));
int fd_wwan_ioctl = open(WWAN_QMI_IOCTL_DEVICE_NAME, O_RDWR);
if(fd_wwan_ioctl < 0)
{
@@ -292,8 +293,6 @@ bool IPACM_Filtering::AddWanDLFilteringRule(struct ipa_ioc_add_flt_rule const *r
}
else
{
- memset(&qmi_rule_msg, 0, sizeof(qmi_rule_msg));
-
if (num_rules > 0)
{
qmi_rule_msg.filter_spec_list_valid = true;
diff --git a/msm8998/ipacm/src/IPACM_Iface.cpp b/msm8998/ipacm/src/IPACM_Iface.cpp
index 84132c9..149e417 100644
--- a/msm8998/ipacm/src/IPACM_Iface.cpp
+++ b/msm8998/ipacm/src/IPACM_Iface.cpp
@@ -237,8 +237,6 @@ fail:
int IPACM_Iface::handle_software_routing_disable(void)
{
int res = IPACM_SUCCESS;
- ipa_ip_type ip;
- uint32_t flt_hdl;
if (rx_prop == NULL)
{
@@ -853,7 +851,11 @@ int IPACM_Iface::init_fl_rule(ipa_ip_type iptype)
if(rx_prop->rx[0].attrib.attrib_mask & IPA_FLT_META_DATA)
{
+#ifdef FEATURE_IPA_V3
+ flt_rule_entry.rule.eq_attrib.rule_eq_bitmap |= (1<<9);
+#else
flt_rule_entry.rule.eq_attrib.rule_eq_bitmap |= (1<<14);
+#endif
flt_rule_entry.rule.eq_attrib.metadata_meq32_present = 1;
flt_rule_entry.rule.eq_attrib.metadata_meq32.offset = 0;
flt_rule_entry.rule.eq_attrib.metadata_meq32.value = rx_prop->rx[0].attrib.meta_data;
@@ -864,7 +866,11 @@ int IPACM_Iface::init_fl_rule(ipa_ip_type iptype)
flt_rule_entry.rule.eq_attrib.protocol_eq_present = 1;
flt_rule_entry.rule.eq_attrib.protocol_eq = IPACM_FIREWALL_IPPROTO_TCP;
+#ifdef FEATURE_IPA_V3
+ flt_rule_entry.rule.eq_attrib.rule_eq_bitmap |= (1<<7);
+#else
flt_rule_entry.rule.eq_attrib.rule_eq_bitmap |= (1<<8);
+#endif
flt_rule_entry.rule.eq_attrib.num_ihl_offset_meq_32 = 1;
flt_rule_entry.rule.eq_attrib.ihl_offset_meq_32[0].offset = 12;
@@ -924,30 +930,37 @@ int IPACM_Iface::ipa_get_if_index
int * if_index
)
{
- int fd;
- struct ifreq ifr;
-
- if((fd = socket(AF_INET, SOCK_DGRAM, 0)) < 0)
- {
- IPACMERR("get interface index socket create failed \n");
- return IPACM_FAILURE;
- }
-
- memset(&ifr, 0, sizeof(struct ifreq));
- (void)strncpy(ifr.ifr_name, if_name, sizeof(ifr.ifr_name));
- IPACMDBG_H("interface name (%s)\n", if_name);
-
- if (ioctl(fd,SIOCGIFINDEX , &ifr) < 0)
- {
- IPACMERR("call_ioctl_on_dev: ioctl failed, interface name (%s):\n", ifr.ifr_name);
- close(fd);
- return IPACM_FAILURE;
- }
-
- *if_index = ifr.ifr_ifindex;
- IPACMDBG_H("Interface index %d\n", *if_index);
- close(fd);
- return IPACM_SUCCESS;
+ int fd;
+ struct ifreq ifr;
+
+ if((fd = socket(AF_INET, SOCK_DGRAM, 0)) < 0)
+ {
+ IPACMERR("get interface index socket create failed \n");
+ return IPACM_FAILURE;
+ }
+
+ if(strlen(if_name) >= sizeof(ifr.ifr_name))
+ {
+ IPACMERR("interface name overflows: len %zu\n", strlen(if_name));
+ close(fd);
+ return IPACM_FAILURE;
+ }
+
+ memset(&ifr, 0, sizeof(struct ifreq));
+ (void)strlcpy(ifr.ifr_name, if_name, sizeof(ifr.ifr_name));
+ IPACMDBG_H("interface name (%s)\n", if_name);
+
+ if(ioctl(fd,SIOCGIFINDEX , &ifr) < 0)
+ {
+ IPACMERR("call_ioctl_on_dev: ioctl failed, interface name (%s):\n", ifr.ifr_name);
+ close(fd);
+ return IPACM_FAILURE;
+ }
+
+ *if_index = ifr.ifr_ifindex;
+ IPACMDBG_H("Interface index %d\n", *if_index);
+ close(fd);
+ return IPACM_SUCCESS;
}
void IPACM_Iface::config_ip_type(ipa_ip_type iptype)
diff --git a/msm8998/ipacm/src/IPACM_IfaceManager.cpp b/msm8998/ipacm/src/IPACM_IfaceManager.cpp
index eab43fd..17f546d 100644
--- a/msm8998/ipacm/src/IPACM_IfaceManager.cpp
+++ b/msm8998/ipacm/src/IPACM_IfaceManager.cpp
@@ -72,7 +72,9 @@ void IPACM_IfaceManager::event_callback(ipa_cm_event_id event, void *param)
ipacm_event_data_fid *evt_data = (ipacm_event_data_fid *)param;
ipacm_event_data_mac *StaData = (ipacm_event_data_mac *)param;
ipacm_event_data_all *data_all = (ipacm_event_data_all *)param;
- ipacm_ifacemgr_data ifmgr_data = {0};
+ ipacm_ifacemgr_data ifmgr_data;
+
+ memset(&ifmgr_data,0,sizeof(ifmgr_data));
switch(event)
{
diff --git a/msm8998/ipacm/src/IPACM_Lan.cpp b/msm8998/ipacm/src/IPACM_Lan.cpp
index 8d853d2..cd0ff99 100644
--- a/msm8998/ipacm/src/IPACM_Lan.cpp
+++ b/msm8998/ipacm/src/IPACM_Lan.cpp
@@ -52,7 +52,9 @@ IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include "IPACM_ConntrackListener.h"
#include <sys/ioctl.h>
#include <fcntl.h>
-
+#ifdef FEATURE_IPACM_HAL
+#include "IPACM_OffloadManager.h"
+#endif
bool IPACM_Lan::odu_up = false;
IPACM_Lan::IPACM_Lan(int iface_index) : IPACM_Iface(iface_index)
@@ -65,7 +67,8 @@ IPACM_Lan::IPACM_Lan(int iface_index) : IPACM_Iface(iface_index)
odu_route_rule_v4_hdl = NULL;
odu_route_rule_v6_hdl = NULL;
eth_client = NULL;
- int i, m_fd_odu, ret = IPACM_SUCCESS;
+ int m_fd_odu, ret = IPACM_SUCCESS;
+ uint32_t i;
Nat_App = NatApp::GetInstance();
if (Nat_App == NULL)
@@ -182,6 +185,21 @@ IPACM_Lan::IPACM_Lan(int iface_index) : IPACM_Iface(iface_index)
memset(is_downstream_set, 0, sizeof(is_downstream_set));
memset(is_upstream_set, 0, sizeof(is_upstream_set));
memset(&prefix, 0, sizeof(prefix));
+
+#ifdef FEATURE_IPACM_HAL
+ /* check if Upstream was set before */
+ if (IPACM_Wan::isWanUP(ipa_if_num))
+ {
+ IPACMDBG_H("Upstream was set previously for ipv4, change is_upstream_set flag\n");
+ is_upstream_set[IPA_IP_v4] = true;
+ }
+
+ if (IPACM_Wan::isWanUP_V6(ipa_if_num))
+ {
+ IPACMDBG_H("Upstream was set previously for ipv6, change is_upstream_set flag\n");
+ is_upstream_set[IPA_IP_v6] = true;
+ }
+#endif
return;
}
@@ -204,7 +222,6 @@ void IPACM_Lan::event_callback(ipa_cm_event_id event, void *param)
int ipa_interface_index;
ipacm_ext_prop* ext_prop;
- ipacm_event_iface_up* data_wan;
ipacm_event_iface_up_tehter* data_wan_tether;
switch (event)
@@ -368,6 +385,7 @@ void IPACM_Lan::event_callback(ipa_cm_event_id event, void *param)
handle_private_subnet(data->iptype);
#endif
+#ifndef FEATURE_IPACM_HAL
if (IPACM_Wan::isWanUP(ipa_if_num))
{
if(data->iptype == IPA_IP_v4 || data->iptype == IPA_IP_MAX)
@@ -408,7 +426,7 @@ void IPACM_Lan::event_callback(ipa_cm_event_id event, void *param)
} else {
IPACMDBG_H("Wan_V6 haven't up yet\n");
}
-
+#endif
/* Post event to NAT */
if (data->iptype == IPA_IP_v4)
{
@@ -656,7 +674,13 @@ void IPACM_Lan::event_callback(ipa_cm_event_id event, void *param)
if (ip_type == IPA_IP_MAX || ip_type == data->prefix.iptype)
{
if (data->prefix.iptype == IPA_IP_v6) /* ipv6 only */
- install_ipv6_prefix_flt_rule(IPACM_Wan::backhaul_ipv6_prefix);
+ {
+ /* Only offload clients has same prefix as Android gave */
+ ipv6_prefix[0] = data->prefix.v6Addr[0];
+ ipv6_prefix[1] = data->prefix.v6Addr[1];
+ IPACMDBG_H("ipv6_prefix0x%x:%x\n", ipv6_prefix[0], ipv6_prefix[1]);
+ install_ipv6_prefix_flt_rule(ipv6_prefix);
+ }
if (IPACM_Wan::backhaul_is_sta_mode == false) /* LTE */
{
@@ -706,7 +730,7 @@ void IPACM_Lan::event_callback(ipa_cm_event_id event, void *param)
case IPA_HANDLE_WAN_UP:
IPACMDBG_H("Received IPA_HANDLE_WAN_UP event\n");
- data_wan = (ipacm_event_iface_up*)param;
+ ipacm_event_iface_up* data_wan = (ipacm_event_iface_up*)param;
if (data_wan == NULL)
{
IPACMERR("No event data is found.\n");
@@ -955,7 +979,7 @@ int IPACM_Lan::handle_del_ipv6_addr(ipacm_event_data_all *data)
if(data->iptype == IPA_IP_v6)
{
if ((data->ipv6_addr[0] != 0) || (data->ipv6_addr[1] != 0) ||
- (data->ipv6_addr[2] != 0) || (data->ipv6_addr[3] || 0))
+ (data->ipv6_addr[2] != 0) || (data->ipv6_addr[3] != 0))
{
IPACMDBG_H("ipv6 address got: 0x%x:%x:%x:%x\n", data->ipv6_addr[0], data->ipv6_addr[1], data->ipv6_addr[2], data->ipv6_addr[3]);
for(num_v6=0;num_v6 < get_client_memptr(eth_client, clnt_indx)->ipv6_set;num_v6++)
@@ -970,6 +994,11 @@ int IPACM_Lan::handle_del_ipv6_addr(ipacm_event_data_all *data)
}
}
}
+ else
+ {
+ IPACMDBG_H("Invalid ipv6 address\n");
+ return IPACM_FAILURE;
+ }
if (num_v6 == IPV6_NUM_ADDR)
{
IPACMDBG_H("ipv6 addr is not found. \n");
@@ -994,7 +1023,7 @@ int IPACM_Lan::handle_del_ipv6_addr(ipacm_event_data_all *data)
get_client_memptr(eth_client, clnt_indx)->ipv6_set--;
get_client_memptr(eth_client, clnt_indx)->route_rule_set_v6--;
- for(num_v6;num_v6< get_client_memptr(eth_client, clnt_indx)->ipv6_set;num_v6++)
+ for(;num_v6< get_client_memptr(eth_client, clnt_indx)->ipv6_set;num_v6++)
{
get_client_memptr(eth_client, clnt_indx)->v6_addr[num_v6][0] =
get_client_memptr(eth_client, clnt_indx)->v6_addr[num_v6+1][0];
@@ -1028,7 +1057,7 @@ int IPACM_Lan::handle_wan_down(bool is_sta_mode)
return IPACM_FAILURE;
}
- if(is_sta_mode == false)
+ if(is_sta_mode == false && modem_ul_v4_set == true)
{
if (num_wan_ul_fl_rule_v4 > MAX_WAN_UL_FILTER_RULES)
{
@@ -1093,8 +1122,11 @@ int IPACM_Lan::handle_addr_evt(ipacm_event_data_addr *data)
struct ipa_ioc_add_rt_rule *rt_rule;
struct ipa_rt_rule_add *rt_rule_entry;
const int NUM_RULES = 1;
- int num_ipv6_addr;
+ uint32_t num_ipv6_addr;
int res = IPACM_SUCCESS;
+#ifdef FEATURE_IPACM_HAL
+ IPACM_OffloadManager* OffloadMng;
+#endif
IPACMDBG_H("set route/filter rule ip-type: %d \n", data->iptype);
@@ -1260,6 +1292,17 @@ int IPACM_Lan::handle_addr_evt(ipacm_event_data_addr *data)
IPACMDBG_H("number of default route rules %d\n", num_dft_rt_v6);
}
+#ifdef FEATURE_IPACM_HAL
+ /* check if having pending add_downstream cache*/
+ OffloadMng = IPACM_OffloadManager::GetInstance();
+ if (OffloadMng == NULL) {
+ IPACMERR("failed to get IPACM_OffloadManager instance !\n");
+ } else {
+ IPACMDBG_H(" check iface %s if having add_downstream cache events\n", dev_name);
+ OffloadMng->search_framwork_cache(dev_name);
+ }
+#endif
+
IPACMDBG_H("finish route/filter rule ip-type: %d, res(%d)\n", data->iptype, res);
fail:
@@ -1506,14 +1549,14 @@ int IPACM_Lan::handle_wan_up(ipa_ip_type ip_type)
/* only offload UL traffic of certain clients */
#ifdef FEATURE_IPACM_HAL
flt_rule_entry.rule.attrib.attrib_mask |= IPA_FLT_SRC_ADDR;
- flt_rule_entry.rule.attrib.u.v6.dst_addr_mask[0] = prefix[IPA_IP_v6].v6Mask[0];
- flt_rule_entry.rule.attrib.u.v6.dst_addr_mask[1] = prefix[IPA_IP_v6].v6Mask[1];
- flt_rule_entry.rule.attrib.u.v6.dst_addr_mask[2] = prefix[IPA_IP_v6].v6Mask[2];
- flt_rule_entry.rule.attrib.u.v6.dst_addr_mask[3] = prefix[IPA_IP_v6].v6Mask[3];
- flt_rule_entry.rule.attrib.u.v6.dst_addr[0] = prefix[IPA_IP_v6].v6Addr[0];
- flt_rule_entry.rule.attrib.u.v6.dst_addr[1] = prefix[IPA_IP_v6].v6Addr[1];
- flt_rule_entry.rule.attrib.u.v6.dst_addr[2] = prefix[IPA_IP_v6].v6Addr[2];
- flt_rule_entry.rule.attrib.u.v6.dst_addr[3] = prefix[IPA_IP_v6].v6Addr[3];
+ flt_rule_entry.rule.attrib.u.v6.src_addr_mask[0] = ntohl(prefix[IPA_IP_v6].v6Mask[0]);
+ flt_rule_entry.rule.attrib.u.v6.src_addr_mask[1] = ntohl(prefix[IPA_IP_v6].v6Mask[1]);
+ flt_rule_entry.rule.attrib.u.v6.src_addr_mask[2] = ntohl(prefix[IPA_IP_v6].v6Mask[2]);
+ flt_rule_entry.rule.attrib.u.v6.src_addr_mask[3] = ntohl(prefix[IPA_IP_v6].v6Mask[3]);
+ flt_rule_entry.rule.attrib.u.v6.src_addr[0] = ntohl(prefix[IPA_IP_v6].v6Addr[0]);
+ flt_rule_entry.rule.attrib.u.v6.src_addr[1] = ntohl(prefix[IPA_IP_v6].v6Addr[1]);
+ flt_rule_entry.rule.attrib.u.v6.src_addr[2] = ntohl(prefix[IPA_IP_v6].v6Addr[2]);
+ flt_rule_entry.rule.attrib.u.v6.src_addr[3] = ntohl(prefix[IPA_IP_v6].v6Addr[3]);
#endif
memcpy(&(m_pFilteringTable->rules[0]), &flt_rule_entry, sizeof(struct ipa_flt_rule_add));
@@ -1539,7 +1582,8 @@ int IPACM_Lan::handle_wan_up(ipa_ip_type ip_type)
int IPACM_Lan::handle_wan_up_ex(ipacm_ext_prop *ext_prop, ipa_ip_type iptype, uint8_t xlat_mux_id)
{
- int fd, ret = IPACM_SUCCESS, cnt;
+ int fd, ret = IPACM_SUCCESS;
+ uint32_t cnt;
IPACM_Config* ipacm_config = IPACM_Iface::ipacmcfg;
struct ipa_ioc_write_qmapid mux;
@@ -1569,7 +1613,7 @@ int IPACM_Lan::handle_wan_up_ex(ipacm_ext_prop *ext_prop, ipa_ip_type iptype, ui
}
/* check only add static UL filter rule once */
- if (num_dft_rt_v6 ==1 && iptype ==IPA_IP_v6 && modem_ul_v6_set == false)
+ if (iptype ==IPA_IP_v6 && modem_ul_v6_set == false)
{
IPACMDBG_H("IPA_IP_v6 num_dft_rt_v6 %d xlat_mux_id: %d modem_ul_v6_set: %d\n", num_dft_rt_v6, xlat_mux_id, modem_ul_v6_set);
ret = handle_uplink_filter_rule(ext_prop, iptype, xlat_mux_id);
@@ -1703,7 +1747,7 @@ int IPACM_Lan::handle_eth_hdr_init(uint8_t *mac_addr)
pHeaderDescriptor->hdr[0].name[IPA_RESOURCE_NAME_MAX-1] = '\0';
if (strlcat(pHeaderDescriptor->hdr[0].name, IPA_ETH_HDR_NAME_v4, sizeof(pHeaderDescriptor->hdr[0].name)) > IPA_RESOURCE_NAME_MAX)
{
- IPACMERR(" header name construction failed exceed length (%d)\n", strlen(pHeaderDescriptor->hdr[0].name));
+ IPACMERR(" header name construction failed exceed length (%zu)\n", strlen(pHeaderDescriptor->hdr[0].name));
res = IPACM_FAILURE;
goto fail;
}
@@ -1711,7 +1755,7 @@ int IPACM_Lan::handle_eth_hdr_init(uint8_t *mac_addr)
snprintf(index,sizeof(index), "%d", header_name_count);
if (strlcat(pHeaderDescriptor->hdr[0].name, index, sizeof(pHeaderDescriptor->hdr[0].name)) > IPA_RESOURCE_NAME_MAX)
{
- IPACMERR(" header name construction failed exceed length (%d)\n", strlen(pHeaderDescriptor->hdr[0].name));
+ IPACMERR(" header name construction failed exceed length (%zu)\n", strlen(pHeaderDescriptor->hdr[0].name));
res = IPACM_FAILURE;
goto fail;
}
@@ -1803,14 +1847,14 @@ int IPACM_Lan::handle_eth_hdr_init(uint8_t *mac_addr)
pHeaderDescriptor->hdr[0].name[IPA_RESOURCE_NAME_MAX-1] = '\0';
if (strlcat(pHeaderDescriptor->hdr[0].name, IPA_ETH_HDR_NAME_v6, sizeof(pHeaderDescriptor->hdr[0].name)) > IPA_RESOURCE_NAME_MAX)
{
- IPACMERR(" header name construction failed exceed length (%d)\n", strlen(pHeaderDescriptor->hdr[0].name));
+ IPACMERR(" header name construction failed exceed length (%zu)\n", strlen(pHeaderDescriptor->hdr[0].name));
res = IPACM_FAILURE;
goto fail;
}
snprintf(index,sizeof(index), "%d", header_name_count);
if (strlcat(pHeaderDescriptor->hdr[0].name, index, sizeof(pHeaderDescriptor->hdr[0].name)) > IPA_RESOURCE_NAME_MAX)
{
- IPACMERR(" header name construction failed exceed length (%d)\n", strlen(pHeaderDescriptor->hdr[0].name));
+ IPACMERR(" header name construction failed exceed length (%zu)\n", strlen(pHeaderDescriptor->hdr[0].name));
res = IPACM_FAILURE;
goto fail;
}
@@ -1923,7 +1967,7 @@ int IPACM_Lan::handle_eth_client_ipaddr(ipacm_event_data_all *data)
else
{
if ((data->ipv6_addr[0] != 0) || (data->ipv6_addr[1] != 0) ||
- (data->ipv6_addr[2] != 0) || (data->ipv6_addr[3] || 0)) /* check if all 0 not valid ipv6 address */
+ (data->ipv6_addr[2] != 0) || (data->ipv6_addr[3] != 0)) /* check if all 0 not valid ipv6 address */
{
IPACMDBG_H("ipv6 address: 0x%x:%x:%x:%x\n", data->ipv6_addr[0], data->ipv6_addr[1], data->ipv6_addr[2], data->ipv6_addr[3]);
if( (data->ipv6_addr[0] & ipv6_link_local_prefix_mask) != (ipv6_link_local_prefix & ipv6_link_local_prefix_mask) &&
@@ -1961,6 +2005,11 @@ int IPACM_Lan::handle_eth_client_ipaddr(ipacm_event_data_all *data)
return IPACM_FAILURE; /* not setup the RT rules*/
}
}
+ else
+ {
+ IPACMDBG_H("Invalid IPV6 address\n");
+ return IPACM_FAILURE;
+ }
}
return IPACM_SUCCESS;
@@ -2626,7 +2675,7 @@ int IPACM_Lan::handle_eth_client_down_evt(uint8_t *mac_addr)
/*handle LAN iface down event*/
int IPACM_Lan::handle_down_evt()
{
- int i;
+ uint32_t i;
int res = IPACM_SUCCESS;
IPACMDBG_H("lan handle_down_evt\n ");
@@ -3045,6 +3094,7 @@ int IPACM_Lan::handle_uplink_filter_rule(ipacm_ext_prop *prop, ipa_ip_type iptyp
if(flt_rule_entry.rule.eq_attrib.num_offset_meq_32 <= IPA_IPFLTR_NUM_MEQ_32_EQNS)
{
eq_index = flt_rule_entry.rule.eq_attrib.num_offset_meq_32 - 1;
+#ifdef FEATURE_IPA_V3
if(eq_index == 0)
{
flt_rule_entry.rule.eq_attrib.rule_eq_bitmap |= (1<<5);
@@ -3053,6 +3103,16 @@ int IPACM_Lan::handle_uplink_filter_rule(ipacm_ext_prop *prop, ipa_ip_type iptyp
{
flt_rule_entry.rule.eq_attrib.rule_eq_bitmap |= (1<<6);
}
+#else
+ if(eq_index == 0)
+ {
+ flt_rule_entry.rule.eq_attrib.rule_eq_bitmap |= (1<<2);
+ }
+ else
+ {
+ flt_rule_entry.rule.eq_attrib.rule_eq_bitmap |= (1<<3);
+ }
+#endif
flt_rule_entry.rule.eq_attrib.offset_meq_32[eq_index].offset = 12;
flt_rule_entry.rule.eq_attrib.offset_meq_32[eq_index].mask = prefix[IPA_IP_v4].v4Mask;
flt_rule_entry.rule.eq_attrib.offset_meq_32[eq_index].value = prefix[IPA_IP_v4].v4Addr;
@@ -3069,6 +3129,7 @@ int IPACM_Lan::handle_uplink_filter_rule(ipacm_ext_prop *prop, ipa_ip_type iptyp
if(flt_rule_entry.rule.eq_attrib.num_offset_meq_128 <= IPA_IPFLTR_NUM_MEQ_128_EQNS)
{
eq_index = flt_rule_entry.rule.eq_attrib.num_offset_meq_128 - 1;
+#ifdef FEATURE_IPA_V3
if(eq_index == 0)
{
flt_rule_entry.rule.eq_attrib.rule_eq_bitmap |= (1<<3);
@@ -3077,23 +3138,33 @@ int IPACM_Lan::handle_uplink_filter_rule(ipacm_ext_prop *prop, ipa_ip_type iptyp
{
flt_rule_entry.rule.eq_attrib.rule_eq_bitmap |= (1<<4);
}
+#else
+ if(eq_index == 0)
+ {
+ flt_rule_entry.rule.eq_attrib.rule_eq_bitmap |= (1<<9);
+ }
+ else
+ {
+ flt_rule_entry.rule.eq_attrib.rule_eq_bitmap |= (1<<10);
+ }
+#endif
flt_rule_entry.rule.eq_attrib.offset_meq_128[eq_index].offset = 8;
*(uint32_t *)(flt_rule_entry.rule.eq_attrib.offset_meq_128[eq_index].mask + 0)
- = prefix[IPA_IP_v6].v6Mask[0];
+ = prefix[IPA_IP_v6].v6Mask[3];
*(uint32_t *)(flt_rule_entry.rule.eq_attrib.offset_meq_128[eq_index].mask + 4)
- = prefix[IPA_IP_v6].v6Mask[1];
- *(uint32_t *)(flt_rule_entry.rule.eq_attrib.offset_meq_128[eq_index].mask + 8)
= prefix[IPA_IP_v6].v6Mask[2];
+ *(uint32_t *)(flt_rule_entry.rule.eq_attrib.offset_meq_128[eq_index].mask + 8)
+ = prefix[IPA_IP_v6].v6Mask[1];
*(uint32_t *)(flt_rule_entry.rule.eq_attrib.offset_meq_128[eq_index].mask + 12)
- = prefix[IPA_IP_v6].v6Mask[3];
+ = prefix[IPA_IP_v6].v6Mask[0];
*(uint32_t *)(flt_rule_entry.rule.eq_attrib.offset_meq_128[eq_index].value + 0)
- = prefix[IPA_IP_v6].v6Addr[0];
+ = prefix[IPA_IP_v6].v6Addr[3];
*(uint32_t *)(flt_rule_entry.rule.eq_attrib.offset_meq_128[eq_index].value + 4)
- = prefix[IPA_IP_v6].v6Addr[1];
- *(uint32_t *)(flt_rule_entry.rule.eq_attrib.offset_meq_128[eq_index].value + 8)
= prefix[IPA_IP_v6].v6Addr[2];
+ *(uint32_t *)(flt_rule_entry.rule.eq_attrib.offset_meq_128[eq_index].value + 8)
+ = prefix[IPA_IP_v6].v6Addr[1];
*(uint32_t *)(flt_rule_entry.rule.eq_attrib.offset_meq_128[eq_index].value + 12)
- = prefix[IPA_IP_v6].v6Addr[3];
+ = prefix[IPA_IP_v6].v6Addr[0];
}
else
{
@@ -3189,7 +3260,7 @@ int IPACM_Lan::handle_wan_down_v6(bool is_sta_mode)
memset(ipv6_prefix, 0, sizeof(ipv6_prefix));
- if(is_sta_mode == false)
+ if(is_sta_mode == false && modem_ul_v6_set == true)
{
if (num_wan_ul_fl_rule_v6 > MAX_WAN_UL_FILTER_RULES)
{
@@ -3377,7 +3448,8 @@ void IPACM_Lan::post_del_self_evt()
/*handle reset usb-client rt-rules */
int IPACM_Lan::handle_lan_client_reset_rt(ipa_ip_type iptype)
{
- int i, res = IPACM_SUCCESS;
+ uint32_t i;
+ int res = IPACM_SUCCESS;
/* clean eth-client routing rules */
IPACMDBG_H("left %d eth clients need to be deleted \n ", num_eth_client);
@@ -3943,7 +4015,8 @@ int IPACM_Lan::handle_cradle_wan_mode_switch(bool is_wan_bridge_mode)
/*handle reset usb-client rt-rules */
int IPACM_Lan::handle_tethering_stats_event(ipa_get_data_stats_resp_msg_v01 *data)
{
- int cnt, pipe_len, fd;
+ int fd;
+ uint32_t pipe_len, cnt;
uint64_t num_ul_packets, num_ul_bytes;
uint64_t num_dl_packets, num_dl_bytes;
bool ul_pipe_found, dl_pipe_found;
@@ -3974,7 +4047,7 @@ int IPACM_Lan::handle_tethering_stats_event(ipa_get_data_stats_resp_msg_v01 *dat
for (cnt=0; cnt<tx_prop->num_tx_props; cnt++)
{
IPACMDBG_H("Check Tx_prop_entry(%d) pipe(%d)\n", cnt, ioctl(fd, IPA_IOC_QUERY_EP_MAPPING, tx_prop->tx[cnt].dst_pipe));
- if(ioctl(fd, IPA_IOC_QUERY_EP_MAPPING, tx_prop->tx[cnt].dst_pipe) == data->dl_dst_pipe_stats_list[pipe_len].pipe_index)
+ if(ioctl(fd, IPA_IOC_QUERY_EP_MAPPING, tx_prop->tx[cnt].dst_pipe) == (int)data->dl_dst_pipe_stats_list[pipe_len].pipe_index)
{
/* update the DL stats */
dl_pipe_found = true;
@@ -4001,7 +4074,8 @@ int IPACM_Lan::handle_tethering_stats_event(ipa_get_data_stats_resp_msg_v01 *dat
for (cnt=0; cnt < rx_prop->num_rx_props; cnt++)
{
IPACMDBG_H("Check Rx_prop_entry(%d) pipe(%d)\n", cnt, ioctl(fd, IPA_IOC_QUERY_EP_MAPPING, rx_prop->rx[cnt].src_pipe));
- if(ioctl(fd, IPA_IOC_QUERY_EP_MAPPING, rx_prop->rx[cnt].src_pipe) == data->ul_src_pipe_stats_list[pipe_len].pipe_index)
+ //Typecasting to avoid -Wall -Werror errors
+ if(ioctl(fd, IPA_IOC_QUERY_EP_MAPPING, rx_prop->rx[cnt].src_pipe) == (int)data->ul_src_pipe_stats_list[pipe_len].pipe_index)
{
/* update the UL stats */
ul_pipe_found = true;
@@ -4051,7 +4125,8 @@ int IPACM_Lan::handle_tethering_stats_event(ipa_get_data_stats_resp_msg_v01 *dat
/*handle tether client */
int IPACM_Lan::handle_tethering_client(bool reset, ipacm_client_enum ipa_client)
{
- int cnt, fd, ret = IPACM_SUCCESS;
+ int fd, ret = IPACM_SUCCESS;
+ uint32_t cnt;
int fd_wwan_ioctl = open(WWAN_QMI_IOCTL_DEVICE_NAME, O_RDWR);
wan_ioctl_set_tether_client_pipe tether_client;
@@ -4185,10 +4260,10 @@ end:
int IPACM_Lan::eth_bridge_add_rt_rule(uint8_t *mac, char *rt_tbl_name, uint32_t hdr_proc_ctx_hdl,
ipa_hdr_l2_type peer_l2_hdr_type, ipa_ip_type iptype, uint32_t *rt_rule_hdl, int *rt_rule_count)
{
- int i, len, res = IPACM_SUCCESS;
+ int len, res = IPACM_SUCCESS;
+ uint32_t i, position, num_rt_rule;
struct ipa_ioc_add_rt_rule* rt_rule_table = NULL;
struct ipa_rt_rule_add rt_rule;
- int position, num_rt_rule;
IPACMDBG_H("Received client MAC 0x%02x%02x%02x%02x%02x%02x.\n",
mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);
@@ -4281,7 +4356,8 @@ int IPACM_Lan::eth_bridge_modify_rt_rule(uint8_t *mac, uint32_t hdr_proc_ctx_hdl
{
struct ipa_ioc_mdfy_rt_rule *rt_rule = NULL;
struct ipa_rt_rule_mdfy *rt_rule_entry;
- int len, index, res = IPACM_SUCCESS;
+ int len, res = IPACM_SUCCESS;
+ uint32_t index;
if(tx_prop == NULL)
{
diff --git a/msm8998/ipacm/src/IPACM_Log.cpp b/msm8998/ipacm/src/IPACM_Log.cpp
index 20dd26c..d0bd108 100644
--- a/msm8998/ipacm/src/IPACM_Log.cpp
+++ b/msm8998/ipacm/src/IPACM_Log.cpp
@@ -50,13 +50,8 @@ IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include <errno.h>
#include <IPACM_Defs.h>
-void logmessage(int log_level)
-{
- return;
-}
-
/* start IPACMDIAG socket*/
-int create_socket(unsigned int *sockfd)
+int create_socket(int *sockfd)
{
if ((*sockfd = socket(AF_UNIX, SOCK_DGRAM, 0)) == IPACM_FAILURE)
@@ -78,7 +73,7 @@ void ipacm_log_send( void * user_data)
ipacm_log_buffer_t ipacm_log_buffer;
int numBytes=0, len;
struct sockaddr_un ipacmlog_socket;
- static unsigned int ipacm_log_sockfd = 0;
+ static int ipacm_log_sockfd = 0;
if(ipacm_log_sockfd == 0)
{
diff --git a/msm8998/ipacm/src/IPACM_Main.cpp b/msm8998/ipacm/src/IPACM_Main.cpp
index 16ec73a..13cdb51 100644
--- a/msm8998/ipacm/src/IPACM_Main.cpp
+++ b/msm8998/ipacm/src/IPACM_Main.cpp
@@ -106,9 +106,17 @@ bool ipacm_logging = true;
void ipa_is_ipacm_running(void);
int ipa_get_if_index(char *if_name, int *if_index);
+IPACM_Neighbor *neigh;
+IPACM_IfaceManager *ifacemgr;
+#ifdef FEATURE_IPACM_HAL
+ IPACM_OffloadManager* OffloadMng;
+ HAL *hal;
+#endif
+
/* start netlink socket monitor*/
void* netlink_start(void *param)
{
+ param = NULL;
ipa_nl_sk_fd_set_info_t sk_fdset;
int ret_val = 0;
memset(&sk_fdset, 0, sizeof(ipa_nl_sk_fd_set_info_t));
@@ -137,6 +145,7 @@ void* firewall_monitor(void *param)
ipacm_cmd_q_data evt_data;
uint32_t mask = IN_MODIFY | IN_MOVE;
+ param = NULL;
inotify_fd = inotify_init();
if (inotify_fd < 0)
{
@@ -236,6 +245,7 @@ void* ipa_driver_msg_notifier(void *param)
ipacm_cmd_q_data new_neigh_evt;
ipacm_event_data_all* new_neigh_data;
+ param = NULL;
fd = open(IPA_DRIVER, O_RDWR);
if (fd < 0)
{
@@ -686,7 +696,7 @@ void* ipa_driver_msg_notifier(void *param)
} else {
OffloadMng->elrInstance->onLimitReached();
}
- break;
+ continue;
case IPA_SSR_BEFORE_SHUTDOWN:
IPACMDBG_H("Received IPA_SSR_BEFORE_SHUTDOWN\n");
OffloadMng = IPACM_OffloadManager::GetInstance();
@@ -695,7 +705,7 @@ void* ipa_driver_msg_notifier(void *param)
} else {
OffloadMng->elrInstance->onOffloadStopped(IpaEventRelay::ERROR);
}
- break;
+ continue;
case IPA_SSR_AFTER_POWERUP:
IPACMDBG_H("Received IPA_SSR_AFTER_POWERUP\n");
OffloadMng = IPACM_OffloadManager::GetInstance();
@@ -704,7 +714,7 @@ void* ipa_driver_msg_notifier(void *param)
} else {
OffloadMng->elrInstance->onOffloadSupportAvailable();
}
- break;
+ continue;
#endif
default:
IPACMDBG_H("Unhandled message type: %d\n", event_hdr.msg_type);
@@ -728,7 +738,6 @@ void* ipa_driver_msg_notifier(void *param)
void IPACM_Sig_Handler(int sig)
{
- int cnt;
ipacm_cmd_q_data evt_data;
printf("Received Signal: %d\n", sig);
@@ -767,17 +776,19 @@ int main(int argc, char **argv)
int ret;
pthread_t netlink_thread = 0, monitor_thread = 0, ipa_driver_thread = 0;
pthread_t cmd_queue_thread = 0;
- IPACM_OffloadManager* OffloadMng;
/* check if ipacm is already running or not */
ipa_is_ipacm_running();
IPACMDBG_H("In main()\n");
- IPACM_Neighbor *neigh = new IPACM_Neighbor();
- IPACM_IfaceManager *ifacemgr = new IPACM_IfaceManager();
+ (void)argc;
+ (void)argv;
+
+ neigh = new IPACM_Neighbor();
+ ifacemgr = new IPACM_IfaceManager();
#ifdef FEATURE_IPACM_HAL
OffloadMng = IPACM_OffloadManager::GetInstance();
- HAL *hal = HAL::makeIPAHAL(1, OffloadMng);
+ hal = HAL::makeIPAHAL(1, OffloadMng);
IPACMDBG_H(" START IPACM_OffloadManager and link to android framework\n");
#endif
diff --git a/msm8998/ipacm/src/IPACM_Netlink.cpp b/msm8998/ipacm/src/IPACM_Netlink.cpp
index a971b8e..b2b26db 100644
--- a/msm8998/ipacm/src/IPACM_Netlink.cpp
+++ b/msm8998/ipacm/src/IPACM_Netlink.cpp
@@ -607,7 +607,7 @@ static int ipa_nl_decode_nlmsg
)
{
char dev_name[IF_NAME_LEN]={0};
- int ret_val, mask_value, mask_index, mask_value_v6;
+ int ret_val, mask_index, mask_value_v6;
struct nlmsghdr *nlh = (struct nlmsghdr *)buffer;
uint32_t if_ipv4_addr =0, if_ipipv4_addr_mask =0, temp =0, if_ipv4_addr_gw =0;
@@ -689,12 +689,12 @@ static int ipa_nl_decode_nlmsg
/* Add IPACM support for ECM plug-in/plug_out */
/*--------------------------------------------------------------------------
- Check if the interface is running.If its a RTM_NEWLINK and the interface
- is running then it means that its a link up event
- ---------------------------------------------------------------------------*/
- if((msg_ptr->nl_link_info.metainfo.ifi_flags & IFF_RUNNING) &&
- (msg_ptr->nl_link_info.metainfo.ifi_flags & IFF_LOWER_UP))
- {
+ Check if the interface is running.If its a RTM_NEWLINK and the interface
+ is running then it means that its a link up event
+ ---------------------------------------------------------------------------*/
+ if((msg_ptr->nl_link_info.metainfo.ifi_flags & IFF_RUNNING) &&
+ (msg_ptr->nl_link_info.metainfo.ifi_flags & IFF_LOWER_UP))
+ {
data_fid = (ipacm_event_data_fid *)malloc(sizeof(ipacm_event_data_fid));
if(data_fid == NULL)
@@ -712,17 +712,17 @@ static int ipa_nl_decode_nlmsg
}
IPACMDBG("Got a usb link_up event (Interface %s, %d) \n", dev_name, msg_ptr->nl_link_info.metainfo.ifi_index);
- /*--------------------------------------------------------------------------
- Post LAN iface (ECM) link up event
- ---------------------------------------------------------------------------*/
- evt_data.event = IPA_USB_LINK_UP_EVENT;
+ /*--------------------------------------------------------------------------
+ Post LAN iface (ECM) link up event
+ ---------------------------------------------------------------------------*/
+ evt_data.event = IPA_USB_LINK_UP_EVENT;
evt_data.evt_data = data_fid;
IPACMDBG_H("Posting usb IPA_LINK_UP_EVENT with if index: %d\n",
data_fid->if_index);
IPACM_EvtDispatcher::PostEvt(&evt_data);
- }
- else if(!(msg_ptr->nl_link_info.metainfo.ifi_flags & IFF_LOWER_UP))
- {
+ }
+ else if (!(msg_ptr->nl_link_info.metainfo.ifi_flags & IFF_LOWER_UP))
+ {
data_fid = (ipacm_event_data_fid *)malloc(sizeof(ipacm_event_data_fid));
if(data_fid == NULL)
{
@@ -747,7 +747,7 @@ static int ipa_nl_decode_nlmsg
IPACMDBG_H("Posting usb IPA_LINK_DOWN_EVENT with if index: %d\n",
data_fid->if_index);
IPACM_EvtDispatcher::PostEvt(&evt_data);
- }
+ }
}
break;
diff --git a/msm8998/ipacm/src/IPACM_OffloadManager.cpp b/msm8998/ipacm/src/IPACM_OffloadManager.cpp
index 332abd5..2061fd2 100644
--- a/msm8998/ipacm/src/IPACM_OffloadManager.cpp
+++ b/msm8998/ipacm/src/IPACM_OffloadManager.cpp
@@ -45,6 +45,7 @@ IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.Z
#include "IPACM_ConntrackListener.h"
#include "IPACM_Iface.h"
#include "IPACM_Config.h"
+#include <unistd.h>
const char *IPACM_OffloadManager::DEVICE_NAME = "/dev/wwan_ioctl";
@@ -56,16 +57,20 @@ IPACM_OffloadManager::IPACM_OffloadManager()
default_gw_index = INVALID_IFACE;
upstream_v4_up = false;
upstream_v6_up = false;
+ memset(event_cache, 0, MAX_EVENT_CACHE*sizeof(framework_event_cache));
+ latest_cache_index = 0;
return ;
}
RET IPACM_OffloadManager::registerEventListener(IpaEventListener* eventlistener)
{
RET result = SUCCESS;
- if (elrInstance == NULL)
+ if (elrInstance == NULL) {
+ IPACMDBG_H("get registerEventListener \n");
+ elrInstance = eventlistener;
+ } else {
+ IPACMDBG_H("already have EventListener previously, override \n");
elrInstance = eventlistener;
- else {
- IPACMDBG_H("already register EventListener previously \n");
result = FAIL_INPUT_CHECK;
}
return SUCCESS;
@@ -87,9 +92,12 @@ RET IPACM_OffloadManager::registerCtTimeoutUpdater(ConntrackTimeoutUpdater* time
{
RET result = SUCCESS;
if (touInstance == NULL)
+ {
+ IPACMDBG_H("get ConntrackTimeoutUpdater \n");
+ touInstance = timeoutupdater;
+ } else {
+ IPACMDBG_H("already have ConntrackTimeoutUpdater previously, override \n");
touInstance = timeoutupdater;
- else {
- IPACMDBG_H("already register ConntrackTimeoutUpdater previously \n");
result = FAIL_INPUT_CHECK;
}
return SUCCESS;
@@ -111,6 +119,8 @@ RET IPACM_OffloadManager::provideFd(int fd, unsigned int groups)
{
IPACM_ConntrackClient *cc;
int on = 1, rel;
+ struct sockaddr_nl local;
+ unsigned int addr_len;
cc = IPACM_ConntrackClient::GetInstance();
@@ -120,8 +130,20 @@ RET IPACM_OffloadManager::provideFd(int fd, unsigned int groups)
return FAIL_HARDWARE;
}
+ /* check socket name */
+ memset(&local, 0, sizeof(struct sockaddr_nl));
+ addr_len = sizeof(local);
+ getsockname(fd, (struct sockaddr *)&local, &addr_len);
+ IPACMDBG_H(" FD %d, nl_pad %d nl_pid %u\n", fd, local.nl_pad, local.nl_pid);
+
+ /* add the check if getting FDs already or not */
+ if(cc->fd_tcp > -1 && cc->fd_udp > -1) {
+ IPACMDBG_H("has valid FDs fd_tcp %d, fd_udp %d, ignore fd %d.\n", cc->fd_tcp, cc->fd_udp, fd);
+ return SUCCESS;
+ }
+
if (groups == cc->subscrips_tcp) {
- cc->fd_tcp = fd;
+ cc->fd_tcp = dup(fd);
IPACMDBG_H("Received fd %d with groups %d.\n", fd, groups);
/* set netlink buf */
rel = setsockopt(cc->fd_tcp, SOL_NETLINK, NETLINK_NO_ENOBUFS, &on, sizeof(int) );
@@ -130,7 +152,7 @@ RET IPACM_OffloadManager::provideFd(int fd, unsigned int groups)
IPACMERR( "setsockopt returned error code %d ( %s )", errno, strerror( errno ) );
}
} else if (groups == cc->subscrips_udp) {
- cc->fd_udp = fd;
+ cc->fd_udp = dup(fd);
IPACMDBG_H("Received fd %d with groups %d.\n", fd, groups);
/* set netlink buf */
rel = setsockopt(cc->fd_tcp, SOL_NETLINK, NETLINK_NO_ENOBUFS, &on, sizeof(int) );
@@ -150,16 +172,9 @@ RET IPACM_OffloadManager::provideFd(int fd, unsigned int groups)
RET IPACM_OffloadManager::clearAllFds()
{
- IPACM_ConntrackClient *cc;
-
- cc = IPACM_ConntrackClient::GetInstance();
- if(!cc)
- {
- IPACMERR("Init clear: cc %p \n", cc);
- return FAIL_HARDWARE;
- }
- cc->UNRegisterWithConnTrack();
+ /* IPACM needs to kee old FDs, can't clear */
+ IPACMDBG_H("Still use old Fds, can't clear \n");
return SUCCESS;
}
@@ -181,6 +196,7 @@ RET IPACM_OffloadManager::addDownstream(const char * downstream_name, const Pref
ipacm_event_ipahal_stream *evt_data;
IPACMDBG_H("addDownstream name(%s), ip-family(%d) \n", downstream_name, prefix.fam);
+
if (prefix.fam == V4) {
IPACMDBG_H("subnet info v4Addr (%x) v4Mask (%x)\n", prefix.v4Addr, prefix.v4Mask);
} else {
@@ -190,11 +206,69 @@ RET IPACM_OffloadManager::addDownstream(const char * downstream_name, const Pref
prefix.v6Mask[0], prefix.v6Mask[1], prefix.v6Mask[2], prefix.v6Mask[3]);
}
+ /* check if netdev valid on device */
if(ipa_get_if_index(downstream_name, &index))
{
IPACMERR("fail to get iface index.\n");
+ return FAIL_INPUT_CHECK;
+ }
+ /* Iface is valid, add to list if not present */
+ if (std::find(valid_ifaces.begin(), valid_ifaces.end(), std::string(downstream_name)) == valid_ifaces.end())
+ {
+ /* Iface is new, add it to the list */
+ valid_ifaces.push_back(downstream_name);
+ IPACMDBG_H("add iface(%s) to list\n", downstream_name);
+ }
+
+ /* check if downstream netdev driver finished its configuration on IPA-HW */
+ if (IPACM_Iface::ipacmcfg->CheckNatIfaces(downstream_name))
+ {
+ IPACMDBG_H("addDownstream name(%s) currently not support in ipa \n", downstream_name);
+ /* copy to the cache */
+ for(int i = 0; i < MAX_EVENT_CACHE ;i++)
+ {
+ if(event_cache[latest_cache_index].valid == false)
+ {
+ //do the copy
+ event_cache[latest_cache_index].valid = true;
+ event_cache[latest_cache_index].event = IPA_DOWNSTREAM_ADD;
+ memcpy(event_cache[latest_cache_index].dev_name, downstream_name, sizeof(event_cache[latest_cache_index].dev_name));
+ memcpy(&event_cache[latest_cache_index].prefix_cache, &prefix, sizeof(event_cache[latest_cache_index].prefix_cache));
+ if (prefix.fam == V4) {
+ IPACMDBG_H("cache event(%d) subnet info v4Addr (%x) v4Mask (%x) dev(%s) on entry (%d)\n",
+ event_cache[latest_cache_index].event,
+ event_cache[latest_cache_index].prefix_cache.v4Addr,
+ event_cache[latest_cache_index].prefix_cache.v4Mask,
+ event_cache[latest_cache_index].dev_name,
+ latest_cache_index);
+ } else {
+ IPACMDBG_H("cache event (%d) v6Addr: %08x:%08x:%08x:%08x \n",
+ event_cache[latest_cache_index].event,
+ event_cache[latest_cache_index].prefix_cache.v6Addr[0],
+ event_cache[latest_cache_index].prefix_cache.v6Addr[1],
+ event_cache[latest_cache_index].prefix_cache.v6Addr[2],
+ event_cache[latest_cache_index].prefix_cache.v6Addr[3]);
+ IPACMDBG_H("subnet v6Mask: %08x:%08x:%08x:%08x dev(%s) on entry(%d), \n",
+ event_cache[latest_cache_index].prefix_cache.v6Mask[0],
+ event_cache[latest_cache_index].prefix_cache.v6Mask[1],
+ event_cache[latest_cache_index].prefix_cache.v6Mask[2],
+ event_cache[latest_cache_index].prefix_cache.v6Mask[3],
+ event_cache[latest_cache_index].dev_name,
+ latest_cache_index);
+ }
+ latest_cache_index = (latest_cache_index + 1)% MAX_EVENT_CACHE;
+ break;
+ }
+ latest_cache_index = (latest_cache_index + 1)% MAX_EVENT_CACHE;
+ if(i == MAX_EVENT_CACHE - 1)
+ {
+ IPACMDBG_H(" run out of event cache (%d)\n", i);
return FAIL_HARDWARE;
}
+ }
+
+ return SUCCESS;
+ }
evt_data = (ipacm_event_ipahal_stream*)malloc(sizeof(ipacm_event_ipahal_stream));
if(evt_data == NULL)
@@ -224,12 +298,23 @@ RET IPACM_OffloadManager::removeDownstream(const char * downstream_name, const P
ipacm_event_ipahal_stream *evt_data;
IPACMDBG_H("removeDownstream name(%s), ip-family(%d) \n", downstream_name, prefix.fam);
- if(ipa_get_if_index(downstream_name, &index))
+ if(strnlen(downstream_name, sizeof(downstream_name)) == 0)
{
- IPACMERR("fail to get iface index.\n");
+ IPACMERR("iface length is 0.\n");
+ return FAIL_HARDWARE;
+ }
+ if (std::find(valid_ifaces.begin(), valid_ifaces.end(), std::string(downstream_name)) == valid_ifaces.end())
+ {
+ IPACMERR("iface is not present in list.\n");
return FAIL_HARDWARE;
}
+ if(ipa_get_if_index(downstream_name, &index))
+ {
+ IPACMERR("netdev(%s) already removed, ignored\n", downstream_name);
+ return SUCCESS;
+ }
+
evt_data = (ipacm_event_ipahal_stream*)malloc(sizeof(ipacm_event_ipahal_stream));
if(evt_data == NULL)
{
@@ -254,8 +339,6 @@ RET IPACM_OffloadManager::removeDownstream(const char * downstream_name, const P
RET IPACM_OffloadManager::setUpstream(const char *upstream_name, const Prefix& gw_addr_v4 , const Prefix& gw_addr_v6)
{
int index;
- ipacm_cmd_q_data evt;
- ipacm_event_data_addr *evt_data_addr;
RET result = SUCCESS;
/* if interface name is NULL, default route is removed */
@@ -267,7 +350,6 @@ RET IPACM_OffloadManager::setUpstream(const char *upstream_name, const Prefix& g
IPACMERR("no previous upstream set before\n");
return FAIL_INPUT_CHECK;
}
-
if (gw_addr_v4.fam == V4 && upstream_v4_up == true) {
IPACMDBG_H("clean upstream(%s) for ipv4-fam(%d) upstream_v4_up(%d)\n", upstream_name, gw_addr_v4.fam, upstream_v4_up);
post_route_evt(IPA_IP_v4, default_gw_index, IPA_WAN_UPSTREAM_ROUTE_DEL_EVENT, gw_addr_v4);
@@ -282,12 +364,60 @@ RET IPACM_OffloadManager::setUpstream(const char *upstream_name, const Prefix& g
}
else
{
+ /* check if netdev valid on device */
if(ipa_get_if_index(upstream_name, &index))
{
IPACMERR("fail to get iface index.\n");
return FAIL_INPUT_CHECK;
}
+ /* check if downstream netdev driver finished its configuration on IPA-HW */
+ if (IPACM_Iface::ipacmcfg->CheckNatIfaces(upstream_name))
+ {
+ IPACMDBG_H("setUpstream name(%s) currently not support in ipa \n", upstream_name);
+ /* copy to the cache */
+ for(int i = 0; i < MAX_EVENT_CACHE ;i++)
+ {
+ if(event_cache[latest_cache_index].valid == false)
+ {
+ //do the copy
+ event_cache[latest_cache_index].valid = true;
+ event_cache[latest_cache_index].event = IPA_WAN_UPSTREAM_ROUTE_ADD_EVENT;
+ memcpy(event_cache[latest_cache_index].dev_name, upstream_name, sizeof(event_cache[latest_cache_index].dev_name));
+ memcpy(&event_cache[latest_cache_index].prefix_cache, &gw_addr_v4, sizeof(event_cache[latest_cache_index].prefix_cache));
+ memcpy(&event_cache[latest_cache_index].prefix_cache_v6, &gw_addr_v6, sizeof(event_cache[latest_cache_index].prefix_cache_v6));
+ if (gw_addr_v4.fam == V4) {
+ IPACMDBG_H("cache event(%d) ipv4 fateway: (%x) dev(%s) on entry (%d)\n",
+ event_cache[latest_cache_index].event,
+ event_cache[latest_cache_index].prefix_cache.v4Addr,
+ event_cache[latest_cache_index].dev_name,
+ latest_cache_index);
+ }
+
+ if (gw_addr_v6.fam == V6)
+ {
+ IPACMDBG_H("cache event (%d) ipv6 gateway: %08x:%08x:%08x:%08x dev(%s) on entry(%d)\n",
+ event_cache[latest_cache_index].event,
+ event_cache[latest_cache_index].prefix_cache_v6.v6Addr[0],
+ event_cache[latest_cache_index].prefix_cache_v6.v6Addr[1],
+ event_cache[latest_cache_index].prefix_cache_v6.v6Addr[2],
+ event_cache[latest_cache_index].prefix_cache_v6.v6Addr[3],
+ event_cache[latest_cache_index].dev_name,
+ latest_cache_index);
+ }
+ latest_cache_index = (latest_cache_index + 1)% MAX_EVENT_CACHE;
+ break;
+ }
+ latest_cache_index = (latest_cache_index + 1)% MAX_EVENT_CACHE;
+ if(i == MAX_EVENT_CACHE - 1)
+ {
+ IPACMDBG_H(" run out of event cache (%d) \n", i);
+ return FAIL_HARDWARE;
+ }
+ }
+ return SUCCESS;
+ }
+
/* reset the stats when switch from LTE->STA */
if (index != default_gw_index) {
IPACMDBG_H(" interface switched to %s\n", upstream_name);
@@ -362,7 +492,24 @@ RET IPACM_OffloadManager::setUpstream(const char *upstream_name, const Prefix& g
RET IPACM_OffloadManager::stopAllOffload()
{
- return SUCCESS;
+ Prefix v4gw, v6gw;
+ RET result = SUCCESS;
+
+ memset(&v4gw, 0, sizeof(v4gw));
+ memset(&v6gw, 0, sizeof(v6gw));
+ v4gw.fam = V4;
+ v6gw.fam = V6;
+ IPACMDBG_H("posting setUpstream(NULL), ipv4-fam(%d) ipv6-fam(%d)\n", v4gw.fam, v6gw.fam);
+ result = setUpstream(NULL, v4gw, v6gw);
+
+ /* reset the event cache */
+ default_gw_index = INVALID_IFACE;
+ upstream_v4_up = false;
+ upstream_v6_up = false;
+ memset(event_cache, 0, MAX_EVENT_CACHE*sizeof(framework_event_cache));
+ latest_cache_index = 0;
+ valid_ifaces.clear();
+ return result;
}
RET IPACM_OffloadManager::setQuota(const char * upstream_name /* upstream */, uint64_t mb/* limit */)
@@ -386,7 +533,7 @@ RET IPACM_OffloadManager::setQuota(const char * upstream_name /* upstream */, ui
return FAIL_INPUT_CHECK;
}
- IPACMDBG_H("SET_DATA_QUOTA %s %lld", quota.interface_name, mb);
+ IPACMDBG_H("SET_DATA_QUOTA %s %lu", quota.interface_name, mb);
if (ioctl(fd, WAN_IOC_SET_DATA_QUOTA, &quota) < 0) {
IPACMERR("IOCTL WAN_IOCTL_SET_DATA_QUOTA call failed: %s", strerror(errno));
@@ -427,7 +574,8 @@ RET IPACM_OffloadManager::getStats(const char * upstream_name /* upstream */,
offload_stats.tx = stats.tx_bytes;
offload_stats.rx = stats.rx_bytes;
- IPACMDBG_H("send getStats tx:%lld rx:%lld \n", offload_stats.tx, offload_stats.rx);
+ IPACMDBG_H("send getStats tx:%lu rx:%lu \n", offload_stats.tx, offload_stats.rx);
+ close(fd);
return SUCCESS;
}
@@ -482,7 +630,7 @@ int IPACM_OffloadManager::ipa_get_if_index(const char * if_name, int * if_index)
}
if(strnlen(if_name, sizeof(if_name)) >= sizeof(ifr.ifr_name)) {
- IPACMERR("interface name overflows: len %d\n", strnlen(if_name, sizeof(if_name)));
+ IPACMERR("interface name overflows: len %zu\n", strnlen(if_name, sizeof(if_name)));
close(fd);
return IPACM_FAILURE;
}
@@ -528,6 +676,7 @@ int IPACM_OffloadManager::resetTetherStats(const char * upstream_name /* upstrea
return FAIL_HARDWARE;
}
IPACMDBG_H("Reset Interface %s stats\n", upstream_name);
+ close(fd);
return IPACM_SUCCESS;
}
@@ -538,3 +687,36 @@ IPACM_OffloadManager* IPACM_OffloadManager::GetInstance()
return pInstance;
}
+
+bool IPACM_OffloadManager::search_framwork_cache(char * interface_name)
+{
+ bool rel = false;
+
+ /* IPACM needs to kee old FDs, can't clear */
+ IPACMDBG_H("check netdev(%s)\n", interface_name);
+
+ for(int i = 0; i < MAX_EVENT_CACHE ;i++)
+ {
+ if(event_cache[i].valid == true)
+ {
+ //do the compare
+ if (strncmp(event_cache[i].dev_name,
+ interface_name,
+ sizeof(event_cache[i].dev_name)) == 0)
+ {
+ IPACMDBG_H("found netdev (%s) in entry (%d) with event (%d)\n", interface_name, i, event_cache[i].event);
+ /* post event again */
+ if (event_cache[i].event == IPA_DOWNSTREAM_ADD)
+ addDownstream(interface_name, event_cache[i].prefix_cache);
+ else if (event_cache[i].event == IPA_WAN_UPSTREAM_ROUTE_ADD_EVENT)
+ setUpstream(interface_name, event_cache[i].prefix_cache, event_cache[i].prefix_cache_v6);
+ else
+ IPACMERR("wrong event cached (%d)", event_cache[i].event);
+ event_cache[i].valid = false;
+ rel = true;
+ }
+ }
+ }
+ IPACMDBG_H(" not found netdev (%s) has cached event\n", interface_name);
+ return rel;
+}
diff --git a/msm8998/ipacm/src/IPACM_Wan.cpp b/msm8998/ipacm/src/IPACM_Wan.cpp
index 0a52ad5..2df9d80 100644
--- a/msm8998/ipacm/src/IPACM_Wan.cpp
+++ b/msm8998/ipacm/src/IPACM_Wan.cpp
@@ -50,6 +50,9 @@ IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include "IPACM_Defs.h"
#include <IPACM_ConntrackListener.h>
#include "linux/ipa_qmi_service_v01.h"
+#ifdef FEATURE_IPACM_HAL
+#include "IPACM_OffloadManager.h"
+#endif
bool IPACM_Wan::wan_up = false;
bool IPACM_Wan::wan_up_v6 = false;
@@ -76,8 +79,8 @@ bool IPACM_Wan::backhaul_is_wan_bridge = false;
uint32_t IPACM_Wan::backhaul_ipv6_prefix[2];
#ifdef FEATURE_IPA_ANDROID
-int IPACM_Wan::ipa_if_num_tether_v4_total = 0;
-int IPACM_Wan::ipa_if_num_tether_v6_total = 0;
+uint32_t IPACM_Wan::ipa_if_num_tether_v4_total = 0;
+uint32_t IPACM_Wan::ipa_if_num_tether_v6_total = 0;
int IPACM_Wan::ipa_if_num_tether_v4[IPA_MAX_IFACE_ENTRIES];
int IPACM_Wan::ipa_if_num_tether_v6[IPA_MAX_IFACE_ENTRIES];
@@ -93,6 +96,7 @@ IPACM_Wan::IPACM_Wan(int iface_index,
wan_route_rule_v6_hdl = NULL;
wan_route_rule_v6_hdl_a5 = NULL;
wan_client = NULL;
+ mac_addr = NULL;
if(iface_query != NULL)
{
@@ -193,15 +197,18 @@ IPACM_Wan::~IPACM_Wan()
/* handle new_address event */
int IPACM_Wan::handle_addr_evt(ipacm_event_data_addr *data)
{
- struct ipa_ioc_add_rt_rule *rt_rule;
+ struct ipa_ioc_add_rt_rule *rt_rule = NULL;
struct ipa_rt_rule_add *rt_rule_entry;
struct ipa_ioc_add_flt_rule *flt_rule;
struct ipa_flt_rule_add flt_rule_entry;
struct ipa_ioc_get_hdr hdr;
const int NUM_RULES = 1;
- int num_ipv6_addr, len;
- int res = IPACM_SUCCESS;
+ uint32_t num_ipv6_addr;
+ int res = IPACM_SUCCESS,len;
+#ifdef FEATURE_IPACM_HAL
+ IPACM_OffloadManager* OffloadMng;
+#endif
memset(&hdr, 0, sizeof(hdr));
if(tx_prop == NULL || rx_prop == NULL)
@@ -501,6 +508,16 @@ int IPACM_Wan::handle_addr_evt(ipacm_event_data_addr *data)
IPACMDBG_H("Receved wan ipv4-addr:0x%x\n",wan_v4_addr);
}
+#ifdef FEATURE_IPACM_HAL
+ /* check if having pending add_downstream cache*/
+ OffloadMng = IPACM_OffloadManager::GetInstance();
+ if (OffloadMng == NULL) {
+ IPACMERR("failed to get IPACM_OffloadManager instance !\n");
+ } else {
+ IPACMDBG_H(" check iface %s if having add_downstream cache events\n", dev_name);
+ OffloadMng->search_framwork_cache(dev_name);
+ }
+#endif
IPACMDBG_H("number of default route rules %d\n", num_dft_rt_v6);
fail:
@@ -544,7 +561,7 @@ void IPACM_Wan::event_callback(ipa_cm_event_id event, void *param)
if ((ipa_interface_index == ipa_if_num) && (m_is_sta_mode == Q6_WAN))
{
is_xlat = true;
- IPACMDBG_H("WAN-LTE (%s) link up, iface: %d is_xlat: \n",
+ IPACMDBG_H("WAN-LTE (%s) link up, iface: %d is_xlat: %d\n",
IPACM_Iface::ipacmcfg->iface_table[ipa_interface_index].iface_name,data->if_index, is_xlat);
}
break;
@@ -1077,7 +1094,7 @@ void IPACM_Wan::event_callback(ipa_cm_event_id event, void *param)
}
else if (data->iptype == IPA_IP_v6)
{
- for (int num_ipv6_addr = 0; num_ipv6_addr < num_dft_rt_v6; num_ipv6_addr++)
+ for (uint32_t 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]) &&
@@ -1252,11 +1269,9 @@ int IPACM_Wan::handle_route_add_evt(ipa_ip_type iptype)
/* add default WAN route */
struct ipa_ioc_add_rt_rule *rt_rule = NULL;
struct ipa_rt_rule_add *rt_rule_entry;
- struct ipa_ioc_get_hdr sRetHeader;
- uint32_t cnt, tx_index = 0;
+ uint32_t tx_index = 0;
const int NUM = 1;
ipacm_cmd_q_data evt_data;
- struct ipa_ioc_copy_hdr sCopyHeader; /* checking if partial header*/
struct ipa_ioc_get_hdr hdr;
IPACMDBG_H("ip-type:%d\n", iptype);
@@ -1582,7 +1597,7 @@ int IPACM_Wan::handle_route_add_evt(ipa_ip_type iptype)
IPACM_Wan::xlat_mux_id = ext_prop->ext[0].mux_id;
wanup_data->xlat_mux_id = IPACM_Wan::xlat_mux_id;
IPACMDBG_H("Set xlat configuraiton with below information:\n");
- IPACMDBG_H("xlat_enabled: xlat_mux_id: %d \n",
+ IPACMDBG_H("xlat_enabled: %d xlat_mux_id: %d \n",
is_xlat, xlat_mux_id);
}
else
@@ -1710,7 +1725,7 @@ int IPACM_Wan::post_wan_down_tether_evt(ipa_ip_type iptype, int ipa_if_num_tethe
{
ipacm_cmd_q_data evt_data;
ipacm_event_iface_up_tehter *wandown_data;
- int i, j;
+ uint32_t i, j;
wandown_data = (ipacm_event_iface_up_tehter *)malloc(sizeof(ipacm_event_iface_up_tehter));
if (wandown_data == NULL)
@@ -3179,10 +3194,6 @@ int IPACM_Wan::init_fl_rule_ex(ipa_ip_type iptype)
{
int res = IPACM_SUCCESS;
- char *dev_wlan0="wlan0";
- char *dev_wlan1="wlan1";
- char *dev_ecm0="ecm0";
-
/* ADD corresponding ipa_rm_resource_name of RX-endpoint before adding all IPV4V6 FT-rules */
IPACMDBG_H(" dun add producer dependency from %s with registered rx-prop\n", dev_name);
@@ -3417,7 +3428,8 @@ fail:
int IPACM_Wan::query_ext_prop()
{
- int fd, ret = IPACM_SUCCESS, cnt;
+ int fd, ret = IPACM_SUCCESS;
+ uint32_t cnt;
if (iface_query->num_ext_props > 0)
{
@@ -3773,7 +3785,11 @@ int IPACM_Wan::add_dft_filtering_rule(struct ipa_flt_rule_add *rules, int rule_o
flt_rule_entry.rule.eq_attrib.protocol_eq_present = 1;
flt_rule_entry.rule.eq_attrib.protocol_eq = IPACM_FIREWALL_IPPROTO_TCP;
+#ifdef FEATURE_IPA_V3
+ flt_rule_entry.rule.eq_attrib.rule_eq_bitmap |= (1<<7);
+#else
flt_rule_entry.rule.eq_attrib.rule_eq_bitmap |= (1<<8);
+#endif
flt_rule_entry.rule.eq_attrib.num_ihl_offset_meq_32 = 1;
flt_rule_entry.rule.eq_attrib.ihl_offset_meq_32[0].offset = 12;
@@ -4310,7 +4326,7 @@ int IPACM_Wan::config_dft_embms_rules(ipa_ioc_add_flt_rule *pFilteringTable_v4,
int IPACM_Wan::handle_down_evt()
{
int res = IPACM_SUCCESS;
- int i;
+ uint32_t i;
IPACMDBG_H(" wan handle_down_evt \n");
@@ -4533,7 +4549,7 @@ fail:
int IPACM_Wan::handle_down_evt_ex()
{
int res = IPACM_SUCCESS;
- int i, tether_total;
+ uint32_t i, tether_total;
int ipa_if_num_tether_tmp[IPA_MAX_IFACE_ENTRIES];
IPACMDBG_H(" wan handle_down_evt \n");
@@ -5236,7 +5252,7 @@ int IPACM_Wan::handle_wan_hdr_init(uint8_t *mac_addr)
pHeaderDescriptor->hdr[0].name[IPA_RESOURCE_NAME_MAX-1] = '\0';
if (strlcat(pHeaderDescriptor->hdr[0].name, IPA_WAN_PARTIAL_HDR_NAME_v4, sizeof(pHeaderDescriptor->hdr[0].name)) > IPA_RESOURCE_NAME_MAX)
{
- IPACMERR(" header name construction failed exceed length (%d)\n", strlen(pHeaderDescriptor->hdr[0].name));
+ IPACMERR(" header name construction failed exceed length (%zu)\n", strlen(pHeaderDescriptor->hdr[0].name));
res = IPACM_FAILURE;
goto fail;
}
@@ -5244,7 +5260,7 @@ int IPACM_Wan::handle_wan_hdr_init(uint8_t *mac_addr)
snprintf(index,sizeof(index), "%d", header_name_count);
if (strlcat(pHeaderDescriptor->hdr[0].name, index, sizeof(pHeaderDescriptor->hdr[0].name)) > IPA_RESOURCE_NAME_MAX)
{
- IPACMERR(" header name construction failed exceed length (%d)\n", strlen(pHeaderDescriptor->hdr[0].name));
+ IPACMERR(" header name construction failed exceed length (%zu)\n", strlen(pHeaderDescriptor->hdr[0].name));
res = IPACM_FAILURE;
goto fail;
}
@@ -5333,14 +5349,14 @@ int IPACM_Wan::handle_wan_hdr_init(uint8_t *mac_addr)
pHeaderDescriptor->hdr[0].name[IPA_RESOURCE_NAME_MAX-1] = '\0';
if (strlcat(pHeaderDescriptor->hdr[0].name, IPA_WAN_PARTIAL_HDR_NAME_v6, sizeof(pHeaderDescriptor->hdr[0].name)) > IPA_RESOURCE_NAME_MAX)
{
- IPACMERR(" header name construction failed exceed length (%d)\n", strlen(pHeaderDescriptor->hdr[0].name));
+ IPACMERR(" header name construction failed exceed length (%zu)\n", strlen(pHeaderDescriptor->hdr[0].name));
res = IPACM_FAILURE;
goto fail;
}
snprintf(index,sizeof(index), "%d", header_name_count);
if (strlcat(pHeaderDescriptor->hdr[0].name, index, sizeof(pHeaderDescriptor->hdr[0].name)) > IPA_RESOURCE_NAME_MAX)
{
- IPACMERR(" header name construction failed exceed length (%d)\n", strlen(pHeaderDescriptor->hdr[0].name));
+ IPACMERR(" header name construction failed exceed length (%zu)\n", strlen(pHeaderDescriptor->hdr[0].name));
res = IPACM_FAILURE;
goto fail;
}
@@ -5456,7 +5472,7 @@ int IPACM_Wan::handle_wan_client_ipaddr(ipacm_event_data_all *data)
else
{
if ((data->ipv6_addr[0] != 0) || (data->ipv6_addr[1] != 0) ||
- (data->ipv6_addr[2] != 0) || (data->ipv6_addr[3] || 0)) /* check if all 0 not valid ipv6 address */
+ (data->ipv6_addr[2] != 0) || (data->ipv6_addr[3] != 0)) /* check if all 0 not valid ipv6 address */
{
IPACMDBG_H("ipv6 address: 0x%x:%x:%x:%x\n", data->ipv6_addr[0], data->ipv6_addr[1], data->ipv6_addr[2], data->ipv6_addr[3]);
if(get_client_memptr(wan_client, clnt_indx)->ipv6_set < IPV6_NUM_ADDR)
@@ -5487,6 +5503,11 @@ int IPACM_Wan::handle_wan_client_ipaddr(ipacm_event_data_all *data)
return IPACM_FAILURE; /* not setup the RT rules*/
}
}
+ else
+ {
+ IPACMDBG_H("Invalid IPV6 address\n");
+ return IPACM_FAILURE;
+ }
}
return IPACM_SUCCESS;
@@ -5831,7 +5852,7 @@ void IPACM_Wan::handle_wan_client_SCC_MCC_switch(bool isSCCMode, ipa_ip_type ipt
int size = sizeof(struct ipa_ioc_mdfy_rt_rule) +
NUM_RULES * sizeof(struct ipa_rt_rule_mdfy);
- IPACMDBG("\n");
+ IPACMDBG("isSCCMode: %d\n",isSCCMode);
if (tx_prop == NULL || is_default_gateway == false)
{
@@ -6008,7 +6029,7 @@ int IPACM_Wan::handle_network_stats_update(ipa_get_apn_data_stats_resp_msg_v01 *
{
FILE *fp = NULL;
- for (int apn_index =0; apn_index < data->apn_data_stats_list_len; apn_index++)
+ for (uint32_t apn_index =0; apn_index < data->apn_data_stats_list_len; apn_index++)
{
if(data->apn_data_stats_list[apn_index].mux_id == ext_prop->ext[0].mux_id)
{
@@ -6127,7 +6148,7 @@ int IPACM_Wan::add_dummy_rx_hdr()
if (strlcat(ipv6_hdr->name, IPA_DUMMY_ETH_HDR_NAME_v6, sizeof(ipv6_hdr->name)) > IPA_RESOURCE_NAME_MAX)
{
- IPACMERR(" header name construction failed exceed length (%d)\n", strlen(ipv6_hdr->name));
+ IPACMERR(" header name construction failed exceed length (%zu)\n", strlen(ipv6_hdr->name));
return IPACM_FAILURE;
}
diff --git a/msm8998/ipacm/src/IPACM_Wlan.cpp b/msm8998/ipacm/src/IPACM_Wlan.cpp
index b47c5ef..53e56cf 100644
--- a/msm8998/ipacm/src/IPACM_Wlan.cpp
+++ b/msm8998/ipacm/src/IPACM_Wlan.cpp
@@ -147,7 +147,6 @@ void IPACM_Wlan::event_callback(ipa_cm_event_id event, void *param)
int ipa_interface_index;
int wlan_index;
ipacm_ext_prop* ext_prop;
- ipacm_event_iface_up* data_wan;
ipacm_event_iface_up_tehter* data_wan_tether;
switch (event)
@@ -268,6 +267,7 @@ void IPACM_Wlan::event_callback(ipa_cm_event_id event, void *param)
handle_private_subnet(data->iptype);
#endif
+#ifndef FEATURE_IPACM_HAL
if (IPACM_Wan::isWanUP(ipa_if_num))
{
if(data->iptype == IPA_IP_v4 || data->iptype == IPA_IP_MAX)
@@ -309,6 +309,7 @@ void IPACM_Wlan::event_callback(ipa_cm_event_id event, void *param)
} else {
IPACMDBG_H("Wan_V6 haven't up yet \n");
}
+#endif
/* checking if SW-RT_enable */
if (IPACM_Iface::ipacmcfg->ipa_sw_rt_enable == true)
{
@@ -536,7 +537,13 @@ void IPACM_Wlan::event_callback(ipa_cm_event_id event, void *param)
if(ip_type == IPA_IP_MAX || ip_type == data->prefix.iptype)
{
if (data->prefix.iptype == IPA_IP_v6) /* ipv6 only */
- install_ipv6_prefix_flt_rule(IPACM_Wan::backhaul_ipv6_prefix);
+ {
+ /* Only offload clients has same prefix as Andorid gave */
+ ipv6_prefix[0] = data->prefix.v6Addr[0];
+ ipv6_prefix[1] = data->prefix.v6Addr[1];
+ IPACMDBG_H("ipv6_prefix0x%x:%x\n", ipv6_prefix[0], ipv6_prefix[1]);
+ install_ipv6_prefix_flt_rule(ipv6_prefix);
+ }
if (IPACM_Wan::backhaul_is_sta_mode == false) /* LTE */
{
@@ -583,7 +590,7 @@ void IPACM_Wlan::event_callback(ipa_cm_event_id event, void *param)
case IPA_HANDLE_WAN_UP:
IPACMDBG_H("Received IPA_HANDLE_WAN_UP event\n");
- data_wan = (ipacm_event_iface_up*)param;
+ ipacm_event_iface_up* data_wan = (ipacm_event_iface_up*)param;
if(data_wan == NULL)
{
IPACMERR("No event data is found.\n");
@@ -1014,14 +1021,14 @@ int IPACM_Wlan::handle_wlan_client_init_ex(ipacm_event_data_wlan_ex *data)
if (strlcat(pHeaderDescriptor->hdr[0].name, IPA_WLAN_PARTIAL_HDR_NAME_v4, sizeof(pHeaderDescriptor->hdr[0].name)) > IPA_RESOURCE_NAME_MAX)
{
- IPACMERR(" header name construction failed exceed length (%d)\n", strlen(pHeaderDescriptor->hdr[0].name));
+ IPACMERR(" header name construction failed exceed length (%zu)\n", strlen(pHeaderDescriptor->hdr[0].name));
res = IPACM_FAILURE;
goto fail;
}
snprintf(index,sizeof(index), "%d", header_name_count);
if (strlcat(pHeaderDescriptor->hdr[0].name, index, sizeof(pHeaderDescriptor->hdr[0].name)) > IPA_RESOURCE_NAME_MAX)
{
- IPACMERR(" header name construction failed exceed length (%d)\n", strlen(pHeaderDescriptor->hdr[0].name));
+ IPACMERR(" header name construction failed exceed length (%zu)\n", strlen(pHeaderDescriptor->hdr[0].name));
res = IPACM_FAILURE;
goto fail;
}
@@ -1128,7 +1135,7 @@ int IPACM_Wlan::handle_wlan_client_init_ex(ipacm_event_data_wlan_ex *data)
pHeaderDescriptor->hdr[0].name[IPA_RESOURCE_NAME_MAX-1] = '\0';
if (strlcat(pHeaderDescriptor->hdr[0].name, IPA_WLAN_PARTIAL_HDR_NAME_v6, sizeof(pHeaderDescriptor->hdr[0].name)) > IPA_RESOURCE_NAME_MAX)
{
- IPACMERR(" header name construction failed exceed length (%d)\n", strlen(pHeaderDescriptor->hdr[0].name));
+ IPACMERR(" header name construction failed exceed length (%zu)\n", strlen(pHeaderDescriptor->hdr[0].name));
res = IPACM_FAILURE;
goto fail;
}
@@ -1136,7 +1143,7 @@ int IPACM_Wlan::handle_wlan_client_init_ex(ipacm_event_data_wlan_ex *data)
snprintf(index,sizeof(index), "%d", header_name_count);
if (strlcat(pHeaderDescriptor->hdr[0].name, index, sizeof(pHeaderDescriptor->hdr[0].name)) > IPA_RESOURCE_NAME_MAX)
{
- IPACMERR(" header name construction failed exceed length (%d)\n", strlen(pHeaderDescriptor->hdr[0].name));
+ IPACMERR(" header name construction failed exceed length (%zu)\n", strlen(pHeaderDescriptor->hdr[0].name));
res = IPACM_FAILURE;
goto fail;
}
@@ -1251,13 +1258,14 @@ int IPACM_Wlan::handle_wlan_client_ipaddr(ipacm_event_data_all *data)
else
{
if ((data->ipv6_addr[0] != 0) || (data->ipv6_addr[1] != 0) ||
- (data->ipv6_addr[2] != 0) || (data->ipv6_addr[3] || 0)) /* check if all 0 not valid ipv6 address */
+ (data->ipv6_addr[2] != 0) || (data->ipv6_addr[3] != 0)) /* check if all 0 not valid ipv6 address */
{
IPACMDBG_H("ipv6 address: 0x%x:%x:%x:%x\n", data->ipv6_addr[0], data->ipv6_addr[1], data->ipv6_addr[2], data->ipv6_addr[3]);
if( (data->ipv6_addr[0] & ipv6_link_local_prefix_mask) != (ipv6_link_local_prefix & ipv6_link_local_prefix_mask) &&
memcmp(ipv6_prefix, data->ipv6_addr, sizeof(ipv6_prefix)) != 0)
{
IPACMDBG_H("This IPv6 address is not global IPv6 address with correct prefix, ignore.\n");
+ IPACMDBG_H("ipv6 address: 0x%x:%x ipv6_prefix0x%x:%x\n", data->ipv6_addr[0], data->ipv6_addr[1], ipv6_prefix[0], ipv6_prefix[1]);
return IPACM_FAILURE;
}
@@ -1290,6 +1298,11 @@ int IPACM_Wlan::handle_wlan_client_ipaddr(ipacm_event_data_all *data)
return IPACM_FAILURE; /* not setup the RT rules*/
}
}
+ else
+ {
+ IPACMDBG_H("IPV6 address is invalid\n");
+ return IPACM_FAILURE;
+ }
}
return IPACM_SUCCESS;
@@ -1682,7 +1695,9 @@ int IPACM_Wlan::handle_wlan_client_down_evt(uint8_t *mac_addr)
/*handle wlan iface down event*/
int IPACM_Wlan::handle_down_evt()
{
- int res = IPACM_SUCCESS, i, num_private_subnet_fl_rule;
+ int res = IPACM_SUCCESS, num_private_subnet_fl_rule;
+ uint32_t i;
+ num_private_subnet_fl_rule = 0;
IPACMDBG_H("WLAN ip-type: %d \n", ip_type);
/* no iface address up, directly close iface*/
@@ -1921,7 +1936,8 @@ fail:
/*handle reset wifi-client rt-rules */
int IPACM_Wlan::handle_wlan_client_reset_rt(ipa_ip_type iptype)
{
- int i, res = IPACM_SUCCESS;
+ uint32_t i;
+ int res = IPACM_SUCCESS;
/* clean wifi-client routing rules */
IPACMDBG_H("left %d wifi clients to reset ip-type(%d) rules \n ", num_wifi_client, iptype);
@@ -2158,7 +2174,7 @@ void IPACM_Wlan::handle_SCC_MCC_switch(ipa_ip_type iptype)
void IPACM_Wlan::eth_bridge_handle_wlan_mode_switch()
{
- int i;
+ uint32_t i;
/* ====== post events to mimic WLAN interface goes down/up when AP mode is changing ====== */
diff --git a/msm8998/ipanat/src/Android.mk b/msm8998/ipanat/src/Android.mk
index 7701858..dfb84b1 100644
--- a/msm8998/ipanat/src/Android.mk
+++ b/msm8998/ipanat/src/Android.mk
@@ -16,7 +16,7 @@ LOCAL_SRC_FILES := ipa_nat_drv.c \
LOCAL_VENDOR_MODULE := true
-LOCAL_CFLAGS := -DDEBUG
+LOCAL_CFLAGS := -DDEBUG -Wall -Werror
LOCAL_MODULE := libipanat
LOCAL_MODULE_TAGS := optional
LOCAL_PRELINK_MODULE := false
diff --git a/msm8998/ipanat/src/ipa_nat_drvi.c b/msm8998/ipanat/src/ipa_nat_drvi.c
index 9b96c44..dcb7c9e 100644
--- a/msm8998/ipanat/src/ipa_nat_drvi.c
+++ b/msm8998/ipanat/src/ipa_nat_drvi.c
@@ -720,9 +720,9 @@ int ipa_nati_alloc_table(uint16_t number_of_entries,
/* Calclate the memory size for both table and index table entries */
mem->size = (IPA_NAT_TABLE_ENTRY_SIZE * total_entries);
- IPADBG("Nat Table size: %d\n", mem->size);
+ IPADBG("Nat Table size: %zu\n", mem->size);
mem->size += (IPA_NAT_INDEX_TABLE_ENTRY_SIZE * total_entries);
- IPADBG("Nat Base and Index Table size: %d\n", mem->size);
+ IPADBG("Nat Base and Index Table size: %zu\n", mem->size);
if (!ipv4_nat_cache.ipa_fd) {
fd = open(IPA_DEV_NAME, O_RDONLY);