IPACM: Fix for AP + STA mode
in AP+STA mode, IPANAT won't create dummy nat entry
in IPA-HW to send DL traffic back to Q6, also wlan
layer2 header offset is changed
Change-Id: I3830059372af07fd0fc2c724eb08d0b85c25f777
diff --git a/ipacm/inc/IPACM_ConntrackListener.h b/ipacm/inc/IPACM_ConntrackListener.h
index 43b33c4..b4c3f28 100644
--- a/ipacm/inc/IPACM_ConntrackListener.h
+++ b/ipacm/inc/IPACM_ConntrackListener.h
@@ -70,6 +70,7 @@
public:
char wan_ifname[IPA_IFACE_NAME_LEN];
uint32_t wan_ipaddr;
+ bool isStaMode;
IPACM_ConntrackListener();
void event_callback(ipa_cm_event_id, void *data);
diff --git a/ipacm/inc/IPACM_Defs.h b/ipacm/inc/IPACM_Defs.h
index 28bc142..37a9ef5 100644
--- a/ipacm/inc/IPACM_Defs.h
+++ b/ipacm/inc/IPACM_Defs.h
@@ -54,7 +54,7 @@
#define IPA_IFACE_NAME_LEN 16
#define IPA_ALG_PROTOCOL_NAME_LEN 10
-#define IPA_WLAN_PARTIAL_HDR_OFFSET 12 // dst mac first then src mac
+#define IPA_WLAN_PARTIAL_HDR_OFFSET 0 // dst mac first then src mac
#define IPA_VIRTUAL_IFACE_NAME "bridge0"
#define IPA_WLAN_PARTIAL_HDR_NAME_v4 "IEEE802_3_v4"
#define IPA_WLAN_PARTIAL_HDR_NAME_v6 "IEEE802_3_v6"
@@ -198,6 +198,7 @@
char ifname[IPA_IFACE_NAME_LEN];
uint32_t ipv4_addr;
uint32_t addr_mask;
+ bool is_sta;
}ipacm_event_iface_up;
diff --git a/ipacm/src/IPACM_ConntrackClient.cpp b/ipacm/src/IPACM_ConntrackClient.cpp
index cff8e7a..b747e0c 100644
--- a/ipacm/src/IPACM_ConntrackClient.cpp
+++ b/ipacm/src/IPACM_ConntrackClient.cpp
@@ -291,13 +291,16 @@
nfct_filter_add_attr(filter, NFCT_FILTER_DST_IPV4, &filter_ipv4);
- IPACMDBG("ignore connections orignated from interface %s\n", item->ifr_name);
- IPACM_ConntrackClient::iptodot("with ipv4 address:", filter_ipv4.addr);
- nfct_filter_set_logic(filter,
- NFCT_FILTER_SRC_IPV4,
- NFCT_FILTER_LOGIC_NEGATIVE);
+ if(!ct->isStaMode) {
+ IPACMDBG("ignore connections orignated from interface %s\n", item->ifr_name);
+ IPACM_ConntrackClient::iptodot("with ipv4 address:", filter_ipv4.addr);
+ nfct_filter_set_logic(filter,
+ NFCT_FILTER_SRC_IPV4,
+ NFCT_FILTER_LOGIC_NEGATIVE);
- nfct_filter_add_attr(filter, NFCT_FILTER_SRC_IPV4, &filter_ipv4);
+ nfct_filter_add_attr(filter, NFCT_FILTER_SRC_IPV4, &filter_ipv4);
+ }
+
}
}
diff --git a/ipacm/src/IPACM_ConntrackListener.cpp b/ipacm/src/IPACM_ConntrackListener.cpp
index bfa2f37..3b62bd4 100644
--- a/ipacm/src/IPACM_ConntrackListener.cpp
+++ b/ipacm/src/IPACM_ConntrackListener.cpp
@@ -258,6 +258,7 @@
IPACM_ConntrackClient::iptodot("public ip address", wanup_data->ipv4_addr);
isWanUp = true;
+ isStaMode = wanup_data->is_sta;
wan_ipaddr = wanup_data->ipv4_addr;
memcpy(wan_ifname, wanup_data->ifname, sizeof(wan_ifname));
@@ -489,7 +490,7 @@
}
else
{
- IPACMDBG("Neither Destination nor Source nat flag reset\n");
+ IPACMDBG("Neither Destination nor Source nat flag Set\n");
orig_src_ip = nfct_get_attr_u32(ct, ATTR_ORIG_IPV4_SRC);
orig_src_ip = ntohl(orig_src_ip);
if(orig_src_ip == 0)
@@ -640,7 +641,7 @@
}
}
- IPACMDBG("Nat Entry with below information will be added\n");
+ IPACMDBG("Nat Entry with below information will either be added or deleted\n");
IPACM_ConntrackClient::iptodot("target ip or dst ip", rule.target_ip);
IPACMDBG("target port or dst port: 0x%x Decimal:%d\n", rule.target_port, rule.target_port);
IPACM_ConntrackClient::iptodot("private ip or src ip", rule.private_ip);
@@ -650,7 +651,7 @@
if(IPPROTO_TCP == rule.protocol)
{
- na = NatApp::GetInstance();
+ na = NatApp::GetInstance();
if(na == NULL)
{
IPACMERR("unable to get nat app instance");
diff --git a/ipacm/src/IPACM_Conntrack_NATApp.cpp b/ipacm/src/IPACM_Conntrack_NATApp.cpp
index 27f6ab0..36dec9a 100644
--- a/ipacm/src/IPACM_Conntrack_NATApp.cpp
+++ b/ipacm/src/IPACM_Conntrack_NATApp.cpp
@@ -185,7 +185,12 @@
cache[cnt].target_port == rule->target_port &&
cache[cnt].protocol == rule->protocol)
{
- IPACMDBG("Duplicate Rule\n");
+ IPACMDBG("Duplicate Rule, ignore\n");
+ IPACMDBG("Received below nat entry for deletion\n");
+ IPACM_ConntrackClient::iptodot("Private IP", rule->private_ip);
+ IPACM_ConntrackClient::iptodot("Target IP", rule->target_ip);
+ IPACMDBG("Private Port: %d\t Target Port: %d\t", rule->private_port, rule->target_port);
+ IPACMDBG("protocolcol: %d\n", rule->protocol);
return true;
}
}
@@ -224,21 +229,15 @@
return -1;
}
- IPACMDBG("Deleted below Nat entry Successfully\n");
+ IPACMDBG("Deleted Nat entry Successfully\n");
}
else
{
- IPACMDBG("Deleted below Nat entry only from cache\n");
+ IPACMDBG("Deleted Nat entry only from cache\n");
}
memset(&cache[cnt], 0, sizeof(cache[cnt]));
curCnt--;
-
- IPACM_ConntrackClient::iptodot("Private IP", rule->private_ip);
- IPACM_ConntrackClient::iptodot("Target IP", rule->target_ip);
- IPACMDBG("Private Port: %d\t Target Port: %d\t", rule->private_port, rule->target_port);
- IPACMDBG("protocolcol: %d\n", rule->protocol);
-
break;
}
}
@@ -256,6 +255,12 @@
CHK_TBL_HDL();
+ IPACMDBG("Received below nat entry for deletion\n");
+ IPACM_ConntrackClient::iptodot("Private IP", rule->private_ip);
+ IPACM_ConntrackClient::iptodot("Target IP", rule->target_ip);
+ IPACMDBG("Private Port: %d\t Target Port: %d\t", rule->private_port, rule->target_port);
+ IPACMDBG("protocolcol: %d\n", rule->protocol);
+
if(isAlgPort(rule->protocol, rule->private_port) ||
isAlgPort(rule->protocol, rule->target_port))
{
@@ -270,11 +275,6 @@
rule->protocol == 0)
{
IPACMERR("Invalid Connection, ignoring it\n");
- IPACM_ConntrackClient::iptodot("Private IP", rule->private_ip);
- IPACM_ConntrackClient::iptodot("Target IP", rule->target_ip);
- IPACMDBG("Private Port:%d \t Target Port: %d\t", rule->private_port, rule->target_port);
- IPACMDBG("Public Port:%d\n", rule->public_port);
- IPACMDBG("protocol: %d\n", rule->protocol);
return 0;
}
@@ -345,12 +345,7 @@
if(cache[cnt].enabled == true)
{
- IPACMDBG("Added below rule successfully\n");
- IPACM_ConntrackClient::iptodot("Private IP", rule->private_ip);
- IPACM_ConntrackClient::iptodot("Target IP", rule->target_ip);
- IPACMDBG("Private Port:%d \t Target Port: %d\t", rule->private_port, rule->target_port);
- IPACMDBG("Public Port:%d\n", rule->public_port);
- IPACMDBG("protocol: %d\n", rule->protocol);
+ IPACMDBG("Added rule successfully\n");
}
return 0;
diff --git a/ipacm/src/IPACM_Wan.cpp b/ipacm/src/IPACM_Wan.cpp
index 4c9710d..ac49526 100644
--- a/ipacm/src/IPACM_Wan.cpp
+++ b/ipacm/src/IPACM_Wan.cpp
@@ -717,6 +717,7 @@
memcpy(wanup_data->ifname, dev_name, sizeof(wanup_data->ifname));
wanup_data->ipv4_addr = wan_v4_addr;
+ wanup_data->is_sta = IPACM_Wan::backhaul_is_sta_mode;
IPACMDBG("Posting IPA_HANDLE_WAN_UP with below information:\n");
IPACMDBG("if_name:%s, ipv4_address:0x%x\n",
wanup_data->ifname, wanup_data->ipv4_addr);