aboutsummaryrefslogtreecommitdiff
path: root/data-ipa-cfg-mgr/ipacm/src/IPACM_Lan.cpp
diff options
context:
space:
mode:
authorBruno Martins <bgcngm@gmail.com>2016-12-04 16:15:12 +0000
committerdavidevinavil <davidevinavil@gmail.com>2017-01-21 18:22:42 +0100
commit06852dbddd5a722d965e6a211916027cb97de6bf (patch)
tree8453619818a941d032d1ae1f0106ab6ea27fce34 /data-ipa-cfg-mgr/ipacm/src/IPACM_Lan.cpp
parent818d87b312de5d56937381b551abe084bba72c9f (diff)
z2_plus: Update IPACM from upstream
* Tag: LA.UM.5.5.r1-01300-8x96.0 Change-Id: I3891d0c62c622fd0a0f43f25f63deb4d4ba508d6
Diffstat (limited to 'data-ipa-cfg-mgr/ipacm/src/IPACM_Lan.cpp')
-rw-r--r--data-ipa-cfg-mgr/ipacm/src/IPACM_Lan.cpp198
1 files changed, 107 insertions, 91 deletions
diff --git a/data-ipa-cfg-mgr/ipacm/src/IPACM_Lan.cpp b/data-ipa-cfg-mgr/ipacm/src/IPACM_Lan.cpp
index 6085aca..a119746 100644
--- a/data-ipa-cfg-mgr/ipacm/src/IPACM_Lan.cpp
+++ b/data-ipa-cfg-mgr/ipacm/src/IPACM_Lan.cpp
@@ -120,6 +120,7 @@ IPACM_Lan::IPACM_Lan(int iface_index) : IPACM_Iface(iface_index)
memset(ipv6_icmp_flt_rule_hdl, 0, NUM_IPV6_ICMP_FLT_RULE * sizeof(uint32_t));
modem_ul_v4_set = false;
modem_ul_v6_set = false;
+ memset(ipv6_prefix, 0, sizeof(ipv6_prefix));
/* ODU routing table initilization */
if(ipa_if_cate == ODU_IF)
@@ -379,6 +380,7 @@ void IPACM_Lan::event_callback(ipa_cm_event_id event, void *param)
{
if((data->iptype == IPA_IP_v6 || data->iptype == IPA_IP_MAX) && num_dft_rt_v6 == 1)
{
+ memcpy(ipv6_prefix, IPACM_Wan::backhaul_ipv6_prefix, sizeof(ipv6_prefix));
install_ipv6_prefix_flt_rule(IPACM_Wan::backhaul_ipv6_prefix);
if(IPACM_Wan::backhaul_is_sta_mode == false)
{
@@ -481,6 +483,7 @@ void IPACM_Lan::event_callback(ipa_cm_event_id event, void *param)
{
if(ip_type == IPA_IP_v6 || ip_type == IPA_IP_MAX)
{
+ memcpy(ipv6_prefix, data_wan_tether->ipv6_prefix, sizeof(ipv6_prefix));
install_ipv6_prefix_flt_rule(data_wan_tether->ipv6_prefix);
if(data_wan_tether->is_sta == false)
{
@@ -576,16 +579,17 @@ void IPACM_Lan::event_callback(ipa_cm_event_id event, void *param)
IPACMDBG_H("Backhaul is sta mode?%d\n", data_wan->is_sta);
if(ip_type == IPA_IP_v6 || ip_type == IPA_IP_MAX)
{
+ memcpy(ipv6_prefix, data_wan->ipv6_prefix, sizeof(ipv6_prefix));
install_ipv6_prefix_flt_rule(data_wan->ipv6_prefix);
- if(data_wan->is_sta == false)
- {
+ if(data_wan->is_sta == false)
+ {
ext_prop = IPACM_Iface::ipacmcfg->GetExtProp(IPA_IP_v6);
handle_wan_up_ex(ext_prop, IPA_IP_v6, 0);
}
- else
- {
- handle_wan_up(IPA_IP_v6);
- }
+ else
+ {
+ handle_wan_up(IPA_IP_v6);
+ }
}
break;
@@ -779,7 +783,7 @@ int IPACM_Lan::handle_del_ipv6_addr(ipacm_event_data_all *data)
{
uint32_t tx_index;
uint32_t rt_hdl;
- int num_v6, clnt_indx;
+ int num_v6 =0, clnt_indx;
clnt_indx = get_eth_client_index(data->mac_addr);
if (clnt_indx == IPACM_INVALID_INDEX)
@@ -948,6 +952,9 @@ int IPACM_Lan::handle_addr_evt(ipacm_event_data_addr *data)
}
#endif /* defined(FEATURE_IPA_ANDROID)*/
+ /* Update the IP Type. */
+ config_ip_type(data->iptype);
+
if (data->iptype == IPA_IP_v4)
{
rt_rule = (struct ipa_ioc_add_rt_rule *)
@@ -967,7 +974,7 @@ int IPACM_Lan::handle_addr_evt(ipacm_event_data_addr *data)
rt_rule_entry->at_rear = false;
rt_rule_entry->rule.dst = IPA_CLIENT_APPS_LAN_CONS; //go to A5
rt_rule_entry->rule.attrib.attrib_mask = IPA_FLT_DST_ADDR;
- strcpy(rt_rule->rt_tbl_name, IPACM_Iface::ipacmcfg->rt_tbl_lan_v4.name);
+ strlcpy(rt_rule->rt_tbl_name, IPACM_Iface::ipacmcfg->rt_tbl_lan_v4.name, sizeof(rt_rule->rt_tbl_name));
rt_rule_entry->rule.attrib.u.v4.dst_addr = data->ipv4_addr;
rt_rule_entry->rule.attrib.u.v4.dst_addr_mask = 0xFFFFFFFF;
#ifdef FEATURE_IPA_V3
@@ -1024,7 +1031,7 @@ int IPACM_Lan::handle_addr_evt(ipacm_event_data_addr *data)
rt_rule->commit = 1;
rt_rule->num_rules = NUM_RULES;
rt_rule->ip = data->iptype;
- strcpy(rt_rule->rt_tbl_name, IPACM_Iface::ipacmcfg->rt_tbl_v6.name);
+ strlcpy(rt_rule->rt_tbl_name, IPACM_Iface::ipacmcfg->rt_tbl_v6.name, sizeof(rt_rule->rt_tbl_name));
rt_rule_entry = &rt_rule->rules[0];
rt_rule_entry->at_rear = false;
@@ -1060,7 +1067,7 @@ int IPACM_Lan::handle_addr_evt(ipacm_event_data_addr *data)
dft_rt_rule_hdl[MAX_DEFAULT_v4_ROUTE_RULES + 2*num_dft_rt_v6] = rt_rule_entry->rt_rule_hdl;
/* setup same rule for v6_wan table*/
- strcpy(rt_rule->rt_tbl_name, IPACM_Iface::ipacmcfg->rt_tbl_wan_v6.name);
+ strlcpy(rt_rule->rt_tbl_name, IPACM_Iface::ipacmcfg->rt_tbl_wan_v6.name, sizeof(rt_rule->rt_tbl_name));
if (false == m_routing.AddRoutingRule(rt_rule))
{
IPACMERR("Routing rule addition failed!\n");
@@ -1135,13 +1142,6 @@ int IPACM_Lan::handle_private_subnet(ipa_ip_type iptype)
m_pFilteringTable->ip = IPA_IP_v4;
m_pFilteringTable->num_rules = (uint8_t)IPACM_Iface::ipacmcfg->ipa_num_private_subnet;
- if (false == m_routing.GetRoutingTable(&IPACM_Iface::ipacmcfg->rt_tbl_lan_v4))
- {
- IPACMERR("LAN m_routing.GetRoutingTable(&IPACM_Iface::ipacmcfg->rt_tbl_lan_v4=0x%p) Failed.\n", &IPACM_Iface::ipacmcfg->rt_tbl_lan_v4);
- free(m_pFilteringTable);
- return IPACM_FAILURE;
- }
-
/* Make LAN-traffic always go A5, use default IPA-RT table */
if (false == m_routing.GetRoutingTable(&IPACM_Iface::ipacmcfg->rt_tbl_default_v4))
{
@@ -1685,6 +1685,8 @@ int IPACM_Lan::handle_eth_client_ipaddr(ipacm_event_data_all *data)
{
int clnt_indx;
int v6_num;
+ uint32_t ipv6_link_local_prefix = 0xFE800000;
+ uint32_t ipv6_link_local_prefix_mask = 0xFFC00000;
IPACMDBG_H("number of eth clients: %d\n", num_eth_client);
IPACMDBG_H("event MAC %02x:%02x:%02x:%02x:%02x:%02x\n",
@@ -1731,10 +1733,10 @@ int IPACM_Lan::handle_eth_client_ipaddr(ipacm_event_data_all *data)
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
- {
+ else
+ {
IPACMDBG_H("Invalid client IPv4 address \n");
return IPACM_FAILURE;
}
@@ -1744,21 +1746,28 @@ int IPACM_Lan::handle_eth_client_ipaddr(ipacm_event_data_all *data)
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_H("ipv6 address: 0x%x:%x:%x:%x\n", data->ipv6_addr[0], data->ipv6_addr[1], data->ipv6_addr[2], data->ipv6_addr[3]);
- if(get_client_memptr(eth_client, clnt_indx)->ipv6_set < IPV6_NUM_ADDR)
- {
+ IPACMDBG_H("ipv6 address: 0x%x:%x:%x:%x\n", data->ipv6_addr[0], data->ipv6_addr[1], data->ipv6_addr[2], data->ipv6_addr[3]);
+ if( (data->ipv6_addr[0] & ipv6_link_local_prefix_mask) != (ipv6_link_local_prefix & ipv6_link_local_prefix_mask) &&
+ memcmp(ipv6_prefix, data->ipv6_addr, sizeof(ipv6_prefix)) != 0)
+ {
+ IPACMDBG_H("This IPv6 address is not global IPv6 address with correct prefix, ignore.\n");
+ return IPACM_FAILURE;
+ }
+
+ 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] &&
+ {
+ 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_H("Already see this ipv6 addr at position: %d for client:%d\n", v6_num, clnt_indx);
- return IPACM_FAILURE; /* not setup the RT rules*/
- }
- }
+ {
+ IPACMDBG_H("Already see this ipv6 addr at position: %d for client:%d\n", v6_num, clnt_indx);
+ return IPACM_FAILURE; /* not setup the RT rules*/
+ }
+ }
/* 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];
@@ -1769,8 +1778,8 @@ int IPACM_Lan::handle_eth_client_ipaddr(ipacm_event_data_all *data)
}
else
{
- IPACMDBG_H("Already got 3 ipv6 addr for client:%d\n", clnt_indx);
- return IPACM_FAILURE; /* not setup the RT rules*/
+ IPACMDBG_H("Already got %d ipv6 addr for client:%d\n", IPV6_NUM_ADDR, clnt_indx);
+ return IPACM_FAILURE; /* not setup the RT rules*/
}
}
}
@@ -2055,7 +2064,7 @@ int IPACM_Lan::handle_odu_hdr_init(uint8_t *mac_addr)
memset(pHeaderDescriptor->hdr[0].name, 0,
sizeof(pHeaderDescriptor->hdr[0].name));
- strcpy(pHeaderDescriptor->hdr[0].name, IPA_ODU_HDR_NAME_v4);
+ strlcpy(pHeaderDescriptor->hdr[0].name, IPA_ODU_HDR_NAME_v4, sizeof(pHeaderDescriptor->hdr[0].name));
pHeaderDescriptor->hdr[0].hdr_len = sCopyHeader.hdr_len;
pHeaderDescriptor->hdr[0].hdr_hdl = -1;
pHeaderDescriptor->hdr[0].is_partial = 0;
@@ -2135,7 +2144,7 @@ int IPACM_Lan::handle_odu_hdr_init(uint8_t *mac_addr)
memset(pHeaderDescriptor->hdr[0].name, 0,
sizeof(pHeaderDescriptor->hdr[0].name));
- strcpy(pHeaderDescriptor->hdr[0].name, IPA_ODU_HDR_NAME_v6);
+ strlcpy(pHeaderDescriptor->hdr[0].name, IPA_ODU_HDR_NAME_v6, sizeof(pHeaderDescriptor->hdr[0].name));
pHeaderDescriptor->hdr[0].hdr_len = sCopyHeader.hdr_len;
pHeaderDescriptor->hdr[0].hdr_hdl = -1;
pHeaderDescriptor->hdr[0].is_partial = 0;
@@ -2202,13 +2211,13 @@ int IPACM_Lan::handle_odu_route_add()
if (IPA_IP_v4 == tx_prop->tx[tx_index].ip)
{
- strcpy(rt_rule->rt_tbl_name, IPACM_Iface::ipacmcfg->rt_tbl_odu_v4.name);
+ strlcpy(rt_rule->rt_tbl_name, IPACM_Iface::ipacmcfg->rt_tbl_odu_v4.name, sizeof(rt_rule->rt_tbl_name));
rt_rule_entry->rule.hdr_hdl = ODU_hdr_hdl_v4;
rt_rule->ip = IPA_IP_v4;
}
else
{
- strcpy(rt_rule->rt_tbl_name, IPACM_Iface::ipacmcfg->rt_tbl_odu_v6.name);
+ strlcpy(rt_rule->rt_tbl_name, IPACM_Iface::ipacmcfg->rt_tbl_odu_v6.name, sizeof(rt_rule->rt_tbl_name));
rt_rule_entry->rule.hdr_hdl = ODU_hdr_hdl_v6;
rt_rule->ip = IPA_IP_v6;
}
@@ -2593,54 +2602,6 @@ int IPACM_Lan::handle_down_evt()
}
IPACMDBG_H("Finished delete default iface ipv6 rules \n ");
- /* clean eth-client header, routing rules */
- IPACMDBG_H("left %d eth clients need to be deleted \n ", num_eth_client);
- for (i = 0; i < num_eth_client; i++)
- {
- /* First reset nat rules and then route rules */
- if(get_client_memptr(eth_client, i)->ipv4_set == true)
- {
- IPACMDBG_H("Clean Nat Rules for ipv4:0x%x\n", get_client_memptr(eth_client, i)->v4_addr);
- CtList->HandleNeighIpAddrDelEvt(get_client_memptr(eth_client, i)->v4_addr);
- }
-
- if (delete_eth_rtrules(i, IPA_IP_v4))
- {
- IPACMERR("unbale to delete ecm-client v4 route rules for index %d\n", i);
- res = IPACM_FAILURE;
- goto fail;
- }
-
- if (delete_eth_rtrules(i, IPA_IP_v6))
- {
- IPACMERR("unbale to delete ecm-client v6 route rules for index %d\n", i);
- res = IPACM_FAILURE;
- goto fail;
- }
-
- IPACMDBG_H("Delete %d client header\n", num_eth_client);
-
-
- if(get_client_memptr(eth_client, i)->ipv4_header_set == true)
- {
- if (m_header.DeleteHeaderHdl(get_client_memptr(eth_client, i)->hdr_hdl_v4)
- == false)
- {
- 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_H("Free ecm clients cache\n");
@@ -2652,11 +2613,6 @@ int IPACM_Lan::handle_down_evt()
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]);
}
- /* check software routing fl rule hdl */
- if (softwarerouting_act == true && rx_prop != NULL)
- {
- handle_software_routing_disable();
- }
eth_bridge_post_event(IPA_ETH_BRIDGE_IFACE_DOWN, IPA_IP_MAX, NULL);
@@ -2679,6 +2635,56 @@ int IPACM_Lan::handle_down_evt()
}
#endif /* defined(FEATURE_IPA_ANDROID)*/
fail:
+ /* clean eth-client header, routing rules */
+ IPACMDBG_H("left %d eth clients need to be deleted \n ", num_eth_client);
+ for (i = 0; i < num_eth_client; i++)
+ {
+ /* First reset nat rules and then route rules */
+ if(get_client_memptr(eth_client, i)->ipv4_set == true)
+ {
+ IPACMDBG_H("Clean Nat Rules for ipv4:0x%x\n", get_client_memptr(eth_client, i)->v4_addr);
+ CtList->HandleNeighIpAddrDelEvt(get_client_memptr(eth_client, i)->v4_addr);
+ }
+
+ if (delete_eth_rtrules(i, IPA_IP_v4))
+ {
+ IPACMERR("unbale to delete ecm-client v4 route rules for index %d\n", i);
+ res = IPACM_FAILURE;
+ }
+
+ if (delete_eth_rtrules(i, IPA_IP_v6))
+ {
+ IPACMERR("unbale to delete ecm-client v6 route rules for index %d\n", i);
+ res = IPACM_FAILURE;
+ }
+
+ IPACMDBG_H("Delete %d client header\n", num_eth_client);
+
+ if(get_client_memptr(eth_client, i)->ipv4_header_set == true)
+ {
+ if (m_header.DeleteHeaderHdl(get_client_memptr(eth_client, i)->hdr_hdl_v4)
+ == false)
+ {
+ res = IPACM_FAILURE;
+ }
+ }
+
+ 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;
+ }
+ }
+ } /* end of for loop */
+
+ /* check software routing fl rule hdl */
+ if (softwarerouting_act == true && rx_prop != NULL)
+ {
+ handle_software_routing_disable();
+ }
+
if (odu_route_rule_v4_hdl != NULL)
{
free(odu_route_rule_v4_hdl);
@@ -2931,6 +2937,8 @@ int IPACM_Lan::handle_wan_down_v6(bool is_sta_mode)
delete_ipv6_prefix_flt_rule();
+ memset(ipv6_prefix, 0, sizeof(ipv6_prefix));
+
if(is_sta_mode == false)
{
if (num_wan_ul_fl_rule_v6 > MAX_WAN_UL_FILTER_RULES)
@@ -3476,7 +3484,7 @@ int IPACM_Lan::install_ipv6_prefix_flt_rule(uint32_t* prefix)
flt_rule_entry.status = -1;
flt_rule_entry.rule.action = IPA_PASS_TO_EXCEPTION;
#ifdef FEATURE_IPA_V3
- flt_rule_entry.rule.hashable = false;
+ flt_rule_entry.rule.hashable = true;
#endif
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_DST_ADDR;
@@ -3889,6 +3897,12 @@ int IPACM_Lan::eth_bridge_add_hdr_proc_ctx(ipa_hdr_l2_type peer_l2_hdr_type, uin
uint32_t hdr_template;
ipa_ioc_add_hdr_proc_ctx* pHeaderProcTable = NULL;
+ if(tx_prop == NULL)
+ {
+ IPACMERR("No tx prop.\n");
+ return IPACM_FAILURE;
+ }
+
len = sizeof(struct ipa_ioc_add_hdr_proc_ctx) + sizeof(struct ipa_hdr_proc_ctx_add);
pHeaderProcTable = (ipa_ioc_add_hdr_proc_ctx*)malloc(len);
if(pHeaderProcTable == NULL)
@@ -4051,7 +4065,8 @@ int IPACM_Lan::eth_bridge_modify_rt_rule(uint8_t *mac, uint32_t hdr_proc_ctx_hdl
{
if (tx_prop->tx[index].ip == iptype)
{
- if (rt_rule->num_rules >= rt_rule_count)
+ if (rt_rule->num_rules >= rt_rule_count ||
+ rt_rule->num_rules >= MAX_NUM_PROP)
{
IPACMERR("Number of routing rules exceeds limit.\n");
res = IPACM_FAILURE;
@@ -4152,6 +4167,7 @@ int IPACM_Lan::eth_bridge_add_flt_rule(uint8_t *mac, uint32_t rt_tbl_hdl, ipa_ip
flt_rule_entry.rule.action = IPA_PASS_TO_ROUTING;
flt_rule_entry.rule.eq_attrib_type = 0;
flt_rule_entry.rule.rt_tbl_hdl = rt_tbl_hdl;
+ flt_rule_entry.rule.hashable = true;
memcpy(&flt_rule_entry.rule.attrib, &rx_prop->rx[0].attrib, sizeof(flt_rule_entry.rule.attrib));
if(tx_prop->tx[0].hdr_l2_type == IPA_HDR_L2_ETHERNET_II)