Merge "IPACM: handle multiple ETH usb clients"
diff --git a/ipacm/inc/IPACM_Defs.h b/ipacm/inc/IPACM_Defs.h
index a43e41d..9df0c10 100644
--- a/ipacm/inc/IPACM_Defs.h
+++ b/ipacm/inc/IPACM_Defs.h
@@ -95,6 +95,7 @@
#define IPACM_INVALID_INDEX (ipa_ip_type)0xFF
#define IPA_MAX_NUM_WIFI_CLIENTS 32
+#define IPA_MAX_NUM_ETH_CLIENTS 15
#define IPA_MAX_NUM_AMPDU_RULE 15
#define IPA_MAC_ADDR_SIZE 6
diff --git a/ipacm/inc/IPACM_Lan.h b/ipacm/inc/IPACM_Lan.h
index 6f66a62..b84df97 100644
--- a/ipacm/inc/IPACM_Lan.h
+++ b/ipacm/inc/IPACM_Lan.h
@@ -48,8 +48,8 @@
#include "IPACM_Routing.h"
#include "IPACM_Filtering.h"
#include "IPACM_Config.h"
+#include "IPACM_Conntrack_NATApp.h"
-#define IPA_MAX_NUM_UNICAST_ROUTE_RULES 6
#define IPA_WAN_DEFAULT_FILTER_RULE_HANDLES 1
#define IPA_PRIV_SUBNET_FILTER_RULE_HANDLES 3
#define MAX_WAN_UL_FILTER_RULES 20
@@ -64,6 +64,30 @@
uint32_t rt_rule_hdl[0];
};
+/* Support multiple eth client */
+typedef struct _eth_client_rt_hdl
+{
+ uint32_t eth_rt_rule_hdl_v4;
+ uint32_t eth_rt_rule_hdl_v6[IPV6_NUM_ADDR];
+ uint32_t eth_rt_rule_hdl_v6_wan[IPV6_NUM_ADDR];
+}eth_client_rt_hdl;
+
+typedef struct _ipa_eth_client
+{
+ uint8_t mac[IPA_MAC_ADDR_SIZE];
+ uint32_t v4_addr;
+ uint32_t v6_addr[IPV6_NUM_ADDR][4];
+ uint32_t hdr_hdl_v4;
+ uint32_t hdr_hdl_v6;
+ bool route_rule_set_v4;
+ int route_rule_set_v6;
+ bool ipv4_set;
+ int ipv6_set;
+ bool ipv4_header_set;
+ bool ipv6_header_set;
+ eth_client_rt_hdl eth_rt_hdl[0]; /* depends on number of tx properties */
+}ipa_eth_client;
+
/* lan iface */
class IPACM_Lan : public IPACM_Iface
{
@@ -107,45 +131,131 @@
private:
/* dynamically allocate lan iface's unicast routing rule structure */
- int rt_rule_len;
-
- ipa_lan_rt_rule *route_rule;
-
- uint32_t v6_addr[IPV6_NUM_ADDR][4];
-
- int ipv6_set;
-
- uint32_t ETH_hdr_hdl_v4, ETH_hdr_hdl_v6;
- bool ipv4_header_set;
-
- bool ipv6_header_set;
-
- /* store the number of lan-iface's unicast routing rule */
- int num_uni_rt;
+ int eth_client_len;
- inline ipa_lan_rt_rule* get_rt_ruleptr(ipa_lan_rt_rule *param, int cnt)
+ ipa_eth_client *eth_client;
+
+ int header_name_count;
+
+ int num_eth_client;
+
+ NatApp *Nat_App;
+
+ inline ipa_eth_client* get_client_memptr(ipa_eth_client *param, int cnt)
{
- char *ret = ((char *)param) + (rt_rule_len * cnt);
- return (ipa_lan_rt_rule *)ret;
+ char *ret = ((char *)param) + (eth_client_len * cnt);
+ return (ipa_eth_client *)ret;
+ }
+
+ inline int get_eth_client_index(uint8_t *mac_addr)
+ {
+ int cnt;
+ int num_eth_client_tmp = num_eth_client;
+
+ IPACMDBG("Passed MAC %02x:%02x:%02x:%02x:%02x:%02x\n",
+ mac_addr[0], mac_addr[1], mac_addr[2],
+ mac_addr[3], mac_addr[4], mac_addr[5]);
+
+ for(cnt = 0; cnt < num_eth_client_tmp; cnt++)
+ {
+ IPACMDBG("stored MAC %02x:%02x:%02x:%02x:%02x:%02x\n",
+ get_client_memptr(eth_client, cnt)->mac[0],
+ get_client_memptr(eth_client, cnt)->mac[1],
+ get_client_memptr(eth_client, cnt)->mac[2],
+ get_client_memptr(eth_client, cnt)->mac[3],
+ get_client_memptr(eth_client, cnt)->mac[4],
+ get_client_memptr(eth_client, cnt)->mac[5]);
+
+ if(memcmp(get_client_memptr(eth_client, cnt)->mac,
+ mac_addr,
+ sizeof(get_client_memptr(eth_client, cnt)->mac)) == 0)
+ {
+ IPACMDBG("Matched client index: %d\n", cnt);
+ return cnt;
+ }
+ }
+
+ return IPACM_INVALID_INDEX;
+ }
+
+ inline int delete_eth_rtrules(int clt_indx, ipa_ip_type iptype)
+ {
+ uint32_t tx_index;
+ uint32_t rt_hdl;
+ int num_v6;
+
+ if(iptype == IPA_IP_v4)
+ {
+ for(tx_index = 0; tx_index < iface_query->num_tx_props; tx_index++)
+ {
+ if((tx_prop->tx[tx_index].ip == IPA_IP_v4) && (get_client_memptr(eth_client, clt_indx)->route_rule_set_v4==true)) /* for ipv4 */
+ {
+ IPACMDBG("Delete client index %d ipv4 RT-rules for tx:%d \n", clt_indx,tx_index);
+ rt_hdl = get_client_memptr(eth_client, clt_indx)->eth_rt_hdl[tx_index].eth_rt_rule_hdl_v4;
+
+ if(m_routing.DeleteRoutingHdl(rt_hdl, IPA_IP_v4) == false)
+ {
+ return IPACM_FAILURE;
+ }
+ }
+ } /* end of for loop */
+
+ /* clean the ipv4 RT rules for eth-client:clt_indx */
+ if(get_client_memptr(eth_client, clt_indx)->route_rule_set_v4==true) /* for ipv4 */
+ {
+ get_client_memptr(eth_client, clt_indx)->route_rule_set_v4 = false;
+ }
+ }
+
+ if(iptype == IPA_IP_v6)
+ {
+ for(tx_index = 0; tx_index < iface_query->num_tx_props; tx_index++)
+ {
+
+ if((tx_prop->tx[tx_index].ip == IPA_IP_v6) && (get_client_memptr(eth_client, clt_indx)->route_rule_set_v6 != 0)) /* for ipv6 */
+ {
+ for(num_v6 =0;num_v6 < get_client_memptr(eth_client, clt_indx)->route_rule_set_v6;num_v6++)
+ {
+ IPACMDBG("Delete client index %d ipv6 RT-rules for %d-st ipv6 for tx:%d\n", clt_indx,num_v6,tx_index);
+ rt_hdl = get_client_memptr(eth_client, clt_indx)->eth_rt_hdl[tx_index].eth_rt_rule_hdl_v6[num_v6];
+ if(m_routing.DeleteRoutingHdl(rt_hdl, IPA_IP_v6) == false)
+ {
+ return IPACM_FAILURE;
+ }
+
+ rt_hdl = get_client_memptr(eth_client, clt_indx)->eth_rt_hdl[tx_index].eth_rt_rule_hdl_v6_wan[num_v6];
+ if(m_routing.DeleteRoutingHdl(rt_hdl, IPA_IP_v6) == false)
+ {
+ return IPACM_FAILURE;
+ }
+ }
+ }
+ } /* end of for loop */
+
+ /* clean the ipv6 RT rules for eth-client:clt_indx */
+ if(get_client_memptr(eth_client, clt_indx)->route_rule_set_v6 != 0) /* for ipv6 */
+ {
+ get_client_memptr(eth_client, clt_indx)->route_rule_set_v6 = 0;
+ }
+ }
+
+ return IPACM_SUCCESS;
}
- /* handle unicast routing rule add event for ipv4 */
- int handle_route_add_evt(ipacm_event_data_addr *data);
-
- /* handle unicast routing rule add event for ipv6 */
- int handle_route_add_evt_v6(ipacm_event_data_all *data);
-
- /* handle unicast routing rule del event for ipv4 */
- int handle_route_del_evt(ipacm_event_data_addr *data);
-
- /* handle unicast routing rule del event for ipv6 */
- int handle_route_del_evt_v6(ipacm_event_data_all *data);
-
- /* handle ETH client initial, construct full headers (tx property) */
+ /* handle eth client initial, construct full headers (tx property) */
int handle_eth_hdr_init(uint8_t *mac_addr);
+
+ /* handle eth client ip-address */
+ int handle_eth_client_ipaddr(ipacm_event_data_all *data);
+
+ /* handle eth client routing rule*/
+ int handle_eth_client_route_rule(uint8_t *mac_addr, ipa_ip_type iptype);
+
+ /*handle eth client del mode*/
+ int handle_eth_client_down_evt(uint8_t *mac_addr);
- /*handle wlan iface down event*/
+ /*handle lan iface down event*/
int handle_down_evt();
/* store ipv4 UL filter rule handlers from Q6*/
diff --git a/ipacm/src/IPACM_Lan.cpp b/ipacm/src/IPACM_Lan.cpp
index 43ab371..a125a13 100644
--- a/ipacm/src/IPACM_Lan.cpp
+++ b/ipacm/src/IPACM_Lan.cpp
@@ -52,15 +52,21 @@
IPACM_Lan::IPACM_Lan(int iface_index) : IPACM_Iface(iface_index)
{
- num_uni_rt = 0;
- ipv6_set = 0;
- ipv4_header_set = false;
- ipv6_header_set = false;
- int ret = IPACM_SUCCESS;
- rt_rule_len = sizeof(struct ipa_lan_rt_rule) + (iface_query->num_tx_props * sizeof(uint32_t));
- route_rule = (struct ipa_lan_rt_rule *)calloc(IPA_MAX_NUM_UNICAST_ROUTE_RULES, rt_rule_len);
- if (route_rule == NULL)
+ num_eth_client = 0;
+ header_name_count = 0;
+
+ Nat_App = NatApp::GetInstance();
+ if (Nat_App == NULL)
+ {
+ IPACMERR("unable to get Nat App instance \n");
+ return;
+ }
+
+ /* support eth multiple clients */
+ eth_client_len = (sizeof(ipa_eth_client)) + (iface_query->num_tx_props * sizeof(eth_client_rt_hdl));
+ eth_client = (ipa_eth_client *)calloc(IPA_MAX_NUM_ETH_CLIENTS, eth_client_len);
+ if (eth_client == NULL)
{
IPACMERR("unable to allocate memory\n");
return;
@@ -235,20 +241,6 @@
}
break;
- case IPA_ROUTE_ADD_EVENT:
- {
- ipacm_event_data_addr *data = (ipacm_event_data_addr *)param;
- ipa_interface_index = iface_ipa_index_query(data->if_index);
-
- /* unicast routing rule add */
- if (ipa_interface_index == ipa_if_num)
- {
- IPACMDBG("Received IPA_ROUTE_ADD_EVENT\n");
- handle_route_add_evt(data);
- }
- }
- break;
-
case IPA_HANDLE_WAN_DOWN:
IPACMDBG("Received IPA_HANDLE_WAN_DOWN event\n");
handle_wan_down(IPACM_Wan::backhaul_is_sta_mode);
@@ -259,63 +251,26 @@
handle_wan_down_v6(IPACM_Wan::backhaul_is_sta_mode);
break;
- case IPA_ROUTE_DEL_EVENT:
- {
- ipacm_event_data_addr *data = (ipacm_event_data_addr *)param;
- ipa_interface_index = iface_ipa_index_query(data->if_index);
-
- /* unicast routing rule del */
- if (ipa_interface_index == ipa_if_num)
- {
- IPACMDBG("Received IPA_ROUTE_DEL_EVENT\n");
- handle_route_del_evt(data);
- }
- }
- break;
-
case IPA_NEIGH_CLIENT_IP_ADDR_ADD_EVENT:
{
ipacm_event_data_all *data = (ipacm_event_data_all *)param;
ipa_interface_index = iface_ipa_index_query(data->if_index);
IPACMDBG("check iface %s category: %d\n",IPACM_Iface::ipacmcfg->iface_table[ipa_if_num].iface_name, IPACM_Iface::ipacmcfg->iface_table[ipa_if_num].if_cat);
- if ((ipa_interface_index == ipa_if_num) && (IPACM_Iface::ipacmcfg->iface_table[ipa_if_num].if_cat == ETH_IF))
+ if (ipa_interface_index == ipa_if_num)
{
- IPACMDBG("ETH iface got v4-ip \n");
+ IPACMDBG("ETH iface got client \n");
/* first construc ETH full header */
- if ((ipv4_header_set == false) && (ipv6_header_set == false))
- {
handle_eth_hdr_init(data->mac_addr);
IPACMDBG("construct ETH header and route rules \n");
- }
- }
-
- if ((ipa_interface_index == ipa_if_num) && (data->iptype == IPA_IP_v6))
- {
- IPACMDBG("Received IPA_NEIGH_CLIENT_IP_ADDR_ADD_EVENT for ipv6\n");
- handle_route_add_evt_v6(data);
- }
- /* support ipv4 unicast route add coming from bridge0 via new_neighbor event */
- if ((ipa_interface_index == ipa_if_num) && (data->iptype == IPA_IP_v4))
- {
- IPACMDBG("Received IPA_NEIGH_CLIENT_IP_ADDR_ADD_EVENT for ipv4 \n");
- ipacm_event_data_addr *data2;
- data2 = (ipacm_event_data_addr *)
- malloc(sizeof(ipacm_event_data_addr));
- if (data2 == NULL)
+ /* Associate with IP and construct RT-rule */
+ if (handle_eth_client_ipaddr(data) == IPACM_FAILURE)
{
- IPACMERR("Unable to allocate memory\n");
- return;
+ return;
}
- memset(data2, 0, sizeof(data2));
- data2->iptype = IPA_IP_v4;
- data2->ipv4_addr = data->ipv4_addr;
- data2->ipv4_addr_mask = 0xFFFFFFFF;
- IPACMDBG("IPv4 address:0x%x, mask:0x%x\n",
- data2->ipv4_addr, data2->ipv4_addr_mask);
- handle_route_add_evt(data2);
- free(data2);
- }
+ handle_eth_client_route_rule(data->mac_addr, data->iptype);
+ return;
+ }
}
break;
@@ -323,31 +278,13 @@
{
ipacm_event_data_all *data = (ipacm_event_data_all *)param;
ipa_interface_index = iface_ipa_index_query(data->if_index);
- if ((ipa_interface_index == ipa_if_num) && (data->iptype == IPA_IP_v6) )
- {
- IPACMDBG("Received IPA_NEIGH_CLIENT_IP_ADDR_DEL_EVENT for ipv6\n");
- handle_route_del_evt_v6(data);
- }
- /* support ipv4 unicast route delete coming from bridge0 via new_neighbor event */
- if ((ipa_interface_index == ipa_if_num) && (data->iptype == IPA_IP_v4))
- {
- IPACMDBG("Received IPA_NEIGH_CLIENT_IP_ADDR_DEL_EVENT for ipv4 \n");
- ipacm_event_data_addr *data2;
- data2 = (ipacm_event_data_addr *)
- malloc(sizeof(ipacm_event_data_addr));
- if (data2 == NULL)
- {
- IPACMERR("Unable to allocate memory\n");
- return;
- }
- memset(data2, 0, sizeof(data2));
- data2->iptype = IPA_IP_v4;
- data2->ipv4_addr = data->ipv4_addr;
- data2->ipv4_addr_mask = 0xFFFFFFFF;
- IPACMDBG("IPv4 address:0x%x, mask:0x%x\n",
- data2->iptype, data2->ipv4_addr_mask);
- handle_route_add_evt(data2);
- free(data2);
+
+ IPACMDBG("check iface %s category: %d\n",IPACM_Iface::ipacmcfg->iface_table[ipa_if_num].iface_name, IPACM_Iface::ipacmcfg->iface_table[ipa_if_num].if_cat);
+ if (ipa_interface_index == ipa_if_num)
+ {
+ IPACMDBG("ETH iface delete client \n");
+ handle_eth_client_down_evt(data->mac_addr);
+ return;
}
}
break;
@@ -371,518 +308,6 @@
return;
}
-
-/*handle USB client IPv6*/
-int IPACM_Lan::handle_route_add_evt_v6(ipacm_event_data_all *data)
-{
- /* add unicate route for LAN */
- struct ipa_ioc_add_rt_rule *rt_rule;
- struct ipa_rt_rule_add *rt_rule_entry;
- struct ipa_ioc_get_hdr sRetHeader;
- uint32_t tx_index;
- int v6_num;
-
- IPACMDBG(" usb MAC %02x:%02x:%02x:%02x:%02x:%02x\n",
- data->mac_addr[0],
- data->mac_addr[1],
- data->mac_addr[2],
- data->mac_addr[3],
- data->mac_addr[4],
- data->mac_addr[5]);
-
- if (tx_prop == NULL)
- {
- IPACMDBG("No Tx properties registered for iface %s\n", dev_name);
- return IPACM_SUCCESS;
- }
-
- IPACMDBG("Ip-type received %d, ipv6_set: %d\n", data->iptype,ipv6_set);
- if (data->iptype == IPA_IP_v6)
- {
- /* check if all 0 not valid ipv6 address */
- if ((data->ipv6_addr[0]!= 0) || (data->ipv6_addr[1]!= 0) ||
- (data->ipv6_addr[2]!= 0) || (data->ipv6_addr[3] || 0))
- {
- IPACMDBG("ipv6 address: 0x%x:%x:%x:%x\n", data->ipv6_addr[0], data->ipv6_addr[1], data->ipv6_addr[2], data->ipv6_addr[3]);
- if(ipv6_set<IPV6_NUM_ADDR)
- {
- /* check if see that before or not*/
- for(v6_num = 0;v6_num < ipv6_set;v6_num++)
- {
- if( data->ipv6_addr[0] == v6_addr[v6_num][0] &&
- data->ipv6_addr[1] == v6_addr[v6_num][1] &&
- data->ipv6_addr[2]== v6_addr[v6_num][2] &&
- data->ipv6_addr[3] == v6_addr[v6_num][3])
- {
- IPACMDBG("Already see this ipv6 addr for LAN iface \n");
- return IPACM_SUCCESS; /* not setup the RT rules*/
- break;
- }
- }
-
- /* Add corresponding ipa_rm_resource_name of TX-endpoint up before IPV6 RT-rule set */
- IPACM_Iface::ipacmcfg->AddRmDepend(IPACM_Iface::ipacmcfg->ipa_client_rm_map_tbl[tx_prop->tx[0].dst_pipe],false);
-
- /* not see this ipv6 before for LAN client*/
- v6_addr[ipv6_set][0] = data->ipv6_addr[0];
- v6_addr[ipv6_set][1] = data->ipv6_addr[1];
- v6_addr[ipv6_set][2] = data->ipv6_addr[2];
- v6_addr[ipv6_set][3] = data->ipv6_addr[3];
-
- /* unicast RT rule add start */
- rt_rule = (struct ipa_ioc_add_rt_rule *)
- calloc(1, sizeof(struct ipa_ioc_add_rt_rule) +
- 1 * sizeof(struct ipa_rt_rule_add));
- if (!rt_rule)
- {
- IPACMERR("fail\n");
- return IPACM_FAILURE;
- }
-
- rt_rule->commit = 1;
- rt_rule->num_rules = (uint8_t)1;
- rt_rule->ip = data->iptype;
- rt_rule_entry = &rt_rule->rules[0];
- rt_rule_entry->at_rear = false;
-
-
- 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 unicast LAN RT-rule added\n",
- tx_index, tx_prop->tx[tx_index].ip,data->iptype);
- continue;
- }
-
- strcpy(rt_rule->rt_tbl_name, IPACM_Iface::ipacmcfg->rt_tbl_v6.name);
-
- /* Support QCMAP LAN traffic feature, send to A5 */
- rt_rule_entry->rule.dst = iface_query->excp_pipe;
- memset(&rt_rule_entry->rule.attrib, 0, sizeof(rt_rule_entry->rule.attrib));
- rt_rule_entry->rule.hdr_hdl = 0;
- rt_rule_entry->rule.attrib.attrib_mask |= IPA_FLT_DST_ADDR;
- rt_rule_entry->rule.attrib.u.v6.dst_addr[0] = data->ipv6_addr[0];
- rt_rule_entry->rule.attrib.u.v6.dst_addr[1] = data->ipv6_addr[1];
- rt_rule_entry->rule.attrib.u.v6.dst_addr[2] = data->ipv6_addr[2];
- rt_rule_entry->rule.attrib.u.v6.dst_addr[3] = data->ipv6_addr[3];
- rt_rule_entry->rule.attrib.u.v6.dst_addr_mask[0] = 0xFFFFFFFF;
- rt_rule_entry->rule.attrib.u.v6.dst_addr_mask[1] = 0xFFFFFFFF;
- rt_rule_entry->rule.attrib.u.v6.dst_addr_mask[2] = 0xFFFFFFFF;
- rt_rule_entry->rule.attrib.u.v6.dst_addr_mask[3] = 0xFFFFFFFF;
-
- if (false == m_routing.AddRoutingRule(rt_rule))
- {
- IPACMERR("Routing rule addition failed!\n");
- free(rt_rule);
- return IPACM_FAILURE;
- }
- get_rt_ruleptr(route_rule, num_uni_rt)->rt_rule_hdl[tx_index]
- = rt_rule_entry->rt_rule_hdl;
- IPACMDBG("ipv6 rt rule hdl1 for LAN-table=0x%x, entry:0x%x\n", rt_rule_entry->rt_rule_hdl,get_rt_ruleptr(route_rule, num_uni_rt)->rt_rule_hdl[tx_index]);
-
- /* Construct same v6 rule for rt_tbl_wan_v6 */
- if (tx_prop->tx[tx_index].hdr_name)
- {
- memset(&sRetHeader, 0, sizeof(sRetHeader));
- strncpy(sRetHeader.name,
- tx_prop->tx[tx_index].hdr_name,
- sizeof(tx_prop->tx[tx_index].hdr_name));
-
- if (false == m_header.GetHeaderHandle(&sRetHeader))
- {
- IPACMERR(" ioctl failed\n");
- free(rt_rule);
- return IPACM_FAILURE;
- }
-
- rt_rule_entry->rule.hdr_hdl = sRetHeader.hdl;
- }
-
- /* Replace v6 header in ETH interface */
- if (IPACM_Iface::ipacmcfg->iface_table[ipa_if_num].if_cat == ETH_IF)
- rt_rule_entry->rule.hdr_hdl = ETH_hdr_hdl_v6;
-
- /* Downlink traffic from Wan iface, directly through IPA */
- rt_rule_entry->rule.dst = tx_prop->tx[tx_index].dst_pipe;
- memcpy(&rt_rule_entry->rule.attrib,
- &tx_prop->tx[tx_index].attrib,
- sizeof(rt_rule_entry->rule.attrib));
- rt_rule_entry->rule.attrib.attrib_mask |= IPA_FLT_DST_ADDR;
- rt_rule_entry->rule.attrib.u.v6.dst_addr[0] = data->ipv6_addr[0];
- rt_rule_entry->rule.attrib.u.v6.dst_addr[1] = data->ipv6_addr[1];
- rt_rule_entry->rule.attrib.u.v6.dst_addr[2] = data->ipv6_addr[2];
- rt_rule_entry->rule.attrib.u.v6.dst_addr[3] = data->ipv6_addr[3];
- rt_rule_entry->rule.attrib.u.v6.dst_addr_mask[0] = 0xFFFFFFFF;
- rt_rule_entry->rule.attrib.u.v6.dst_addr_mask[1] = 0xFFFFFFFF;
- rt_rule_entry->rule.attrib.u.v6.dst_addr_mask[2] = 0xFFFFFFFF;
- rt_rule_entry->rule.attrib.u.v6.dst_addr_mask[3] = 0xFFFFFFFF;
-
- strcpy(rt_rule->rt_tbl_name, IPACM_Iface::ipacmcfg->rt_tbl_wan_v6.name);
- if (false == m_routing.AddRoutingRule(rt_rule))
- {
- IPACMERR("Routing rule addition failed!\n");
- free(rt_rule);
- return IPACM_FAILURE;
- }
- get_rt_ruleptr(route_rule, (num_uni_rt+1))->rt_rule_hdl[tx_index]
- = rt_rule_entry->rt_rule_hdl;
- IPACMDBG("ipv6 rt rule hdl1 for WAN-table=0x%x, entry:0x%x\n", rt_rule_entry->rt_rule_hdl,get_rt_ruleptr(route_rule, (num_uni_rt+1))->rt_rule_hdl[tx_index]);
-
- }
-
- get_rt_ruleptr(route_rule, num_uni_rt)->ip = IPA_IP_v6;
- get_rt_ruleptr(route_rule, num_uni_rt)->v6_addr[0] = data->ipv6_addr[0];
- get_rt_ruleptr(route_rule, num_uni_rt)->v6_addr[1] = data->ipv6_addr[1];
- get_rt_ruleptr(route_rule, num_uni_rt)->v6_addr[2] = data->ipv6_addr[2];
- get_rt_ruleptr(route_rule, num_uni_rt)->v6_addr[3] = data->ipv6_addr[3];
-
- get_rt_ruleptr(route_rule, (num_uni_rt+1))->ip = IPA_IP_v6;
- get_rt_ruleptr(route_rule, (num_uni_rt+1))->v6_addr[0] = data->ipv6_addr[0];
- get_rt_ruleptr(route_rule, (num_uni_rt+1))->v6_addr[1] = data->ipv6_addr[1];
- get_rt_ruleptr(route_rule, (num_uni_rt+1))->v6_addr[2] = data->ipv6_addr[2];
- get_rt_ruleptr(route_rule, (num_uni_rt+1))->v6_addr[3] = data->ipv6_addr[3];
-
- num_uni_rt=num_uni_rt+2;
- free(rt_rule);
- ipv6_set++;
- IPACMDBG("Total unicast Rt rules: %d\n", num_uni_rt);
- }
- else
- {
- IPACMDBG("Already got 3 ipv6 addr for LAN usb-client:\n");
- return IPACM_SUCCESS; /* not setup the RT rules*/
- }
- }
- }
-
- return IPACM_SUCCESS;
-}
-
-
-/* handle unicast routing rule add event */
-int IPACM_Lan::handle_route_add_evt(ipacm_event_data_addr *data)
-{
- /* add unicate route for LAN */
- struct ipa_ioc_add_rt_rule *rt_rule;
- struct ipa_rt_rule_add *rt_rule_entry;
- struct ipa_ioc_get_hdr sRetHeader;
- uint32_t tx_index;
- int i;
-
- IPACMDBG("LAN callback: unicast IPA_ROUTE_ADD_EVENT\n");
-
- if (tx_prop == NULL)
- {
- IPACMDBG("No Tx properties registered for iface %s\n", dev_name);
- return IPACM_SUCCESS;
- }
-
- if (data->iptype == IPA_IP_v6)
- {
- IPACMDBG("Not setup v6 unicast RT-rule with new_route event for iface %s\n", dev_name);
- return IPACM_SUCCESS;
- }
-
-
- if (num_uni_rt < IPA_MAX_NUM_UNICAST_ROUTE_RULES)
- {
- /* check the unicast RT rule is set or not*/
- for (i = 0; i < num_uni_rt; i++)
- {
-
- if ( data->iptype == IPA_IP_v4 &&
- (data->ipv4_addr == get_rt_ruleptr(route_rule, i)->v4_addr) &&
- (data->ipv4_addr_mask == get_rt_ruleptr(route_rule, i)->v4_addr_mask) )
- {
- IPACMDBG("find previous-added ipv4 unicast RT entry as index: %d, ignore adding\n",i);
- return IPACM_SUCCESS;
- break;
- }
- }
-
- /* Add corresponding ipa_rm_resource_name of TX-endpoint up before IPV4 RT-rule set */
- IPACM_Iface::ipacmcfg->AddRmDepend(IPACM_Iface::ipacmcfg->ipa_client_rm_map_tbl[tx_prop->tx[0].dst_pipe],false);
-
- /* unicast RT rule add start */
- rt_rule = (struct ipa_ioc_add_rt_rule *)
- calloc(1, sizeof(struct ipa_ioc_add_rt_rule) +
- 1 * sizeof(struct ipa_rt_rule_add));
- if (!rt_rule)
- {
- IPACMERR("fail\n");
- return IPACM_FAILURE;
- }
-
- rt_rule->commit = 1;
- rt_rule->num_rules = (uint8_t)1;
- rt_rule->ip = data->iptype;
-
- if (data->iptype == IPA_IP_v4)
- {
- strcpy(rt_rule->rt_tbl_name, IPACM_Iface::ipacmcfg->rt_tbl_lan_v4.name);
- }
-
- rt_rule_entry = &rt_rule->rules[0];
- rt_rule_entry->at_rear = false;
-
- 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 unicast LAN RT-rule added\n",
- tx_index, tx_prop->tx[tx_index].ip,data->iptype);
- continue;
- }
-
- if (tx_prop->tx[tx_index].hdr_name)
- {
- memset(&sRetHeader, 0, sizeof(sRetHeader));
- strncpy(sRetHeader.name,
- tx_prop->tx[tx_index].hdr_name,
- sizeof(tx_prop->tx[tx_index].hdr_name));
-
- if (false == m_header.GetHeaderHandle(&sRetHeader))
- {
- IPACMERR(" ioctl failed\n");
- free(rt_rule);
- return IPACM_FAILURE;
- }
-
- rt_rule_entry->rule.hdr_hdl = sRetHeader.hdl;
- }
-
- /* Replace the v4 header in ETH interface */
- if (IPACM_Iface::ipacmcfg->iface_table[ipa_if_num].if_cat == ETH_IF)
- rt_rule_entry->rule.hdr_hdl = ETH_hdr_hdl_v4;
-
- rt_rule_entry->rule.dst = tx_prop->tx[tx_index].dst_pipe;
- memcpy(&rt_rule_entry->rule.attrib,
- &tx_prop->tx[tx_index].attrib,
- sizeof(rt_rule_entry->rule.attrib));
- rt_rule_entry->rule.attrib.attrib_mask |= IPA_FLT_DST_ADDR;
- if (data->iptype == IPA_IP_v4)
- {
- rt_rule_entry->rule.attrib.u.v4.dst_addr = data->ipv4_addr;
- rt_rule_entry->rule.attrib.u.v4.dst_addr_mask = data->ipv4_addr_mask;
- }
-
- if (false == m_routing.AddRoutingRule(rt_rule))
- {
- IPACMERR("Routing rule addition failed!\n");
- free(rt_rule);
- return IPACM_FAILURE;
- }
-
- IPACMDBG("rt rule hdl1=0x%x\n", rt_rule_entry->rt_rule_hdl);
- get_rt_ruleptr(route_rule, num_uni_rt)->rt_rule_hdl[tx_index]
- = rt_rule_entry->rt_rule_hdl;
- }
-
- get_rt_ruleptr(route_rule, num_uni_rt)->ip = IPA_IP_v4;
- get_rt_ruleptr(route_rule, num_uni_rt)->v4_addr = data->ipv4_addr;
- get_rt_ruleptr(route_rule, num_uni_rt)->v4_addr_mask = data->ipv4_addr_mask;
- IPACMDBG("index: %d, ip-family: %d, IPv4 address:0x%x, IPv4 address mask:0x%x \n",
- num_uni_rt, get_rt_ruleptr(route_rule, num_uni_rt)->ip,
- get_rt_ruleptr(route_rule, num_uni_rt)->v4_addr,
- get_rt_ruleptr(route_rule, num_uni_rt)->v4_addr_mask);
-
-
- free(rt_rule);
- num_uni_rt++;
- }
- else
- {
- IPACMDBG("unicast rule oversize\n");
- return IPACM_FAILURE;
- }
-
- return IPACM_SUCCESS;
-}
-
-/* handle unicast routing rule del event */
-int IPACM_Lan::handle_route_del_evt(ipacm_event_data_addr *data)
-{
- int i;
- uint32_t tx_index;
-
- if (tx_prop == NULL)
- {
- IPACMDBG("No Tx properties registered for iface %s\n", dev_name);
- return IPACM_SUCCESS;
- }
-
- if (data->iptype == IPA_IP_v6)
- {
- IPACMDBG("Not setup v6 unicast RT-rule with new_route event for iface %s\n", dev_name);
- return IPACM_SUCCESS;
- }
-
- /* delete 1 unicast RT rule */
- for (i = 0; i < num_uni_rt; i++)
- {
-
- if (data->iptype == IPA_IP_v4)
- {
- if ((data->ipv4_addr == get_rt_ruleptr(route_rule, i)->v4_addr) &&
- (data->ipv4_addr_mask == get_rt_ruleptr(route_rule, i)->v4_addr_mask))
- {
- 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 unicast LAN RT-rule added\n",
- tx_index, tx_prop->tx[tx_index].ip,data->iptype);
- continue;
- }
-
- if (m_routing.DeleteRoutingHdl(get_rt_ruleptr(route_rule, i)->rt_rule_hdl[tx_index],
- IPA_IP_v4) == false)
- {
- IPACMERR("Routing rule deletion failed!\n");
- return IPACM_FAILURE;
- }
- }
-
- /* remove that delted route rule entry*/
- for (; i < num_uni_rt; i++)
- {
- get_rt_ruleptr(route_rule, i)->v4_addr = get_rt_ruleptr(route_rule, (i + 1))->v4_addr;
- get_rt_ruleptr(route_rule, i)->v4_addr_mask = get_rt_ruleptr(route_rule, (i + 1))->v4_addr_mask;
- get_rt_ruleptr(route_rule, i)->v6_addr[0] = get_rt_ruleptr(route_rule, (i + 1))->v6_addr[0];
- get_rt_ruleptr(route_rule, i)->v6_addr[1] = get_rt_ruleptr(route_rule, (i + 1))->v6_addr[1];
- get_rt_ruleptr(route_rule, i)->v6_addr[2] = get_rt_ruleptr(route_rule, (i + 1))->v6_addr[2];
- get_rt_ruleptr(route_rule, i)->v6_addr[3] = get_rt_ruleptr(route_rule, (i + 1))->v6_addr[3];
- get_rt_ruleptr(route_rule, i)->ip = get_rt_ruleptr(route_rule, (i + 1))->ip;
-
- for (tx_index = 0; tx_index < iface_query->num_tx_props; tx_index++)
- {
- get_rt_ruleptr(route_rule, i)->rt_rule_hdl[tx_index] = get_rt_ruleptr(route_rule, (i + 1))->rt_rule_hdl[tx_index];
- }
- }
-
- num_uni_rt -= 1;
-
- /* Del v4 RM dependency */
- if(num_uni_rt == 0)
- {
- /* Delete corresponding ipa_rm_resource_name of TX-endpoint after delete all IPV4V6 RT-rule*/
- IPACM_Iface::ipacmcfg->DelRmDepend(IPACM_Iface::ipacmcfg->ipa_client_rm_map_tbl[tx_prop->tx[0].dst_pipe]);
- }
-
- return IPACM_SUCCESS;
- }
- }
-
- }
-
- return IPACM_FAILURE;
-}
-
-/* handle unicast routing rule del event */
-int IPACM_Lan::handle_route_del_evt_v6(ipacm_event_data_all *data)
-{
- int i,v6_num;
- uint32_t tx_index;
-
- if (tx_prop == NULL)
- {
- IPACMDBG("No Tx properties registered for iface %s\n", dev_name);
- return IPACM_SUCCESS;
- }
-
- /* delete 1 unicast RT rule with 2 entries */
- for (i = 0; i < num_uni_rt; i++)
- {
- if (data->iptype == IPA_IP_v6)
- {
- if ((data->ipv6_addr[0] == get_rt_ruleptr(route_rule, i)->v6_addr[0]) &&
- (data->ipv6_addr[1] == get_rt_ruleptr(route_rule, i)->v6_addr[1]) &&
- (data->ipv6_addr[2] == get_rt_ruleptr(route_rule, i)->v6_addr[2]) &&
- (data->ipv6_addr[3] == get_rt_ruleptr(route_rule, i)->v6_addr[3]))
- {
- 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 unicast LAN RT-rule added\n",
- tx_index, tx_prop->tx[tx_index].ip,data->iptype);
- continue;
- }
-
- if (m_routing.DeleteRoutingHdl(get_rt_ruleptr(route_rule, i)->rt_rule_hdl[tx_index],
- IPA_IP_v6) == false)
- {
- IPACMERR("Routing rule deletion failed!\n");
- return IPACM_FAILURE;
- }
-
- /* also delete the v6 rules for rt_tbl_wan_v6*/
- if (m_routing.DeleteRoutingHdl(get_rt_ruleptr(route_rule, i+1)->rt_rule_hdl[tx_index],
- IPA_IP_v6) == false)
- {
- IPACMERR("Routing rule deletion failed!\n");
- return IPACM_FAILURE;
- }
- }
-
- /* remove that delted route rule entry*/
- for (; i < num_uni_rt; i++)
- {
- for (tx_index = 0; tx_index < iface_query->num_tx_props; tx_index++)
- {
- get_rt_ruleptr(route_rule, i)->rt_rule_hdl[tx_index] = get_rt_ruleptr(route_rule, (i + 2))->rt_rule_hdl[tx_index];
- }
- get_rt_ruleptr(route_rule, i)->v4_addr = get_rt_ruleptr(route_rule, (i + 2))->v4_addr;
- get_rt_ruleptr(route_rule, i)->v4_addr_mask = get_rt_ruleptr(route_rule, (i + 2))->v4_addr_mask;
- get_rt_ruleptr(route_rule, i)->v6_addr[0] = get_rt_ruleptr(route_rule, (i + 2))->v6_addr[0];
- get_rt_ruleptr(route_rule, i)->v6_addr[1] = get_rt_ruleptr(route_rule, (i + 2))->v6_addr[1];
- get_rt_ruleptr(route_rule, i)->v6_addr[2] = get_rt_ruleptr(route_rule, (i + 2))->v6_addr[2];
- get_rt_ruleptr(route_rule, i)->v6_addr[3] = get_rt_ruleptr(route_rule, (i + 2))->v6_addr[3];
- get_rt_ruleptr(route_rule, i)->ip = get_rt_ruleptr(route_rule, (i + 2))->ip;
-
- }
-
- num_uni_rt -= 2;
-
- /* remove this ipv6-address from LAN client*/
- for(v6_num = 0;v6_num < ipv6_set;v6_num++)
- {
- if( data->ipv6_addr[0] == v6_addr[v6_num][0] &&
- data->ipv6_addr[1] == v6_addr[v6_num][1] &&
- data->ipv6_addr[2]== v6_addr[v6_num][2] &&
- data->ipv6_addr[3] == v6_addr[v6_num][3])
- {
- IPACMDBG("Delete this ipv6 addr for LAN iface \n");
- /* remove that delted route rule entry*/
- for (; v6_num <= ipv6_set; v6_num++)
- {
- v6_addr[v6_num][0] = v6_addr[v6_num+1][0];
- v6_addr[v6_num][1] = v6_addr[v6_num+1][1];
- v6_addr[v6_num][2] = v6_addr[v6_num+1][2];
- v6_addr[v6_num][3] = v6_addr[v6_num+1][3];
- }
- ipv6_set-=1;
- IPACMDBG("left %d ipv6-addr for LAN iface \n",ipv6_set);
- break;
- }
- }
-
- /* Del v6 RM dependency */
- if(num_uni_rt == 0)
- {
- /* Delete corresponding ipa_rm_resource_name of TX-endpoint after delete all IPV4V6 RT-rule */
- IPACM_Iface::ipacmcfg->DelRmDepend(IPACM_Iface::ipacmcfg->ipa_client_rm_map_tbl[tx_prop->tx[0].dst_pipe]);
- }
- return IPACM_SUCCESS;
- }
- }
- }
- return IPACM_FAILURE;
-}
-
/* delete filter rule for wan_down event for IPv4*/
int IPACM_Lan::handle_wan_down(bool is_sta_mode)
{
@@ -1369,16 +794,51 @@
/* handle ETH client initial, construct full headers (tx property) */
int IPACM_Lan::handle_eth_hdr_init(uint8_t *mac_addr)
{
+
+#define ETH_IFACE_INDEX_LEN 2
+
int res = IPACM_SUCCESS, len = 0;
+ char index[ETH_IFACE_INDEX_LEN];
struct ipa_ioc_copy_hdr sCopyHeader;
struct ipa_ioc_add_hdr *pHeaderDescriptor = NULL;
uint32_t cnt;
+ int clnt_indx;
+
+ clnt_indx = get_eth_client_index(mac_addr);
+
+ if (clnt_indx != IPACM_INVALID_INDEX)
+ {
+ IPACMERR("eth client is found/attached already with index %d \n", clnt_indx);
+ return IPACM_FAILURE;
+ }
+ /* add header to IPA */
+ if (num_eth_client >= IPA_MAX_NUM_ETH_CLIENTS)
+ {
+ IPACMERR("Reached maximum number(%d) of eth clients\n", IPA_MAX_NUM_ETH_CLIENTS);
+ return IPACM_FAILURE;
+ }
+
+ IPACMDBG("ETH client number: %d\n", num_eth_client);
+
+ memcpy(get_client_memptr(eth_client, num_eth_client)->mac,
+ mac_addr,
+ sizeof(get_client_memptr(eth_client, num_eth_client)->mac));
+
+
IPACMDBG("Received Client MAC %02x:%02x:%02x:%02x:%02x:%02x\n",
mac_addr[0], mac_addr[1], mac_addr[2],
mac_addr[3], mac_addr[4], mac_addr[5]);
- /* add header to IPA */
+ IPACMDBG("stored MAC %02x:%02x:%02x:%02x:%02x:%02x\n",
+ get_client_memptr(eth_client, num_eth_client)->mac[0],
+ get_client_memptr(eth_client, num_eth_client)->mac[1],
+ get_client_memptr(eth_client, num_eth_client)->mac[2],
+ get_client_memptr(eth_client, num_eth_client)->mac[3],
+ get_client_memptr(eth_client, num_eth_client)->mac[4],
+ get_client_memptr(eth_client, num_eth_client)->mac[5]);
+
+ /* add header to IPA */
if(tx_prop != NULL)
{
len = sizeof(struct ipa_ioc_add_hdr) + (1 * sizeof(struct ipa_hdr_add));
@@ -1437,10 +897,16 @@
memset(pHeaderDescriptor->hdr[0].name, 0,
sizeof(pHeaderDescriptor->hdr[0].name));
+ sprintf(index, "%d", ipa_if_num);
+ strncpy(pHeaderDescriptor->hdr[0].name, index, sizeof(index));
+
strncat(pHeaderDescriptor->hdr[0].name,
IPA_ETH_HDR_NAME_v4,
sizeof(IPA_ETH_HDR_NAME_v4));
+ sprintf(index, "%d", header_name_count);
+ strncat(pHeaderDescriptor->hdr[0].name, index, sizeof(index));
+
pHeaderDescriptor->hdr[0].hdr_len = sCopyHeader.hdr_len;
pHeaderDescriptor->hdr[0].hdr_hdl = -1;
pHeaderDescriptor->hdr[0].is_partial = 0;
@@ -1454,11 +920,13 @@
goto fail;
}
- ETH_hdr_hdl_v4 = pHeaderDescriptor->hdr[0].hdr_hdl;
- ipv4_header_set = true ;
- IPACMDBG(" ETH v4 full header name:%s header handle:(0x%x)\n",
- pHeaderDescriptor->hdr[0].name,
- ETH_hdr_hdl_v4);
+ get_client_memptr(eth_client, num_eth_client)->hdr_hdl_v4 = pHeaderDescriptor->hdr[0].hdr_hdl;
+ IPACMDBG("eth-client(%d) v4 full header name:%s header handle:(0x%x)\n",
+ num_eth_client,
+ pHeaderDescriptor->hdr[0].name,
+ get_client_memptr(eth_client, num_eth_client)->hdr_hdl_v4);
+ get_client_memptr(eth_client, num_eth_client)->ipv4_header_set=true;
+
break;
}
}
@@ -1512,10 +980,16 @@
memset(pHeaderDescriptor->hdr[0].name, 0,
sizeof(pHeaderDescriptor->hdr[0].name));
+ sprintf(index, "%d", ipa_if_num);
+ strncpy(pHeaderDescriptor->hdr[0].name, index, sizeof(index));
+
strncat(pHeaderDescriptor->hdr[0].name,
IPA_ETH_HDR_NAME_v6,
sizeof(IPA_ETH_HDR_NAME_v6));
+ sprintf(index, "%d", header_name_count);
+ strncat(pHeaderDescriptor->hdr[0].name, index, sizeof(index));
+
pHeaderDescriptor->hdr[0].hdr_len = sCopyHeader.hdr_len;
pHeaderDescriptor->hdr[0].hdr_hdl = -1;
pHeaderDescriptor->hdr[0].is_partial = 0;
@@ -1529,60 +1003,457 @@
goto fail;
}
- ETH_hdr_hdl_v6 = pHeaderDescriptor->hdr[0].hdr_hdl;
- ipv6_header_set = true ;
- IPACMDBG(" ETH v4 full header name:%s header handle:(0x%x)\n",
- pHeaderDescriptor->hdr[0].name,
- ETH_hdr_hdl_v6);
+ get_client_memptr(eth_client, num_eth_client)->hdr_hdl_v6 = pHeaderDescriptor->hdr[0].hdr_hdl;
+ IPACMDBG("eth-client(%d) v6 full header name:%s header handle:(0x%x)\n",
+ num_eth_client,
+ pHeaderDescriptor->hdr[0].name,
+ get_client_memptr(eth_client, num_eth_client)->hdr_hdl_v6);
+
+ get_client_memptr(eth_client, num_eth_client)->ipv6_header_set=true;
+
break;
}
}
}
+ /* initialize wifi client*/
+ get_client_memptr(eth_client, num_eth_client)->route_rule_set_v4 = false;
+ get_client_memptr(eth_client, num_eth_client)->route_rule_set_v6 = 0;
+ get_client_memptr(eth_client, num_eth_client)->ipv4_set = false;
+ get_client_memptr(eth_client, num_eth_client)->ipv6_set = 0;
+ num_eth_client++;
+ header_name_count++; //keep increasing header_name_count
+ res = IPACM_SUCCESS;
+ IPACMDBG("eth client number: %d\n", num_eth_client);
+
fail:
free(pHeaderDescriptor);
return res;
}
-/*handle wlan iface down event*/
+/*handle eth client */
+int IPACM_Lan::handle_eth_client_ipaddr(ipacm_event_data_all *data)
+{
+ int clnt_indx;
+ int v6_num;
+
+ IPACMDBG("number of eth clients: %d\n", num_eth_client);
+ IPACMDBG(" event MAC %02x:%02x:%02x:%02x:%02x:%02x\n",
+ data->mac_addr[0],
+ data->mac_addr[1],
+ data->mac_addr[2],
+ data->mac_addr[3],
+ data->mac_addr[4],
+ data->mac_addr[5]);
+
+ clnt_indx = get_eth_client_index(data->mac_addr);
+
+ if (clnt_indx == IPACM_INVALID_INDEX)
+ {
+ IPACMERR("eth client not found/attached \n");
+ return IPACM_FAILURE;
+ }
+
+ IPACMDBG("Ip-type received %d\n", data->iptype);
+ if (data->iptype == IPA_IP_v4)
+ {
+ IPACMDBG("ipv4 address: 0x%x\n", data->ipv4_addr);
+ if (data->ipv4_addr != 0) /* not 0.0.0.0 */
+ {
+ if (get_client_memptr(eth_client, clnt_indx)->ipv4_set == false)
+ {
+ get_client_memptr(eth_client, clnt_indx)->v4_addr = data->ipv4_addr;
+ get_client_memptr(eth_client, clnt_indx)->ipv4_set = true;
+ }
+ else
+ {
+ /* check if client got new IPv4 address*/
+ if(data->ipv4_addr == get_client_memptr(eth_client, clnt_indx)->v4_addr)
+ {
+ IPACMDBG("Already setup ipv4 addr for client:%d, ipv4 address didn't change\n", clnt_indx);
+ return IPACM_FAILURE;
+ }
+ else
+ {
+ IPACMDBG("ipv4 addr for client:%d is changed \n", clnt_indx);
+ delete_eth_rtrules(clnt_indx,IPA_IP_v4);
+ get_client_memptr(eth_client, clnt_indx)->route_rule_set_v4 = false;
+ get_client_memptr(eth_client, clnt_indx)->v4_addr = data->ipv4_addr;
+ }
+ }
+ }
+ else
+ {
+ IPACMDBG("Invalid client IPv4 address \n");
+ return IPACM_FAILURE;
+ }
+ }
+ else
+ {
+ if ((data->ipv6_addr[0] != 0) || (data->ipv6_addr[1] != 0) ||
+ (data->ipv6_addr[2] != 0) || (data->ipv6_addr[3] || 0)) /* check if all 0 not valid ipv6 address */
+ {
+ IPACMDBG("ipv6 address: 0x%x:%x:%x:%x\n", data->ipv6_addr[0], data->ipv6_addr[1], data->ipv6_addr[2], data->ipv6_addr[3]);
+ if(get_client_memptr(eth_client, clnt_indx)->ipv6_set < IPV6_NUM_ADDR)
+ {
+
+ for(v6_num=0;v6_num < get_client_memptr(eth_client, clnt_indx)->ipv6_set;v6_num++)
+ {
+ if( data->ipv6_addr[0] == get_client_memptr(eth_client, clnt_indx)->v6_addr[v6_num][0] &&
+ data->ipv6_addr[1] == get_client_memptr(eth_client, clnt_indx)->v6_addr[v6_num][1] &&
+ data->ipv6_addr[2]== get_client_memptr(eth_client, clnt_indx)->v6_addr[v6_num][2] &&
+ data->ipv6_addr[3] == get_client_memptr(eth_client, clnt_indx)->v6_addr[v6_num][3])
+ {
+ IPACMDBG("Already see this ipv6 addr for client:%d\n", clnt_indx);
+ return IPACM_FAILURE; /* not setup the RT rules*/
+ break;
+ }
+ }
+
+ /* not see this ipv6 before for wifi client*/
+ get_client_memptr(eth_client, clnt_indx)->v6_addr[get_client_memptr(eth_client, clnt_indx)->ipv6_set][0] = data->ipv6_addr[0];
+ get_client_memptr(eth_client, clnt_indx)->v6_addr[get_client_memptr(eth_client, clnt_indx)->ipv6_set][1] = data->ipv6_addr[1];
+ get_client_memptr(eth_client, clnt_indx)->v6_addr[get_client_memptr(eth_client, clnt_indx)->ipv6_set][2] = data->ipv6_addr[2];
+ get_client_memptr(eth_client, clnt_indx)->v6_addr[get_client_memptr(eth_client, clnt_indx)->ipv6_set][3] = data->ipv6_addr[3];
+ get_client_memptr(eth_client, clnt_indx)->ipv6_set++;
+ }
+ else
+ {
+ IPACMDBG("Already got 3 ipv6 addr for client:%d\n", clnt_indx);
+ return IPACM_FAILURE; /* not setup the RT rules*/
+ }
+ }
+ }
+
+ return IPACM_SUCCESS;
+}
+
+/*handle eth client routing rule*/
+int IPACM_Lan::handle_eth_client_route_rule(uint8_t *mac_addr, ipa_ip_type iptype)
+{
+ struct ipa_ioc_add_rt_rule *rt_rule;
+ struct ipa_rt_rule_add *rt_rule_entry;
+ uint32_t tx_index;
+ int eth_index,v6_num;
+ const int NUM = 1;
+
+ if(tx_prop == NULL)
+ {
+ IPACMDBG("No rx properties registered for iface %s\n", dev_name);
+ return IPACM_SUCCESS;
+ }
+
+ IPACMDBG("Received mac_addr MAC %02x:%02x:%02x:%02x:%02x:%02x\n",
+ mac_addr[0], mac_addr[1], mac_addr[2],
+ mac_addr[3], mac_addr[4], mac_addr[5]);
+
+ eth_index = get_eth_client_index(mac_addr);
+ if (eth_index == IPACM_INVALID_INDEX)
+ {
+ IPACMDBG("eth client not found/attached \n");
+ return IPACM_SUCCESS;
+ }
+
+ if (iptype==IPA_IP_v4) {
+ IPACMDBG("eth client index: %d, ip-type: %d, ipv4_set:%d, ipv4_rule_set:%d \n", eth_index, iptype,
+ get_client_memptr(eth_client, eth_index)->ipv4_set,
+ get_client_memptr(eth_client, eth_index)->route_rule_set_v4);
+ } else {
+ IPACMDBG("eth client index: %d, ip-type: %d, ipv6_set:%d, ipv6_rule_num:%d \n", eth_index, iptype,
+ get_client_memptr(eth_client, eth_index)->ipv6_set,
+ get_client_memptr(eth_client, eth_index)->route_rule_set_v6);
+ }
+
+ /* Add default routing rules if not set yet */
+ if ((iptype == IPA_IP_v4
+ && get_client_memptr(eth_client, eth_index)->route_rule_set_v4 == false
+ && get_client_memptr(eth_client, eth_index)->ipv4_set == true)
+ || (iptype == IPA_IP_v6
+ && 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 */
+ 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));
+
+ if (rt_rule == NULL)
+ {
+ PERROR("Error Locate ipa_ioc_add_rt_rule memory...\n");
+ return IPACM_FAILURE;
+ }
+
+ rt_rule->commit = 1;
+ rt_rule->num_rules = (uint8_t)NUM;
+ rt_rule->ip = iptype;
+
+ 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 added\n",
+ tx_index, tx_prop->tx[tx_index].ip,iptype);
+ continue;
+ }
+
+ rt_rule_entry = &rt_rule->rules[0];
+ rt_rule_entry->at_rear = 0;
+
+ if (iptype == IPA_IP_v4)
+ {
+ IPACMDBG("client index(%d):ipv4 address: 0x%x\n", eth_index,
+ get_client_memptr(eth_client, eth_index)->v4_addr);
+
+ IPACMDBG("client(%d): v4 header handle:(0x%x)\n",
+ eth_index,
+ get_client_memptr(eth_client, eth_index)->hdr_hdl_v4);
+ strncpy(rt_rule->rt_tbl_name,
+ IPACM_Iface::ipacmcfg->rt_tbl_lan_v4.name,
+ sizeof(rt_rule->rt_tbl_name));
+
+
+ rt_rule_entry->rule.dst = tx_prop->tx[tx_index].dst_pipe;
+ memcpy(&rt_rule_entry->rule.attrib,
+ &tx_prop->tx[tx_index].attrib,
+ sizeof(rt_rule_entry->rule.attrib));
+ rt_rule_entry->rule.attrib.attrib_mask |= IPA_FLT_DST_ADDR;
+ 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;
+
+ if (false == m_routing.AddRoutingRule(rt_rule))
+ {
+ IPACMERR("Routing rule addition failed!\n");
+ free(rt_rule);
+ return IPACM_FAILURE;
+ }
+
+ /* copy ipv4 RT hdl */
+ get_client_memptr(eth_client, eth_index)->eth_rt_hdl[tx_index].eth_rt_rule_hdl_v4 =
+ rt_rule->rules[0].rt_rule_hdl;
+ IPACMDBG("tx:%d, rt rule hdl=%x ip-type: %d\n", tx_index,
+ get_client_memptr(eth_client, eth_index)->eth_rt_hdl[tx_index].eth_rt_rule_hdl_v4, iptype);
+
+ } else {
+
+ for(v6_num = get_client_memptr(eth_client, eth_index)->route_rule_set_v6;v6_num < get_client_memptr(eth_client, eth_index)->ipv6_set;v6_num++)
+ {
+ IPACMDBG("client(%d): v6 header handle:(0x%x)\n",
+ eth_index,
+ get_client_memptr(eth_client, eth_index)->hdr_hdl_v6);
+
+ /* v6 LAN_RT_TBL */
+ strncpy(rt_rule->rt_tbl_name,
+ IPACM_Iface::ipacmcfg->rt_tbl_v6.name,
+ sizeof(rt_rule->rt_tbl_name));
+
+ /* Support QCMAP LAN traffic feature, send to A5 */
+ rt_rule_entry->rule.dst = iface_query->excp_pipe;
+ memset(&rt_rule_entry->rule.attrib, 0, sizeof(rt_rule_entry->rule.attrib));
+ rt_rule_entry->rule.hdr_hdl = 0;
+ rt_rule_entry->rule.attrib.attrib_mask |= IPA_FLT_DST_ADDR;
+ rt_rule_entry->rule.attrib.u.v6.dst_addr[0] = get_client_memptr(eth_client, eth_index)->v6_addr[v6_num][0];
+ rt_rule_entry->rule.attrib.u.v6.dst_addr[1] = get_client_memptr(eth_client, eth_index)->v6_addr[v6_num][1];
+ rt_rule_entry->rule.attrib.u.v6.dst_addr[2] = get_client_memptr(eth_client, eth_index)->v6_addr[v6_num][2];
+ rt_rule_entry->rule.attrib.u.v6.dst_addr[3] = get_client_memptr(eth_client, eth_index)->v6_addr[v6_num][3];
+ rt_rule_entry->rule.attrib.u.v6.dst_addr_mask[0] = 0xFFFFFFFF;
+ rt_rule_entry->rule.attrib.u.v6.dst_addr_mask[1] = 0xFFFFFFFF;
+ rt_rule_entry->rule.attrib.u.v6.dst_addr_mask[2] = 0xFFFFFFFF;
+ rt_rule_entry->rule.attrib.u.v6.dst_addr_mask[3] = 0xFFFFFFFF;
+
+ if (false == m_routing.AddRoutingRule(rt_rule))
+ {
+ IPACMERR("Routing rule addition failed!\n");
+ free(rt_rule);
+ return IPACM_FAILURE;
+ }
+
+ get_client_memptr(eth_client, eth_index)->eth_rt_hdl[tx_index].eth_rt_rule_hdl_v6[v6_num] = rt_rule->rules[0].rt_rule_hdl;
+ IPACMDBG("tx:%d, rt rule hdl=%x ip-type: %d\n", tx_index,
+ get_client_memptr(eth_client, eth_index)->eth_rt_hdl[tx_index].eth_rt_rule_hdl_v6[v6_num], iptype);
+
+ /*Copy same rule to v6 WAN RT TBL*/
+ strncpy(rt_rule->rt_tbl_name,
+ IPACM_Iface::ipacmcfg->rt_tbl_wan_v6.name,
+ sizeof(rt_rule->rt_tbl_name));
+
+ /* Downlink traffic from Wan iface, directly through IPA */
+ rt_rule_entry->rule.dst = tx_prop->tx[tx_index].dst_pipe;
+ memcpy(&rt_rule_entry->rule.attrib,
+ &tx_prop->tx[tx_index].attrib,
+ sizeof(rt_rule_entry->rule.attrib));
+ rt_rule_entry->rule.hdr_hdl = get_client_memptr(eth_client, eth_index)->hdr_hdl_v6;
+ rt_rule_entry->rule.attrib.attrib_mask |= IPA_FLT_DST_ADDR;
+ rt_rule_entry->rule.attrib.u.v6.dst_addr[0] = get_client_memptr(eth_client, eth_index)->v6_addr[v6_num][0];
+ rt_rule_entry->rule.attrib.u.v6.dst_addr[1] = get_client_memptr(eth_client, eth_index)->v6_addr[v6_num][1];
+ rt_rule_entry->rule.attrib.u.v6.dst_addr[2] = get_client_memptr(eth_client, eth_index)->v6_addr[v6_num][2];
+ rt_rule_entry->rule.attrib.u.v6.dst_addr[3] = get_client_memptr(eth_client, eth_index)->v6_addr[v6_num][3];
+ rt_rule_entry->rule.attrib.u.v6.dst_addr_mask[0] = 0xFFFFFFFF;
+ rt_rule_entry->rule.attrib.u.v6.dst_addr_mask[1] = 0xFFFFFFFF;
+ rt_rule_entry->rule.attrib.u.v6.dst_addr_mask[2] = 0xFFFFFFFF;
+ rt_rule_entry->rule.attrib.u.v6.dst_addr_mask[3] = 0xFFFFFFFF;
+
+ if (false == m_routing.AddRoutingRule(rt_rule))
+ {
+ IPACMERR("Routing rule addition failed!\n");
+ free(rt_rule);
+ return IPACM_FAILURE;
+ }
+
+ get_client_memptr(eth_client, eth_index)->eth_rt_hdl[tx_index].eth_rt_rule_hdl_v6_wan[v6_num] = rt_rule->rules[0].rt_rule_hdl;
+ IPACMDBG("tx:%d, rt rule hdl=%x ip-type: %d\n", tx_index,
+ get_client_memptr(eth_client, eth_index)->eth_rt_hdl[tx_index].eth_rt_rule_hdl_v6_wan[v6_num], iptype);
+ }
+ }
+
+ } /* end of for loop */
+
+ free(rt_rule);
+
+ if (iptype == IPA_IP_v4)
+ {
+ get_client_memptr(eth_client, eth_index)->route_rule_set_v4 = true;
+ }
+ else
+ {
+ get_client_memptr(eth_client, eth_index)->route_rule_set_v6 = get_client_memptr(eth_client, eth_index)->ipv6_set;
+ }
+ }
+
+ return IPACM_SUCCESS;
+}
+
+/*handle eth client del mode*/
+int IPACM_Lan::handle_eth_client_down_evt(uint8_t *mac_addr)
+{
+ int clt_indx;
+ uint32_t tx_index;
+ int num_eth_client_tmp = num_eth_client;
+ int num_v6;
+
+ IPACMDBG("total client: %d\n", num_eth_client_tmp);
+
+ clt_indx = get_eth_client_index(mac_addr);
+ if (clt_indx == IPACM_INVALID_INDEX)
+ {
+ IPACMDBG("eth client not attached\n");
+ return IPACM_SUCCESS;
+ }
+
+ /* First reset nat rules and then route rules */
+ if(get_client_memptr(eth_client, clt_indx)->ipv4_set == true)
+ {
+ IPACMDBG("Deleting Nat Rules\n");
+ Nat_App->UpdatePwrSaveIf(get_client_memptr(eth_client, clt_indx)->v4_addr);
+ }
+
+ if (delete_eth_rtrules(clt_indx, IPA_IP_v4))
+ {
+ IPACMERR("unbale to delete ecm-client v4 route rules\n");
+ return IPACM_FAILURE;
+ }
+
+ if (delete_eth_rtrules(clt_indx, IPA_IP_v6))
+ {
+ IPACMERR("unbale to delete ecm-client v6 route rules\n");
+ return IPACM_FAILURE;
+ }
+
+ /* Delete eth client header */
+ if(get_client_memptr(eth_client, clt_indx)->ipv4_header_set == true)
+ {
+ if (m_header.DeleteHeaderHdl(get_client_memptr(eth_client, clt_indx)->hdr_hdl_v4)
+ == false)
+ {
+ return IPACM_FAILURE;
+ }
+ get_client_memptr(eth_client, clt_indx)->ipv4_header_set = false;
+ }
+
+ if(get_client_memptr(eth_client, clt_indx)->ipv6_header_set == true)
+ {
+ if (m_header.DeleteHeaderHdl(get_client_memptr(eth_client, clt_indx)->hdr_hdl_v6)
+ == false)
+ {
+ return IPACM_FAILURE;
+ }
+ get_client_memptr(eth_client, clt_indx)->ipv6_header_set = false;
+ }
+
+ /* Reset ip_set to 0*/
+ get_client_memptr(eth_client, clt_indx)->ipv4_set = false;
+ get_client_memptr(eth_client, clt_indx)->ipv6_set = 0;
+ get_client_memptr(eth_client, clt_indx)->ipv4_header_set = false;
+ get_client_memptr(eth_client, clt_indx)->ipv6_header_set = false;
+ get_client_memptr(eth_client, clt_indx)->route_rule_set_v4 = false;
+ get_client_memptr(eth_client, clt_indx)->route_rule_set_v6 = 0;
+
+ for (; clt_indx < num_eth_client_tmp - 1; clt_indx++)
+ {
+ memcpy(get_client_memptr(eth_client, clt_indx)->mac,
+ get_client_memptr(eth_client, (clt_indx + 1))->mac,
+ sizeof(get_client_memptr(eth_client, clt_indx)->mac));
+
+ get_client_memptr(eth_client, clt_indx)->hdr_hdl_v4 = get_client_memptr(eth_client, (clt_indx + 1))->hdr_hdl_v4;
+ get_client_memptr(eth_client, clt_indx)->hdr_hdl_v6 = get_client_memptr(eth_client, (clt_indx + 1))->hdr_hdl_v6;
+ get_client_memptr(eth_client, clt_indx)->v4_addr = get_client_memptr(eth_client, (clt_indx + 1))->v4_addr;
+
+ get_client_memptr(eth_client, clt_indx)->ipv4_set = get_client_memptr(eth_client, (clt_indx + 1))->ipv4_set;
+ get_client_memptr(eth_client, clt_indx)->ipv6_set = get_client_memptr(eth_client, (clt_indx + 1))->ipv6_set;
+ get_client_memptr(eth_client, clt_indx)->ipv4_header_set = get_client_memptr(eth_client, (clt_indx + 1))->ipv4_header_set;
+ get_client_memptr(eth_client, clt_indx)->ipv6_header_set = get_client_memptr(eth_client, (clt_indx + 1))->ipv6_header_set;
+
+ get_client_memptr(eth_client, clt_indx)->route_rule_set_v4 = get_client_memptr(eth_client, (clt_indx + 1))->route_rule_set_v4;
+ get_client_memptr(eth_client, clt_indx)->route_rule_set_v6 = get_client_memptr(eth_client, (clt_indx + 1))->route_rule_set_v6;
+
+ for (num_v6=0;num_v6< get_client_memptr(eth_client, clt_indx)->ipv6_set;num_v6++)
+ {
+ get_client_memptr(eth_client, clt_indx)->v6_addr[num_v6][0] = get_client_memptr(eth_client, (clt_indx + 1))->v6_addr[num_v6][0];
+ get_client_memptr(eth_client, clt_indx)->v6_addr[num_v6][1] = get_client_memptr(eth_client, (clt_indx + 1))->v6_addr[num_v6][1];
+ get_client_memptr(eth_client, clt_indx)->v6_addr[num_v6][2] = get_client_memptr(eth_client, (clt_indx + 1))->v6_addr[num_v6][2];
+ get_client_memptr(eth_client, clt_indx)->v6_addr[num_v6][3] = get_client_memptr(eth_client, (clt_indx + 1))->v6_addr[num_v6][3];
+ }
+
+ for (tx_index = 0; tx_index < iface_query->num_tx_props; tx_index++)
+ {
+ get_client_memptr(eth_client, clt_indx)->eth_rt_hdl[tx_index].eth_rt_rule_hdl_v4 =
+ get_client_memptr(eth_client, (clt_indx + 1))->eth_rt_hdl[tx_index].eth_rt_rule_hdl_v4;
+
+ for(num_v6=0;num_v6< get_client_memptr(eth_client, clt_indx)->route_rule_set_v6;num_v6++)
+ {
+ get_client_memptr(eth_client, clt_indx)->eth_rt_hdl[tx_index].eth_rt_rule_hdl_v6[num_v6] =
+ get_client_memptr(eth_client, (clt_indx + 1))->eth_rt_hdl[tx_index].eth_rt_rule_hdl_v6[num_v6];
+ get_client_memptr(eth_client, clt_indx)->eth_rt_hdl[tx_index].eth_rt_rule_hdl_v6_wan[num_v6] =
+ get_client_memptr(eth_client, (clt_indx + 1))->eth_rt_hdl[tx_index].eth_rt_rule_hdl_v6_wan[num_v6];
+ }
+ }
+ }
+
+ IPACMDBG(" %d eth client deleted successfully \n", num_eth_client);
+ num_eth_client = num_eth_client - 1;
+ IPACMDBG(" Number of eth client: %d\n", num_eth_client);
+
+ /* Del RM dependency */
+ if(num_eth_client == 0)
+ {
+ /* Delete corresponding ipa_rm_resource_name of TX-endpoint after delete all IPV4V6 RT-rule*/
+ IPACM_Iface::ipacmcfg->DelRmDepend(IPACM_Iface::ipacmcfg->ipa_client_rm_map_tbl[tx_prop->tx[0].dst_pipe]);
+ }
+
+ return IPACM_SUCCESS;
+}
+
+/*handle LAN iface down event*/
int IPACM_Lan::handle_down_evt()
{
int i;
uint32_t tx_index;
int res = IPACM_SUCCESS;
-
- if (IPACM_Iface::ipacmcfg->iface_table[ipa_if_num].if_cat == ETH_IF)
- {
-
- /* delete full header */
- if (ipv4_header_set)
- {
- if (m_header.DeleteHeaderHdl(ETH_hdr_hdl_v4)
- == false)
- {
- IPACMDBG("ETH ipv4 header delete fail\n");
- res = IPACM_FAILURE;
- goto fail;
- }
- IPACMDBG("ETH ipv4 header delete success\n");
- }
-
- if (ipv6_header_set)
- {
- if (m_header.DeleteHeaderHdl(ETH_hdr_hdl_v6)
- == false)
- {
- IPACMDBG("ETH ipv6 header delete fail\n");
- res = IPACM_FAILURE;
- goto fail;
- }
- IPACMDBG("ETH ipv6 header delete success\n");
- }
- }
-
-
/* no iface address up, directly close iface*/
if (ip_type == IPACM_IP_NULL)
{
@@ -1620,39 +1491,43 @@
}
}
- IPACMDBG("Finished delete default iface ipv6 rules \n ");
-
- /* free unicast routing rule */
- if (tx_prop != NULL)
+ IPACMDBG("Finished delete default iface ipv6 rules \n ");
+ /* clean eth-client header, routing rules */
+ IPACMDBG("left %d eth clients need to be deleted \n ", num_eth_client);
+ for (i = 0; i < num_eth_client; i++)
{
- for (i = 0; i < num_uni_rt; i++)
- {
- for (tx_index = 0; tx_index < iface_query->num_tx_props; tx_index++)
+ delete_eth_rtrules(i, IPA_IP_v4);
+ delete_eth_rtrules(i, IPA_IP_v6);
+
+ IPACMDBG("Delete %d client header\n", num_eth_client);
+
+
+ if(get_client_memptr(eth_client, i)->ipv4_header_set == true)
{
- if(get_rt_ruleptr(route_rule, i)->ip != tx_prop->tx[tx_index].ip)
- {
- IPACMDBG("Tx:%d, ip-type: %d conflict ip-type: %d no unicast LAN RT-rule deleted, index: %d\n",
- tx_index, tx_prop->tx[tx_index].ip,get_rt_ruleptr(route_rule, i)->ip,i);
- continue;
- }
-
- IPACMDBG("Tx:%d, ip-type: %d - ip-type: %d Delete unicast LAN RT-rule deleted index: %d\n",
- tx_index, tx_prop->tx[tx_index].ip,get_rt_ruleptr(route_rule, i)->ip,i);
-
- if (m_routing.DeleteRoutingHdl(get_rt_ruleptr(route_rule, i)->rt_rule_hdl[tx_index],
- get_rt_ruleptr(route_rule, i)->ip) == false)
+ if (m_header.DeleteHeaderHdl(get_client_memptr(eth_client, i)->hdr_hdl_v4)
+ == false)
{
- IPACMERR("Routing rule 0x%x deletion failed!\n",get_rt_ruleptr(route_rule, i)->rt_rule_hdl[tx_index]);
res = IPACM_FAILURE;
goto fail;
}
}
+
+ if(get_client_memptr(eth_client, i)->ipv6_header_set == true)
+ {
+ if (m_header.DeleteHeaderHdl(get_client_memptr(eth_client, i)->hdr_hdl_v6)
+ == false)
+ {
+ res = IPACM_FAILURE;
+ goto fail;
+ }
+ }
+ } /* end of for loop */
+
+ /* free the edm clients cache */
+ IPACMDBG("Free ecm clients cache\n");
- }
- }
-
- /* Delete corresponding ipa_rm_resource_name of TX-endpoint after delete all IPV4V6 RT-rule */
- 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 */
+ IPACM_Iface::ipacmcfg->DelRmDepend(IPACM_Iface::ipacmcfg->ipa_client_rm_map_tbl[tx_prop->tx[0].dst_pipe]);
/* check software routing fl rule hdl */
if (softwarerouting_act == true && rx_prop != NULL)
@@ -1713,16 +1588,13 @@
IPACMDBG("LAN IF goes down, backhaul type %d\n", IPACM_Wan::backhaul_is_sta_mode);
handle_wan_down_v6(IPACM_Wan::backhaul_is_sta_mode);
}
-
+
fail:
/* Delete corresponding ipa_rm_resource_name of RX-endpoint after delete all IPV4V6 FT-rule */
IPACM_Iface::ipacmcfg->DelRmDepend(IPACM_Iface::ipacmcfg->ipa_client_rm_map_tbl[rx_prop->rx[0].src_pipe]);
IPACMDBG("Finished delete dependency \n ");
- if (route_rule != NULL)
- {
- free(route_rule);
- }
+ free(eth_client);
if (tx_prop != NULL)
{