summaryrefslogtreecommitdiff
path: root/ipacm/src/IPACM_Wan.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'ipacm/src/IPACM_Wan.cpp')
-rw-r--r--ipacm/src/IPACM_Wan.cpp806
1 files changed, 520 insertions, 286 deletions
diff --git a/ipacm/src/IPACM_Wan.cpp b/ipacm/src/IPACM_Wan.cpp
index 847e08d..f17eb03 100644
--- a/ipacm/src/IPACM_Wan.cpp
+++ b/ipacm/src/IPACM_Wan.cpp
@@ -1,5 +1,5 @@
/*
-Copyright (c) 2013-2019 The Linux Foundation. All rights reserved.
+Copyright (c) 2013-2020 The Linux Foundation. All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
@@ -92,7 +92,8 @@ int IPACM_Wan::ipa_if_num_tether_v4[IPA_MAX_IFACE_ENTRIES];
int IPACM_Wan::ipa_if_num_tether_v6[IPA_MAX_IFACE_ENTRIES];
#endif
-uint16_t IPACM_Wan::mtu_default_wan = DEFAULT_MTU_SIZE;
+uint16_t IPACM_Wan::mtu_default_wan_v4 = DEFAULT_MTU_SIZE;
+uint16_t IPACM_Wan::mtu_default_wan_v6 = DEFAULT_MTU_SIZE;
IPACM_Wan::IPACM_Wan(int iface_index,
ipacm_wan_iface_type is_sta_mode,
@@ -132,7 +133,11 @@ IPACM_Wan::IPACM_Wan(int iface_index,
ext_prop = NULL;
is_ipv6_frag_firewall_flt_rule_installed = false;
ipv6_frag_firewall_flt_rule_hdl = 0;
- mtu_size = DEFAULT_MTU_SIZE;
+
+ mtu_v4 = DEFAULT_MTU_SIZE;
+ mtu_v4_set = false;
+ mtu_v6 = DEFAULT_MTU_SIZE;
+ mtu_v6_set = false;
num_wan_client = 0;
header_name_count = 0;
@@ -146,6 +151,53 @@ IPACM_Wan::IPACM_Wan(int iface_index,
wan_client_len = 0;
m_is_sta_mode = is_sta_mode;
+#ifdef IPA_MTU_EVENT_MAX
+ /* Query WAN MTU to handle IPACM restart scenarios. */
+ if(is_sta_mode == Q6_WAN)
+ {
+ int fd_wwan_ioctl;
+ ipa_mtu_info *mtu_info = (ipa_mtu_info *)malloc(sizeof(ipa_mtu_info));
+ if (mtu_info)
+ {
+ memset(mtu_info, 0, sizeof(ipa_mtu_info));
+ memcpy(mtu_info->if_name, dev_name, IPA_IFACE_NAME_LEN);
+ fd_wwan_ioctl = open(WWAN_QMI_IOCTL_DEVICE_NAME, O_RDWR);
+ if(fd_wwan_ioctl < 0)
+ {
+ IPACMERR("Failed to open %s.\n",WWAN_QMI_IOCTL_DEVICE_NAME);
+ }
+ else
+ {
+ IPACMDBG_H("send WAN_IOC_GET_WAN_MTU for %s\n", mtu_info->if_name);
+ if(ioctl(fd_wwan_ioctl, WAN_IOC_GET_WAN_MTU, mtu_info))
+ {
+ IPACMERR("Failed to send WAN_IOC_GET_WAN_MTU\n ");
+ }
+ else
+ {
+ /* Updated MTU values.*/
+ if (mtu_info->mtu_v4)
+ {
+ mtu_v4 = mtu_info->mtu_v4;
+ mtu_v4_set = true;
+ IPACMDBG_H("Updated v4 mtu=[%d] for (%s)\n",
+ mtu_v4, mtu_info->if_name);
+ }
+ if (mtu_info->mtu_v6)
+ {
+ mtu_v6 = mtu_info->mtu_v6;
+ mtu_v6_set = true;
+ IPACMDBG_H("Updated v6 mtu=[%d] for (%s)\n",
+ mtu_v6, mtu_info->if_name);
+ }
+ }
+ close(fd_wwan_ioctl);
+ }
+ free(mtu_info);
+ }
+ }
+#endif
+
if(iface_query != NULL)
{
IPACMDBG_H("index:%d constructor: Tx properties:%d\n", iface_index, iface_query->num_tx_props);
@@ -810,7 +862,7 @@ int IPACM_Wan::handle_addr_evt_mhi_q6(ipacm_event_data_addr *data)
IPACMDBG_H(" Has rx/tx properties registered for iface %s, add for NATTING for ip-family %d \n", dev_name, IPA_IP_v6);
IPACM_Iface::ipacmcfg->AddNatIfaces(dev_name, IPA_IP_v6);
}
- /* skylar setup v6-wan-tbl */
+ /* setup v6-wan-tbl */
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));
@@ -1112,6 +1164,7 @@ void IPACM_Wan::event_callback(ipa_cm_event_id event, void *param)
}
}
break;
+
case IPA_LINK_DOWN_EVENT:
{
ipacm_event_data_fid *data = (ipacm_event_data_fid *)param;
@@ -1575,6 +1628,8 @@ void IPACM_Wan::event_callback(ipa_cm_event_id event, void *param)
{
ipacm_event_data_all *data = (ipacm_event_data_all *)param;
ipa_interface_index = iface_ipa_index_query(data->if_index);
+ int index = 0;
+ bool renew = false;
if (ipa_interface_index == ipa_if_num)
{
@@ -1606,6 +1661,7 @@ void IPACM_Wan::event_callback(ipa_cm_event_id event, void *param)
}
IPACMDBG_H("wan-iface got client \n");
+
/* first construc WAN-client full header */
if(memcmp(data->mac_addr,
invalid_mac,
@@ -1617,7 +1673,20 @@ void IPACM_Wan::event_callback(ipa_cm_event_id event, void *param)
return;
}
- handle_wan_hdr_init(data->mac_addr);
+ /* check if same as GW_ip need replacing */
+ if( handle_gw_mac_renew(data, index) == IPACM_SUCCESS)
+ {
+ renew = true;
+ IPACMDBG_H("Renew is happening with client-index (%d)\n", index);
+ /* clinet renew procedure */
+ handle_wan_hdr_init(data->mac_addr, true, index);
+ }
+ else
+ {
+ IPACMDBG_H("Renew is no need!\n");
+ handle_wan_hdr_init(data->mac_addr);
+ }
+
IPACMDBG_H("construct wan-client header and route rules \n");
/* Associate with IP and construct RT-rule */
if (handle_wan_client_ipaddr(data) == IPACM_FAILURE)
@@ -1626,7 +1695,7 @@ void IPACM_Wan::event_callback(ipa_cm_event_id event, void *param)
}
handle_wan_client_route_rule(data->mac_addr, data->iptype);
/* Check & construct STA header */
- handle_sta_header_add_evt();
+ handle_sta_header_add_evt(renew);
return;
}
}
@@ -1721,54 +1790,117 @@ void IPACM_Wan::event_callback(ipa_cm_event_id event, void *param)
}
break;
- case IPA_WLAN_SWITCH_TO_SCC:
- if(IPACM_Wan::backhaul_mode == WLAN_WAN)
+ case IPA_WLAN_SWITCH_TO_SCC:
+ if(IPACM_Wan::backhaul_mode == WLAN_WAN)
+ {
+ IPACMDBG_H("Received IPA_WLAN_SWITCH_TO_SCC\n");
+ if(ip_type == IPA_IP_MAX)
{
- IPACMDBG_H("Received IPA_WLAN_SWITCH_TO_SCC\n");
- if(ip_type == IPA_IP_MAX)
- {
- handle_wlan_SCC_MCC_switch(true, IPA_IP_v4);
- handle_wlan_SCC_MCC_switch(true, IPA_IP_v6);
- handle_wan_client_SCC_MCC_switch(true, IPA_IP_v4);
- handle_wan_client_SCC_MCC_switch(true, IPA_IP_v6);
- }
- else
- {
- handle_wlan_SCC_MCC_switch(true, ip_type);
- handle_wan_client_SCC_MCC_switch(true, ip_type);
- }
+ handle_wlan_SCC_MCC_switch(true, IPA_IP_v4);
+ handle_wlan_SCC_MCC_switch(true, IPA_IP_v6);
+ handle_wan_client_SCC_MCC_switch(true, IPA_IP_v4);
+ handle_wan_client_SCC_MCC_switch(true, IPA_IP_v6);
}
- break;
+ else
+ {
+ handle_wlan_SCC_MCC_switch(true, ip_type);
+ handle_wan_client_SCC_MCC_switch(true, ip_type);
+ }
+ }
+ break;
+
+ case IPA_WLAN_SWITCH_TO_MCC:
+ if(IPACM_Wan::backhaul_mode == WLAN_WAN)
+ {
+ IPACMDBG_H("Received IPA_WLAN_SWITCH_TO_MCC\n");
+ if(ip_type == IPA_IP_MAX)
+ {
+ handle_wlan_SCC_MCC_switch(false, IPA_IP_v4);
+ handle_wlan_SCC_MCC_switch(false, IPA_IP_v6);
+ handle_wan_client_SCC_MCC_switch(false, IPA_IP_v4);
+ handle_wan_client_SCC_MCC_switch(false, IPA_IP_v6);
+ }
+ else
+ {
+ handle_wlan_SCC_MCC_switch(false, ip_type);
+ handle_wan_client_SCC_MCC_switch(false, ip_type);
+ }
+ }
+ break;
+#ifdef FEATURE_IPACM_HAL
+ /* WA for WLAN to clean up NAT instance during SSR */
+ case IPA_SSR_NOTICE:
+ case IPA_WLAN_FWR_SSR_BEFORE_SHUTDOWN_NOTICE:
+ {
+ IPACMDBG_H("Received IPA_SSR_NOTICE event.\n");
+ if(m_is_sta_mode == WLAN_WAN)
+ {
+ IPACM_Iface::ipacmcfg->DelNatIfaces(dev_name); // delete NAT-iface
+ }
+ }
+ break;
+#endif
+#ifdef IPA_MTU_EVENT_MAX
+ case IPA_MTU_SET:
+ {
+ ipacm_event_mtu_info *data = (ipacm_event_mtu_info *)param;
+ ipa_mtu_info *mtu_info = &(data->mtu_info);
+ ipa_interface_index = iface_ipa_index_query(data->if_index);
- case IPA_WLAN_SWITCH_TO_MCC:
- if(IPACM_Wan::backhaul_mode == WLAN_WAN)
+ if (ipa_interface_index == ipa_if_num)
+ {
+ IPACMDBG_H("Received IPA_MTU_SET (Android) for interface (%d)\n",
+ ipa_interface_index);
+ if (mtu_info->ip_type == IPA_IP_v4 || mtu_info->ip_type == IPA_IP_MAX)
{
- IPACMDBG_H("Received IPA_WLAN_SWITCH_TO_MCC\n");
- if(ip_type == IPA_IP_MAX)
+ /* Update v4_mtu. */
+ mtu_v4 = mtu_info->mtu_v4;
+ mtu_v4_set = true;
+
+ if (active_v4)
{
- handle_wlan_SCC_MCC_switch(false, IPA_IP_v4);
- handle_wlan_SCC_MCC_switch(false, IPA_IP_v6);
- handle_wan_client_SCC_MCC_switch(false, IPA_IP_v4);
- handle_wan_client_SCC_MCC_switch(false, IPA_IP_v6);
+ /* upstream interface. update default MTU. */
+ mtu_default_wan_v4 = mtu_v4;
}
- else
+ IPACMDBG_H("Updated v4 mtu=[%d] for (%s), upstream_mtu=[%d]\n",
+ mtu_v4, mtu_info->if_name, mtu_default_wan_v4);
+ }
+ if (mtu_info->ip_type == IPA_IP_v6 || mtu_info->ip_type == IPA_IP_MAX)
+ {
+ /* Update v4_mtu. */
+ mtu_v6 = mtu_info->mtu_v6;
+ mtu_v6_set = true;
+ if (active_v6)
{
- handle_wlan_SCC_MCC_switch(false, ip_type);
- handle_wan_client_SCC_MCC_switch(false, ip_type);
+ /* upstream interface. update default MTU. */
+ mtu_default_wan_v6 = mtu_v6;
}
+ IPACMDBG_H("Updated v6 mtu=[%d] for (%s), upstream_mtu=[%d]\n",
+ mtu_v6, mtu_info->if_name, mtu_default_wan_v6);
}
- break;
-#ifdef FEATURE_IPACM_HAL
- /* WA for WLAN to clean up NAT instance during SSR */
- case IPA_SSR_NOTICE:
- case IPA_WLAN_FWR_SSR_BEFORE_SHUTDOWN_NOTICE:
- IPACMDBG_H("Received IPA_SSR_NOTICE event.\n");
- if(m_is_sta_mode == WLAN_WAN)
+
+ if (active_v4 || active_v6)
{
- IPACM_Iface::ipacmcfg->DelNatIfaces(dev_name); // delete NAT-iface
+ ipacm_event_mtu_info *mtu_event;
+ ipacm_cmd_q_data evt_data;
+ mtu_event = (ipacm_event_mtu_info *)malloc(sizeof(*mtu_event));
+ if(mtu_event == NULL)
+ {
+ IPACMERR("Failed to allocate memory.\n");
+ return;
+ }
+ memcpy(&mtu_event->mtu_info, mtu_info, sizeof(ipa_mtu_info));
+ evt_data.event = IPA_MTU_UPDATE;
+ evt_data.evt_data = mtu_event;
+ /* finish command queue */
+ IPACMDBG_H("Posting IPA_MTU_UPDATE event\n");
+ IPACM_EvtDispatcher::PostEvt(&evt_data);
}
- break;
+ }
+ }
+ break;
#endif
+
default:
break;
}
@@ -1777,9 +1909,8 @@ void IPACM_Wan::event_callback(ipa_cm_event_id event, void *param)
}
/* wan default route/filter rule configuration */
-int IPACM_Wan::handle_route_add_evt(ipa_ip_type iptype)
+int IPACM_Wan::handle_route_add_evt(ipa_ip_type iptype, bool add_only)
{
-
/* add default WAN route */
struct ipa_ioc_add_rt_rule *rt_rule = NULL;
struct ipa_rt_rule_add *rt_rule_entry;
@@ -1817,8 +1948,14 @@ int IPACM_Wan::handle_route_add_evt(ipa_ip_type iptype)
}
IPACMDBG_H("backhaul_is_wan_bridge ?: %d \n", IPACM_Wan::backhaul_is_wan_bridge);
- /* query MTU size of the interface */
- query_mtu_size();
+ /* query MTU size of the interface if MTU is not set via ioctl. */
+ if (!mtu_v4_set && !mtu_v6_set)
+ {
+ if(query_mtu_size())
+ {
+ IPACMERR("Failed to query mtu");
+ }
+ }
if (m_is_sta_mode ==Q6_WAN)
{
@@ -2104,10 +2241,16 @@ int IPACM_Wan::handle_route_add_evt(ipa_ip_type iptype)
wan_route_rule_v6_hdl_a5[0], 0, iptype);
}
- /* set mtu_default_wan to current default wan instance */
- mtu_default_wan = mtu_size;
-
- IPACMDBG_H("replace the mtu_default_wan to %d\n", mtu_default_wan);
+ /* support delete only, not post wan_down event */
+ if (add_only)
+ {
+ IPACMDBG_H(" Only add default WAN routing rules (%d)\n", add_only);
+ if(rt_rule != NULL)
+ {
+ free(rt_rule);
+ }
+ return IPACM_SUCCESS;
+ }
ipacm_event_iface_up *wanup_data;
wanup_data = (ipacm_event_iface_up *)malloc(sizeof(ipacm_event_iface_up));
@@ -2122,6 +2265,10 @@ int IPACM_Wan::handle_route_add_evt(ipa_ip_type iptype)
/* handling filter rule construction */
if (iptype == IPA_IP_v4)
{
+ /* set mtu_default_wan to current default wan instance */
+ mtu_default_wan_v4 = mtu_v4;
+ IPACMDBG_H("replace the mtu_wan to %d\n", mtu_default_wan_v4);
+
IPACM_Wan::wan_up = true;
active_v4 = true;
memcpy(IPACM_Wan::wan_up_dev_name,
@@ -2181,6 +2328,10 @@ int IPACM_Wan::handle_route_add_evt(ipa_ip_type iptype)
}
else
{
+ /* set mtu_default_wan to current default wan instance */
+ mtu_default_wan_v6 = mtu_v6;
+ IPACMDBG_H("replace the mtu_wan to %d\n", mtu_default_wan_v6);
+
memcpy(backhaul_ipv6_prefix, ipv6_prefix, sizeof(backhaul_ipv6_prefix));
IPACMDBG_H("Setup backhaul ipv6 prefix to be 0x%08x%08x.\n", backhaul_ipv6_prefix[0], backhaul_ipv6_prefix[1]);
@@ -2236,11 +2387,28 @@ int IPACM_Wan::handle_route_add_evt(ipa_ip_type iptype)
}
IPACMDBG_H("send WAN_IOC_NOTIFY_WAN_STATE up to IPA_PM\n");
wan_state.up = true;
+#ifdef WAN_IOCTL_NOTIFY_WAN_INTF_NAME
+ strlcpy(wan_state.upstreamIface, dev_name, IFNAMSIZ);
+#endif
if(ioctl(fd_wwan_ioctl, WAN_IOC_NOTIFY_WAN_STATE, &wan_state))
{
IPACMERR("Failed to send WAN_IOC_NOTIFY_WAN_STATE as up %d\n ", wan_state.up);
}
close(fd_wwan_ioctl);
+
+ /* Store the Offload state. */
+ FILE *fp = NULL;
+ fp = fopen(IPA_OFFLOAD_TETHER_STATE_FILE_NAME, "w");
+ if (fp == NULL)
+ {
+ IPACMERR("Failed to write offload state to %s, error is %d - %s\n",
+ IPA_OFFLOAD_TETHER_STATE_FILE_NAME, errno, strerror(errno));
+ }
+ else
+ {
+ fprintf(fp, "UPSTREAM=%s,STATE=UP", dev_name);
+ fclose(fp);
+ }
}
ipa_pm_q6_check++;
IPACMDBG_H("update ipa_pm_q6_check to %d\n", ipa_pm_q6_check);
@@ -2368,7 +2536,7 @@ int IPACM_Wan::post_wan_down_tether_evt(ipa_ip_type iptype, int ipa_if_num_tethe
#endif
/* construct complete ethernet header */
-int IPACM_Wan::handle_sta_header_add_evt()
+int IPACM_Wan::handle_sta_header_add_evt(bool renew)
{
int res = IPACM_SUCCESS, index = IPACM_INVALID_INDEX;
if((header_set_v4 == true) || (header_set_v6 == true))
@@ -2425,7 +2593,13 @@ int IPACM_Wan::handle_sta_header_add_evt()
}
}
- /* checking if the ipv4 same as default route */
+ /* see if v4 default routes are setup before constructing full header */
+ if(header_partial_default_wan_v4 == true)
+ {
+ handle_route_add_evt(IPA_IP_v4, renew);
+ }
+
+ /* checking if the ipv6 same as default route */
if(wan_v6_addr_gw_set)
{
index = get_wan_client_index_ipv6(wan_v6_addr_gw);
@@ -2473,15 +2647,11 @@ int IPACM_Wan::handle_sta_header_add_evt()
}
}
- /* see if default routes are setup before constructing full header */
- if(header_partial_default_wan_v4 == true)
- {
- handle_route_add_evt(IPA_IP_v4);
- }
+ /* see if v6 default routes are setup before constructing full header */
if(header_partial_default_wan_v6 == true)
{
- handle_route_add_evt(IPA_IP_v6);
+ handle_route_add_evt(IPA_IP_v6, renew);
}
return res;
}
@@ -4257,9 +4427,6 @@ int IPACM_Wan::config_wan_firewall_rule(ipa_ip_type iptype)
}
else if(iptype == IPA_IP_v6)
{
-#ifdef FEATURE_IPA_ANDROID
- add_tcpv6_filtering_rule(flt_rule_v6, IPACM_Wan::num_v6_flt_rule);
-#endif
IPACM_Wan::num_v6_flt_rule = IPA_V2_NUM_DEFAULT_WAN_FILTER_RULE_IPV6;
if(IPACM_FAILURE == add_icmp_alg_rules(flt_rule_v6, IPACM_Wan::num_v6_flt_rule, IPA_IP_v6))
{
@@ -4544,103 +4711,6 @@ fail:
return res;
}
-int IPACM_Wan::add_tcpv6_filtering_rule(struct ipa_flt_rule_add *rules, int rule_offset)
-{
- struct ipa_ioc_get_rt_tbl_indx rt_tbl_idx;
- struct ipa_flt_rule_add flt_rule_entry;
- struct ipa_ioc_generate_flt_eq flt_eq;
- int res = IPACM_SUCCESS;
-
- if(rules == NULL)
- {
- IPACMERR("No filtering table available.\n");
- return IPACM_FAILURE;
- }
- if(rx_prop == NULL)
- {
- IPACMERR("No tx property.\n");
- return IPACM_FAILURE;
- }
-
- memset(&rt_tbl_idx, 0, sizeof(rt_tbl_idx));
- strlcpy(rt_tbl_idx.name, IPACM_Iface::ipacmcfg->rt_tbl_wan_dl.name, IPA_RESOURCE_NAME_MAX);
- rt_tbl_idx.name[IPA_RESOURCE_NAME_MAX-1] = '\0';
- rt_tbl_idx.ip = IPA_IP_v6;
- if(0 != ioctl(m_fd_ipa, IPA_IOC_QUERY_RT_TBL_INDEX, &rt_tbl_idx))
- {
- IPACMERR("Failed to get routing table index from name\n");
- res = IPACM_FAILURE;
- goto fail;
- }
-
- IPACMDBG_H("Routing table %s has index %d\n", rt_tbl_idx.name, rt_tbl_idx.idx);
- memset(&flt_rule_entry, 0, sizeof(struct ipa_flt_rule_add));
-
- flt_rule_entry.at_rear = true;
- flt_rule_entry.flt_rule_hdl = -1;
- flt_rule_entry.status = -1;
-
- flt_rule_entry.rule.retain_hdr = 1;
- flt_rule_entry.rule.to_uc = 0;
- flt_rule_entry.rule.eq_attrib_type = 1;
- flt_rule_entry.rule.action = IPA_PASS_TO_ROUTING;
- flt_rule_entry.rule.rt_tbl_idx = rt_tbl_idx.idx;
-
-#ifdef FEATURE_IPA_ANDROID
- IPACMDBG_H("Add TCP ctrl rules: total num %d\n", IPA_V2_NUM_TCP_WAN_FILTER_RULE_IPV6);
-#endif
- memcpy(&flt_rule_entry.rule.attrib,
- &rx_prop->rx[0].attrib,
- sizeof(flt_rule_entry.rule.attrib));
- memset(&flt_eq, 0, sizeof(flt_eq));
- memcpy(&flt_eq.attrib, &flt_rule_entry.rule.attrib, sizeof(flt_eq.attrib));
- flt_eq.ip = IPA_IP_v6;
- if(0 != ioctl(m_fd_ipa, IPA_IOC_GENERATE_FLT_EQ, &flt_eq))
- {
- IPACMERR("Failed to get eq_attrib\n");
- res = IPACM_FAILURE;
- goto fail;
- }
-
- memcpy(&flt_rule_entry.rule.eq_attrib,
- &flt_eq.eq_attrib,
- sizeof(flt_rule_entry.rule.eq_attrib));
-
- flt_rule_entry.rule.eq_attrib.rule_eq_bitmap |= (1<<1);
- flt_rule_entry.rule.eq_attrib.protocol_eq_present = 1;
- flt_rule_entry.rule.eq_attrib.protocol_eq = IPACM_FIREWALL_IPPROTO_TCP;
-
- if (IPACM_Iface::ipacmcfg->isIPAv3Supported())
- flt_rule_entry.rule.eq_attrib.rule_eq_bitmap |= (1<<7);
- else
- flt_rule_entry.rule.eq_attrib.rule_eq_bitmap |= (1<<8);
- flt_rule_entry.rule.eq_attrib.num_ihl_offset_meq_32 = 1;
- flt_rule_entry.rule.eq_attrib.ihl_offset_meq_32[0].offset = 12;
-
- /* add TCP FIN rule*/
- flt_rule_entry.rule.eq_attrib.ihl_offset_meq_32[0].value = (((uint32_t)1)<<TCP_FIN_SHIFT);
- flt_rule_entry.rule.eq_attrib.ihl_offset_meq_32[0].mask = (((uint32_t)1)<<TCP_FIN_SHIFT);
- memcpy(&(rules[rule_offset]), &flt_rule_entry, sizeof(struct ipa_flt_rule_add));
-
- /* add TCP SYN rule*/
- flt_rule_entry.rule.eq_attrib.ihl_offset_meq_32[0].value = (((uint32_t)1)<<TCP_SYN_SHIFT);
- flt_rule_entry.rule.eq_attrib.ihl_offset_meq_32[0].mask = (((uint32_t)1)<<TCP_SYN_SHIFT);
- memcpy(&(rules[rule_offset + 1]), &flt_rule_entry, sizeof(struct ipa_flt_rule_add));
-
- /* add TCP RST rule*/
- flt_rule_entry.rule.eq_attrib.ihl_offset_meq_32[0].value = (((uint32_t)1)<<TCP_RST_SHIFT);
- flt_rule_entry.rule.eq_attrib.ihl_offset_meq_32[0].mask = (((uint32_t)1)<<TCP_RST_SHIFT);
- memcpy(&(rules[rule_offset + 2]), &flt_rule_entry, sizeof(struct ipa_flt_rule_add));
-
-#ifdef FEATURE_IPA_ANDROID
- IPACM_Wan::num_v6_flt_rule += IPA_V2_NUM_TCP_WAN_FILTER_RULE_IPV6;
- IPACMDBG_H("Constructed %d ICMP filtering rules for ip type %d\n", IPA_V2_NUM_TCP_WAN_FILTER_RULE_IPV6, IPA_IP_v6);
-#endif
-
-fail:
- return res;
-}
-
int IPACM_Wan::del_wan_firewall_rule(ipa_ip_type iptype)
{
if(iptype == IPA_IP_v4)
@@ -4769,7 +4839,7 @@ int IPACM_Wan::del_dft_firewall_rules(ipa_ip_type iptype)
}
/* for STA mode: wan default route/filter rule delete */
-int IPACM_Wan::handle_route_del_evt(ipa_ip_type iptype)
+int IPACM_Wan::handle_route_del_evt(ipa_ip_type iptype, bool delete_only)
{
uint32_t tx_index;
ipacm_cmd_q_data evt_data;
@@ -4778,6 +4848,7 @@ int IPACM_Wan::handle_route_del_evt(ipa_ip_type iptype)
int fd_wwan_ioctl;
memset(&wan_state, 0, sizeof(wan_state));
#endif
+ int ret = IPACM_SUCCESS;
IPACMDBG_H("got handle_route_del_evt for STA-mode with ip-family:%d \n", iptype);
@@ -4793,39 +4864,42 @@ int IPACM_Wan::handle_route_del_evt(ipa_ip_type iptype)
if (((iptype == IPA_IP_v4) && (active_v4 == true)) ||
((iptype == IPA_IP_v6) && (active_v6 == true)))
{
- if(IPACM_Iface::ipacmcfg->GetIPAVer() >= IPA_HW_None && IPACM_Iface::ipacmcfg->GetIPAVer() < IPA_HW_v4_0)
- {
- /* Delete corresponding ipa_rm_resource_name of TX-endpoint after delete IPV4/V6 RT-rule */
- IPACMDBG_H("dev %s delete producer dependency\n", dev_name);
- 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]);
- }
- else
+ if (!delete_only)
{
- /* change wan_state for Q6_MHI */
-#ifdef WAN_IOC_NOTIFY_WAN_STATE
- IPACMDBG_H("ipa_pm_q6_check to %d\n", ipa_pm_q6_check);
- if(ipa_pm_q6_check == 1 && m_is_sta_mode == Q6_MHI_WAN)
+ if(IPACM_Iface::ipacmcfg->GetIPAVer() >= IPA_HW_None && IPACM_Iface::ipacmcfg->GetIPAVer() < IPA_HW_v4_0)
{
- fd_wwan_ioctl = open(WWAN_QMI_IOCTL_DEVICE_NAME, O_RDWR);
- if(fd_wwan_ioctl < 0)
- {
- IPACMERR("Failed to open %s.\n",WWAN_QMI_IOCTL_DEVICE_NAME);
- return false;
- }
- IPACMDBG_H("send WAN_IOC_NOTIFY_WAN_STATE down to IPA_PM\n");
- if(ioctl(fd_wwan_ioctl, WAN_IOC_NOTIFY_WAN_STATE, &wan_state))
- {
- IPACMERR("Failed to send WAN_IOC_NOTIFY_WAN_STATE as up %d\n ", wan_state.up);
- }
- close(fd_wwan_ioctl);
+ /* Delete corresponding ipa_rm_resource_name of TX-endpoint after delete IPV4/V6 RT-rule */
+ IPACMDBG_H("dev %s delete producer dependency\n", dev_name);
+ 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]);
}
- if (ipa_pm_q6_check > 0)
- ipa_pm_q6_check--;
else
- IPACMERR(" ipa_pm_q6_check becomes negative !!!\n");
+ {
+ /* change wan_state for Q6_MHI */
+#ifdef WAN_IOC_NOTIFY_WAN_STATE
+ IPACMDBG_H("ipa_pm_q6_check to %d\n", ipa_pm_q6_check);
+ if(ipa_pm_q6_check == 1 && m_is_sta_mode == Q6_MHI_WAN)
+ {
+ fd_wwan_ioctl = open(WWAN_QMI_IOCTL_DEVICE_NAME, O_RDWR);
+ if(fd_wwan_ioctl < 0)
+ {
+ IPACMERR("Failed to open %s.\n",WWAN_QMI_IOCTL_DEVICE_NAME);
+ return false;
+ }
+ IPACMDBG_H("send WAN_IOC_NOTIFY_WAN_STATE down to IPA_PM\n");
+ if(ioctl(fd_wwan_ioctl, WAN_IOC_NOTIFY_WAN_STATE, &wan_state))
+ {
+ IPACMERR("Failed to send WAN_IOC_NOTIFY_WAN_STATE as up %d\n ", wan_state.up);
+ }
+ close(fd_wwan_ioctl);
+ }
+ if (ipa_pm_q6_check > 0)
+ ipa_pm_q6_check--;
+ else
+ IPACMERR(" ipa_pm_q6_check becomes negative !!!\n");
#endif
- }
+ }
+ } // end of delete_only
for (tx_index = 0; tx_index < iface_query->num_tx_props; tx_index++)
{
@@ -4868,6 +4942,14 @@ int IPACM_Wan::handle_route_del_evt(ipa_ip_type iptype)
return IPACM_FAILURE;
}
}
+
+ /* support delete only, not post wan_down event */
+ if(delete_only)
+ {
+ IPACMDBG_H(" Only delete default WAN routing rules (%d)\n", delete_only);
+ return IPACM_SUCCESS;
+ }
+
ipacm_event_iface_up *wandown_data;
wandown_data = (ipacm_event_iface_up *)malloc(sizeof(ipacm_event_iface_up));
if (wandown_data == NULL)
@@ -4907,24 +4989,19 @@ int IPACM_Wan::handle_route_del_evt(ipa_ip_type iptype)
if(delete_offload_frag_rule())
{
IPACMERR("Failed to delete DL frag rule \n");
- return IPACM_FAILURE;
- }
- /* Delete MHI icmpv6 exception rule */
- if(delete_icmpv6_exception_rule())
- {
- IPACMERR("Failed to delete icmpv6 rule \n");
- return IPACM_FAILURE;
+ ret = IPACM_FAILURE;
}
+
/* Delete tcp_fin_rst rule */
if(delete_tcp_fin_rst_exception_rule())
{
IPACMERR("Failed to delete tcp_fin_rst rule \n");
- return IPACM_FAILURE;
+ ret = IPACM_FAILURE;
}
+ return ret;
}
else
{
-
wandown_data->backhaul_type = m_is_sta_mode;
memcpy(wandown_data->ipv6_prefix, ipv6_prefix, sizeof(wandown_data->ipv6_prefix));
evt_data.event = IPA_HANDLE_WAN_DOWN_V6;
@@ -4943,6 +5020,13 @@ int IPACM_Wan::handle_route_del_evt(ipa_ip_type iptype)
{
memset(IPACM_Wan::wan_up_dev_name, 0, sizeof(IPACM_Wan::wan_up_dev_name));
}
+ /* Delete MHI icmpv6 exception rule */
+ if(delete_icmpv6_exception_rule())
+ {
+ IPACMERR("Failed to delete icmpv6 rule \n");
+ return IPACM_FAILURE;
+ }
+
}
}
else
@@ -4995,11 +5079,28 @@ int IPACM_Wan::handle_route_del_evt_ex(ipa_ip_type iptype)
return false;
}
IPACMDBG_H("send WAN_IOC_NOTIFY_WAN_STATE down to IPA_PM\n");
+#ifdef WAN_IOCTL_NOTIFY_WAN_INTF_NAME
+ strlcpy(wan_state.upstreamIface, dev_name, IFNAMSIZ);
+#endif
if(ioctl(fd_wwan_ioctl, WAN_IOC_NOTIFY_WAN_STATE, &wan_state))
{
IPACMERR("Failed to send WAN_IOC_NOTIFY_WAN_STATE as up %d\n ", wan_state.up);
}
close(fd_wwan_ioctl);
+
+ /* Store the Offload state. */
+ FILE *fp = NULL;
+ fp = fopen(IPA_OFFLOAD_TETHER_STATE_FILE_NAME, "w");
+ if (fp == NULL)
+ {
+ IPACMERR("Failed to write offload state to %s, error is %d - %s\n",
+ IPA_OFFLOAD_TETHER_STATE_FILE_NAME, errno, strerror(errno));
+ }
+ else
+ {
+ fprintf(fp, "UPSTREAM=%s,STATE=DOWN", dev_name);
+ fclose(fp);
+ }
}
if (ipa_pm_q6_check > 0)
ipa_pm_q6_check--;
@@ -5243,17 +5344,6 @@ int IPACM_Wan::handle_down_evt()
handle_route_del_evt(IPA_IP_v4);
IPACMDBG_H("Delete default v4 routing rules\n");
- if(m_is_sta_mode == Q6_MHI_WAN)
- {
- /* Delete default v4 RT rule */
- IPACMDBG_H("Delete default v4 routing rules\n");
- if (m_routing.DeleteRoutingHdl(dft_rt_rule_hdl[0], IPA_IP_v4) == false)
- {
- IPACMERR("Routing v6-lan-RT rule deletion failed!\n");
- res = IPACM_FAILURE;
- goto fail;
- }
- }
#ifdef FEATURE_IPA_ANDROID
/* posting wan_down_tether for lan clients */
@@ -5285,18 +5375,6 @@ int IPACM_Wan::handle_down_evt()
handle_route_del_evt(IPA_IP_v6);
IPACMDBG_H("Delete default v6 routing rules\n");
- if(m_is_sta_mode == Q6_MHI_WAN)
- {
- /* Delete default v6 RT rule */
- IPACMDBG_H("Delete default v6 routing rules\n");
- if (m_routing.DeleteRoutingHdl(dft_rt_rule_hdl[1], IPA_IP_v6) == false)
- {
- IPACMERR("Routing v6-wan-RT rule deletion failed!\n");
- res = IPACM_FAILURE;
- goto fail;
- }
- }
-
#ifdef FEATURE_IPA_ANDROID
/* posting wan_down_tether for lan clients */
#ifdef FEATURE_IPACM_HAL
@@ -5318,37 +5396,51 @@ int IPACM_Wan::handle_down_evt()
#endif
}
- if(m_is_sta_mode != Q6_MHI_WAN)
+ /* Delete default v4 RT rule */
+ if (ip_type != IPA_IP_v6 && wan_v4_addr_set)
{
- /* Delete default v4 RT rule */
- if (ip_type != IPA_IP_v6)
+ /* no need delete v4 RSC routing rules */
+ IPACMDBG_H("Delete default v4 routing rules\n");
+ if (m_routing.DeleteRoutingHdl(dft_rt_rule_hdl[0], IPA_IP_v4) == false)
+ {
+ IPACMERR("Routing rule deletion failed!\n");
+ res = IPACM_FAILURE;
+ goto fail;
+ }
+ }
+
+ /* delete default v6 RT rule */
+ if (ip_type != IPA_IP_v4)
+ {
+ IPACMDBG_H("Delete default v6 routing rules\n");
+ /* May have multiple ipv6 iface-routing rules*/
+ for (i = 0; i < 2*num_dft_rt_v6; i++)
{
- /* no need delete v4 RSC routing rules */
- IPACMDBG_H("Delete default v4 routing rules\n");
- if (m_routing.DeleteRoutingHdl(dft_rt_rule_hdl[0], IPA_IP_v4) == false)
+ if (m_routing.DeleteRoutingHdl(dft_rt_rule_hdl[MAX_DEFAULT_v4_ROUTE_RULES+i], IPA_IP_v6) == false)
{
IPACMERR("Routing rule deletion failed!\n");
res = IPACM_FAILURE;
goto fail;
}
}
+ IPACMDBG_H("finished delete default v6 RT rules\n ");
+ }
- /* delete default v6 RT rule */
- if (ip_type != IPA_IP_v4)
+ /* check software routing fl rule hdl */
+ if (softwarerouting_act == true)
+ {
+ if(m_is_sta_mode == Q6_MHI_WAN)
{
- IPACMDBG_H("Delete default v6 routing rules\n");
- /* May have multiple ipv6 iface-routing rules*/
- for (i = 0; i < 2*num_dft_rt_v6; i++)
- {
- if (m_routing.DeleteRoutingHdl(dft_rt_rule_hdl[MAX_DEFAULT_v4_ROUTE_RULES+i], IPA_IP_v6) == false)
- {
- IPACMERR("Routing rule deletion failed!\n");
- res = IPACM_FAILURE;
- goto fail;
- }
- }
- IPACMDBG_H("finished delete default v6 RT rules\n ");
+ handle_software_routing_disable(true);
}
+ else
+ {
+ handle_software_routing_disable(false);
+ }
+ }
+
+ if(m_is_sta_mode != Q6_MHI_WAN)
+ {
/* clean wan-client header, routing rules */
IPACMDBG_H("left %d wan clients need to be deleted \n ", num_wan_client);
for (i = 0; i < num_wan_client; i++)
@@ -5397,18 +5489,6 @@ int IPACM_Wan::handle_down_evt()
/* free the edm clients cache */
IPACMDBG_H("Free wan clients cache\n");
- /* check software routing fl rule hdl */
- if (softwarerouting_act == true)
- {
- if(m_is_sta_mode == Q6_MHI_WAN)
- {
- handle_software_routing_disable(true);
- }
- else
- {
- handle_software_routing_disable(false);
- }
- }
/* free dft ipv4 filter rule handlers if any */
if (ip_type != IPA_IP_v6 && rx_prop != NULL)
{
@@ -5544,8 +5624,13 @@ int IPACM_Wan::handle_down_evt_ex()
goto fail;
}
+#ifndef IPA_MTU_EVENT_MAX
/* reset the mtu size */
- mtu_size = DEFAULT_MTU_SIZE;
+ mtu_v4 = DEFAULT_MTU_SIZE;
+ mtu_v4_set = false;
+ mtu_v6 = DEFAULT_MTU_SIZE;
+ mtu_v6_set = false;
+#endif
if(ip_type == IPA_IP_v4)
{
@@ -6110,7 +6195,7 @@ fail:
/* handle STA WAN-client */
/* handle WAN client initial, construct full headers (tx property) */
-int IPACM_Wan::handle_wan_hdr_init(uint8_t *mac_addr)
+int IPACM_Wan::handle_wan_hdr_init(uint8_t *mac_addr, bool replaced, int entry)
{
#define WAN_IFACE_INDEX_LEN 2
@@ -6122,38 +6207,41 @@ int IPACM_Wan::handle_wan_hdr_init(uint8_t *mac_addr)
uint32_t cnt;
int clnt_indx;
- clnt_indx = get_wan_client_index(mac_addr);
+ IPACMDBG_H("WAN client number: %d\n", num_wan_client);
- if (clnt_indx != IPACM_INVALID_INDEX)
+ if(!replaced)
{
- IPACMERR("eth client is found/attached already with index %d \n", clnt_indx);
- return IPACM_FAILURE;
- }
+ clnt_indx = get_wan_client_index(mac_addr);
- /* add header to IPA */
- if (num_wan_client >= IPA_MAX_NUM_WAN_CLIENTS)
- {
- IPACMERR("Reached maximum number(%d) of eth clients\n", IPA_MAX_NUM_WAN_CLIENTS);
- return IPACM_FAILURE;
- }
+ if (clnt_indx != IPACM_INVALID_INDEX)
+ {
+ IPACMERR("eth client is found/attached already with index %d \n", clnt_indx);
+ return IPACM_FAILURE;
+ }
- IPACMDBG_H("WAN client number: %d\n", num_wan_client);
+ /* add header to IPA */
+ if (num_wan_client >= IPA_MAX_NUM_WAN_CLIENTS)
+ {
+ IPACMERR("Reached maximum number(%d) of eth clients\n", IPA_MAX_NUM_WAN_CLIENTS);
+ return IPACM_FAILURE;
+ }
- memcpy(get_client_memptr(wan_client, num_wan_client)->mac,
+ memcpy(get_client_memptr(wan_client, num_wan_client)->mac,
mac_addr,
sizeof(get_client_memptr(wan_client, num_wan_client)->mac));
- IPACMDBG_H("Received Client MAC %02x:%02x:%02x:%02x:%02x:%02x\n",
+ IPACMDBG_H("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]);
- IPACMDBG_H("stored MAC %02x:%02x:%02x:%02x:%02x:%02x\n",
+ IPACMDBG_H("stored MAC %02x:%02x:%02x:%02x:%02x:%02x\n",
get_client_memptr(wan_client, num_wan_client)->mac[0],
get_client_memptr(wan_client, num_wan_client)->mac[1],
get_client_memptr(wan_client, num_wan_client)->mac[2],
get_client_memptr(wan_client, num_wan_client)->mac[3],
get_client_memptr(wan_client, num_wan_client)->mac[4],
get_client_memptr(wan_client, num_wan_client)->mac[5]);
+ }
/* add header to IPA */
if(tx_prop != NULL)
@@ -6254,13 +6342,23 @@ int IPACM_Wan::handle_wan_hdr_init(uint8_t *mac_addr)
goto fail;
}
- get_client_memptr(wan_client, num_wan_client)->hdr_hdl_v4 = pHeaderDescriptor->hdr[0].hdr_hdl;
- IPACMDBG_H("eth-client(%d) v4 full header name:%s header handle:(0x%x)\n",
+ if (!replaced)
+ {
+ get_client_memptr(wan_client, num_wan_client)->hdr_hdl_v4 = pHeaderDescriptor->hdr[0].hdr_hdl;
+ IPACMDBG_H("eth-client(%d) v4 full header name:%s header handle:(0x%x)\n",
num_wan_client,
pHeaderDescriptor->hdr[0].name,
get_client_memptr(wan_client, num_wan_client)->hdr_hdl_v4);
get_client_memptr(wan_client, num_wan_client)->ipv4_header_set=true;
-
+ } else
+ {
+ get_client_memptr(wan_client, entry)->hdr_hdl_v4 = pHeaderDescriptor->hdr[0].hdr_hdl;
+ IPACMDBG_H("replaced eth-client(%d) v4 full header name:%s header handle:(0x%x)\n",
+ entry,
+ pHeaderDescriptor->hdr[0].name,
+ get_client_memptr(wan_client, entry)->hdr_hdl_v4);
+ get_client_memptr(wan_client, entry)->ipv4_header_set=true;
+ }
break;
}
}
@@ -6350,24 +6448,45 @@ int IPACM_Wan::handle_wan_hdr_init(uint8_t *mac_addr)
goto fail;
}
- get_client_memptr(wan_client, num_wan_client)->hdr_hdl_v6 = pHeaderDescriptor->hdr[0].hdr_hdl;
- IPACMDBG_H("eth-client(%d) v6 full header name:%s header handle:(0x%x)\n",
+ if (!replaced)
+ {
+ get_client_memptr(wan_client, num_wan_client)->hdr_hdl_v6 = pHeaderDescriptor->hdr[0].hdr_hdl;
+ IPACMDBG_H("eth-client(%d) v6 full header name:%s header handle:(0x%x)\n",
num_wan_client,
pHeaderDescriptor->hdr[0].name,
get_client_memptr(wan_client, num_wan_client)->hdr_hdl_v6);
-
get_client_memptr(wan_client, num_wan_client)->ipv6_header_set=true;
+ }
+ else
+ {
+ get_client_memptr(wan_client, entry)->hdr_hdl_v6 = pHeaderDescriptor->hdr[0].hdr_hdl;
+ IPACMDBG_H("replaced eth-client(%d) v6 full header name:%s header handle:(0x%x)\n",
+ entry,
+ pHeaderDescriptor->hdr[0].name,
+ get_client_memptr(wan_client, entry)->hdr_hdl_v6);
+ get_client_memptr(wan_client, entry)->ipv6_header_set=true;
+ }
break;
}
}
/* initialize wifi client*/
- get_client_memptr(wan_client, num_wan_client)->route_rule_set_v4 = false;
- get_client_memptr(wan_client, num_wan_client)->route_rule_set_v6 = 0;
- get_client_memptr(wan_client, num_wan_client)->ipv4_set = false;
- get_client_memptr(wan_client, num_wan_client)->ipv6_set = 0;
- num_wan_client++;
+ if (!replaced)
+ {
+ get_client_memptr(wan_client, num_wan_client)->route_rule_set_v4 = false;
+ get_client_memptr(wan_client, num_wan_client)->route_rule_set_v6 = 0;
+ get_client_memptr(wan_client, num_wan_client)->ipv4_set = false;
+ get_client_memptr(wan_client, num_wan_client)->ipv6_set = 0;
+ num_wan_client++;
+ }
+ else
+ {
+ get_client_memptr(wan_client, entry)->route_rule_set_v4 = false;
+ get_client_memptr(wan_client, entry)->route_rule_set_v6 = 0;
+ get_client_memptr(wan_client, entry)->ipv4_set = false;
+ get_client_memptr(wan_client, entry)->ipv6_set = 0;
+ }
header_name_count++; //keep increasing header_name_count
res = IPACM_SUCCESS;
IPACMDBG_H("eth client number: %d\n", num_wan_client);
@@ -7342,10 +7461,10 @@ fail:
rt_rule_entry = &rt_rule->rules[0];
rt_rule_entry->at_rear = false;
rt_rule_entry->rule.attrib.attrib_mask = IPA_FLT_DST_ADDR;
- rt_rule_entry->rule.attrib.u.v6.dst_addr[0] = ipv6_addr[num_dft_rt_v6][0];
- rt_rule_entry->rule.attrib.u.v6.dst_addr[1] = ipv6_addr[num_dft_rt_v6][1];
- rt_rule_entry->rule.attrib.u.v6.dst_addr[2] = ipv6_addr[num_dft_rt_v6][2];
- rt_rule_entry->rule.attrib.u.v6.dst_addr[3] = ipv6_addr[num_dft_rt_v6][3];
+ rt_rule_entry->rule.attrib.u.v6.dst_addr[0] = ipv6_addr[i][0];
+ rt_rule_entry->rule.attrib.u.v6.dst_addr[1] = ipv6_addr[i][1];
+ rt_rule_entry->rule.attrib.u.v6.dst_addr[2] = ipv6_addr[i][2];
+ rt_rule_entry->rule.attrib.u.v6.dst_addr[3] = ipv6_addr[i][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;
@@ -7919,11 +8038,126 @@ int IPACM_Wan::query_mtu_size()
return IPACM_FAILURE;
}
IPACMDBG_H("mtu=[%d]\n", if_mtu.ifr_mtu);
- if (if_mtu.ifr_mtu < DEFAULT_MTU_SIZE) {
- mtu_size = if_mtu.ifr_mtu;
- IPACMDBG_H("replaced mtu=[%d] for (%s)\n", mtu_size, dev_name);
+ if (if_mtu.ifr_mtu <= DEFAULT_MTU_SIZE) {
+ mtu_v4 = mtu_v6 = if_mtu.ifr_mtu;
+ }else {
+ mtu_v4 = mtu_v6 = DEFAULT_MTU_SIZE;
}
+ IPACMDBG_H("Updated mtu=[%d] for (%s)\n", mtu_v4, dev_name);
close(fd);
return IPACM_SUCCESS;
}
+
+/* construct complete ethernet header */
+int IPACM_Wan::handle_gw_mac_renew(ipacm_event_data_all *data, int index_client)
+{
+ int index = IPACM_INVALID_INDEX;
+
+ /* checking if client has same ipv4, v6 will put future work */
+ if (data->iptype == IPA_IP_v4)
+ {
+ index = get_wan_client_index_ipv4(data->ipv4_addr);
+ if (index != IPACM_INVALID_INDEX)
+ {
+ IPACMDBG_H("Matched client index: %d\n", index);
+ IPACMDBG_H("Client MAC in cache %02x:%02x:%02x:%02x:%02x:%02x\n",
+ get_client_memptr(wan_client, index)->mac[0],
+ get_client_memptr(wan_client, index)->mac[1],
+ get_client_memptr(wan_client, index)->mac[2],
+ get_client_memptr(wan_client, index)->mac[3],
+ get_client_memptr(wan_client, index)->mac[4],
+ get_client_memptr(wan_client, index)->mac[5]);
+
+ /* check mac same or not */
+ if ((data->mac_addr[0] == get_client_memptr(wan_client, index)->mac[0]) &&
+ (data->mac_addr[1] == get_client_memptr(wan_client, index)->mac[1]) &&
+ (data->mac_addr[2] == get_client_memptr(wan_client, index)->mac[2]) &&
+ (data->mac_addr[3] == get_client_memptr(wan_client, index)->mac[3]) &&
+ (data->mac_addr[4] == get_client_memptr(wan_client, index)->mac[4]) &&
+ (data->mac_addr[5] == get_client_memptr(wan_client, index)->mac[5]))
+ {
+ IPACMDBG_H(" No need client (%d) mac renew with IPv4 (0x%x)\n", index, data->ipv4_addr);
+ return IPACM_FAILURE;
+ }
+ else
+ {
+ IPACMDBG_H(" client %d need mac renew with IPv4 (0x%x)\n", index, data->ipv4_addr);
+
+ /* Del NAT rules before ipv4 RT rules are delete */
+ if(get_client_memptr(wan_client, index)->ipv4_set == true)
+ {
+ IPACMDBG_H("Clean Nat Rules for ipv4:0x%x\n", get_client_memptr(wan_client, index)->v4_addr);
+ CtList->HandleSTAClientDelEvt(get_client_memptr(wan_client, index)->v4_addr);
+ }
+
+ /* clean up STA header / routing rule */
+ if (data->ipv4_addr == wan_v4_addr_gw && active_v4)
+ {
+ handle_route_del_evt(IPA_IP_v4, true);
+ IPACMDBG_H("Delete default v4 routing rules\n");
+ hdr_hdl_sta_v4 = 0;
+ header_set_v4 = false;
+ header_partial_default_wan_v4 = true;
+
+ if (active_v6)
+ {
+ handle_route_del_evt(IPA_IP_v6, true);
+ IPACMDBG_H("Delete default v6 routing rules\n");
+ header_partial_default_wan_v6 = true;
+ }
+ hdr_hdl_sta_v6 = 0;
+ header_set_v6 = false;
+ }
+
+ /* clean up client header routing rule entry */
+ if(delete_wan_rtrules(index, IPA_IP_v4))
+ {
+ IPACMERR("unbale to delete wan-client v4 route rules for index %d\n", index);
+ return IPACM_FAILURE;
+ }
+
+ get_client_memptr(wan_client, index)->route_rule_set_v4 = false;
+ get_client_memptr(wan_client, index)->ipv4_set = false;
+
+ IPACMDBG_H("Delete client %d header\n", index);
+ if(get_client_memptr(wan_client, index)->ipv4_header_set == true)
+ {
+ if (m_header.DeleteHeaderHdl(get_client_memptr(wan_client, index)->hdr_hdl_v4) == false)
+ {
+ IPACMERR("unable to delete client v4 header for index %d\n", index);
+ return IPACM_FAILURE;
+ }
+ get_client_memptr(wan_client, index)->ipv4_header_set = false;
+ }
+
+ if(delete_wan_rtrules(index, IPA_IP_v6))
+ {
+ IPACMERR("unbale to delete wan-client v6 route rules for index %d\n", index);
+ return IPACM_FAILURE;
+ }
+ get_client_memptr(wan_client, index)->route_rule_set_v6 = 0;
+ get_client_memptr(wan_client, index)->ipv6_set = 0;
+ if(get_client_memptr(wan_client, index)->ipv6_header_set == true)
+ {
+ if (m_header.DeleteHeaderHdl(get_client_memptr(wan_client, index)->hdr_hdl_v6) == false)
+ {
+ IPACMERR("unable to delete client v6 header for index %d\n", index);
+ return IPACM_FAILURE;
+ }
+ get_client_memptr(wan_client, index)->ipv6_header_set = false;
+ }
+ /* replacing the old mac to new_mac on same entry */
+ get_client_memptr(wan_client, index)->mac[0] = data->mac_addr[0];
+ get_client_memptr(wan_client, index)->mac[1] = data->mac_addr[1];
+ get_client_memptr(wan_client, index)->mac[2] = data->mac_addr[2];
+ get_client_memptr(wan_client, index)->mac[3] = data->mac_addr[3];
+ get_client_memptr(wan_client, index)->mac[4] = data->mac_addr[4];
+ get_client_memptr(wan_client, index)->mac[5] = data->mac_addr[5];
+ index_client = index;
+ return IPACM_SUCCESS;
+ }
+ }
+ }
+ return IPACM_FAILURE;
+}