diff options
| author | qctecmdr Service <qctecmdr@qualcomm.com> | 2018-05-25 06:11:55 -0700 |
|---|---|---|
| committer | Gerrit - the friendly Code Review server <code-review@localhost> | 2018-05-25 06:11:55 -0700 |
| commit | e725ea643992936e1f69089fd908d91e031b31aa (patch) | |
| tree | 3247f695d62d20cc700a224a9816b6262849adee | |
| parent | 6e6da7cff1b8fb2b836eb7b181c240d1ae4d9e33 (diff) | |
| parent | d486183d34da08fb886ca5eb66da65ead5235f8e (diff) | |
Merge "IPACM: support ipacm restart"
| -rw-r--r-- | ipacm/inc/IPACM_Config.h | 2 | ||||
| -rw-r--r-- | ipacm/inc/IPACM_OffloadManager.h | 4 | ||||
| -rw-r--r-- | ipacm/inc/IPACM_Wlan.h | 5 | ||||
| -rw-r--r-- | ipacm/src/Android.mk | 6 | ||||
| -rw-r--r-- | ipacm/src/IPACM_Lan.cpp | 4 | ||||
| -rw-r--r-- | ipacm/src/IPACM_Main.cpp | 34 | ||||
| -rw-r--r-- | ipacm/src/IPACM_OffloadManager.cpp | 101 | ||||
| -rw-r--r-- | ipacm/src/IPACM_Wlan.cpp | 30 |
8 files changed, 177 insertions, 9 deletions
diff --git a/ipacm/inc/IPACM_Config.h b/ipacm/inc/IPACM_Config.h index ec15b30..524f4ac 100644 --- a/ipacm/inc/IPACM_Config.h +++ b/ipacm/inc/IPACM_Config.h @@ -1,5 +1,5 @@ /* -Copyright (c) 2013-2016, The Linux Foundation. All rights reserved. +Copyright (c) 2013-2018, 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 diff --git a/ipacm/inc/IPACM_OffloadManager.h b/ipacm/inc/IPACM_OffloadManager.h index bade0aa..b319b04 100644 --- a/ipacm/inc/IPACM_OffloadManager.h +++ b/ipacm/inc/IPACM_OffloadManager.h @@ -110,6 +110,10 @@ private: int resetTetherStats(const char *upstream_name); +#ifdef FEATURE_IPACM_RESTART + int push_iface_up(const char *if_name, bool upstream); +#endif + static const char *DEVICE_NAME; /* cache the add_downstream events if netdev is not ready */ diff --git a/ipacm/inc/IPACM_Wlan.h b/ipacm/inc/IPACM_Wlan.h index 5fee0fa..94623f9 100644 --- a/ipacm/inc/IPACM_Wlan.h +++ b/ipacm/inc/IPACM_Wlan.h @@ -234,6 +234,11 @@ private: void handle_SCC_MCC_switch(ipa_ip_type); +#ifdef FEATURE_IPACM_RESTART + /*query wlan-clients */ + int ipa_query_wlan_client(); +#endif + }; diff --git a/ipacm/src/Android.mk b/ipacm/src/Android.mk index 2b2bd4b..0a7f2ed 100644 --- a/ipacm/src/Android.mk +++ b/ipacm/src/Android.mk @@ -9,6 +9,8 @@ BOARD_IPAv3_LIST += sdm845 BOARD_IPAv3_LIST += sdm710 BOARD_IPAv3_LIST += msmnile BOARD_IPAv3_LIST += $(MSMSTEPPE) +BOARD_IPACM_RESTART_LIST := sdm845 +BOARD_IPACM_RESTART_LIST += sdm710 ifneq ($(call is-board-platform-in-list,$(BOARD_PLATFORM_LIST)),true) ifneq (,$(filter $(QCOM_BOARD_PLATFORMS),$(TARGET_BOARD_PLATFORM))) @@ -35,6 +37,10 @@ ifeq ($(call is-board-platform-in-list,$(BOARD_IPAv3_LIST)),true) LOCAL_CFLAGS += -DFEATURE_IPA_V3 endif +ifeq ($(call is-board-platform-in-list,$(BOARD_IPACM_RESTART_LIST)),true) +LOCAL_CFLAGS += -DFEATURE_IPACM_RESTART +endif + filetoadd = bionic/libc/kernel/arch-arm/asm/posix_types.h LOCAL_CFLAGS += $(shell if [ -a $(filetoadd) ] ; then echo -include $(filetoadd) ; fi ;) filetoadd = bionic/libc/kernel/arch-arm/asm/byteorder.h diff --git a/ipacm/src/IPACM_Lan.cpp b/ipacm/src/IPACM_Lan.cpp index 71b397b..289044a 100644 --- a/ipacm/src/IPACM_Lan.cpp +++ b/ipacm/src/IPACM_Lan.cpp @@ -1,5 +1,5 @@ /* -Copyright (c) 2013-2017, The Linux Foundation. All rights reserved. +Copyright (c) 2013-2018, 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 @@ -537,7 +537,7 @@ void IPACM_Lan::event_callback(ipa_cm_event_id event, void *param) IPACMERR("IPA_HANDLE_WAN_UP_TETHER tether_if(%d), not valid (%d) ignore\n", data_wan_tether->if_index_tether, ipa_if_num); return; } -#else /* not offload rndis on WIFI mode on MSM targets sky*/ +#else /* not offload rndis on WIFI mode on MSM targets */ if (data_wan_tether->is_sta) { IPACMERR("Not support RNDIS offload on WIFI mode, dun install UL filter rules for WIFI mode\n"); diff --git a/ipacm/src/IPACM_Main.cpp b/ipacm/src/IPACM_Main.cpp index 55a3fd5..3fd68af 100644 --- a/ipacm/src/IPACM_Main.cpp +++ b/ipacm/src/IPACM_Main.cpp @@ -108,6 +108,13 @@ int ipa_get_if_index(char *if_name, int *if_index); IPACM_Neighbor *neigh; IPACM_IfaceManager *ifacemgr; + +#ifdef FEATURE_IPACM_RESTART +int ipa_reset(); +/* support ipacm restart */ +int ipa_query_wlan_client(); +#endif + #ifdef FEATURE_IPACM_HAL IPACM_OffloadManager* OffloadMng; HAL *hal; @@ -845,6 +852,11 @@ int main(int argc, char **argv) (void)argc; (void)argv; +#ifdef FEATURE_IPACM_RESTART + IPACMDBG_H("RESET IPA-HW rules\n"); + ipa_reset(); +#endif + neigh = new IPACM_Neighbor(); ifacemgr = new IPACM_IfaceManager(); #ifdef FEATURE_IPACM_HAL @@ -1048,3 +1060,25 @@ int ipa_get_if_index close(fd); return IPACM_SUCCESS; } + +#ifdef FEATURE_IPACM_RESTART +int ipa_reset() +{ + int fd = -1; + + if ((fd = open(IPA_DEVICE_NAME, O_RDWR)) < 0) { + IPACMERR("Failed opening %s.\n", IPA_DEVICE_NAME); + return IPACM_FAILURE; + } + + if (ioctl(fd, IPA_IOC_CLEANUP) < 0) { + IPACMERR("IOCTL IPA_IOC_CLEANUP call failed: %s \n", strerror(errno)); + close(fd); + return IPACM_FAILURE; + } + + IPACMDBG_H("send IPA_IOC_CLEANUP \n"); + close(fd); + return IPACM_SUCCESS; +} +#endif diff --git a/ipacm/src/IPACM_OffloadManager.cpp b/ipacm/src/IPACM_OffloadManager.cpp index 2ee48d3..12ee5ce 100644 --- a/ipacm/src/IPACM_OffloadManager.cpp +++ b/ipacm/src/IPACM_OffloadManager.cpp @@ -1,5 +1,5 @@ /* -Copyright (c) 2017, The Linux Foundation. All rights reserved. +Copyright (c) 2017-2018, 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 @@ -233,6 +233,12 @@ RET IPACM_OffloadManager::addDownstream(const char * downstream_name, const Pref if (cache_need) { IPACMDBG_H("addDownstream name(%s) currently not support in ipa \n", downstream_name); + +#ifdef FEATURE_IPACM_RESTART + /* add ipacm restart support */ + push_iface_up(downstream_name, false); +#endif + /* copy to the cache */ for(int i = 0; i < MAX_EVENT_CACHE ;i++) { @@ -366,7 +372,6 @@ RET IPACM_OffloadManager::setUpstream(const char *upstream_name, const Prefix& g for (index = 0; index < MAX_EVENT_CACHE; index++) { if (event_cache[index].valid == true && event_cache[index ].event == IPA_WAN_UPSTREAM_ROUTE_ADD_EVENT) { - event_cache[index].valid = false; memset(event_cache, 0, MAX_EVENT_CACHE*sizeof(framework_event_cache)); return SUCCESS; } @@ -404,6 +409,10 @@ RET IPACM_OffloadManager::setUpstream(const char *upstream_name, const Prefix& g if (cache_need) { IPACMDBG_H("setUpstream name(%s) currently not support in ipa \n", upstream_name); +#ifdef FEATURE_IPACM_RESTART + /* add ipacm restart support */ + push_iface_up(upstream_name, true); +#endif /* copy to the cache */ for(int i = 0; i < MAX_EVENT_CACHE ;i++) { @@ -416,7 +425,7 @@ RET IPACM_OffloadManager::setUpstream(const char *upstream_name, const Prefix& g memcpy(&event_cache[latest_cache_index].prefix_cache, &gw_addr_v4, sizeof(event_cache[latest_cache_index].prefix_cache)); memcpy(&event_cache[latest_cache_index].prefix_cache_v6, &gw_addr_v6, sizeof(event_cache[latest_cache_index].prefix_cache_v6)); if (gw_addr_v4.fam == V4) { - IPACMDBG_H("cache event(%d) ipv4 fateway: (%x) dev(%s) on entry (%d)\n", + IPACMDBG_H("cache event(%d) ipv4 gateway: (%x) dev(%s) on entry (%d)\n", event_cache[latest_cache_index].event, event_cache[latest_cache_index].prefix_cache.v4Addr, event_cache[latest_cache_index].dev_name, @@ -738,7 +747,6 @@ int IPACM_OffloadManager::resetTetherStats(const char * upstream_name /* upstrea return FAIL_INPUT_CHECK; } stats.reset_stats = true; - if (ioctl(fd, WAN_IOC_RESET_TETHER_STATS, &stats) < 0) { IPACMERR("IOCTL WAN_IOC_RESET_TETHER_STATS call failed: %s", strerror(errno)); close(fd); @@ -789,3 +797,88 @@ bool IPACM_OffloadManager::search_framwork_cache(char * interface_name) IPACMDBG_H(" not found netdev (%s) has cached event\n", interface_name); return rel; } + +#ifdef FEATURE_IPACM_RESTART +int IPACM_OffloadManager::push_iface_up(const char * if_name, bool upstream) +{ + ipacm_cmd_q_data evt_data; + ipacm_event_data_fid *data_fid; + ipacm_event_data_mac *data = NULL; + int index; + + IPACMDBG_H("name %s, upstream %d\n", + if_name, upstream); + + if(ipa_get_if_index(if_name, &index)) + { + IPACMERR("netdev(%s) not registered ignored\n", if_name); + return SUCCESS; + } + + if(strncmp(if_name, "rmnet_data", 10) == 0 && upstream) + { + data_fid = (ipacm_event_data_fid *)malloc(sizeof(ipacm_event_data_fid)); + if(data_fid == NULL) + { + IPACMERR("unable to allocate memory for event data_fid\n"); + return FAIL_HARDWARE; + } + data_fid->if_index = index; + evt_data.event = IPA_LINK_UP_EVENT; + evt_data.evt_data = data_fid; + IPACMDBG_H("Posting IPA_LINK_UP_EVENT with if index: %d\n", + data_fid->if_index); + IPACM_EvtDispatcher::PostEvt(&evt_data); + } + + if(strncmp(if_name, "rndis", 5) == 0 && !upstream) + { + data_fid = (ipacm_event_data_fid *)malloc(sizeof(ipacm_event_data_fid)); + if(data_fid == NULL) + { + IPACMERR("unable to allocate memory for event data_fid\n"); + return FAIL_HARDWARE; + } + data_fid->if_index = index; + evt_data.event = IPA_USB_LINK_UP_EVENT; + evt_data.evt_data = data_fid; + IPACMDBG_H("Posting usb IPA_LINK_UP_EVENT with if index: %d\n", + data_fid->if_index); + IPACM_EvtDispatcher::PostEvt(&evt_data); + } + + if((strncmp(if_name, "softap", 6) == 0 || strncmp(if_name, "wlan", 4) == 0 ) && !upstream) + { + data_fid = (ipacm_event_data_fid *)malloc(sizeof(ipacm_event_data_fid)); + if(data_fid == NULL) + { + IPACMERR("unable to allocate memory for event data_fid\n"); + return FAIL_HARDWARE; + } + data_fid->if_index = index; + evt_data.event = IPA_WLAN_AP_LINK_UP_EVENT; + evt_data.evt_data = data_fid; + IPACMDBG_H("Posting IPA_WLAN_AP_LINK_UP_EVENT with if index: %d\n", + data_fid->if_index); + IPACM_EvtDispatcher::PostEvt(&evt_data); + } + + if(strncmp(if_name, "wlan", 4) == 0 && upstream) + { + data = (ipacm_event_data_mac *)malloc(sizeof(ipacm_event_data_mac)); + if(data == NULL) + { + IPACMERR("unable to allocate memory for event_wlan data\n"); + return FAIL_HARDWARE; + } + data->if_index = index; + evt_data.event = IPA_WLAN_STA_LINK_UP_EVENT; + evt_data.evt_data = data; + IPACMDBG_H("Posting IPA_WLAN_STA_LINK_UP_EVENT with if index: %d\n", + data_fid->if_index); + IPACM_EvtDispatcher::PostEvt(&evt_data); + } + + return IPACM_SUCCESS; +} +#endif diff --git a/ipacm/src/IPACM_Wlan.cpp b/ipacm/src/IPACM_Wlan.cpp index 666ee10..4925e1c 100644 --- a/ipacm/src/IPACM_Wlan.cpp +++ b/ipacm/src/IPACM_Wlan.cpp @@ -1,5 +1,5 @@ /* -Copyright (c) 2013-2017, The Linux Foundation. All rights reserved. +Copyright (c) 2013-2018, 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 @@ -267,6 +267,10 @@ void IPACM_Wlan::event_callback(ipa_cm_event_id event, void *param) IPACMDBG_H("IPv4 address:0x%x, IPv4 address mask:0x%x\n", info->ipv4_addr, info->addr_mask); IPACM_EvtDispatcher::PostEvt(&evt_data); +#ifdef FEATURE_IPACM_RESTART + /* Query wlan-clients */ + ipa_query_wlan_client(); +#endif } if(handle_addr_evt(data) == IPACM_FAILURE) @@ -557,7 +561,7 @@ void IPACM_Wlan::event_callback(ipa_cm_event_id event, void *param) memcpy(&prefix[data->prefix.iptype], &data->prefix, sizeof(prefix[data->prefix.iptype])); - if(is_upstream_set[data->prefix.iptype] == true) + if (is_upstream_set[data->prefix.iptype] == true) { IPACMDBG_H("Upstream was set before, adding modem UL rules.\n"); if(ip_type == IPA_IP_MAX || ip_type == data->prefix.iptype) @@ -2246,6 +2250,28 @@ void IPACM_Wlan::handle_SCC_MCC_switch(ipa_ip_type iptype) return; } +#ifdef FEATURE_IPACM_RESTART +int IPACM_Wlan::ipa_query_wlan_client() +{ + int fd = -1; + + if ((fd = open(IPA_DEVICE_NAME, O_RDWR)) < 0) { + IPACMERR("Failed opening %s.\n", IPA_DEVICE_NAME); + return IPACM_FAILURE; + } + + if (ioctl(fd, IPA_IOC_QUERY_WLAN_CLIENT) < 0) { + IPACMERR("IOCTL IPA_IOC_QUERY_WLAN_CLIENT call failed: %s \n", strerror(errno)); + close(fd); + return IPACM_FAILURE; + } + + IPACMDBG_H("send IPA_IOC_QUERY_WLAN_CLIENT \n"); + close(fd); + return IPACM_SUCCESS; +} +#endif + void IPACM_Wlan::eth_bridge_handle_wlan_mode_switch() { uint32_t i; |
