Fixed below issues found during IPA bring up:
1. Fix ipv6 ping fail
2. Fix ipv6 rule address-reverse order issue
3. Fix duplicate filter rule deletion issue
4. Fix Software-routing checking issue
5. fix wlan down first wan down next issue
Change-Id: I816ee5766f9e291f94a76a67efef6c5971ff9a18
diff --git a/ipacm/inc/IPACM_Iface.h b/ipacm/inc/IPACM_Iface.h
index 9e3cafd..0bc5811 100644
--- a/ipacm/inc/IPACM_Iface.h
+++ b/ipacm/inc/IPACM_Iface.h
@@ -54,6 +54,7 @@
#include "IPACM_Defs.h"
/* current support 2 ipv6-address*/
+#define MAX_DEFAULT_v4_ROUTE_RULES 1
#define MAX_DEFAULT_v6_ROUTE_RULES 2
#define IPV4_DEFAULT_FILTERTING_RULES 3
#define IPV6_DEFAULT_FILTERTING_RULES 1
@@ -87,7 +88,7 @@
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];
- uint32_t dft_rt_rule_hdl[1+MAX_DEFAULT_v6_ROUTE_RULES]; /* 1 for ipv4 */
+ uint32_t dft_rt_rule_hdl[MAX_DEFAULT_v4_ROUTE_RULES+MAX_DEFAULT_v6_ROUTE_RULES];
ipa_ioc_query_intf *iface_query;
ipa_ioc_query_intf_tx_props *tx_prop;
diff --git a/ipacm/inc/IPACM_Wan.h b/ipacm/inc/IPACM_Wan.h
index 5177fe1..da7fd06 100644
--- a/ipacm/inc/IPACM_Wan.h
+++ b/ipacm/inc/IPACM_Wan.h
@@ -97,10 +97,10 @@
int handle_header_add_evt(uint8_t mac_addr[6]);
/* configure the initial firewall filter rules */
- int config_dft_firewall_rules(ipa_ip_type ip_type);
+ int config_dft_firewall_rules(ipa_ip_type iptype);
/*clean firewall filter rules */
- int del_dft_firewall_rules(ipa_ip_type ip_type);
+ int del_dft_firewall_rules(ipa_ip_type iptype);
/*handle wan-iface down event */
int handle_down_evt();
diff --git a/ipacm/src/IPACM_CmdQueue.cpp b/ipacm/src/IPACM_CmdQueue.cpp
index 632ae5d..7e48546 100644
--- a/ipacm/src/IPACM_CmdQueue.cpp
+++ b/ipacm/src/IPACM_CmdQueue.cpp
@@ -108,7 +108,7 @@
MsgQueue = MessageQueue::getInstance();
if(MsgQueue == NULL)
{
- IPACMDBG("unable to start cmd queue process\n");
+ IPACMERR("unable to start cmd queue process\n");
return NULL;
}
@@ -154,7 +154,7 @@
return NULL;
}
- IPACMDBG("Processing item %p\n",item);
+ IPACMDBG("Processing item %p event ID: %d\n",item,item->evt.data.event);
item->evt.callback_ptr(&item->evt.data);
delete item;
item = NULL;
diff --git a/ipacm/src/IPACM_Header.cpp b/ipacm/src/IPACM_Header.cpp
index 0ebb83d..3d3d162 100644
--- a/ipacm/src/IPACM_Header.cpp
+++ b/ipacm/src/IPACM_Header.cpp
@@ -47,7 +47,7 @@
m_fd = open(DEVICE_NAME, O_RDWR);
if (-1 == m_fd)
{
- IPACMDBG("Failed to open %s in IPACM_Header test application constructor.\n", DEVICE_NAME);
+ IPACMERR("Failed to open %s in IPACM_Header test application constructor.\n", DEVICE_NAME);
}
}
diff --git a/ipacm/src/IPACM_Iface.cpp b/ipacm/src/IPACM_Iface.cpp
index cc6ce13..5f4ca07 100644
--- a/ipacm/src/IPACM_Iface.cpp
+++ b/ipacm/src/IPACM_Iface.cpp
@@ -85,6 +85,11 @@
ipa_ioc_add_flt_rule *m_pFilteringTable;
IPACMDBG("\n");
+ if (softwarerouting_act == true)
+ {
+ IPACMDBG("already setup software_routing rule for (%s)iface ip-family %d\n", IPACM_Iface::ipacmcfg->iface_table[ipa_if_num].iface_name, ip_type);
+ return IPACM_SUCCESS;
+ }
m_pFilteringTable = (struct ipa_ioc_add_flt_rule *)
calloc(1,
@@ -209,7 +214,11 @@
ipa_ip_type ip;
uint32_t flt_hdl;
- IPACMDBG("ip-type: %d\n", ip_type);
+ if (softwarerouting_act == false)
+ {
+ IPACMDBG("already delete AMPDU software_routing rule for (%s)iface ip-family %d\n", IPACM_Iface::ipacmcfg->iface_table[ipa_if_num].iface_name, ip_type);
+ return IPACM_SUCCESS;
+ }
if (ip_type == IPA_IP_MAX)
{
@@ -389,11 +398,15 @@
if (res != IPACM_FAILURE)
{
- IPACMDBG("Rx property attribute mask:0x%x\n", rx_prop->rx[0].attrib.attrib_mask);
- for(uint32_t cnt=0; cnt<tx_prop->num_tx_props; cnt++)
+ for (uint32_t cnt=0; cnt<rx_prop->num_rx_props; cnt++)
{
- IPACMDBG("Tx property:%d attribute mask:0x%x, ip-type: %d\n",
- cnt, tx_prop->tx[0].attrib.attrib_mask,tx_prop->tx[0].ip);
+ IPACMDBG("Rx(%d):attrib-mask:0x%x, ip-type: %d, src_pipe: %d\n",
+ cnt, rx_prop->rx[cnt].attrib.attrib_mask, rx_prop->rx[cnt].ip, rx_prop->rx[cnt].src_pipe);
+ }
+ for (uint32_t cnt=0; cnt<tx_prop->num_tx_props; cnt++)
+ {
+ IPACMDBG("Tx(%d):attrib-mask:0x%x, ip-type: %d, dst_pipe: %d, header: %s\n",
+ cnt, tx_prop->tx[cnt].attrib.attrib_mask, tx_prop->tx[cnt].ip, tx_prop->tx[cnt].dst_pipe, tx_prop->tx[cnt].hdr_name);
}
}
@@ -518,7 +531,7 @@
}
else
{
- IPACMDBG("Failed adding default v4 Filtering rule %d\n", i);
+ IPACMERR("Failed adding default v4 Filtering rule %d\n", i);
}
}
}
diff --git a/ipacm/src/IPACM_IfaceManager.cpp b/ipacm/src/IPACM_IfaceManager.cpp
index 747cbfe..36f44ca 100644
--- a/ipacm/src/IPACM_IfaceManager.cpp
+++ b/ipacm/src/IPACM_IfaceManager.cpp
@@ -60,7 +60,6 @@
void IPACM_IfaceManager::event_callback(ipa_cm_event_id event, void *param) //skylar rename:event_callback
{
ipacm_event_data_fid *evt_data = (ipacm_event_data_fid *)param;
- IPACMDBG("\n");
switch(event)
{
@@ -98,9 +97,9 @@
IPACM_EvtDispatcher::registr(IPA_NEIGH_CLIENT_IP_ADDR_DEL_EVENT, lan);
IPACM_EvtDispatcher::registr(IPA_SW_ROUTING_ENABLE, lan);
IPACM_EvtDispatcher::registr(IPA_SW_ROUTING_DISABLE, lan);
- IPACM_EvtDispatcher::registr(IPA_LINK_DOWN_EVENT, lan);
IPACM_EvtDispatcher::registr(IPA_HANDLE_WAN_UP, lan);
IPACM_EvtDispatcher::registr(IPA_HANDLE_WAN_DOWN, lan);
+ IPACM_EvtDispatcher::registr(IPA_LINK_DOWN_EVENT, lan);
IPACMDBG("ipa_LAN (%s):ipa_index (%d) instance open/registr ok\n", lan->dev_name, lan->ipa_if_num);
registr(ipa_interface_index, lan);
}
@@ -119,9 +118,9 @@
IPACM_EvtDispatcher::registr(IPA_NEIGH_CLIENT_IP_ADDR_ADD_EVENT, wl);
IPACM_EvtDispatcher::registr(IPA_SW_ROUTING_ENABLE, wl);
IPACM_EvtDispatcher::registr(IPA_SW_ROUTING_DISABLE, wl);
- IPACM_EvtDispatcher::registr(IPA_LINK_DOWN_EVENT, wl);
IPACM_EvtDispatcher::registr(IPA_HANDLE_WAN_UP, wl);
IPACM_EvtDispatcher::registr(IPA_HANDLE_WAN_DOWN, wl);
+ IPACM_EvtDispatcher::registr(IPA_LINK_DOWN_EVENT, wl);
IPACMDBG("ipa_WLAN (%s):ipa_index (%d) instance open/registr ok\n", wl->dev_name, wl->ipa_if_num);
registr(ipa_interface_index, wl);
}
diff --git a/ipacm/src/IPACM_Lan.cpp b/ipacm/src/IPACM_Lan.cpp
index 8b47985..cc6eec1 100644
--- a/ipacm/src/IPACM_Lan.cpp
+++ b/ipacm/src/IPACM_Lan.cpp
@@ -103,10 +103,14 @@
{
IPACMDBG("Received IPA_ADDR_ADD_EVENT\n");
- if ((data->iptype != ip_type) && (ip_type != IPA_IP_MAX)) // check not setup before
+ /* check v4 not setup before, v6 can have 2 iface ip */
+ if( ((data->iptype != ip_type) && (ip_type != IPA_IP_MAX))
+ || ((data->iptype==IPA_IP_v6) && (num_dft_rt!=MAX_DEFAULT_v6_ROUTE_RULES)))
{
+ IPACMDBG("Got IPA_ADDR_ADD_EVENT ip-family:%d, v6 num %d: \n",data->iptype,num_dft_rt);
handle_addr_evt(data);
handle_private_subnet(data->iptype);
+
if (IPACM_Wan::isWanUP() && (data->iptype == IPA_IP_v4))
{
handle_wan_up();
@@ -320,7 +324,7 @@
if (false == m_header.GetHeaderHandle(&sRetHeader))
{
- IPACMDBG(" ioctl failed\n");
+ IPACMERR(" ioctl failed\n");
}
rt_rule_entry->rule.hdr_hdl = sRetHeader.hdl;
@@ -396,7 +400,7 @@
if (m_routing.DeleteRoutingHdl(get_rt_ruleptr(route_rule, i)->rt_rule_hdl[tx_index],
IPA_IP_v4) == false)
{
- IPACMDBG("Routing rule deletion failed!\n");
+ IPACMERR("Routing rule deletion failed!\n");
return IPACM_FAILURE;
}
}
@@ -514,8 +518,7 @@
memcpy(&m_pFilteringTable->rules[0], &flt_rule_entry, sizeof(flt_rule_entry));
if (false == m_filtering.AddFilteringRule(m_pFilteringTable))
{
- IPACMDBG("Error Adding RuleTable(0) to Filtering, aborting...\n");
- perror("Lan: Unable to add filter rule");
+ IPACMERR("Error Adding RuleTable(0) to Filtering, aborting...\n");
free(m_pFilteringTable);
return IPACM_FAILURE;
}
@@ -542,7 +545,7 @@
if (m_filtering.DeleteFilteringHdls(&lan_wan_fl_rule_hdl[0],
IPA_IP_v4, 1) == false)
{
- IPACMDBG("Error Adding RuleTable(1) to Filtering, aborting...\n");
+ IPACMERR("Error Adding RuleTable(1) to Filtering, aborting...\n");
return IPACM_FAILURE;
}
@@ -558,7 +561,7 @@
const int NUM_RULES = 1;
int res = IPACM_SUCCESS;
- /* construct ipa_ioc_add_flt_rule with 1 rules */
+ /* construct ipa_ioc_add_flt_rule with v6 rules */
ipa_ioc_add_flt_rule *m_pFilteringTable;
IPACMDBG("set route/filter rule ip-type: %d \n", data->iptype);
@@ -652,7 +655,7 @@
if (false == m_routing.GetRoutingTable(&IPACM_Iface::ipacmcfg->rt_tbl_v6))
{
- IPACMDBG("m_routing.GetRoutingTable(&IPACM_Iface::ipacmcfg->rt_tbl_v6=0x%p) Failed.\n", &IPACM_Iface::ipacmcfg->rt_tbl_v6);
+ IPACMERR("m_routing.GetRoutingTable(&IPACM_Iface::ipacmcfg->rt_tbl_v6=0x%p) Failed.\n", &IPACM_Iface::ipacmcfg->rt_tbl_v6);
free(m_pFilteringTable);
res = IPACM_FAILURE;
goto fail;
@@ -698,7 +701,7 @@
free(m_pFilteringTable);
}
- dft_rt_rule_hdl[1 + num_dft_rt] = rt_rule_entry->rt_rule_hdl;
+ dft_rt_rule_hdl[MAX_DEFAULT_v4_ROUTE_RULES + num_dft_rt] = rt_rule_entry->rt_rule_hdl;
num_dft_rt++;
}
@@ -766,7 +769,7 @@
if (false == m_filtering.AddFilteringRule(m_pFilteringTable))
{
- IPACMDBG("Error Adding RuleTable(0) to Filtering, aborting...\n");
+ IPACMERR("Error Adding RuleTable(0) to Filtering, aborting...\n");
free(m_pFilteringTable);
return IPACM_FAILURE;
}
@@ -816,7 +819,7 @@
/* may have multiple ipv6 iface-RT rules*/
for (i = 0; i < num_dft_rt; i++)
{
- if (m_routing.DeleteRoutingHdl(dft_rt_rule_hdl[1 + i], IPA_IP_v6)
+ if (m_routing.DeleteRoutingHdl(dft_rt_rule_hdl[MAX_DEFAULT_v4_ROUTE_RULES + i], IPA_IP_v6)
== false)
{
IPACMERR("Routing rule deletion failed!\n");
@@ -846,7 +849,7 @@
/* check software routing fl rule hdl */
if (softwarerouting_act == true)
{
- IPACM_Iface::handle_software_routing_disable();
+ handle_software_routing_disable();
}
diff --git a/ipacm/src/IPACM_Neighbor.cpp b/ipacm/src/IPACM_Neighbor.cpp
index 327b681..5c04087 100644
--- a/ipacm/src/IPACM_Neighbor.cpp
+++ b/ipacm/src/IPACM_Neighbor.cpp
@@ -240,7 +240,7 @@
}
else
{
- IPACMDBG("error: neighbor client oversize!");
+ IPACMERR("error: neighbor client oversize!");
return;
}
};
diff --git a/ipacm/src/IPACM_Netlink.cpp b/ipacm/src/IPACM_Netlink.cpp
index eea98ea..d9a9098 100644
--- a/ipacm/src/IPACM_Netlink.cpp
+++ b/ipacm/src/IPACM_Netlink.cpp
@@ -92,7 +92,7 @@
(struct sockaddr *)p_sk_addr_loc,
sizeof(struct sockaddr_nl)) < 0)
{
- IPACMDBG("Socket bind failed\n");
+ IPACMERR("Socket bind failed\n");
return IPACM_FAILURE;
}
@@ -163,7 +163,7 @@
}
else
{
- IPACMDBG("No read function\n");
+ IPACMERR("No read function\n");
}
}
@@ -341,14 +341,13 @@
ipa_nl_link_info_t *link_info
)
{
- struct rtattr *rtah = NULL;
+ struct rtattr;
/* NL message header */
struct nlmsghdr *nlh = (struct nlmsghdr *)buffer;
/* Extract the header data */
link_info->metainfo = *(struct ifinfomsg *)NLMSG_DATA(nlh);
buflen -= sizeof(struct nlmsghdr);
- rtah = IFA_RTA(NLMSG_DATA(nlh));
return IPACM_SUCCESS;
}
@@ -586,6 +585,15 @@
{
IPACMDBG("\n GOT useful newlink event\n");
ret_val = ipa_get_if_name(dev_name, msg_ptr->nl_link_info.metainfo.ifi_index);
+
+ 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 IPACM_FAILURE;
+ }
+ data_fid->if_index = msg_ptr->nl_link_info.metainfo.ifi_index;
+
if(msg_ptr->nl_link_info.metainfo.ifi_flags & IFF_UP)
{
IPACMDBG("Interface %s bring up with IP-family: %d \n", dev_name, msg_ptr->nl_link_info.metainfo.ifi_family);
@@ -603,15 +611,6 @@
data_fid->if_index);
}
- data_fid = (ipacm_event_data_fid *)malloc(sizeof(ipacm_event_data_fid));
- if(data_fid == NULL)
- {
- IPACMDBG("unable to allocate memory for event data_fid\n");
- return IPACM_FAILURE;
- }
- data_fid->if_index = msg_ptr->nl_link_info.metainfo.ifi_index;
-
-
evt_data.evt_data = data_fid;
IPACM_EvtDispatcher::PostEvt(&evt_data);
@@ -643,7 +642,7 @@
data_fid = (ipacm_event_data_fid *)malloc(sizeof(ipacm_event_data_fid));
if(data_fid == NULL)
{
- IPACMDBG("unable to allocate memory for event data_fid\n");
+ IPACMERR("unable to allocate memory for event data_fid\n");
return IPACM_FAILURE;
}
@@ -676,7 +675,7 @@
data_addr = (ipacm_event_data_addr *)malloc(sizeof(ipacm_event_data_addr));
if(data_addr == NULL)
{
- IPACMDBG("unable to allocate memory for event data_addr\n");
+ IPACMERR("unable to allocate memory for event data_addr\n");
return IPACM_FAILURE;
}
@@ -696,6 +695,11 @@
memcpy(data_addr->ipv6_addr,
msg_ptr->nl_addr_info.attr_info.prefix_addr.__ss_padding,
sizeof(data_addr->ipv6_addr));
+
+ data_addr->ipv6_addr[0] = ntohl(data_addr->ipv6_addr[0]);
+ data_addr->ipv6_addr[1] = ntohl(data_addr->ipv6_addr[1]);
+ data_addr->ipv6_addr[2] = ntohl(data_addr->ipv6_addr[2]);
+ data_addr->ipv6_addr[3] = ntohl(data_addr->ipv6_addr[3]);
}
else
{
@@ -870,7 +874,7 @@
data_addr = (ipacm_event_data_addr *)malloc(sizeof(ipacm_event_data_addr));
if(data_addr == NULL)
{
- IPACMDBG("unable to allocate memory for event data_addr\n");
+ IPACMERR("unable to allocate memory for event data_addr\n");
return IPACM_FAILURE;
}
@@ -921,10 +925,20 @@
msg_ptr->nl_route_info.attr_info.dst_addr.__ss_padding,
sizeof(data_addr->ipv6_addr));
- memcpy(data_addr->ipv6_addr_mask,
+ data_addr->ipv6_addr[0] = ntohl(data_addr->ipv6_addr[0]);
+ data_addr->ipv6_addr[1] = ntohl(data_addr->ipv6_addr[1]);
+ data_addr->ipv6_addr[2] = ntohl(data_addr->ipv6_addr[2]);
+ data_addr->ipv6_addr[3] = ntohl(data_addr->ipv6_addr[3]);
+
+ memcpy(data_addr->ipv6_addr_mask,
msg_ptr->nl_route_info.attr_info.dst_addr.__ss_padding,
sizeof(data_addr->ipv6_addr_mask));
+ data_addr->ipv6_addr_mask[0] = ntohl(data_addr->ipv6_addr_mask[0]);
+ data_addr->ipv6_addr_mask[1] = ntohl(data_addr->ipv6_addr_mask[1]);
+ data_addr->ipv6_addr_mask[2] = ntohl(data_addr->ipv6_addr_mask[2]);
+ data_addr->ipv6_addr_mask[3] = ntohl(data_addr->ipv6_addr_mask[3]);
+
evt_data.event = IPA_ROUTE_ADD_EVENT;
data_addr->if_index = msg_ptr->nl_route_info.attr_info.oif_index;
data_addr->iptype = IPA_IP_v6;
@@ -1013,7 +1027,7 @@
data_addr = (ipacm_event_data_addr *)malloc(sizeof(ipacm_event_data_addr));
if(data_addr == NULL)
{
- IPACMDBG("unable to allocate memory for event data_addr\n");
+ IPACMERR("unable to allocate memory for event data_addr\n");
return IPACM_FAILURE;
}
@@ -1021,6 +1035,11 @@
msg_ptr->nl_route_info.attr_info.dst_addr.__ss_padding,
sizeof(data_addr->ipv6_addr));
+ data_addr->ipv6_addr[0] = ntohl(data_addr->ipv6_addr[0]);
+ data_addr->ipv6_addr[1] = ntohl(data_addr->ipv6_addr[1]);
+ data_addr->ipv6_addr[2] = ntohl(data_addr->ipv6_addr[2]);
+ data_addr->ipv6_addr[3] = ntohl(data_addr->ipv6_addr[3]);
+
mask_value_v6 = msg_ptr->nl_route_info.metainfo.rtm_dst_len;
for(mask_index = 0; mask_index < 4; mask_index++)
{
@@ -1043,6 +1062,11 @@
data_addr->ipv6_addr_mask[2],
data_addr->ipv6_addr_mask[3]);
+ data_addr->ipv6_addr_mask[0] = ntohl(data_addr->ipv6_addr_mask[0]);
+ data_addr->ipv6_addr_mask[1] = ntohl(data_addr->ipv6_addr_mask[1]);
+ data_addr->ipv6_addr_mask[2] = ntohl(data_addr->ipv6_addr_mask[2]);
+ data_addr->ipv6_addr_mask[3] = ntohl(data_addr->ipv6_addr_mask[3]);
+
evt_data.event = IPA_ROUTE_ADD_EVENT;
data_addr->if_index = msg_ptr->nl_route_info.attr_info.oif_index;
data_addr->iptype = IPA_IP_v6;
@@ -1078,9 +1102,20 @@
memcpy(data_addr->ipv6_addr, msg_ptr->nl_route_info.attr_info.dst_addr.__ss_padding,
sizeof(data_addr->ipv6_addr));
+
+ data_addr->ipv6_addr[0] = ntohl(data_addr->ipv6_addr[0]);
+ data_addr->ipv6_addr[1] = ntohl(data_addr->ipv6_addr[1]);
+ data_addr->ipv6_addr[2] = ntohl(data_addr->ipv6_addr[2]);
+ data_addr->ipv6_addr[3] = ntohl(data_addr->ipv6_addr[3]);
+
memcpy(data_addr->ipv6_addr_mask, msg_ptr->nl_route_info.attr_info.dst_addr.__ss_padding,
sizeof(data_addr->ipv6_addr_mask));
+ data_addr->ipv6_addr_mask[0] = ntohl(data_addr->ipv6_addr_mask[0]);
+ data_addr->ipv6_addr_mask[1] = ntohl(data_addr->ipv6_addr_mask[1]);
+ data_addr->ipv6_addr_mask[2] = ntohl(data_addr->ipv6_addr_mask[2]);
+ data_addr->ipv6_addr_mask[3] = ntohl(data_addr->ipv6_addr_mask[3]);
+
evt_data.event = IPA_ROUTE_ADD_EVENT;
data_addr->if_index = msg_ptr->nl_route_info.attr_info.oif_index;
data_addr->iptype = IPA_IP_v6;
@@ -1098,7 +1133,7 @@
case RTM_DELROUTE:
if(IPACM_SUCCESS != ipa_nl_decode_rtm_route(buffer, buflen, &(msg_ptr->nl_route_info)))
{
- IPACMDBG("Failed to decode rtm route message\n");
+ IPACMERR("Failed to decode rtm route message\n");
return IPACM_FAILURE;
}
@@ -1255,8 +1290,19 @@
}
memcpy(data_addr->ipv6_addr, msg_ptr->nl_route_info.attr_info.dst_addr.__ss_padding,
sizeof(data_addr->ipv6_addr));
+
+ data_addr->ipv6_addr[0] = ntohl(data_addr->ipv6_addr[0]);
+ data_addr->ipv6_addr[1] = ntohl(data_addr->ipv6_addr[1]);
+ data_addr->ipv6_addr[2] = ntohl(data_addr->ipv6_addr[2]);
+ data_addr->ipv6_addr[3] = ntohl(data_addr->ipv6_addr[3]);
+
memcpy(data_addr->ipv6_addr_mask, msg_ptr->nl_route_info.attr_info.dst_addr.__ss_padding,
sizeof(data_addr->ipv6_addr_mask));
+
+ data_addr->ipv6_addr_mask[0] = ntohl(data_addr->ipv6_addr_mask[0]);
+ data_addr->ipv6_addr_mask[1] = ntohl(data_addr->ipv6_addr_mask[1]);
+ data_addr->ipv6_addr_mask[2] = ntohl(data_addr->ipv6_addr_mask[2]);
+ data_addr->ipv6_addr_mask[3] = ntohl(data_addr->ipv6_addr_mask[3]);
data_addr->iptype = IPA_IP_v6;
}
else
@@ -1331,6 +1377,11 @@
memcpy(data_addr->ipv6_addr, msg_ptr->nl_route_info.attr_info.dst_addr.__ss_padding,
sizeof(data_addr->ipv6_addr));
+ data_addr->ipv6_addr[0] = ntohl(data_addr->ipv6_addr[0]);
+ data_addr->ipv6_addr[1] = ntohl(data_addr->ipv6_addr[1]);
+ data_addr->ipv6_addr[2] = ntohl(data_addr->ipv6_addr[2]);
+ data_addr->ipv6_addr[3] = ntohl(data_addr->ipv6_addr[3]);
+
mask_value_v6 = msg_ptr->nl_route_info.metainfo.rtm_dst_len;
for(mask_index = 0; mask_index < 4; mask_index++)
{
@@ -1364,6 +1415,11 @@
IPACMDBG("3st: %08x \n",
data_addr->ipv6_addr_mask[3]);
+ data_addr->ipv6_addr_mask[0] = ntohl(data_addr->ipv6_addr_mask[0]);
+ data_addr->ipv6_addr_mask[1] = ntohl(data_addr->ipv6_addr_mask[1]);
+ data_addr->ipv6_addr_mask[2] = ntohl(data_addr->ipv6_addr_mask[2]);
+ data_addr->ipv6_addr_mask[3] = ntohl(data_addr->ipv6_addr_mask[3]);
+
evt_data.event = IPA_ROUTE_DEL_EVENT;
data_addr->if_index = msg_ptr->nl_route_info.attr_info.oif_index;
data_addr->iptype = IPA_IP_v6;
@@ -1398,9 +1454,21 @@
}
memcpy(data_addr->ipv6_addr, msg_ptr->nl_route_info.attr_info.dst_addr.__ss_padding,
sizeof(data_addr->ipv6_addr));
+
+ data_addr->ipv6_addr[0] = ntohl(data_addr->ipv6_addr[0]);
+ data_addr->ipv6_addr[1] = ntohl(data_addr->ipv6_addr[1]);
+ data_addr->ipv6_addr[2] = ntohl(data_addr->ipv6_addr[2]);
+ data_addr->ipv6_addr[3] = ntohl(data_addr->ipv6_addr[3]);
+
+
memcpy(data_addr->ipv6_addr_mask, msg_ptr->nl_route_info.attr_info.dst_addr.__ss_padding,
sizeof(data_addr->ipv6_addr_mask));
+ data_addr->ipv6_addr_mask[0] = ntohl(data_addr->ipv6_addr_mask[0]);
+ data_addr->ipv6_addr_mask[1] = ntohl(data_addr->ipv6_addr_mask[1]);
+ data_addr->ipv6_addr_mask[2] = ntohl(data_addr->ipv6_addr_mask[2]);
+ data_addr->ipv6_addr_mask[3] = ntohl(data_addr->ipv6_addr_mask[3]);
+
evt_data.event = IPA_ROUTE_DEL_EVENT;
data_addr->if_index = msg_ptr->nl_route_info.attr_info.oif_index;
data_addr->iptype = IPA_IP_v6;
@@ -1449,6 +1517,11 @@
memcpy(data_all->ipv6_addr,
msg_ptr->nl_neigh_info.attr_info.local_addr.__ss_padding,
sizeof(data_all->ipv6_addr));
+
+ data_addr->ipv6_addr[0] = ntohl(data_addr->ipv6_addr[0]);
+ data_addr->ipv6_addr[1] = ntohl(data_addr->ipv6_addr[1]);
+ data_addr->ipv6_addr[2] = ntohl(data_addr->ipv6_addr[2]);
+ data_addr->ipv6_addr[3] = ntohl(data_addr->ipv6_addr[3]);
data_all->iptype = IPA_IP_v6;
}
else
@@ -1531,6 +1604,11 @@
memcpy(data_all->ipv6_addr, msg_ptr->nl_neigh_info.attr_info.local_addr.__ss_padding,
sizeof(data_all->ipv6_addr));
+
+ data_addr->ipv6_addr[0] = ntohl(data_addr->ipv6_addr[0]);
+ data_addr->ipv6_addr[1] = ntohl(data_addr->ipv6_addr[1]);
+ data_addr->ipv6_addr[2] = ntohl(data_addr->ipv6_addr[2]);
+ data_addr->ipv6_addr[3] = ntohl(data_addr->ipv6_addr[3]);
data_all->iptype = IPA_IP_v6;
}
else
@@ -1686,7 +1764,7 @@
ipa_sock_thrd_fd_read_f read_f
)
{
- ipa_nl_sk_info_t sk_info, sk_info2;
+ ipa_nl_sk_info_t sk_info;
int ret_val;
memset(&sk_info, 0, sizeof(ipa_nl_sk_info_t));
diff --git a/ipacm/src/IPACM_Routing.cpp b/ipacm/src/IPACM_Routing.cpp
index 1351fbe..43f42bf 100644
--- a/ipacm/src/IPACM_Routing.cpp
+++ b/ipacm/src/IPACM_Routing.cpp
@@ -53,7 +53,7 @@
m_fd = open(DEVICE_NAME, O_RDWR);
if (0 == m_fd)
{
- IPACMDBG("Failed opening %s.\n", DEVICE_NAME);
+ IPACMERR("Failed opening %s.\n", DEVICE_NAME);
}
}
@@ -77,7 +77,7 @@
if (!DeviceNodeIsOpened())
{
- IPACMDBG("Device is not opened\n");
+ IPACMERR("Device is not opened\n");
return false;
}
diff --git a/ipacm/src/IPACM_Wan.cpp b/ipacm/src/IPACM_Wan.cpp
index 1a45dc5..237c4d9 100644
--- a/ipacm/src/IPACM_Wan.cpp
+++ b/ipacm/src/IPACM_Wan.cpp
@@ -78,9 +78,6 @@
const int NUM_RULES = 1;
int res = IPACM_SUCCESS;
- /* initial multicast/broadcast/fragment filter rule */
- init_fl_rule(data->iptype);
-
rt_rule = (struct ipa_ioc_add_rt_rule *)
calloc(1, sizeof(struct ipa_ioc_add_rt_rule) +
NUM_RULES * sizeof(struct ipa_rt_rule_add));
@@ -105,7 +102,7 @@
}
rt_rule_entry = &rt_rule->rules[0];
- rt_rule_entry->at_rear = 1;
+ rt_rule_entry->at_rear = false;
rt_rule_entry->rule.dst = IPA_CLIENT_A5_LAN_WAN_CONS; //go to A5
rt_rule_entry->rule.attrib.attrib_mask = IPA_FLT_DST_ADDR;
@@ -149,12 +146,21 @@
if (data->iptype == IPA_IP_v4)
{
dft_rt_rule_hdl[0] = rt_rule_entry->rt_rule_hdl;
- IPACMDBG("ipv4 wan rt rule hdl1=0x%x\n", dft_rt_rule_hdl[0]);
+ IPACMDBG("ipv4 wan iface rt-rule hdl1=0x%x\n", dft_rt_rule_hdl[0]);
+
+ /* initial multicast/broadcast/fragment filter rule */
+ init_fl_rule(data->iptype);
}
else
{
- dft_rt_rule_hdl[1 + num_dft_rt] = rt_rule_entry->rt_rule_hdl;
- IPACMDBG("ipv6 wan rt rule hdl1=0x%x\n", dft_rt_rule_hdl[1 + num_dft_rt]);
+ if (num_dft_rt == 0)
+ {
+ /* initial multicast/broadcast/fragment filter rule */
+ init_fl_rule(data->iptype);
+ }
+
+ dft_rt_rule_hdl[MAX_DEFAULT_v4_ROUTE_RULES + num_dft_rt] = rt_rule_entry->rt_rule_hdl;
+ IPACMDBG("ipv6 wan iface rt-rule hdl1=0x%x\n", dft_rt_rule_hdl[MAX_DEFAULT_v4_ROUTE_RULES + num_dft_rt]);
num_dft_rt++;
}
@@ -193,9 +199,11 @@
ipa_interface_index = iface_ipa_index_query(data->if_index);
if (ipa_interface_index == ipa_if_num)
{
- if ((data->iptype != ip_type) && (ip_type != IPA_IP_MAX)) // check not setup before
+ /* check v4 not setup before, v6 can have 2 iface ip */
+ if( ((data->iptype != ip_type) && (ip_type != IPA_IP_MAX))
+ || ((data->iptype==IPA_IP_v6) && (num_dft_rt!=MAX_DEFAULT_v6_ROUTE_RULES)))
{
- IPACMDBG("Received IPA_ADDR_ADD_EVENT\n");
+ IPACMDBG("Got IPA_ADDR_ADD_EVENT ip-family:%d, v6 num %d: \n",data->iptype,num_dft_rt);
handle_addr_evt(data);
}
}
@@ -266,7 +274,6 @@
if (ipa_interface_index == ipa_if_num)
{
IPACMDBG("Received IPA_NEIGH_CLIENT_IP_ADDR_ADD_EVENT\n");
- IPACMDBG("I'm in the WAN\n");
handle_header_add_evt(data->mac_addr);
}
}
@@ -346,12 +353,14 @@
IPACMDBG(" WAN table created %s \n", rt_rule->rt_tbl_name);
rt_rule_entry = &rt_rule->rules[0];
- rt_rule_entry->at_rear = 1;
+ rt_rule_entry->at_rear = true;
for (tx_index = 0; tx_index < iface_query->num_tx_props; tx_index++)
{
if (data->iptype != tx_prop->tx[tx_index].ip)
{
+ IPACMDBG("Tx:%d, ip-type: %d conflict ip-type: %d no RT-rule added\n",
+ tx_index, tx_prop->tx[tx_index].ip,data->iptype);
continue;
}
@@ -447,6 +456,7 @@
return IPACM_SUCCESS;
}
+
/* wan default route/filter rule delete */
int IPACM_Wan::handle_route_del_evt(ipa_ip_type iptype)
{
@@ -461,6 +471,14 @@
for (tx_index = 0; tx_index < iface_query->num_tx_props; tx_index++)
{
+
+ if(iptype != tx_prop->tx[tx_index].ip)
+ {
+ IPACMDBG("Tx:%d, ip-type: %d conflict ip-type: %d, no RT-rule deleted\n",
+ tx_index, tx_prop->tx[tx_index].ip,iptype);
+ continue;
+ }
+
if (iptype == IPA_IP_v4)
{
@@ -477,7 +495,7 @@
if (m_routing.DeleteRoutingHdl(wan_route_rule_v6_hdl[tx_index], IPA_IP_v6)
== false)
{
- IPACMERR("IP-family:%d, Routing rule(hdl:0x%x) deletion failed with tx_index %d!\n", IPA_IP_v6, wan_route_rule_v6_hdl[tx_index], tx_index);
+ IPACMDBG("IP-family:%d, Routing rule(hdl:0x%x) deletion failed with tx_index %d!\n", IPA_IP_v6, wan_route_rule_v6_hdl[tx_index], tx_index);
return IPACM_FAILURE;
}
}
@@ -500,12 +518,14 @@
/* Insert IPA_HANDLE_WAN_DOWN to command queue */
IPACMDBG("posting IPA_HANDLE_WAN_DOWN for IPv4 \n");
IPACM_EvtDispatcher::PostEvt(&evt_data);
+ IPACMDBG("setup wan_up/active_v4= false \n");
IPACM_Wan::wan_up = false;
active_v4 = false;
}
else
{
- active_v6 = false;
+ IPACMDBG("setup active_v6= false \n");
+ active_v6 = false;
}
}
else
@@ -743,7 +763,7 @@
{
memset(&flt_rule_entry, 0, sizeof(struct ipa_flt_rule_add));
- flt_rule_entry.at_rear = true;
+ flt_rule_entry.at_rear = false;
flt_rule_entry.flt_rule_hdl = -1;
flt_rule_entry.status = -1;
flt_rule_entry.rule.action = IPA_PASS_TO_EXCEPTION; //Matched the firewall rule, go exception
@@ -946,7 +966,7 @@
if (!m_pFilteringTable)
{
- IPACMDBG("Error Locate ipa_flt_rule_add memory...\n");
+ IPACMERR("Error Locate ipa_flt_rule_add memory...\n");
return IPACM_FAILURE;
}
m_pFilteringTable->commit = 1;
@@ -969,11 +989,11 @@
{
memset(&flt_rule_entry, 0, sizeof(struct ipa_flt_rule_add));
- flt_rule_entry.at_rear = true;
+ flt_rule_entry.at_rear = false;
flt_rule_entry.flt_rule_hdl = -1;
flt_rule_entry.status = -1;
- flt_rule_entry.rule.action = IPA_PASS_TO_DST_NAT;
+ flt_rule_entry.rule.action = IPA_PASS_TO_EXCEPTION;
flt_rule_entry.rule.rt_tbl_hdl = IPACM_Iface::ipacmcfg->rt_tbl_v6.hdl;
memcpy(&flt_rule_entry.rule.attrib,
&firewall_config.extd_firewall_entries[i].attrib,
@@ -1049,7 +1069,7 @@
flt_rule_entry.at_rear = true;
flt_rule_entry.flt_rule_hdl = -1;
flt_rule_entry.status = -1;
- flt_rule_entry.rule.action = IPA_PASS_TO_EXCEPTION;
+ flt_rule_entry.rule.action = IPA_PASS_TO_ROUTING;
memcpy(&flt_rule_entry.rule.attrib,
&rx_prop->rx[0].attrib,
sizeof(struct ipa_rule_attrib));
@@ -1119,7 +1139,7 @@
if (m_routing.DeleteRoutingHdl(dft_rt_rule_hdl[0], IPA_IP_v4)
== false)
{
- IPACMDBG("Routing rule deletion failed!\n");
+ IPACMERR("Routing rule deletion failed!\n");
res = IPACM_FAILURE;
goto fail;
}
@@ -1132,7 +1152,7 @@
/* May have multiple ipv6 iface-routing rules*/
for (i = 0; i < num_dft_rt; i++)
{
- if (m_routing.DeleteRoutingHdl(dft_rt_rule_hdl[1 + i], IPA_IP_v6)
+ if (m_routing.DeleteRoutingHdl(dft_rt_rule_hdl[MAX_DEFAULT_v4_ROUTE_RULES+i], IPA_IP_v6)
== false)
{
IPACMERR("Routing rule deletion failed!\n");
@@ -1147,7 +1167,6 @@
/* check software routing fl rule hdl */
if (softwarerouting_act == true)
{
- IPACM_Iface::handle_software_routing_disable();
handle_software_routing_disable();
}
diff --git a/ipacm/src/IPACM_Wlan.cpp b/ipacm/src/IPACM_Wlan.cpp
index 0160406..4ed66b4 100644
--- a/ipacm/src/IPACM_Wlan.cpp
+++ b/ipacm/src/IPACM_Wlan.cpp
@@ -121,8 +121,12 @@
if (ipa_interface_index == ipa_if_num)
{
- if ((data->iptype != ip_type) && (ip_type != IPA_IP_MAX)) // check not setup before
+ /* check v4 not setup before, v6 can have 2 iface ip */
+ if (((data->iptype != ip_type) && (ip_type != IPA_IP_MAX))
+ || ((data->iptype == IPA_IP_v6) && (num_dft_rt != MAX_DEFAULT_v6_ROUTE_RULES)))
{
+
+ IPACMDBG("Got IPA_ADDR_ADD_EVENT ip-family:%d, v6 num %d: \n", data->iptype, num_dft_rt);
/* Post event to NAT */
if (data->iptype == IPA_IP_v4)
{
@@ -253,18 +257,18 @@
}
break;
- /* handle software routing enable event*/
+ /* handle software routing enable event, iface will update softwarerouting_act to true*/
case IPA_SW_ROUTING_ENABLE:
IPACMDBG("Received IPA_SW_ROUTING_ENABLE\n");
- IPACM_Iface::handle_software_routing_enable();
handle_software_routing_enable();
+ IPACM_Iface::handle_software_routing_enable();
break;
- /* handle software routing disable event*/
+ /* handle software routing disable event, iface will update softwarerouting_act to false*/
case IPA_SW_ROUTING_DISABLE:
IPACMDBG("Received IPA_SW_ROUTING_DISABLE\n");
- IPACM_Iface::handle_software_routing_disable();
handle_software_routing_disable();
+ IPACM_Iface::handle_software_routing_disable();
break;
default:
@@ -424,7 +428,7 @@
{
if (clnt_indx == IPACM_INVALID_INDEX)
{
- IPACMDBG("wlan client not found/attached \n");
+ IPACMERR("wlan client not found/attached \n");
return IPACM_FAILURE;
}
}
@@ -649,7 +653,7 @@
if (delete_default_qos_rtrules(clt_indx))
{
- IPACMDBG("unbale to delete default qos route rules\n");
+ IPACMERR("unbale to delete default qos route rules\n");
return IPACM_FAILURE;
}
@@ -729,7 +733,7 @@
if (false == m_routing.GetRoutingTable(&IPACM_Iface::ipacmcfg->rt_tbl_wan_v4))
{
- IPACMDBG("m_routing.GetRoutingTable(&IPACM_Iface::ipacmcfg->rt_tbl_wan_v4=0x%p) Failed.\n", &IPACM_Iface::ipacmcfg->rt_tbl_wan_v4);
+ IPACMERR("m_routing.GetRoutingTable(&IPACM_Iface::ipacmcfg->rt_tbl_wan_v4=0x%p) Failed.\n", &IPACM_Iface::ipacmcfg->rt_tbl_wan_v4);
return IPACM_FAILURE;
}
@@ -751,8 +755,7 @@
memcpy(&m_pFilteringTable->rules[0], &flt_rule_entry, sizeof(flt_rule_entry));
if (m_filtering.AddFilteringRule(m_pFilteringTable) == false)
{
- IPACMDBG("Error Adding Filtering Rule, aborting...\n");
- perror("Wlan: Unable to add filtering table");
+ IPACMERR("Error Adding Filtering Rule, aborting...\n");
free(m_pFilteringTable);
return IPACM_FAILURE;
}
@@ -792,7 +795,12 @@
ipa_ioc_add_flt_rule *m_pFilteringTable;
int res = IPACM_SUCCESS;
- IPACMDBG("\n");
+ if (softwarerouting_act == true)
+ {
+ IPACMDBG("already setup AMPDU software_routing rule for (%s)iface ip-family %d\n",
+ IPACM_Iface::ipacmcfg->iface_table[ipa_if_num].iface_name, ip_type);
+ return IPACM_SUCCESS;
+ }
m_pFilteringTable = (struct ipa_ioc_add_flt_rule *)
calloc(1,
@@ -839,7 +847,7 @@
}
else if (m_pFilteringTable->rules[0].status)
{
- IPACMDBG("adding flt rule failed status=0x%x\n", m_pFilteringTable->rules[0].status);
+ IPACMERR("adding flt rule failed status=0x%x\n", m_pFilteringTable->rules[0].status);
res = IPACM_FAILURE;
goto fail;
}
@@ -860,7 +868,7 @@
}
else if (m_pFilteringTable->rules[0].status)
{
- IPACMDBG("adding flt rule failed status=0x%x\n", m_pFilteringTable->rules[0].status);
+ IPACMERR("adding flt rule failed status=0x%x\n", m_pFilteringTable->rules[0].status);
res = IPACM_FAILURE;
goto fail;
}
@@ -883,7 +891,7 @@
}
else if (m_pFilteringTable->rules[0].status)
{
- IPACMDBG("adding flt rule failed status=0x%x\n", m_pFilteringTable->rules[0].status);
+ IPACMERR("adding flt rule failed status=0x%x\n", m_pFilteringTable->rules[0].status);
res = IPACM_FAILURE;
goto fail;
}
@@ -904,6 +912,14 @@
/*delete ampdu filter rules for disabling software_routing event*/
int IPACM_Wlan::handle_software_routing_disable(void)
{
+
+ if (softwarerouting_act == false)
+ {
+ IPACMDBG("already delete AMPDU software_routing rule for (%s)iface ip-family %d\n",
+ IPACM_Iface::ipacmcfg->iface_table[ipa_if_num].iface_name, ip_type);
+ return IPACM_SUCCESS;
+ }
+
if (ip_type == IPA_IP_MAX)
{
@@ -1260,7 +1276,7 @@
if (ip_type == IPACM_IP_NULL)
{
IPACMERR("Invalid iptype: 0x%x\n", ip_type);
- return IPACM_FAILURE;
+ goto fail;
}
/* Delete v6 filtering rules */
@@ -1337,7 +1353,7 @@
/* May have multiple ipv6 iface-RT rules */
for (i = 0; i < num_dft_rt; i++)
{
- if (m_routing.DeleteRoutingHdl(dft_rt_rule_hdl[i + 1], IPA_IP_v6)
+ if (m_routing.DeleteRoutingHdl(dft_rt_rule_hdl[MAX_DEFAULT_v4_ROUTE_RULES+i], IPA_IP_v6)
== false)
{
IPACMERR("Routing rule deletion failed!\n");
diff --git a/ipacm/src/IPACM_cfg.xml b/ipacm/src/IPACM_cfg.xml
index 06f20b6..551c178 100644
--- a/ipacm/src/IPACM_cfg.xml
+++ b/ipacm/src/IPACM_cfg.xml
@@ -28,11 +28,11 @@
<IPACMALG>
<ALG>
<Protocol>TCP</Protocol>
- <Port>23</Port>
+ <Port>21</Port>
</ALG>
<ALG>
- <Protocol>UDP</Protocol>
- <Port>250</Port>
+ <Protocol>TCP</Protocol>
+ <Port>554</Port>
</ALG>
</IPACMALG>
<IPACMNAT>