aboutsummaryrefslogtreecommitdiff
path: root/data-ipa-cfg-mgr/ipacm
diff options
context:
space:
mode:
authorBruno Martins <bgcngm@gmail.com>2018-09-07 17:34:01 +0100
committerDavide Garberi <dade.garberi@gmail.com>2018-09-13 15:22:10 +0200
commit9b3b1b12a25947f1d09e445e96cb66e5190275ac (patch)
tree03b1e1fa70f82097e81f4a271645dee3391767d7 /data-ipa-cfg-mgr/ipacm
parent0bde58e2bc8440f4d98f0d383dad26f450ad8fd8 (diff)
msm8996-common: Update IPACM for P release
* Tag: LA.UM.7.5.r1-02200-8x96.0 Change-Id: Id7f0760c0dd1e5476db88d6089d0084eae127a49 Signed-off-by: Davide Garberi <dade.garberi@gmail.com>
Diffstat (limited to 'data-ipa-cfg-mgr/ipacm')
-rw-r--r--data-ipa-cfg-mgr/ipacm/inc/IPACM_Config.h9
-rw-r--r--data-ipa-cfg-mgr/ipacm/inc/IPACM_Conntrack_NATApp.h5
-rw-r--r--data-ipa-cfg-mgr/ipacm/inc/IPACM_Defs.h4
-rw-r--r--data-ipa-cfg-mgr/ipacm/inc/IPACM_Iface.h1
-rw-r--r--data-ipa-cfg-mgr/ipacm/inc/IPACM_Lan.h10
-rw-r--r--data-ipa-cfg-mgr/ipacm/inc/IPACM_Netlink.h3
-rw-r--r--data-ipa-cfg-mgr/ipacm/inc/IPACM_OffloadManager.h9
-rw-r--r--data-ipa-cfg-mgr/ipacm/inc/IPACM_Wan.h3
-rw-r--r--data-ipa-cfg-mgr/ipacm/inc/IPACM_Wlan.h5
-rw-r--r--data-ipa-cfg-mgr/ipacm/src/Android.mk17
-rw-r--r--data-ipa-cfg-mgr/ipacm/src/IPACM_Config.cpp26
-rw-r--r--data-ipa-cfg-mgr/ipacm/src/IPACM_ConntrackListener.cpp3
-rw-r--r--data-ipa-cfg-mgr/ipacm/src/IPACM_Conntrack_NATApp.cpp24
-rw-r--r--data-ipa-cfg-mgr/ipacm/src/IPACM_Filtering.cpp8
-rw-r--r--data-ipa-cfg-mgr/ipacm/src/IPACM_Iface.cpp105
-rw-r--r--data-ipa-cfg-mgr/ipacm/src/IPACM_IfaceManager.cpp28
-rw-r--r--data-ipa-cfg-mgr/ipacm/src/IPACM_Lan.cpp279
-rw-r--r--data-ipa-cfg-mgr/ipacm/src/IPACM_LanToLan.cpp5
-rw-r--r--data-ipa-cfg-mgr/ipacm/src/IPACM_Main.cpp45
-rw-r--r--data-ipa-cfg-mgr/ipacm/src/IPACM_Netlink.cpp8
-rw-r--r--data-ipa-cfg-mgr/ipacm/src/IPACM_OffloadManager.cpp188
-rw-r--r--data-ipa-cfg-mgr/ipacm/src/IPACM_Wan.cpp179
-rw-r--r--data-ipa-cfg-mgr/ipacm/src/IPACM_Wlan.cpp114
-rw-r--r--data-ipa-cfg-mgr/ipacm/src/IPACM_Xml.cpp23
24 files changed, 897 insertions, 204 deletions
diff --git a/data-ipa-cfg-mgr/ipacm/inc/IPACM_Config.h b/data-ipa-cfg-mgr/ipacm/inc/IPACM_Config.h
index 4afff00..524f4ac 100644
--- a/data-ipa-cfg-mgr/ipacm/inc/IPACM_Config.h
+++ b/data-ipa-cfg-mgr/ipacm/inc/IPACM_Config.h
@@ -46,9 +46,9 @@ IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
typedef struct
{
- char iface_name[IPA_IFACE_NAME_LEN];
- bool v4_up;
- bool v6_up;
+ char iface_name[IPA_IFACE_NAME_LEN];
+ bool v4_up;
+ bool v6_up;
}NatIfaces;
/* for IPACM rm dependency use*/
@@ -254,6 +254,8 @@ public:
int DelExtProp(ipa_ip_type ip_type);
+ enum ipa_hw_type GetIPAVer(bool get = false);
+
int Init(void);
inline bool isPrivateSubnet(uint32_t ip_addr)
@@ -349,6 +351,7 @@ public:
static const char *DEVICE_NAME_ODU;
private:
+ enum ipa_hw_type ver;
static IPACM_Config *pInstance;
static const char *DEVICE_NAME;
IPACM_Config(void);
diff --git a/data-ipa-cfg-mgr/ipacm/inc/IPACM_Conntrack_NATApp.h b/data-ipa-cfg-mgr/ipacm/inc/IPACM_Conntrack_NATApp.h
index e50b316..c3749e1 100644
--- a/data-ipa-cfg-mgr/ipacm/inc/IPACM_Conntrack_NATApp.h
+++ b/data-ipa-cfg-mgr/ipacm/inc/IPACM_Conntrack_NATApp.h
@@ -1,5 +1,5 @@
/*
-Copyright (c) 2013-2016, The Linux Foundation. All rights reserved.
+Copyright (c) 2013-2017, The Linux Foundation. All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
@@ -102,11 +102,12 @@ private:
bool isAlgPort(uint8_t, uint16_t);
void Reset();
bool isPwrSaveIf(uint32_t);
+ uint32_t GenerateMetdata(uint8_t mux_id);
public:
static NatApp* GetInstance();
- int AddTable(uint32_t);
+ int AddTable(uint32_t, uint8_t mux_id);
uint32_t GetTableHdl(uint32_t);
int DeleteTable(uint32_t);
diff --git a/data-ipa-cfg-mgr/ipacm/inc/IPACM_Defs.h b/data-ipa-cfg-mgr/ipacm/inc/IPACM_Defs.h
index bd47e02..051184d 100644
--- a/data-ipa-cfg-mgr/ipacm/inc/IPACM_Defs.h
+++ b/data-ipa-cfg-mgr/ipacm/inc/IPACM_Defs.h
@@ -1,5 +1,5 @@
/*
-Copyright (c) 2013-2017, The Linux Foundation. All rights reserved.
+Copyright (c) 2013-2018, The Linux Foundation. All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
@@ -195,6 +195,7 @@ typedef enum
IPA_HANDLE_VLAN_CLIENT_INFO, /* ipacm_event_data_all */
IPA_HANDLE_VLAN_IFACE_INFO, /* ipacm_event_data_all */
#endif
+ IPA_WLAN_FWR_SSR_BEFORE_SHUTDOWN_NOTICE,
IPA_LAN_DELETE_SELF, /* ipacm_event_data_fid */
IPACM_EVENT_MAX
} ipa_cm_event_id;
@@ -342,6 +343,7 @@ typedef struct _ipacm_event_iface_up
uint32_t ipv6_prefix[2];
bool is_sta;
uint8_t xlat_mux_id;
+ uint8_t mux_id;
}ipacm_event_iface_up;
typedef struct _ipacm_event_iface_up_tether
diff --git a/data-ipa-cfg-mgr/ipacm/inc/IPACM_Iface.h b/data-ipa-cfg-mgr/ipacm/inc/IPACM_Iface.h
index 83e09d4..a562613 100644
--- a/data-ipa-cfg-mgr/ipacm/inc/IPACM_Iface.h
+++ b/data-ipa-cfg-mgr/ipacm/inc/IPACM_Iface.h
@@ -144,6 +144,7 @@ public:
/* software routing disable */
virtual int handle_software_routing_disable(void);
+ void delete_iface(void);
private:
diff --git a/data-ipa-cfg-mgr/ipacm/inc/IPACM_Lan.h b/data-ipa-cfg-mgr/ipacm/inc/IPACM_Lan.h
index f27cb82..03219c5 100644
--- a/data-ipa-cfg-mgr/ipacm/inc/IPACM_Lan.h
+++ b/data-ipa-cfg-mgr/ipacm/inc/IPACM_Lan.h
@@ -1,5 +1,5 @@
/*
-Copyright (c) 2013-2017, The Linux Foundation. All rights reserved.
+Copyright (c) 2013-2018, The Linux Foundation. All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
@@ -241,6 +241,12 @@ protected:
/* handle tethering client */
int handle_tethering_client(bool reset, ipacm_client_enum ipa_client);
+ /* add tcp syn flt rule */
+ int add_tcp_syn_flt_rule(ipa_ip_type iptype);
+
+ /* add tcp syn flt rule for l2tp interface*/
+ int add_tcp_syn_flt_rule_l2tp(ipa_ip_type inner_ip_type);
+
/* store ipv4 UL filter rule handlers from Q6*/
uint32_t wan_ul_fl_rule_hdl_v4[MAX_WAN_UL_FILTER_RULES];
@@ -272,6 +278,8 @@ protected:
bool is_downstream_set[IPA_IP_MAX];
_ipacm_offload_prefix prefix[IPA_IP_MAX];
+ uint32_t tcp_syn_flt_rule_hdl[IPA_IP_MAX];
+
private:
/* get hdr proc ctx type given source and destination l2 hdr type */
diff --git a/data-ipa-cfg-mgr/ipacm/inc/IPACM_Netlink.h b/data-ipa-cfg-mgr/ipacm/inc/IPACM_Netlink.h
index b0bdeb8..81f1968 100644
--- a/data-ipa-cfg-mgr/ipacm/inc/IPACM_Netlink.h
+++ b/data-ipa-cfg-mgr/ipacm/inc/IPACM_Netlink.h
@@ -51,6 +51,9 @@ extern "C"
#include <pthread.h>
#include <sys/select.h>
#include <sys/socket.h>
+#include <linux/socket.h>
+#include <inaddr.h>
+#define sockaddr_storage __kernel_sockaddr_storage
#include <linux/if.h>
#include <linux/if_addr.h>
#include <linux/rtnetlink.h>
diff --git a/data-ipa-cfg-mgr/ipacm/inc/IPACM_OffloadManager.h b/data-ipa-cfg-mgr/ipacm/inc/IPACM_OffloadManager.h
index 5100ce3..88a411b 100644
--- a/data-ipa-cfg-mgr/ipacm/inc/IPACM_OffloadManager.h
+++ b/data-ipa-cfg-mgr/ipacm/inc/IPACM_OffloadManager.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2017, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2017-2018, The Linux Foundation. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are
@@ -94,6 +94,8 @@ public:
bool search_framwork_cache(char * interface_name);
+ bool push_framework_event(const char * if_name, _ipacm_offload_prefix prefix);
+
private:
std::list<std::string> valid_ifaces;
@@ -110,11 +112,14 @@ private:
int resetTetherStats(const char *upstream_name);
+#ifdef FEATURE_IPACM_RESTART
+ int push_iface_up(const char *if_name, bool upstream);
+#endif
+
static const char *DEVICE_NAME;
/* cache the add_downstream events if netdev is not ready */
framework_event_cache event_cache[MAX_EVENT_CACHE];
- bool is_cache;
/* latest update cache entry */
int latest_cache_index;
diff --git a/data-ipa-cfg-mgr/ipacm/inc/IPACM_Wan.h b/data-ipa-cfg-mgr/ipacm/inc/IPACM_Wan.h
index 6e971b8..29b1341 100644
--- a/data-ipa-cfg-mgr/ipacm/inc/IPACM_Wan.h
+++ b/data-ipa-cfg-mgr/ipacm/inc/IPACM_Wan.h
@@ -94,7 +94,8 @@ class IPACM_Wan : public IPACM_Iface
{
public:
-
+ /* IPACM pm_depency q6 check*/
+ static int ipa_pm_q6_check;
static bool wan_up;
static bool wan_up_v6;
static uint8_t xlat_mux_id;
diff --git a/data-ipa-cfg-mgr/ipacm/inc/IPACM_Wlan.h b/data-ipa-cfg-mgr/ipacm/inc/IPACM_Wlan.h
index 5fee0fa..94623f9 100644
--- a/data-ipa-cfg-mgr/ipacm/inc/IPACM_Wlan.h
+++ b/data-ipa-cfg-mgr/ipacm/inc/IPACM_Wlan.h
@@ -234,6 +234,11 @@ private:
void handle_SCC_MCC_switch(ipa_ip_type);
+#ifdef FEATURE_IPACM_RESTART
+ /*query wlan-clients */
+ int ipa_query_wlan_client();
+#endif
+
};
diff --git a/data-ipa-cfg-mgr/ipacm/src/Android.mk b/data-ipa-cfg-mgr/ipacm/src/Android.mk
index e6d993d..728dc7e 100644
--- a/data-ipa-cfg-mgr/ipacm/src/Android.mk
+++ b/data-ipa-cfg-mgr/ipacm/src/Android.mk
@@ -1,4 +1,6 @@
BOARD_IPAv3_LIST := msm8998
+BOARD_IPAv3_LIST += sdm845
+BOARD_IPAv3_LIST += sdm710
LOCAL_PATH := $(call my-dir)
@@ -6,22 +8,12 @@ include $(CLEAR_VARS)
LOCAL_C_INCLUDES := $(LOCAL_PATH)/../src
LOCAL_C_INCLUDES += $(LOCAL_PATH)/../inc
-LOCAL_C_INCLUDES += $(LOCAL_PATH)/../../ipanat/inc
-LOCAL_C_INCLUDES += $(LOCAL_PATH)/../../hal/inc
-ifeq ($(call is-platform-sdk-version-at-least,20),true)
-LOCAL_C_INCLUDES += external/icu/icu4c/source/common
-else
-LOCAL_C_INCLUDES += external/icu4c/common
-endif
-#LOCAL_C_INCLUDES += external/dhcpcd
-LOCAL_C_INCLUDES += external/libxml2/include
-LOCAL_C_INCLUDES += external/libnetfilter_conntrack/include
-LOCAL_C_INCLUDES += external/libnfnetlink/include
LOCAL_C_INCLUDES += $(TARGET_OUT_INTERMEDIATES)/KERNEL_OBJ/usr/include
LOCAL_ADDITIONAL_DEPENDENCIES := INSTALLED_KERNEL_HEADERS
-LOCAL_CFLAGS += -DFEATURE_IPA_ANDROID
+LOCAL_CFLAGS := -DFEATURE_IPA_ANDROID
+LOCAL_CFLAGS += -DFEATURE_IPACM_RESTART
LOCAL_CFLAGS += -DFEATURE_IPACM_HAL -Wall -Werror -Wno-error=macro-redefined
ifneq (,$(filter userdebug eng, $(TARGET_BUILD_VARIANT)))
LOCAL_CFLAGS += -DDEBUG
@@ -36,7 +28,6 @@ LOCAL_CFLAGS += $(shell if [ -a $(filetoadd) ] ; then echo -include $(filetoadd)
filetoadd = bionic/libc/kernel/arch-arm/asm/byteorder.h
LOCAL_CFLAGS += $(shell if [ -a $(filetoadd) ] ; then echo -include $(filetoadd) ; fi ;)
-
LOCAL_SRC_FILES := IPACM_Main.cpp \
IPACM_EvtDispatcher.cpp \
IPACM_Config.cpp \
diff --git a/data-ipa-cfg-mgr/ipacm/src/IPACM_Config.cpp b/data-ipa-cfg-mgr/ipacm/src/IPACM_Config.cpp
index c46bc71..90d3647 100644
--- a/data-ipa-cfg-mgr/ipacm/src/IPACM_Config.cpp
+++ b/data-ipa-cfg-mgr/ipacm/src/IPACM_Config.cpp
@@ -1,5 +1,5 @@
/*
-Copyright (c) 2013-2018, The Linux Foundation. All rights reserved.
+Copyright (c) 2013-2017, The Linux Foundation. All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
@@ -106,6 +106,7 @@ const char *ipacm_event_name[] = {
__stringify(IPA_ETH_BRIDGE_CLIENT_ADD), /* ipacm_event_eth_bridge*/
__stringify(IPA_ETH_BRIDGE_CLIENT_DEL), /* ipacm_event_eth_bridge*/
__stringify(IPA_ETH_BRIDGE_WLAN_SCC_MCC_SWITCH), /* ipacm_event_eth_bridge*/
+ __stringify(IPA_WLAN_FWR_SSR_BEFORE_SHUTDOWN_NOTICE), /* ipacm_event_iface*/
__stringify(IPA_LAN_DELETE_SELF), /* ipacm_event_data_fid */
#ifdef FEATURE_L2TP
__stringify(IPA_ADD_VLAN_IFACE), /* ipa_ioc_vlan_iface_info */
@@ -183,6 +184,7 @@ int IPACM_Config::Init(void)
{
IPACMERR("Failed opening %s.\n", DEVICE_NAME);
}
+ ver = GetIPAVer(true);
#ifdef FEATURE_IPACM_HAL
strlcpy(IPACM_config_file, "/vendor/etc/IPACM_cfg.xml", sizeof(IPACM_config_file));
#else
@@ -574,8 +576,8 @@ int IPACM_Config::CheckNatIfaces(const char *dev_name, ipa_ip_type ip_type)
if (ip_type == IPA_IP_v6 && pNatIfaces[i].v6_up == true)
{
IPACMDBG_H(" v6_up=%d\n", pNatIfaces[i].v6_up);
- return 0;
- }
+ return 0;
+ }
return -1;
}
}
@@ -878,3 +880,21 @@ const char* IPACM_Config::getEventName(ipa_cm_event_id event_id)
return ipacm_event_name[event_id];
}
+
+enum ipa_hw_type IPACM_Config::GetIPAVer(bool get)
+{
+ int ret;
+
+ if(!get)
+ return ver;
+
+ ret = ioctl(m_fd, IPA_IOC_GET_HW_VERSION, &ver);
+ if(ret != 0)
+ {
+ IPACMERR("Failed to get IPA version with error %d.\n", ret);
+ ver = IPA_HW_None;
+ return IPA_HW_None;
+ }
+ IPACMDBG_H("IPA version is %d.\n", ver);
+ return ver;
+}
diff --git a/data-ipa-cfg-mgr/ipacm/src/IPACM_ConntrackListener.cpp b/data-ipa-cfg-mgr/ipacm/src/IPACM_ConntrackListener.cpp
index b7bb95d..29a70b9 100644
--- a/data-ipa-cfg-mgr/ipacm/src/IPACM_ConntrackListener.cpp
+++ b/data-ipa-cfg-mgr/ipacm/src/IPACM_ConntrackListener.cpp
@@ -1,7 +1,6 @@
/*
Copyright (c) 2013-2018, The Linux Foundation. All rights reserved.
-
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:
@@ -374,7 +373,7 @@ void IPACM_ConntrackListener::TriggerWANUp(void *in_param)
if(nat_inst != NULL)
{
- nat_inst->AddTable(wanup_data->ipv4_addr);
+ nat_inst->AddTable(wanup_data->ipv4_addr, wanup_data->mux_id);
}
IPACMDBG("creating nat threads\n");
diff --git a/data-ipa-cfg-mgr/ipacm/src/IPACM_Conntrack_NATApp.cpp b/data-ipa-cfg-mgr/ipacm/src/IPACM_Conntrack_NATApp.cpp
index 04cdd16..4004597 100644
--- a/data-ipa-cfg-mgr/ipacm/src/IPACM_Conntrack_NATApp.cpp
+++ b/data-ipa-cfg-mgr/ipacm/src/IPACM_Conntrack_NATApp.cpp
@@ -31,9 +31,13 @@ IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#ifdef FEATURE_IPACM_HAL
#include "IPACM_OffloadManager.h"
#endif
+#include "IPACM_Iface.h"
#define INVALID_IP_ADDR 0x0
+#define HDR_METADATA_MUX_ID_BMASK 0x00FF0000
+#define HDR_METADATA_MUX_ID_SHFT 0x10
+
/* NatApp class Implementation */
NatApp *NatApp::pInstance = NULL;
NatApp::NatApp()
@@ -134,9 +138,14 @@ NatApp* NatApp::GetInstance()
return pInstance;
}
+uint32_t NatApp::GenerateMetdata(uint8_t mux_id)
+{
+ return (mux_id << HDR_METADATA_MUX_ID_SHFT) & HDR_METADATA_MUX_ID_BMASK;
+}
+
/* NAT APP related object function definitions */
-int NatApp::AddTable(uint32_t pub_ip)
+int NatApp::AddTable(uint32_t pub_ip, uint8_t mux_id)
{
int ret;
int cnt = 0;
@@ -158,6 +167,19 @@ int NatApp::AddTable(uint32_t pub_ip)
IPACMERR("unable to create nat table Error:%d\n", ret);
return ret;
}
+ if(IPACM_Iface::ipacmcfg->GetIPAVer() >= IPA_HW_v4_0) {
+ /* modify PDN 0 so it will hold the mux ID in the src metadata field */
+ ipa_nat_pdn_entry entry;
+
+ entry.dst_metadata = 0;
+ entry.src_metadata = GenerateMetdata(mux_id);
+ entry.public_ip = pub_ip;
+ ret = ipa_nat_modify_pdn(nat_table_hdl, 0, &entry);
+ if(ret)
+ {
+ IPACMERR("unable to modify PDN 0 entry Error:%d INIT_HDR_METADATA register values will be used!\n", ret);
+ }
+ }
/* Add back the cached NAT-entry */
if (pub_ip == pub_ip_addr_pre)
diff --git a/data-ipa-cfg-mgr/ipacm/src/IPACM_Filtering.cpp b/data-ipa-cfg-mgr/ipacm/src/IPACM_Filtering.cpp
index 5b1f07a..f532c18 100644
--- a/data-ipa-cfg-mgr/ipacm/src/IPACM_Filtering.cpp
+++ b/data-ipa-cfg-mgr/ipacm/src/IPACM_Filtering.cpp
@@ -122,15 +122,15 @@ bool IPACM_Filtering::AddFilteringRule(struct ipa_ioc_add_flt_rule const *ruleTa
bool IPACM_Filtering::AddFilteringRuleAfter(struct ipa_ioc_add_flt_rule_after const *ruleTable)
{
+#ifdef FEATURE_IPA_V3
+ int retval = 0;
+
IPACMDBG("Printing filter add attributes\n");
IPACMDBG("ip type: %d\n", ruleTable->ip);
IPACMDBG("Number of rules: %d\n", ruleTable->num_rules);
IPACMDBG("End point: %d\n", ruleTable->ep);
IPACMDBG("commit value: %d\n", ruleTable->commit);
-#ifdef FEATURE_IPA_V3
- int retval = 0;
-
retval = ioctl(fd, IPA_IOC_ADD_FLT_RULE_AFTER, ruleTable);
for (int cnt = 0; cnt<ruleTable->num_rules; cnt++)
@@ -150,7 +150,7 @@ bool IPACM_Filtering::AddFilteringRuleAfter(struct ipa_ioc_add_flt_rule_after co
IPACMDBG("Added Filtering rule %pK\n", ruleTable);
#else
if (ruleTable)
- IPACMERR("Not support adding Filtering rule %pK\n", ruleTable);
+ IPACMERR("Not support adding Filtering rule %pK\n", ruleTable);
#endif
return true;
}
diff --git a/data-ipa-cfg-mgr/ipacm/src/IPACM_Iface.cpp b/data-ipa-cfg-mgr/ipacm/src/IPACM_Iface.cpp
index 53d6686..d05cefd 100644
--- a/data-ipa-cfg-mgr/ipacm/src/IPACM_Iface.cpp
+++ b/data-ipa-cfg-mgr/ipacm/src/IPACM_Iface.cpp
@@ -646,26 +646,29 @@ int IPACM_Iface::init_fl_rule(ipa_ip_type iptype)
}
else
{
- if(rx_prop != NULL)
+ if(IPACM_Iface::ipacmcfg->GetIPAVer() >= IPA_HW_None && IPACM_Iface::ipacmcfg->GetIPAVer() < IPA_HW_v4_0)
{
- IPACMDBG_H("dev %s add producer dependency\n", dev_name);
- IPACMDBG_H("depend Got pipe %d rm index : %d \n", rx_prop->rx[0].src_pipe, IPACM_Iface::ipacmcfg->ipa_client_rm_map_tbl[rx_prop->rx[0].src_pipe]);
- IPACM_Iface::ipacmcfg->AddRmDepend(IPACM_Iface::ipacmcfg->ipa_client_rm_map_tbl[rx_prop->rx[0].src_pipe],false);
- }
- else
- {
- /* only wlan may take software-path, not register Rx-property*/
- if(strcmp(dev_name,dev_wlan0) == 0 || strcmp(dev_name,dev_wlan1) == 0)
+ if(rx_prop != NULL)
{
IPACMDBG_H("dev %s add producer dependency\n", dev_name);
- IPACMDBG_H("depend Got piperm index : %d \n", IPA_RM_RESOURCE_HSIC_PROD);
- IPACM_Iface::ipacmcfg->AddRmDepend(IPA_RM_RESOURCE_HSIC_PROD,true);
+ IPACMDBG_H("depend Got pipe %d rm index : %d \n", rx_prop->rx[0].src_pipe, IPACM_Iface::ipacmcfg->ipa_client_rm_map_tbl[rx_prop->rx[0].src_pipe]);
+ IPACM_Iface::ipacmcfg->AddRmDepend(IPACM_Iface::ipacmcfg->ipa_client_rm_map_tbl[rx_prop->rx[0].src_pipe],false);
}
- if(strcmp(dev_name,dev_ecm0) == 0)
+ else
{
- IPACMDBG_H("dev %s add producer dependency\n", dev_name);
- IPACMDBG_H("depend Got piperm index : %d \n", IPA_RM_RESOURCE_USB_PROD);
- IPACM_Iface::ipacmcfg->AddRmDepend(IPA_RM_RESOURCE_USB_PROD,true);
+ /* only wlan may take software-path, not register Rx-property*/
+ if(strcmp(dev_name,dev_wlan0) == 0 || strcmp(dev_name,dev_wlan1) == 0)
+ {
+ IPACMDBG_H("dev %s add producer dependency\n", dev_name);
+ IPACMDBG_H("depend Got piperm index : %d \n", IPA_RM_RESOURCE_HSIC_PROD);
+ IPACM_Iface::ipacmcfg->AddRmDepend(IPA_RM_RESOURCE_HSIC_PROD,true);
+ }
+ if(strcmp(dev_name,dev_ecm0) == 0)
+ {
+ IPACMDBG_H("dev %s add producer dependency\n", dev_name);
+ IPACMDBG_H("depend Got piperm index : %d \n", IPA_RM_RESOURCE_USB_PROD);
+ IPACM_Iface::ipacmcfg->AddRmDepend(IPA_RM_RESOURCE_USB_PROD,true);
+ }
}
}
}
@@ -850,6 +853,36 @@ int IPACM_Iface::init_fl_rule(ipa_ip_type iptype)
memcpy(&(m_pFilteringTable->rules[3]), &flt_rule_entry, sizeof(struct ipa_flt_rule_add));
#ifdef FEATURE_IPA_ANDROID
+ /* Add the ipv6 tcp fragment filtering rule. */
+ memset(&flt_rule_entry, 0, sizeof(struct ipa_flt_rule_add));
+ flt_rule_entry.at_rear = true;
+ flt_rule_entry.flt_rule_hdl = -1;
+ flt_rule_entry.status = -1;
+ flt_rule_entry.rule.retain_hdr = 1;
+ flt_rule_entry.rule.to_uc = 0;
+ flt_rule_entry.rule.eq_attrib_type = 1;
+ flt_rule_entry.rule.action = IPA_PASS_TO_EXCEPTION;
+#ifdef FEATURE_IPA_V3
+ flt_rule_entry.rule.hashable = true;
+#endif
+ flt_rule_entry.rule.eq_attrib.rule_eq_bitmap |= (1<<1);
+ flt_rule_entry.rule.eq_attrib.protocol_eq_present = 1;
+ flt_rule_entry.rule.eq_attrib.protocol_eq = IPACM_FIREWALL_IPPROTO_TCP;
+ flt_rule_entry.rule.attrib.u.v6.next_hdr = (uint8_t)IPACM_FIREWALL_IPPROTO_TCP;
+
+ /* Configuring Fragment Filtering Rule */
+ memcpy(&flt_rule_entry.rule.attrib,
+ &rx_prop->rx[0].attrib,
+ sizeof(flt_rule_entry.rule.attrib));
+ /* remove meta data mask since we only install default flt rules once for all modem
+ PDN*/
+ flt_rule_entry.rule.attrib.attrib_mask &= ~((uint32_t)IPA_FLT_META_DATA);
+
+ flt_rule_entry.rule.attrib.attrib_mask |= IPA_FLT_FRAGMENT;
+
+ memcpy(&(m_pFilteringTable->rules[4]), &flt_rule_entry,
+ sizeof(struct ipa_flt_rule_add));
+
IPACMDBG_H("Add TCP ctrl rules: total num %d\n", IPV6_DEFAULT_FILTERTING_RULES);
memset(&flt_rule_entry, 0, sizeof(struct ipa_flt_rule_add));
@@ -891,47 +924,18 @@ int IPACM_Iface::init_fl_rule(ipa_ip_type iptype)
/* add TCP FIN rule*/
flt_rule_entry.rule.eq_attrib.ihl_offset_meq_32[0].value = (((uint32_t)1)<<TCP_FIN_SHIFT);
flt_rule_entry.rule.eq_attrib.ihl_offset_meq_32[0].mask = (((uint32_t)1)<<TCP_FIN_SHIFT);
- memcpy(&(m_pFilteringTable->rules[4]), &flt_rule_entry, sizeof(struct ipa_flt_rule_add));
+ memcpy(&(m_pFilteringTable->rules[5]), &flt_rule_entry, sizeof(struct ipa_flt_rule_add));
/* add TCP SYN rule*/
flt_rule_entry.rule.eq_attrib.ihl_offset_meq_32[0].value = (((uint32_t)1)<<TCP_SYN_SHIFT);
flt_rule_entry.rule.eq_attrib.ihl_offset_meq_32[0].mask = (((uint32_t)1)<<TCP_SYN_SHIFT);
- memcpy(&(m_pFilteringTable->rules[5]), &flt_rule_entry, sizeof(struct ipa_flt_rule_add));
+ memcpy(&(m_pFilteringTable->rules[6]), &flt_rule_entry, sizeof(struct ipa_flt_rule_add));
/* add TCP RST rule*/
flt_rule_entry.rule.eq_attrib.ihl_offset_meq_32[0].value = (((uint32_t)1)<<TCP_RST_SHIFT);
flt_rule_entry.rule.eq_attrib.ihl_offset_meq_32[0].mask = (((uint32_t)1)<<TCP_RST_SHIFT);
- memcpy(&(m_pFilteringTable->rules[6]), &flt_rule_entry, sizeof(struct ipa_flt_rule_add));
-
- /* Add the ipv6 tcp fragment filtering rule. */
- memset(&flt_rule_entry, 0, sizeof(struct ipa_flt_rule_add));
- flt_rule_entry.at_rear = true;
- flt_rule_entry.flt_rule_hdl = -1;
- flt_rule_entry.status = -1;
- flt_rule_entry.rule.retain_hdr = 1;
- flt_rule_entry.rule.to_uc = 0;
- flt_rule_entry.rule.eq_attrib_type = 1;
- flt_rule_entry.rule.action = IPA_PASS_TO_EXCEPTION;
-#ifdef FEATURE_IPA_V3
- flt_rule_entry.rule.hashable = true;
-#endif
- flt_rule_entry.rule.eq_attrib.rule_eq_bitmap |= (1<<1);
- flt_rule_entry.rule.eq_attrib.protocol_eq_present = 1;
- flt_rule_entry.rule.eq_attrib.protocol_eq = IPACM_FIREWALL_IPPROTO_TCP;
- flt_rule_entry.rule.attrib.u.v6.next_hdr = (uint8_t)IPACM_FIREWALL_IPPROTO_TCP;
-
- /* Configuring Fragment Filtering Rule */
- memcpy(&flt_rule_entry.rule.attrib,
- &rx_prop->rx[0].attrib,
- sizeof(flt_rule_entry.rule.attrib));
- /* remove meta data mask since we only install default flt rules once for all modem
- PDN*/
- flt_rule_entry.rule.attrib.attrib_mask &= ~((uint32_t)IPA_FLT_META_DATA);
-
- flt_rule_entry.rule.attrib.attrib_mask |= IPA_FLT_FRAGMENT;
+ memcpy(&(m_pFilteringTable->rules[7]), &flt_rule_entry, sizeof(struct ipa_flt_rule_add));
- memcpy(&(m_pFilteringTable->rules[7]), &flt_rule_entry,
- sizeof(struct ipa_flt_rule_add));
#endif
if (m_filtering.AddFilteringRule(m_pFilteringTable) == false)
{
@@ -1056,3 +1060,10 @@ void IPACM_Iface::config_ip_type(ipa_ip_type iptype)
return;
}
+
+void IPACM_Iface::delete_iface(void)
+{
+ IPACMDBG_H("netdev (%s):ipa_index (%d) instance close \n",
+ IPACM_Iface::ipacmcfg->iface_table[ipa_if_num].iface_name, ipa_if_num);
+ delete this;
+}
diff --git a/data-ipa-cfg-mgr/ipacm/src/IPACM_IfaceManager.cpp b/data-ipa-cfg-mgr/ipacm/src/IPACM_IfaceManager.cpp
index 85033a3..248bb78 100644
--- a/data-ipa-cfg-mgr/ipacm/src/IPACM_IfaceManager.cpp
+++ b/data-ipa-cfg-mgr/ipacm/src/IPACM_IfaceManager.cpp
@@ -1,5 +1,5 @@
/*
-Copyright (c) 2013-2016, The Linux Foundation. All rights reserved.
+Copyright (c) 2013-2018, The Linux Foundation. All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
@@ -257,6 +257,12 @@ int IPACM_IfaceManager::create_iface_instance(ipacm_ifacemgr_data *param)
{
IPACMDBG_H("Creating Lan interface\n");
IPACM_Lan *lan = new IPACM_Lan(ipa_interface_index);
+ if (lan->rx_prop == NULL && lan->tx_prop == NULL)
+ {
+ /* close the netdev instance if IPA not support*/
+ lan->delete_iface();
+ return IPACM_FAILURE;
+ }
IPACM_EvtDispatcher::registr(IPA_ADDR_ADD_EVENT, lan);
//IPACM_EvtDispatcher::registr(IPA_ROUTE_ADD_EVENT, lan);
//IPACM_EvtDispatcher::registr(IPA_ROUTE_DEL_EVENT, lan);
@@ -365,6 +371,14 @@ int IPACM_IfaceManager::create_iface_instance(ipacm_ifacemgr_data *param)
{
IPACMDBG_H("Creating WLan interface\n");
IPACM_Wlan *wl = new IPACM_Wlan(ipa_interface_index);
+ if (wl->rx_prop == NULL && wl->tx_prop == NULL)
+ {
+ /* reset the AP-iface category to unknown */
+ IPACM_Iface::ipacmcfg->iface_table[ipa_interface_index].if_cat = UNKNOWN_IF;
+ /* close the netdev instance if IPA not support*/
+ wl->delete_iface();
+ return IPACM_FAILURE;
+ }
IPACM_EvtDispatcher::registr(IPA_ADDR_ADD_EVENT, wl);
IPACM_EvtDispatcher::registr(IPA_ROUTE_DEL_EVENT, wl);
IPACM_EvtDispatcher::registr(IPA_WLAN_CLIENT_ADD_EVENT, wl);
@@ -403,6 +417,9 @@ int IPACM_IfaceManager::create_iface_instance(ipacm_ifacemgr_data *param)
#else
IPACM_EvtDispatcher::registr(IPA_TETHERING_STATS_UPDATE_EVENT, wl);
#endif
+#ifdef FEATURE_IPACM_HAL
+ IPACM_EvtDispatcher::registr(IPA_WLAN_FWR_SSR_BEFORE_SHUTDOWN_NOTICE, wl);
+#endif
/* IPA_LAN_DELETE_SELF should be always last */
IPACM_EvtDispatcher::registr(IPA_LAN_DELETE_SELF, wl);
IPACMDBG_H("ipa_WLAN (%s):ipa_index (%d) instance open/registr ok\n", wl->dev_name, wl->ipa_if_num);
@@ -421,6 +438,14 @@ int IPACM_IfaceManager::create_iface_instance(ipacm_ifacemgr_data *param)
if(is_sta_mode == WLAN_WAN)
{
w = new IPACM_Wan(ipa_interface_index, is_sta_mode, param->mac_addr);
+ if (w->rx_prop == NULL && w->tx_prop == NULL)
+ {
+ /* reset the AP-iface category to unknown */
+ IPACM_Iface::ipacmcfg->iface_table[ipa_interface_index].if_cat = UNKNOWN_IF;
+ /* close the netdev instance if IPA not support*/
+ w->delete_iface();
+ return IPACM_FAILURE;
+ }
}
else
{
@@ -452,6 +477,7 @@ int IPACM_IfaceManager::create_iface_instance(ipacm_ifacemgr_data *param)
IPACM_EvtDispatcher::registr(IPA_WLAN_SWITCH_TO_MCC, w);
#ifdef FEATURE_IPACM_HAL
IPACM_EvtDispatcher::registr(IPA_SSR_NOTICE, w);
+ IPACM_EvtDispatcher::registr(IPA_WLAN_FWR_SSR_BEFORE_SHUTDOWN_NOTICE, w);
#endif
#endif
}
diff --git a/data-ipa-cfg-mgr/ipacm/src/IPACM_Lan.cpp b/data-ipa-cfg-mgr/ipacm/src/IPACM_Lan.cpp
index 8d68d32..2369e64 100644
--- a/data-ipa-cfg-mgr/ipacm/src/IPACM_Lan.cpp
+++ b/data-ipa-cfg-mgr/ipacm/src/IPACM_Lan.cpp
@@ -195,9 +195,9 @@ IPACM_Lan::IPACM_Lan(int iface_index) : IPACM_Iface(iface_index)
#ifdef FEATURE_IPACM_HAL
/* check if Upstream was set before as WIFI with RNDIS case */
- if(ipa_if_cate == LAN_IF && IPACM_Wan::backhaul_is_sta_mode == true) /* STA */
+ if(ipa_if_cate == LAN_IF && IPACM_Wan::backhaul_is_sta_mode == true) /* LTE */
{
- IPACMDBG_H(" Skip the Upstream flag set on LAN instance (%d) with WIFI backhaul (%d)\n", ipa_if_cate, IPACM_Wan::backhaul_is_sta_mode ); /* RNDIS+WIFI not support on msm*/
+ IPACMDBG_H(" Skip the Upstream falg set on LAN instance (%d) with WIFI backhaul (%d)\n", ipa_if_cate, IPACM_Wan::backhaul_is_sta_mode ); /* RNDIS+WIFI not support on msm*/
return;
}
@@ -341,6 +341,21 @@ void IPACM_Lan::event_callback(ipa_cm_event_id event, void *param)
}
}
#endif
+
+#ifdef FEATURE_ETH_BRIDGE_LE
+ if(rx_prop != NULL)
+ {
+ free(rx_prop);
+ }
+ if(tx_prop != NULL)
+ {
+ free(tx_prop);
+ }
+ if(iface_query != NULL)
+ {
+ free(iface_query);
+ }
+#endif
delete this;
}
break;
@@ -522,7 +537,7 @@ void IPACM_Lan::event_callback(ipa_cm_event_id event, void *param)
IPACMERR("IPA_HANDLE_WAN_UP_TETHER tether_if(%d), not valid (%d) ignore\n", data_wan_tether->if_index_tether, ipa_if_num);
return;
}
-#else /* not offload rndis on WIFI mode on MSM targets sky*/
+#else /* not offload rndis on WIFI mode on MSM targets */
if (data_wan_tether->is_sta)
{
IPACMERR("Not support RNDIS offload on WIFI mode, dun install UL filter rules for WIFI mode\n");
@@ -556,7 +571,7 @@ void IPACM_Lan::event_callback(ipa_cm_event_id event, void *param)
{
if (m_header.DeleteHeaderHdl(get_client_memptr(eth_client, i)->hdr_hdl_v6)
== false)
- IPACMERR("unable to delete usb-client v6 header for index %d\n", i);
+ IPACMERR("unbale to delete usb-client v6 header for index %d\n", i);
}
} /* end of for loop */
return;
@@ -934,9 +949,9 @@ void IPACM_Lan::event_callback(ipa_cm_event_id event, void *param)
}
}
- if (ipa_interface_index == ipa_if_num
+ if (ipa_interface_index == ipa_if_num
#ifdef FEATURE_L2TP
- || is_vlan_event(data->iface_name) ||
+ || is_vlan_event(data->iface_name)
|| (is_l2tp_event(data->iface_name) && ipa_if_cate == ODU_IF)
#endif
)
@@ -963,10 +978,16 @@ void IPACM_Lan::event_callback(ipa_cm_event_id event, void *param)
#ifdef FEATURE_L2TP
else if(is_l2tp_event(data->iface_name) && ipa_if_cate == ODU_IF)
{
- if(tx_prop != NULL)
+
+ if(IPACM_Iface::ipacmcfg->GetIPAVer() >= IPA_HW_None && IPACM_Iface::ipacmcfg->GetIPAVer() < IPA_HW_v4_0)
{
- IPACMDBG_H("add rm dependency for L2TP interface.\n");
- IPACM_Iface::ipacmcfg->AddRmDepend(IPACM_Iface::ipacmcfg->ipa_client_rm_map_tbl[tx_prop->tx[0].dst_pipe],false);
+ /* Add corresponding ipa_rm_resource_name of TX-endpoint up before IPV6 RT-rule set */
+ IPACMDBG_H("dev %s add producer dependency\n", dev_name);
+ if (tx_prop != NULL)
+ {
+ IPACMDBG_H("depend Got pipe %d rm index : %d \n", tx_prop->tx[0].dst_pipe, IPACM_Iface::ipacmcfg->ipa_client_rm_map_tbl[tx_prop->tx[0].dst_pipe]);
+ IPACM_Iface::ipacmcfg->AddRmDepend(IPACM_Iface::ipacmcfg->ipa_client_rm_map_tbl[tx_prop->tx[0].dst_pipe],false);
+ }
}
eth_bridge_post_event(IPA_ETH_BRIDGE_CLIENT_ADD, IPA_IP_MAX, data->mac_addr, NULL, data->iface_name);
}
@@ -1330,6 +1351,12 @@ int IPACM_Lan::handle_addr_evt(ipacm_event_data_addr *data)
/* initial multicast/broadcast/fragment filter rule */
init_fl_rule(data->iptype);
+#ifdef FEATURE_L2TP
+ if(ipa_if_cate == WLAN_IF)
+ {
+ add_tcp_syn_flt_rule(data->iptype);
+ }
+#endif
install_ipv4_icmp_flt_rule();
/* populate the flt rule offset for eth bridge */
@@ -1421,6 +1448,17 @@ int IPACM_Lan::handle_addr_evt(ipacm_event_data_addr *data)
if (num_dft_rt_v6 == 0)
{
+#ifdef FEATURE_L2TP
+ if(ipa_if_cate == WLAN_IF)
+ {
+ add_tcp_syn_flt_rule(data->iptype);
+ }
+ else if(ipa_if_cate == ODU_IF)
+ {
+ add_tcp_syn_flt_rule_l2tp(IPA_IP_v4);
+ add_tcp_syn_flt_rule_l2tp(IPA_IP_v6);
+ }
+#endif
install_ipv6_icmp_flt_rule();
/* populate the flt rule offset for eth bridge */
@@ -1739,9 +1777,11 @@ int IPACM_Lan::handle_wan_up_ex(ipacm_ext_prop *ext_prop, ipa_ip_type iptype, ui
IPACM_Config* ipacm_config = IPACM_Iface::ipacmcfg;
struct ipa_ioc_write_qmapid mux;
+ /* for newer versions metadata is overridden by NAT metadata replacement for IPAv4 and up */
+ /* this is still needed for IPv6 traffic in case qmapid need to be used */
if(rx_prop != NULL)
{
- /* give mud ID to IPA-driver for WLAN/LAN pkts */
+ /* give mux ID of the default PDN to IPA-driver for WLAN/LAN pkts */
fd = open(IPA_DEVICE_NAME, O_RDWR);
if (0 == fd)
{
@@ -2210,13 +2250,15 @@ int IPACM_Lan::handle_eth_client_route_rule(uint8_t *mac_addr, ipa_ip_type iptyp
&& get_client_memptr(eth_client, eth_index)->route_rule_set_v6 < get_client_memptr(eth_client, eth_index)->ipv6_set
))
{
-
- /* Add corresponding ipa_rm_resource_name of TX-endpoint up before IPV6 RT-rule set */
- IPACMDBG_H("dev %s add producer dependency\n", dev_name);
- if (tx_prop != NULL)
+ if(IPACM_Iface::ipacmcfg->GetIPAVer() >= IPA_HW_None && IPACM_Iface::ipacmcfg->GetIPAVer() < IPA_HW_v4_0)
{
- IPACMDBG_H("depend Got pipe %d rm index : %d \n", tx_prop->tx[0].dst_pipe, IPACM_Iface::ipacmcfg->ipa_client_rm_map_tbl[tx_prop->tx[0].dst_pipe]);
- IPACM_Iface::ipacmcfg->AddRmDepend(IPACM_Iface::ipacmcfg->ipa_client_rm_map_tbl[tx_prop->tx[0].dst_pipe],false);
+ /* Add corresponding ipa_rm_resource_name of TX-endpoint up before IPV6 RT-rule set */
+ IPACMDBG_H("dev %s add producer dependency\n", dev_name);
+ if (tx_prop != NULL)
+ {
+ IPACMDBG_H("depend Got pipe %d rm index : %d \n", tx_prop->tx[0].dst_pipe, IPACM_Iface::ipacmcfg->ipa_client_rm_map_tbl[tx_prop->tx[0].dst_pipe]);
+ IPACM_Iface::ipacmcfg->AddRmDepend(IPACM_Iface::ipacmcfg->ipa_client_rm_map_tbl[tx_prop->tx[0].dst_pipe],false);
+ }
}
rt_rule = (struct ipa_ioc_add_rt_rule *)
calloc(1, sizeof(struct ipa_ioc_add_rt_rule) +
@@ -2264,9 +2306,12 @@ int IPACM_Lan::handle_eth_client_route_rule(uint8_t *mac_addr, ipa_ip_type iptyp
rt_rule_entry->rule.hdr_hdl = get_client_memptr(eth_client, eth_index)->hdr_hdl_v4;
rt_rule_entry->rule.attrib.u.v4.dst_addr = get_client_memptr(eth_client, eth_index)->v4_addr;
rt_rule_entry->rule.attrib.u.v4.dst_addr_mask = 0xFFFFFFFF;
-#ifdef FEATURE_IPA_V3
- rt_rule_entry->rule.hashable = false;
-#endif
+
+ if(IPACM_Iface::ipacmcfg->GetIPAVer() >= IPA_HW_v4_0)
+ {
+ rt_rule_entry->rule.hashable = true;
+ }
+
if (false == m_routing.AddRoutingRule(rt_rule))
{
IPACMERR("Routing rule addition failed!\n");
@@ -2811,12 +2856,15 @@ int IPACM_Lan::handle_eth_client_down_evt(uint8_t *mac_addr)
/* Del RM dependency */
if(num_eth_client == 0)
{
- /* Delete corresponding ipa_rm_resource_name of TX-endpoint after delete all IPV4V6 RT-rule*/
- IPACMDBG_H("dev %s add producer dependency\n", dev_name);
- if (tx_prop != NULL)
+ if(IPACM_Iface::ipacmcfg->GetIPAVer() >= IPA_HW_None && IPACM_Iface::ipacmcfg->GetIPAVer() < IPA_HW_v4_0)
{
- IPACMDBG_H("depend Got pipe %d rm index : %d \n", tx_prop->tx[0].dst_pipe, IPACM_Iface::ipacmcfg->ipa_client_rm_map_tbl[tx_prop->tx[0].dst_pipe]);
- IPACM_Iface::ipacmcfg->DelRmDepend(IPACM_Iface::ipacmcfg->ipa_client_rm_map_tbl[tx_prop->tx[0].dst_pipe]);
+ /* Delete corresponding ipa_rm_resource_name of TX-endpoint after delete all IPV4V6 RT-rule*/
+ IPACMDBG_H("dev %s delete producer dependency\n", dev_name);
+ if (tx_prop != NULL)
+ {
+ IPACMDBG_H("depend Got pipe %d rm index : %d \n", tx_prop->tx[0].dst_pipe, IPACM_Iface::ipacmcfg->ipa_client_rm_map_tbl[tx_prop->tx[0].dst_pipe]);
+ IPACM_Iface::ipacmcfg->DelRmDepend(IPACM_Iface::ipacmcfg->ipa_client_rm_map_tbl[tx_prop->tx[0].dst_pipe]);
+ }
}
}
@@ -2966,6 +3014,17 @@ int IPACM_Lan::handle_down_evt()
}
IPACM_Iface::ipacmcfg->decreaseFltRuleCount(rx_prop->rx[0].src_pipe, IPA_IP_v6, IPV6_DEFAULT_FILTERTING_RULES);
}
+#ifdef FEATURE_L2TP
+ if(ipa_if_cate == ODU_IF)
+ {
+ if(m_filtering.DeleteFilteringHdls(tcp_syn_flt_rule_hdl, IPA_IP_v6, IPA_IP_MAX) == false)
+ {
+ IPACMERR("Error Deleting TCP SYN L2TP Filtering Rule, aborting...\n");
+ res = IPACM_FAILURE;
+ goto fail;
+ }
+ }
+#endif
}
IPACMDBG_H("Finished delete default iface ipv6 filtering rules \n ");
@@ -3002,14 +3061,16 @@ int IPACM_Lan::handle_down_evt()
/* free the edm clients cache */
IPACMDBG_H("Free ecm clients cache\n");
- /* Delete corresponding ipa_rm_resource_name of TX-endpoint after delete all IPV4V6 RT-rule */
- IPACMDBG_H("dev %s delete producer dependency\n", dev_name);
- if (tx_prop != NULL)
+ if(IPACM_Iface::ipacmcfg->GetIPAVer() >= IPA_HW_None && IPACM_Iface::ipacmcfg->GetIPAVer() < IPA_HW_v4_0)
{
- IPACMDBG_H("depend Got pipe %d rm index : %d \n", tx_prop->tx[0].dst_pipe, IPACM_Iface::ipacmcfg->ipa_client_rm_map_tbl[tx_prop->tx[0].dst_pipe]);
- IPACM_Iface::ipacmcfg->DelRmDepend(IPACM_Iface::ipacmcfg->ipa_client_rm_map_tbl[tx_prop->tx[0].dst_pipe]);
+ /* Delete corresponding ipa_rm_resource_name of TX-endpoint after delete all IPV4V6 RT-rule */
+ IPACMDBG_H("dev %s delete producer dependency\n", dev_name);
+ if (tx_prop != NULL)
+ {
+ IPACMDBG_H("depend Got pipe %d rm index : %d \n", tx_prop->tx[0].dst_pipe, IPACM_Iface::ipacmcfg->ipa_client_rm_map_tbl[tx_prop->tx[0].dst_pipe]);
+ IPACM_Iface::ipacmcfg->DelRmDepend(IPACM_Iface::ipacmcfg->ipa_client_rm_map_tbl[tx_prop->tx[0].dst_pipe]);
+ }
}
-
eth_bridge_post_event(IPA_ETH_BRIDGE_IFACE_DOWN, IPA_IP_MAX, NULL, NULL, NULL);
/* Delete private subnet*/
@@ -3093,21 +3154,26 @@ fail:
{
free(odu_route_rule_v6_hdl);
}
- /* Delete corresponding ipa_rm_resource_name of RX-endpoint after delete all IPV4V6 FT-rule */
if (rx_prop != NULL)
{
- IPACMDBG_H("dev %s add producer dependency\n", dev_name);
- IPACMDBG_H("depend Got pipe %d rm index : %d \n", rx_prop->rx[0].src_pipe, IPACM_Iface::ipacmcfg->ipa_client_rm_map_tbl[rx_prop->rx[0].src_pipe]);
- IPACM_Iface::ipacmcfg->DelRmDepend(IPACM_Iface::ipacmcfg->ipa_client_rm_map_tbl[rx_prop->rx[0].src_pipe]);
- IPACMDBG_H("Finished delete dependency \n ");
+ if(IPACM_Iface::ipacmcfg->GetIPAVer() >= IPA_HW_None && IPACM_Iface::ipacmcfg->GetIPAVer() < IPA_HW_v4_0)
+ {
+ /* Delete corresponding ipa_rm_resource_name of RX-endpoint after delete all IPV4V6 FT-rule */
+ IPACMDBG_H("dev %s delete producer dependency\n", dev_name);
+ IPACMDBG_H("depend Got pipe %d rm index : %d \n", rx_prop->rx[0].src_pipe, IPACM_Iface::ipacmcfg->ipa_client_rm_map_tbl[rx_prop->rx[0].src_pipe]);
+ IPACM_Iface::ipacmcfg->DelRmDepend(IPACM_Iface::ipacmcfg->ipa_client_rm_map_tbl[rx_prop->rx[0].src_pipe]);
+ IPACMDBG_H("Finished delete dependency \n ");
+ }
+#ifndef FEATURE_ETH_BRIDGE_LE
free(rx_prop);
+#endif
}
if (eth_client != NULL)
{
free(eth_client);
}
-
+#ifndef FEATURE_ETH_BRIDGE_LE
if (tx_prop != NULL)
{
free(tx_prop);
@@ -3116,7 +3182,7 @@ fail:
{
free(iface_query);
}
-
+#endif
is_active = false;
post_del_self_evt();
@@ -3237,6 +3303,10 @@ int IPACM_Lan::handle_uplink_filter_rule(ipacm_ext_prop *prop, ipa_ip_type iptyp
else
{
flt_rule_entry.rule.action = IPA_PASS_TO_SRC_NAT;
+
+ /* NAT block will set the proper MUX ID in the metadata according to the relevant PDN */
+ if (IPACM_Iface::ipacmcfg->GetIPAVer() >= IPA_HW_v4_0)
+ flt_rule_entry.rule.set_metadata = true;
}
}
else if(iptype == IPA_IP_v6)
@@ -4413,7 +4483,7 @@ void IPACM_Lan::eth_bridge_post_event(ipa_cm_event_id evt, ipa_ip_type iptype, u
if(ipv6_addr)
{
IPACMDBG_H("IPv6 addr: %08x:%08x:%08x:%08x \n", ipv6_addr[0],
- ipv6_addr[1], ipv6_addr[2], ipv6_addr[3]);
+ ipv6_addr[1], ipv6_addr[2], ipv6_addr[3]);
}
memset(&eth_bridge_evt, 0, sizeof(ipacm_cmd_q_data));
eth_bridge_evt.event = evt;
@@ -4792,6 +4862,9 @@ int IPACM_Lan::eth_bridge_add_flt_rule(uint8_t *mac, uint32_t rt_tbl_hdl, ipa_ip
end:
free(pFilteringTable);
+#else
+ 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]);
+ IPACMDBG_H("Not support rt_tbl_hdl %d flt_rule_hdl %p ip-type %d\n", rt_tbl_hdl, flt_rule_hdl, iptype);
#endif
return res;
}
@@ -5285,6 +5358,12 @@ int IPACM_Lan::add_l2tp_rt_rule(ipa_ip_type iptype, uint8_t *dst_mac, uint32_t *
hdr_proc_ctx->hdr_hdl = hdr.hdl;
hdr_proc_ctx->l2tp_params.hdr_remove_param.hdr_len_remove = 62;
hdr_proc_ctx->l2tp_params.hdr_remove_param.eth_hdr_retained = 1;
+ hdr_proc_ctx->l2tp_params.is_dst_pipe_valid = 1;
+ hdr_proc_ctx->l2tp_params.dst_pipe = tx_prop->tx[0].dst_pipe;
+ IPACMDBG_H("Header_remove: hdr len %d, hdr retained %d, dst client: %d\n",
+ hdr_proc_ctx->l2tp_params.hdr_remove_param.hdr_len_remove,
+ hdr_proc_ctx->l2tp_params.hdr_remove_param.eth_hdr_retained,
+ hdr_proc_ctx->l2tp_params.dst_pipe);
if(m_header.AddHeaderProcCtx(hdr_proc_ctx_table) == false)
{
IPACMERR("Failed to add hdr proc ctx with status: %d\n", hdr_proc_ctx_table->proc_ctx[0].status);
@@ -5645,3 +5724,127 @@ bool IPACM_Lan::is_unique_local_ipv6_addr(uint32_t* ipv6_addr)
return false;
}
#endif
+
+/* add tcp syn flt rule */
+int IPACM_Lan::add_tcp_syn_flt_rule(ipa_ip_type iptype)
+{
+ int len;
+ struct ipa_flt_rule_add flt_rule_entry;
+ ipa_ioc_add_flt_rule *m_pFilteringTable;
+
+ if(rx_prop == NULL)
+ {
+ IPACMDBG_H("No rx properties registered for iface %s\n", dev_name);
+ return IPACM_SUCCESS;
+ }
+
+ len = sizeof(struct ipa_ioc_add_flt_rule) + sizeof(struct ipa_flt_rule_add);
+ m_pFilteringTable = (struct ipa_ioc_add_flt_rule *)malloc(len);
+ if(!m_pFilteringTable)
+ {
+ PERROR("Not enough memory.\n");
+ return IPACM_FAILURE;
+ }
+ memset(m_pFilteringTable, 0, len);
+
+ m_pFilteringTable->commit = 1;
+ m_pFilteringTable->ep = rx_prop->rx[0].src_pipe;
+ m_pFilteringTable->global = false;
+ m_pFilteringTable->ip = iptype;
+ m_pFilteringTable->num_rules = 1;
+
+ memset(&flt_rule_entry, 0, sizeof(flt_rule_entry));
+ flt_rule_entry.at_rear = true;
+ flt_rule_entry.rule.retain_hdr = 1;
+ flt_rule_entry.flt_rule_hdl = -1;
+ flt_rule_entry.status = -1;
+ flt_rule_entry.rule.action = IPA_PASS_TO_EXCEPTION;
+
+ memcpy(&flt_rule_entry.rule.attrib, &rx_prop->rx[0].attrib,
+ sizeof(flt_rule_entry.rule.attrib));
+ flt_rule_entry.rule.attrib.attrib_mask |= IPA_FLT_TCP_SYN;
+ if(iptype == IPA_IP_v4)
+ {
+ flt_rule_entry.rule.attrib.attrib_mask |= IPA_FLT_PROTOCOL;
+ flt_rule_entry.rule.attrib.u.v4.protocol = 6;
+ }
+ else
+ {
+ flt_rule_entry.rule.attrib.attrib_mask |= IPA_FLT_NEXT_HDR;
+ flt_rule_entry.rule.attrib.u.v6.next_hdr = 6;
+ }
+
+ memcpy(&(m_pFilteringTable->rules[0]), &flt_rule_entry, sizeof(flt_rule_entry));
+
+ if(false == m_filtering.AddFilteringRule(m_pFilteringTable))
+ {
+ IPACMERR("Error Adding RuleTable(0) to Filtering, aborting...\n");
+ free(m_pFilteringTable);
+ return IPACM_FAILURE;
+ }
+
+ tcp_syn_flt_rule_hdl[iptype] = m_pFilteringTable->rules[0].flt_rule_hdl;
+ free(m_pFilteringTable);
+ return IPACM_SUCCESS;
+}
+
+/* add tcp syn flt rule for l2tp interface*/
+int IPACM_Lan::add_tcp_syn_flt_rule_l2tp(ipa_ip_type inner_ip_type)
+{
+ int len;
+ struct ipa_flt_rule_add flt_rule_entry;
+ ipa_ioc_add_flt_rule *m_pFilteringTable;
+
+ if(rx_prop == NULL)
+ {
+ IPACMDBG_H("No rx properties registered for iface %s\n", dev_name);
+ return IPACM_SUCCESS;
+ }
+
+ len = sizeof(struct ipa_ioc_add_flt_rule) + sizeof(struct ipa_flt_rule_add);
+ m_pFilteringTable = (struct ipa_ioc_add_flt_rule *)malloc(len);
+ if(!m_pFilteringTable)
+ {
+ PERROR("Not enough memory.\n");
+ return IPACM_FAILURE;
+ }
+ memset(m_pFilteringTable, 0, len);
+
+ m_pFilteringTable->commit = 1;
+ m_pFilteringTable->ep = rx_prop->rx[0].src_pipe;
+ m_pFilteringTable->global = false;
+ m_pFilteringTable->ip = IPA_IP_v6;
+ m_pFilteringTable->num_rules = 1;
+
+ memset(&flt_rule_entry, 0, sizeof(flt_rule_entry));
+ flt_rule_entry.at_rear = true;
+ flt_rule_entry.rule.retain_hdr = 1;
+ flt_rule_entry.flt_rule_hdl = -1;
+ flt_rule_entry.status = -1;
+ flt_rule_entry.rule.action = IPA_PASS_TO_EXCEPTION;
+
+ memcpy(&flt_rule_entry.rule.attrib, &rx_prop->rx[0].attrib,
+ sizeof(flt_rule_entry.rule.attrib));
+ flt_rule_entry.rule.attrib.attrib_mask |= IPA_FLT_TCP_SYN_L2TP;
+ if(inner_ip_type == IPA_IP_v4)
+ {
+ flt_rule_entry.rule.attrib.ether_type = 0x0800;
+ }
+ else
+ {
+ flt_rule_entry.rule.attrib.ether_type = 0x86dd;
+ }
+
+ memcpy(&(m_pFilteringTable->rules[0]), &flt_rule_entry, sizeof(flt_rule_entry));
+
+ if(false == m_filtering.AddFilteringRule(m_pFilteringTable))
+ {
+ IPACMERR("Error Adding RuleTable(0) to Filtering, aborting...\n");
+ free(m_pFilteringTable);
+ return IPACM_FAILURE;
+ }
+
+ tcp_syn_flt_rule_hdl[inner_ip_type] = m_pFilteringTable->rules[0].flt_rule_hdl;
+ free(m_pFilteringTable);
+ return IPACM_SUCCESS;
+}
diff --git a/data-ipa-cfg-mgr/ipacm/src/IPACM_LanToLan.cpp b/data-ipa-cfg-mgr/ipacm/src/IPACM_LanToLan.cpp
index 092af64..2902268 100644
--- a/data-ipa-cfg-mgr/ipacm/src/IPACM_LanToLan.cpp
+++ b/data-ipa-cfg-mgr/ipacm/src/IPACM_LanToLan.cpp
@@ -598,6 +598,7 @@ void IPACM_LanToLan::handle_add_l2tp_vlan_mapping(ipa_ioc_l2tp_vlan_mapping_info
list<l2tp_vlan_mapping_info>::iterator it_mapping;
list<vlan_iface_info>::iterator it_vlan;
list<IPACM_LanToLan_Iface>::iterator it_iface;
+ IPACM_LanToLan_Iface *l2tp_iface;
l2tp_vlan_mapping_info new_mapping;
bool has_l2tp_iface = false;
@@ -641,6 +642,8 @@ void IPACM_LanToLan::handle_add_l2tp_vlan_mapping(ipa_ioc_l2tp_vlan_mapping_info
if(it_iface->set_l2tp_iface(data->vlan_iface_name) == true)
{
has_l2tp_iface = true;
+ l2tp_iface = &(*it_iface);
+ break;
}
}
@@ -655,6 +658,7 @@ void IPACM_LanToLan::handle_add_l2tp_vlan_mapping(ipa_ioc_l2tp_vlan_mapping_info
it_iface->handle_l2tp_enable();
}
}
+ l2tp_iface->switch_to_l2tp_iface();
}
return;
}
@@ -1974,7 +1978,6 @@ bool IPACM_LanToLan_Iface::set_l2tp_iface(char *vlan_iface_name)
{
IPACMDBG_H("This interface is l2tp interface.\n");
m_is_l2tp_iface = true;
- switch_to_l2tp_iface();
}
}
return m_is_l2tp_iface;
diff --git a/data-ipa-cfg-mgr/ipacm/src/IPACM_Main.cpp b/data-ipa-cfg-mgr/ipacm/src/IPACM_Main.cpp
index 76f805c..036c061 100644
--- a/data-ipa-cfg-mgr/ipacm/src/IPACM_Main.cpp
+++ b/data-ipa-cfg-mgr/ipacm/src/IPACM_Main.cpp
@@ -1,5 +1,5 @@
/*
-Copyright (c) 2013-2017, The Linux Foundation. All rights reserved.
+Copyright (c) 2013-2018, The Linux Foundation. All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
@@ -109,6 +109,12 @@ int ipa_get_if_index(char *if_name, int *if_index);
IPACM_Neighbor *neigh;
IPACM_IfaceManager *ifacemgr;
+#ifdef FEATURE_IPACM_RESTART
+int ipa_reset();
+/* support ipacm restart */
+int ipa_query_wlan_client();
+#endif
+
#ifdef FEATURE_IPACM_HAL
IPACM_OffloadManager* OffloadMng;
HAL *hal;
@@ -233,7 +239,9 @@ void* ipa_driver_msg_notifier(void *param)
struct ipa_wlan_msg_ex *event_ex= NULL;
struct ipa_get_data_stats_resp_msg_v01 event_data_stats;
struct ipa_get_apn_data_stats_resp_msg_v01 event_network_stats;
+#ifdef FEATURE_IPACM_HAL
IPACM_OffloadManager* OffloadMng;
+#endif
ipacm_cmd_q_data evt_data;
ipacm_event_data_mac *data = NULL;
@@ -727,6 +735,13 @@ void* ipa_driver_msg_notifier(void *param)
OffloadMng->elrInstance->onOffloadSupportAvailable();
}
continue;
+#ifdef IPA_WLAN_FW_SSR_EVENT_MAX
+ case WLAN_FWR_SSR_BEFORE_SHUTDOWN:
+ IPACMDBG_H("Received WLAN_FWR_SSR_BEFORE_SHUTDOWN\n");
+ evt_data.event = IPA_WLAN_FWR_SSR_BEFORE_SHUTDOWN_NOTICE;
+ evt_data.evt_data = NULL;
+ break;
+#endif
#endif
#ifdef FEATURE_L2TP
case ADD_VLAN_IFACE:
@@ -845,9 +860,13 @@ int main(int argc, char **argv)
(void)argc;
(void)argv;
+#ifdef FEATURE_IPACM_RESTART
+ IPACMDBG_H("RESET IPA-HW rules\n");
+ ipa_reset();
+#endif
+
neigh = new IPACM_Neighbor();
ifacemgr = new IPACM_IfaceManager();
-
#ifdef FEATURE_IPACM_HAL
OffloadMng = IPACM_OffloadManager::GetInstance();
hal = HAL::makeIPAHAL(1, OffloadMng);
@@ -1049,3 +1068,25 @@ int ipa_get_if_index
close(fd);
return IPACM_SUCCESS;
}
+
+#ifdef FEATURE_IPACM_RESTART
+int ipa_reset()
+{
+ int fd = -1;
+
+ if ((fd = open(IPA_DEVICE_NAME, O_RDWR)) < 0) {
+ IPACMERR("Failed opening %s.\n", IPA_DEVICE_NAME);
+ return IPACM_FAILURE;
+ }
+
+ if (ioctl(fd, IPA_IOC_CLEANUP) < 0) {
+ IPACMERR("IOCTL IPA_IOC_CLEANUP call failed: %s \n", strerror(errno));
+ close(fd);
+ return IPACM_FAILURE;
+ }
+
+ IPACMDBG_H("send IPA_IOC_CLEANUP \n");
+ close(fd);
+ return IPACM_SUCCESS;
+}
+#endif
diff --git a/data-ipa-cfg-mgr/ipacm/src/IPACM_Netlink.cpp b/data-ipa-cfg-mgr/ipacm/src/IPACM_Netlink.cpp
index 4ddf4bf..5775ed2 100644
--- a/data-ipa-cfg-mgr/ipacm/src/IPACM_Netlink.cpp
+++ b/data-ipa-cfg-mgr/ipacm/src/IPACM_Netlink.cpp
@@ -711,7 +711,13 @@ static int ipa_nl_decode_nlmsg
free(data_fid);
return IPACM_FAILURE;
}
- IPACMDBG("Got a usb link_up event (Interface %s, %d) \n", dev_name, msg_ptr->nl_link_info.metainfo.ifi_index);
+ IPACMDBG_H("Got a usb link_up event (Interface %s, %d) \n", dev_name, msg_ptr->nl_link_info.metainfo.ifi_index);
+ /* We don't expect change in iff_flags for rmnet_data interfaces. */
+ if (!strncmp(dev_name,"rmnet_data",strlen("rmnet_data")))
+ {
+ IPACMERR("Don't expect iff_flags change for rmnet_data interface. IGNORE\n");
+ return IPACM_FAILURE;
+ }
/*--------------------------------------------------------------------------
Post LAN iface (ECM) link up event
diff --git a/data-ipa-cfg-mgr/ipacm/src/IPACM_OffloadManager.cpp b/data-ipa-cfg-mgr/ipacm/src/IPACM_OffloadManager.cpp
index 16d8072..a343b86 100644
--- a/data-ipa-cfg-mgr/ipacm/src/IPACM_OffloadManager.cpp
+++ b/data-ipa-cfg-mgr/ipacm/src/IPACM_OffloadManager.cpp
@@ -61,7 +61,6 @@ IPACM_OffloadManager::IPACM_OffloadManager()
latest_cache_index = 0;
elrInstance = NULL;
touInstance = NULL;
- is_cache = false;
return ;
}
@@ -216,6 +215,7 @@ RET IPACM_OffloadManager::addDownstream(const char * downstream_name, const Pref
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())
{
@@ -233,6 +233,12 @@ RET IPACM_OffloadManager::addDownstream(const char * downstream_name, const Pref
if (cache_need)
{
IPACMDBG_H("addDownstream name(%s) currently not support in ipa \n", downstream_name);
+
+#ifdef FEATURE_IPACM_RESTART
+ /* add ipacm restart support */
+ push_iface_up(downstream_name, false);
+#endif
+
/* copy to the cache */
for(int i = 0; i < MAX_EVENT_CACHE ;i++)
{
@@ -363,16 +369,16 @@ RET IPACM_OffloadManager::setUpstream(const char *upstream_name, const Prefix& g
if(upstream_name == NULL)
{
if (default_gw_index == INVALID_IFACE) {
+ result = FAIL_INPUT_CHECK;
for (index = 0; index < MAX_EVENT_CACHE; index++) {
if (event_cache[index].valid == true &&
event_cache[index ].event == IPA_WAN_UPSTREAM_ROUTE_ADD_EVENT) {
event_cache[index].valid = false;
- memset(event_cache, 0, MAX_EVENT_CACHE*sizeof(framework_event_cache));
- return SUCCESS;
+ result = SUCCESS;
}
}
IPACMERR("no previous upstream set before\n");
- return FAIL_INPUT_CHECK;
+ return result;
}
if (gw_addr_v4.fam == V4 && upstream_v4_up == true) {
IPACMDBG_H("clean upstream for ipv4-fam(%d) upstream_v4_up(%d)\n", gw_addr_v4.fam, upstream_v4_up);
@@ -404,6 +410,10 @@ RET IPACM_OffloadManager::setUpstream(const char *upstream_name, const Prefix& g
if (cache_need)
{
IPACMDBG_H("setUpstream name(%s) currently not support in ipa \n", upstream_name);
+#ifdef FEATURE_IPACM_RESTART
+ /* add ipacm restart support */
+ push_iface_up(upstream_name, true);
+#endif
/* copy to the cache */
for(int i = 0; i < MAX_EVENT_CACHE ;i++)
{
@@ -444,7 +454,6 @@ RET IPACM_OffloadManager::setUpstream(const char *upstream_name, const Prefix& g
return FAIL_HARDWARE;
}
}
- is_cache = true;
return SUCCESS;
}
@@ -568,7 +577,7 @@ RET IPACM_OffloadManager::stopAllOffload()
RET IPACM_OffloadManager::setQuota(const char * upstream_name /* upstream */, uint64_t mb/* limit */)
{
wan_ioctl_set_data_quota quota;
- int fd = -1,rc = 0;
+ int fd = -1, rc = 0, err_type = 0;
if ((fd = open(DEVICE_NAME, O_RDWR)) < 0)
{
@@ -592,9 +601,10 @@ RET IPACM_OffloadManager::setQuota(const char * upstream_name /* upstream */, ui
if(rc != 0)
{
+ err_type = errno;
close(fd);
- IPACMERR("IOCTL WAN_IOCTL_SET_DATA_QUOTA call failed: %s rc: %d\n", strerror(errno),rc);
- if (errno == ENODEV) {
+ IPACMERR("IOCTL WAN_IOCTL_SET_DATA_QUOTA call failed: %s err_type: %d\n", strerror(err_type), err_type);
+ if (err_type == ENODEV) {
IPACMDBG_H("Invalid argument.\n");
return FAIL_UNSUPPORTED;
}
@@ -670,15 +680,14 @@ int IPACM_OffloadManager::post_route_evt(enum ipa_ip_type iptype, int index, ipa
IPACMDBG_H("IPV6 gateway: %08x:%08x:%08x:%08x \n",
evt_data_route->ipv6_addr_gw[0], evt_data_route->ipv6_addr_gw[1], evt_data_route->ipv6_addr_gw[2], evt_data_route->ipv6_addr_gw[3]);
#endif
- if (event == IPA_WAN_UPSTREAM_ROUTE_ADD_EVENT)
- {
+ if (event == IPA_WAN_UPSTREAM_ROUTE_ADD_EVENT) {
IPACMDBG_H("Received WAN_UPSTREAM_ROUTE_ADD: fid(%d) tether_fid(%d) ip-type(%d)\n", evt_data_route->if_index,
evt_data_route->if_index_tether, evt_data_route->iptype);
}
- else if (event == IPA_WAN_UPSTREAM_ROUTE_DEL_EVENT)
- {
- IPACMDBG_H("Received WAN_UPSTREAM_ROUTE_DEL: fid(%d) tether_fid(%d) ip-type(%d)\n", evt_data_route->if_index,
- evt_data_route->if_index_tether, evt_data_route->iptype);
+ else if (event == IPA_WAN_UPSTREAM_ROUTE_DEL_EVENT) {
+ IPACMDBG_H("Received WAN_UPSTREAM_ROUTE_DEL: fid(%d) tether_fid(%d) ip-type(%d)\n",
+ evt_data_route->if_index,
+ evt_data_route->if_index_tether, evt_data_route->iptype);
}
memset(&evt, 0, sizeof(evt));
evt.evt_data = (void*)evt_data_route;
@@ -729,11 +738,12 @@ int IPACM_OffloadManager::resetTetherStats(const char * upstream_name /* upstrea
wan_ioctl_reset_tether_stats stats;
if ((fd = open(DEVICE_NAME, O_RDWR)) < 0) {
- IPACMERR("Failed opening %s.\n", DEVICE_NAME);
- return FAIL_HARDWARE;
- }
- memset(stats.upstreamIface, 0, IFNAMSIZ);
- if (strlcpy(stats.upstreamIface, upstream_name, IFNAMSIZ) >= IFNAMSIZ) {
+ IPACMERR("Failed opening %s.\n", DEVICE_NAME);
+ return FAIL_HARDWARE;
+ }
+
+ memset(stats.upstreamIface, 0, IFNAMSIZ);
+ if (strlcpy(stats.upstreamIface, upstream_name, IFNAMSIZ) >= IFNAMSIZ) {
IPACMERR("String truncation occurred on upstream\n");
close(fd);
return FAIL_INPUT_CHECK;
@@ -747,7 +757,7 @@ int IPACM_OffloadManager::resetTetherStats(const char * upstream_name /* upstrea
IPACMDBG_H("Reset Interface %s stats\n", upstream_name);
close(fd);
return IPACM_SUCCESS;
- }
+}
IPACM_OffloadManager* IPACM_OffloadManager::GetInstance()
{
@@ -789,3 +799,141 @@ bool IPACM_OffloadManager::search_framwork_cache(char * interface_name)
IPACMDBG_H(" not found netdev (%s) has cached event\n", interface_name);
return rel;
}
+
+#ifdef FEATURE_IPACM_RESTART
+int IPACM_OffloadManager::push_iface_up(const char * if_name, bool upstream)
+{
+ ipacm_cmd_q_data evt_data;
+ ipacm_event_data_fid *data_fid = NULL;
+ ipacm_event_data_mac *data = NULL;
+ int index;
+
+ IPACMDBG_H("name %s, upstream %d\n",
+ if_name, upstream);
+
+ if(ipa_get_if_index(if_name, &index))
+ {
+ IPACMERR("netdev(%s) not registered ignored\n", if_name);
+ return SUCCESS;
+ }
+
+ if(strncmp(if_name, "rmnet_data", 10) == 0 && upstream)
+ {
+ data_fid = (ipacm_event_data_fid *)malloc(sizeof(ipacm_event_data_fid));
+ if(data_fid == NULL)
+ {
+ IPACMERR("unable to allocate memory for event data_fid\n");
+ return FAIL_HARDWARE;
+ }
+ data_fid->if_index = index;
+ evt_data.event = IPA_LINK_UP_EVENT;
+ evt_data.evt_data = data_fid;
+ IPACMDBG_H("Posting IPA_LINK_UP_EVENT with if index: %d\n",
+ data_fid->if_index);
+ IPACM_EvtDispatcher::PostEvt(&evt_data);
+ }
+
+ if(strncmp(if_name, "rndis", 5) == 0 && !upstream)
+ {
+ data_fid = (ipacm_event_data_fid *)malloc(sizeof(ipacm_event_data_fid));
+ if(data_fid == NULL)
+ {
+ IPACMERR("unable to allocate memory for event data_fid\n");
+ return FAIL_HARDWARE;
+ }
+ data_fid->if_index = index;
+ 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);
+ }
+
+ if((strncmp(if_name, "softap", 6) == 0 || strncmp(if_name, "wlan", 4) == 0 ) && !upstream)
+ {
+ data_fid = (ipacm_event_data_fid *)malloc(sizeof(ipacm_event_data_fid));
+ if(data_fid == NULL)
+ {
+ IPACMERR("unable to allocate memory for event data_fid\n");
+ return FAIL_HARDWARE;
+ }
+ data_fid->if_index = index;
+ evt_data.event = IPA_WLAN_AP_LINK_UP_EVENT;
+ evt_data.evt_data = data_fid;
+ IPACMDBG_H("Posting IPA_WLAN_AP_LINK_UP_EVENT with if index: %d\n",
+ data_fid->if_index);
+ IPACM_EvtDispatcher::PostEvt(&evt_data);
+ }
+
+ if(strncmp(if_name, "wlan", 4) == 0 && upstream)
+ {
+ data = (ipacm_event_data_mac *)malloc(sizeof(ipacm_event_data_mac));
+ if(data == NULL)
+ {
+ IPACMERR("unable to allocate memory for event_wlan data\n");
+ return FAIL_HARDWARE;
+ }
+ data->if_index = index;
+ evt_data.event = IPA_WLAN_STA_LINK_UP_EVENT;
+ evt_data.evt_data = data;
+ IPACMDBG_H("Posting IPA_WLAN_STA_LINK_UP_EVENT with if index: %d\n",
+ data->if_index);
+ IPACM_EvtDispatcher::PostEvt(&evt_data);
+ }
+
+ return IPACM_SUCCESS;
+}
+#endif
+
+
+bool IPACM_OffloadManager::push_framework_event(const char * if_name, _ipacm_offload_prefix prefix)
+{
+ bool ret = false;
+
+ 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, if_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.iptype == IPA_IP_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;
+ ret = true;
+ 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);
+ ret = false;
+ }
+ }
+ return ret;
+}
diff --git a/data-ipa-cfg-mgr/ipacm/src/IPACM_Wan.cpp b/data-ipa-cfg-mgr/ipacm/src/IPACM_Wan.cpp
index f04f45b..5d884fc 100644
--- a/data-ipa-cfg-mgr/ipacm/src/IPACM_Wan.cpp
+++ b/data-ipa-cfg-mgr/ipacm/src/IPACM_Wan.cpp
@@ -1,5 +1,5 @@
/*
-Copyright (c) 2013-2018, The Linux Foundation. All rights reserved.
+Copyright (c) 2013, 2018 The Linux Foundation. All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
@@ -62,6 +62,8 @@ uint32_t IPACM_Wan::curr_wan_ip = 0;
int IPACM_Wan::num_v4_flt_rule = 0;
int IPACM_Wan::num_v6_flt_rule = 0;
+int IPACM_Wan::ipa_pm_q6_check = 0;
+
struct ipa_flt_rule_add IPACM_Wan::flt_rule_v4[IPA_MAX_FLT_RULE];
struct ipa_flt_rule_add IPACM_Wan::flt_rule_v6[IPA_MAX_FLT_RULE];
@@ -172,12 +174,15 @@ IPACM_Wan::IPACM_Wan(int iface_index,
IPACMDBG(" IPACM->IPACM_Wan_eMBMS(%d)\n", ipa_if_num);
embms_is_on = true;
install_wan_filtering_rule(false);
- /* Add corresponding ipa_rm_resource_name of TX-endpoint up before IPV6 RT-rule set */
- if(tx_prop != NULL)
+ if(IPACM_Iface::ipacmcfg->GetIPAVer() >= IPA_HW_None && IPACM_Iface::ipacmcfg->GetIPAVer() < IPA_HW_v4_0)
{
- IPACMDBG_H("dev %s add producer dependency\n", dev_name);
- IPACMDBG_H("depend Got pipe %d rm index : %d \n", tx_prop->tx[0].dst_pipe, IPACM_Iface::ipacmcfg->ipa_client_rm_map_tbl[tx_prop->tx[0].dst_pipe]);
- IPACM_Iface::ipacmcfg->AddRmDepend(IPACM_Iface::ipacmcfg->ipa_client_rm_map_tbl[tx_prop->tx[0].dst_pipe],false);
+ /* Add corresponding ipa_rm_resource_name of TX-endpoint up before IPV6 RT-rule set */
+ if(tx_prop != NULL)
+ {
+ IPACMDBG_H("dev %s add producer dependency\n", dev_name);
+ IPACMDBG_H("depend Got pipe %d rm index : %d \n", tx_prop->tx[0].dst_pipe, IPACM_Iface::ipacmcfg->ipa_client_rm_map_tbl[tx_prop->tx[0].dst_pipe]);
+ IPACM_Iface::ipacmcfg->AddRmDepend(IPACM_Iface::ipacmcfg->ipa_client_rm_map_tbl[tx_prop->tx[0].dst_pipe],false);
+ }
}
}
else
@@ -1263,6 +1268,7 @@ void IPACM_Wan::event_callback(ipa_cm_event_id event, void *param)
#ifdef FEATURE_IPACM_HAL
/* WA for WLAN to clean up NAT instance during SSR */
case IPA_SSR_NOTICE: //sky
+ case IPA_WLAN_FWR_SSR_BEFORE_SHUTDOWN_NOTICE:
IPACMDBG_H("Received IPA_SSR_NOTICE event.\n");
if(m_is_sta_mode == WLAN_WAN)
{
@@ -1288,7 +1294,11 @@ int IPACM_Wan::handle_route_add_evt(ipa_ip_type iptype)
const int NUM = 1;
ipacm_cmd_q_data evt_data;
struct ipa_ioc_get_hdr hdr;
-
+#ifdef WAN_IOC_NOTIFY_WAN_STATE //resolve compile issue on 4.9 kernel
+ struct wan_ioctl_notify_wan_state wan_state;
+ int fd_wwan_ioctl;
+ memset(&wan_state, 0, sizeof(wan_state));
+#endif
IPACMDBG_H("ip-type:%d\n", iptype);
/* copy header from tx-property, see if partial or not */
@@ -1619,7 +1629,11 @@ int IPACM_Wan::handle_route_add_evt(ipa_ip_type iptype)
{
IPACM_Wan::xlat_mux_id = 0;
wanup_data->xlat_mux_id = 0;
- IPACMDBG_H("No xlat configuratio:\n");
+ if(m_is_sta_mode == Q6_WAN)
+ wanup_data->mux_id = ext_prop->ext[0].mux_id;
+ else
+ wanup_data->mux_id = 0;
+ IPACMDBG_H("No xlat configuration\n");
}
evt_data.event = IPA_HANDLE_WAN_UP;
evt_data.evt_data = (void *)wanup_data;
@@ -1664,12 +1678,37 @@ int IPACM_Wan::handle_route_add_evt(ipa_ip_type iptype)
evt_data.evt_data = (void *)wanup_data;
IPACM_EvtDispatcher::PostEvt(&evt_data);
}
+ if(IPACM_Iface::ipacmcfg->GetIPAVer() >= IPA_HW_None && IPACM_Iface::ipacmcfg->GetIPAVer() < IPA_HW_v4_0)
+ {
+ /* Add corresponding ipa_rm_resource_name of TX-endpoint up before IPV6 RT-rule set */
+ IPACMDBG_H("dev %s add producer dependency\n", dev_name);
+ IPACMDBG_H("depend Got pipe %d rm index : %d \n", tx_prop->tx[0].dst_pipe, IPACM_Iface::ipacmcfg->ipa_client_rm_map_tbl[tx_prop->tx[0].dst_pipe]);
+ IPACM_Iface::ipacmcfg->AddRmDepend(IPACM_Iface::ipacmcfg->ipa_client_rm_map_tbl[tx_prop->tx[0].dst_pipe],false);
+#ifdef WAN_IOC_NOTIFY_WAN_STATE
+ } else {
+ if (m_is_sta_mode == Q6_WAN && ipa_pm_q6_check == 0)
+ {
+ fd_wwan_ioctl = open(WWAN_QMI_IOCTL_DEVICE_NAME, O_RDWR);
+ if(fd_wwan_ioctl < 0)
+ {
+ IPACMERR("Failed to open %s.\n",WWAN_QMI_IOCTL_DEVICE_NAME);
+ return false;
+ }
+ IPACMDBG_H("send WAN_IOC_NOTIFY_WAN_STATE up to IPA_PM\n");
+ wan_state.up = true;
+ if(ioctl(fd_wwan_ioctl, WAN_IOC_NOTIFY_WAN_STATE, &wan_state))
+ {
+ IPACMERR("Failed to send WAN_IOC_NOTIFY_WAN_STATE as up %d\n ", wan_state.up);
+ }
+ close(fd_wwan_ioctl);
+ }
+ ipa_pm_q6_check++;
+ IPACMDBG_H("update ipa_pm_q6_check to %d\n", ipa_pm_q6_check);
- /* Add corresponding ipa_rm_resource_name of TX-endpoint up before IPV6 RT-rule set */
- IPACMDBG_H("dev %s add producer dependency\n", dev_name);
- IPACMDBG_H("depend Got pipe %d rm index : %d \n", tx_prop->tx[0].dst_pipe, IPACM_Iface::ipacmcfg->ipa_client_rm_map_tbl[tx_prop->tx[0].dst_pipe]);
- IPACM_Iface::ipacmcfg->AddRmDepend(IPACM_Iface::ipacmcfg->ipa_client_rm_map_tbl[tx_prop->tx[0].dst_pipe],false);
-
+ }
+#else
+}
+#endif
if(rt_rule != NULL)
{
free(rt_rule);
@@ -3216,6 +3255,7 @@ int IPACM_Wan::init_fl_rule_ex(ipa_ip_type iptype)
IPACMDBG_H(" Has rx/tx properties registered for iface %s, add for NATTING \n", dev_name);
IPACM_Iface::ipacmcfg->AddNatIfaces(dev_name, iptype);
}
+
fail:
return res;
}
@@ -3804,11 +3844,17 @@ int IPACM_Wan::add_dft_filtering_rule(struct ipa_flt_rule_add *rules, int rule_o
memcpy(&(rules[rule_offset + 3]), &flt_rule_entry, sizeof(struct ipa_flt_rule_add));
-
+#ifdef FEATURE_IPA_ANDROID
IPACM_Wan::num_v6_flt_rule += IPA_V2_NUM_MULTICAST_WAN_FILTER_RULE_IPV6;
IPACMDBG_H("Constructed %d default filtering rules for ip type %d\n", IPA_V2_NUM_MULTICAST_WAN_FILTER_RULE_IPV6, iptype);
+#else
+ IPACM_Wan::num_v6_flt_rule += IPA_V2_NUM_DEFAULT_WAN_FILTER_RULE_IPV6;
+ IPACMDBG_H("Constructed %d default filtering rules for ip type %d\n",
+ IPA_V2_NUM_DEFAULT_WAN_FILTER_RULE_IPV6, iptype);
+#endif
IPACM_Wan::num_v6_flt_rule += IPA_V2_NUM_FRAG_WAN_FILTER_RULE_IPV6;
- IPACMDBG_H("Constructed %d default filtering rules for ip type %d\n", IPA_V2_NUM_FRAG_WAN_FILTER_RULE_IPV6, iptype);
+ IPACMDBG_H("Constructed %d default filtering rules for ip type %d\n",
+ IPA_V2_NUM_FRAG_WAN_FILTER_RULE_IPV6, iptype);
}
fail:
@@ -3857,8 +3903,9 @@ int IPACM_Wan::add_tcpv6_filtering_rule(struct ipa_flt_rule_add *rules, int rule
flt_rule_entry.rule.action = IPA_PASS_TO_ROUTING;
flt_rule_entry.rule.rt_tbl_idx = rt_tbl_idx.idx;
+#ifdef FEATURE_IPA_ANDROID
IPACMDBG_H("Add TCP ctrl rules: total num %d\n", IPA_V2_NUM_TCP_WAN_FILTER_RULE_IPV6);
-
+#endif
memcpy(&flt_rule_entry.rule.attrib,
&rx_prop->rx[0].attrib,
sizeof(flt_rule_entry.rule.attrib));
@@ -3903,8 +3950,10 @@ int IPACM_Wan::add_tcpv6_filtering_rule(struct ipa_flt_rule_add *rules, int rule
flt_rule_entry.rule.eq_attrib.ihl_offset_meq_32[0].mask = (((uint32_t)1)<<TCP_RST_SHIFT);
memcpy(&(rules[rule_offset + 2]), &flt_rule_entry, sizeof(struct ipa_flt_rule_add));
+#ifdef FEATURE_IPA_ANDROID
IPACM_Wan::num_v6_flt_rule += IPA_V2_NUM_TCP_WAN_FILTER_RULE_IPV6;
IPACMDBG_H("Constructed %d ICMP filtering rules for ip type %d\n", IPA_V2_NUM_TCP_WAN_FILTER_RULE_IPV6, IPA_IP_v6);
+#endif
fail:
return res;
@@ -4051,12 +4100,13 @@ int IPACM_Wan::handle_route_del_evt(ipa_ip_type iptype)
if (((iptype == IPA_IP_v4) && (active_v4 == true)) ||
((iptype == IPA_IP_v6) && (active_v6 == true)))
{
-
- /* Delete corresponding ipa_rm_resource_name of TX-endpoint after delete IPV4/V6 RT-rule */
- IPACMDBG_H("dev %s add producer dependency\n", dev_name);
- IPACMDBG_H("depend Got pipe %d rm index : %d \n", tx_prop->tx[0].dst_pipe, IPACM_Iface::ipacmcfg->ipa_client_rm_map_tbl[tx_prop->tx[0].dst_pipe]);
- IPACM_Iface::ipacmcfg->DelRmDepend(IPACM_Iface::ipacmcfg->ipa_client_rm_map_tbl[tx_prop->tx[0].dst_pipe]);
-
+ if(IPACM_Iface::ipacmcfg->GetIPAVer() >= IPA_HW_None && IPACM_Iface::ipacmcfg->GetIPAVer() < IPA_HW_v4_0)
+ {
+ /* Delete corresponding ipa_rm_resource_name of TX-endpoint after delete IPV4/V6 RT-rule */
+ IPACMDBG_H("dev %s delete producer dependency\n", dev_name);
+ IPACMDBG_H("depend Got pipe %d rm index : %d \n", tx_prop->tx[0].dst_pipe, IPACM_Iface::ipacmcfg->ipa_client_rm_map_tbl[tx_prop->tx[0].dst_pipe]);
+ IPACM_Iface::ipacmcfg->DelRmDepend(IPACM_Iface::ipacmcfg->ipa_client_rm_map_tbl[tx_prop->tx[0].dst_pipe]);
+ }
for (tx_index = 0; tx_index < iface_query->num_tx_props; tx_index++)
{
if(iptype != tx_prop->tx[tx_index].ip)
@@ -4180,6 +4230,11 @@ int IPACM_Wan::handle_route_del_evt(ipa_ip_type iptype)
int IPACM_Wan::handle_route_del_evt_ex(ipa_ip_type iptype)
{
ipacm_cmd_q_data evt_data;
+#ifdef WAN_IOC_NOTIFY_WAN_STATE
+ struct wan_ioctl_notify_wan_state wan_state;
+ int fd_wwan_ioctl;
+ memset(&wan_state, 0, sizeof(wan_state));
+#endif
IPACMDBG_H("got handle_route_del_evt_ex with ip-family:%d \n", iptype);
@@ -4195,12 +4250,38 @@ int IPACM_Wan::handle_route_del_evt_ex(ipa_ip_type iptype)
if (((iptype == IPA_IP_v4) && (active_v4 == true)) ||
((iptype == IPA_IP_v6) && (active_v6 == true)))
{
-
- /* Delete corresponding ipa_rm_resource_name of TX-endpoint after delete IPV4/V6 RT-rule */
- IPACMDBG_H("dev %s add producer dependency\n", dev_name);
- IPACMDBG_H("depend Got pipe %d rm index : %d \n", tx_prop->tx[0].dst_pipe, IPACM_Iface::ipacmcfg->ipa_client_rm_map_tbl[tx_prop->tx[0].dst_pipe]);
- IPACM_Iface::ipacmcfg->DelRmDepend(IPACM_Iface::ipacmcfg->ipa_client_rm_map_tbl[tx_prop->tx[0].dst_pipe]);
-
+ if(IPACM_Iface::ipacmcfg->GetIPAVer() >= IPA_HW_None && IPACM_Iface::ipacmcfg->GetIPAVer() < IPA_HW_v4_0)
+ {
+ /* Delete corresponding ipa_rm_resource_name of TX-endpoint after delete IPV4/V6 RT-rule */
+ IPACMDBG_H("dev %s delete producer dependency\n", dev_name);
+ IPACMDBG_H("depend Got pipe %d rm index : %d \n", tx_prop->tx[0].dst_pipe, IPACM_Iface::ipacmcfg->ipa_client_rm_map_tbl[tx_prop->tx[0].dst_pipe]);
+ IPACM_Iface::ipacmcfg->DelRmDepend(IPACM_Iface::ipacmcfg->ipa_client_rm_map_tbl[tx_prop->tx[0].dst_pipe]);
+#ifdef WAN_IOC_NOTIFY_WAN_STATE
+ } else {
+ IPACMDBG_H("ipa_pm_q6_check to %d\n", ipa_pm_q6_check);
+ if(ipa_pm_q6_check == 1)
+ {
+ fd_wwan_ioctl = open(WWAN_QMI_IOCTL_DEVICE_NAME, O_RDWR);
+ if(fd_wwan_ioctl < 0)
+ {
+ IPACMERR("Failed to open %s.\n",WWAN_QMI_IOCTL_DEVICE_NAME);
+ return false;
+ }
+ IPACMDBG_H("send WAN_IOC_NOTIFY_WAN_STATE down to IPA_PM\n");
+ if(ioctl(fd_wwan_ioctl, WAN_IOC_NOTIFY_WAN_STATE, &wan_state))
+ {
+ IPACMERR("Failed to send WAN_IOC_NOTIFY_WAN_STATE as up %d\n ", wan_state.up);
+ }
+ close(fd_wwan_ioctl);
+ }
+ if (ipa_pm_q6_check > 0)
+ ipa_pm_q6_check--;
+ else
+ IPACMERR(" ipa_pm_q6_check becomes negative !!!\n");
+ }
+#else
+}
+#endif
/* Delete the default route*/
if (iptype == IPA_IP_v6)
{
@@ -4426,15 +4507,16 @@ int IPACM_Wan::handle_down_evt()
memset(ipa_if_num_tether_tmp, 0, IPA_MAX_IFACE_ENTRIES);
IPACMDBG_H(" wan handle_down_evt \n");
-
- /* Delete corresponding ipa_rm_resource_name of TX-endpoint after delete IPV4/V6 RT-rule */
- IPACMDBG_H("dev %s add producer dependency\n", dev_name);
- if (tx_prop != NULL)
+ if(IPACM_Iface::ipacmcfg->GetIPAVer() >= IPA_HW_None && IPACM_Iface::ipacmcfg->GetIPAVer() < IPA_HW_v4_0)
{
- IPACMDBG_H("depend Got pipe %d rm index : %d \n", tx_prop->tx[0].dst_pipe, IPACM_Iface::ipacmcfg->ipa_client_rm_map_tbl[tx_prop->tx[0].dst_pipe]);
- IPACM_Iface::ipacmcfg->DelRmDepend(IPACM_Iface::ipacmcfg->ipa_client_rm_map_tbl[tx_prop->tx[0].dst_pipe]);
+ /* Delete corresponding ipa_rm_resource_name of TX-endpoint after delete IPV4/V6 RT-rule */
+ IPACMDBG_H("dev %s delete producer dependency\n", dev_name);
+ if (tx_prop != NULL)
+ {
+ IPACMDBG_H("depend Got pipe %d rm index : %d \n", tx_prop->tx[0].dst_pipe, IPACM_Iface::ipacmcfg->ipa_client_rm_map_tbl[tx_prop->tx[0].dst_pipe]);
+ IPACM_Iface::ipacmcfg->DelRmDepend(IPACM_Iface::ipacmcfg->ipa_client_rm_map_tbl[tx_prop->tx[0].dst_pipe]);
+ }
}
-
/* no iface address up, directly close iface*/
if (ip_type == IPACM_IP_NULL)
{
@@ -4702,14 +4784,16 @@ int IPACM_Wan::handle_down_evt_ex()
if(IPACM_Iface::ipacmcfg->iface_table[ipa_if_num].if_cat == EMBMS_IF)
{
embms_is_on = false;
- /* Delete corresponding ipa_rm_resource_name of TX-endpoint after delete IPV4/V6 RT-rule */
- IPACMDBG_H("dev %s add producer dependency\n", dev_name);
- if (tx_prop != NULL)
+ if(IPACM_Iface::ipacmcfg->GetIPAVer() >= IPA_HW_None && IPACM_Iface::ipacmcfg->GetIPAVer() < IPA_HW_v4_0)
{
- IPACMDBG_H("depend Got pipe %d rm index : %d \n", tx_prop->tx[0].dst_pipe, IPACM_Iface::ipacmcfg->ipa_client_rm_map_tbl[tx_prop->tx[0].dst_pipe]);
- IPACM_Iface::ipacmcfg->DelRmDepend(IPACM_Iface::ipacmcfg->ipa_client_rm_map_tbl[tx_prop->tx[0].dst_pipe]);
+ /* Delete corresponding ipa_rm_resource_name of TX-endpoint after delete IPV4/V6 RT-rule */
+ IPACMDBG_H("dev %s delete producer dependency\n", dev_name);
+ if (tx_prop != NULL)
+ {
+ IPACMDBG_H("depend Got pipe %d rm index : %d \n", tx_prop->tx[0].dst_pipe, IPACM_Iface::ipacmcfg->ipa_client_rm_map_tbl[tx_prop->tx[0].dst_pipe]);
+ IPACM_Iface::ipacmcfg->DelRmDepend(IPACM_Iface::ipacmcfg->ipa_client_rm_map_tbl[tx_prop->tx[0].dst_pipe]);
+ }
}
-
if (rx_prop != NULL)
{
install_wan_filtering_rule(false);
@@ -5719,12 +5803,13 @@ int IPACM_Wan::handle_wan_client_route_rule(uint8_t *mac_addr, ipa_ip_type iptyp
&& get_client_memptr(wan_client, wan_index)->route_rule_set_v6 < get_client_memptr(wan_client, wan_index)->ipv6_set
))
{
-
- /* Add corresponding ipa_rm_resource_name of TX-endpoint up before IPV6 RT-rule set */
- IPACMDBG_H("dev %s add producer dependency\n", dev_name);
- IPACMDBG_H("depend Got pipe %d rm index : %d \n", tx_prop->tx[0].dst_pipe, IPACM_Iface::ipacmcfg->ipa_client_rm_map_tbl[tx_prop->tx[0].dst_pipe]);
- IPACM_Iface::ipacmcfg->AddRmDepend(IPACM_Iface::ipacmcfg->ipa_client_rm_map_tbl[tx_prop->tx[0].dst_pipe],false);
-
+ if(IPACM_Iface::ipacmcfg->GetIPAVer() >= IPA_HW_None && IPACM_Iface::ipacmcfg->GetIPAVer() < IPA_HW_v4_0)
+ {
+ /* Add corresponding ipa_rm_resource_name of TX-endpoint up before IPV6 RT-rule set */
+ IPACMDBG_H("dev %s add producer dependency\n", dev_name);
+ IPACMDBG_H("depend Got pipe %d rm index : %d \n", tx_prop->tx[0].dst_pipe, IPACM_Iface::ipacmcfg->ipa_client_rm_map_tbl[tx_prop->tx[0].dst_pipe]);
+ IPACM_Iface::ipacmcfg->AddRmDepend(IPACM_Iface::ipacmcfg->ipa_client_rm_map_tbl[tx_prop->tx[0].dst_pipe],false);
+ }
rt_rule = (struct ipa_ioc_add_rt_rule *)
calloc(1, sizeof(struct ipa_ioc_add_rt_rule) +
NUM * sizeof(struct ipa_rt_rule_add));
diff --git a/data-ipa-cfg-mgr/ipacm/src/IPACM_Wlan.cpp b/data-ipa-cfg-mgr/ipacm/src/IPACM_Wlan.cpp
index 3ba899a..d8a370c 100644
--- a/data-ipa-cfg-mgr/ipacm/src/IPACM_Wlan.cpp
+++ b/data-ipa-cfg-mgr/ipacm/src/IPACM_Wlan.cpp
@@ -49,7 +49,9 @@ Skylar Chang
#include <IPACM_Lan.h>
#include <IPACM_IfaceManager.h>
#include <IPACM_ConntrackListener.h>
-
+#ifdef FEATURE_IPACM_HAL
+#include "IPACM_OffloadManager.h"
+#endif
/* static member to store the number of total wifi clients within all APs*/
int IPACM_Wlan::total_num_wifi_clients = 0;
@@ -133,6 +135,7 @@ IPACM_Wlan::~IPACM_Wlan()
{
IPACM_EvtDispatcher::deregistr(this);
IPACM_IfaceManager::deregistr(this);
+ IPACM_Wlan::num_wlan_ap_iface--;
return;
}
@@ -148,6 +151,9 @@ void IPACM_Wlan::event_callback(ipa_cm_event_id event, void *param)
int wlan_index;
ipacm_ext_prop* ext_prop;
ipacm_event_iface_up_tehter* data_wan_tether;
+#ifdef FEATURE_IPACM_HAL
+ IPACM_OffloadManager* OffloadMng;
+#endif
switch (event)
{
@@ -196,11 +202,24 @@ void IPACM_Wlan::event_callback(ipa_cm_event_id event, void *param)
ipacm_event_data_fid *data = (ipacm_event_data_fid *)param;
if(data->if_index == ipa_if_num)
{
- IPACM_Wlan::num_wlan_ap_iface--;
IPACMDBG_H("Now the number of wlan AP iface is %d\n", IPACM_Wlan::num_wlan_ap_iface);
IPACMDBG_H("Received IPA_LAN_DELETE_SELF event.\n");
IPACMDBG_H("ipa_WLAN (%s):ipa_index (%d) instance close \n", IPACM_Iface::ipacmcfg->iface_table[ipa_if_num].iface_name, ipa_if_num);
+#ifdef FEATURE_ETH_BRIDGE_LE
+ if(rx_prop != NULL)
+ {
+ free(rx_prop);
+ }
+ if(tx_prop != NULL)
+ {
+ free(tx_prop);
+ }
+ if(iface_query != NULL)
+ {
+ free(iface_query);
+ }
+#endif
delete this;
}
break;
@@ -253,6 +272,10 @@ void IPACM_Wlan::event_callback(ipa_cm_event_id event, void *param)
IPACMDBG_H("IPv4 address:0x%x, IPv4 address mask:0x%x\n",
info->ipv4_addr, info->addr_mask);
IPACM_EvtDispatcher::PostEvt(&evt_data);
+#ifdef FEATURE_IPACM_RESTART
+ /* Query wlan-clients */
+ ipa_query_wlan_client();
+#endif
}
if(handle_addr_evt(data) == IPACM_FAILURE)
@@ -544,7 +567,7 @@ void IPACM_Wlan::event_callback(ipa_cm_event_id event, void *param)
memcpy(&prefix[data->prefix.iptype], &data->prefix,
sizeof(prefix[data->prefix.iptype]));
- if(is_upstream_set[data->prefix.iptype] == true)
+ if (is_upstream_set[data->prefix.iptype] == true)
{
IPACMDBG_H("Upstream was set before, adding modem UL rules.\n");
if(ip_type == IPA_IP_MAX || ip_type == data->prefix.iptype)
@@ -924,6 +947,28 @@ void IPACM_Wlan::event_callback(ipa_cm_event_id event, void *param)
IPACM_Iface::ipacmcfg->DelNatIfaces(dev_name); // delete NAT-iface
}
break;
+ case IPA_WLAN_FWR_SSR_BEFORE_SHUTDOWN_NOTICE:
+ {
+ IPACMDBG_H("Received IPA_WLAN_FWR_SSR_BEFORE_SHUTDOWN_NOTICE.\n");
+
+ /* internal push add_downstream event in cache */
+ OffloadMng = IPACM_OffloadManager::GetInstance();
+ if (OffloadMng == NULL) {
+ IPACMERR("failed to get IPACM_OffloadManager instance !\n");
+ } else {
+ IPACMDBG_H("Update iface %s add_downstream cache events\n", dev_name);
+ if(ip_type == IPA_IP_v4 || ip_type == IPA_IP_MAX)
+ {
+ OffloadMng->push_framework_event(dev_name, prefix[IPA_IP_v4]);
+ }
+ else if(ip_type == IPA_IP_v6 || ip_type == IPA_IP_MAX)
+ {
+ OffloadMng->push_framework_event(dev_name, prefix[IPA_IP_v6]);
+ }
+ }
+ IPACM_Iface::ipacmcfg->DelNatIfaces(dev_name); // delete NAT-iface
+ }
+ break;
#endif
default:
break;
@@ -1451,9 +1496,12 @@ int IPACM_Wlan::handle_wlan_client_route_rule(uint8_t *mac_addr, ipa_ip_type ipt
rt_rule_entry->rule.hdr_hdl = get_client_memptr(wlan_client, wlan_index)->hdr_hdl_v4;
rt_rule_entry->rule.attrib.u.v4.dst_addr = get_client_memptr(wlan_client, wlan_index)->v4_addr;
rt_rule_entry->rule.attrib.u.v4.dst_addr_mask = 0xFFFFFFFF;
-#ifdef FEATURE_IPA_V3
- rt_rule_entry->rule.hashable = false;
-#endif
+
+ if(IPACM_Iface::ipacmcfg->GetIPAVer() >= IPA_HW_v4_0)
+ {
+ rt_rule_entry->rule.hashable = true;
+ }
+
if (false == m_routing.AddRoutingRule(rt_rule))
{
IPACMERR("Routing rule addition failed!\n");
@@ -1803,6 +1851,15 @@ int IPACM_Wlan::handle_down_evt()
IPACM_Iface::ipacmcfg->decreaseFltRuleCount(rx_prop->rx[0].src_pipe, IPA_IP_v4, num_private_subnet_fl_rule);
#endif
IPACMDBG_H("Deleted private subnet v4 filter rules successfully.\n");
+
+#ifdef FEATURE_L2TP
+ if(m_filtering.DeleteFilteringHdls(&tcp_syn_flt_rule_hdl[IPA_IP_v4], IPA_IP_v4, 1) == false)
+ {
+ IPACMERR("Error deleting tcp syn flt rule, aborting...\n");
+ res = IPACM_FAILURE;
+ goto fail;
+ }
+#endif
}
/* Delete v6 filtering rules */
@@ -1828,6 +1885,14 @@ int IPACM_Wlan::handle_down_evt()
IPACM_Iface::ipacmcfg->decreaseFltRuleCount(rx_prop->rx[0].src_pipe, IPA_IP_v6, IPV6_DEFAULT_FILTERTING_RULES);
IPACMDBG_H("Deleted default v6 filter rules successfully.\n");
}
+#ifdef FEATURE_L2TP
+ if(m_filtering.DeleteFilteringHdls(&tcp_syn_flt_rule_hdl[IPA_IP_v6], IPA_IP_v6, 1) == false)
+ {
+ IPACMERR("Error deleting tcp syn flt rule, aborting...\n");
+ res = IPACM_FAILURE;
+ goto fail;
+ }
+#endif
}
IPACMDBG_H("finished delete filtering rules\n ");
@@ -1940,13 +2005,18 @@ fail:
}
IPACMDBG_H("finished delete software-routing filtering rules\n ");
- /* Delete corresponding ipa_rm_resource_name of RX-endpoint after delete all IPV4V6 FT-rule */
if (rx_prop != NULL)
{
- IPACMDBG_H("dev %s add producer dependency\n", dev_name);
- IPACMDBG_H("depend Got pipe %d rm index : %d \n", rx_prop->rx[0].src_pipe, IPACM_Iface::ipacmcfg->ipa_client_rm_map_tbl[rx_prop->rx[0].src_pipe]);
- IPACM_Iface::ipacmcfg->DelRmDepend(IPACM_Iface::ipacmcfg->ipa_client_rm_map_tbl[rx_prop->rx[0].src_pipe]);
+ if(IPACM_Iface::ipacmcfg->GetIPAVer() >= IPA_HW_None && IPACM_Iface::ipacmcfg->GetIPAVer() < IPA_HW_v4_0)
+ {
+ /* Delete corresponding ipa_rm_resource_name of RX-endpoint after delete all IPV4V6 FT-rule */
+ IPACMDBG_H("dev %s add producer dependency\n", dev_name);
+ IPACMDBG_H("depend Got pipe %d rm index : %d \n", rx_prop->rx[0].src_pipe, IPACM_Iface::ipacmcfg->ipa_client_rm_map_tbl[rx_prop->rx[0].src_pipe]);
+ IPACM_Iface::ipacmcfg->DelRmDepend(IPACM_Iface::ipacmcfg->ipa_client_rm_map_tbl[rx_prop->rx[0].src_pipe]);
+ }
+#ifndef FEATURE_ETH_BRIDGE_LE
free(rx_prop);
+#endif
}
for (i = 0; i < num_wifi_client; i++)
@@ -1960,6 +2030,7 @@ fail:
{
free(wlan_client);
}
+#ifndef FEATURE_ETH_BRIDGE_LE
if (tx_prop != NULL)
{
free(tx_prop);
@@ -1969,6 +2040,7 @@ fail:
{
free(iface_query);
}
+#endif
is_active = false;
post_del_self_evt();
@@ -2215,6 +2287,28 @@ void IPACM_Wlan::handle_SCC_MCC_switch(ipa_ip_type iptype)
return;
}
+#ifdef FEATURE_IPACM_RESTART
+int IPACM_Wlan::ipa_query_wlan_client()
+{
+ int fd = -1;
+
+ if ((fd = open(IPA_DEVICE_NAME, O_RDWR)) < 0) {
+ IPACMERR("Failed opening %s.\n", IPA_DEVICE_NAME);
+ return IPACM_FAILURE;
+ }
+
+ if (ioctl(fd, IPA_IOC_QUERY_WLAN_CLIENT) < 0) {
+ IPACMERR("IOCTL IPA_IOC_QUERY_WLAN_CLIENT call failed: %s \n", strerror(errno));
+ close(fd);
+ return IPACM_FAILURE;
+ }
+
+ IPACMDBG_H("send IPA_IOC_QUERY_WLAN_CLIENT \n");
+ close(fd);
+ return IPACM_SUCCESS;
+}
+#endif
+
void IPACM_Wlan::eth_bridge_handle_wlan_mode_switch()
{
uint32_t i;
diff --git a/data-ipa-cfg-mgr/ipacm/src/IPACM_Xml.cpp b/data-ipa-cfg-mgr/ipacm/src/IPACM_Xml.cpp
index b81856a..4451906 100644
--- a/data-ipa-cfg-mgr/ipacm/src/IPACM_Xml.cpp
+++ b/data-ipa-cfg-mgr/ipacm/src/IPACM_Xml.cpp
@@ -665,6 +665,9 @@ static int IPACM_firewall_xml_parse_tree
memcpy(content_buf, (void *)content, str_size);
config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.u.v4.tos
= atoi(content_buf);
+ // Here we do not know if it is TOS with mask or not, so we put at both places
+ config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.tos_value
+ = atoi(content_buf);
IPACMDBG_H("\n IPV4 TOS val is %d \n",
config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.u.v4.tos);
}
@@ -674,13 +677,25 @@ static int IPACM_firewall_xml_parse_tree
content = IPACM_read_content_element(xml_node);
if (content)
{
+ uint8_t mask;
+
str_size = strlen(content);
memset(content_buf, 0, sizeof(content_buf));
memcpy(content_buf, (void *)content, str_size);
- config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.u.v4.tos
- &= atoi(content_buf);
- IPACMDBG_H("\n IPv4 TOS mask is %d \n",
- config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.u.v4.tos);
+ mask = atoi(content_buf);
+ IPACMDBG_H("\n IPv4 TOS mask is %u \n", mask);
+ if (mask != 0xFF) {
+ // TOS attribute cannot be used
+ config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.u.v4.tos = 0;
+ config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.tos_mask = mask;
+
+ config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.attrib_mask |=
+ IPA_FLT_TOS_MASKED;
+ config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.attrib_mask &=
+ ~IPA_FLT_TOS;
+ } else {
+ config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.tos_value = 0;
+ }
}
}
else if (0 == IPACM_util_icmp_string((char*)xml_node->name, IPV4NextHeaderProtocol_TAG))