diff options
author | Xin Li <delphij@google.com> | 2017-12-06 11:52:04 -0800 |
---|---|---|
committer | Xin Li <delphij@google.com> | 2017-12-06 14:24:51 -0800 |
commit | 41ee806c7f63745fed424c93e60fe9d3b97155b9 (patch) | |
tree | 0525a31ae05b46b580f350a806d3bd7a22dbd4af | |
parent | 6ddd298ba89a5dab0db5c63ced61ea511db7952d (diff) | |
parent | 109deb5cdc347d1bea64154fca9ac1751e841536 (diff) | |
download | ipacfg-mgr-41ee806c7f63745fed424c93e60fe9d3b97155b9.tar.gz |
DO NOT MERGE: Merge Oreo MR1 into masterandroid-wear-p-preview-2android-wear-8.0.0_r1android-p-preview-5android-p-preview-4android-p-preview-3android-p-preview-2android-p-preview-1android-o-mr1-iot-release-1.0.2android-o-mr1-iot-release-1.0.1android-o-mr1-iot-release-1.0.0android-o-mr1-iot-preview-8android-o-mr1-iot-preview-7o-mr1-iot-preview-8o-mr1-iot-preview-7
Exempt-From-Owner-Approval: Changes already landed internally
Change-Id: I33b630ec5f11bf5de0f467a8cd14a5e55548ea8a
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, "a) < 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); |