From 06852dbddd5a722d965e6a211916027cb97de6bf Mon Sep 17 00:00:00 2001 From: Bruno Martins Date: Sun, 4 Dec 2016 16:15:12 +0000 Subject: z2_plus: Update IPACM from upstream * Tag: LA.UM.5.5.r1-01300-8x96.0 Change-Id: I3891d0c62c622fd0a0f43f25f63deb4d4ba508d6 --- data-ipa-cfg-mgr/ipacm/src/IPACM_Lan.cpp | 198 +++++++++++++++++-------------- 1 file changed, 107 insertions(+), 91 deletions(-) (limited to 'data-ipa-cfg-mgr/ipacm/src/IPACM_Lan.cpp') 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) -- cgit v1.2.3