From 6a18e1841637b61bb0e923d1a63c348a5064cd40 Mon Sep 17 00:00:00 2001 From: coolsnowwolf Date: Fri, 23 Jul 2021 16:59:44 +0800 Subject: [PATCH] ipq806x: add quantenna 5G wifi support for E8350/R7500v1 --- package/firmware/quantenna/BUGS.md | 53 - package/firmware/quantenna/Makefile | 35 +- .../firmware/quantenna/files/qtn-wifi.init | 70 + package/firmware/quantenna/src/Makefile | 88 + package/firmware/quantenna/src/call_qcsapi.c | 23535 ++++++++++++++ package/firmware/quantenna/src/call_qcsapi.h | 52 + .../src/common/client/find_host_addr.h | 52 + .../quantenna/src/common/client/qftc.h | 8 + .../quantenna/src/common/common_mem.h | 268 + .../quantenna/src/common/current_platform.h | 8 + .../firmware/quantenna/src/common/rpc_pci.h | 14 + .../quantenna/src/common/rpc_pci_nlm.h | 26 + .../firmware/quantenna/src/common/rpc_raw.h | 94 + .../quantenna/src/common/ruby_config.h | 182 + .../firmware/quantenna/src/common/ruby_mem.h | 532 + .../firmware/quantenna/src/common/ruby_pm.h | 160 + .../quantenna/src/common/topaz_config.h | 189 + .../quantenna/src/common/uboot_header.h | 69 + package/firmware/quantenna/src/compat.h | 135 + .../src/drivers/pcie/host/cavium/Makefile | 50 + .../drivers/pcie/host/cavium/qdpc_cvm_dma.c | 159 + .../drivers/pcie/host/cavium/qdpc_platform.c | 57 + .../drivers/pcie/host/cavium/qdpc_platform.h | 48 + .../src/drivers/pcie/host/common/qdpc_init.c | 547 + .../src/drivers/pcie/host/common/qdpc_init.h | 168 + .../src/drivers/pcie/host/common/qdpc_net.c | 771 + .../src/drivers/pcie/host/common/qdpc_pcie.c | 496 + .../src/drivers/pcie/host/common/qdpc_regs.h | 29 + .../src/drivers/pcie/host/common/qdpc_ring.c | 207 + .../src/drivers/pcie/host/intel/Makefile | 34 + .../drivers/pcie/host/intel/qdpc_platform.h | 39 + .../src/drivers/pcie/host/lantiq/Makefile | 24 + .../drivers/pcie/host/lantiq/qdpc_platform.h | 39 + .../src/drivers/pcie/host/quantenna/Makefile | 57 + .../pcie/host/quantenna/qdpc_platform.h | 39 + .../src/drivers/pcie/include/qdpc_config.h | 373 + .../src/drivers/pcie/include/qdpc_debug.h | 54 + .../src/drivers/pcie/include/qdpc_ruby.h | 68 + .../src/drivers/pcie/include/queue.h | 561 + .../src/drivers/pcie/target/Makefile | 57 + .../src/drivers/pcie/target/qdpc_emac.c | 405 + .../src/drivers/pcie/target/qdpc_emac.h | 316 + .../src/drivers/pcie/target/qdpc_init.c | 237 + .../src/drivers/pcie/target/qdpc_init.h | 123 + .../src/drivers/pcie/target/qdpc_net.c | 668 + .../src/drivers/pcie/target/qdpc_pcie.c | 460 + .../src/drivers/pcie/target/qdpc_regs.h | 28 + .../src/drivers/pcie/target/qdpc_ring.c | 160 + .../src/drivers/pcie2/host/arm/Makefile | 30 + .../drivers/pcie2/host/arm/qdpc_platform.c | 75 + .../drivers/pcie2/host/arm/qdpc_platform.h | 101 + .../src/drivers/pcie2/host/common/qdpc_init.c | 887 + .../src/drivers/pcie2/host/common/qdpc_init.h | 119 + .../src/drivers/pcie2/host/common/qdpc_pcie.c | 356 + .../src/drivers/pcie2/host/common/qdpc_regs.h | 56 + .../drivers/pcie2/host/common/topaz_vnet.c | 1633 + .../drivers/pcie2/host/common/topaz_vnet.h | 242 + .../src/drivers/pcie2/host/intel/Makefile | 33 + .../drivers/pcie2/host/intel/qdpc_platform.c | 102 + .../drivers/pcie2/host/intel/qdpc_platform.h | 91 + .../src/drivers/pcie2/host/mipsr2/Makefile | 30 + .../drivers/pcie2/host/mipsr2/qdpc_platform.c | 74 + .../drivers/pcie2/host/mipsr2/qdpc_platform.h | 101 + .../src/drivers/pcie2/host/quantenna/Makefile | 67 + .../pcie2/host/quantenna/qdpc_dspload.c | 169 + .../pcie2/host/quantenna/qdpc_dspload.h | 62 + .../pcie2/host/quantenna/qdpc_platform.c | 360 + .../pcie2/host/quantenna/qdpc_platform.h | 110 + .../src/drivers/pcie2/host/st/Makefile | 28 + .../src/drivers/pcie2/host/st/qdpc_platform.c | 72 + .../src/drivers/pcie2/host/st/qdpc_platform.h | 101 + .../src/drivers/pcie2/include/qdpc_config.h | 66 + .../src/drivers/pcie2/include/qdpc_debug.h | 65 + .../src/drivers/pcie2/include/qdpc_version.h | 1 + .../src/drivers/pcie2/include/ruby_pcie_bda.h | 136 + .../src/drivers/pcie2/include/topaz_netcom.h | 51 + .../quantenna/src/net80211/_ieee80211.h | 1385 + .../quantenna/src/net80211/ieee80211.h | 3709 +++ .../quantenna/src/net80211/ieee80211_crypto.h | 211 + .../src/net80211/ieee80211_dfs_reentry.h | 33 + .../quantenna/src/net80211/ieee80211_ioctl.h | 1756 + .../quantenna/src/net80211/ieee80211_qos.h | 25 + package/firmware/quantenna/src/qcsapi.h | 15595 +++++++++ .../firmware/quantenna/src/qcsapi_driver.c | 2545 ++ .../firmware/quantenna/src/qcsapi_driver.h | 740 + .../firmware/quantenna/src/qcsapi_output.c | 144 + .../firmware/quantenna/src/qcsapi_output.h | 98 + .../client/pcie/qcsapi_pcie_rpc_client.c | 77 + .../src/qcsapi_rpc/client/qcsapi_rpc_client.h | 61 + .../client/socket/qcsapi_socket_rpc_client.c | 113 + .../socket_raw/qcsapi_socketraw_rpc_client.c | 88 + .../src/qcsapi_rpc/generated/qcsapi_rpc.h | 8401 +++++ .../generated/qcsapi_rpc_clnt_adapter.c | 27019 ++++++++++++++++ .../src/qcsapi_rpc/generated/qcsapi_rpc_xdr.c | 9163 ++++++ .../qcsapi_rpc_common/client/find_host_addr.c | 157 + .../qcsapi_rpc_common/client/find_host_addr.h | 52 + .../src/qcsapi_rpc_common/client/qftc.c | 227 + .../src/qcsapi_rpc_common/client/qftc.h | 8 + .../qcsapi_rpc_common/client/rpc_pci_clnt.c | 504 + .../qcsapi_rpc_common/client/rpc_raw_clnt.c | 358 + .../src/qcsapi_rpc_common/common/rpc_pci.h | 14 + .../qcsapi_rpc_common/common/rpc_pci_nlm.h | 26 + .../src/qcsapi_rpc_common/common/rpc_raw.c | 147 + .../src/qcsapi_rpc_common/common/rpc_raw.h | 94 + .../qcsapi_rpc_sample/c_rpc_qcsapi_sample.c | 303 + package/firmware/quantenna/src/qcsapi_sem.c | 160 + package/firmware/quantenna/src/qcsapi_sem.h | 67 + package/firmware/quantenna/src/qcsapi_util.c | 148 + package/firmware/quantenna/src/qcsapi_util.h | 50 + .../quantenna/src/qtn/lhost_muc_comm.h | 976 + .../quantenna/src/qtn/muc_share_def.h | 21 + .../quantenna/src/qtn/muc_txrx_stats.h | 928 + package/firmware/quantenna/src/qtn/qtn_cca.h | 19 + .../firmware/quantenna/src/qtn/qtn_config.h | 52 + .../firmware/quantenna/src/qtn/qtn_debug.h | 244 + .../firmware/quantenna/src/qtn/qtn_uc_comm.h | 27 + package/firmware/quantenna/src/qtn/qtn_vlan.h | 128 + .../firmware/quantenna/src/qtn/qtn_wmm_ac.h | 74 + .../firmware/quantenna/src/qtn/qvsp_common.h | 36 + .../firmware/quantenna/src/qtn/qvsp_data.h | 641 + .../firmware/quantenna/src/qtn/shared_defs.h | 674 + .../quantenna/src/qtn/shared_defs_common.h | 149 + .../firmware/quantenna/src/qtn/wlan_ioctl.h | 39 + .../quantenna/src/topaz-linux.lzma.img | Bin 0 -> 4505876 bytes package/firmware/quantenna/src/u-boot.bin | Bin 0 -> 70756 bytes .../base-files/lib/upgrade/platform.sh | 4 +- target/linux/ipq806x/image/Makefile | 4 +- 127 files changed, 114468 insertions(+), 88 deletions(-) delete mode 100644 package/firmware/quantenna/BUGS.md create mode 100644 package/firmware/quantenna/files/qtn-wifi.init create mode 100644 package/firmware/quantenna/src/Makefile create mode 100644 package/firmware/quantenna/src/call_qcsapi.c create mode 100644 package/firmware/quantenna/src/call_qcsapi.h create mode 100644 package/firmware/quantenna/src/common/client/find_host_addr.h create mode 100644 package/firmware/quantenna/src/common/client/qftc.h create mode 100644 package/firmware/quantenna/src/common/common_mem.h create mode 100644 package/firmware/quantenna/src/common/current_platform.h create mode 100644 package/firmware/quantenna/src/common/rpc_pci.h create mode 100644 package/firmware/quantenna/src/common/rpc_pci_nlm.h create mode 100644 package/firmware/quantenna/src/common/rpc_raw.h create mode 100644 package/firmware/quantenna/src/common/ruby_config.h create mode 100644 package/firmware/quantenna/src/common/ruby_mem.h create mode 100644 package/firmware/quantenna/src/common/ruby_pm.h create mode 100644 package/firmware/quantenna/src/common/topaz_config.h create mode 100644 package/firmware/quantenna/src/common/uboot_header.h create mode 100644 package/firmware/quantenna/src/compat.h create mode 100644 package/firmware/quantenna/src/drivers/pcie/host/cavium/Makefile create mode 100644 package/firmware/quantenna/src/drivers/pcie/host/cavium/qdpc_cvm_dma.c create mode 100644 package/firmware/quantenna/src/drivers/pcie/host/cavium/qdpc_platform.c create mode 100644 package/firmware/quantenna/src/drivers/pcie/host/cavium/qdpc_platform.h create mode 100644 package/firmware/quantenna/src/drivers/pcie/host/common/qdpc_init.c create mode 100644 package/firmware/quantenna/src/drivers/pcie/host/common/qdpc_init.h create mode 100644 package/firmware/quantenna/src/drivers/pcie/host/common/qdpc_net.c create mode 100644 package/firmware/quantenna/src/drivers/pcie/host/common/qdpc_pcie.c create mode 100644 package/firmware/quantenna/src/drivers/pcie/host/common/qdpc_regs.h create mode 100644 package/firmware/quantenna/src/drivers/pcie/host/common/qdpc_ring.c create mode 100644 package/firmware/quantenna/src/drivers/pcie/host/intel/Makefile create mode 100644 package/firmware/quantenna/src/drivers/pcie/host/intel/qdpc_platform.h create mode 100755 package/firmware/quantenna/src/drivers/pcie/host/lantiq/Makefile create mode 100755 package/firmware/quantenna/src/drivers/pcie/host/lantiq/qdpc_platform.h create mode 100644 package/firmware/quantenna/src/drivers/pcie/host/quantenna/Makefile create mode 100644 package/firmware/quantenna/src/drivers/pcie/host/quantenna/qdpc_platform.h create mode 100644 package/firmware/quantenna/src/drivers/pcie/include/qdpc_config.h create mode 100644 package/firmware/quantenna/src/drivers/pcie/include/qdpc_debug.h create mode 100644 package/firmware/quantenna/src/drivers/pcie/include/qdpc_ruby.h create mode 100755 package/firmware/quantenna/src/drivers/pcie/include/queue.h create mode 100644 package/firmware/quantenna/src/drivers/pcie/target/Makefile create mode 100644 package/firmware/quantenna/src/drivers/pcie/target/qdpc_emac.c create mode 100644 package/firmware/quantenna/src/drivers/pcie/target/qdpc_emac.h create mode 100644 package/firmware/quantenna/src/drivers/pcie/target/qdpc_init.c create mode 100644 package/firmware/quantenna/src/drivers/pcie/target/qdpc_init.h create mode 100644 package/firmware/quantenna/src/drivers/pcie/target/qdpc_net.c create mode 100644 package/firmware/quantenna/src/drivers/pcie/target/qdpc_pcie.c create mode 100644 package/firmware/quantenna/src/drivers/pcie/target/qdpc_regs.h create mode 100644 package/firmware/quantenna/src/drivers/pcie/target/qdpc_ring.c create mode 100644 package/firmware/quantenna/src/drivers/pcie2/host/arm/Makefile create mode 100644 package/firmware/quantenna/src/drivers/pcie2/host/arm/qdpc_platform.c create mode 100644 package/firmware/quantenna/src/drivers/pcie2/host/arm/qdpc_platform.h create mode 100644 package/firmware/quantenna/src/drivers/pcie2/host/common/qdpc_init.c create mode 100644 package/firmware/quantenna/src/drivers/pcie2/host/common/qdpc_init.h create mode 100644 package/firmware/quantenna/src/drivers/pcie2/host/common/qdpc_pcie.c create mode 100644 package/firmware/quantenna/src/drivers/pcie2/host/common/qdpc_regs.h create mode 100644 package/firmware/quantenna/src/drivers/pcie2/host/common/topaz_vnet.c create mode 100644 package/firmware/quantenna/src/drivers/pcie2/host/common/topaz_vnet.h create mode 100644 package/firmware/quantenna/src/drivers/pcie2/host/intel/Makefile create mode 100644 package/firmware/quantenna/src/drivers/pcie2/host/intel/qdpc_platform.c create mode 100644 package/firmware/quantenna/src/drivers/pcie2/host/intel/qdpc_platform.h create mode 100644 package/firmware/quantenna/src/drivers/pcie2/host/mipsr2/Makefile create mode 100644 package/firmware/quantenna/src/drivers/pcie2/host/mipsr2/qdpc_platform.c create mode 100644 package/firmware/quantenna/src/drivers/pcie2/host/mipsr2/qdpc_platform.h create mode 100644 package/firmware/quantenna/src/drivers/pcie2/host/quantenna/Makefile create mode 100644 package/firmware/quantenna/src/drivers/pcie2/host/quantenna/qdpc_dspload.c create mode 100644 package/firmware/quantenna/src/drivers/pcie2/host/quantenna/qdpc_dspload.h create mode 100644 package/firmware/quantenna/src/drivers/pcie2/host/quantenna/qdpc_platform.c create mode 100644 package/firmware/quantenna/src/drivers/pcie2/host/quantenna/qdpc_platform.h create mode 100644 package/firmware/quantenna/src/drivers/pcie2/host/st/Makefile create mode 100644 package/firmware/quantenna/src/drivers/pcie2/host/st/qdpc_platform.c create mode 100644 package/firmware/quantenna/src/drivers/pcie2/host/st/qdpc_platform.h create mode 100644 package/firmware/quantenna/src/drivers/pcie2/include/qdpc_config.h create mode 100644 package/firmware/quantenna/src/drivers/pcie2/include/qdpc_debug.h create mode 100644 package/firmware/quantenna/src/drivers/pcie2/include/qdpc_version.h create mode 100644 package/firmware/quantenna/src/drivers/pcie2/include/ruby_pcie_bda.h create mode 100644 package/firmware/quantenna/src/drivers/pcie2/include/topaz_netcom.h create mode 100644 package/firmware/quantenna/src/net80211/_ieee80211.h create mode 100644 package/firmware/quantenna/src/net80211/ieee80211.h create mode 100644 package/firmware/quantenna/src/net80211/ieee80211_crypto.h create mode 100644 package/firmware/quantenna/src/net80211/ieee80211_dfs_reentry.h create mode 100644 package/firmware/quantenna/src/net80211/ieee80211_ioctl.h create mode 100644 package/firmware/quantenna/src/net80211/ieee80211_qos.h create mode 100644 package/firmware/quantenna/src/qcsapi.h create mode 100644 package/firmware/quantenna/src/qcsapi_driver.c create mode 100644 package/firmware/quantenna/src/qcsapi_driver.h create mode 100644 package/firmware/quantenna/src/qcsapi_output.c create mode 100644 package/firmware/quantenna/src/qcsapi_output.h create mode 100644 package/firmware/quantenna/src/qcsapi_rpc/client/pcie/qcsapi_pcie_rpc_client.c create mode 100644 package/firmware/quantenna/src/qcsapi_rpc/client/qcsapi_rpc_client.h create mode 100644 package/firmware/quantenna/src/qcsapi_rpc/client/socket/qcsapi_socket_rpc_client.c create mode 100644 package/firmware/quantenna/src/qcsapi_rpc/client/socket_raw/qcsapi_socketraw_rpc_client.c create mode 100644 package/firmware/quantenna/src/qcsapi_rpc/generated/qcsapi_rpc.h create mode 100644 package/firmware/quantenna/src/qcsapi_rpc/generated/qcsapi_rpc_clnt_adapter.c create mode 100644 package/firmware/quantenna/src/qcsapi_rpc/generated/qcsapi_rpc_xdr.c create mode 100644 package/firmware/quantenna/src/qcsapi_rpc_common/client/find_host_addr.c create mode 100644 package/firmware/quantenna/src/qcsapi_rpc_common/client/find_host_addr.h create mode 100644 package/firmware/quantenna/src/qcsapi_rpc_common/client/qftc.c create mode 100644 package/firmware/quantenna/src/qcsapi_rpc_common/client/qftc.h create mode 100644 package/firmware/quantenna/src/qcsapi_rpc_common/client/rpc_pci_clnt.c create mode 100644 package/firmware/quantenna/src/qcsapi_rpc_common/client/rpc_raw_clnt.c create mode 100644 package/firmware/quantenna/src/qcsapi_rpc_common/common/rpc_pci.h create mode 100644 package/firmware/quantenna/src/qcsapi_rpc_common/common/rpc_pci_nlm.h create mode 100644 package/firmware/quantenna/src/qcsapi_rpc_common/common/rpc_raw.c create mode 100644 package/firmware/quantenna/src/qcsapi_rpc_common/common/rpc_raw.h create mode 100755 package/firmware/quantenna/src/qcsapi_rpc_sample/c_rpc_qcsapi_sample.c create mode 100644 package/firmware/quantenna/src/qcsapi_sem.c create mode 100644 package/firmware/quantenna/src/qcsapi_sem.h create mode 100644 package/firmware/quantenna/src/qcsapi_util.c create mode 100644 package/firmware/quantenna/src/qcsapi_util.h create mode 100644 package/firmware/quantenna/src/qtn/lhost_muc_comm.h create mode 100755 package/firmware/quantenna/src/qtn/muc_share_def.h create mode 100644 package/firmware/quantenna/src/qtn/muc_txrx_stats.h create mode 100644 package/firmware/quantenna/src/qtn/qtn_cca.h create mode 100644 package/firmware/quantenna/src/qtn/qtn_config.h create mode 100644 package/firmware/quantenna/src/qtn/qtn_debug.h create mode 100644 package/firmware/quantenna/src/qtn/qtn_uc_comm.h create mode 100644 package/firmware/quantenna/src/qtn/qtn_vlan.h create mode 100644 package/firmware/quantenna/src/qtn/qtn_wmm_ac.h create mode 100644 package/firmware/quantenna/src/qtn/qvsp_common.h create mode 100644 package/firmware/quantenna/src/qtn/qvsp_data.h create mode 100644 package/firmware/quantenna/src/qtn/shared_defs.h create mode 100644 package/firmware/quantenna/src/qtn/shared_defs_common.h create mode 100644 package/firmware/quantenna/src/qtn/wlan_ioctl.h create mode 100755 package/firmware/quantenna/src/topaz-linux.lzma.img create mode 100755 package/firmware/quantenna/src/u-boot.bin diff --git a/package/firmware/quantenna/BUGS.md b/package/firmware/quantenna/BUGS.md deleted file mode 100644 index a8d50fc35..000000000 --- a/package/firmware/quantenna/BUGS.md +++ /dev/null @@ -1,53 +0,0 @@ -# Known Quantenna firmware bugs # - -This is an attempt to document Quantenna firmware bugs, explaining strange -implemtation details in this OpenWrt package and also hopefully helping -anyone else trying to get this mess to work... - -## Quantenna switch and VLANs ## - -Mapping WiFi VIFs to VLANs has a horrible side effect: Traffic from the -Quantenna SoC, like the RPC responses, is tagged with the last used VLAN. - -The tag depends on Wireless client activity! I.e it is unpredictable. - -And even if it were predictable: The module does not accept tagged RPC -calls or other management traffic. The RPC requests must be sent -untagged even if the module responds with an arbitrary tag... - -The switch state is not reset on either Quantenna module reboot by RPC -call, or reset by GPIO. The VLAN issue affects the bootloader, -making the module fail to load the second stage bootloader and OS over -tftp because of the VLAN tag mismatch. - -Full power cycling is necessary to reset the Quantenna switch to -non-tagging. There is no known software controllable reset method. - -### Workaround ### - -Playing with static and gratuitous ARPs, in combination with VLAN -interfaces accepting local traffic works pretty well. - -But this does not solve the reboot issue, caused by the switch bug -being persistent over reset. The two U-Boot stages will switch mac -addresses up to 3 times during module reboot. The final address is -often dynamically allocated, changing for each boot. This makes it -hard to manage a static ARP entry. - -Using "tc" to pop the VLAN tag of any tagged IP and ARP packets for -our management address works perfectly. - - -## Using bootloader environment ## - -The Quantenna bootloader environment is ignored by the firmware unless -/scripts/build_config contains STATELESS=Y. This is a build time -setting, which is not set by the Netgear firmware we use. - -The implications is that the module will use different mac adresses -etc compared to an OEM firmware with STATELESS=Y. - -This should not be considered a bug, but is an issue caused by our -choice of a common Quantenna firmware image for all hosts with such a -module. - diff --git a/package/firmware/quantenna/Makefile b/package/firmware/quantenna/Makefile index 0f798f6fc..8795bda99 100644 --- a/package/firmware/quantenna/Makefile +++ b/package/firmware/quantenna/Makefile @@ -9,30 +9,9 @@ include $(TOPDIR)/rules.mk PKG_NAME:=quantenna PKG_VERSION:=37.3.2.44 -PKG_RELEASE:=1 +PKG_RELEASE:=6 -PKG_MAINTAINER:=Bjørn Mork - -# available versions, ref https://kb.netgear.com/2649/NETGEAR-Open-Source-Code-for-Programmers-GPL -# qtn sdk v36.6.0.23: 1.0.0.46, -# qtn sdk v36.6.0.28: 1.0.0.52, -# qtn sdk v36.6.0.30: 1.0.0.68, 1.0.0.70, -# qtn sdk v36.7.3.23: 1.0.0.76, 1.0.0.82, -# qtn sdk v37.3.1.25: 1.0.0.94, 1.0.0.108, 1.0.0.110 , 1.0.0.112, 1.0.0.116, 1.0.0.122, -# qtn sdk v37.3.2.44: 1.0.0.124 - -NETGEAR_R7500V1_SRC-37.3.2.44=R7500-and_qtn_gpl_src_v1.0.0.124.tar.bz2.zip - -NETGEAR_R7500V1_HASH-37.3.2.44=6592e3286c66a8b0ba689e6cff2d10cac5aea3ddef8ca8746d7771319e47112e - -PKG_SOURCE:=$(NETGEAR_R7500V1_SRC-$(strip $(PKG_VERSION))) -PKG_SOURCE_URL:=https://www.downloads.netgear.com/files/GPL -PKG_HASH:=$(NETGEAR_R7500V1_HASH-$(strip $(PKG_VERSION))) - -QCSAPI_ARCHIVE-37.3.2.44=quantenna_gpl_v$(PKG_VERSION).tar.bz2 - -UNPACK_CMD-37.3.2.44=unzip -q -p $(DL_DIR)/$(PKG_SOURCE) | bzcat | $(HOST_TAR) -C $(PKG_BUILD_DIR) $(TAR_OPTIONS) -UNPACK_CMD=$(UNPACK_CMD-$(strip $(PKG_VERSION))) +PKG_MAINTAINER:=lean PKG_BUILD_DEPENDS:=libtirpc @@ -40,14 +19,7 @@ include $(INCLUDE_DIR)/kernel.mk include $(INCLUDE_DIR)/package.mk define Build/Prepare - $(PKG_UNPACK) - bzcat $(PKG_BUILD_DIR)/$(QCSAPI_ARCHIVE-$(strip $(PKG_VERSION))) | \ - $(HOST_TAR) -C $(PKG_BUILD_DIR) $(TAR_OPTIONS) --strip-components=1 \ - --wildcards */libqcsapi_client_src.zip --wildcards *drivers/pcie2* - bzcat $(PKG_BUILD_DIR)/R7500-*.tar.bz2 | \ - $(HOST_TAR) -C $(PKG_BUILD_DIR) $(TAR_OPTIONS) --strip-components=4 \ - --wildcards */package/qt-wireless/binary/{topaz-linux.lzma.img,u-boot.bin} - unzip -q -d $(PKG_BUILD_DIR) $(PKG_BUILD_DIR)/libqcsapi_client_src.zip + $(CP) ./src/* $(PKG_BUILD_DIR)/ # tunning to make the same patch apply to versions with or without -fstrict-aliasing sed -i -e 's/ -fstrict-aliasing//' $(PKG_BUILD_DIR)/Makefile $(Build/Patch) @@ -82,6 +54,7 @@ define Package/qtn-utils/install $(INSTALL_BIN) $(PKG_BUILD_DIR)/qcsapi_sockrpc $(1)/usr/sbin/ ln -s /tmp/qcsapi_target_ip.conf $(1)/etc $(INSTALL_BIN) ./files/qtn-utils.init $(1)/etc/init.d/qtn-utils + $(INSTALL_BIN) ./files/qtn-wifi.init $(1)/etc/init.d/qtn-wifi endef define Package/qtn-firmware diff --git a/package/firmware/quantenna/files/qtn-wifi.init b/package/firmware/quantenna/files/qtn-wifi.init new file mode 100644 index 000000000..9f38ca95a --- /dev/null +++ b/package/firmware/quantenna/files/qtn-wifi.init @@ -0,0 +1,70 @@ +#!/bin/sh /etc/rc.common + +START=99 +STOP=10 + +NAME=qtn-wifi + +start() +{ +########################################### +### 5G Quantenna wifi ### +### INITIALIZATION part - do not edit ### +########################################### +# run automatically on start-up modprobe qdpc-host +COUNT=0 +WIFI_INIT=`dmesg |grep -c "Connection established with Target BBIC4 board"` +while [ "$WIFI_INIT" = "0" ] ;do + sleep 1 + WIFI_INIT=`dmesg |grep -c "Connection established with Target BBIC4 board"` + let COUNT+=1 + if [ "$COUNT" -gt 60 ];then + logger "Error 1 in 5G wifi pcie2 firmware initialization" + exit 1 + break + fi +done + +# start wifi configuration and start wifi +ifconfig host0 1.1.1.1 netmask 255.255.255.252 up +echo "1.1.1.2" > /tmp/qcsapi_target_ip.conf +wifi config +uci set wireless.radio1.disabled=0 +uci commit +wifi +sleep 5 +####################################### +### END 5g wifi initialization part ### +####################################### + + + +########################################### +### WIFI CONFIGURATION ### +### edit below this line on your taste ### +########################################### +SSID="OpenWrt-5G" +WPAPASS="12345678" +CHANNEL="149" +TXPOWER=22 + +WIFIDEV=`qcsapi_sockrpc get_primary_interface` +qcsapi_sockrpc get_primary_interface +qcsapi_sockrpc get_regulatory_region "$WIFIDEV" +qcsapi_sockrpc set_regulatory_region "$WIFIDEV" us +qcsapi_sockrpc get_scs_report "$WIFIDEV" all +qcsapi_sockrpc get_channel "$WIFIDEV" +qcsapi_sockrpc set_channel "$WIFIDEV" "$CHANNEL" +qcsapi_sockrpc set_bw "$WIFIDEV" 80 +qcsapi_sockrpc get_tx_power "$WIFIDEV" "$CHANNEL" +qcsapi_sockrpc set_tx_power "$WIFIDEV" "$CHANNEL" "$TXPOWER" +qcsapi_sockrpc -u -q set_option "$WIFIDEV" 802_11h 1 + +qcsapi_sockrpc set_ssid "$WIFIDEV" "$SSID" +qcsapi_sockrpc set_beacon "$WIFIDEV" 11i # WPA2 AES only +qcsapi_sockrpc set_option "$WIFIDEV" SSID_broadcast 1 +qcsapi_sockrpc set_WPA_authentication_mode "$WIFIDEV" PSKAuthentication +qcsapi_sockrpc set_WPA_encryption_modes "$WIFIDEV" AESEncryption +qcsapi_sockrpc set_passphrase "$WIFIDEV" 0 "$WPAPASS" + +} \ No newline at end of file diff --git a/package/firmware/quantenna/src/Makefile b/package/firmware/quantenna/src/Makefile new file mode 100644 index 000000000..1ad9e360f --- /dev/null +++ b/package/firmware/quantenna/src/Makefile @@ -0,0 +1,88 @@ + +CC = gcc +CFLAGS = -I. -fPIC -O -g -Wall -Werror -Wno-unused-variable -Wno-unused-parameter -fstrict-aliasing + +COMMON_PROG_OBJS = \ + call_qcsapi.o \ + qcsapi_driver.o \ + qcsapi_output.o \ + qcsapi_sem.o \ + qcsapi_util.o + +SOCKET_PROG_OBJS = \ + $(COMMON_PROG_OBJS) \ + qcsapi_rpc/client/socket/qcsapi_socket_rpc_client.o \ + qcsapi_rpc_common/client/find_host_addr.o \ + +SOCKET_C_SAMPLE_OBJS = \ + qcsapi_rpc_sample/c_rpc_qcsapi_sample.o \ + qcsapi_rpc_common/client/find_host_addr.o \ + +PCIE_PROG_OBJS = \ + $(COMMON_PROG_OBJS) \ + qcsapi_rpc/client/pcie/qcsapi_pcie_rpc_client.o \ + qcsapi_rpc_common/client/rpc_pci_clnt.o \ + +SOCKET_RAW_PROG_OBJS = \ + $(COMMON_PROG_OBJS) \ + qcsapi_rpc/client/socket_raw/qcsapi_socketraw_rpc_client.o \ + qcsapi_rpc_common/client/rpc_raw_clnt.o \ + qcsapi_rpc_common/common/rpc_raw.o + +LIB_OBJS = \ + qcsapi_rpc/generated/qcsapi_rpc_xdr.o \ + qcsapi_rpc/generated/qcsapi_rpc_clnt_adapter.o \ + +TARGETS = c_rpc_qcsapi_sample \ + qcsapi_sockrpc \ + qcsapi_sockrpc_static \ + qcsapi_pcie \ + qcsapi_pcie_static \ + qcsapi_sockraw \ + qcsapi_sockraw_static \ + $(LIB_REALNAME) + +CFLAGS += -DPCIE_RPC_TYPE=RPC_TYPE_QCSAPI_PCIE + +all: $(TARGETS) + +-include $(shell find . -name \*.d) + +LIB_NAME = qcsapi_client +LIB_LDNAME = lib$(LIB_NAME).so +LIB_SONAME = $(LIB_LDNAME).1 +LIB_REALNAME = $(LIB_LDNAME).1.0.1 + +c_rpc_qcsapi_sample: ${SOCKET_C_SAMPLE_OBJS:%=build/%} $(LIB_REALNAME) + ${CC} $(filter %.o, $^) -L. -l$(LIB_NAME) -o $@ + +qcsapi_pcie: ${PCIE_PROG_OBJS:%=build/%} $(LIB_REALNAME) + ${CC} $(filter %.o, $^) -L. -l$(LIB_NAME) -o $@ + +qcsapi_pcie_static: ${PCIE_PROG_OBJS:%=build/%} ${LIB_OBJS} + ${CC} $(filter %.o, $^) -o $@ + +qcsapi_sockrpc: ${SOCKET_PROG_OBJS:%=build/%} $(LIB_REALNAME) + ${CC} $(filter %.o, $^) -L. -l$(LIB_NAME) -o $@ + +qcsapi_sockrpc_static: ${SOCKET_PROG_OBJS:%=build/%} ${LIB_OBJS} + ${CC} $(filter %.o, $^) -o $@ + +qcsapi_sockraw: ${SOCKET_RAW_PROG_OBJS:%=build/%} $(LIB_REALNAME) + ${CC} $(filter %.o, $^) -L. -l$(LIB_NAME) -o $@ + +qcsapi_sockraw_static: ${SOCKET_RAW_PROG_OBJS:%=build/%} ${LIB_OBJS} + ${CC} $(filter %.o, $^) -o $@ + +$(LIB_REALNAME): ${LIB_OBJS:%=build/%} + ${CC} -shared -s -o $@ -Wl,-soname,$(LIB_SONAME) -lc $^ + cd ${@D} ; ln -fs $(LIB_REALNAME) $(LIB_SONAME) + cd ${@D} ; ln -fs $(LIB_SONAME) $(LIB_LDNAME) + +build/%.o: %.c + @mkdir -p ${@D} + ${CC} ${CFLAGS} $< -c -o $@ -MD -MF $@.d + +clean: + rm -rf build $(LIB_LDNAME)* $(TARGETS) $(LIB_OBJS) + diff --git a/package/firmware/quantenna/src/call_qcsapi.c b/package/firmware/quantenna/src/call_qcsapi.c new file mode 100644 index 000000000..5a4124d69 --- /dev/null +++ b/package/firmware/quantenna/src/call_qcsapi.c @@ -0,0 +1,23535 @@ +/*SH0 +******************************************************************************* +** ** +** Copyright (c) 2009 - 2012 Quantenna Communications, Inc. ** +** ** +** File : call_qcsapi.c ** +** Description : ** +** ** +******************************************************************************* +** ** +** Redistribution and use in source and binary forms, with or without ** +** modification, are permitted provided that the following conditions ** +** are met: ** +** 1. Redistributions of source code must retain the above copyright ** +** notice, this list of conditions and the following disclaimer. ** +** 2. Redistributions in binary form must reproduce the above copyright ** +** notice, this list of conditions and the following disclaimer in the ** +** documentation and/or other materials provided with the distribution. ** +** 3. The name of the author may not be used to endorse or promote products ** +** derived from this software without specific prior written permission. ** +** ** +** Alternatively, this software may be distributed under the terms of the ** +** GNU General Public License ("GPL") version 2, or (at your option) any ** +** later version as published by the Free Software Foundation. ** +** ** +** In the case this software is distributed under the GPL license, ** +** you should have received a copy of the GNU General Public License ** +** along with this software; if not, write to the Free Software ** +** Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ** +** ** +** THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR ** +** IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES** +** OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. ** +** IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, ** +** INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT ** +** NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,** +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ** +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ** +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF ** +** THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ** +** ** +******************************************************************************* +EH0*/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#include +#include + +#include "qcsapi.h" +#include "qcsapi_driver.h" +#include "call_qcsapi.h" +#include "qcsapi_sem.h" +#include "qcsapi_util.h" + +#ifndef ARRAY_SIZE +#define ARRAY_SIZE(a) (sizeof (a) / sizeof ((a)[0])) +#endif + +#ifndef max +#define max(a, b) ((a) < (b) ? (b) : (a)) +#endif + +#ifndef min +#define min(a, b) ((a) < (b) ? (a) : (b)) +#endif + +#ifndef IS_MULTIPLE_BITS_SET +#define IS_MULTIPLE_BITS_SET(_x) (((unsigned)(_x)) & (((unsigned)(_x)) - 1)) +#endif + +#define printf Do_not_use_printf +#define fprintf Do_not_use_fprintf + +#define IP_ADDR_STR_LEN 16 +#define BEACON_INTERVAL_WARNING_LOWER_LIMIT 24 +#define BEACON_INTERVAL_WARNING_UPPER_LIMIT 100 + +static const struct +{ + qcsapi_entry_point e_entry_point; + const char *api_name; +} qcsapi_entry_name[] = +{ + { e_qcsapi_errno_get_message, "get_error_message" }, + { e_qcsapi_store_ipaddr, "store_ipaddr" }, + { e_qcsapi_interface_enable, "enable_interface" }, + { e_qcsapi_interface_get_BSSID, "interface_BSSID" }, + { e_qcsapi_interface_get_mac_addr, "get_mac_addr" }, + { e_qcsapi_interface_get_mac_addr, "get_macaddr" }, + { e_qcsapi_interface_set_mac_addr, "set_mac_addr" }, + { e_qcsapi_interface_set_mac_addr, "set_macaddr" }, + { e_qcsapi_interface_get_counter, "get_counter" }, + { e_qcsapi_interface_get_counter64, "get_counter64" }, + { e_qcsapi_pm_get_counter, "get_pm_counter" }, + { e_qcsapi_pm_get_elapsed_time, "get_pm_elapsed_time" }, + { e_qcsapi_flash_image_update, "flash_image_update" }, + { e_qcsapi_firmware_get_version, "get_firmware_version" }, + { e_qcsapi_system_get_time_since_start, "get_time_since_start" }, + { e_qcsapi_get_system_status, "get_sys_status" }, + { e_qcsapi_get_random_seed, "get_random_seed" }, + { e_qcsapi_set_random_seed, "set_random_seed" }, + { e_qcsapi_led_get, "get_LED" }, + { e_qcsapi_led_set, "set_LED" }, + { e_qcsapi_led_pwm_enable, "set_LED_PWM" }, + { e_qcsapi_led_brightness, "set_LED_brightness" }, + { e_qcsapi_gpio_get_config, "get_GPIO_config" }, + { e_qcsapi_gpio_set_config, "set_GPIO_config" }, + { e_qcsapi_gpio_monitor_reset_device, "monitor_reset_device" }, + { e_qcsapi_gpio_enable_wps_push_button, "enable_wps_push_button" }, + { e_qcsapi_file_path_get_config, "get_file_path" }, + { e_qcsapi_file_path_set_config, "set_file_path" }, + { e_qcsapi_wifi_set_wifi_macaddr, "set_wifi_mac_addr" }, + { e_qcsapi_wifi_set_wifi_macaddr, "set_wifi_macaddr" }, + { e_qcsapi_wifi_create_restricted_bss, "wifi_create_restricted_bss"}, + { e_qcsapi_wifi_create_bss, "wifi_create_bss"}, + { e_qcsapi_wifi_remove_bss, "wifi_remove_bss"}, + { e_qcsapi_wifi_get_primary_interface, "get_primary_interface"}, + { e_qcsapi_wifi_get_interface_by_index, "get_interface_by_index"}, + { e_qcsapi_wifi_get_mode, "get_mode" }, + { e_qcsapi_wifi_set_mode, "set_mode" }, + { e_qcsapi_wifi_get_phy_mode, "get_phy_mode" }, + { e_qcsapi_wifi_set_phy_mode, "set_phy_mode" }, + { e_qcsapi_wifi_reload_in_mode, "reload_in_mode" }, + { e_qcsapi_wifi_rfenable, "rfenable" }, + { e_qcsapi_service_control, "service_control" }, + { e_qcsapi_wfa_cert, "wfa_cert" }, + { e_qcsapi_wifi_rfstatus, "rfstatus" }, + { e_qcsapi_wifi_startprod, "startprod" }, + { e_qcsapi_wifi_get_bw, "get_bw" }, + { e_qcsapi_wifi_set_bw, "set_bw" }, + { e_qcsapi_wifi_get_BSSID, "get_BSSID" }, + { e_qcsapi_wifi_get_config_BSSID, "get_config_BSSID" }, + { e_qcsapi_wifi_ssid_get_bssid, "get_ssid_bssid" }, + { e_qcsapi_wifi_ssid_set_bssid, "set_ssid_bssid" }, + { e_qcsapi_wifi_get_SSID, "get_SSID" }, + { e_qcsapi_wifi_set_SSID, "set_SSID" }, + { e_qcsapi_wifi_get_channel, "get_channel" }, + { e_qcsapi_wifi_set_channel, "set_channel" }, + { e_qcsapi_wifi_get_auto_channel, "get_auto_channel" }, + { e_qcsapi_wifi_set_auto_channel, "set_auto_channel" }, + { e_qcsapi_wifi_get_standard, "get_standard" }, + { e_qcsapi_wifi_get_standard, "get_802.11" }, + { e_qcsapi_wifi_get_dtim, "get_dtim" }, + { e_qcsapi_wifi_set_dtim, "set_dtim" }, + { e_qcsapi_wifi_get_assoc_limit, "get_dev_assoc_limit" }, + { e_qcsapi_wifi_set_assoc_limit, "set_dev_assoc_limit" }, + { e_qcsapi_wifi_get_bss_assoc_limit, "get_bss_assoc_limit" }, + { e_qcsapi_wifi_set_bss_assoc_limit, "set_bss_assoc_limit" }, + { e_qcsapi_interface_get_status, "get_status" }, + { e_qcsapi_interface_set_ip4, "set_ip" }, + { e_qcsapi_interface_get_ip4, "get_ip" }, + { e_qcsapi_wifi_get_list_channels, "get_list_of_channels" }, + { e_qcsapi_wifi_get_list_channels, "get_channel_list" }, + { e_qcsapi_wifi_get_mode_switch, "get_mode_switch" }, + { e_qcsapi_wifi_get_mode_switch, "get_wifi_mode_switch" }, + { e_qcsapi_wifi_get_noise, "get_noise" }, + { e_qcsapi_wifi_get_rssi_by_chain, "get_rssi_by_chain" }, + { e_qcsapi_wifi_get_avg_snr, "get_avg_snr" }, + { e_qcsapi_wifi_get_option, "get_option" }, + { e_qcsapi_wifi_set_option, "set_option" }, + { e_qcsapi_wifi_get_rates, "get_rates" }, + { e_qcsapi_wifi_set_rates, "set_rates" }, + { e_qcsapi_wifi_get_max_bitrate, "get_max_bitrate" }, + { e_qcsapi_wifi_set_max_bitrate, "set_max_bitrate" }, + { e_qcsapi_wifi_get_beacon_type, "get_beacon_type" }, + { e_qcsapi_wifi_get_beacon_type, "get_beacon" }, + { e_qcsapi_wifi_set_beacon_type, "set_beacon_type" }, + { e_qcsapi_wifi_set_beacon_type, "set_beacon" }, + { e_qcsapi_wifi_get_beacon_interval, "get_beacon_interval" }, + { e_qcsapi_wifi_set_beacon_interval, "set_beacon_interval" }, + { e_qcsapi_wifi_get_list_regulatory_regions, + "get_regulatory_regions" }, + { e_qcsapi_wifi_get_list_regulatory_regions, + "get_list_regulatory_regions" }, + { e_qcsapi_wifi_get_regulatory_tx_power, + "get_regulatory_tx_power" }, + { e_qcsapi_wifi_get_configured_tx_power, + "get_configured_tx_power" }, + { e_qcsapi_wifi_set_regulatory_channel, "set_regulatory_channel" }, + { e_qcsapi_wifi_set_regulatory_region, "set_regulatory_region" }, + { e_qcsapi_wifi_get_regulatory_region, "get_regulatory_region" }, + { e_qcsapi_wifi_overwrite_country_code, "overwrite_country_code" }, + { e_qcsapi_wifi_get_list_regulatory_channels, + "get_list_regulatory_channels" }, + { e_qcsapi_wifi_get_list_regulatory_bands, + "get_list_regulatory_bands" }, + { e_qcsapi_wifi_get_regulatory_db_version, + "get_regulatory_db_version" }, + { e_qcsapi_wifi_set_regulatory_tx_power_cap, + "apply_regulatory_cap" }, + { e_qcsapi_wifi_restore_regulatory_tx_power, + "restore_regulatory_tx_power"}, + { e_qcsapi_wifi_set_chan_pri_inactive, "set_chan_pri_inactive" }, + { e_qcsapi_wifi_set_chan_disabled, "set_chan_disabled" }, + { e_qcsapi_wifi_get_chan_disabled, "get_chan_disabled" }, + + { e_qcsapi_wifi_get_tx_power, "get_tx_power" }, + { e_qcsapi_wifi_set_tx_power, "set_tx_power" }, + { e_qcsapi_wifi_get_tx_power_ext, "get_tx_power_ext" }, + { e_qcsapi_wifi_set_tx_power_ext, "set_tx_power_ext" }, + { e_qcsapi_wifi_get_chan_power_table, "get_chan_power_table" }, + { e_qcsapi_wifi_set_chan_power_table, "set_chan_power_table" }, + { e_qcsapi_wifi_get_bw_power, "get_bw_power" }, + { e_qcsapi_wifi_set_bw_power, "set_bw_power" }, + { e_qcsapi_wifi_get_bf_power, "get_bf_power" }, + { e_qcsapi_wifi_set_bf_power, "set_bf_power" }, + { e_qcsapi_wifi_get_power_selection, "get_power_selection" }, + { e_qcsapi_wifi_set_power_selection, "set_power_selection" }, + { e_qcsapi_wifi_get_carrier_interference, "get_carrier_db" }, + { e_qcsapi_wifi_get_congestion_idx, "get_congest_idx" }, + { e_qcsapi_wifi_get_supported_tx_power_levels, "get_supported_tx_power" }, + { e_qcsapi_wifi_get_current_tx_power_level, "get_current_tx_power" }, + { e_qcsapi_wifi_set_power_constraint, "set_power_constraint"}, + { e_qcsapi_wifi_get_power_constraint, "get_power_constraint"}, + { e_qcsapi_wifi_set_tpc_interval, "set_tpc_query_interval"}, + { e_qcsapi_wifi_get_tpc_interval, "get_tpc_query_interval"}, + { e_qcsapi_wifi_get_assoc_records, "get_assoc_records" }, + { e_qcsapi_wifi_get_list_DFS_channels, "get_list_DFS_channels" }, + { e_qcsapi_wifi_is_channel_DFS, "is_channel_DFS" }, + { e_qcsapi_wifi_get_DFS_alt_channel, "get_DFS_alt_channel" }, + { e_qcsapi_wifi_set_DFS_alt_channel, "set_DFS_alt_channel" }, + { e_qcsapi_wifi_set_DFS_reentry, "start_dfsreentry"}, + { e_qcsapi_wifi_get_scs_cce_channels, "get_scs_cce_channels" }, + { e_qcsapi_wifi_get_dfs_cce_channels, "get_dfs_cce_channels" }, + { e_qcsapi_wifi_get_csw_records, "get_csw_records" }, + { e_qcsapi_wifi_get_radar_status, "get_radar_status" }, + { e_qcsapi_wifi_get_WEP_encryption_level, + "get_WEP_encryption_level" }, + { e_qcsapi_wifi_get_WPA_encryption_modes, "get_WPA_encryption_modes" }, + { e_qcsapi_wifi_set_WPA_encryption_modes, "set_WPA_encryption_modes" }, + { e_qcsapi_wifi_get_WPA_authentication_mode, "get_WPA_authentication_mode" }, + { e_qcsapi_wifi_set_WPA_authentication_mode, "set_WPA_authentication_mode" }, + + { e_qcsapi_wifi_get_interworking, "get_interworking" }, + { e_qcsapi_wifi_set_interworking, "set_interworking" }, + { e_qcsapi_wifi_get_80211u_params, "get_80211u_params" }, + { e_qcsapi_wifi_set_80211u_params, "set_80211u_params" }, + { e_qcsapi_security_get_nai_realms, "get_nai_realms" }, + { e_qcsapi_security_add_nai_realm, "add_nai_realm" }, + { e_qcsapi_security_del_nai_realm, "del_nai_realm" }, + { e_qcsapi_security_add_roaming_consortium, "add_roaming_consortium" }, + { e_qcsapi_security_del_roaming_consortium, "del_roaming_consortium" }, + { e_qcsapi_security_get_roaming_consortium, "get_roaming_consortium" }, + { e_qcsapi_security_get_venue_name, "get_venue_name" }, + { e_qcsapi_security_add_venue_name, "add_venue_name" }, + { e_qcsapi_security_del_venue_name, "del_venue_name" }, + { e_qcsapi_security_get_oper_friendly_name, "get_oper_friendly_name" }, + { e_qcsapi_security_add_oper_friendly_name, "add_oper_friendly_name" }, + { e_qcsapi_security_del_oper_friendly_name, "del_oper_friendly_name" }, + { e_qcsapi_security_get_hs20_conn_capab, "get_hs20_conn_capab" }, + { e_qcsapi_security_add_hs20_conn_capab, "add_hs20_conn_capab" }, + { e_qcsapi_security_del_hs20_conn_capab, "del_hs20_conn_capab" }, + + { e_qcsapi_wifi_get_hs20_status, "get_hs20_status" }, + { e_qcsapi_wifi_set_hs20_status, "set_hs20_status" }, + { e_qcsapi_wifi_get_hs20_params, "get_hs20_params" }, + { e_qcsapi_wifi_set_hs20_params, "set_hs20_params" }, + + { e_qcsapi_remove_11u_param, "remove_11u_param" }, + { e_qcsapi_remove_hs20_param, "remove_hs20_param" }, + + { e_qcsapi_wifi_set_proxy_arp, "set_proxy_arp" }, + { e_qcsapi_wifi_get_proxy_arp, "get_proxy_arp" }, + { e_qcsapi_wifi_get_l2_ext_filter, "get_l2_ext_filter" }, + { e_qcsapi_wifi_set_l2_ext_filter, "set_l2_ext_filter" }, + + { e_qcsapi_wifi_get_IEEE11i_encryption_modes, "get_IEEE11i_encryption_modes" }, + { e_qcsapi_wifi_set_IEEE11i_encryption_modes, "set_IEEE11i_encryption_modes" }, + { e_qcsapi_wifi_get_IEEE11i_authentication_mode, "get_IEEE11i_authentication_mode" }, + { e_qcsapi_wifi_set_IEEE11i_authentication_mode, "set_IEEE11i_authentication_mode" }, + { e_qcsapi_wifi_get_michael_errcnt, "get_michael_errcnt" }, + { e_qcsapi_wifi_get_pre_shared_key, "get_pre_shared_key" }, + { e_qcsapi_wifi_set_pre_shared_key, "set_pre_shared_key" }, + { e_qcsapi_wifi_add_radius_auth_server_cfg, "add_radius_auth_server_cfg" }, + { e_qcsapi_wifi_del_radius_auth_server_cfg, "del_radius_auth_server_cfg" }, + { e_qcsapi_wifi_get_radius_auth_server_cfg, "get_radius_auth_server_cfg" }, + { e_qcsapi_wifi_set_own_ip_addr, "set_own_ip_addr" }, + { e_qcsapi_wifi_get_psk_auth_failures, "get_psk_auth_failures" }, + { e_qcsapi_wifi_get_pre_shared_key, "get_PSK" }, + { e_qcsapi_wifi_set_pre_shared_key, "set_PSK" }, + { e_qcsapi_wifi_get_key_passphrase, "get_passphrase" }, + { e_qcsapi_wifi_get_key_passphrase, "get_key_passphrase" }, + { e_qcsapi_wifi_set_key_passphrase, "set_passphrase" }, + { e_qcsapi_wifi_set_key_passphrase, "set_key_passphrase" }, + { e_qcsapi_wifi_get_group_key_interval, "get_group_key_interval" }, + { e_qcsapi_wifi_set_group_key_interval, "set_group_key_interval" }, + { e_qcsapi_wifi_get_pmf, "get_pmf" }, + { e_qcsapi_wifi_set_pmf, "set_pmf" }, + { e_qcsapi_wifi_get_count_associations, "get_count_assoc" }, + { e_qcsapi_wifi_get_count_associations, "get_count_associations" }, + { e_qcsapi_wifi_get_count_associations, "get_association_count" }, + { e_qcsapi_wifi_get_associated_device_mac_addr, "get_associated_device_mac_addr" }, + { e_qcsapi_wifi_get_associated_device_mac_addr, "get_station_mac_addr" }, + { e_qcsapi_wifi_get_associated_device_ip_addr, "get_associated_device_ip_addr" }, + { e_qcsapi_wifi_get_associated_device_ip_addr, "get_station_ip_addr" }, + { e_qcsapi_wifi_get_link_quality, "get_link_quality" }, + { e_qcsapi_wifi_get_rssi_per_association, "get_rssi" }, + { e_qcsapi_wifi_get_hw_noise_per_association, "get_hw_noise" }, + { e_qcsapi_wifi_get_rssi_in_dbm_per_association, "get_rssi_dbm" }, + { e_qcsapi_wifi_get_snr_per_association, "get_snr" }, + { e_qcsapi_wifi_get_rx_bytes_per_association, "get_rx_bytes" }, + { e_qcsapi_wifi_get_rx_bytes_per_association, "get_assoc_rx_bytes" }, + { e_qcsapi_wifi_get_tx_bytes_per_association, "get_tx_bytes" }, + { e_qcsapi_wifi_get_tx_bytes_per_association, "get_assoc_tx_bytes" }, + { e_qcsapi_wifi_get_rx_packets_per_association, "get_rx_packets" }, + { e_qcsapi_wifi_get_rx_packets_per_association, "get_assoc_rx_packets" }, + { e_qcsapi_wifi_get_tx_packets_per_association, "get_tx_packets" }, + { e_qcsapi_wifi_get_tx_packets_per_association, "get_assoc_tx_packets" }, + { e_qcsapi_wifi_get_tx_err_packets_per_association, + "get_tx_err_packets" }, + { e_qcsapi_wifi_get_tx_err_packets_per_association, + "get_assoc_tx_err_packets" }, + { e_qcsapi_wifi_get_bw_per_association, "get_assoc_bw" }, + { e_qcsapi_wifi_get_tx_phy_rate_per_association, "get_tx_phy_rate" }, + { e_qcsapi_wifi_get_rx_phy_rate_per_association, "get_rx_phy_rate" }, + { e_qcsapi_wifi_get_tx_mcs_per_association, "get_tx_mcs" }, + { e_qcsapi_wifi_get_rx_mcs_per_association, "get_rx_mcs" }, + { e_qcsapi_wifi_get_achievable_tx_phy_rate_per_association, + "get_achievable_tx_phy_rate" }, + { e_qcsapi_wifi_get_achievable_rx_phy_rate_per_association, + "get_achievable_rx_phy_rate" }, + { e_qcsapi_wifi_get_auth_enc_per_association, "get_auth_enc_per_assoc" }, + { e_qcsapi_wifi_get_tput_caps, "get_tput_caps" }, + { e_qcsapi_wifi_get_connection_mode, "get_connection_mode" }, + { e_qcsapi_wifi_get_vendor_per_association, "get_vendor" }, + { e_qcsapi_wifi_get_max_mimo, "get_max_mimo" }, + + { e_qcsapi_wifi_get_node_counter, "get_node_counter" }, + { e_qcsapi_wifi_get_node_param, "get_node_param" }, + { e_qcsapi_wifi_get_node_stats, "get_node_stats" }, + + { e_qcsapi_wifi_get_max_queued, "get_max_queued" }, + + { e_qcsapi_wifi_disassociate, "disassociate" }, + { e_qcsapi_wifi_disassociate_sta, "disassociate_sta" }, + { e_qcsapi_wifi_reassociate, "reassociate" }, + + { e_qcsapi_wifi_associate, "associate" }, + + { e_qcsapi_wifi_get_mac_address_filtering, "get_macaddr_filter" }, + { e_qcsapi_wifi_set_mac_address_filtering, "set_macaddr_filter" }, + { e_qcsapi_wifi_is_mac_address_authorized, "is_mac_addr_authorized" }, + { e_qcsapi_wifi_is_mac_address_authorized, "is_macaddr_authorized" }, + { e_qcsapi_wifi_get_authorized_mac_addresses, "get_authorized_mac_addr" }, + { e_qcsapi_wifi_get_authorized_mac_addresses, "get_authorized_macaddr" }, + { e_qcsapi_wifi_get_denied_mac_addresses, "get_blocked_mac_addr" }, + { e_qcsapi_wifi_get_denied_mac_addresses, "get_blocked_macaddr" }, + { e_qcsapi_wifi_get_denied_mac_addresses, "get_denied_mac_addr" }, + { e_qcsapi_wifi_get_denied_mac_addresses, "get_denied_macaddr" }, + { e_qcsapi_wifi_authorize_mac_address, "authorize_mac_addr" }, + { e_qcsapi_wifi_authorize_mac_address, "authorize_macaddr" }, + { e_qcsapi_wifi_deny_mac_address, "block_macaddr" }, + { e_qcsapi_wifi_deny_mac_address, "block_mac_addr" }, + { e_qcsapi_wifi_deny_mac_address, "deny_macaddr" }, + { e_qcsapi_wifi_deny_mac_address, "deny_mac_addr" }, + { e_qcsapi_wifi_remove_mac_address, "remove_mac_addr" }, + { e_qcsapi_wifi_remove_mac_address, "remove_macaddr" }, + { e_qcsapi_wifi_clear_mac_address_filters, "clear_mac_filters" }, + { e_qcsapi_wifi_set_mac_address_reserve, "set_macaddr_reserve" }, + { e_qcsapi_wifi_get_mac_address_reserve, "get_macaddr_reserve" }, + { e_qcsapi_wifi_clear_mac_address_reserve, "clear_macaddr_reserve" }, + + { e_qcsapi_wifi_backoff_fail_max, "backoff_fail_max" }, + { e_qcsapi_wifi_backoff_timeout, "backoff_timeout" }, + { e_qcsapi_wifi_get_wpa_status, "get_wpa_status" }, + { e_qcsapi_wifi_get_auth_state, "get_auth_state" }, + { e_qcsapi_wifi_get_disconn_info, "get_disconn_info" }, + { e_qcsapi_wifi_reset_disconn_info, "reset_disconn_info" }, + { e_qcsapi_wifi_get_pairing_id, "get_pairing_id"}, + { e_qcsapi_wifi_set_pairing_id, "set_pairing_id"}, + { e_qcsapi_wifi_get_pairing_enable, "get_pairing_enable"}, + { e_qcsapi_wifi_set_pairing_enable, "set_pairing_enable"}, + + { e_qcsapi_wifi_set_txqos_sched_tbl, "set_txqos_sched_tbl" }, + { e_qcsapi_wifi_get_txqos_sched_tbl, "get_txqos_sched_tbl" }, + + { e_qcsapi_wps_registrar_report_button_press, "registrar_report_button_press" }, + { e_qcsapi_wps_registrar_report_button_press, "registrar_report_pbc" }, + { e_qcsapi_wps_registrar_report_pin, "registrar_report_pin" }, + { e_qcsapi_wps_registrar_get_pp_devname, "registrar_get_pp_devname" }, + { e_qcsapi_wps_registrar_set_pp_devname, "registrar_set_pp_devname" }, + { e_qcsapi_wps_enrollee_report_button_press, "enrollee_report_button_press" }, + { e_qcsapi_wps_enrollee_report_button_press, "enrollee_report_pbc" }, + { e_qcsapi_wps_enrollee_report_pin, "enrollee_report_pin" }, + { e_qcsapi_wps_enrollee_generate_pin, "enrollee_generate_pin" }, + { e_qcsapi_wps_get_ap_pin, "get_wps_ap_pin" }, + { e_qcsapi_wps_set_ap_pin, "set_wps_ap_pin" }, + { e_qcsapi_wps_save_ap_pin, "save_wps_ap_pin" }, + { e_qcsapi_wps_enable_ap_pin, "enable_wps_ap_pin" }, + { e_qcsapi_wps_get_sta_pin, "get_wps_sta_pin" }, + { e_qcsapi_wps_get_state, "get_wps_state" }, + { e_qcsapi_wps_get_configured_state, "get_wps_configured_state" }, + { e_qcsapi_wps_set_configured_state, "set_wps_configured_state" }, + { e_qcsapi_wps_get_runtime_state, "get_wps_runtime_state" }, + { e_qcsapi_wps_get_allow_pbc_overlap_status, "get_allow_pbc_overlap_status" }, + { e_qcsapi_wps_allow_pbc_overlap, "allow_pbc_overlap" }, + { e_qcsapi_wps_get_param, "get_wps_param" }, + { e_qcsapi_wps_set_param, "set_wps_param" }, + { e_qcsapi_wps_set_access_control, "set_wps_access_control" }, + { e_qcsapi_wps_get_access_control, "get_wps_access_control" }, + { e_qcsapi_non_wps_set_pp_enable, "set_non_wps_pp_enable" }, + { e_qcsapi_non_wps_get_pp_enable, "get_non_wps_pp_enable" }, + { e_qcsapi_wps_cancel, "wps_cancel" }, + { e_qcsapi_wps_set_pbc_in_srcm, "set_wps_pbc_in_srcm" }, + { e_qcsapi_wps_get_pbc_in_srcm, "get_wps_pbc_in_srcm" }, + { e_qcsapi_wps_timeout, "wps_set_timeout" }, + { e_qcsapi_wps_on_hidden_ssid, "wps_on_hidden_ssid" }, + { e_qcsapi_wps_on_hidden_ssid_status, "wps_on_hidden_ssid_status" }, + { e_qcsapi_wps_upnp_enable, "wps_upnp_enable" }, + { e_qcsapi_wps_upnp_status, "wps_upnp_status" }, + { e_qcsapi_wps_registrar_set_dfl_pbc_bss, "registrar_set_default_pbc_bss"}, + { e_qcsapi_wps_registrar_get_dfl_pbc_bss, "registrar_get_default_pbc_bss"}, + + { e_qcsapi_wifi_set_dwell_times, "set_dwell_times" }, + { e_qcsapi_wifi_get_dwell_times, "get_dwell_times" }, + { e_qcsapi_wifi_set_bgscan_dwell_times, "set_bgscan_dwell_times" }, + { e_qcsapi_wifi_get_bgscan_dwell_times, "get_bgscan_dwell_times" }, + { e_qcsapi_wifi_start_scan, "start_scan" }, + { e_qcsapi_wifi_cancel_scan, "cancel_scan" }, + { e_qcsapi_wifi_get_scan_status, "get_scanstatus" }, + { e_qcsapi_wifi_get_cac_status, "get_cacstatus" }, + { e_qcsapi_wifi_wait_scan_completes, "wait_scan_completes" }, + { e_qcsapi_wifi_set_scan_chk_inv, "set_scan_chk_inv" }, + { e_qcsapi_wifi_get_scan_chk_inv, "get_scan_chk_inv" }, + + { e_qcsapi_SSID_create_SSID, "SSID_create_SSID" }, + { e_qcsapi_SSID_create_SSID, "create_SSID" }, + { e_qcsapi_SSID_remove_SSID, "remove_SSID" }, + { e_qcsapi_SSID_verify_SSID, "SSID_verify_SSID" }, + { e_qcsapi_SSID_verify_SSID, "verify_SSID" }, + { e_qcsapi_SSID_rename_SSID, "SSID_rename_SSID" }, + { e_qcsapi_SSID_rename_SSID, "rename_SSID" }, + { e_qcsapi_SSID_get_SSID_list, "get_SSID_list" }, + { e_qcsapi_SSID_get_protocol, "get_SSID_proto" }, + { e_qcsapi_SSID_get_protocol, "SSID_get_proto" }, + { e_qcsapi_SSID_set_protocol, "set_SSID_proto" }, + { e_qcsapi_SSID_set_protocol, "SSID_set_proto" }, + { e_qcsapi_SSID_get_encryption_modes, "SSID_get_encryption_modes" }, + { e_qcsapi_SSID_set_encryption_modes, "SSID_set_encryption_modes" }, + { e_qcsapi_SSID_get_group_encryption, "SSID_get_group_encryption" }, + { e_qcsapi_SSID_set_group_encryption, "SSID_set_group_encryption" }, + { e_qcsapi_SSID_get_authentication_mode, "SSID_get_authentication_mode" }, + { e_qcsapi_SSID_set_authentication_mode, "SSID_set_authentication_mode" }, + { e_qcsapi_SSID_get_pre_shared_key, "SSID_get_pre_shared_key" }, + { e_qcsapi_SSID_set_pre_shared_key, "SSID_set_pre_shared_key" }, + { e_qcsapi_SSID_get_key_passphrase, "SSID_get_key_passphrase" }, + { e_qcsapi_SSID_get_key_passphrase, "SSID_get_passphrase" }, + { e_qcsapi_SSID_set_key_passphrase, "SSID_set_key_passphrase" }, + { e_qcsapi_SSID_set_key_passphrase, "SSID_set_passphrase" }, + { e_qcsapi_SSID_get_pmf, "SSID_get_pmf" }, + { e_qcsapi_SSID_set_pmf, "SSID_set_pmf" }, + { e_qcsapi_SSID_get_wps_SSID, "SSID_get_WPS_SSID" }, + { e_qcsapi_wifi_vlan_config, "vlan_config" }, + { e_qcsapi_wifi_show_vlan_config, "show_vlan_config" }, + { e_qcsapi_enable_vlan_pass_through, "enable_vlan_pass_through" }, + + { e_qcsapi_wifi_start_cca, "start_cca" }, + { e_qcsapi_wifi_disable_wps, "disable_wps" }, + { e_qcsapi_wifi_get_results_AP_scan, "get_results_AP_scan" }, + { e_qcsapi_wifi_get_count_APs_scanned, "get_count_APs_scanned" }, + { e_qcsapi_wifi_get_properties_AP, "get_properties_AP" }, + + {e_qcsapi_wifi_get_time_associated_per_association, "get_time_associated" }, + + { e_qcsapi_wifi_wds_add_peer, "wds_add_peer"}, + { e_qcsapi_wifi_wds_remove_peer, "wds_remove_peer"}, + { e_qcsapi_wifi_wds_get_peer_address, "wds_get_peer_address"}, + { e_qcsapi_wifi_wds_set_psk, "wds_set_psk"}, + { e_qcsapi_wifi_wds_set_mode, "wds_set_mode"}, + { e_qcsapi_wifi_wds_get_mode, "wds_get_mode"}, + + { e_qcsapi_wifi_qos_get_param, "get_qos_param" }, + { e_qcsapi_wifi_qos_set_param, "set_qos_param" }, + + { e_qcsapi_wifi_get_wmm_ac_map, "get_wmm_ac_map" }, + { e_qcsapi_wifi_set_wmm_ac_map, "set_wmm_ac_map" }, + + { e_qcsapi_wifi_get_dscp_8021p_map, "get_dscp_8021p_map" }, + { e_qcsapi_wifi_set_dscp_8021p_map, "set_dscp_8021p_map" }, + { e_qcsapi_wifi_get_dscp_ac_map, "get_dscp_ac_map" }, + { e_qcsapi_wifi_set_dscp_ac_map, "set_dscp_ac_map" }, + + { e_qcsapi_wifi_get_priority, "get_priority" }, + { e_qcsapi_wifi_set_priority, "set_priority" }, + { e_qcsapi_wifi_get_airfair, "get_airfair" }, + { e_qcsapi_wifi_set_airfair, "set_airfair" }, + + { e_qcsapi_config_get_parameter, "get_config_param"}, + { e_qcsapi_config_get_parameter, "get_persistent_param"}, + { e_qcsapi_config_update_parameter, "update_config_param"}, + { e_qcsapi_config_update_parameter, "update_persistent_param"}, + { e_qcsapi_bootcfg_get_parameter, "get_bootcfg_param"}, + { e_qcsapi_bootcfg_update_parameter, "update_bootcfg_param"}, + { e_qcsapi_bootcfg_commit, "commit_bootcfg"}, + { e_qcsapi_wifi_get_mcs_rate, "get_mcs_rate" }, + { e_qcsapi_wifi_set_mcs_rate, "set_mcs_rate" }, + { e_qcsapi_config_get_ssid_parameter, "get_persistent_ssid_param"}, + { e_qcsapi_config_update_ssid_parameter, "update_persistent_ssid_param"}, + + { e_qcsapi_wifi_enable_scs, "enable_scs" }, + { e_qcsapi_wifi_scs_switch_channel, "scs_switch_chan" }, + { e_qcsapi_wifi_set_scs_verbose, "set_scs_verbose" }, + { e_qcsapi_wifi_get_scs_status, "get_scs_status" }, + { e_qcsapi_wifi_set_scs_smpl_enable, "set_scs_smpl_enable" }, + { e_qcsapi_wifi_set_scs_smpl_dwell_time, "set_scs_smpl_dwell_time" }, + { e_qcsapi_wifi_set_scs_smpl_intv, "set_scs_smpl_intv" }, + { e_qcsapi_wifi_set_scs_intf_detect_intv, "set_scs_intf_detect_intv" }, + { e_qcsapi_wifi_set_scs_thrshld, "set_scs_thrshld" }, + { e_qcsapi_wifi_set_scs_report_only, "set_scs_report_only" }, + { e_qcsapi_wifi_get_scs_report_stat, "get_scs_report" }, + { e_qcsapi_wifi_set_scs_cca_intf_smth_fctr, "set_scs_cca_intf_smth_fctr" }, + { e_qcsapi_wifi_set_scs_chan_mtrc_mrgn, "set_scs_chan_mtrc_mrgn" }, + { e_qcsapi_wifi_get_scs_dfs_reentry_request, "get_scs_dfs_reentry_request" }, + { e_qcsapi_wifi_get_scs_cca_intf, "get_scs_cca_intf" }, + { e_qcsapi_wifi_get_scs_param, "get_scs_params" }, + { e_qcsapi_wifi_set_scs_stats, "set_scs_stats" }, + + { e_qcsapi_wifi_start_ocac, "start_ocac" }, + { e_qcsapi_wifi_stop_ocac, "stop_ocac" }, + { e_qcsapi_wifi_get_ocac_status, "get_ocac_status" }, + { e_qcsapi_wifi_set_ocac_threshold, "set_ocac_thrshld" }, + { e_qcsapi_wifi_set_ocac_dwell_time, "set_ocac_dwell_time" }, + { e_qcsapi_wifi_set_ocac_duration, "set_ocac_duration" }, + { e_qcsapi_wifi_set_ocac_cac_time, "set_ocac_cac_time" }, + { e_qcsapi_wifi_set_ocac_report_only, "set_ocac_report_only" }, + + { e_qcsapi_wifi_start_dfs_s_radio, "start_dfs_s_radio" }, + { e_qcsapi_wifi_stop_dfs_s_radio, "stop_dfs_s_radio" }, + { e_qcsapi_wifi_get_dfs_s_radio_status, "get_dfs_s_radio_status" }, + { e_qcsapi_wifi_get_dfs_s_radio_availability, "get_dfs_s_radio_availability" }, + { e_qcsapi_wifi_set_dfs_s_radio_threshold, "set_dfs_s_radio_thrshld" }, + { e_qcsapi_wifi_set_dfs_s_radio_dwell_time, "set_dfs_s_radio_dwell_time" }, + { e_qcsapi_wifi_set_dfs_s_radio_duration, "set_dfs_s_radio_duration" }, + { e_qcsapi_wifi_set_dfs_s_radio_cac_time, "set_dfs_s_radio_cac_time" }, + { e_qcsapi_wifi_set_dfs_s_radio_report_only, "set_dfs_s_radio_report_only" }, + { e_qcsapi_wifi_set_dfs_s_radio_wea_duration, "set_dfs_s_radio_wea_duration" }, + { e_qcsapi_wifi_set_dfs_s_radio_wea_cac_time, "set_dfs_s_radio_wea_cac_time" }, + + { e_qcsapi_wifi_set_vendor_fix, "set_vendor_fix" }, + { e_qcsapi_wifi_get_rts_threshold, "get_rts_threshold" }, + { e_qcsapi_wifi_set_rts_threshold, "set_rts_threshold" }, + { e_qcsapi_set_soc_macaddr, "set_soc_macaddr" }, + + { e_qcsapi_get_interface_stats, "get_interface_stats" }, + { e_qcsapi_get_phy_stats, "get_phy_stats" }, + { e_qcsapi_wifi_set_ap_isolate, "set_ap_isolate" }, + { e_qcsapi_wifi_get_ap_isolate, "get_ap_isolate" }, + { e_qcsapi_power_save, "pm" }, + { e_qcsapi_qpm_level, "qpm_level" }, + { e_qcsapi_reset_all_stats, "reset_all_stats" }, + { e_qcsapi_eth_phy_power_off, "eth_phy_power_off" }, + { e_qcsapi_aspm_l1, "set_aspm_l1"}, + { e_qcsapi_l1, "set_l1"}, + { e_qcsapi_telnet_enable, "enable_telnet" }, + { e_qcsapi_restore_default_config, "restore_default_config" }, + { e_qcsapi_run_script, "run_script" }, + { e_qcsapi_qtm, "qtm" }, + { e_qcsapi_test_traffic, "test_traffic" }, + { e_qcsapi_get_temperature, "get_temperature" }, + { e_qcsapi_set_accept_oui_filter, "set_accept_oui_filter" }, + { e_qcsapi_get_accept_oui_filter, "get_accept_oui_filter" }, + + { e_qcsapi_get_swfeat_list, "get_swfeat_list" }, + + { e_qcsapi_wifi_set_vht, "set_vht" }, + { e_qcsapi_wifi_get_vht, "get_vht" }, + + { e_qcsapi_calcmd_set_test_mode, "set_test_mode" }, + { e_qcsapi_calcmd_show_test_packet, "show_test_packet" }, + { e_qcsapi_calcmd_send_test_packet, "send_test_packet" }, + { e_qcsapi_calcmd_stop_test_packet, "stop_test_packet" }, + { e_qcsapi_calcmd_send_dc_cw_signal, "send_dc_cw_signal" }, + { e_qcsapi_calcmd_stop_dc_cw_signal, "stop_dc_cw_signal" }, + { e_qcsapi_calcmd_get_test_mode_antenna_sel, "get_test_mode_antenna_sel" }, + { e_qcsapi_calcmd_get_test_mode_mcs, "get_test_mode_mcs" }, + { e_qcsapi_calcmd_get_test_mode_bw, "get_test_mode_bw" }, + { e_qcsapi_calcmd_get_tx_power, "get_test_mode_tx_power" }, + { e_qcsapi_calcmd_set_tx_power, "set_test_mode_tx_power" }, + { e_qcsapi_calcmd_get_test_mode_rssi, "get_test_mode_rssi" }, + { e_qcsapi_calcmd_set_mac_filter, "calcmd_set_mac_filter" }, + { e_qcsapi_calcmd_get_antenna_count, "get_test_mode_antenna_count" }, + { e_qcsapi_calcmd_clear_counter, "calcmd_clear_counter" }, + { e_qcsapi_calcmd_get_info, "get_info" }, + { e_qcsapi_wifi_disable_dfs_channels, "disable_dfs_channels" }, + + { e_qcsapi_br_vlan_promisc, "enable_vlan_promisc" }, + { e_qcsapi_add_ipff, "add_ipff" }, + { e_qcsapi_del_ipff, "del_ipff" }, + { e_qcsapi_get_ipff, "get_ipff" }, + { e_qcsapi_get_carrier_id, "get_carrier_id" }, + { e_qcsapi_set_carrier_id, "set_carrier_id" }, + { e_qcsapi_get_spinor_jedecid, "get_spinor_jedecid" }, + { e_qcsapi_get_custom_value, "get_custom_value" }, + + + { e_qcsapi_wifi_enable_tdls, "enable_tdls" }, + { e_qcsapi_wifi_enable_tdls_over_qhop, "enable_tdls_over_qhop" }, + { e_qcsapi_wifi_get_tdls_status, "get_tdls_status" }, + { e_qcsapi_wifi_set_tdls_params, "set_tdls_params" }, + { e_qcsapi_wifi_get_tdls_params, "get_tdls_params" }, + { e_qcsapi_wifi_tdls_operate, "tdls_operate" }, + + { e_qcsapi_wifi_get_mlme_stats_per_mac, "get_mlme_stats_per_mac" }, + { e_qcsapi_wifi_get_mlme_stats_per_association, "get_mlme_stats_per_association" }, + { e_qcsapi_wifi_get_mlme_stats_macs_list, "get_mlme_stats_macs_list" }, + + { e_qcsapi_get_nss_cap, "get_nss_cap"}, + { e_qcsapi_set_nss_cap, "set_nss_cap"}, + + { e_qcsapi_get_security_defer_mode, "get_security_defer_mode"}, + { e_qcsapi_set_security_defer_mode, "set_security_defer_mode"}, + { e_qcsapi_apply_security_config, "apply_security_config"}, + + { e_qcsapi_get_board_parameter, "get_board_parameter" }, + { e_qcsapi_wifi_set_intra_bss_isolate, "set_intra_bss_isolate" }, + { e_qcsapi_wifi_get_intra_bss_isolate, "get_intra_bss_isolate" }, + { e_qcsapi_wifi_set_bss_isolate, "set_bss_isolate" }, + { e_qcsapi_wifi_get_bss_isolate, "get_bss_isolate" }, + + { e_qcsapi_wowlan_host_state, "wowlan_host_state" }, + { e_qcsapi_wowlan_match_type, "wowlan_match_type" }, + { e_qcsapi_wowlan_L2_type, "wowlan_L2_type" }, + { e_qcsapi_wowlan_udp_port, "wowlan_udp_port" }, + { e_qcsapi_wowlan_pattern, "wowlan_pattern" }, + { e_qcsapi_wowlan_get_host_state, "wowlan_get_host_state" }, + { e_qcsapi_wowlan_get_match_type, "wowlan_get_match_type" }, + { e_qcsapi_wowlan_get_L2_type, "wowlan_get_L2_type" }, + { e_qcsapi_wowlan_get_udp_port, "wowlan_get_udp_port" }, + { e_qcsapi_wowlan_get_pattern, "wowlan_get_pattern" }, + + { e_qcsapi_wifi_set_extender_params, "set_extender_params" }, + { e_qcsapi_wifi_get_extender_status, "get_extender_status" }, + + { e_qcsapi_wifi_enable_bgscan, "enable_bgscan" }, + { e_qcsapi_wifi_get_bgscan_status, "get_bgscan_status" }, + + { e_qcsapi_get_uboot_info, "get_uboot_info"}, + { e_qcsapi_wifi_get_disassoc_reason, "disassoc_reason"}, + + { e_qcsapi_is_startprod_done, "is_startprod_done"}, + + { e_qcsapi_get_bb_param, "get_bb_param" }, + { e_qcsapi_set_bb_param, "set_bb_param" }, + { e_qcsapi_wifi_get_tx_amsdu, "get_tx_amsdu" }, + { e_qcsapi_wifi_set_tx_amsdu, "set_tx_amsdu" }, + + { e_qcsapi_wifi_set_scan_buf_max_size, "set_scan_buf_max_size" }, + { e_qcsapi_wifi_get_scan_buf_max_size, "get_scan_buf_max_size" }, + { e_qcsapi_wifi_set_scan_table_max_len, "set_scan_table_max_len" }, + { e_qcsapi_wifi_get_scan_table_max_len, "get_scan_table_max_len" }, + + { e_qcsapi_wifi_set_enable_mu, "set_enable_mu" }, + { e_qcsapi_wifi_get_enable_mu, "get_enable_mu" }, + { e_qcsapi_wifi_set_mu_use_precode, "set_mu_use_precode" }, + { e_qcsapi_wifi_get_mu_use_precode, "get_mu_use_precode" }, + { e_qcsapi_wifi_set_mu_use_eq, "set_mu_use_eq" }, + { e_qcsapi_wifi_get_mu_use_eq, "get_mu_use_eq" }, + { e_qcsapi_wifi_get_mu_groups, "get_mu_groups" }, + { e_qcsapi_set_emac_switch, "set_emac_switch" }, + { e_qcsapi_get_emac_switch, "get_emac_switch" }, + { e_qcsapi_eth_dscp_map, "eth_dscp_map" }, + + { e_qcsapi_send_file, "send_file" }, + { e_qcsapi_wifi_verify_repeater_mode, "verify_repeater_mode" }, + { e_qcsapi_wifi_set_ap_interface_name, "set_ap_interface_name" }, + { e_qcsapi_wifi_get_ap_interface_name, "get_ap_interface_name" }, + + { e_qcsapi_set_optim_stats, "set_optim_stats" }, + + { e_qcsapi_set_sys_time, "set_sys_time" }, + { e_qcsapi_get_sys_time, "get_sys_time" }, + { e_qcsapi_get_eth_info, "get_eth_info" }, + { e_qcsapi_wifi_block_bss, "block_bss" }, + + { e_qcsapi_nosuch_api, NULL } +}; + +static const struct +{ + qcsapi_counter_type counter_type; + const char *counter_name; +} qcsapi_counter_name[] = +{ + { qcsapi_total_bytes_sent, "tx_bytes" }, + { qcsapi_total_bytes_received, "rx_bytes" }, + { qcsapi_total_packets_sent, "tx_packets" }, + { qcsapi_total_packets_received, "rx_packets" }, + { qcsapi_discard_packets_sent, "tx_discard" }, + { qcsapi_discard_packets_received, "rx_discard" }, + { qcsapi_error_packets_sent, "tx_errors" }, + { qcsapi_error_packets_received, "rx_errors" }, + { qcsapi_vlan_frames_received, "rx_vlan_pkts" }, + { qcsapi_fragment_frames_received, "rx_fragment_pkts" }, + { qcsapi_nosuch_counter, NULL } +}; + +static const struct +{ + qcsapi_option_type option_type; + const char *option_name; +} qcsapi_option_name[] = +{ + { qcsapi_channel_refresh, "channel_refresh" }, + { qcsapi_DFS, "DFS" }, + { qcsapi_wmm, "WiFi_MultiMedia" }, + { qcsapi_wmm, "WMM" }, + { qcsapi_beacon_advertise, "beacon_advertise" }, + { qcsapi_beacon_advertise, "beacon" }, + { qcsapi_wifi_radio, "radio" }, + { qcsapi_autorate_fallback, "autorate_fallback" }, + { qcsapi_autorate_fallback, "autorate" }, + { qcsapi_security, "security" }, + { qcsapi_SSID_broadcast, "broadcast_SSID" }, + { qcsapi_SSID_broadcast, "SSID_broadcast" }, + { qcsapi_short_GI, "shortGI" }, + { qcsapi_short_GI, "short_GI" }, + { qcsapi_802_11h, "802_11h" }, + { qcsapi_tpc_query, "tpc_query" }, + { qcsapi_dfs_fast_channel_switch, "dfs_fast_switch" }, + { qcsapi_dfs_avoid_dfs_scan, "avoid_dfs_scan" }, + { qcsapi_uapsd, "uapsd" }, + { qcsapi_sta_dfs, "sta_dfs" }, + { qcsapi_specific_scan, "specific_scan" }, + { qcsapi_GI_probing, "GI_probing" }, + { qcsapi_GI_fixed, "GI_fixed" }, + { qcsapi_stbc, "stbc" }, + { qcsapi_beamforming, "beamforming" }, + { qcsapi_nosuch_option, NULL } +}; + +static const struct +{ + qcsapi_board_parameter_type board_param; + const char *board_param_name; +} qcsapi_board_parameter_name[] = +{ + { qcsapi_hw_revision, "hw_revision" }, + { qcsapi_hw_id, "hw_id" }, + { qcsapi_hw_desc, "hw_desc" }, + { qcsapi_rf_chipid, "rf_chipid" }, + { qcsapi_bond_opt, "bond_opt" }, + { qcsapi_vht, "vht_status" }, + { qcsapi_bandwidth, "bw_supported" }, + { qcsapi_spatial_stream, "spatial_stream" }, + { qcsapi_interface_types, "interface_types" }, + { qcsapi_nosuch_parameter, NULL } +}; + +static const struct +{ + qcsapi_rate_type rate_type; + const char *rate_name; +} qcsapi_rate_types_name[] = +{ + { qcsapi_basic_rates, "basic_rates" }, + { qcsapi_basic_rates, "basic" }, + { qcsapi_operational_rates, "operational_rates" }, + { qcsapi_operational_rates, "operational" }, + { qcsapi_possible_rates, "possible_rates" }, + { qcsapi_possible_rates, "possible" }, + { qcsapi_nosuch_rate, NULL } +}; + +static const struct { + qcsapi_mimo_type std_type; + const char *std_name; +} qcsapi_wifi_std_name[] = { + {qcsapi_mimo_ht, "ht"}, + {qcsapi_mimo_vht, "vht"}, + {qcsapi_nosuch_standard, NULL} +}; + +static const struct +{ + qcsapi_flash_partiton_type partition_type; + const char *partition_name; +} qcsapi_partition_name[] = +{ + { qcsapi_live_image, "live" }, + { qcsapi_safety_image, "safety" }, + { qcsapi_nosuch_partition, NULL } +}; + +static const struct +{ + int qos_queue_type; + const char *qos_queue_name; +} qcsapi_qos_queue_table[] = +{ + { WME_AC_BE, "BE" }, + { WME_AC_BK, "BK" }, + { WME_AC_VI, "VI" }, + { WME_AC_VO, "VO" }, + { WME_AC_BE, "besteffort" }, + { WME_AC_BK, "background" }, + { WME_AC_VI, "video" }, + { WME_AC_VO, "voice" } +}; + +static const struct +{ + const char *fix_name; + unsigned fix_idx; +} qcsapi_vendor_fix_table[] = +{ + { "brcm_dhcp", VENDOR_FIX_IDX_BRCM_DHCP}, + { "brcm_igmp", VENDOR_FIX_IDX_BRCM_IGMP}, +}; + +static const struct +{ + int qos_param_type; + const char *qos_param_name; +} qcsapi_qos_param_table[] = +{ + { IEEE80211_WMMPARAMS_CWMIN, "cwmin" }, + { IEEE80211_WMMPARAMS_CWMAX, "cwmax" }, + { IEEE80211_WMMPARAMS_AIFS, "aifs" }, + { IEEE80211_WMMPARAMS_TXOPLIMIT, "tx_op" }, + { IEEE80211_WMMPARAMS_TXOPLIMIT, "txoplimit" }, + { IEEE80211_WMMPARAMS_ACM, "acm" }, + { IEEE80211_WMMPARAMS_NOACKPOLICY, "noackpolicy" } +}; + +static const struct { + qcsapi_per_assoc_param pa_param; + char *pa_name; +} qcsapi_pa_param_table[] = { + {QCSAPI_LINK_QUALITY, "link_quality"}, + {QCSAPI_RSSI_DBM, "rssi_dbm"}, + {QCSAPI_BANDWIDTH, "bw"}, + {QCSAPI_SNR, "snr"}, + {QCSAPI_TX_PHY_RATE, "tx_phy_rate"}, + {QCSAPI_RX_PHY_RATE, "rx_phy_rate"}, + {QCSAPI_STAD_CCA, "stand_cca_req"}, + {QCSAPI_RSSI, "rssi"}, + {QCSAPI_PHY_NOISE, "hw_noise"}, + {QCSAPI_SOC_MAC_ADDR, "soc_macaddr"}, + {QCSAPI_SOC_IP_ADDR, "soc_ipaddr"}, + {QCSAPI_NODE_MEAS_BASIC,"basic"}, + {QCSAPI_NODE_MEAS_CCA, "cca"}, + {QCSAPI_NODE_MEAS_RPI, "rpi"}, + {QCSAPI_NODE_MEAS_CHAN_LOAD, "channel_load"}, + {QCSAPI_NODE_MEAS_NOISE_HIS, "noise_histogram"}, + {QCSAPI_NODE_MEAS_BEACON, "beacon"}, + {QCSAPI_NODE_MEAS_FRAME, "frame"}, + {QCSAPI_NODE_MEAS_TRAN_STREAM_CAT, "tran_stream_cat"}, + {QCSAPI_NODE_MEAS_MULTICAST_DIAG, "multicast_diag"}, + {QCSAPI_NODE_TPC_REP, "tpc_report"}, + {QCSAPI_NODE_LINK_MEASURE, "link_measure"}, + {QCSAPI_NODE_NEIGHBOR_REP, "neighbor_report"}, +}; + +char *support_script_table[] = { + "stop_test_packet", + "send_test_packet", + "set_test_mode", + "set_tx_pow", + "send_cw_signal", + "stop_cw_signal", + "send_cw_signal_4chain", + "show_test_packet", + "transmit_file", + "remote_command" +}; + +static const struct{ + qcsapi_system_status bit_id; + char *description; +} qcsapi_sys_status_table[] = +{ + {qcsapi_sys_status_ethernet, "Ethernet interface"}, + {qcsapi_sys_status_pcie_ep, "PCIE EP driver"}, + {qcsapi_sys_status_pcie_rc, "PCIE RC driver"}, + {qcsapi_sys_status_wifi, "WiFi driver"}, + {qcsapi_sys_status_rpcd, "Rpcd server"}, + {qcsapi_sys_status_cal_mode, "Calstate mode"}, + {qcsapi_sys_status_completed, "System boot up completely"}, +}; + +static const struct{ + const char *name; + enum qscs_cfg_param_e index; +} qcsapi_scs_param_names_table[] = +{ + {"scs_smpl_dwell_time", SCS_SMPL_DWELL_TIME}, + {"scs_sample_intv", SCS_SAMPLE_INTV}, + {"scs_thrshld_smpl_pktnum", SCS_THRSHLD_SMPL_PKTNUM}, + {"scs_thrshld_smpl_airtime", SCS_THRSHLD_SMPL_AIRTIME}, + {"scs_thrshld_atten_inc", SCS_THRSHLD_ATTEN_INC}, + {"scs_thrshld_dfs_reentry", SCS_THRSHLD_DFS_REENTRY}, + {"scs_thrshld_dfs_reentry_minrate", SCS_THRSHLD_DFS_REENTRY_MINRATE}, + {"scs_thrshld_dfs_reentry_intf", SCS_THRSHLD_DFS_REENTRY_INTF}, + {"scs_thrshld_loaded", SCS_THRSHLD_LOADED}, + {"scs_thrshld_aging_nor", SCS_THRSHLD_AGING_NOR}, + {"scs_thrshld_aging_dfsreent", SCS_THRSHLD_AGING_DFSREENT}, + {"scs_enable", SCS_ENABLE}, + {"scs_debug_enable", SCS_DEBUG_ENABLE}, + {"scs_smpl_enable", SCS_SMPL_ENABLE}, + {"scs_report_only", SCS_REPORT_ONLY}, + {"scs_cca_idle_thrshld", SCS_CCA_IDLE_THRSHLD}, + {"scs_cca_intf_hi_thrshld", SCS_CCA_INTF_HI_THRSHLD}, + {"scs_cca_intf_lo_thrshld", SCS_CCA_INTF_LO_THRSHLD}, + {"scs_cca_intf_ratio", SCS_CCA_INTF_RATIO}, + {"scs_cca_intf_dfs_margin", SCS_CCA_INTF_DFS_MARGIN}, + {"scs_pmbl_err_thrshld", SCS_PMBL_ERR_THRSHLD}, + {"scs_cca_sample_dur", SCS_CCA_SAMPLE_DUR}, + {"scs_cca_intf_smth_fctr", SCS_CCA_INTF_SMTH_NOXP}, + {"scs_cca_intf_smth_fctr", SCS_CCA_INTF_SMTH_XPED}, + {"scs_rssi_smth_fctr", SCS_RSSI_SMTH_UP}, + {"scs_rssi_smth_fctr", SCS_RSSI_SMTH_DOWN}, + {"scs_chan_mtrc_mrgn", SCS_CHAN_MTRC_MRGN}, + {"scs_atten_adjust", SCS_ATTEN_ADJUST}, + {"scs_pmbl_err_smth_fctr", SCS_PMBL_ERR_SMTH_FCTR}, + {"scs_pmbl_err_range", SCS_PMBL_ERR_RANGE}, + {"scs_pmbl_err_mapped_intf_range", SCS_PMBL_ERR_MAPPED_INTF_RANGE}, + {"scs_sp_wf", SCS_SP_WF}, + {"scs_lp_wf", SCS_LP_WF}, + {"scs_pmp_rpt_cca_smth_fctr", SCS_PMP_RPT_CCA_SMTH_FCTR}, + {"scs_pmp_rx_time_smth_fctr", SCS_PMP_RX_TIME_SMTH_FCTR}, + {"scs_pmp_tx_time_smth_fctr", SCS_PMP_TX_TIME_SMTH_FCTR}, + {"scs_pmp_stats_stable_percent", SCS_PMP_STATS_STABLE_PERCENT}, + {"scs_pmp_stats_stable_range", SCS_PMP_STATS_STABLE_RANGE}, + {"scs_pmp_stats_clear_interval", SCS_PMP_STATS_CLEAR_INTERVAL}, + {"scs_as_rx_time_smth_fctr", SCS_AS_RX_TIME_SMTH_FCTR}, + {"scs_as_tx_time_smth_fctr", SCS_AS_TX_TIME_SMTH_FCTR}, + {"scs_cca_idle_smth_fctr", SCS_CCA_IDLE_SMTH_FCTR}, + {"scs_tx_time_compensation", SCS_TX_TIME_COMPENSTATION_START}, + {"scs_rx_time_compensation", SCS_RX_TIME_COMPENSTATION_START}, + {"scs_tdls_time_compensation", SCS_TDLS_TIME_COMPENSTATION_START} +}; + +static const struct +{ + qcsapi_extender_type param_type; + const char *param_name; +} qcsapi_extender_param_table[] = +{ + {qcsapi_extender_role, "role"}, + {qcsapi_extender_mbs_best_rssi, "mbs_best_rssi"}, + {qcsapi_extender_rbs_best_rssi, "rbs_best_rssi"}, + {qcsapi_extender_mbs_wgt, "mbs_wgt"}, + {qcsapi_extender_rbs_wgt, "rbs_wgt"}, + {qcsapi_extender_roaming, "roaming"}, + {qcsapi_extender_bgscan_interval, "bgscan_interval"}, + {qcsapi_extender_verbose, "verbose"}, + {qcsapi_extender_nosuch_param, NULL}, +}; + +static const struct +{ + qcsapi_eth_info_result result_type; + const char *result_label; + const char *result_bit_set; + const char *result_bit_unset; +} qcsapi_eth_info_result_table[] = +{ + {qcsapi_eth_info_connected, "Connected", "yes", "no"}, + {qcsapi_eth_info_speed_unknown, "Speed", "unknown", NULL}, + {qcsapi_eth_info_speed_10M, "Speed", "10Mb/s", NULL}, + {qcsapi_eth_info_speed_100M, "Speed", "100Mb/s", NULL}, + {qcsapi_eth_info_speed_1000M, "Speed", "1000Mb/s", NULL}, + {qcsapi_eth_info_speed_10000M, "Speed", "10000Mb/s", NULL}, + {qcsapi_eth_info_duplex_full, "Duplex", "full", "half"}, + {qcsapi_eth_info_autoneg_on, "Auto-negotiation", NULL, "disabled"}, + {qcsapi_eth_info_autoneg_success,"Auto-negotiation", "completed", "failed"}, +}; + +static const struct +{ + qcsapi_eth_info_type type; + qcsapi_eth_info_type_mask mask; +} qcsapi_eth_info_type_mask_table[] = +{ + {qcsapi_eth_info_link, qcsapi_eth_info_link_mask}, + {qcsapi_eth_info_speed, qcsapi_eth_info_speed_mask}, + {qcsapi_eth_info_duplex, qcsapi_eth_info_duplex_mask}, + {qcsapi_eth_info_autoneg, qcsapi_eth_info_autoneg_mask}, + {qcsapi_eth_info_all, qcsapi_eth_info_all_mask}, +}; + +static const struct +{ + int reason_code; + const char *reason_string; +} qcsapi_disassoc_reason_list[] = +{ + { 0, "No disassoc reason reported" }, + { 1, "Unspecified reason" }, + { 2, "Previous authentication no longer valid" }, + { 3, "Deauthenticated because sending STA is leaving (or has left) IBSS or ESS" }, + { 4, "Disassociated due to inactivity" }, + { 5, "Disassociated because AP is unable to handle all currently associated STAs" }, + { 6, "Class 2 frame received from nonauthenticated STA" }, + { 7, "Class 3 frame received from nonassociated STA" }, + { 8, "Disassociated because sending STA is leaving (or has left) BSS" }, + { 9, "STA requesting (re)association is not authenticated with responding STA" }, + { 10, "Disassociated because the information in the Power Capability element is unacceptable" }, + { 11, "Disassociated because the information in the Supported Channels element is unacceptable" }, + { 12, "Reserved" }, + { 13, "Invalid information element, i.e., an information element defined in this standard for which the content does not meet the specifications in Clause 7" }, + { 14, "Message integrity code (MIC) failure" }, + { 15, "4-Way Handshake timeout" }, + { 16, "Group Key Handshake timeout" }, + { 17, "Information element in 4-Way Handshake different from (Re)Association Request/Probe Response/Beacon frame" }, + { 18, "Invalid group cipher" }, + { 19, "Invalid pairwise cipher" }, + { 20, "Invalid AKMP" }, + { 21, "Unsupported RSN information element version" }, + { 22, "Invalid RSN information element capabilities" }, + { 23, "IEEE 802.1X authentication failed" }, + { 24, "Cipher suite rejected because of the security policy" }, + { 25, "TDLS direct-link teardown due to TDLS peer STA unreachable via the TDLS direct link" }, + { 26, "TDLS direct-link teardown for unspecified reason" }, + { 27, "Disassociated because session terminated by SSP request" }, + { 28, "Disassociated because of lack of SSP roaming agreement" }, + { 29, "Requested service rejected because of SSP cipher suite or AKM requirement " }, + { 30, "Requested service not authorized in this location" }, + { 31, "TS deleted because QoS AP lacks sufficient bandwidth for this QoS STA due to a change in BSS service characteristics or operational mode" }, + { 32, "Disassociated for unspecified, QoS-related reason" }, + { 33, "Disassociated because QoS AP lacks sufficient bandwidth for this QoS STA" }, + { 34, "Disassociated because excessive number of frames need to be acknowledged, but are not acknowledged due to AP transmissions and/or poor channel conditions" }, + { 35, "Disassociated because STA is transmitting outside the limits of its TXOPs" }, + { 36, "Requested from peer STA as the STA is leaving the BSS (or resetting)" }, + { 37, "Requested from peer STA as it does not want to use the mechanism" }, + { 38, "Requested from peer STA as the STA received frames using the mechanism for which a setup is required" }, + { 39, "Requested from peer STA due to timeout" }, + { 45, "Peer STA does not support the requested cipher suite" }, + { 46, "Disassociated because authorized access limit reached" }, + { 47, "Disassociated due to external service requirements" }, + { 48, "Invalid FT Action frame count" }, + { 49, "Invalid pairwise master key identifier (PMKI)" }, + { 50, "Invalid MDE" }, + { 51, "Invalid FTE" }, + { 52, "SME cancels the mesh peering instance with the reason other than reaching the maximum number of peer mesh STAs" }, + { 53, "The mesh STA has reached the supported maximum number of peer mesh STAs" }, + { 54, "The received information violates the Mesh Configuration policy configured in the mesh STA profile" }, + { 55, "The mesh STA has received a Mesh Peering Close message requesting to close the mesh peering" }, + { 56, "The mesh STA has re-sent dot11MeshMaxRetries Mesh Peering Open messages, without receiving a Mesh Peering Confirm message" }, + { 57, "The confirmTimer for the mesh peering instance times out" }, + { 58, "The mesh STA fails to unwrap the GTK or the values in the wrapped contents do not match" }, + { 59, "The mesh STA receives inconsistent information about the mesh parameters between Mesh Peering Management frames" }, + { 60, "The mesh STA fails the authenticated mesh peering exchange because due to failure in selecting either the pairwise ciphersuite or group ciphersuite" }, + { 61, "The mesh STA does not have proxy information for this external destination" }, + { 62, "The mesh STA does not have forwarding information for this destination" }, + { 63, "The mesh STA determines that the link to the next hop of an active path in its forwarding information is no longer usable" }, + { 64, "The Deauthentication frame was sent because the MAC address of the STA already exists in the mesh BSS. See 11.3.3 (Additional mechanisms for an AP collocated with a mesh STA)" }, + { 65, "The mesh STA performs channel switch to meet regulatory requirements" }, + { 66, "The mesh STA performs channel switch with unspecified reason" }, +}; + +static const struct +{ + qcsapi_tdls_type param_type; + const char *param_name; +} qcsapi_tdls_param_table[] = +{ + {qcsapi_tdls_over_qhop_enabled, "tdls_over_qhop"}, + {qcsapi_tdls_indication_window, "indication_window"}, + {qcsapi_tdls_chan_switch_mode, "chan_switch_mode"}, + {qcsapi_tdls_chan_switch_off_chan, "chan_switch_off_chan"}, + {qcsapi_tdls_chan_switch_off_chan_bw, "chan_switch_off_chan_bw"}, + {qcsapi_tdls_link_timeout_time, "link_timeout_time"}, + {qcsapi_tdls_verbose, "verbose"}, + {qcsapi_tdls_discovery_interval, "disc_interval"}, + {qcsapi_tdls_node_life_cycle, "node_life_cycle"}, + {qcsapi_tdls_mode, "mode"}, + {qcsapi_tdls_min_rssi, "min_valid_rssi"}, + {qcsapi_tdls_link_weight, "link_weight"}, + {qcsapi_tdls_rate_weight, "phy_rate_weight"}, + {qcsapi_tdls_training_pkt_cnt, "training_pkt_cnt"}, + {qcsapi_tdls_switch_ints, "link_switch_ints"}, + {qcsapi_tdls_path_select_pps_thrshld, "path_sel_pps_thrshld"}, + {qcsapi_tdls_path_select_rate_thrshld, "path_sel_rate_thrshld"}, +}; + +static const struct +{ + qcsapi_tdls_oper oper; + const char *oper_name; +} qcsapi_tdls_oper_table[] = +{ + {qcsapi_tdls_oper_discover, "discover"}, + {qcsapi_tdls_oper_setup, "setup"}, + {qcsapi_tdls_oper_teardown, "teardown"}, + {qcsapi_tdls_oper_switch_chan, "switch_chan"}, +}; + +static const char *qcsapi_auth_algo_list[] = { + "OPEN", + "SHARED", +}; + +static const char *qcsapi_auth_keyproto_list[] = { + "NONE", + "WPA", + "WPA2", +}; + +static const char *qcsapi_auth_keymgmt_list[] = { + "NONE", + "WPA-EAP", + "WPA-PSK", + "WEP", +}; + +static const char *qcsapi_auth_cipher_list[] = { + "WEP", + "TKIP", + "OCB", + "CCMP", + "CMAC", + "CKIP", +}; + +static const char *qcsapi_wifi_modes_strings[] = WLAN_WIFI_MODES_STRINGS; + + +static const char* +qcsapi_csw_reason_list[] = { + [IEEE80211_CSW_REASON_UNKNOWN] = "UNKNOWN", + [IEEE80211_CSW_REASON_SCS] = "SCS", + [IEEE80211_CSW_REASON_DFS] = "DFS", + [IEEE80211_CSW_REASON_MANUAL] = "MANUAL", + [IEEE80211_CSW_REASON_CONFIG] = "CONFIG", + [IEEE80211_CSW_REASON_SCAN] = "SCAN", + [IEEE80211_CSW_REASON_OCAC] = "OCAC", + [IEEE80211_CSW_REASON_CSA] = "CSA", + [IEEE80211_CSW_REASON_TDLS_CS] = "TDLS", +}; + +static int verbose_flag = 0; +static unsigned int call_count = 1; +static unsigned int delay_time = 0; + +static unsigned int internal_flags = 0; + +static unsigned int call_qcsapi_init_count = 1; + +enum +{ + m_force_NULL_address = 0x01 +}; + +char *qcsapi_80211u_params[] = { + "internet", + "access_network_type", + "network_auth_type", + "hessid", + "domain_name", + "ipaddr_type_availability", + "anqp_3gpp_cell_net", + "venue_group", + "venue_type", + "gas_comeback_delay", + NULL +}; + +char *qcsapi_hs20_params[] = { + "hs20_wan_metrics", + "disable_dgaf", + "hs20_operating_class", +}; + +/* returns 1 if successful; 0 if failure */ + +static int +name_to_entry_point_enum( char *lookup_name, qcsapi_entry_point *p_entry_point ) +{ + int retval = 1; + int found_entry = 0, proposed_enum = (int) e_qcsapi_nosuch_api; + unsigned int iter; + /* + * Silently skip over "qscapi_" ... + */ + if (strncasecmp( lookup_name, "qscapi_", 7 ) == 0) + lookup_name += 7; + + for (iter = 0; qcsapi_entry_name[ iter ].api_name != NULL && found_entry == 0; iter++) + { + if (strcasecmp( qcsapi_entry_name[ iter ].api_name, lookup_name ) == 0) + { + found_entry = 1; + *p_entry_point = qcsapi_entry_name[ iter ].e_entry_point; + } + } + + if (found_entry == 0) + { + *p_entry_point = proposed_enum; + retval = 0; + } + + return( retval ); +} + +/* Guaranteed to return a valid string address */ + +static const char * +entry_point_enum_to_name( qcsapi_entry_point e_qcsapi_entry_point ) +{ + const char *retaddr = "No such QCSAPI"; + int found_entry = 0; + unsigned int iter; + + for (iter = 0; qcsapi_entry_name[ iter ].api_name != NULL && found_entry == 0; iter++) + { + if (qcsapi_entry_name[ iter ].e_entry_point == e_qcsapi_entry_point) + { + found_entry = 1; + retaddr = qcsapi_entry_name[ iter ].api_name; + } + } + + return( retaddr ); +} + +static void +list_entry_point_names(qcsapi_output *print) +{ + unsigned int iter; + + print_out( print, "API entry point names (more than one name can refer to the same entry point):\n" ); + + for (iter = 0; qcsapi_entry_name[ iter ].api_name != NULL; iter++) + { + print_out( print, "\t%s\n", qcsapi_entry_name[ iter ].api_name ); + } +} + +static void +grep_entry_point_names(qcsapi_output *print, const char *reg) +{ + unsigned int iter; + + print_out( print, "API entry point names (more than one name can refer to the same entry point):\n" ); + + for (iter = 0; qcsapi_entry_name[ iter ].api_name != NULL; iter++) + { + if ( strstr(qcsapi_entry_name[ iter ].api_name, reg) ) + print_out( print, "\t%s\n", qcsapi_entry_name[ iter ].api_name ); + } +} + +/* returns 1 if successful; 0 if failure */ + +static int +name_to_counter_enum( char *lookup_name, qcsapi_counter_type *p_counter_type ) +{ + int retval = 0; + int found_entry = 0; + unsigned int iter; + + for (iter = 0; qcsapi_counter_name[ iter ].counter_name != NULL && found_entry == 0; iter++) + { + if (strcasecmp( qcsapi_counter_name[ iter ].counter_name, lookup_name ) == 0) + { + found_entry = 1; + *p_counter_type = qcsapi_counter_name[ iter ].counter_type; + } + } + + if (found_entry) + retval = 1; + + return( retval ); +} + +/* Guaranteed to return a valid string address */ + +static const char * +counter_enum_to_name( qcsapi_counter_type the_counter_type ) +{ + const char *retaddr = "No such QCSAPI counter"; + int found_entry = 0; + unsigned int iter; + + for (iter = 0; qcsapi_counter_name[ iter ].counter_name != NULL && found_entry == 0; iter++) + { + if (qcsapi_counter_name[ iter ].counter_type == the_counter_type) + { + found_entry = 1; + retaddr = qcsapi_counter_name[ iter ].counter_name; + } + } + + return( retaddr ); +} + +static void +list_counter_names(qcsapi_output *print) +{ + unsigned int iter; + + print_out( print, "API counters:\n" ); + + for (iter = 0; qcsapi_counter_name[ iter ].counter_name != NULL; iter++) { + print_out( print, "\t%s\n", qcsapi_counter_name[ iter ].counter_name ); + } +} + +static void +list_per_node_param_names(qcsapi_output *print) +{ + unsigned int iter; + + print_out(print, "Per-node parameters:\n"); + + for (iter = 0; iter < ARRAY_SIZE(qcsapi_pa_param_table); iter++) { + print_out(print, "\t%s\n", qcsapi_pa_param_table[ iter ].pa_name); + } +} + +/* returns 1 if successful; 0 if failure */ + +static int +name_to_option_enum( char *lookup_name, qcsapi_option_type *p_option ) +{ + int retval = 0; + int found_entry = 0; + unsigned int iter; + + for (iter = 0; qcsapi_option_name[ iter ].option_name != NULL && found_entry == 0; iter++) + { + if (strcasecmp( qcsapi_option_name[ iter ].option_name, lookup_name ) == 0) + { + found_entry = 1; + *p_option = qcsapi_option_name[ iter ].option_type; + } + } + + if (found_entry) + retval = 1; + + return( retval ); +} + +/* Guaranteed to return a valid string address */ + +static const char * +option_enum_to_name( qcsapi_option_type the_option_type ) +{ + const char *retaddr = "No such QCSAPI option"; + int found_entry = 0; + unsigned int iter; + + for (iter = 0; qcsapi_option_name[ iter ].option_name != NULL && found_entry == 0; iter++) + { + if (qcsapi_option_name[ iter ].option_type == the_option_type) + { + found_entry = 1; + retaddr = qcsapi_option_name[ iter ].option_name; + } + } + + return( retaddr ); +} + +static void +list_option_names(qcsapi_output *print) +{ + unsigned int iter; + + print_out( print, "API options (more than one name can refer to the same option):\n" ); + + for (iter = 0; qcsapi_option_name[ iter ].option_name != NULL; iter++) + { + print_out( print, "\t%s\n", qcsapi_option_name[ iter ].option_name ); + } +} + +/* returns 1 if successful; 0 if failure */ +static int +name_to_board_parameter_enum( char *lookup_name, qcsapi_board_parameter_type *p_boardparam ) +{ + int retval = 0; + int found_entry = 0; + unsigned int iter; + + for (iter = 0; + qcsapi_board_parameter_name[ iter ].board_param_name != NULL && (found_entry == 0); + iter++) + { + if (strcasecmp( qcsapi_board_parameter_name[ iter ].board_param_name, lookup_name ) == 0) + { + found_entry = 1; + *p_boardparam = qcsapi_board_parameter_name[ iter ].board_param; + } + } + + if (found_entry) + retval = 1; + + return( retval ); +} + +static const char * +board_paramter_enum_to_name( qcsapi_board_parameter_type the_board_param ) +{ + const char *retaddr = "No such QCSAPI option"; + int found_entry = 0; + unsigned int iter; + + for (iter = 0; + qcsapi_board_parameter_name[ iter ].board_param_name != NULL && found_entry == 0; + iter++) + { + if (qcsapi_board_parameter_name[ iter ].board_param == the_board_param) + { + found_entry = 1; + retaddr = qcsapi_board_parameter_name[ iter ].board_param_name; + } + } + + return( retaddr ); +} + +static void +list_board_parameter_names( qcsapi_output *print ) +{ + unsigned int iter; + + for (iter = 0; qcsapi_board_parameter_name[ iter ].board_param_name != NULL; iter++) + { + print_out( print, "\t%s\n", qcsapi_board_parameter_name[ iter ].board_param_name ); + } +} + +/* returns 1 if successful; 0 if failure */ + +static int +name_to_rates_enum( char *lookup_name, qcsapi_rate_type *p_rates ) +{ + int retval = 0; + int found_entry = 0; + unsigned int iter; + + for (iter = 0; qcsapi_rate_types_name[ iter ].rate_name != NULL && found_entry == 0; iter++) + { + if (strcasecmp( qcsapi_rate_types_name[ iter ].rate_name, lookup_name ) == 0) + { + found_entry = 1; + *p_rates = qcsapi_rate_types_name[ iter ].rate_type; + } + } + + if (found_entry) + retval = 1; + + return( retval ); +} + +/* Guaranteed to return a valid string address */ + +static const char * +rates_enum_to_name( qcsapi_rate_type the_option_type ) +{ + const char *retaddr = "No such type of rates"; + int found_entry = 0; + unsigned int iter; + + for (iter = 0; qcsapi_rate_types_name[ iter ].rate_name != NULL && found_entry == 0; iter++) + { + if (qcsapi_rate_types_name[ iter ].rate_type == the_option_type) + { + found_entry = 1; + retaddr = qcsapi_rate_types_name[ iter ].rate_name; + } + } + + return( retaddr ); +} + +static int +name_to_wifi_std_enum(const char *lookup_name, qcsapi_mimo_type *p_modulation) +{ + unsigned int iter = 0; + unsigned int found_entry = 0; + + while (qcsapi_wifi_std_name[iter].std_name && !found_entry) { + if (!strcasecmp(qcsapi_wifi_std_name[iter].std_name, lookup_name)) { + *p_modulation = qcsapi_wifi_std_name[iter].std_type; + found_entry = 1; + } + ++iter; + } + + return found_entry; +} + +static const char* +wifi_std_enum_to_name(const qcsapi_mimo_type lookup_type) +{ + unsigned int iter = 0; + const char *ret_name = "No such type of standard"; + + while (qcsapi_wifi_std_name[iter].std_name) { + if (qcsapi_wifi_std_name[iter].std_type == lookup_type) { + ret_name = qcsapi_wifi_std_name[iter].std_name; + break; + } + ++iter; + } + + return ret_name; +} + + +/* returns 1 if successful; 0 if failure */ +static int +name_to_partition_type( char *lookup_name, qcsapi_flash_partiton_type *p_partition_type ) +{ + int retval = 0; + unsigned int iter; + + for (iter = 0; qcsapi_partition_name[ iter ].partition_name != NULL && retval == 0; iter++) + { + if (strcasecmp( qcsapi_partition_name[ iter ].partition_name, lookup_name ) == 0) + { + retval = 1; + *p_partition_type = qcsapi_partition_name[ iter ].partition_type; + } + } + + return( retval ); +} + +static int name_to_qos_queue_type(char *lookup_name, int *p_qos_queue_type) +{ + int retval = 0; + unsigned int iter; + + for (iter = 0; iter < ARRAY_SIZE(qcsapi_qos_queue_table); iter++) { + if (strcasecmp(qcsapi_qos_queue_table[iter].qos_queue_name, lookup_name) == 0) { + *p_qos_queue_type = qcsapi_qos_queue_table[iter].qos_queue_type; + retval = 1; + break; + } + } + + return retval; +} + +static int name_to_qos_param_type(char *lookup_name, int *p_qos_param_type) +{ + int retval = 0; + unsigned int iter; + + for (iter = 0; iter < ARRAY_SIZE(qcsapi_qos_param_table); iter++) { + if (strcasecmp(qcsapi_qos_param_table[iter].qos_param_name, lookup_name) == 0) { + *p_qos_param_type = qcsapi_qos_param_table[iter].qos_param_type; + retval = 1; + break; + } + } + + return retval; +} + +static int name_to_vendor_fix_idx(char *lookup_name, int *p_vendor_fix_idx) +{ + int retval = 0; + unsigned int iter; + + for (iter = 0; iter < ARRAY_SIZE(qcsapi_vendor_fix_table); iter++) { + if (strcasecmp(qcsapi_vendor_fix_table[iter].fix_name, lookup_name) == 0) { + *p_vendor_fix_idx = qcsapi_vendor_fix_table[iter].fix_idx; + retval = 1; + break; + } + } + + return retval; +} + +static int name_to_per_assoc_parameter(const char *param_name, + qcsapi_per_assoc_param *p_per_assoc_param) +{ + unsigned int iter; + + for (iter = 0; iter < ARRAY_SIZE(qcsapi_pa_param_table); iter++) { + if (strcasecmp(qcsapi_pa_param_table[iter].pa_name, param_name) == 0) { + *p_per_assoc_param = qcsapi_pa_param_table[iter].pa_param; + return 1; + } + } + + return 0; +} + +static int parse_local_remote_flag(qcsapi_output *print, const char *local_remote_str, int *p_local_remote_flag) +{ + int local_remote_flag = QCSAPI_LOCAL_NODE; + + if (isdigit(local_remote_str[0])) { + local_remote_flag = atoi(local_remote_str); + } else if (strcasecmp(local_remote_str, "remote") == 0) { + local_remote_flag = QCSAPI_REMOTE_NODE; + } else if (strcasecmp(local_remote_str, "local") == 0) { + local_remote_flag = QCSAPI_LOCAL_NODE; + } else { + print_err(print, "Invalid value %s for local/remote flag\n", local_remote_str); + return -1; + } + + *p_local_remote_flag = local_remote_flag; + return 0; +} + +static int name_to_tdls_param_enum(char *lookup_name, qcsapi_tdls_type *p_tdls_type) +{ + int retval = 0; + int found_entry = 0; + unsigned int iter; + + for (iter = 0; qcsapi_tdls_param_table[iter].param_name != NULL && found_entry == 0; iter++) { + if (strcasecmp(qcsapi_tdls_param_table[iter].param_name, lookup_name) == 0) { + found_entry = 1; + *p_tdls_type = qcsapi_tdls_param_table[iter].param_type; + break; + } + } + + if (found_entry) + retval = 1; + + return (retval); +} + +static int name_to_tdls_oper_enum(char *lookup_name, qcsapi_tdls_oper *p_tdls_oper) +{ + int retval = 0; + int found_entry = 0; + unsigned int iter; + unsigned int table_size = 0; + + table_size = TABLE_SIZE(qcsapi_tdls_oper_table); + + for (iter = 0; iter < table_size; iter++) { + if (strcasecmp(qcsapi_tdls_oper_table[iter].oper_name, lookup_name) == 0) { + found_entry = 1; + *p_tdls_oper = qcsapi_tdls_oper_table[iter].oper; + break; + } + } + + if (found_entry) + retval = 1; + + return (retval); +} + +static int name_to_extender_param_enum(char *lookup_name, qcsapi_extender_type *p_extender_type) +{ + unsigned int iter; + + for (iter = 0; qcsapi_extender_param_table[iter].param_name != NULL; iter++) { + if (strcasecmp(qcsapi_extender_param_table[iter].param_name, + lookup_name) == 0) { + *p_extender_type = qcsapi_extender_param_table[iter].param_type; + return 1; + } + } + + return 0; +} + +static int +parse_generic_parameter_name(qcsapi_output *print, char *generic_parameter_name, qcsapi_generic_parameter *p_generic_parameter ) +{ + int retval = 1; + qcsapi_unsigned_int tmpuval = 0; + qcsapi_tdls_type *p_tdls_type = NULL; + qcsapi_tdls_oper *p_tdls_oper = NULL; + qcsapi_extender_type *p_extender_type = NULL; + + switch( p_generic_parameter->generic_parameter_type ) + { + case e_qcsapi_option: + retval = name_to_option_enum( generic_parameter_name, &(p_generic_parameter->parameter_type.option) ); + if (retval == 0) + print_err( print, "Invalid QCSAPI option %s\n", generic_parameter_name ); + break; + + case e_qcsapi_counter: + retval = name_to_counter_enum( generic_parameter_name, &(p_generic_parameter->parameter_type.counter) ); + if (retval == 0) + print_err( print, "Invalid QCSAPI counter %s\n", generic_parameter_name ); + break; + + case e_qcsapi_rates: + retval = name_to_rates_enum( generic_parameter_name, &(p_generic_parameter->parameter_type.typeof_rates) ); + if (retval == 0) + print_err( print, "Invalid QCSAPI type of rates %s\n", generic_parameter_name ); + break; + + case e_qcsapi_modulation: + retval = name_to_wifi_std_enum(generic_parameter_name, + &p_generic_parameter->parameter_type.modulation); + if (!retval) + print_err(print, "Invalid QCSAPI MIMO modulation %s\n", + generic_parameter_name); + break; + + case e_qcsapi_index: + case e_qcsapi_LED: + if (!isdigit(generic_parameter_name[0])) { + if (e_qcsapi_option == e_qcsapi_LED) { + print_err(print, "LED must be a numeric value\n"); + } else { + print_err(print, "Node index must be a numeric value\n"); + } + retval = 0; + } + + tmpuval = (qcsapi_unsigned_int) atoi( generic_parameter_name ); + if (p_generic_parameter->generic_parameter_type == e_qcsapi_LED && tmpuval > QCSAPI_MAX_LED) + { + print_err( print, "Invalid QSCAPI LED %u\n", tmpuval ); + retval = 0; + } + else + p_generic_parameter->index = (qcsapi_unsigned_int) atoi( generic_parameter_name ); + break; + + case e_qcsapi_select_SSID: + case e_qcsapi_SSID_index: + /* + * APIs with generic parameter type of e_qcsapi_SSID_index expect both an SSID and an index. + * Get the SSID now. Get the index in the individual call_qcsapi routines. + */ + strncpy( + &(p_generic_parameter->parameter_type.the_SSID[ 0 ]), + generic_parameter_name, + sizeof( p_generic_parameter->parameter_type.the_SSID ) - 1 + ); + p_generic_parameter->parameter_type.the_SSID[ sizeof( p_generic_parameter->parameter_type.the_SSID ) - 1 ] = '\0'; + break; + + case e_qcsapi_file_path_config: + if (strcasecmp( "security", generic_parameter_name ) != 0) + { + print_err( print, "Invalid QCSAPI file path configuration %s\n", generic_parameter_name ); + retval = 0; + } + else + p_generic_parameter->index = (qcsapi_unsigned_int) qcsapi_security_configuration_path; + break; + + case e_qcsapi_tdls_params: + p_tdls_type = &(p_generic_parameter->parameter_type.type_of_tdls); + retval = name_to_tdls_param_enum(generic_parameter_name, p_tdls_type); + if (retval == 0) + print_err(print, "Invalid QCSAPI tdls param %s\n", generic_parameter_name); + break; + case e_qcsapi_tdls_oper: + p_tdls_oper = &(p_generic_parameter->parameter_type.tdls_oper); + retval = name_to_tdls_oper_enum(generic_parameter_name, p_tdls_oper); + if (retval == 0) + print_err(print, "Invalid QCSAPI tdls oper %s\n", generic_parameter_name); + break; + + + case e_qcsapi_board_parameter: + retval = name_to_board_parameter_enum(generic_parameter_name, + &(p_generic_parameter->parameter_type.board_param) ); + if (retval == 0) + print_err( print, "Invalid QCSAPI option %s\n", generic_parameter_name ); + break; + + case e_qcsapi_extender_params: + p_extender_type = &(p_generic_parameter->parameter_type.type_of_extender); + retval = name_to_extender_param_enum(generic_parameter_name, + p_extender_type); + if (retval == 0) + print_err(print, "Invalid QCSAPI extender param %s\n", + generic_parameter_name); + break; + + case e_qcsapi_none: + default: + print_err( print, "Programming error in parse generic parameter name:\n" ); + if (p_generic_parameter->generic_parameter_type == e_qcsapi_none) + { + print_err( print, "Called with generic parameter type of none.\n" ); + } + else + { + print_err( print, "Called with unknown parameter type %d.\n", + p_generic_parameter->generic_parameter_type ); + } + retval = 0; + break; + } + + return( retval ); +} + +static const char * +wifi_mode_to_string(qcsapi_output *print, qcsapi_wifi_mode current_wifi_mode ) +{ + const char *retaddr = "Unknown WIFI mode"; + + switch (current_wifi_mode) + { + case qcsapi_mode_not_defined: + retaddr = "WIFI mode not defined"; + break; + + case qcsapi_access_point: + retaddr = "Access point"; + break; + + case qcsapi_station: + retaddr = "Station"; + break; + + case qcsapi_nosuch_mode: + default: + print_out( print, "Unknown WIFI mode\n" ); + break; + } + + return( retaddr ); +} + +static qcsapi_wifi_mode +string_to_wifi_mode(const char* str) +{ + if (strcasecmp(str, "ap") == 0) { + return qcsapi_access_point; + } else if (strcasecmp(str, "access_point") == 0) { + return qcsapi_access_point; + } else if (strcasecmp(str, "access point") == 0) { + return qcsapi_access_point; + } else if (strcasecmp(str, "sta") == 0) { + return qcsapi_station; + } else if (strcasecmp(str, "station") == 0) { + return qcsapi_station; + } else if (strcasecmp(str, "repeater") == 0) { + return qcsapi_repeater; + } else { + return qcsapi_nosuch_mode; + } +} + +static int string_to_list(qcsapi_output *print, void *input_str, uint8_t *output_list, unsigned int *number) +{ + uint8_t list_number = 0; + char *pcur = NULL, *pend = NULL; + char buffer[256] = {0}; + char *input_end; + int single_len = 0; + + if (!input_str || !output_list || !number) + return -EINVAL; + + input_end = input_str + strnlen(input_str, 1024); + pcur = input_str; + do { + pend = strchr(pcur, ','); + if (pend) { + single_len = pend - pcur; + strncpy(buffer, pcur, single_len); + buffer[single_len] = 0; + pend++; + output_list[list_number++] = atoi(buffer); + pcur = pend; + } else if (pcur) { + output_list[list_number++] = atoi(pcur); + } + } while (pend && pend < input_end); + + *number = list_number; + + return 0; +} + +static int +dump_generic_parameter_name(qcsapi_output *print, qcsapi_generic_parameter *p_generic_parameter ) +{ + int retval = 1; + + switch( p_generic_parameter->generic_parameter_type ) + { + case e_qcsapi_option: + print_out( print, "%s", option_enum_to_name( p_generic_parameter->parameter_type.option ) ); + break; + + case e_qcsapi_counter: + print_out( print, "%s", counter_enum_to_name( p_generic_parameter->parameter_type.counter ) ); + break; + + case e_qcsapi_rates: + print_out( print, "%s", rates_enum_to_name( p_generic_parameter->parameter_type.typeof_rates ) ); + break; + + case e_qcsapi_modulation: + print_out(print, "%s", wifi_std_enum_to_name( + p_generic_parameter->parameter_type.modulation)); + break; + + case e_qcsapi_index: + case e_qcsapi_LED: + print_out( print, "%u", p_generic_parameter->index ); + break; + + case e_qcsapi_file_path_config: + print_out( print, "security" ); + break; + + case e_qcsapi_select_SSID: + case e_qcsapi_SSID_index: + print_out( print, "%s", &(p_generic_parameter->parameter_type.the_SSID[ 0 ]) ); + break; + + case e_qcsapi_board_parameter: + print_out( print, "%s", board_paramter_enum_to_name( p_generic_parameter->parameter_type.board_param ) ); + break; + + case e_qcsapi_none: + default: + print_out( print, "Programming error in dump generic parameter name:\n" ); + if (p_generic_parameter->generic_parameter_type == e_qcsapi_none) + { + print_out( print, "Called with generic parameter type of none.\n" ); + } + else + { + print_out( print, "Called with unknown parameter type %d.\n", p_generic_parameter->generic_parameter_type ); + } + retval = 0; + break; + } + + return( retval ); +} + +static void +dump_mac_addr(qcsapi_output *print, qcsapi_mac_addr mac_addr ) +{ + print_out( print, "%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 ] + ); +} + +static void dump_data_array(qcsapi_output *print, uint8_t *data, int size, int order, char delimiter) +{ + int i; + + if (data == NULL) + return; + + i = 0; + if (order == 10) { + do { + print_out(print, "%d%c", data[i], delimiter); + i++; + } while (i < (size - 1)); + print_out(print, "%d", data[i]); + } else { + do { + print_out(print, "0x%x%c", data[i], delimiter); + i++; + } while (i < (size - 1)); + print_out(print, "0x%x", data[i]); + } + + print_out(print, "\n"); +} + +static void +dump_scs_param(qcsapi_output *print, qcsapi_scs_param_rpt *p_rpt) +{ +#define MAX_SCS_PARAM_DESC 35 + int j, loop; + uint32_t str_len = 0; + const char *name; + uint32_t index; + + for (j = 0; j < TABLE_SIZE(qcsapi_scs_param_names_table); j++) { + name = qcsapi_scs_param_names_table[j].name; + index = qcsapi_scs_param_names_table[j].index; + + str_len = min(strlen(name), strlen("scs_tdls_time_compensation")); + if (!strncmp(name, "scs_tx_time_compensation", str_len) || + !strncmp(name, "scs_rx_time_compensation", str_len) || + !strncmp(name, "scs_tdls_time_compensation", str_len)) { + print_out(print, "%-*s ", MAX_SCS_PARAM_DESC, name); + loop = SCS_MAX_TXTIME_COMP_INDEX; + do { + print_out(print, "%u ", p_rpt[index++].scs_cfg_param); + loop--; + } while (loop); + print_out(print, "\n"); + } else { + if (p_rpt[index].scs_signed_param_flag == 0) { + print_out(print, "%-*s %u\n", MAX_SCS_PARAM_DESC, name, p_rpt[index].scs_cfg_param); + } + else if (p_rpt[index].scs_signed_param_flag == 1) { + print_out(print, "%-*s %d\n", MAX_SCS_PARAM_DESC, name, p_rpt[index].scs_cfg_param); + } + else { + print_out(print, "invalid param flag!\n"); + } + } + } +} +static void +report_qcsapi_error( const call_qcsapi_bundle *p_calling_bundle, const int qcsapi_errorval ) +{ + char error_msg[ 128 ] = { '\0' }; + qcsapi_output *print = p_calling_bundle->caller_output; + + qcsapi_errno_get_message( qcsapi_errorval, &error_msg[ 0 ], sizeof( error_msg ) ); + print_out( print, "QCS API error %d: %s\n", 0 - qcsapi_errorval, &error_msg[ 0 ] ); +} + +static void +print_start_scan_usage(qcsapi_output* print) +{ + print_out(print, "start_scan usage:\n" + "call_qcsapi start_scan wifi0 \n" + "algorithm should be : reentry, clearest(default), no_pick, background\n" + "select_channels should be : dfs, non_dfs, all(default)\n" + "control_flag should be: flush, active, fast, normal, slow\n"); +} + +static void +print_cancel_scan_usage(qcsapi_output* print) +{ + print_out(print, "cancel_scan usage:\ncall_qcsapi cancel_scan wifi0 [force]\n"); +} + +static int safe_atou32(char *str, uint32_t *p, qcsapi_output *print, uint32_t min, uint32_t max) +{ + uint32_t v; + + if (qcsapi_verify_numeric(str) < 0 + || qcsapi_str_to_uint32(str, &v) < 0) { + print_err(print, "Invalid parameter %s - must be an unsigned integer\n", str); + return 0; + } + + if (v < min || v > max) { + print_err(print, "Invalid parameter %s - value must be between %u and %u\n", str, min, max); + return 0; + } + + *p = v; + + return 1; +} + +static int safe_atou16(char *str, uint16_t *p, qcsapi_output *print, uint16_t min, uint16_t max) +{ + uint32_t v; + + if (safe_atou32(str, &v, print, min, max)) { + *p = (uint16_t)v; + return 1; + } + + return 0; +} + +static const char * +csw_reason_to_string(uint32_t reason_id) +{ + COMPILE_TIME_ASSERT(ARRAY_SIZE(qcsapi_csw_reason_list) == IEEE80211_CSW_REASON_MAX); + + if (reason_id < ARRAY_SIZE(qcsapi_csw_reason_list)) + return qcsapi_csw_reason_list[reason_id]; + + return qcsapi_csw_reason_list[IEEE80211_CSW_REASON_UNKNOWN]; +} + +/* interface programs to call individual QCSAPIs */ + +static int +call_qcsapi_errno_get_message( const call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[] ) +{ + int statval = 0; + qcsapi_output *print = p_calling_bundle->caller_output; + + if (argc < 1) + { + print_err( print, "Not enough parameters in call qcsapi get error message\n" ); + print_err( print, "Usage: call_qcsapi get_error_message \n" ); + print_err( print, "Returned error value should be less than 0\n" ); + statval = 1; + } + else + { + int qcsapi_retval; + int qcsapi_errorval = atoi( argv[ 0 ] ); + char *error_str = NULL; + unsigned int message_size = 80; + int ok_to_proceed = 1; + + if (argc >= 2 && strcmp( argv[ 1 ], "NULL" ) != 0) + { + message_size = (unsigned int) atoi( argv[ 1 ] ); + } + + error_str = malloc( message_size ); + + if (error_str == NULL) + { + print_err( print, "Failed to allocate %u chars\n", message_size ); + ok_to_proceed = 0; + statval = 1; + } + + if (ok_to_proceed) + { + qcsapi_retval = qcsapi_errno_get_message( qcsapi_errorval, error_str, message_size ); + + if (qcsapi_retval >= 0) + { + if (verbose_flag >= 0) + { + print_out( print, "%s\n", error_str ); + } + } + else + { + report_qcsapi_error( p_calling_bundle, qcsapi_retval ); + statval = 1; + } + + if (error_str != NULL) + free( error_str ); + } + } + + return( statval ); +} + +static int +call_qcsapi_store_ipaddr(const call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[]) +{ + int qcsapi_retval; + qcsapi_output *print = p_calling_bundle->caller_output; + uint32_t ipaddr; + uint32_t netmask; + int netmask_len; + char *slash; + char *usage = "Usage: call_qcsapi store_ipaddr [/]\n"; + + if (argc != 1) { + print_out(print, usage); + return -EINVAL; + } + + slash = strstr(argv[0], "/"); + if (slash == NULL) { + netmask = htonl(0xFFFFFF00); + } else { + *slash = '\0'; + netmask_len = atoi(slash + 1); + if (netmask_len < 1 || netmask_len > 32) { + print_err(print, "invalid network mask %s\n", slash + 1); + return -EINVAL; + } + netmask = htonl(~((1 << (32 - netmask_len)) - 1)); + } + + if (inet_pton(AF_INET, argv[0], &ipaddr) != 1) { + print_err(print, "invalid IPv4 address %s\n", argv[0]); + return -EINVAL; + } + if (ipaddr == 0) { + print_err(print, "invalid IPv4 address %s\n", argv[0]); + return -EINVAL; + } + + qcsapi_retval = qcsapi_store_ipaddr(ipaddr, netmask); + + if (qcsapi_retval < 0) { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + return 1; + } + + if (verbose_flag >= 0) { + print_out(print, "complete\n"); + } + + return 0; +} + +static int +call_qcsapi_interface_enable( const call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[] ) +{ + int statval = 0; + int qcsapi_retval; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + + if (argc < 1) + { + print_err( print, "Not enough parameters in call qcsapi enable interface\n" ); + print_err( print, "Usage: call_qcsapi enable_interface <0 | 1>\n" ); + statval = 1; + } + else + { + int enable_flag = atoi( argv[ 0 ] ); + /* + * This program is a model for all programs that call a QCSAPI. + * If the verbose flag is less than 0, do not report nominal (non-error) results. + * + * Like this, one can test for aging (sockets, files not closed) without + * seemingly endless output of "complete", etc. + * + * And if you want to see that output, just avoid enabling quiet mode. + * + * Errors though are ALWAYS reported (else how can you see if the aging test failed?) + * And keep trying the test; we may want to ensure a test case that is expected to + * cause an error does not itself have aging problems. + */ + qcsapi_retval = qcsapi_interface_enable( the_interface, enable_flag ); + if (qcsapi_retval >= 0) + { + if (verbose_flag >= 0) + { + print_out( print, "complete\n" ); + } + } + else + { + report_qcsapi_error( p_calling_bundle, qcsapi_retval ); + statval = 1; + } + } + + return( statval ); +} + +static int +call_qcsapi_interface_get_BSSID( const call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[] ) +{ + int statval = 0; + qcsapi_mac_addr the_mac_addr; + int qcsapi_retval; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + + if (argc > 0 && strcmp( argv[ 0 ], "NULL" ) == 0) + qcsapi_retval = qcsapi_interface_get_BSSID( the_interface, NULL ); + else + qcsapi_retval = qcsapi_interface_get_BSSID( the_interface, the_mac_addr ); + if (qcsapi_retval >= 0) + { + if (verbose_flag >= 0) + { + dump_mac_addr(print, the_mac_addr ); + } + } + else + { + report_qcsapi_error( p_calling_bundle, qcsapi_retval ); + statval = 1; + } + + return( statval ); +} + +static int +call_qcsapi_interface_get_mac_addr( const call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[] ) +{ + int statval = 0; + qcsapi_mac_addr the_mac_addr; + int qcsapi_retval; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + + if (argc > 0 && strcmp( argv[ 0 ], "NULL" ) == 0) + qcsapi_retval = qcsapi_interface_get_mac_addr( the_interface, NULL ); + else + qcsapi_retval = qcsapi_interface_get_mac_addr( the_interface, the_mac_addr ); + if (qcsapi_retval >= 0) + { + if (verbose_flag >= 0) + { + dump_mac_addr(print, the_mac_addr ); + } + } + else + { + report_qcsapi_error( p_calling_bundle, qcsapi_retval ); + statval = 1; + } + + return( statval ); +} + +static int +call_qcsapi_interface_set_mac_addr( const call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[] ) +{ + int statval = 0; + qcsapi_output *print = p_calling_bundle->caller_output; + + if (argc < 1) + { + print_err( print, "Not enough parameters in call qcsapi interface set mac address, count is %d\n", argc ); + statval = 1; + } + else + { + int qcsapi_retval; + qcsapi_mac_addr the_mac_addr; + const char *the_interface = p_calling_bundle->caller_interface; + + if (strcmp( argv[0], "NULL" ) == 0) + qcsapi_retval = qcsapi_interface_set_mac_addr( the_interface, NULL ); + else + { + int ival = parse_mac_addr( argv[0], the_mac_addr ); + if (ival >= 0) + qcsapi_retval = qcsapi_interface_set_mac_addr( the_interface, the_mac_addr ); + else { + print_out( print, "Error parsing MAC address %s\n", argv[0]); + statval = 1; + } + + if (ival >= 0) + { + if (qcsapi_retval >= 0) + { + if (verbose_flag >= 0) + { + print_out( print, "complete\n" ); + } + } + else + { + report_qcsapi_error( p_calling_bundle, qcsapi_retval ); + statval = 1; + } + } + } + } + + return( statval ); +} + +static int +call_qcsapi_interface_get_counter( const call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[] ) +{ + int statval = 0; + qcsapi_unsigned_int counter_value; + qcsapi_unsigned_int *p_counter_value = NULL; + int qcsapi_retval; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + qcsapi_counter_type the_counter_type = p_calling_bundle->caller_generic_parameter.parameter_type.counter; + + if (argc < 1 || strcmp( argv[ 0 ], "NULL" ) != 0) + p_counter_value = &counter_value; + + qcsapi_retval = qcsapi_interface_get_counter( the_interface, the_counter_type, p_counter_value ); + if (qcsapi_retval >= 0) + { + if (verbose_flag >= 0) + { + print_out( print, "%u\n", (unsigned int) counter_value ); + } + } + else + { + report_qcsapi_error( p_calling_bundle, qcsapi_retval ); + statval = 1; + } + + return( statval ); +} + +static int +call_qcsapi_interface_get_counter64( const call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[] ) +{ + int statval = 0; + uint64_t counter_value; + uint64_t *p_counter_value = NULL; + int qcsapi_retval; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + qcsapi_counter_type the_counter_type = + p_calling_bundle->caller_generic_parameter.parameter_type.counter; + + if (argc < 1 || strcmp(argv[0], "NULL") != 0) + p_counter_value = &counter_value; + + qcsapi_retval = qcsapi_interface_get_counter64(the_interface, the_counter_type, + p_counter_value); + + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) + print_out(print, "%llu\n", counter_value); + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } + + return statval; +} + +static int +call_qcsapi_pm_get_counter( const call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[] ) +{ + int statval = 0; + qcsapi_unsigned_int counter_value; + qcsapi_unsigned_int *p_counter_value = NULL; + int qcsapi_retval; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_counter_type the_counter_type = p_calling_bundle->caller_generic_parameter.parameter_type.counter; + qcsapi_output *print = p_calling_bundle->caller_output; + const char *the_pm_interval = NULL; + + if (argc < 1) { + print_err(print, "Usage: call_qcsapi pm_get_counter \n"); + return 1; + } + + if (strcmp(argv[0], "NULL") != 0) { + the_pm_interval = argv[0]; + } + + if (argc < 2 || (strcmp(argv[1], "NULL") != 0)) { + p_counter_value = &counter_value; + } + + qcsapi_retval = qcsapi_pm_get_counter(the_interface, the_counter_type, the_pm_interval, p_counter_value); + + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out(print, "%u\n", (unsigned int) counter_value); + } + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } + + return statval; +} + +static int +call_qcsapi_pm_get_elapsed_time( const call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[] ) +{ + int statval = 0; + int qcsapi_retval; + const char *the_pm_interval = NULL; + qcsapi_unsigned_int elapsed_time; + qcsapi_unsigned_int *p_elapsed_time = NULL; + qcsapi_output *print = p_calling_bundle->caller_output; + + if (argc < 1) { + print_err(print, "Usage: call_qcsapi pm_get_elapsed_time \n"); + return 1; + } + + if (strcmp(argv[0], "NULL") != 0) { + the_pm_interval = argv[0]; + } + + if (argc < 2 || (strcmp(argv[1], "NULL") != 0)) { + p_elapsed_time = &elapsed_time; + } + + qcsapi_retval = qcsapi_pm_get_elapsed_time(the_pm_interval, p_elapsed_time); + + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out(print, "%u\n", (unsigned int) elapsed_time); + } + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } + + return statval; +} + + +static int +call_qcsapi_flash_image_update( const call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[] ) +{ + int statval = 0; + int qcsapi_retval; + qcsapi_flash_partiton_type partition_type = qcsapi_nosuch_partition; + const char *image_file_path = NULL; + qcsapi_output *print = p_calling_bundle->caller_output; + + if (argc < 2) { + print_err( print, "Not enough parameters in call qcsapi flash image update, count is %d\n", argc ); + print_err( print, "Usage: call_qcsapi flash_image_update \n" ); + statval = 1; + } else { + if (strcmp( argv[ 0 ], "NULL" ) != 0) { + image_file_path = argv[ 0 ]; + } + + if (name_to_partition_type( argv[ 1 ], &partition_type ) == 0) { + print_err( print, "Unrecognized flash memory partition type %s\n", argv[ 1 ] ); + statval = 1; + } else { + qcsapi_retval = qcsapi_flash_image_update( image_file_path, partition_type ); + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out( print, "complete\n" ); + } + } else { + report_qcsapi_error( p_calling_bundle, qcsapi_retval ); + statval = 1; + } + } + } + + return( statval ); +} + +#define GET_FIRMWARE_VERSION_MAX_LEN 40 + +static int +call_qcsapi_firmware_get_version( const call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[] ) +{ + int statval = 0; + int qcsapi_retval; + char firmware_version[ GET_FIRMWARE_VERSION_MAX_LEN ]; + char *p_firmware_version = &firmware_version[ 0 ]; + qcsapi_unsigned_int version_size = GET_FIRMWARE_VERSION_MAX_LEN; + qcsapi_output *print = p_calling_bundle->caller_output; + + if (argc > 0) { + if (strcmp( argv[ 0 ], "NULL" ) == 0 ) { + p_firmware_version = NULL; + } + else if (isdigit( argv[ 0 ][ 0 ] )) { + version_size = atoi( argv[ 0 ] ); + + if (version_size > GET_FIRMWARE_VERSION_MAX_LEN) { + version_size = GET_FIRMWARE_VERSION_MAX_LEN; + } + } + } + + qcsapi_retval = qcsapi_firmware_get_version( p_firmware_version, version_size ); + + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out( print, "%s\n", p_firmware_version ); + } + } + else { + report_qcsapi_error( p_calling_bundle, qcsapi_retval ); + statval = 1; + } + + return( statval ); +} + +static int +call_qcsapi_system_get_time_since_start(const call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[]) +{ + int statval = 0; + int qcsapi_retval; + qcsapi_unsigned_int time_since_startup; + qcsapi_unsigned_int *p_time_since_startup = &time_since_startup; + qcsapi_output *print = p_calling_bundle->caller_output; + + if (argc > 0 && strcmp(argv[0], "NULL") == 0) { + p_time_since_startup = NULL; + } + + qcsapi_retval = qcsapi_system_get_time_since_start(p_time_since_startup); + + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out( print, "%u\n", time_since_startup); + } + } + else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } + + return( statval ); +} + +static int +call_qcsapi_get_system_status(const call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[]) +{ + int statval = 0; + int qcsapi_retval; + qcsapi_unsigned_int status; + qcsapi_output *print = p_calling_bundle->caller_output; + + qcsapi_retval = qcsapi_get_system_status(&status); + + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out(print, "%X\n", status); + int id; + for (id = 0; id < TABLE_SIZE(qcsapi_sys_status_table); id++) { + print_out(print, "bit %-2d - %s\n", qcsapi_sys_status_table[id].bit_id, + qcsapi_sys_status_table[id].description); + } + } + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } + + return statval; +} + +static int +call_qcsapi_get_random_seed(const call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[]) +{ + int statval = 0; + int qcsapi_retval; + qcsapi_output *print = p_calling_bundle->caller_output; + struct qcsapi_data_512bytes *random_buf; + int i; + + random_buf = malloc(sizeof(*random_buf)); + + if (!random_buf) { + print_err(print, "Failed to allocate %u bytes\n", sizeof(*random_buf)); + return 1; + } + + qcsapi_retval = qcsapi_get_random_seed(random_buf); + + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + for (i = 0; i < sizeof(random_buf->data); i++) { + print_out(print, "%c", random_buf->data[i]); + } + } + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } + + free(random_buf); + + return statval; +} + +static int +call_qcsapi_set_random_seed(const call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[]) +{ + int statval = 0; + int qcsapi_retval; + qcsapi_output *print = p_calling_bundle->caller_output; + struct qcsapi_data_512bytes *random_buf; + qcsapi_unsigned_int entropy = 0; + + if (argc < 2) { + print_err(print, "Usage: call_qcsapi set_random_seed \n"); + return 1; + } + + entropy = atoi(argv[1]); + + random_buf = malloc(sizeof(*random_buf)); + + if (!random_buf) { + print_err(print, "Failed to allocate %u bytes\n", sizeof(*random_buf)); + return 1; + } + + memset(random_buf, 0, sizeof(*random_buf)); + memcpy((void *)random_buf->data, (void *)argv[0], + min(sizeof(random_buf->data), strlen(argv[0]))); + + qcsapi_retval = qcsapi_set_random_seed(random_buf, entropy); + + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out(print, "complete\n"); + } + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } + + free(random_buf); + + return statval; +} + +static int +call_qcsapi_led_get( const call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[] ) +{ + int statval = 0; + int qcsapi_retval; + uint8_t the_led = (uint8_t) (p_calling_bundle->caller_generic_parameter.index); + uint8_t led_value, *p_led_value = NULL; + qcsapi_output *print = p_calling_bundle->caller_output; + + if (argc < 1 || strcmp( argv[ 0 ], "NULL" ) != 0) + p_led_value = &led_value; + + qcsapi_retval = qcsapi_led_get( the_led, p_led_value ); + if (qcsapi_retval >= 0) + { + if (verbose_flag >= 0) + { + print_out( print, "%u\n", led_value ); + } + } + else + { + report_qcsapi_error( p_calling_bundle, qcsapi_retval ); + statval = 1; + } + + return( statval ); +} + +static int +call_qcsapi_led_set( const call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[] ) +{ + int statval = 0; + qcsapi_output *print = p_calling_bundle->caller_output; + + if (argc < 1) + { + print_err( print, "Not enough parameters in call qcsapi LED set, count is %d\n", argc ); + statval = 1; + } + else + { + int qcsapi_retval; + uint8_t the_led = (uint8_t) (p_calling_bundle->caller_generic_parameter.index); + uint8_t new_value = (uint8_t) atoi( argv[ 0 ] ); + + qcsapi_retval = qcsapi_led_set( the_led, new_value ); + if (qcsapi_retval >= 0) + { + if (verbose_flag >= 0) + { + print_out( print, "complete\n" ); + } + } + else + { + report_qcsapi_error( p_calling_bundle, qcsapi_retval ); + statval = 1; + } + } + + return( statval ); +} + +static int +call_qcsapi_led_pwm_enable( const call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[] ) +{ + int statval = 0; + qcsapi_output *print = p_calling_bundle->caller_output; + int qcsapi_retval = 0; + uint8_t led_ident = (uint8_t) (p_calling_bundle->caller_generic_parameter.index); + qcsapi_unsigned_int onoff = 0; + qcsapi_unsigned_int high_count = 0; + qcsapi_unsigned_int low_count = 0; + + if (argc < 1) + goto usage; + if (sscanf(argv[0], "%u", &onoff) != 1) + goto usage; + if (onoff != 0 && argc < 3) + goto usage; + if (onoff != 0) { + if (sscanf(argv[1], "%u", &high_count) != 1) + goto usage; + if (sscanf(argv[2], "%u", &low_count) != 1) + goto usage; + } + + qcsapi_retval = qcsapi_led_pwm_enable(led_ident, (uint8_t)onoff, high_count, low_count); + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) + print_out( print, "complete\n" ); + } else { + report_qcsapi_error( p_calling_bundle, qcsapi_retval ); + statval = 1; + } + + return (statval); + +usage: + print_err(print, "Usage: call_qcsapi set_LED_PWM (1|0) \n"); + statval = 1; + + return (statval); +} + +static int +call_qcsapi_led_brightness( const call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[] ) +{ + int statval = 0; + qcsapi_output *print = p_calling_bundle->caller_output; + int qcsapi_retval = 0; + uint8_t led_ident = (uint8_t) (p_calling_bundle->caller_generic_parameter.index); + qcsapi_unsigned_int level = 0; + + if (argc < 1) + goto usage; + if (sscanf(argv[0], "%u", &level) != 1) + goto usage; + + qcsapi_retval = qcsapi_led_brightness(led_ident, level); + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) + print_out( print, "complete\n" ); + } else { + report_qcsapi_error( p_calling_bundle, qcsapi_retval ); + statval = 1; + } + + return (statval); + +usage: + print_err(print, "Usage: call_qcsapi set_LED_brightness \n"); + statval = 1; + + return (statval); +} + +static int +call_qcsapi_gpio_get_config( const call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[] ) +{ + int statval = 0; + int qcsapi_retval; + uint8_t the_gpio = (uint8_t) (p_calling_bundle->caller_generic_parameter.index); + qcsapi_gpio_config gpio_config, *p_gpio_config = NULL; + qcsapi_output *print = p_calling_bundle->caller_output; + + if (argc < 1 || strcmp( argv[ 0 ], "NULL" ) != 0) + p_gpio_config = &gpio_config; + + qcsapi_retval = qcsapi_gpio_get_config( the_gpio, p_gpio_config ); + if (qcsapi_retval >= 0) + { + if (verbose_flag >= 0) + { + print_out( print, "%u\n", gpio_config ); + } + } + else + { + report_qcsapi_error( p_calling_bundle, qcsapi_retval ); + statval = 1; + } + + return( statval ); +} + +static int +call_qcsapi_gpio_set_config( const call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[] ) +{ + int statval = 0; + qcsapi_output *print = p_calling_bundle->caller_output; + + if (argc < 1) + { + print_err( print, "Not enough parameters in call qcsapi GPIO set config, count is %d\n", argc ); + statval = 1; + } + else + { + int qcsapi_retval; + uint8_t the_gpio = (uint8_t) (p_calling_bundle->caller_generic_parameter.index); + qcsapi_gpio_config new_value = (qcsapi_gpio_config) atoi( argv[ 0 ] ); + + qcsapi_retval = qcsapi_gpio_set_config( the_gpio, new_value ); + if (qcsapi_retval >= 0) + { + if (verbose_flag >= 0) + { + print_out( print, "complete\n" ); + } + } + else + { + report_qcsapi_error( p_calling_bundle, qcsapi_retval ); + statval = 1; + } + } + + return( statval ); +} + +static int +call_qcsapi_gpio_enable_wps_push_button( const call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[] ) +{ + int statval = 0; + qcsapi_output *print = p_calling_bundle->caller_output; + + if (argc < 1) + { + print_err( print, "Not enough parameters in call qcsapi GPIO enable wps push button, count is %d\n", argc ); + statval = 1; + } + else + { + int qcsapi_retval; + uint8_t use_interrupt_flag = 0; + uint8_t wps_push_button = (uint8_t) (p_calling_bundle->caller_generic_parameter.index); + uint8_t active_logic = (uint8_t) atoi( argv[ 0 ] ); + + if (argc > 1 && strcasecmp( argv[ 1 ], "intr" ) == 0) + use_interrupt_flag = 1; + + qcsapi_retval = qcsapi_gpio_enable_wps_push_button( wps_push_button, active_logic, use_interrupt_flag ); + if (qcsapi_retval >= 0) + { + if (verbose_flag >= 0) + { + print_out( print, "complete\n" ); + } + } + else + { + report_qcsapi_error( p_calling_bundle, qcsapi_retval ); + statval = 1; + } + } + + return( statval ); +} + +static int +call_qcsapi_file_path_get_config( const call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[] ) +{ + int statval = 0; + int qcsapi_retval; + qcsapi_file_path_config the_file_path_config = + (qcsapi_file_path_config) (p_calling_bundle->caller_generic_parameter.index); + char file_path[ 80 ], *p_file_path = NULL; + qcsapi_output *print = p_calling_bundle->caller_output; + + if (argc < 1 || strcmp( argv[ 0 ], "NULL" ) != 0) + p_file_path = &file_path[ 0 ]; + + qcsapi_retval = qcsapi_file_path_get_config( the_file_path_config, p_file_path, sizeof( file_path ) ); + if (qcsapi_retval >= 0) + { + if (verbose_flag >= 0) + { + print_out( print, "%s\n", &file_path[ 0 ] ); + } + } + else + { + report_qcsapi_error( p_calling_bundle, qcsapi_retval ); + statval = 1; + } + + return( statval ); +} + +static int +call_qcsapi_file_path_set_config( const call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[] ) +{ + int statval = 0; + qcsapi_output *print = p_calling_bundle->caller_output; + + if (argc < 1) + { + print_err( print, "Not enough parameters in call qcsapi file path set config, count is %d\n", argc ); + statval = 1; + } + else + { + int qcsapi_retval; + qcsapi_file_path_config the_file_path_config = + (qcsapi_file_path_config) (p_calling_bundle->caller_generic_parameter.index); + + qcsapi_retval = qcsapi_file_path_set_config( the_file_path_config, argv[ 0 ] ); + if (qcsapi_retval >= 0) + { + if (verbose_flag >= 0) + { + print_out( print, "complete\n" ); + } + } + else + { + report_qcsapi_error( p_calling_bundle, qcsapi_retval ); + statval = 1; + } + } + + return( statval ); +} + +static int +call_qcsapi_wifi_set_wifi_macaddr(const call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[] ) +{ + int statval = 0; + qcsapi_output *print = p_calling_bundle->caller_output; + + if (argc < 1) + { + print_err( print, "Not enough parameters in call qcsapi file path set config, count is %d\n", argc ); + statval = 1; + } + else + { + qcsapi_mac_addr new_mac_addr; + int qcsapi_retval; + int ival = 0; + + if (strcmp( "NULL", argv[ 0 ] ) == 0) + qcsapi_retval = qcsapi_wifi_set_wifi_macaddr( NULL ); + else + { + ival = parse_mac_addr( argv[ 0 ], new_mac_addr ); + if (ival >= 0) + qcsapi_retval = qcsapi_wifi_set_wifi_macaddr( new_mac_addr ); + else + { + print_out( print, "Error parsing MAC address %s\n", argv[ 0 ] ); + statval = 1; + } + } + + if (ival >= 0) + { + if (qcsapi_retval >= 0) + { + if (verbose_flag >= 0) + { + print_out( print, "complete\n" ); + } + } + else + { + report_qcsapi_error( p_calling_bundle, qcsapi_retval ); + statval = 1; + } + } + } + + return( statval ); +} + +static int +call_qcsapi_wifi_create_restricted_bss(const call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[]) +{ + int statval = 0; + int qcsapi_retval = 0; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + qcsapi_mac_addr mac_addr = {0}; + + if (argc == 1) { + qcsapi_retval = parse_mac_addr( argv[ 0 ], mac_addr ); + if (qcsapi_retval < 0) { + print_out( print, "Error parsing MAC address %s\n", argv[ 0 ] ); + statval = 1; + } + } + + if (qcsapi_retval >= 0) { + qcsapi_retval = qcsapi_wifi_create_restricted_bss(the_interface, mac_addr); + } + + if (qcsapi_retval >= 0) + { + if (verbose_flag >= 0) + { + print_out( print, "complete\n"); + } + } + else + { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } + + return( statval ); +} + +static int +call_qcsapi_wifi_create_bss(const call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[]) +{ + int statval = 0; + int qcsapi_retval = 0; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + qcsapi_mac_addr mac_addr = {0}; + + if (argc == 1) { + qcsapi_retval = parse_mac_addr( argv[ 0 ], mac_addr ); + if (qcsapi_retval < 0) { + print_out( print, "Error parsing MAC address %s\n", argv[ 0 ] ); + statval = 1; + } + } + + if (qcsapi_retval >= 0) { + qcsapi_retval = qcsapi_wifi_create_bss(the_interface, mac_addr); + } + + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out( print, "complete\n"); + } + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } + + return( statval ); +} + +static int +call_qcsapi_wifi_remove_bss(const call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[]) +{ + int statval = 0; + int qcsapi_retval = 0; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + + qcsapi_retval = qcsapi_wifi_remove_bss(the_interface); + if (qcsapi_retval >= 0) + { + if (verbose_flag >= 0) + { + print_out( print, "complete\n"); + } + } + else + { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } + + return( statval ); +} + +static int +call_qcsapi_wifi_get_primary_interface(const call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[]) +{ + int statval = 0; + int qcsapi_retval = 0; + char ifname[IFNAMSIZ]; + qcsapi_output *print = p_calling_bundle->caller_output; + + memset(ifname, 0, IFNAMSIZ); + qcsapi_retval = qcsapi_get_primary_interface(ifname, IFNAMSIZ - 1); + if (qcsapi_retval >= 0) + { + if (verbose_flag >= 0) + { + print_out( print, "%s\n", ifname); + } + } + else + { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } + + return( statval ); +} + +static int +call_qcsapi_wifi_get_interface_by_index(const call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[]) +{ + int statval = 0; + int qcsapi_retval = 0; + char ifname[IFNAMSIZ]; + qcsapi_unsigned_int if_index = p_calling_bundle->caller_generic_parameter.index; + qcsapi_output *print = p_calling_bundle->caller_output; + + memset(ifname, 0, IFNAMSIZ); + qcsapi_retval = qcsapi_get_interface_by_index(if_index, ifname, IFNAMSIZ - 1); + + if (qcsapi_retval >= 0) + { + if (verbose_flag >= 0) + { + print_out( print, "%s\n", ifname); + } + } + else + { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } + + return( statval ); +} + +static int +call_qcsapi_wifi_get_mode( const call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[] ) +{ + int statval = 0; + qcsapi_wifi_mode current_wifi_mode, *p_wifi_mode = NULL; + int qcsapi_retval; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + + if (argc < 1 || strcmp( argv[ 0 ], "NULL" ) != 0) + p_wifi_mode = ¤t_wifi_mode; + qcsapi_retval = qcsapi_wifi_get_mode( the_interface, p_wifi_mode ); + if (qcsapi_retval >= 0) + { + if (verbose_flag >= 1) + { + print_out( print, "%d (%s)\n", (int) current_wifi_mode, + wifi_mode_to_string(print, current_wifi_mode ) ); + } + else if (verbose_flag >= 0) + { + print_out( print, "%s\n", + wifi_mode_to_string(print, current_wifi_mode ) ); + } + /* + * Else display nothing in quiet mode (verbose flag < 0) + */ + } + else + { + report_qcsapi_error( p_calling_bundle, qcsapi_retval ); + statval = 1; + } + + return( statval ); +} + +static int +call_qcsapi_wifi_set_mode( const call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[] ) +{ + int statval = 0; + qcsapi_output *print = p_calling_bundle->caller_output; + + if (argc < 1) + { + print_err( print, "Not enough parameters in call qcsapi WiFi set mode, count is %d\n", argc ); + statval = 1; + } + else + { + int qcsapi_retval; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_wifi_mode new_wifi_mode; + + new_wifi_mode = string_to_wifi_mode(argv[0]); + + if (new_wifi_mode == qcsapi_nosuch_mode) { + print_err( print, "Unrecognized WiFi mode %s\n", argv[ 0 ] ); + statval = 1; + return( statval ); + } + + qcsapi_retval = qcsapi_wifi_set_mode( the_interface, new_wifi_mode ); + if (qcsapi_retval >= 0) + { + if (verbose_flag >= 0) + { + print_out( print, "complete\n" ); + } + } + else + { + report_qcsapi_error( p_calling_bundle, qcsapi_retval ); + statval = 1; + } + } + + return( statval ); +} + +static int +call_qcsapi_wifi_get_phy_mode( const call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[] ) +{ + int statval = 0; + int qcsapi_retval; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + string_64 phy_mode; + + if (argc > 0 && (strcmp(argv[ 0 ], "NULL") == 0)) + { + qcsapi_retval = -EFAULT; + } + else + { + memset(phy_mode, 0 , sizeof(phy_mode)); + qcsapi_retval = qcsapi_wifi_get_phy_mode( the_interface, phy_mode ); + } + + if (qcsapi_retval >= 0) + { + if (verbose_flag >= 0) + print_out( print, "%s\n", phy_mode ); + } + else + { + report_qcsapi_error( p_calling_bundle, qcsapi_retval ); + statval = 1; + } + + return( statval ); +} + +static int +call_qcsapi_wifi_set_phy_mode( const call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[] ) +{ + int statval = 0; + qcsapi_output *print = p_calling_bundle->caller_output; + + if (argc < 1) + { + print_err( print, "Not enough parameters in call qcsapi WiFi set phy mode, count is %d\n", argc ); + statval = 1; + } + else + { + int qcsapi_retval; + const char *the_interface = p_calling_bundle->caller_interface; + const char *mode = argv[0]; + + qcsapi_retval = qcsapi_wifi_set_phy_mode( the_interface, mode ); + + if (qcsapi_retval >= 0) + { + if (verbose_flag >= 0) + { + print_out( print, "complete\n" ); + } + } + else + { + report_qcsapi_error( p_calling_bundle, qcsapi_retval ); + statval = 1; + } + } + + return( statval ); +} + +static int +call_qcsapi_wifi_reload_in_mode( const call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[] ) +{ + int statval = 0; + qcsapi_output *print = p_calling_bundle->caller_output; + + if (argc < 1) { + print_err( print, "Not enough parameters in call qcsapi WiFi reload in mode, count is %d\n", argc ); + statval = 1; + } else { + int qcsapi_retval; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_wifi_mode new_wifi_mode; + + new_wifi_mode = string_to_wifi_mode(argv[0]); + + if (new_wifi_mode == qcsapi_nosuch_mode) { + print_err( print, "Unrecognized WiFi mode %s\n", argv[ 0 ] ); + statval = 1; + return( statval ); + } + + qcsapi_retval = qcsapi_wifi_reload_in_mode( the_interface, new_wifi_mode ); + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out( print, "complete\n" ); + } + } else { + if (new_wifi_mode == qcsapi_repeater && qcsapi_retval == -EOPNOTSUPP) { + print_out(print, "MBSS is not supported in repeater mode - " + "remove MBSS or repeater config\n"); + } + report_qcsapi_error( p_calling_bundle, qcsapi_retval ); + statval = 1; + } + } + + return( statval ); +} + +static int +call_qcsapi_wifi_rfenable(const call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[]) +{ + int statval = 0; + qcsapi_output *print = p_calling_bundle->caller_output; + int len, i; + + if (argc < 1) { + print_err(print, "Not enough parameters in call qcsapi rfenable, count is %d\n", argc); + statval = 1; + } else { + int qcsapi_retval; + + len = strlen(argv[0]); + for (i = 0; i < len; i++){ + if (isdigit(argv[0][i]) == 0){ + print_err(print, "Numerical parameter is required\n"); + statval = 1; + return( statval ); + } + } + + qcsapi_unsigned_int onoff = !!atoi(argv[0]); + qcsapi_retval = qcsapi_wifi_rfenable(onoff); + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out(print, "complete\n"); + } + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } + } + + return statval; +} + +static int +call_qcsapi_wifi_rfstatus(const call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[]) +{ + int statval = 0; + qcsapi_unsigned_int rfstatus, *p_rfstatus = NULL; + int qcsapi_retval; + qcsapi_output *print = p_calling_bundle->caller_output; + + if (argc < 1 || strcmp( argv[ 0 ], "NULL" ) != 0) + p_rfstatus = &rfstatus; + + qcsapi_retval = qcsapi_wifi_rfstatus( p_rfstatus ); + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out( print, "%s\n", rfstatus ? "On" : "Off" ); + } + } else { + report_qcsapi_error( p_calling_bundle, qcsapi_retval ); + statval = 1; + } + + return statval; +} + +static int +call_qcsapi_wifi_startprod(const call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[]) +{ + int statval = 0; + int qcsapi_retval; + qcsapi_output *print = p_calling_bundle->caller_output; + + qcsapi_retval = qcsapi_wifi_startprod(); + + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out(print, "complete\n"); + } + } else { + report_qcsapi_error( p_calling_bundle, qcsapi_retval ); + statval = 1; + } + + return statval; +} + +static int +call_qcsapi_wifi_get_bw( const call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[] ) +{ + int statval = 0; + qcsapi_unsigned_int current_bw, *p_bw = NULL; + int qcsapi_retval; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + + if (argc < 1 || strcmp( argv[ 0 ], "NULL" ) != 0) + p_bw = ¤t_bw; + qcsapi_retval = qcsapi_wifi_get_bw( the_interface, p_bw ); + if (qcsapi_retval >= 0) + { + if (verbose_flag >= 0) + { + print_out( print, "%u\n", current_bw ); + } + /* + * Else display nothing in quiet mode (verbose flag < 0) + */ + } + else + { + report_qcsapi_error( p_calling_bundle, qcsapi_retval ); + statval = 1; + } + + return( statval ); +} + +static int +call_qcsapi_wifi_set_bw( const call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[] ) +{ + int statval = 0; + qcsapi_output *print = p_calling_bundle->caller_output; + + if (argc < 1) + { + print_err( print, "Not enough parameters in call qcsapi WiFi set bw, count is %d\n", argc ); + print_err( print, "Usage: call_qcsapi set_bw <40 | 20>\n" ); + statval = 1; + } + else + { + qcsapi_unsigned_int current_bw = (qcsapi_unsigned_int) atoi( argv[ 0 ] ); + int qcsapi_retval; + const char *the_interface = p_calling_bundle->caller_interface; + + qcsapi_retval = qcsapi_wifi_set_bw( the_interface, current_bw ); + if (qcsapi_retval >= 0) + { + if (verbose_flag >= 0) + { + print_out( print, "complete\n" ); + } + /* + * Else display nothing in quiet mode (verbose flag < 0) + */ + } + else + { + report_qcsapi_error( p_calling_bundle, qcsapi_retval ); + statval = 1; + } + } + + return( statval ); +} + +static int +call_qcsapi_wifi_get_BSSID( const call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[] ) +{ + int statval = 0; + qcsapi_mac_addr the_mac_addr; + int qcsapi_retval; + const char *the_interface = p_calling_bundle->caller_interface; + + if (argc > 0 && strcmp( argv[ 0 ], "NULL" ) == 0) + qcsapi_retval = qcsapi_wifi_get_BSSID( the_interface, NULL ); + else + qcsapi_retval = qcsapi_wifi_get_BSSID( the_interface, the_mac_addr ); + + if (qcsapi_retval >= 0) + { + if (verbose_flag >= 0) + { + dump_mac_addr(p_calling_bundle->caller_output, the_mac_addr ); + } + } + else + { + report_qcsapi_error( p_calling_bundle, qcsapi_retval ); + statval = 1; + } + + return( statval ); +} + +static int +call_qcsapi_wifi_get_config_BSSID( const call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[] ) +{ + int statval = 0; + qcsapi_mac_addr the_mac_addr; + int qcsapi_retval; + const char *the_interface = p_calling_bundle->caller_interface; + + if (argc > 0 && strcmp(argv[0], "NULL" ) == 0) { + qcsapi_retval = qcsapi_wifi_get_config_BSSID( the_interface, NULL ); + } else { + qcsapi_retval = qcsapi_wifi_get_config_BSSID( the_interface, the_mac_addr ); + } + + if (qcsapi_retval >= 0) + { + if (verbose_flag >= 0) + { + dump_mac_addr(p_calling_bundle->caller_output, the_mac_addr ); + } + } + else + { + report_qcsapi_error( p_calling_bundle, qcsapi_retval ); + statval = 1; + } + + return( statval ); +} + +static int +call_qcsapi_wifi_ssid_get_bssid(const call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[]) +{ + int statval = 0; + qcsapi_mac_addr the_mac_addr; + int qcsapi_retval = 0; + const char *the_interface = p_calling_bundle->caller_interface; + const char *SSID = p_calling_bundle->caller_generic_parameter.parameter_type.the_SSID; + + qcsapi_retval = qcsapi_wifi_ssid_get_bssid(the_interface, SSID, the_mac_addr); + + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + dump_mac_addr(p_calling_bundle->caller_output, the_mac_addr); + } + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } + + return( statval ); +} + +static int +call_qcsapi_wifi_ssid_set_bssid(const call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[]) +{ + int statval = 0; + qcsapi_mac_addr the_mac_addr; + int qcsapi_retval = 0; + int ival = 0; + const char *the_interface = p_calling_bundle->caller_interface; + const char *SSID = p_calling_bundle->caller_generic_parameter.parameter_type.the_SSID; + qcsapi_output *print = p_calling_bundle->caller_output; + + ival = parse_mac_addr(argv[0], the_mac_addr); + + if (ival >= 0) { + qcsapi_retval = qcsapi_wifi_ssid_set_bssid(the_interface, SSID, the_mac_addr); + + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out( print, "complete\n"); + } + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } + + } else { + print_out( print, "Error parsing MAC address %s\n", argv[0]); + statval = 1; + } + + return( statval ); +} + +static int +call_qcsapi_wifi_get_SSID( const call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[] ) +{ + int statval = 0; + qcsapi_SSID current_SSID; + int qcsapi_retval; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + + memset(current_SSID, 0, sizeof(current_SSID)); + if (argc > 0 && strcmp( argv[ 0 ], "NULL" ) == 0) + qcsapi_retval = qcsapi_wifi_get_SSID( the_interface, NULL ); + else + qcsapi_retval = qcsapi_wifi_get_SSID( the_interface, current_SSID ); + + if (qcsapi_retval >= 0) + { + if (verbose_flag >= 0) + { + print_out( print, "%s\n", current_SSID ); + } + } + else + { + report_qcsapi_error( p_calling_bundle, qcsapi_retval ); + statval = 1; + } + + return( statval ); +} + +static int +call_qcsapi_wifi_set_SSID( const call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[] ) +{ + int statval = 0; + int qcsapi_retval; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + + if (argc < 1) + { + print_err( print, "Not enough parameters in call qcsapi WiFi set SSID, count is %d\n", argc ); + statval = 1; + } + else + { + char *new_SSID = argv[ 0 ]; + /* + * For set SSID, require the Force NULL address flag to be set, so NULL can be used as an SSID. + */ + if (((internal_flags & m_force_NULL_address) == m_force_NULL_address) && + (strcmp( argv[ 0 ], "NULL" ) == 0)) + new_SSID = NULL; + + qcsapi_retval = qcsapi_wifi_set_SSID( the_interface, new_SSID ); + if (qcsapi_retval >= 0) + { + if (verbose_flag >= 0) + { + print_out( print, "complete\n" ); + } + } + else + { + report_qcsapi_error( p_calling_bundle, qcsapi_retval ); + statval = 1; + } + } + + return( statval ); +} + +static int +call_qcsapi_wifi_get_channel( call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[] ) +{ + int statval = 0; + qcsapi_unsigned_int channel_value, *p_channel_value = NULL; + int qcsapi_retval; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + + if (argc < 1 || strcmp( argv[ 0 ], "NULL" ) != 0) + p_channel_value = &channel_value; + qcsapi_retval = qcsapi_wifi_get_channel( the_interface, p_channel_value ); + if (qcsapi_retval >= 0) + { + if (verbose_flag >= 0) + { + print_out( print, "%d\n", channel_value ); + } + } + else + { + report_qcsapi_error( p_calling_bundle, qcsapi_retval ); + statval = 1; + } + + return( statval ); +} + +static int +call_qcsapi_wifi_set_channel( call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[] ) +{ + int statval = 0; + qcsapi_output *print = p_calling_bundle->caller_output; + + if (argc < 1) + { + print_err( print, "Not enough parameters in call qcsapi WiFi set channel, count is %d\n", argc ); + statval = 1; + } + else + { + qcsapi_unsigned_int channel_value = atoi( argv[ 0 ] ); + int qcsapi_retval; + const char *the_interface = p_calling_bundle->caller_interface; + + qcsapi_retval = qcsapi_wifi_set_channel( the_interface, channel_value ); + if (qcsapi_retval >= 0) + { + if (verbose_flag >= 0) + { + print_out( print, "complete\n" ); + } + } + else + { + report_qcsapi_error( p_calling_bundle, qcsapi_retval ); + statval = 1; + } + } + + return( statval ); +} + +static int +call_qcsapi_wifi_get_auto_channel( call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[] ) +{ + int statval = 0; + int qcsapi_retval; + qcsapi_output *print = p_calling_bundle->caller_output; + const char *the_interface = p_calling_bundle->caller_interface; + char channel_value_str[QCSAPI_MAX_PARAMETER_VALUE_LEN] = {0}; + qcsapi_unsigned_int current_channel; + + qcsapi_retval = qcsapi_config_get_parameter(the_interface, + "channel", + channel_value_str, + sizeof(channel_value_str)); + + if (qcsapi_retval >= 0) + { + sscanf(channel_value_str, "%u", ¤t_channel); + + if (verbose_flag >= 0) { + print_out( print, "%s\n", current_channel==0 ? "enabled" : "disabled" ); + } + } else { + report_qcsapi_error( p_calling_bundle, qcsapi_retval ); + statval = 1; + } + + return( statval ); +} + +static int +call_qcsapi_wifi_set_auto_channel( call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[] ) +{ + int statval = 0; + qcsapi_output *print = p_calling_bundle->caller_output; + qcsapi_unsigned_int current_channel; + int qcsapi_retval; + const char *the_interface = p_calling_bundle->caller_interface; + char channel_value_str[QCSAPI_MAX_PARAMETER_VALUE_LEN] = {0}; + char *param = argv[0]; + + if (argc < 1) { + print_err( print, "Not enough parameters in call qcsapi WiFi set auto channel," + " count is %d\n", argc ); + statval = 1; + return( statval ); + } + + qcsapi_retval = qcsapi_config_get_parameter(the_interface, + "channel", + channel_value_str, + sizeof(channel_value_str)); + + if (qcsapi_retval >= 0) { + sscanf( channel_value_str, "%u", ¤t_channel ); + } + + if (qcsapi_retval >= 0 && strncmp( param, "enable", strlen(param) ) == 0) { + if (current_channel > 0) { + + qcsapi_retval = qcsapi_config_update_parameter( the_interface, "channel", "0" ); + if (qcsapi_retval >= 0) { + qcsapi_retval = qcsapi_wifi_set_channel( the_interface, 0 ); + } + } + } else if (qcsapi_retval >= 0 && strncmp( param, "disable", strlen(param) ) == 0) { + if (current_channel == 0) { + + qcsapi_retval = qcsapi_wifi_get_channel( the_interface, ¤t_channel ); + if (qcsapi_retval >= 0) { + sprintf( channel_value_str, "%u", current_channel ); + qcsapi_retval = qcsapi_config_update_parameter( the_interface, + "channel", + channel_value_str ); + } + } + } else if (qcsapi_retval >= 0) { + qcsapi_retval = -qcsapi_parameter_not_found; + } + + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out( print, "complete\n" ); + } + } else { + report_qcsapi_error( p_calling_bundle, qcsapi_retval ); + statval = 1; + } + + return( statval ); +} + + +static int +call_qcsapi_wifi_set_chan_pri_inactive( call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[] ) +{ + int statval = 0; + qcsapi_output *print = p_calling_bundle->caller_output; + + if (argc < 1) + { + print_err( print, "Not enough parameters, count is %d\n", argc ); + statval = 1; + } + else + { + qcsapi_unsigned_int channel_value = atoi( argv[ 0 ] ); + int qcsapi_retval; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_unsigned_int inactive = 1; + + if (argc == 2) { + inactive = atoi( argv[1] ); + } + + qcsapi_retval = qcsapi_wifi_set_chan_pri_inactive( the_interface, channel_value, inactive ); + if (qcsapi_retval >= 0) + { + if (verbose_flag >= 0) + { + print_out( print, "complete\n" ); + } + } + else + { + report_qcsapi_error( p_calling_bundle, qcsapi_retval ); + statval = 1; + } + } + + return( statval ); +} + +static int +call_qcsapi_wifi_set_chan_disabled( call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[] ) +{ + int statval = 0; + int qcsapi_retval; + qcsapi_output *print = p_calling_bundle->caller_output; + struct qcsapi_data_256bytes chan_list; + const char *the_interface = p_calling_bundle->caller_interface; + uint32_t listlen = 0; + uint8_t control_flag = 0; + + if (argc != 2) { + print_err(print, + "Usage: call_qcsapi set_chan_disabled " + " \n"); + return 1; + } + + if (!isdigit(*argv[1])) { + print_err(print, + "Unrecognized %s; Supported channel control: 0: disable 1:enable\n", + argv[1]); + return 1; + } else { + control_flag = atoi(argv[1]); + } + + memset(&chan_list, 0, sizeof(chan_list)); + statval = string_to_list(print, argv[0], chan_list.data, &listlen); + if (statval < 0) + return statval; + + qcsapi_retval = qcsapi_wifi_chan_control(the_interface, &chan_list, listlen, control_flag); + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out(print, "complete\n"); + } + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } + + return( statval ); +} +static void +dump_disabled_chanlist(qcsapi_output *print, uint8_t *data, uint8_t cnt) +{ + int loop; + + if (cnt > 0) { + print_out(print, "%d", data[0]); + for (loop = 1; loop < cnt; loop++) { + print_out(print, ",%d", data[loop]); + } + print_out(print, "\n"); + } +} + +static int +call_qcsapi_wifi_get_chan_disabled( call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[] ) +{ + int statval = 0; + int qcsapi_retval; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + struct qcsapi_data_256bytes chan_list; + uint8_t cnt = 0; + + qcsapi_retval = qcsapi_wifi_get_chan_disabled(the_interface, &chan_list, &cnt); + + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + dump_disabled_chanlist(print, chan_list.data, cnt); + } + } else { + report_qcsapi_error( p_calling_bundle, qcsapi_retval ); + statval = 1; + } + + return( statval ); +} + +static int +call_qcsapi_wifi_get_standard( const call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[] ) +{ + int statval = 0; + char ieee_standard[ 16 ], *p_standard = NULL; + int qcsapi_retval; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + + if (argc < 1 || strcmp( argv[ 0 ], "NULL" ) != 0) + p_standard = &ieee_standard[ 0 ]; + qcsapi_retval = qcsapi_wifi_get_IEEE_802_11_standard( the_interface, p_standard ); + + if (qcsapi_retval >= 0) + { + if (verbose_flag >= 0) + { + print_out( print, "%s\n", &ieee_standard[ 0 ] ); + } + } + else + { + report_qcsapi_error( p_calling_bundle, qcsapi_retval ); + statval = 1; + } + + return( statval ); +} + +static int +call_qcsapi_wifi_get_dtim(call_qcsapi_bundle * p_calling_bundle, int argc, char *argv[]) +{ + int statval = 0; + int qcsapi_retval; + qcsapi_unsigned_int dtim; + qcsapi_unsigned_int *p_dtim = NULL; + const char *interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + + if (argc < 1 || strcmp(argv[0], "NULL") != 0) + p_dtim = &dtim; + + qcsapi_retval = qcsapi_wifi_get_dtim(interface, p_dtim); + + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out(print, "%d\n", dtim); + } + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } + + return statval; +} + +static int +call_qcsapi_wifi_set_dtim(call_qcsapi_bundle * p_calling_bundle, int argc, char *argv[]) +{ + int statval = 0; + qcsapi_output *print = p_calling_bundle->caller_output; + + if (argc < 1) { + print_err(print, "Not enough parameters in call qcsapi WiFi set dtim, count is %d\n", argc); + statval = 1; + } else { + qcsapi_unsigned_int dtim = atoi(argv[0]); + int qcsapi_retval; + const char *interface = p_calling_bundle->caller_interface; + + qcsapi_retval = qcsapi_wifi_set_dtim(interface, dtim); + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out(print, "complete\n"); + } + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } + } + + return statval; +} + +static int +call_qcsapi_wifi_get_assoc_limit(call_qcsapi_bundle * p_calling_bundle, int argc, char *argv[]) +{ + int statval = 0; + int qcsapi_retval; + qcsapi_unsigned_int assoc_limit; + qcsapi_unsigned_int *p_assoc_limit = NULL; + const char *interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + + if (argc < 1 || strcmp(argv[0], "NULL") != 0) + p_assoc_limit = &assoc_limit; + + qcsapi_retval = qcsapi_wifi_get_assoc_limit(interface, p_assoc_limit); + + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out(print, "%d\n", assoc_limit); + } + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } + + return statval; +} + +static int +call_qcsapi_wifi_set_assoc_limit(call_qcsapi_bundle * p_calling_bundle, int argc, char *argv[]) +{ + int statval = 0; + qcsapi_output *print = p_calling_bundle->caller_output; + + if (argc < 1) { + print_err(print, "Not enough parameters in call qcsapi WiFi set assoc_limit, count is %d\n", argc); + statval = 1; + } else { + qcsapi_unsigned_int assoc_limit = atoi(argv[0]); + int qcsapi_retval; + const char *interface = p_calling_bundle->caller_interface; + int i; + + for (i = 0; argv[0][i] != 0; i++) { + if (isdigit(argv[0][i]) == 0) { + print_err(print, "Invalid parameter:%s, should be integer\n", argv[0]); + return 1; + } + } + + qcsapi_retval = qcsapi_wifi_set_assoc_limit(interface, assoc_limit); + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out(print, "complete\n"); + } + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } + } + + return statval; +} + +static int +call_qcsapi_wifi_get_bss_assoc_limit(call_qcsapi_bundle * p_calling_bundle, int argc, char *argv[]) +{ + int statval = 0; + int qcsapi_retval; + qcsapi_unsigned_int assoc_limit; + qcsapi_unsigned_int *p_assoc_limit = NULL; + const char *interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + + if (argc < 1 || strcmp(argv[0], "NULL") != 0) + p_assoc_limit = &assoc_limit; + + qcsapi_retval = qcsapi_wifi_get_bss_assoc_limit(interface, p_assoc_limit); + + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out(print, "assoc_limit %d, priority %d\n", + 0xFF & assoc_limit, 0xFF & (assoc_limit >> 8)); + } + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } + + return statval; +} + +static int +call_qcsapi_wifi_set_bss_assoc_limit(call_qcsapi_bundle * p_calling_bundle, int argc, char *argv[]) +{ + int statval = 0; + qcsapi_output *print = p_calling_bundle->caller_output; + + if (argc < 2) { + print_err(print, "Not enough parameters in call qcsapi WiFi set assoc_limit, count is %d\n", argc); + statval = 1; + } else { + qcsapi_unsigned_int limit; + qcsapi_unsigned_int priority; + qcsapi_unsigned_int assoc_limit; + int qcsapi_retval; + const char *interface = p_calling_bundle->caller_interface; + + if (qcsapi_str_to_uint32(argv[0], &limit)) { + print_err(print, "Invalid parameter %s - must be an unsigned integer\n", + argv[0]); + return 1; + } + + if (qcsapi_str_to_uint32(argv[1], &priority)) { + print_err(print, "Invalid parameter %s - must be an unsigned integer\n", + argv[1]); + return 1; + } + + assoc_limit = limit | (priority << 8); + + qcsapi_retval = qcsapi_wifi_set_bss_assoc_limit(interface, assoc_limit); + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out(print, "complete\n"); + } + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } + } + + return statval; +} + +static int +call_qcsapi_interface_get_status( const call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[] ) +{ + int statval = 0; + char interface_status[ 16 ], *p_status = NULL; + int qcsapi_retval; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + + if (argc < 1 || strcmp( argv[ 0 ], "NULL" ) != 0) + p_status = &interface_status[ 0 ]; + qcsapi_retval = qcsapi_interface_get_status( the_interface, p_status ); + + if (qcsapi_retval >= 0) + { + print_out( print, "%s\n", &interface_status[ 0 ] ); + } + else + { + if (verbose_flag >= 0) + { + report_qcsapi_error( p_calling_bundle, qcsapi_retval ); + } + + statval = 1; + } + + return( statval ); +} + +static int +call_qcsapi_interface_set_ip4( const call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[] ) +{ + int statval = 0; + uint32_t if_param_val; + uint32_t if_param_val_ne; + int qcsapi_retval; + char *if_param = NULL; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + if (argc < 2) { + print_err( print, "Not enough parameters in call qcsapi set_ip\n" ); + print_err( print, + "Usage: call_qcsapi set_ip \n" + ); + statval = 1; + } else { + if (strcmp(argv[0], "NULL") != 0) + if_param = argv[ 0 ]; + + if (inet_pton(AF_INET, argv[1], &if_param_val) != 1) { + print_err(print, "invalid IPv4 argument %s\n", argv[1]); + return -EINVAL; + } + if_param_val_ne = htonl(if_param_val); + + qcsapi_retval = qcsapi_interface_set_ip4(the_interface, if_param, if_param_val_ne); + + if (qcsapi_retval >= 0) + { + print_out(print, "complete\n"); + } + else + { + if (verbose_flag >= 0) + { + report_qcsapi_error( p_calling_bundle, qcsapi_retval ); + } + statval = 1; + } + } + + return( statval ); +} + +static int +call_qcsapi_interface_get_ip4( const call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[] ) +{ + int statval = 0; + string_64 if_param_val; + char *p_if_param_val = &if_param_val[ 0 ]; + int qcsapi_retval; + char *if_param = NULL; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + + if (argc < 2) { + if_param = argv[0]; + } + + qcsapi_retval = qcsapi_interface_get_ip4(the_interface, if_param, p_if_param_val); + + if (qcsapi_retval >= 0) + { + print_out(print, "%s\n", p_if_param_val); + } + else + { + if (verbose_flag >= 0) + { + report_qcsapi_error( p_calling_bundle, qcsapi_retval ); + } + statval = 1; + } + + return( statval ); +} + +static int +call_qcsapi_wifi_get_list_channels( const call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[] ) +{ + int statval = 0; + char *p_list_channels = NULL; + int qcsapi_retval; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + static string_1024 the_list_channels; +/* + * Prefer a non-reentrant program to allocating 1025 bytes on the stack. + */ + if (argc < 1 || strcmp( argv[ 0 ], "NULL" ) != 0) + p_list_channels = &the_list_channels[ 0 ]; + qcsapi_retval = qcsapi_wifi_get_list_channels( the_interface, p_list_channels ); + + if (qcsapi_retval >= 0) + { + if (verbose_flag >= 0) + { + print_out( print, "%s\n", &the_list_channels[ 0 ] ); + } + } + else + { + report_qcsapi_error( p_calling_bundle, qcsapi_retval ); + statval = 1; + } + + return( statval ); +} + +static int +call_qcsapi_wifi_get_mode_switch( const call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[] ) +{ + int statval = 0; + uint8_t wifi_mode, *p_wifi_mode = NULL; + int qcsapi_retval; + qcsapi_output *print = p_calling_bundle->caller_output; + + if (argc < 1 || strcmp( argv[ 0 ], "NULL" ) != 0) + p_wifi_mode = &wifi_mode; + qcsapi_retval = qcsapi_wifi_get_mode_switch( p_wifi_mode ); + + if (qcsapi_retval >= 0) + { + if (verbose_flag >= 0) + { + print_out( print, "%x\n", wifi_mode ); + } + } + else + { + report_qcsapi_error( p_calling_bundle, qcsapi_retval ); + statval = 1; + } + + return( statval ); +} + +static int +call_qcsapi_wifi_get_option( const call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[] ) +{ + int statval = 0; + int wifi_option, *p_wifi_option = NULL; + int qcsapi_retval; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + qcsapi_option_type the_option = p_calling_bundle->caller_generic_parameter.parameter_type.option; + + if (argc < 1 || strcmp( argv[ 0 ], "NULL" ) != 0) + p_wifi_option = &wifi_option; + qcsapi_retval = qcsapi_wifi_get_option( the_interface, the_option, p_wifi_option ); + + if (qcsapi_retval >= 0) + { + if (verbose_flag >= 0) + { + if (wifi_option == 0) + print_out( print, "FALSE\n" ); + else + print_out( print, "TRUE\n" ); + } + } + else + { + report_qcsapi_error( p_calling_bundle, qcsapi_retval ); + statval = 1; + } + + return( statval ); +} + +# define BUF_MAX_LEN 40 + +static int +call_qcsapi_get_board_parameter(const call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[]) +{ + int statval = 0; + int qcsapi_retval = 0; + qcsapi_output *print = p_calling_bundle->caller_output; + qcsapi_board_parameter_type the_boardparam = p_calling_bundle->caller_generic_parameter.parameter_type.board_param; + string_64 p_buffer; + + if (argc > 0 && (strcmp(argv[ 0 ], "NULL") == 0)) + { + qcsapi_retval = -EFAULT; + } + else + { + memset(p_buffer, 0, sizeof(p_buffer)); + qcsapi_retval = qcsapi_get_board_parameter(the_boardparam, p_buffer); + } + + if (qcsapi_retval >= 0) + { + if (verbose_flag >= 0) + { + print_out(print, "%s\n", p_buffer); + } + } + else + { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } + + return(statval); +} + +static int +call_qcsapi_wifi_get_noise( const call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[] ) +{ + int statval = 0; + int qcsapi_retval; + int current_noise, *p_noise = NULL; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + + if (argc < 1 || strcmp( argv[ 0 ], "NULL" ) != 0) { + p_noise = ¤t_noise; + } + + qcsapi_retval = qcsapi_wifi_get_noise( the_interface, p_noise ); + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out( print, "%d\n", current_noise ); + } + } else { + report_qcsapi_error( p_calling_bundle, qcsapi_retval ); + statval = 1; + } + + return( statval ); +} + +static int +call_qcsapi_wifi_get_rssi_by_chain( const call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[] ) +{ + int statval = 0; + qcsapi_output *print = p_calling_bundle->caller_output; + + if (argc < 1) { + print_err( print, "Not enough parameters in call qcsapi get RSSI by chain\n" ); + print_err( print, "Usage: call_qcsapi get_rssi_by_chain \n" ); + statval = 1; + } else { + int qcsapi_retval; + int current_rssi = 0, *p_rssi = NULL; + const char *the_interface = p_calling_bundle->caller_interface; + int rf_chain = atoi( argv[ 0 ] ); + + if (argc < 2 || strcmp( argv[ 1 ], "NULL" ) != 0) { + p_rssi = ¤t_rssi; + } + + if (rf_chain == 0 && (qcsapi_verify_numeric(argv[0]) < 0)) { + print_err( print, "Invalid argument %s - must be an integer\n", argv[ 0 ] ); + return 1; + } + + qcsapi_retval = qcsapi_wifi_get_rssi_by_chain( the_interface, rf_chain, p_rssi ); + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out( print, "%d\n", current_rssi ); + } + } else { + report_qcsapi_error( p_calling_bundle, qcsapi_retval ); + statval = 1; + } + } + + return( statval ); +} + +static int +call_qcsapi_wifi_get_avg_snr( const call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[] ) +{ + int statval = 0; + int qcsapi_retval; + int current_snr, *p_snr = NULL; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + + if (argc < 1 || strcmp( argv[ 0 ], "NULL" ) != 0) { + p_snr = ¤t_snr; + } + + qcsapi_retval = qcsapi_wifi_get_avg_snr( the_interface, p_snr ); + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out( print, "%d\n", current_snr ); + } + } else { + report_qcsapi_error( p_calling_bundle, qcsapi_retval ); + statval = 1; + } + + return( statval ); +} + +static int +call_qcsapi_wifi_set_option( const call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[] ) +{ + int statval = 0; + int wifi_option; + int qcsapi_retval; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + qcsapi_option_type the_option = p_calling_bundle->caller_generic_parameter.parameter_type.option; + + if (argc < 1) + { + print_err( print, "Not enough parameters in call qcsapi WiFi set option, count is %d\n", argc ); + statval = 1; + } + else + { + if ((strcasecmp(argv[0], "TRUE") == 0) || (strcasecmp(argv[0], "YES") == 0) || + (strcmp(argv[0], "1") == 0)) + wifi_option = 1; + else if ((strcasecmp(argv[0], "FALSE") == 0) || (strcasecmp(argv[0], "NO") == 0) || + (strcmp(argv[0], "0") == 0)) + wifi_option = 0; + else { + print_err( print, "Invalid input arguments\n" ); + return 1; + } + + qcsapi_retval = qcsapi_wifi_set_option( the_interface, the_option, wifi_option ); + if (qcsapi_retval >= 0) + { + if (verbose_flag >= 0) + { + print_out( print, "complete\n" ); + } + } + else + { + report_qcsapi_error( p_calling_bundle, qcsapi_retval ); + statval = 1; + } + } + + return( statval ); +} + +static int +call_qcsapi_wifi_get_rates( const call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[] ) +{ + int statval = 0; + char *p_rates = NULL; + int qcsapi_retval; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + qcsapi_rate_type the_rates_type = p_calling_bundle->caller_generic_parameter.parameter_type.typeof_rates; + static string_1024 the_rates; +/* + * Prefer a non-reentrant program to allocating 1025 bytes on the stack. + */ + if (argc < 1 || strcmp( argv[ 0 ], "NULL" ) != 0) { + p_rates = &the_rates[ 0 ]; + } + + qcsapi_retval = qcsapi_wifi_get_rates( the_interface, the_rates_type, p_rates ); + + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out( print, "%s\n", the_rates ); + } + } else { + report_qcsapi_error( p_calling_bundle, qcsapi_retval ); + statval = 1; + } + + return (statval); +} + +/** + * validate_rates return 1 on success and 0 on failure + */ +static int +validate_rates(char *input_rate[], int num_rates) +{ + int rates[] = {2,4,11,12,18,22,24,36,48,72,96,108}; + int found = 0, i, j, rate; + + for (i = 0; i < num_rates; i++) { + rate = atoi(input_rate[i]); + found = 0; + for (j = 0; j < ARRAY_SIZE(rates); j++) { + if (rate == rates[j]) { + found = 1; + break; + } + + } + + if (!found) { + break; + } + } + return found; +} + +static int +call_qcsapi_wifi_set_rates( const call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[] ) +{ + int statval = 0; + int qcsapi_retval; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + qcsapi_rate_type the_rates_type = p_calling_bundle->caller_generic_parameter.parameter_type.typeof_rates; + + if (argc < 1) { + print_err( print, "Not enough parameters in call qcsapi WiFi set rates, count is %d\n", argc ); + statval = 1; + } else { + char *p_rates = argv[ 0 ]; + + if (!validate_rates(argv, argc)) { + print_err (print, "Invalid input rates, valid rates are 2,4,11,12,18,22,24,36,48,72,96,108 in 500Kbps units\n"); + return 1; + } + + qcsapi_retval = qcsapi_wifi_set_rates( the_interface, the_rates_type, p_rates, argc); + + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out( print, "complete\n" ); + } + } else { + report_qcsapi_error( p_calling_bundle, qcsapi_retval ); + statval = 1; + } + } + + return (statval); +} + +static int +call_qcsapi_wifi_get_max_bitrate( call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[] ) +{ + int statval = 0; + int qcsapi_retval; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + + char max_bitrate_str[QCSAPI_MAX_BITRATE_STR_MIN_LEN + 1] = {0}; + + qcsapi_retval = qcsapi_get_max_bitrate(the_interface, max_bitrate_str, QCSAPI_MAX_BITRATE_STR_MIN_LEN); + + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out( print, "%s\n", &max_bitrate_str[ 0 ] ); + } + } else { + report_qcsapi_error( p_calling_bundle, qcsapi_retval ); + statval = 1; + } + + return statval; +} + +static int +call_qcsapi_wifi_set_max_bitrate( call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[] ) +{ + int statval = 0; + int qcsapi_retval; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + + if (argc < 1) { + print_err( print, "Not enough parameters in call qcsapi wifi set max bitrate, count is %d\n", argc ); + statval = 1; + } + + qcsapi_retval = qcsapi_set_max_bitrate(the_interface, argv[0]); + + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out( print, "complete\n"); + } + } else { + report_qcsapi_error( p_calling_bundle, qcsapi_retval ); + statval = 1; + } + + return statval; +} + +static int +call_qcsapi_wifi_get_beacon_type( call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[] ) +{ + int statval = 0; + char beacon_type[ 16 ], *p_beacon = NULL; + int qcsapi_retval; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + + if (argc < 1 || strcmp( argv[ 0 ], "NULL" ) != 0) + p_beacon = &beacon_type[ 0 ]; + qcsapi_retval = qcsapi_wifi_get_beacon_type( the_interface, p_beacon ); + + if (qcsapi_retval >= 0) + { + if (verbose_flag >= 0) + { + print_out( print, "%s\n", &beacon_type[ 0 ] ); + } + } + else + { + report_qcsapi_error( p_calling_bundle, qcsapi_retval ); + statval = 1; + } + + return( statval ); +} + +static int +call_qcsapi_wifi_set_beacon_type( call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[] ) +{ + int statval = 0; + int qcsapi_retval; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + + if (argc < 1) + { + print_err( print, "Not enough parameters in call qcsapi WiFi set beacon, count is %d\n", argc ); + statval = 1; + } + else + { + char *p_beacon = argv[ 0 ]; + + /* Beacon type will not be NULL ... */ + + if (strcmp( argv[ 0 ], "NULL" ) == 0) + p_beacon = NULL; + qcsapi_retval = qcsapi_wifi_set_beacon_type( the_interface, p_beacon ); + + if (qcsapi_retval >= 0) + { + if (verbose_flag >= 0) + { + print_out( print, "complete\n" ); + } + } + else + { + report_qcsapi_error( p_calling_bundle, qcsapi_retval ); + statval = 1; + } + } + + return( statval ); +} + +static int +call_qcsapi_wifi_get_beacon_interval( call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[] ) +{ + int statval = 0; + qcsapi_unsigned_int bintval_value, *p_bintval_value = NULL; + int qcsapi_retval; + const char *the_interface = p_calling_bundle->caller_interface; + + if (argc < 1 || strcmp( argv[ 0 ], "NULL" ) != 0) + p_bintval_value = &bintval_value; + + qcsapi_output *print = p_calling_bundle->caller_output; + + qcsapi_retval = qcsapi_wifi_get_beacon_interval(the_interface,p_bintval_value); + + if( qcsapi_retval>=0 ){ + print_out( print,"%d\n",bintval_value ); + }else + { + report_qcsapi_error( p_calling_bundle, qcsapi_retval ); + statval = 1; + } + + return( statval ); +} + +static int +call_qcsapi_wifi_set_beacon_interval( call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[] ) +{ + int statval = 0; + int qcsapi_retval; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + qcsapi_unsigned_int new_bintval = atoi( argv[ 0 ] ); + + if ((new_bintval > BEACON_INTERVAL_WARNING_LOWER_LIMIT) && (new_bintval < BEACON_INTERVAL_WARNING_UPPER_LIMIT)) { + print_out(print,"Warning, beacon interval less than 100ms may cause network performance degradation\n"); + } + + qcsapi_retval = qcsapi_wifi_set_beacon_interval(the_interface,new_bintval); + + if(qcsapi_retval>=0){ + print_out( print,"complete\n" ); + }else + { + report_qcsapi_error( p_calling_bundle, qcsapi_retval ); + statval = 1; + } + + return ( statval ); +} + +static int +call_qcsapi_wifi_get_list_regulatory_regions( call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[] ) +{ + int statval = 0; + string_256 supported_regions; + int qcsapi_retval; + qcsapi_output *print = p_calling_bundle->caller_output; + + if (argc < 1 || strcmp( argv[ 0 ], "NULL" ) != 0) { + qcsapi_retval = qcsapi_regulatory_get_list_regulatory_regions(supported_regions); + + if (qcsapi_retval == -qcsapi_region_database_not_found) { + qcsapi_retval = qcsapi_wifi_get_list_regulatory_regions(supported_regions); + } + + } else { + + qcsapi_retval = qcsapi_regulatory_get_list_regulatory_regions(NULL); + + if (qcsapi_retval == -qcsapi_region_database_not_found) { + qcsapi_retval = qcsapi_wifi_get_list_regulatory_regions(NULL); + } + } + + if (qcsapi_retval >= 0) + { + if (verbose_flag >= 0) + { + print_out( print, "%s\n", supported_regions ); + } + } + else + { + report_qcsapi_error( p_calling_bundle, qcsapi_retval ); + statval = 1; + } + + return( statval ); +} + +static int +call_qcsapi_wifi_get_regulatory_tx_power( call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[] ) +{ + int statval = 0; + qcsapi_output *print = p_calling_bundle->caller_output; + + if (argc < 2) + { + print_err( print, "Not enough parameters in call qcsapi get regulatory tx_power\n" ); + print_err( print, "Usage: call_qcsapi get_regulatory_tx_power \n" ); + statval = 1; + } + else + { + int qcsapi_retval; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_unsigned_int the_channel = (qcsapi_unsigned_int) atoi( argv[ 0 ] ); + const char *regulatory_region = NULL; + int *p_tx_power = NULL, tx_power = 0; + + if (strcmp( argv[ 1 ], "NULL" ) != 0) + regulatory_region = argv[ 1 ]; + + if (argc < 3 || strcmp( argv[ 2 ], "NULL" ) != 0) + p_tx_power = &tx_power; + + + qcsapi_retval = qcsapi_regulatory_get_regulatory_tx_power( + the_interface, + the_channel, + regulatory_region, + p_tx_power + ); + + if (qcsapi_retval == -qcsapi_region_database_not_found) { + + qcsapi_retval = qcsapi_wifi_get_regulatory_tx_power( + the_interface, + the_channel, + regulatory_region, + p_tx_power + ); + } + + if (qcsapi_retval >= 0) + { + if (verbose_flag >= 0) + { + print_out( print, "%d\n", tx_power ); + } + } + else + { + report_qcsapi_error( p_calling_bundle, qcsapi_retval ); + statval = 1; + } + } + + return( statval ); +} + +static int +call_qcsapi_wifi_get_configured_tx_power(call_qcsapi_bundle *p_calling_bundle, + int argc, char *argv[]) +{ + int statval = 0; + qcsapi_output *print = p_calling_bundle->caller_output; + const char *iface = p_calling_bundle->caller_interface; + qcsapi_unsigned_int channel; + const char *region; + qcsapi_unsigned_int the_bw = 0; + qcsapi_unsigned_int bf_on; + qcsapi_unsigned_int number_ss; + int retval; + int tx_power = 0; + + const char *msg_usage_mandatory_params = + "Not enough parameters in call qcsapi get_configured_tx_power\n" + "Usage: call_qcsapi get_configured_tx_power" + " "; + + if (argc < 2) { + print_err(print, "%s [bandwidth] [bf_on] [number_ss]\n", + msg_usage_mandatory_params); + + statval = 1; + goto finish; + } + + channel = (qcsapi_unsigned_int) atoi(argv[0]); + region = argv[1]; + + if (argc < 3) { + retval = qcsapi_wifi_get_bw(iface, &the_bw); + + /* Call to get the BW might fail if the interface is wrong */ + if (retval < 0) { + if ((retval == -ENODEV) || (retval == -EOPNOTSUPP)) { + print_out(print, "Interface %s does not exist" + "or not a Wireless Extension interface\n", + iface); + } else + report_qcsapi_error(p_calling_bundle, retval); + + statval = 1; + goto finish; + } + } else + the_bw = (qcsapi_unsigned_int) atoi(argv[2]); + + if (argc < 4) { + /* additional parameters are not specified: beamforming off, one spatial stream */ + bf_on = 0; + number_ss = 1; + } else if (argc >= 5) { + bf_on = atoi(argv[3]); + number_ss = atoi(argv[4]); + } else { + /* beamforming and spatial stream must be specified */ + print_err(print, "%s \n", + msg_usage_mandatory_params); + + statval = 1; + goto finish; + } + + retval = qcsapi_regulatory_get_configured_tx_power_ext( + iface, + channel, + region, + the_bw, + bf_on, + number_ss, + &tx_power); + + if (retval == -qcsapi_region_database_not_found) { + retval = qcsapi_wifi_get_configured_tx_power( + iface, + channel, + region, + the_bw, + &tx_power); + } + + if (retval >= 0) { + if (verbose_flag >= 0) + print_out(print, "%d\n", tx_power); + } else { + report_qcsapi_error(p_calling_bundle, retval); + statval = 1; + } + +finish: + + return statval; +} + +static int +call_qcsapi_wifi_set_regulatory_channel( call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[] ) +{ + int statval = 0; + qcsapi_output *print = p_calling_bundle->caller_output; + + if (argc < 2) + { + print_err( print, "Not enough parameters in call qcsapi set regulatory channel\n" ); + print_err( print, + "Usage: call_qcsapi set_regulatory_channel \n" + ); + statval = 1; + } + else + { + int qcsapi_retval; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_unsigned_int the_channel = (qcsapi_unsigned_int) atoi( argv[ 0 ] ); + const char *regulatory_region = NULL; + qcsapi_unsigned_int tx_power_offset = 0; + + if (argc >= 3) + tx_power_offset = (qcsapi_unsigned_int) atoi( argv[ 2 ] ); + + if (strcmp( argv[ 1 ], "NULL" ) != 0) + regulatory_region = argv[ 1 ]; + + qcsapi_retval = qcsapi_regulatory_set_regulatory_channel( + the_interface, + the_channel, + regulatory_region, + tx_power_offset + ); + + if (qcsapi_retval == -qcsapi_region_database_not_found) { + + qcsapi_retval = qcsapi_wifi_set_regulatory_channel( + the_interface, + the_channel, + regulatory_region, + tx_power_offset + ); + } + + + + if (qcsapi_retval >= 0) + { + if (verbose_flag >= 0) + { + print_out( print, "complete\n" ); + } + } + else + { + report_qcsapi_error( p_calling_bundle, qcsapi_retval ); + statval = 1; + } + } + + return( statval ); +} + +static int +call_qcsapi_wifi_set_regulatory_region( call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[] ) +{ + int statval = 0; + qcsapi_output *print = p_calling_bundle->caller_output; + + if (argc < 1) + { + print_err( print, "Not enough parameters in call qcsapi set regulatory region\n" ); + print_err( print, + "Usage: call_qcsapi set_regulatory_region \n" + ); + statval = 1; + } + else + { + int qcsapi_retval; + const char *the_interface = p_calling_bundle->caller_interface; + const char *regulatory_region = NULL; + + if (strcmp( argv[ 0 ], "NULL" ) != 0) + regulatory_region = argv[ 0 ]; + + qcsapi_retval = qcsapi_regulatory_set_regulatory_region( + the_interface, + regulatory_region + ); + + if (qcsapi_retval == -qcsapi_region_database_not_found) { + qcsapi_retval = qcsapi_wifi_set_regulatory_region( + the_interface, + regulatory_region + ); + } + + if (qcsapi_retval >= 0) + { + if (verbose_flag >= 0) + { + print_out( print, "complete\n" ); + } + } + else + { + report_qcsapi_error( p_calling_bundle, qcsapi_retval ); + statval = 1; + } + } + + return( statval ); +} + +static int +call_qcsapi_wifi_restore_regulatory_tx_power( call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[] ) +{ + int statval = 0; + qcsapi_output *print = p_calling_bundle->caller_output; + int qcsapi_retval; + const char *the_interface = p_calling_bundle->caller_interface; + + qcsapi_retval = qcsapi_regulatory_restore_regulatory_tx_power(the_interface); + + if (qcsapi_retval >= 0) + { + if (verbose_flag >= 0) + { + print_out( print, "complete\n" ); + } + } + else + { + report_qcsapi_error( p_calling_bundle, qcsapi_retval ); + statval = 1; + } + + return( statval ); +} + +static int +call_qcsapi_wifi_get_regulatory_region( call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[] ) +{ + int statval = 0; + + int qcsapi_retval; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + char regulatory_region[6]; + char *p_regulatory_region = NULL; + + if (argc < 1 || strcmp( argv[ 0 ], "NULL" ) != 0) { + p_regulatory_region = ®ulatory_region[ 0 ]; + } + + qcsapi_retval = qcsapi_wifi_get_regulatory_region( the_interface, p_regulatory_region ); + + if (qcsapi_retval >= 0) { + print_out( print, "%s\n", p_regulatory_region ); + } + else { + report_qcsapi_error( p_calling_bundle, qcsapi_retval ); + statval = 1; + } + + return( statval ); +} + +static int +call_qcsapi_wifi_overwrite_country_code( call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[] ) +{ + int statval = 0; + qcsapi_output *print = p_calling_bundle->caller_output; + + if (argc < 1) + { + print_err( print, "Not enough parameters in call qcsapi overwrite coutnry code\n" ); + print_err( print, + "Usage: call_qcsapi overwrite_country_code \n" + ); + statval = 1; + } + else + { + int qcsapi_retval; + const char *the_interface = p_calling_bundle->caller_interface; + const char *curr_country_name = NULL; + const char *new_country_name = NULL; + + if (strcmp( argv[ 0 ], "NULL" ) != 0) + curr_country_name = argv[0]; + if (strcmp( argv[ 1 ], "NULL" ) != 0) + new_country_name = argv[1]; + + qcsapi_retval = qcsapi_regulatory_overwrite_country_code( + the_interface, + curr_country_name, + new_country_name + ); + + if (qcsapi_retval >= 0) + { + if (verbose_flag >= 0) + print_out( print, "complete\n" ); + } else if (qcsapi_retval == -qcsapi_configuration_error) { + print_err( print, "Error: can't overwrite country code for provision board\n" ); + statval = 1; + } else if (qcsapi_retval == -qcsapi_region_not_supported) { + print_err( print, "Error: current region is not %s\n", curr_country_name); + statval = 1; + } else { + report_qcsapi_error( p_calling_bundle, qcsapi_retval ); + statval = 1; + } + } + + return( statval ); +} + + +static int +call_qcsapi_wifi_get_list_regulatory_channels( call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[] ) +{ + int statval = 0; + qcsapi_output *print = p_calling_bundle->caller_output; + + if (argc < 1) + { + print_err( print, "Not enough parameters in call qcsapi get list regulatory channels\n" ); + print_err( print, "Usage: call_qcsapi get_list_regulatory_channels \n" ); + statval = 1; + } + else + { + int qcsapi_retval = 0; + char *p_list_channels = NULL; + const char *regulatory_region = NULL; + qcsapi_unsigned_int the_bw = 0; +/* + * Prefer a non-reentrant program to allocating 1025 bytes on the stack. + */ + static string_1024 the_list_channels; + + if (strcmp( argv[ 0 ], "NULL" ) != 0) + regulatory_region = argv[ 0 ]; + + if (argc < 2) + { + qcsapi_retval = qcsapi_wifi_get_bw( "wifi0", &the_bw ); + } else { + the_bw = atoi(argv[1]); + } + + if (argc < 3 || strcmp( argv[ 2 ], "NULL" ) != 0) { + p_list_channels = &the_list_channels[ 0 ]; + } + + + if (qcsapi_retval >= 0) { + qcsapi_retval = qcsapi_regulatory_get_list_regulatory_channels( regulatory_region, the_bw, p_list_channels ); + } + + if (qcsapi_retval == -qcsapi_region_database_not_found) { + qcsapi_retval = qcsapi_wifi_get_list_regulatory_channels(regulatory_region, the_bw, p_list_channels); + } + + if (qcsapi_retval >= 0) + { + if (verbose_flag >= 0) + { + print_out( print, "%s\n", the_list_channels ); + } + } + else + { + report_qcsapi_error( p_calling_bundle, qcsapi_retval ); + statval = 1; + } + } + + return( statval ); +} + +static int +call_qcsapi_wifi_get_list_regulatory_bands( call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[] ) +{ + int statval = 0; + qcsapi_output *print = p_calling_bundle->caller_output; + + if (argc < 1) { + print_err( print, "Not enough parameters in call qcsapi get list regulatory channels\n" ); + print_err( print, "Usage: call_qcsapi get_list_regulatory_channels \n" ); + statval = 1; + + } else { + int qcsapi_retval; + char *p_list_bands = NULL; + const char *regulatory_region = NULL; + + /* Prefer a non-reentrant program to allocating 1025 bytes on the stack. */ + static string_128 the_list_bands; + + if (strcmp(argv[ 0 ], "NULL") != 0) { + regulatory_region = argv[0]; + } + + if (argc < 3 || strcmp( argv[2], "NULL") != 0) { + p_list_bands = &the_list_bands[0]; + } + + qcsapi_retval = qcsapi_regulatory_get_list_regulatory_bands(regulatory_region, p_list_bands); + + if (qcsapi_retval >= 0) { + + if (verbose_flag >= 0) { + print_out( print, "%s\n", the_list_bands ); + } + } else { + report_qcsapi_error( p_calling_bundle, qcsapi_retval ); + statval = 1; + } + } + + return( statval ); +} + +static int +call_qcsapi_wifi_get_regulatory_db_version( call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[] ) +{ + int statval = 0; + qcsapi_output *print = p_calling_bundle->caller_output; + int qcsapi_retval; + int version = 0; + int index = 0; + int retval = 0; + char ch='v'; + int *p_qcsapi_retval = &qcsapi_retval; + const char *format[2] = { "%c%d", "0%c%x" }; + + if (argc > 0) { + index = atoi(argv[0]); + ch='x'; + } + + if (verbose_flag >= 0) + print_out(print, "Regulatory db version: "); + + do { + *p_qcsapi_retval = qcsapi_regulatory_get_db_version(&version, index++); + if (qcsapi_retval == -1 || retval < 0) + break; + + print_out(print, format[argc > 0], ch, version); + + ch = '.'; + p_qcsapi_retval = &retval; + } while (argc == 0 && qcsapi_retval >= 0); + + if (qcsapi_retval == -1) { + print_out(print, "database not available"); + } + + print_out(print, "\n"); + + if (qcsapi_retval < 0) + statval = 1; + + return statval; +} + +static int +call_qcsapi_wifi_set_regulatory_tx_power_cap( call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[] ) +{ + int statval = 0; + qcsapi_output *print = p_calling_bundle->caller_output; + + if (argc < 1) + { + print_err( print, "Not enough parameters, count is %d\n", argc ); + statval = 1; + } + else + { + qcsapi_unsigned_int capped = atoi( argv[ 0 ] ); + int qcsapi_retval; + + qcsapi_retval = qcsapi_regulatory_apply_tx_power_cap( capped ); + if (qcsapi_retval >= 0) + { + if (verbose_flag >= 0) + { + print_out( print, "complete\n" ); + } + } + else + { + report_qcsapi_error( p_calling_bundle, qcsapi_retval ); + statval = 1; + } + } + + return( statval ); +} + +static int +call_qcsapi_wifi_get_tx_power( call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[] ) +{ + int statval = 0; + qcsapi_output *print = p_calling_bundle->caller_output; + + if (argc < 1) { + print_err( print, "Not enough parameters in call qcsapi get TX power\n" ); + print_err( print, "Usage: call_qcsapi get_tx_power \n" ); + statval = 1; + } + else { + int qcsapi_retval; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_unsigned_int the_channel = atoi( argv[ 0 ] ); + int the_tx_power = 0; + int *p_tx_power = NULL; + + if (argc < 2 || strcmp( argv[ 1 ], "NULL" ) != 0) { + p_tx_power = &the_tx_power; + } + + qcsapi_retval = qcsapi_wifi_get_tx_power( the_interface, the_channel, p_tx_power ); + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out( print, "%d\n", the_tx_power ); + } + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } + } + + return( statval ); +} + +static int +call_qcsapi_wifi_set_tx_power(call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[]) +{ + int statval = 0; + qcsapi_output *print = p_calling_bundle->caller_output; + int qcsapi_retval; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_unsigned_int channel; + int tx_power = 0; + + if (argc < 2) { + print_err(print, "Not enough parameters in call qcsapi set_tx_power\n"); + return 1; + } + + channel = atoi(argv[0]); + tx_power = atoi(argv[1]); + + qcsapi_retval = qcsapi_wifi_set_tx_power(the_interface, channel, tx_power); + + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) + print_out(print, "complete\n"); + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } + + return statval; +} + +static int +call_qcsapi_wifi_get_bw_power( call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[] ) +{ + int statval = 0; + qcsapi_output *print = p_calling_bundle->caller_output; + + if (argc < 1) { + print_err( print, "Not enough parameters in call qcsapi get_bw_power\n" ); + print_err( print, "Usage: call_qcsapi get_bw_power \n" ); + statval = 1; + } + else { + int qcsapi_retval; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_unsigned_int the_channel = atoi( argv[ 0 ] ); + int power_20M = 0; + int power_40M = 0; + int power_80M = 0; + + qcsapi_retval = qcsapi_wifi_get_bw_power( the_interface, the_channel, + &power_20M, &power_40M, &power_80M ); + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out( print, " pwr_20M pwr_40M pwr_80M\n %7d %7d %7d\n", + power_20M, power_40M, power_80M ); + } + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } + } + + return( statval ); +} + +static int +call_qcsapi_wifi_set_bw_power(call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[]) +{ + int statval = 0; + qcsapi_output *print = p_calling_bundle->caller_output; + int qcsapi_retval; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_unsigned_int channel; + int power_20M = 0; + int power_40M = 0; + int power_80M = 0; + + if (argc < 2) { + print_err(print, "Not enough parameters in call qcsapi set_bw_power\n"); + print_err( print, "Usage: call_qcsapi set_bw_power " + " \n" ); + return 1; + } + + channel = atoi(argv[0]); + power_20M = atoi(argv[1]); + if (argc >= 3) { + power_40M = atoi(argv[2]); + if (argc >= 4) { + power_80M = atoi(argv[3]); + } + } + + qcsapi_retval = qcsapi_wifi_set_bw_power(the_interface, channel, + power_20M, power_40M, power_80M); + + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) + print_out(print, "complete\n"); + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } + + return statval; +} + +static int +call_qcsapi_wifi_get_bf_power( call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[] ) +{ + int statval = 0; + qcsapi_output *print = p_calling_bundle->caller_output; + + if (argc < 2) { + print_err( print, "Not enough parameters in call qcsapi get_bf_power\n" ); + print_err( print, "Usage: call_qcsapi get_bf_power \n" ); + statval = 1; + } + else { + int qcsapi_retval; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_unsigned_int the_channel = atoi(argv[0]); + int number_ss = atoi(argv[1]); + int power_20M = 0; + int power_40M = 0; + int power_80M = 0; + + qcsapi_retval = qcsapi_wifi_get_bf_power( the_interface, the_channel, + number_ss, &power_20M, &power_40M, &power_80M ); + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out( print, " pwr_20M pwr_40M pwr_80M\n %7d %7d %7d\n", + power_20M, power_40M, power_80M ); + } + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } + } + + return( statval ); +} + +static int +call_qcsapi_wifi_set_bf_power(call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[]) +{ + int statval = 0; + qcsapi_output *print = p_calling_bundle->caller_output; + int qcsapi_retval; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_unsigned_int channel; + int power_20M = 0; + int power_40M = 0; + int power_80M = 0; + int number_ss = 0; + + if (argc < 3) { + print_err(print, "Not enough parameters in call qcsapi set_bf_power\n"); + print_err( print, "Usage: call_qcsapi set_bf_power " + " \n" ); + return 1; + } + + channel = atoi(argv[0]); + number_ss = atoi(argv[1]); + power_20M = atoi(argv[2]); + if (argc >= 4) { + power_40M = atoi(argv[3]); + if (argc >= 5) { + power_80M = atoi(argv[4]); + } + } + + qcsapi_retval = qcsapi_wifi_set_bf_power(the_interface, channel, + number_ss, power_20M, power_40M, power_80M); + + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) + print_out(print, "complete\n"); + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } + + return statval; +} + +static int +call_qcsapi_wifi_get_tx_power_ext( call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[] ) +{ + int statval = 0; + qcsapi_output *print = p_calling_bundle->caller_output; + + if (argc < 3) { + print_err( print, "Not enough parameters in call_qcsapi get_tx_power_ext\n" ); + print_err( print, "Usage: call_qcsapi get_tx_power_ext \n" ); + statval = 1; + } else { + int qcsapi_retval; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_unsigned_int the_channel = atoi(argv[0]); + int bf_on = !!atoi(argv[1]); + int number_ss = atoi(argv[2]); + int power_20M = 0; + int power_40M = 0; + int power_80M = 0; + + qcsapi_retval = qcsapi_wifi_get_tx_power_ext( the_interface, the_channel, + bf_on, number_ss, &power_20M, &power_40M, &power_80M ); + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out( print, " pwr_20M pwr_40M pwr_80M\n %7d %7d %7d\n", + power_20M, power_40M, power_80M ); + } + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } + } + + return( statval ); +} + +static int +call_qcsapi_wifi_set_tx_power_ext(call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[]) +{ + int statval = 0; + qcsapi_output *print = p_calling_bundle->caller_output; + int qcsapi_retval; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_unsigned_int channel; + int power_20M = 0; + int power_40M = 0; + int power_80M = 0; + int bf_on = 0; + int number_ss = 0; + + if (argc < 4) { + print_err(print, "Not enough parameters in call_qcsapi set_tx_power_ext\n"); + print_err( print, "Usage: call_qcsapi set_tx_power_ext " + " \n" ); + return 1; + } + + channel = atoi(argv[0]); + bf_on = !!atoi(argv[1]); + number_ss = atoi(argv[2]); + power_20M = atoi(argv[3]); + if (argc >= 5) { + power_40M = atoi(argv[4]); + if (argc >= 6) { + power_80M = atoi(argv[5]); + } + } + + qcsapi_retval = qcsapi_wifi_set_tx_power_ext(the_interface, channel, + bf_on, number_ss, power_20M, power_40M, power_80M); + + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) + print_out(print, "complete\n"); + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } + + return statval; +} + +static int +call_qcsapi_wifi_get_chan_power_table( call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[] ) +{ + int statval = 0; + qcsapi_output *print = p_calling_bundle->caller_output; + + if (argc < 1) { + print_err( print, "Not enough parameters in call_qcsapi get_chan_power_table\n" ); + print_err( print, "Usage: call_qcsapi get_chan_power_table \n" ); + statval = 1; + } else { + int qcsapi_retval; + int index; + qcsapi_channel_power_table power_table; + const char *the_interface = p_calling_bundle->caller_interface; + + power_table.channel = atoi(argv[0]); + qcsapi_retval = qcsapi_wifi_get_chan_power_table(the_interface, &power_table); + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out( print, "Channel 80M 40M 20M\n"); + for (index = 0; index < QCSAPI_POWER_TOTAL; index++) { + print_out( print,"%5d %4d %4d %4d\n", + power_table.channel, + power_table.power_80M[index], + power_table.power_40M[index], + power_table.power_20M[index]); + } + } + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } + } + + return( statval ); +} + +static int +call_qcsapi_wifi_set_chan_power_table(call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[]) +{ + qcsapi_output *print = p_calling_bundle->caller_output; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_channel_power_table power_table; + int statval = 0; + int qcsapi_retval; + uint8_t channel; + int8_t max_power; + int8_t backoff; + uint32_t backoff_20m = 0; + uint32_t backoff_40m = 0; + uint32_t backoff_80m = 0; + char *endptr; + int i; + int offset; + + if (argc < 5) { + print_err(print, "Not enough parameters in call_qcsapi set_chan_power_table\n"); + print_err( print, "Usage: call_qcsapi set_chan_power_table " + " \n" ); + print_err( print, "backoff_20M/40M/80M is a 32bits unsigned value, and every 4bits " + "indicate the backoff from the max_power for a bf/ss case.\n" + "The least significant 4 bits are for bfoff 1ss, and " + "the most significant 4 bits are for bfon 4ss, and so forth.\n" + "For example, max_power 23 and backoff_20M 0x54324321 means:\n" + " the power for 20Mhz bfoff 1ss: 23 - 1 = 22dBm\n" + " the power for 20Mhz bfoff 2ss: 23 - 2 = 21dBm\n" + " the power for 20Mhz bfoff 3ss: 23 - 3 = 20dBm\n" + " the power for 20Mhz bfoff 4ss: 23 - 4 = 19dBm\n" + " the power for 20Mhz bfon 1ss: 23 - 2 = 21dBm\n" + " the power for 20Mhz bfon 2ss: 23 - 3 = 20dBm\n" + " the power for 20Mhz bfon 3ss: 23 - 4 = 19dBm\n" + " the power for 20Mhz bfon 4ss: 23 - 5 = 18dBm\n"); + return 1; + } + + channel = atoi(argv[0]); + max_power = atoi(argv[1]); + backoff_20m = strtoul(argv[2], &endptr, 0); + backoff_40m = strtoul(argv[3], &endptr, 0); + backoff_80m = strtoul(argv[4], &endptr, 0); + + power_table.channel = channel; + + if (max_power <= 0) { + print_err(print, "Invalid max_power %d\n", max_power); + return 1; + } + + for (i = 0, offset = 0; i < QCSAPI_POWER_TOTAL; i++, offset += 4) { + backoff = (backoff_20m >> offset) & 0xf; + if (max_power <= backoff) { + print_err(print, "Invalid backoff_20m, too large backoff" + " for power index %d, backoff %d\n", i, backoff); + return 1; + } + power_table.power_20M[i] = max_power - backoff; + + backoff = (backoff_40m >> offset) & 0xf; + if (max_power <= backoff) { + print_err(print, "Invalid backoff_40m, too large backoff" + " for power index %d, backoff %d\n", i, backoff); + return 1; + } + power_table.power_40M[i] = max_power - backoff; + + backoff = (backoff_80m >> offset) & 0xf; + if (max_power <= backoff) { + print_err(print, "Invalid backoff_80m, too large backoff" + " for power index %d, backoff %d\n", i, backoff); + return 1; + } + power_table.power_80M[i] = max_power - backoff; + } + + qcsapi_retval = qcsapi_wifi_set_chan_power_table(the_interface, &power_table); + + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) + print_out(print, "complete\n"); + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } + + return statval; +} + +static int +call_qcsapi_wifi_get_power_selection( call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[] ) +{ + int statval = 0; + qcsapi_unsigned_int power_selection; + int qcsapi_retval; + qcsapi_output *print = p_calling_bundle->caller_output; + + qcsapi_retval = qcsapi_wifi_get_power_selection( &power_selection ); + if (qcsapi_retval >= 0) + { + if (verbose_flag >= 0) + { + print_out( print, "%d\n", power_selection ); + } + } + else + { + report_qcsapi_error( p_calling_bundle, qcsapi_retval ); + statval = 1; + } + + return( statval ); +} + +static int +call_qcsapi_wifi_set_power_selection( call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[] ) +{ + int statval = 0; + qcsapi_output *print = p_calling_bundle->caller_output; + + if (argc != 1) + { + print_err( print, "Incorrect parameters in call qcsapi set power selection\n"); + print_err( print, "Usage: call_qcsapi set_power_selection <0/1/2/3>\n" ); + statval = 1; + } + else + { + qcsapi_unsigned_int power_selection = atoi( argv[ 0 ] ); + int qcsapi_retval; + + qcsapi_retval = qcsapi_wifi_set_power_selection( power_selection ); + if (qcsapi_retval >= 0) + { + if (verbose_flag >= 0) + { + print_out( print, "complete\n" ); + } + } + else + { + report_qcsapi_error( p_calling_bundle, qcsapi_retval ); + statval = 1; + } + } + + return( statval ); +} + +static int +call_qcsapi_wifi_get_carrier_interference(call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[]) +{ + int statval = 0; + qcsapi_output *print = p_calling_bundle->caller_output; + int qcsapi_retval; + const char *the_interface = p_calling_bundle->caller_interface; + int ci = 0; + + qcsapi_retval = qcsapi_wifi_get_carrier_interference(the_interface, &ci); + + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) + print_out(print, "%ddb\n", ci); + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } + + return statval; +} + +static int +call_qcsapi_wifi_get_congestion_idx(call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[]) +{ + int statval = 0; + qcsapi_output *print = p_calling_bundle->caller_output; + int qcsapi_retval; + const char *the_interface = p_calling_bundle->caller_interface; + int ci; + + qcsapi_retval = qcsapi_wifi_get_congestion_index(the_interface, &ci); + + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) + print_out(print, "%d\n", ci); + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } + + return statval; +} + +static int +call_qcsapi_wifi_get_supported_tx_power_levels( call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[] ) +{ + int statval = 0; + qcsapi_output *print = p_calling_bundle->caller_output; + int qcsapi_retval; + const char *the_interface = p_calling_bundle->caller_interface; + string_128 power_available = ""; + char *p_power_available = &power_available[0]; + + if (argc > 0 && strcmp(argv[ 0 ], "NULL") == 0) { + p_power_available = NULL; + } + + qcsapi_retval = qcsapi_wifi_get_supported_tx_power_levels(the_interface, p_power_available); + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out(print, "%s\n", p_power_available); + } + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } + + return statval; +} + +static int +call_qcsapi_wifi_get_current_tx_power_level( call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[] ) +{ + int statval = 0; + qcsapi_output *print = p_calling_bundle->caller_output; + int qcsapi_retval; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_unsigned_int current_percentage = 0, *p_current_percentage = ¤t_percentage; + + if (argc > 0 && strcmp(argv[ 0 ], "NULL") == 0) { + p_current_percentage = NULL; + } + + qcsapi_retval = qcsapi_wifi_get_current_tx_power_level(the_interface, p_current_percentage); + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out(print, "%d\n", (int) current_percentage); + } + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } + + return statval; +} + +static int +call_qcsapi_wifi_set_power_constraint(call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[]) +{ + int statval = 0; + int qcsapi_retval; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + + if (argc < 1) + { + print_err(print, "Not enough parameters in call qcsapi WiFi set power constraint, count is %d\n", argc); + statval = 1; + } else { + int temp = atoi(argv[0]); + qcsapi_unsigned_int pwr_constraint = (qcsapi_unsigned_int)temp; + + if (temp < 0) { + qcsapi_retval = -EINVAL; + } else { + qcsapi_retval = qcsapi_wifi_set_power_constraint(the_interface, pwr_constraint); + } + + if (qcsapi_retval >= 0) { + print_out(print, "complete\n"); + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } + } + + return statval; +} + +static int +call_qcsapi_wifi_get_power_constraint(call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[]) +{ + int statval = 0; + qcsapi_unsigned_int pwr_constraint, *p_pwr_constraint = NULL; + int qcsapi_retval; + const char *the_interface = p_calling_bundle->caller_interface; + + if (argc < 1 || strcmp(argv[0], "NULL") != 0) + p_pwr_constraint = &pwr_constraint; + + qcsapi_output *print = p_calling_bundle->caller_output; + + qcsapi_retval = qcsapi_wifi_get_power_constraint(the_interface, p_pwr_constraint); + + if (qcsapi_retval >= 0) { + print_out(print, "%d\n", pwr_constraint); + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } + + return statval; +} + +static int +call_qcsapi_wifi_set_tpc_interval(call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[]) +{ + int statval = 0; + int qcsapi_retval; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + + if (argc < 1) + { + print_err(print, "Not enough parameters in call qcsapi WiFi set tpc interval, count is %d\n", argc); + statval = 1; + } else { + int temp = atoi(argv[0]); + + if (temp <= 0) { + qcsapi_retval = -EINVAL; + } else { + qcsapi_retval = qcsapi_wifi_set_tpc_interval(the_interface, temp); + } + + if (qcsapi_retval >= 0) { + print_out(print, "complete\n"); + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } + } + + return statval; +} + +static int +call_qcsapi_wifi_get_tpc_interval(call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[]) +{ + int statval = 0; + qcsapi_unsigned_int tpc_interval, *p_tpc_interval = NULL; + int qcsapi_retval; + const char *the_interface = p_calling_bundle->caller_interface; + + if (argc < 1 || strcmp(argv[0], "NULL") != 0) + p_tpc_interval = &tpc_interval; + + qcsapi_output *print = p_calling_bundle->caller_output; + + qcsapi_retval = qcsapi_wifi_get_tpc_interval(the_interface, p_tpc_interval); + + if (qcsapi_retval >= 0) { + print_out(print, "%d\n", tpc_interval); + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } + + return statval; +} + +static int +call_qcsapi_wifi_set_scan_chk_inv(call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[]) +{ + int statval = 0; + int qcsapi_retval; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + + if (argc < 1) + { + print_err(print, "call_qcsapi set_scan_chk_inv wifi0 \n", argc); + statval = 1; + } else { + int temp = atoi(argv[0]); + + if (temp <= 0 || temp > (24 * 60 * 60)) { + print_err(print, "value should be limited from 1 second to 24 hours\n"); + qcsapi_retval = -EINVAL; + } else { + qcsapi_retval = qcsapi_wifi_set_scan_chk_inv(the_interface, temp); + } + + if (qcsapi_retval >= 0) { + print_out(print, "complete\n"); + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } + } + + return statval; +} + +static int +call_qcsapi_wifi_get_scan_chk_inv(call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[]) +{ + int statval = 0; + int scan_chk_inv, *p = NULL; + int qcsapi_retval; + const char *the_interface = p_calling_bundle->caller_interface; + + if (argc < 1 || strcmp(argv[0], "NULL") != 0) + p = &scan_chk_inv; + + qcsapi_output *print = p_calling_bundle->caller_output; + + qcsapi_retval = qcsapi_wifi_get_scan_chk_inv(the_interface, p); + + if (qcsapi_retval >= 0) { + print_out(print, "%d\n", scan_chk_inv); + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } + + return statval; +} + + +static void +local_display_assoc_records(qcsapi_output *print, const struct qcsapi_assoc_records *p_assoc_records) +{ + int iter; + + for (iter = 0; iter < QCSAPI_ASSOC_MAX_RECORDS; iter++) { + if (p_assoc_records->timestamp[iter] <= 0) { + return; + } + + char mac_addr_string[ 24 ]; + + snprintf( &mac_addr_string[ 0 ], sizeof(mac_addr_string), MACFILTERINGMACFMT, + p_assoc_records->addr[iter][0], + p_assoc_records->addr[iter][1], + p_assoc_records->addr[iter][2], + p_assoc_records->addr[iter][3], + p_assoc_records->addr[iter][4], + p_assoc_records->addr[iter][5] + ); + + print_out(print, "%s: %d\n", &mac_addr_string[0], (int) p_assoc_records->timestamp[iter]); + } +} + +static int +call_qcsapi_wifi_get_assoc_records(call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[]) +{ + int statval = 0; + qcsapi_output *print = p_calling_bundle->caller_output; + int qcsapi_retval; + const char *the_interface = p_calling_bundle->caller_interface; + int reset_flag = 0; + struct qcsapi_assoc_records assoc_records; + struct qcsapi_assoc_records *p_assoc_records = &assoc_records; + + if (argc > 0) { + if (!isdigit(argv[0][0])) { + print_err(print, "get_assoc_records: reset flag must be a numeric value\n"); + return 1; + } + + reset_flag = atoi(argv[0]); + } + + if (argc > 1 && strcmp(argv[1], "NULL") == 0) { + p_assoc_records = NULL; + } + + qcsapi_retval = qcsapi_wifi_get_assoc_records(the_interface, reset_flag, p_assoc_records); + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + local_display_assoc_records(print, &assoc_records); + } + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } + + return statval; +} + +static int +call_qcsapi_wifi_get_list_DFS_channels( call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[] ) +{ + int statval = 0; + qcsapi_output *print = p_calling_bundle->caller_output; + + if (argc < 2) + { + print_err( print, "Not enough parameters in call qcsapi get list DFS channels\n" ); + print_err( print, "Usage: call_qcsapi get_list_DFS_channels <0 | 1> \n" ); + statval = 1; + } + else + { + int qcsapi_retval; + char *p_list_channels = NULL; + const char *regulatory_region = NULL; + int DFS_flag = 0; + qcsapi_unsigned_int the_bw = 0; +/* + * Prefer a non-reentrant program to allocating 1025 bytes on the stack. + */ + static string_1024 the_list_channels; + + if (strcmp( argv[ 0 ], "NULL" ) != 0) + regulatory_region = argv[ 0 ]; + + DFS_flag = atoi( argv[ 1 ] ); + + if (argc < 3) + { + qcsapi_retval = qcsapi_wifi_get_bw( "wifi0", &the_bw ); + if (qcsapi_retval < 0) + the_bw = 40; + } + else + the_bw = atoi( argv[ 2 ] ); + + if (argc < 4 || strcmp( argv[ 3 ], "NULL" ) != 0) + p_list_channels = &the_list_channels[ 0 ]; + + qcsapi_retval = qcsapi_regulatory_get_list_DFS_channels( regulatory_region, DFS_flag, the_bw, p_list_channels ); + + if (qcsapi_retval == -qcsapi_region_database_not_found) { + qcsapi_retval = qcsapi_wifi_get_list_DFS_channels( regulatory_region, DFS_flag, the_bw, p_list_channels ); + } + + if (qcsapi_retval >= 0) + { + if (verbose_flag >= 0) + { + print_out( print, "%s\n", the_list_channels ); + } + } + else + { + report_qcsapi_error( p_calling_bundle, qcsapi_retval ); + statval = 1; + } + } + + return( statval ); +} + +static int +call_qcsapi_wifi_is_channel_DFS( call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[] ) +{ + int statval = 0; + qcsapi_output *print = p_calling_bundle->caller_output; + + if (argc < 2) + { + print_err( print, "Not enough parameters in call qcsapi is channel DFS\n" ); + print_err( print, "Usage: call_qcsapi is_channel_DFS \n" ); + statval = 1; + } + else + { + int qcsapi_retval; + const char *regulatory_region = NULL; + int DFS_flag = 0; + int *p_DFS_flag = NULL; + qcsapi_unsigned_int the_channel = (qcsapi_unsigned_int) atoi( argv[ 1 ] ); + + if (strcmp( argv[ 0 ], "NULL" ) != 0) + regulatory_region = argv[ 0 ]; + + if (argc < 3 || strcmp( argv[ 2 ], "NULL" ) != 0) + p_DFS_flag = &DFS_flag; + + qcsapi_retval = qcsapi_regulatory_is_channel_DFS( regulatory_region, the_channel, p_DFS_flag ); + + if (qcsapi_retval == -qcsapi_region_database_not_found) { + + qcsapi_retval = qcsapi_wifi_is_channel_DFS( regulatory_region, the_channel, p_DFS_flag ); + } + + if (qcsapi_retval >= 0) + { + if (verbose_flag >= 0) + { + print_out( print, "%d\n", DFS_flag ); + } + } + else + { + report_qcsapi_error( p_calling_bundle, qcsapi_retval ); + statval = 1; + } + } + + return( statval ); +} + +static int +call_qcsapi_wifi_get_DFS_alt_channel( call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[] ) +{ + int statval = 0; + qcsapi_unsigned_int channel_value, *p_channel_value = NULL; + int qcsapi_retval; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + + if (argc < 1 || strcmp( argv[ 0 ], "NULL" ) != 0) + p_channel_value = &channel_value; + qcsapi_retval = qcsapi_wifi_get_DFS_alt_channel( the_interface, p_channel_value ); + if (qcsapi_retval >= 0) + { + if (verbose_flag >= 0) + { + print_out( print, "%d\n", channel_value ); + } + } + else + { + report_qcsapi_error( p_calling_bundle, qcsapi_retval ); + statval = 1; + } + + return( statval ); +} + +static int +call_qcsapi_wifi_set_DFS_alt_channel( call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[] ) +{ + int statval = 0; + qcsapi_output *print = p_calling_bundle->caller_output; + + if (argc < 1) + { + print_err( print, "Not enough parameters in call qcsapi WiFi set DFS alt channel, count is %d\n", argc ); + statval = 1; + } + else + { + qcsapi_unsigned_int dfs_alt_chan = atoi( argv[ 0 ] ); + int qcsapi_retval; + const char *the_interface = p_calling_bundle->caller_interface; + + qcsapi_retval = qcsapi_wifi_set_DFS_alt_channel( the_interface, dfs_alt_chan ); + if (qcsapi_retval >= 0) + { + if (verbose_flag >= 0) + { + print_out( print, "complete\n" ); + } + } + else + { + report_qcsapi_error( p_calling_bundle, qcsapi_retval ); + statval = 1; + } + } + + return( statval ); +} + +static int +call_qcsapi_wifi_set_dfs_reentry( call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[] ) +{ + int statval = 0; + int qcsapi_retval; + qcsapi_output *print = p_calling_bundle->caller_output; + const char *the_interface = p_calling_bundle->caller_interface; + + qcsapi_retval = qcsapi_wifi_start_dfs_reentry(the_interface); + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out( print, "complete\n"); + } + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } + + return( statval ); +} + +static int +call_qcsapi_wifi_get_scs_cce_channels( call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[] ) +{ + int statval = 0; + int qcsapi_retval; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + qcsapi_unsigned_int prev_chan = 0; + qcsapi_unsigned_int cur_chan = 0; + qcsapi_unsigned_int *p_prev_chan = &prev_chan; + qcsapi_unsigned_int *p_cur_chan = &cur_chan; + + if (argc >= 2) { + if (strcmp(argv[1], "NULL") == 0) { + p_cur_chan = NULL; + } + } + + if (argc >= 1) { + if (strcmp(argv[0], "NULL") == 0) { + p_prev_chan = NULL; + } + } + + qcsapi_retval = qcsapi_wifi_get_scs_cce_channels(the_interface, p_prev_chan, p_cur_chan); + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out( print, "%d %d\n", (int) prev_chan, (int) cur_chan); + } + } else { + report_qcsapi_error( p_calling_bundle, qcsapi_retval ); + statval = 1; + } + + return statval; +} + +static int +call_qcsapi_wifi_get_dfs_cce_channels( call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[] ) +{ + int statval = 0; + int qcsapi_retval; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + qcsapi_unsigned_int prev_chan = 0; + qcsapi_unsigned_int cur_chan = 0; + qcsapi_unsigned_int *p_prev_chan = &prev_chan; + qcsapi_unsigned_int *p_cur_chan = &cur_chan; + + if (argc >= 2) { + if (strcmp(argv[1], "NULL") == 0) { + p_cur_chan = NULL; + } + } + + if (argc >= 1) { + if (strcmp(argv[0], "NULL") == 0) { + p_prev_chan = NULL; + } + } + + qcsapi_retval = qcsapi_wifi_get_dfs_cce_channels(the_interface, p_prev_chan, p_cur_chan); + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out( print, "%d %d\n", (int) prev_chan, (int) cur_chan); + } + } else { + report_qcsapi_error( p_calling_bundle, qcsapi_retval ); + statval = 1; + } + + return statval; +} + +static int +call_qcsapi_wifi_get_csw_records( call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[] ) +{ + int statval = 0; + int qcsapi_retval; + int reset=0; + int i; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + qcsapi_csw_record records; + + if (argc >= 1) { + if (strcmp(argv[0], "1") == 0) { + reset = 1; + } + } + + qcsapi_retval = qcsapi_wifi_get_csw_records(the_interface, reset, &records); + + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out(print, "channel switch history record count : %d\n", records.cnt); + int index = records.index; + int indextmp = 0; + for (i = 0; i < records.cnt; i++){ + indextmp = (index + QCSAPI_CSW_MAX_RECORDS - i) % QCSAPI_CSW_MAX_RECORDS; + print_out(print, "time=%u channel=%u reason=%s\n", + records.timestamp[indextmp], + records.channel[indextmp], + csw_reason_to_string(records.reason[indextmp])); + } + + if (reset) { + print_out(print, "clear records complete\n"); + } + } + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval ); + statval = 1; + } + return statval; +} + +static int +call_qcsapi_wifi_get_radar_status( call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[] ) +{ + int statval = 0; + int qcsapi_retval = 0; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + qcsapi_radar_status rdstatus; + + if (argc < 1) { + print_err(print, "Not enough parameters\n"); + statval = 1; + } else { + memset(&rdstatus, 0, sizeof(rdstatus)); + rdstatus.channel = atoi(argv[0]); + qcsapi_retval = qcsapi_wifi_get_radar_status(the_interface, &rdstatus); + + if(qcsapi_retval >= 0) { + print_out(print, "channel %d:\nradar_status=%d\nradar_count=%d\n", rdstatus.channel, rdstatus.flags, rdstatus.ic_radardetected); + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } + } + + return statval; +} + +static int +call_qcsapi_wifi_get_WEP_encryption_level( call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[] ) +{ + int statval = 0; + string_64 WEP_encryption_level; + int qcsapi_retval; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + + if (argc > 0 && strcmp( argv[ 0 ], "NULL" ) == 0) + qcsapi_retval = qcsapi_wifi_get_WEP_encryption_level( the_interface, NULL ); + else + qcsapi_retval = qcsapi_wifi_get_WEP_encryption_level( the_interface, WEP_encryption_level ); + + if (qcsapi_retval >= 0) + { + if (verbose_flag >= 0) + { + print_out( print, "%s\n", WEP_encryption_level ); + } + } + else + { + report_qcsapi_error( p_calling_bundle, qcsapi_retval ); + statval = 1; + } + + return( statval ); +} + +static int +call_qcsapi_wifi_get_WPA_encryption_modes( call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[] ) +{ + int statval = 0; + char encryption_modes[ 36 ], *p_encryption_modes = NULL; + int qcsapi_retval; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + + if (argc < 1 || strcmp( argv[ 0 ], "NULL" ) != 0) + p_encryption_modes = &encryption_modes[ 0 ]; + qcsapi_retval = qcsapi_wifi_get_WPA_encryption_modes( the_interface, p_encryption_modes ); + + if (qcsapi_retval >= 0) + { + if (verbose_flag >= 0) + { + print_out( print, "%s\n", &encryption_modes[ 0 ] ); + } + } + else + { + report_qcsapi_error( p_calling_bundle, qcsapi_retval ); + statval = 1; + } + + return( statval ); +} + +static int +call_qcsapi_wifi_set_WPA_encryption_modes( call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[] ) +{ + int statval = 0; + qcsapi_output *print = p_calling_bundle->caller_output; + + if (argc < 1) + { + print_err( print, "Not enough parameters in call qcsapi WiFi set encryption mode, count is %d\n", argc ); + statval = 1; + } + else + { + int qcsapi_retval; + const char *the_interface = p_calling_bundle->caller_interface; + char *p_encryption_modes = argv[ 0 ]; + + /* Encryption modes will not be NULL ... */ + + if (strcmp( argv[ 0 ], "NULL" ) == 0) + p_encryption_modes = NULL; + qcsapi_retval = qcsapi_wifi_set_WPA_encryption_modes( the_interface, p_encryption_modes ); + + if (qcsapi_retval >= 0) + { + if (verbose_flag >= 0) + { + print_out( print, "complete\n" ); + } + } + else + { + report_qcsapi_error( p_calling_bundle, qcsapi_retval ); + statval = 1; + } + } + + return( statval ); +} + +static int +call_qcsapi_wifi_get_WPA_authentication_mode( call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[] ) +{ + int statval = 0; + char authentication_mode[ 36 ], *p_authentication_mode = NULL; + int qcsapi_retval; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + + if (argc < 1 || strcmp( argv[ 0 ], "NULL" ) != 0) + p_authentication_mode = &authentication_mode[ 0 ]; + qcsapi_retval = qcsapi_wifi_get_WPA_authentication_mode( the_interface, p_authentication_mode ); + + if (qcsapi_retval >= 0) + { + if (verbose_flag >= 0) + { + print_out( print, "%s\n", &authentication_mode[ 0 ] ); + } + } + else + { + report_qcsapi_error( p_calling_bundle, qcsapi_retval ); + statval = 1; + } + + return( statval ); +} + +static int +call_qcsapi_wifi_set_WPA_authentication_mode( call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[] ) +{ + int statval = 0; + qcsapi_output *print = p_calling_bundle->caller_output; + + if (argc < 1) + { + print_err( print, "Not enough parameters in call qcsapi WiFi set authentication mode, count is %d\n", argc ); + statval = 1; + } + else + { + int qcsapi_retval; + const char *the_interface = p_calling_bundle->caller_interface; + char *p_authentication_mode = argv[ 0 ]; + + /* Authentication mode will not be NULL ... */ + + if (strcmp( argv[ 0 ], "NULL" ) == 0) + p_authentication_mode = NULL; + qcsapi_retval = qcsapi_wifi_set_WPA_authentication_mode( the_interface, p_authentication_mode ); + + if (qcsapi_retval >= 0) + { + if (verbose_flag >= 0) + { + print_out( print, "complete\n" ); + } + } + else + { + report_qcsapi_error( p_calling_bundle, qcsapi_retval ); + statval = 1; + } + } + + return( statval ); +} + +static int +call_qcsapi_wifi_get_interworking( call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[] ) +{ + int statval = 0; + char interworking[2],*p_interworking = NULL; + int qcsapi_retval; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + + if (argc < 1 || strcmp( argv[ 0 ], "NULL" ) != 0) + p_interworking = &interworking[0]; + + qcsapi_retval = qcsapi_wifi_get_interworking( the_interface, p_interworking ); + + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out( print, "%s\n", &interworking ); + } + } else { + report_qcsapi_error( p_calling_bundle, qcsapi_retval ); + statval = 1; + } + + return( statval ); +} + +static int +call_qcsapi_wifi_set_interworking( call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[] ) +{ + int statval = 0; + qcsapi_output *print = p_calling_bundle->caller_output; + + if (argc < 1) { + print_err( print, "Not enough parameters in call qcsapi WiFi set interworking, count is %d\n", argc ); + statval = 1; + } else { + int qcsapi_retval; + const char *the_interface = p_calling_bundle->caller_interface; + char *p_interworking = argv[ 0 ]; + + if (strcmp( argv[ 0 ], "NULL" ) == 0) + p_interworking = NULL; + + qcsapi_retval = qcsapi_wifi_set_interworking( the_interface, p_interworking ); + + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out( print, "complete\n" ); + } + } else { + report_qcsapi_error( p_calling_bundle, qcsapi_retval ); + statval = 1; + } + } + + return( statval ); +} + +static int +is_80211u_param( char *lookup_name ) +{ + int retval = 1; + unsigned int iter; + + for (iter = 0; qcsapi_80211u_params[iter] != NULL; iter++) { + if (strcmp(qcsapi_80211u_params[iter], lookup_name) == 0) { + retval = 0; + break; + } + } + + return retval; +} + +static int +call_qcsapi_wifi_get_80211u_params( call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[] ) +{ + int statval = 0; + string_256 value; + char *p_buffer = NULL; + int qcsapi_retval; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + + if (argc < 1) { + print_out( print, "Usage : call_qcsapi get_80211u_params " + " <80211u_param>"); + return 1; + } + + if (is_80211u_param( argv[0] )) { + print_out( print, "\n %s is not 80211u parameter",argv[0] ); + return 1; + } + + if (strcmp( argv[ 0 ], "NULL" ) != 0) + p_buffer = &value[ 0 ]; + + qcsapi_retval = qcsapi_wifi_get_80211u_params( the_interface, argv[0], p_buffer ); + + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out( print, "%s\n", value ); + } + } else { + report_qcsapi_error( p_calling_bundle, qcsapi_retval ); + statval = 1; + } + + return( statval ); +} + +static int +call_qcsapi_wifi_set_80211u_params( call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[] ) +{ + int statval = 0; + + qcsapi_output *print = p_calling_bundle->caller_output; + + if (argc < 2) { + print_err( print, "Not enough parameters in call qcsapi WiFi " + "set_80211u_params, count is %d\n", argc ); + print_err(print, "Usage: call_qcsapi set_80211u_params " + " \n"); + statval = 1; + } else { + int qcsapi_retval; + const char *the_interface = p_calling_bundle->caller_interface; + char *p_11u_param = argv[ 0 ]; + + if (strcmp( argv[ 0 ], "NULL" ) == 0) + p_11u_param = NULL; + + if (is_80211u_param( argv[0] )) { + print_err( print, "%s is not a valid 802.11u parameter\n",argv[0]); + statval = 1; + } else { + if (!strcmp(argv[0], "ipaddr_type_availability")) { + if (argc < 3) { + print_err( print, "%s expects 2 arguments\n", argv[0]); + return 1; + } + } + + qcsapi_retval = qcsapi_wifi_set_80211u_params( the_interface, p_11u_param, + argv[1], argv[2] ); + + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out( print, "complete\n" ); + } + } else { + report_qcsapi_error( p_calling_bundle, qcsapi_retval ); + statval = 1; + } + } + } + + return( statval ); +} + +static int +call_qcsapi_security_get_nai_realms( call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[] ) +{ + int statval = 0; + string_4096 nai_value; + char *p_buffer = &nai_value[0]; + int qcsapi_retval; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + + qcsapi_retval = qcsapi_security_get_nai_realms( the_interface, p_buffer ); + + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out( print, "%s\n", p_buffer ); + } + } else { + report_qcsapi_error( p_calling_bundle, qcsapi_retval ); + statval = 1; + } + + return( statval ); +} + +static int +call_qcsapi_security_add_nai_realm( call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[] ) +{ + int statval = 0; + + qcsapi_output *print = p_calling_bundle->caller_output; + + if (argc < 3) { + print_err( print, "Not enough parameters in call qcsapi WiFi add_nai_realm," + "count is %d\n", argc ); + statval = 1; + } else { + int qcsapi_retval = 0; + const char *the_interface = p_calling_bundle->caller_interface; + int encoding; + char *p_nai_realm = argv[1]; + char *p_eap_method = argv[2]; + + if (*argv[0] < '0' || *argv[0] > '1' || strlen(argv[0]) > 1) { + print_err( print, "invalid encoding\n"); + return ( statval ); + } + + encoding = atoi(argv[0]); + + if (strcmp( argv[ 1 ], "NULL" ) == 0) + p_nai_realm = NULL; + + if (strcmp( argv[ 2 ], "NULL" ) == 0) + p_eap_method = NULL; + + qcsapi_retval = qcsapi_security_add_nai_realm( the_interface, + encoding, + p_nai_realm, + p_eap_method ); + + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out( print, "complete\n" ); + } + } else { + report_qcsapi_error( p_calling_bundle, qcsapi_retval ); + statval = 1; + } + } + + return( statval ); +} + +static int +call_qcsapi_security_del_nai_realm( call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[] ) +{ + int statval = 0; + + qcsapi_output *print = p_calling_bundle->caller_output; + + if (argc < 1) { + print_err( print, "Not enough parameters in call qcsapi WiFi del_nai_realm," + "count is %d\n", argc ); + statval = 1; + } else { + int qcsapi_retval; + const char *the_interface = p_calling_bundle->caller_interface; + char *p_nai_realm = argv[0]; + + if (strcmp( argv[ 0 ], "NULL" ) == 0) + p_nai_realm = NULL; + + qcsapi_retval = qcsapi_security_del_nai_realm( the_interface, p_nai_realm ); + + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out( print, "complete\n" ); + } + } else { + report_qcsapi_error( p_calling_bundle, qcsapi_retval ); + statval = 1; + } + } + + return( statval ); +} + +static int +call_qcsapi_security_get_roaming_consortium( call_qcsapi_bundle *p_calling_bundle, + int argc, char *argv[] ) +{ + int statval = 0; + string_1024 roaming_value; + char *p_buffer = &roaming_value[ 0 ]; + int qcsapi_retval; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + + qcsapi_retval = qcsapi_security_get_roaming_consortium( the_interface, p_buffer ); + + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out( print, "%s\n", p_buffer ); + } + } else { + report_qcsapi_error( p_calling_bundle, qcsapi_retval ); + statval = 1; + } + + return( statval ); +} + +static int +call_qcsapi_security_add_roaming_consortium( call_qcsapi_bundle *p_calling_bundle, + int argc, char *argv[] ) +{ + int statval = 0; + + qcsapi_output *print = p_calling_bundle->caller_output; + + if (argc < 1) { + print_err( print, "Not enough parameters in call qcsapi WiFi " + "add_roaming_consortium count is %d\n", argc ); + statval = 1; + } else { + int qcsapi_retval; + const char *the_interface = p_calling_bundle->caller_interface; + char *p_value = argv[0]; + + if (strcmp( argv[ 0 ], "NULL" ) == 0) + p_value = NULL; + + qcsapi_retval = qcsapi_security_add_roaming_consortium( the_interface, p_value ); + + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out( print, "complete\n" ); + } + } else { + report_qcsapi_error( p_calling_bundle, qcsapi_retval ); + statval = 1; + } + } + + return( statval ); +} + + +static int +call_qcsapi_security_del_roaming_consortium( call_qcsapi_bundle *p_calling_bundle, + int argc, char *argv[] ) +{ + int statval = 0; + + qcsapi_output *print = p_calling_bundle->caller_output; + + if (argc < 1) { + print_err( print, "Not enough parameters in call qcsapi WiFi " + "del_roaming_consortium count is %d\n", argc ); + statval = 1; + } else { + int qcsapi_retval; + const char *the_interface = p_calling_bundle->caller_interface; + char *p_value = argv[0]; + + if (strcmp( argv[ 0 ], "NULL" ) == 0) + p_value = NULL; + + qcsapi_retval = qcsapi_security_del_roaming_consortium( the_interface, p_value ); + + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out( print, "complete\n" ); + } + } else { + report_qcsapi_error( p_calling_bundle, qcsapi_retval ); + statval = 1; + } + } + + return( statval ); +} + +static int +call_qcsapi_security_get_venue_name( call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[] ) +{ + int statval = 0; + string_4096 venue_name; + char *p_venue_name = &venue_name[0]; + int qcsapi_retval; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + + qcsapi_retval = qcsapi_security_get_venue_name( the_interface, p_venue_name ); + + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out( print, "%s\n",venue_name); + } + } else { + report_qcsapi_error( p_calling_bundle, qcsapi_retval ); + statval = 1; + } + + return( statval ); +} + +static int +call_qcsapi_security_add_venue_name( call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[] ) +{ + int statval = 0; + qcsapi_output *print = p_calling_bundle->caller_output; + + if (argc < 2) { + print_err( print, "Not enough parameters in call qcsapi WiFi " + "add_venue_name, count is %d\n", argc); + statval = 1; + } else { + int qcsapi_retval; + const char *the_interface = p_calling_bundle->caller_interface; + char *p_lang_code = argv[0]; + char *p_venue_name = argv[1]; + + if (strcmp( argv[0], "NULL" ) == 0) + p_lang_code = NULL; + + if (strcmp( argv[1], "NULL" ) == 0) + p_venue_name = NULL; + + qcsapi_retval = qcsapi_security_add_venue_name( the_interface, p_lang_code, p_venue_name ); + + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out( print, "complete\n" ); + } + } else { + report_qcsapi_error( p_calling_bundle, qcsapi_retval ); + statval = 1; + } + } + + return( statval ); +} + +static int +call_qcsapi_security_del_venue_name( call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[] ) +{ + int statval = 0; + qcsapi_output *print = p_calling_bundle->caller_output; + + if (argc < 2) { + print_err( print, "Not enough parameters in call qcsapi WiFi " + "del_venue_name, count is %d\n", argc); + statval = 1; + } else { + int qcsapi_retval; + const char *the_interface = p_calling_bundle->caller_interface; + char *p_lang_code = argv[0]; + char *p_venue_name = argv[1]; + + if (strcmp( argv[0], "NULL" ) == 0) + p_lang_code = NULL; + + if (strcmp( argv[1], "NULL" ) == 0) + p_venue_name = NULL; + + qcsapi_retval = qcsapi_security_del_venue_name( the_interface, p_lang_code, p_venue_name ); + + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out( print, "complete\n" ); + } + } else { + report_qcsapi_error( p_calling_bundle, qcsapi_retval ); + statval = 1; + } + } + + return( statval ); +} + +static int +call_qcsapi_security_get_oper_friendly_name( call_qcsapi_bundle *p_calling_bundle, + int argc, char *argv[] ) +{ + int statval = 0; + string_4096 value; + char *p_value = &value[0]; + int qcsapi_retval; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + + qcsapi_retval = qcsapi_security_get_oper_friendly_name( the_interface, p_value ); + + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out( print, "%s\n", value); + } + } else { + report_qcsapi_error( p_calling_bundle, qcsapi_retval ); + statval = 1; + } + + return( statval ); +} + +static int +call_qcsapi_security_add_oper_friendly_name( call_qcsapi_bundle *p_calling_bundle, + int argc, char *argv[] ) +{ + int statval = 0; + + qcsapi_output *print = p_calling_bundle->caller_output; + + if (argc < 2) { + print_err( print, "Not enough parameters in call qcsapi WiFi " + "add_oper_friendly_name count is %d\n", argc); + statval = 1; + } else { + int qcsapi_retval; + const char *the_interface = p_calling_bundle->caller_interface; + char *p_lang_code = argv[0]; + char *p_oper_friendly_name = argv[1]; + + if (strcmp( argv[0], "NULL" ) == 0) + p_lang_code = NULL; + + if (strcmp( argv[1], "NULL" ) == 0) + p_oper_friendly_name = NULL; + + qcsapi_retval = qcsapi_security_add_oper_friendly_name( the_interface, + p_lang_code, + p_oper_friendly_name ); + + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out( print, "complete\n" ); + } + } else { + report_qcsapi_error( p_calling_bundle, qcsapi_retval ); + statval = 1; + } + } + + return( statval ); +} + +static int +call_qcsapi_security_del_oper_friendly_name( call_qcsapi_bundle *p_calling_bundle, + int argc, char *argv[] ) +{ + int statval = 0; + + qcsapi_output *print = p_calling_bundle->caller_output; + + if (argc < 2) { + print_err( print, "Not enough parameters in call qcsapi WiFi " + "del_oper_friendly_name count is %d\n", argc); + statval = 1; + } else { + int qcsapi_retval; + const char *the_interface = p_calling_bundle->caller_interface; + char *p_lang_code = argv[0]; + char *p_oper_friendly_name = argv[1]; + + if (strcmp( argv[0], "NULL" ) == 0) + p_lang_code = NULL; + + if (strcmp( argv[1], "NULL" ) == 0) + p_oper_friendly_name = NULL; + + qcsapi_retval = qcsapi_security_del_oper_friendly_name( the_interface, + p_lang_code, + p_oper_friendly_name ); + + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out( print, "complete\n" ); + } + } else { + report_qcsapi_error( p_calling_bundle, qcsapi_retval ); + statval = 1; + } + } + + return( statval ); +} + + +static int +call_qcsapi_security_get_hs20_conn_capab( call_qcsapi_bundle *p_calling_bundle, + int argc, char *argv[] ) +{ + int statval = 0; + string_4096 value; + char *p_value = &value[0]; + int qcsapi_retval; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + + qcsapi_retval = qcsapi_security_get_hs20_conn_capab( the_interface, p_value ); + + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out( print, "%s\n", value); + } + } else { + report_qcsapi_error( p_calling_bundle, qcsapi_retval ); + statval = 1; + } + + return( statval ); +} + +static int +call_qcsapi_security_add_hs20_conn_capab( call_qcsapi_bundle *p_calling_bundle, + int argc, char *argv[] ) +{ + int statval = 0; + qcsapi_output *print = p_calling_bundle->caller_output; + + if (argc < 3) { + print_err( print, "Not enough parameters in call qcsapi WiFi " + "add_hs20_conn_capab count is %d\n", argc); + statval = 1; + } else { + int qcsapi_retval; + const char *the_interface = p_calling_bundle->caller_interface; + char *p_ip_proto = argv[0]; + char *p_port_num = argv[1]; + char *p_status = argv[2]; + + if (strcmp( argv[0], "NULL" ) == 0) + p_ip_proto = NULL; + + if (strcmp( argv[1], "NULL" ) == 0) + p_port_num = NULL; + + if (strcmp( argv[2], "NULL" ) == 0) + p_status = NULL; + + qcsapi_retval = qcsapi_security_add_hs20_conn_capab( the_interface, + p_ip_proto, + p_port_num, + p_status ); + + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out( print, "complete\n" ); + } + } else { + report_qcsapi_error( p_calling_bundle, qcsapi_retval ); + statval = 1; + } + } + + return( statval ); +} + +static int +call_qcsapi_security_del_hs20_conn_capab( call_qcsapi_bundle *p_calling_bundle, + int argc, char *argv[] ) +{ + int statval = 0; + qcsapi_output *print = p_calling_bundle->caller_output; + + if (argc < 3) { + print_err( print, "Not enough parameters in call qcsapi WiFi " + "del_hs20_conn_capab count is %d\n", argc); + statval = 1; + } else { + int qcsapi_retval; + const char *the_interface = p_calling_bundle->caller_interface; + char *p_ip_proto = argv[0]; + char *p_port_num = argv[1]; + char *p_status = argv[2]; + + if (strcmp( argv[0], "NULL" ) == 0) + p_ip_proto = NULL; + + if (strcmp( argv[1], "NULL" ) == 0) + p_port_num = NULL; + + if (strcmp( argv[2], "NULL" ) == 0) + p_status = NULL; + + qcsapi_retval = qcsapi_security_del_hs20_conn_capab( the_interface, + p_ip_proto, + p_port_num, + p_status ); + + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out( print, "complete\n" ); + } + } else { + report_qcsapi_error( p_calling_bundle, qcsapi_retval ); + statval = 1; + } + } + + return ( statval ); +} + +static int +call_qcsapi_wifi_get_hs20_status( call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[] ) +{ + int statval = 0; + char hs20[2]; + char *p_hs20 = NULL; + int qcsapi_retval; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + + if (argc < 1 || strcmp( argv[ 0 ], "NULL" ) != 0) + p_hs20 = &hs20[0]; + qcsapi_retval = qcsapi_wifi_get_hs20_status( the_interface, p_hs20 ); + + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out( print, "%s\n", p_hs20 ); + } + } else { + report_qcsapi_error( p_calling_bundle, qcsapi_retval ); + statval = 1; + } + + return( statval ); +} + +static int +call_qcsapi_wifi_set_hs20_status( call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[] ) +{ + int statval = 0; + qcsapi_output *print = p_calling_bundle->caller_output; + + if (argc < 1) { + print_err( print, "Not enough parameters in call qcsapi WiFi set hotspot, count is %d\n", argc ); + statval = 1; + } else { + int qcsapi_retval; + const char *the_interface = p_calling_bundle->caller_interface; + char *p_hs20 = argv[ 0 ]; + + if (strcmp( argv[ 0 ], "NULL" ) == 0) + p_hs20 = NULL; + + qcsapi_retval = qcsapi_wifi_set_hs20_status( the_interface, p_hs20 ); + + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out( print, "complete\n" ); + } + } else { + report_qcsapi_error( p_calling_bundle, qcsapi_retval ); + statval = 1; + } + } + + return( statval ); +} + +static int +call_qcsapi_wifi_set_proxy_arp( call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[] ) +{ + int statval = 0; + qcsapi_output *print = p_calling_bundle->caller_output; + + if (argc < 1) { + print_err(print, "Not enough parameters in qcsapi set_proxy_arp, count is %d\n", argc); + statval = 1; + } else { + int qcsapi_retval; + const char *the_interface = p_calling_bundle->caller_interface; + char *proxy_arp = argv[ 0 ]; + + if (atoi(argv[0]) != 0 && atoi(argv[0]) != 1) { + print_err( print, "Invalid input for set_proxy_arp use 0 or 1\n"); + return 1; + } + + qcsapi_retval = qcsapi_wifi_set_proxy_arp( the_interface, proxy_arp ); + + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out( print, "complete\n" ); + } + } else { + report_qcsapi_error( p_calling_bundle, qcsapi_retval ); + statval = 1; + } + } + + return( statval ); +} + +static int +call_qcsapi_wifi_get_proxy_arp( call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[] ) +{ + int statval = 0; + char proxy_arp[2]; + char *p_proxy_arp = NULL; + int qcsapi_retval; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + + if (argc > 0) { + qcsapi_retval = -EFAULT; + } else { + p_proxy_arp = &proxy_arp[0]; + + qcsapi_retval = qcsapi_wifi_get_proxy_arp( the_interface, p_proxy_arp ); + } + + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out( print, "%s\n", p_proxy_arp ); + } + } else { + report_qcsapi_error( p_calling_bundle, qcsapi_retval ); + statval = 1; + } + + return( statval ); +} + +static int +call_qcsapi_wifi_get_l2_ext_filter( call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[] ) +{ + int statval = 0; + int qcsapi_retval; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + string_32 value; + + if (argc < 1) { + print_err(print, "Not enough parameters in qcsapi get_l2_ext_filter, count is %d\n", argc); + statval = 1; + } else { + char *p_value = value; + char *p_param = argv[0]; + + if (strcmp(p_param, "NULL") == 0) + p_param = NULL; + + qcsapi_retval = qcsapi_wifi_get_l2_ext_filter( the_interface, p_param, p_value ); + + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out( print, "%s\n", p_value ); + } + } else { + report_qcsapi_error( p_calling_bundle, qcsapi_retval ); + statval = 1; + } + } + + return( statval ); +} + + +static int +call_qcsapi_wifi_set_l2_ext_filter( call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[] ) +{ + int statval = 0; + qcsapi_output *print = p_calling_bundle->caller_output; + + if (argc < 2) { + print_err(print, "Not enough parameters in qcsapi set_l2_ext_filter, count is %d\n", argc); + statval = 1; + } else { + int qcsapi_retval; + const char *the_interface = p_calling_bundle->caller_interface; + char *p_param = argv[0]; + char *p_value = argv[1]; + + if (strcmp( argv[ 0 ], "NULL" ) == 0) + p_param = NULL; + + if (strcmp( argv[ 1 ], "NULL" ) == 0) + p_value = NULL; + + qcsapi_retval = qcsapi_wifi_set_l2_ext_filter( the_interface, p_param, p_value ); + + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out( print, "complete\n" ); + } + } else { + report_qcsapi_error( p_calling_bundle, qcsapi_retval ); + statval = 1; + } + } + + return( statval ); +} + +static int +check_hs20_param( char *lookup_name ) +{ + int retval = 1; + unsigned int iter; + + int hs20_param_count = TABLE_SIZE( qcsapi_hs20_params ); + + for (iter = 0; iter < hs20_param_count; iter++) { + if (strcmp(qcsapi_hs20_params[iter], lookup_name) == 0) { + retval = 0; + break; + } + } + return retval; +} + + +static int +call_qcsapi_wifi_get_hs20_params( call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[] ) +{ + int statval = 0; + string_64 value; + char *p_value = NULL; + int qcsapi_retval; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + + if (argc != 1) { + print_out(print, "\n call_qcsapi get_hs20_params " + " \n"); + return 1; + } + + p_value = &value[ 0 ]; + + if (check_hs20_param( argv[0] )) { + print_out( print, "\n %s is not hs20 parameter\n", argv[0]); + return 1; + } + + qcsapi_retval = qcsapi_wifi_get_hs20_params( the_interface, argv[0], p_value ); + + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out( print, "%s\n", p_value ); + } + } else { + report_qcsapi_error( p_calling_bundle, qcsapi_retval ); + statval = 1; + } + + return( statval ); +} + +static int +call_qcsapi_wifi_set_hs20_params( call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[] ) +{ + int statval = 0; + qcsapi_output *print = p_calling_bundle->caller_output; + + if (argc < 2) { + print_err( print, "Not enough parameters in call qcsapi WiFi set_hs20_params, count is %d\n", argc ); + statval = 1; + } else { + int qcsapi_retval; + const char *the_interface = p_calling_bundle->caller_interface; + + if (check_hs20_param( argv[0] )) { + print_out( print, "\n %s is not hs20 parameter\n", argv[0]); + return 1; + } + + if (!strcmp(argv[0], "hs20_wan_metrics")) { + if (argc != 7) { + print_out(print, "\n call_qcsapi set_hs20_params " + " hs20_wan_metrics " + " " + " \n"); + return 1; + } + } + + if (!strcmp(argv[0], "disable_dgaf")) { + if (argc != 2) { + print_out(print, "\n call_qcsapi set_hs20_params " + " disable_dgaf <0:disable 1:enable>\n"); + return 1; + } + } + + qcsapi_retval = qcsapi_wifi_set_hs20_params( the_interface, argv[0], + argv[1], argv[2], argv[3], argv[4], argv[5], argv[6] ); + + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out( print, "complete\n" ); + } + } else { + report_qcsapi_error( p_calling_bundle, qcsapi_retval ); + statval = 1; + } + } + + return( statval ); +} + +static int +call_qcsapi_remove_11u_param( call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[] ) +{ + int statval = 0; + int qcsapi_retval; + + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + + if (argc < 1) { + print_err(print, "Not enough parameters in call qcsapi remove 11u_param, count is %d\n", argc); + statval = 1; + } + + if (is_80211u_param( argv[0] )) { + print_out( print, "%s is not 80211u parameter\n",argv[0]); + statval = 1; + } else { + char *param = argv[0]; + + qcsapi_retval = qcsapi_remove_11u_param( the_interface, param ); + + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out(print, "complete\n"); + } + } else { + report_qcsapi_error( p_calling_bundle, qcsapi_retval ); + statval = 1; + } + } + + return ( statval ); +} + +static int +call_qcsapi_remove_hs20_param( call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[] ) +{ + int statval = 0; + int qcsapi_retval; + + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + + if (argc < 1) { + print_err(print, "Not enough parameters in call qcsapi remove hs20_param, count is %d\n", argc); + statval = 1; + } + + if (check_hs20_param( argv[0] )) { + print_out( print, "%s is not hs20 parameter\n",argv[0]); + statval = 1; + } else { + char *param = argv[0]; + + qcsapi_retval = qcsapi_remove_hs20_param( the_interface, param ); + + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out(print, "complete\n"); + } + } else { + report_qcsapi_error( p_calling_bundle, qcsapi_retval ); + statval = 1; + } + } + + return ( statval ); + +} + +static int +call_qcsapi_wifi_get_IEEE11i_encryption_modes( call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[] ) +{ + int statval = 0; + char encryption_modes[ 36 ], *p_encryption_modes = NULL; + int qcsapi_retval = 0; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + + if (argc < 1 || strcmp( argv[ 0 ], "NULL" ) != 0) + p_encryption_modes = &encryption_modes[ 0 ]; + + qcsapi_retval = qcsapi_wifi_get_IEEE11i_encryption_modes( the_interface, p_encryption_modes ); + + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out( print, "%s\n", &encryption_modes[ 0 ] ); + } + } else { + report_qcsapi_error( p_calling_bundle, qcsapi_retval ); + statval = 1; + } + + return( statval ); +} + +static int +call_qcsapi_wifi_set_IEEE11i_encryption_modes( call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[] ) +{ + int statval = 0; + int qcsapi_retval; + const char *the_interface = p_calling_bundle->caller_interface; + char *p_encryption_mode = argv[ 0 ]; + qcsapi_output *print = p_calling_bundle->caller_output; + + if (argc < 1) { + print_err( print, "Not enough parameters in call qcsapi WiFi set authentication mode, count is %d\n", argc ); + statval = 1; + } else { + if (strcmp( argv[ 0 ], "NULL" ) == 0) + p_encryption_mode = NULL; + + qcsapi_retval = qcsapi_wifi_set_IEEE11i_encryption_modes( the_interface, p_encryption_mode ); + + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out( print, "complete\n" ); + } + } else { + report_qcsapi_error( p_calling_bundle, qcsapi_retval ); + statval = 1; + } + } + + return( statval ); +} + +static int +call_qcsapi_wifi_get_IEEE11i_authentication_mode( call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[] ) +{ + int statval = 0; + char authentication_mode[ 36 ], *p_authentication_mode = NULL; + int qcsapi_retval = 0; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + + if (argc < 1 || strcmp( argv[ 0 ], "NULL" ) != 0) + p_authentication_mode = &authentication_mode[ 0 ]; + + qcsapi_retval = qcsapi_wifi_get_IEEE11i_authentication_mode( the_interface, p_authentication_mode ); + + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out( print, "%s\n", &authentication_mode[ 0 ] ); + } + } else { + report_qcsapi_error( p_calling_bundle, qcsapi_retval ); + statval = 1; + } + + return( statval ); +} + +static int +call_qcsapi_wifi_set_IEEE11i_authentication_mode( call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[] ) +{ + int statval = 0; + int qcsapi_retval; + const char *the_interface = p_calling_bundle->caller_interface; + char *p_authentication_mode = argv[ 0 ]; + qcsapi_output *print = p_calling_bundle->caller_output; + + if (argc < 1) { + print_err( print, "Not enough parameters in call qcsapi WiFi set authentication mode, count is %d\n", argc ); + statval = 1; + } else { + if (strcmp( argv[ 0 ], "NULL" ) == 0) + p_authentication_mode = NULL; + + qcsapi_retval = qcsapi_wifi_set_IEEE11i_authentication_mode( the_interface, p_authentication_mode ); + + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out( print, "complete\n" ); + } + } else { + report_qcsapi_error( p_calling_bundle, qcsapi_retval ); + statval = 1; + } + } + + return( statval ); +} + +static int +call_qcsapi_wifi_get_michael_errcnt( call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[] ) +{ + int statval = 0; + qcsapi_output *print = p_calling_bundle->caller_output; + int qcsapi_retval; + const char *the_interface = p_calling_bundle->caller_interface; + uint32_t errcnt; + + qcsapi_retval = qcsapi_wifi_get_michael_errcnt(the_interface, &errcnt); + + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) + print_out(print, "%u\n", errcnt); + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } + + return statval; +} + +static int +call_qcsapi_wifi_get_pre_shared_key( call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[] ) +{ + int statval = 0; + char pre_shared_key[ 68 ], *p_pre_shared_key = NULL; + int qcsapi_retval; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + qcsapi_unsigned_int the_index = p_calling_bundle->caller_generic_parameter.index; + + if (argc < 1 || strcmp( argv[ 0 ], "NULL" ) != 0) + p_pre_shared_key = &pre_shared_key[ 0 ]; + qcsapi_retval = qcsapi_wifi_get_pre_shared_key( the_interface, the_index, p_pre_shared_key ); + + if (qcsapi_retval >= 0) + { + if (verbose_flag >= 0) + { + print_out( print, "%s\n", &pre_shared_key[ 0 ] ); + } + } + else + { + report_qcsapi_error( p_calling_bundle, qcsapi_retval ); + statval = 1; + } + + return( statval ); +} + +static int +call_qcsapi_wifi_set_pre_shared_key( call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[] ) +{ + int statval = 0; + qcsapi_output *print = p_calling_bundle->caller_output; + + if (argc < 1) + { + print_err( print, "Not enough parameters in call qcsapi WiFi set pre-shared key, count is %d\n", argc ); + statval = 1; + } + else + { + int qcsapi_retval; + const char *the_interface = p_calling_bundle->caller_interface; + char *p_pre_shared_key = argv[ 0 ]; + qcsapi_unsigned_int the_index = p_calling_bundle->caller_generic_parameter.index; + + /* PSK will not be NULL ... */ + + if (strcmp( argv[ 0 ], "NULL" ) == 0) + p_pre_shared_key = NULL; + qcsapi_retval = qcsapi_wifi_set_pre_shared_key( the_interface, the_index, p_pre_shared_key ); + + if (qcsapi_retval >= 0) + { + if (verbose_flag >= 0) + { + print_out( print, "complete\n" ); + } + } + else + { + report_qcsapi_error( p_calling_bundle, qcsapi_retval ); + statval = 1; + } + } + + return( statval ); +} + +static int +call_qcsapi_wifi_get_psk_auth_failures(call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[]) +{ + int statval = 0; + qcsapi_output *print = p_calling_bundle->caller_output; + int qcsapi_retval; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_unsigned_int psk_auth_failure_cnt = 0; + + qcsapi_retval = qcsapi_wifi_get_psk_auth_failures(the_interface, &psk_auth_failure_cnt); + if (qcsapi_retval >= 0) + { + if (verbose_flag >= 0) + print_out(print, "%u\n", psk_auth_failure_cnt); + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } + + return statval; +} + +static int +call_qcsapi_wifi_get_key_passphrase( call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[] ) +{ + int statval = 0; + char passphrase[ 68 ], *p_passphrase = NULL; + int qcsapi_retval; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + qcsapi_unsigned_int the_index = p_calling_bundle->caller_generic_parameter.index; + + if (argc < 1 || strcmp( argv[ 0 ], "NULL" ) != 0) + p_passphrase = &passphrase[ 0 ]; + qcsapi_retval = qcsapi_wifi_get_key_passphrase( the_interface, the_index, p_passphrase ); + + if (qcsapi_retval >= 0) + { + if (verbose_flag >= 0) + { + print_out( print, "%s\n", &passphrase[ 0 ] ); + } + } + else + { + report_qcsapi_error( p_calling_bundle, qcsapi_retval ); + statval = 1; + } + + return( statval ); +} + +static int +call_qcsapi_wifi_set_key_passphrase( call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[] ) +{ + int statval = 0; + qcsapi_output *print = p_calling_bundle->caller_output; + + if (argc < 1) + { + print_err( print, "Not enough parameters in call qcsapi WiFi set passphrase, count is %d\n", argc ); + statval = 1; + } + else + { + int qcsapi_retval; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_unsigned_int the_index = p_calling_bundle->caller_generic_parameter.index; + char *p_passphrase = argv[ 0 ]; + + /* No, you cannot has a passphrase of NULL. Too bad !! */ + + if (strcmp( argv[ 0 ], "NULL" ) == 0) + p_passphrase = NULL; + qcsapi_retval = qcsapi_wifi_set_key_passphrase( the_interface, the_index, p_passphrase ); + + if (qcsapi_retval >= 0) + { + if (verbose_flag >= 0) + { + print_out( print, "complete\n" ); + } + } + else + { + report_qcsapi_error( p_calling_bundle, qcsapi_retval ); + statval = 1; + } + } + + return( statval ); +} + +static int +call_qcsapi_wifi_get_group_key_interval( call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[] ) +{ + int statval = 0; + string_16 group_key_interval; + char *p_group_key_interval = NULL; + int qcsapi_retval; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + + if (argc < 1 || strcmp( argv[ 0 ], "NULL" ) != 0) + p_group_key_interval = &group_key_interval[ 0 ]; + qcsapi_retval = qcsapi_wifi_get_group_key_interval( the_interface, p_group_key_interval ); + + if (qcsapi_retval >= 0) + { + if (verbose_flag >= 0) + { + print_out( print, "%s\n", &group_key_interval[ 0 ] ); + } + } + else + { + report_qcsapi_error( p_calling_bundle, qcsapi_retval ); + statval = 1; + } + + return( statval ); +} + +static int +call_qcsapi_wifi_set_group_key_interval( call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[] ) +{ + int statval = 0; + qcsapi_output *print = p_calling_bundle->caller_output; + + if (argc < 1) + { + print_err( print, "Not enough parameters in call qcsapi set group key interval, count is %d\n", argc); + print_err( print, "Usage: call_qcsapi set_group_key_interval \n"); + statval = 1; + } + else + { + int qcsapi_retval; + const char *the_interface = p_calling_bundle->caller_interface; + char *p_group_key_interval = argv[ 0 ]; + + if (strcmp( argv[ 0 ], "NULL" ) == 0) + p_group_key_interval = NULL; + qcsapi_retval = qcsapi_wifi_set_group_key_interval( the_interface, p_group_key_interval + ); + + if (qcsapi_retval >= 0) + { + if (verbose_flag >= 0) + { + print_out( print, "complete\n" ); + } + } + else + { + report_qcsapi_error( p_calling_bundle, qcsapi_retval ); + statval = 1; + } + } + + return( statval ); +} + +static int +call_qcsapi_wifi_get_pmf( call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[] ) +{ + int statval = 0; + int pmf_cap, *p_pmf_cap = NULL; + int qcsapi_retval; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + + if (argc < 1 || strcmp( argv[ 0 ], "NULL" ) != 0) + p_pmf_cap = &pmf_cap; + + qcsapi_retval = qcsapi_wifi_get_pmf( the_interface, p_pmf_cap); + + if (qcsapi_retval >= 0) + { + if (verbose_flag >= 0) + { + print_out( print, "%d\n", pmf_cap ); + } + } + else + { + report_qcsapi_error( p_calling_bundle, qcsapi_retval ); + statval = 1; + } + + return( statval ); +} + +static int +call_qcsapi_wifi_set_pmf( call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[] ) +{ + int statval = 0; + qcsapi_output *print = p_calling_bundle->caller_output; + + if (argc < 1) + { + print_err( print, "Not enough parameters in call qcsapi WiFi set pmf, count is %d\n", argc ); + statval = 1; + } + else + { + int qcsapi_retval; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_unsigned_int pmf_cap = atoi( argv[ 0 ] ); + + qcsapi_retval = qcsapi_wifi_set_pmf( the_interface, pmf_cap ); + + if (qcsapi_retval >= 0) + { + if (verbose_flag >= 0) + { + print_out( print, "complete\n" ); + } + } + else + { + report_qcsapi_error( p_calling_bundle, qcsapi_retval ); + statval = 1; + } + } + + return( statval ); +} + + + +static int +call_qcsapi_wifi_get_pairing_id( call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[] ) +{ + int statval = 0; + char pairing_id[ 33 ]; + int qcsapi_retval; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + + qcsapi_retval = qcsapi_wifi_get_pairing_id( the_interface, pairing_id ); + + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out( print, "%s\n", pairing_id ); + } + } else { + report_qcsapi_error( p_calling_bundle, qcsapi_retval ); + statval = 1; + } + + return( statval ); +} + +static int +call_qcsapi_wifi_set_pairing_id( call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[] ) +{ + int statval = 0; + qcsapi_output *print = p_calling_bundle->caller_output; + + if (argc < 1) { + print_err( print, "Not enough parameters in call qcsapi WiFi set pairing ID, count is %d\n", argc ); + statval = 1; + } else { + int qcsapi_retval; + const char *the_interface = p_calling_bundle->caller_interface; + char *pairing_id = argv[ 0 ]; + + qcsapi_retval = qcsapi_wifi_set_pairing_id( the_interface, pairing_id ); + + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out( print, "complete\n" ); + } + } else { + report_qcsapi_error( p_calling_bundle, qcsapi_retval ); + statval = 1; + } + } + + return( statval ); +} + +static int +call_qcsapi_wifi_get_pairing_enable( call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[] ) +{ + int statval = 0; + char pairing_enable[ 2 ]; + int qcsapi_retval; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + + qcsapi_retval = qcsapi_wifi_get_pairing_enable( the_interface, pairing_enable ); + + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out( print, "%s\n", pairing_enable ); + } + } else { + report_qcsapi_error( p_calling_bundle, qcsapi_retval ); + statval = 1; + } + + return( statval ); +} + +static int +call_qcsapi_wifi_set_pairing_enable( call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[] ) +{ + int statval = 0; + qcsapi_output *print = p_calling_bundle->caller_output; + + if (argc < 1) { + print_err( print, "Not enough parameters in call qcsapi WiFi set pairing enalbe flag, count is %d\n", argc ); + statval = 1; + } else { + int qcsapi_retval; + const char *the_interface = p_calling_bundle->caller_interface; + char *pairing_enable = argv[ 0 ]; + + qcsapi_retval = qcsapi_wifi_set_pairing_enable( the_interface, pairing_enable ); + + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out( print, "complete\n" ); + } + } else { + report_qcsapi_error( p_calling_bundle, qcsapi_retval ); + statval = 1; + } + } + + return( statval ); +} + +static int +call_qcsapi_wifi_set_txqos_sched_tbl( call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[] ) +{ + int statval = 0; + qcsapi_output *print = p_calling_bundle->caller_output; + + if (argc < 1) + { + print_err( print, "Not enough parameters in call qcsapi set txqos sched table\n" ); + print_err( print, + "Usage: call_qcsapi set_txqos_sched_tbl [1|2]\n" + ); + statval = 1; + } + else + { + const char *the_interface = p_calling_bundle->caller_interface; + int index; + string_64 cmd; + + index = atoi(argv[0]); + sprintf(cmd, "iwpriv %s set_txqos_sched %d\n", the_interface, index); + statval = system(cmd); + + if (statval == 0) { + if (verbose_flag >= 0) { + print_out( print, "complete\n" ); + } + } + } + + return( statval ); +} + +static int +call_qcsapi_wifi_get_txqos_sched_tbl( call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[] ) +{ + int statval = 0; + qcsapi_output *print = p_calling_bundle->caller_output; + + if (argc != 0) + { + print_err( print, "No need to give parameters for this command\n" ); + print_err( print, "Usage: call_qcsapi get_txqos_sched_tbl \n" + ); + statval = 1; + } + else + { + const char *the_interface = p_calling_bundle->caller_interface; + string_64 cmd; + + sprintf(cmd, "iwpriv %s get_txqos_sched\n", the_interface); + statval = system(cmd); + + if (statval == 0) { + if (verbose_flag >= 0) { + print_out( print, "complete\n" ); + } + } + } + + return( statval ); +} + +static int +call_qcsapi_eth_phy_power_off( call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[] ) +{ + int statval = 0; + qcsapi_output *print = p_calling_bundle->caller_output; + const char *the_interface = p_calling_bundle->caller_interface; + + if (argc < 1) { + print_err( print, "Not enough parameters for call_qcsapi eth_phy_power_off %d\n", argc ); + print_err( print, "Format: call_qcsapi eth_phy_power_off ifname on_off\n" ); + print_err( print, "ifname: interface name of the ethernet; on_off : 1 - off, 0 - on \n" ); + statval = 1; + } else { + int qcsapi_retval; + int on_off = atoi(argv[ 0 ]); + + qcsapi_retval = qcsapi_eth_phy_power_control( !!on_off, the_interface ); + + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out( print, "complete\n" ); + } + } else { + report_qcsapi_error( p_calling_bundle, qcsapi_retval ); + statval = 1; + } + } + + return( statval ); +} + +static int +call_qcsapi_set_aspm_l1( call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[] ) +{ + int statval = 0; + qcsapi_output *print = p_calling_bundle->caller_output; + + if (argc < 1) { + print_err( print, "Not enough parameters for the call_qcsapi set_aspm_l1 %d\n", argc ); + print_err( print, "Format: call_qcsapi set_aspm_l1 enable/disable [latency] \n" ); + print_err( print, "1 - enable, 0 - disable; latency(0~6) \n" ); + statval = 1; + } else { + int qcsapi_retval; + int enable = atoi(argv[ 0 ]); + int latency = 0; + + if (enable && argc == 1) { + print_err( print, "please enter latency value \n" ); + statval = 1; + goto end; + } + + if (enable) + latency = atoi(argv[ 1 ]); + + qcsapi_retval = qcsapi_set_aspm_l1(enable, latency); + + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out( print, "complete\n" ); + } + } else { + report_qcsapi_error( p_calling_bundle, qcsapi_retval ); + statval = 1; + } + + } +end: + return ( statval ); +} + +static int +call_qcsapi_set_l1( call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[] ) +{ + int statval = 0; + qcsapi_output *print = p_calling_bundle->caller_output; + + if (argc < 1) { + print_err( print, "Not enough parameters for the call_qcsapi set_l1 %d\n", argc ); + print_err( print, "Format: call_qcsapi set_l1 enter/exit \n" ); + print_err( print, "1 - enter, 0 - exit \n" ); + goto call_qcsapi_set_l1_error; + } + int qcsapi_retval; + int enter = atoi(argv[ 0 ]); + + if (enter != 0 && enter != 1) { + print_err( print, "parameter (%d) is not supported \n" ); + goto call_qcsapi_set_l1_error; + } + + qcsapi_retval = qcsapi_set_l1(enter); + + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out( print, "complete\n" ); + } + } else { + report_qcsapi_error( p_calling_bundle, qcsapi_retval ); + goto call_qcsapi_set_l1_error; + } + + + return ( statval ); + + call_qcsapi_set_l1_error: + statval = 1; + return ( statval ); +} + +static int +call_qcsapi_wifi_get_mac_address_filtering( call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[] ) +{ + int statval = 0; + qcsapi_mac_address_filtering current_mac_address_filtering, *p_current_mac_address_filtering = NULL; + int qcsapi_retval; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + + if (argc < 1 || strcmp( argv[ 0 ], "NULL" ) != 0) + p_current_mac_address_filtering = ¤t_mac_address_filtering; + qcsapi_retval = qcsapi_wifi_get_mac_address_filtering( the_interface, p_current_mac_address_filtering ); + if (qcsapi_retval >= 0) + { + if (verbose_flag >= 0) + { + print_out( print, "%d\n", (int) current_mac_address_filtering ); + } + } + else + { + report_qcsapi_error( p_calling_bundle, qcsapi_retval ); + statval = 1; + } + + return( statval ); +} + +static int +call_qcsapi_wifi_set_mac_address_filtering( call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[] ) +{ + int statval = 0; + qcsapi_output *print = p_calling_bundle->caller_output; + + if (argc < 1) + { + print_err( print, + "Not enough parameters in call qcsapi WiFi set MAC address filtering, count is %d\n", argc + ); + statval = 1; + } + else + { + int qcsapi_retval; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_mac_address_filtering current_mac_address_filtering = + (qcsapi_mac_address_filtering) atoi( argv[ 0 ] ); + + qcsapi_retval = qcsapi_wifi_set_mac_address_filtering( the_interface, current_mac_address_filtering ); + + if (qcsapi_retval >= 0) + { + if (verbose_flag >= 0) + { + print_out( print, "complete\n" ); + } + } + else + { + report_qcsapi_error( p_calling_bundle, qcsapi_retval ); + statval = 1; + } + } + + return( statval ); +} + +static int +call_qcsapi_wifi_is_mac_address_authorized(call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[] ) +{ + int statval = 0; + qcsapi_output *print = p_calling_bundle->caller_output; + + if (argc < 1) + { + print_err( print, + "Not enough parameters in call qcsapi WiFi is MAC address authorized, count is %d\n", argc + ); + statval = 1; + } + else + { + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_mac_addr the_mac_addr; + int qcsapi_retval; + int ival = 0, is_authorized = -1; + + if (strcmp( "NULL", argv[ 0 ] ) == 0) + qcsapi_retval = qcsapi_wifi_is_mac_address_authorized( the_interface, NULL, &is_authorized ); + else + { + ival = parse_mac_addr( argv[ 0 ], the_mac_addr ); + if (ival >= 0) + qcsapi_retval = qcsapi_wifi_is_mac_address_authorized( + the_interface, the_mac_addr, &is_authorized + ); + else + { + print_out( print, "Error parsing MAC address %s\n", argv[ 0 ] ); + statval = 1; + } + } + + if (ival >= 0) + { + if (qcsapi_retval >= 0) + { + if (verbose_flag >= 0) + { + print_out( print, "%d\n", is_authorized ); + } + } + else + { + report_qcsapi_error( p_calling_bundle, qcsapi_retval ); + statval = 1; + } + } + } + + return( statval ); +} + +static int +call_qcsapi_wifi_get_authorized_mac_addresses(call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[] ) +{ + int statval = 0; + int qcsapi_retval; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + char *authorized_mac_addresses = NULL; + unsigned int sizeof_authorized_mac_addresses = 126; + int ok_to_proceed = 1; /* tracks malloc failures */ + + if (argc > 0) + { + if (strcmp( "NULL", argv[ 0 ] ) != 0) + { + sizeof_authorized_mac_addresses = (unsigned int) atoi( argv[ 0 ] ); + } + else + sizeof_authorized_mac_addresses = 0; + } + + if (sizeof_authorized_mac_addresses > 0) + { + authorized_mac_addresses = malloc( sizeof_authorized_mac_addresses ); + if (authorized_mac_addresses == NULL) + { + print_err( print, "Failed to allocate %u chars\n", sizeof_authorized_mac_addresses ); + ok_to_proceed = 0; + statval = 1; + } + } + + if (ok_to_proceed) + { + qcsapi_retval = qcsapi_wifi_get_authorized_mac_addresses( + the_interface, authorized_mac_addresses, sizeof_authorized_mac_addresses + ); + + if (qcsapi_retval >= 0) + { + if (verbose_flag >= 0) + { + print_out( print, "%s\n", authorized_mac_addresses ); + } + } + else + { + report_qcsapi_error( p_calling_bundle, qcsapi_retval ); + statval = 1; + } + + if (authorized_mac_addresses != NULL) + free( authorized_mac_addresses ); + } + + return( statval ); +} + +static int +call_qcsapi_wifi_get_denied_mac_addresses( call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[] ) +{ + int statval = 0; + int qcsapi_retval; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + char *denied_mac_addresses = NULL; + unsigned int sizeof_denied_mac_addresses = 126; + int ok_to_proceed = 1; /* tracks malloc failures */ + + if (argc > 0) + { + if (strcmp( "NULL", argv[ 0 ] ) != 0) + { + sizeof_denied_mac_addresses = (unsigned int) atoi( argv[ 0 ] ); + } + else + sizeof_denied_mac_addresses = 0; + } + + if (sizeof_denied_mac_addresses > 0) + { + denied_mac_addresses = malloc( sizeof_denied_mac_addresses ); + if (denied_mac_addresses == NULL) + { + print_err( print, "Failed to allocate %u chars\n", sizeof_denied_mac_addresses ); + ok_to_proceed = 0; + statval = 1; + } + } + + if (ok_to_proceed) + { + qcsapi_retval = qcsapi_wifi_get_denied_mac_addresses( + the_interface, denied_mac_addresses, sizeof_denied_mac_addresses + ); + + if (qcsapi_retval >= 0) + { + if (verbose_flag >= 0) + { + print_out( print, "%s\n", denied_mac_addresses ); + } + } + else + { + report_qcsapi_error( p_calling_bundle, qcsapi_retval ); + statval = 1; + } + + if (denied_mac_addresses != NULL) + free( denied_mac_addresses ); + } + + return( statval ); +} + +static int +call_qcsapi_wifi_authorize_mac_address( call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[] ) +{ + int statval = 0; + qcsapi_output *print = p_calling_bundle->caller_output; + + if (argc < 1) + { + print_err( print, + "Not enough parameters in call qcsapi WiFi authorize MAC address,count is %d\n", argc + ); + statval = 1; + } + else + { + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_mac_addr the_mac_addr; + int qcsapi_retval; + int ival = 0; + + if (strcmp( "NULL", argv[ 0 ] ) == 0) + qcsapi_retval = qcsapi_wifi_authorize_mac_address( the_interface, NULL ); + else + { + ival = parse_mac_addr( argv[ 0 ], the_mac_addr ); + if (ival >= 0) + qcsapi_retval = qcsapi_wifi_authorize_mac_address( + the_interface, the_mac_addr + ); + else + { + print_out( print, "Error parsing MAC address %s\n", argv[ 0 ] ); + statval = 1; + } + } + + if (ival >= 0) + { + if (qcsapi_retval >= 0) + { + if (verbose_flag >= 0) + { + print_out( print, "complete\n" ); + } + } + else + { + report_qcsapi_error( p_calling_bundle, qcsapi_retval ); + statval = 1; + } + } + } + + return( statval ); +} + +static int +call_qcsapi_wifi_deny_mac_address( call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[] ) +{ + int statval = 0; + qcsapi_output *print = p_calling_bundle->caller_output; + + if (argc < 1) + { + print_err( print, + "Not enough parameters in call qcsapi WiFi deny MAC address, count is %d\n", argc + ); + statval = 1; + } + else + { + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_mac_addr the_mac_addr; + int qcsapi_retval; + int ival = 0; + + if (strcmp( "NULL", argv[ 0 ] ) == 0) + qcsapi_retval = qcsapi_wifi_deny_mac_address( the_interface, NULL ); + else + { + ival = parse_mac_addr( argv[ 0 ], the_mac_addr ); + if (ival >= 0) + qcsapi_retval = qcsapi_wifi_deny_mac_address( + the_interface, the_mac_addr + ); + else + { + print_out( print, "Error parsing MAC address %s\n", argv[ 0 ] ); + statval = 1; + } + } + + if (ival >= 0) + { + if (qcsapi_retval >= 0) + { + if (verbose_flag >= 0) + { + print_out( print, "complete\n" ); + } + } + else + { + report_qcsapi_error( p_calling_bundle, qcsapi_retval ); + statval = 1; + } + } + } + + return( statval ); +} + + +static int +call_qcsapi_wifi_remove_mac_address( call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[] ) +{ + int statval = 0; + qcsapi_output *print = p_calling_bundle->caller_output; + + if (argc < 1) + { + print_err( print, + "Not enough parameters in call qcsapi WiFi remove MAC address, count is %d\n", argc + ); + statval = 1; + } + else + { + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_mac_addr the_mac_addr; + int qcsapi_retval; + int ival = 0; + + if (strcmp( "NULL", argv[ 0 ] ) == 0) + qcsapi_retval = qcsapi_wifi_remove_mac_address( the_interface, NULL ); + else + { + ival = parse_mac_addr( argv[ 0 ], the_mac_addr ); + if (ival >= 0) + qcsapi_retval = qcsapi_wifi_remove_mac_address( + the_interface, the_mac_addr + ); + else + { + print_out( print, "Error parsing MAC address %s\n", argv[ 0 ] ); + statval = 1; + } + } + + if (ival >= 0) + { + if (qcsapi_retval >= 0) + { + if (verbose_flag >= 0) + { + print_out( print, "complete\n" ); + } + } + else + { + report_qcsapi_error( p_calling_bundle, qcsapi_retval ); + statval = 1; + } + } + } + + return( statval ); +} + +static int +call_qcsapi_wifi_clear_mac_address_filters( call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[] ) +{ + int statval = 0; + qcsapi_output *print = p_calling_bundle->caller_output; + + int qcsapi_retval; + const char *the_interface = p_calling_bundle->caller_interface; + + qcsapi_retval = qcsapi_wifi_clear_mac_address_filters( the_interface ); + + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out( print, "complete\n" ); + } + } else { + report_qcsapi_error( p_calling_bundle, qcsapi_retval ); + statval = 1; + } + + return( statval ); +} + +static int +call_qcsapi_wifi_set_mac_address_reserve(call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[]) +{ + qcsapi_output *print = p_calling_bundle->caller_output; + const char *the_interface = p_calling_bundle->caller_interface; + + int qcsapi_retval; + + if (argc < 1) { + print_err(print, + "Not enough parameters in call qcsapi WiFi reserve MAC address, count is %d\n", + argc); + return 1; + } else if (argc == 1) { + qcsapi_retval = qcsapi_wifi_set_mac_address_reserve(the_interface, argv[0], ""); + } else { + qcsapi_retval = qcsapi_wifi_set_mac_address_reserve(the_interface, argv[0], argv[1]); + } + + if (qcsapi_retval < 0) { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + return 1; + } + + if (verbose_flag >= 0) + print_out(print, "complete\n"); + + return 0; +} + +static int +call_qcsapi_wifi_get_mac_address_reserve(call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[]) +{ + qcsapi_output *print = p_calling_bundle->caller_output; + const char *the_interface = p_calling_bundle->caller_interface; + string_256 buf; + int qcsapi_retval; + + qcsapi_retval = qcsapi_wifi_get_mac_address_reserve(the_interface, buf); + if (qcsapi_retval < 0) { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + return 1; + } + + print_out(print, "%s", buf); + + return 0; +} + +static int +call_qcsapi_wifi_clear_mac_address_reserve(call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[]) +{ + qcsapi_output *print = p_calling_bundle->caller_output; + const char *the_interface = p_calling_bundle->caller_interface; + + int qcsapi_retval; + + qcsapi_retval = qcsapi_wifi_clear_mac_address_reserve(the_interface); + + if (qcsapi_retval < 0) { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + return 1; + } + + if (verbose_flag >= 0) + print_out(print, "complete\n"); + + return 0; +} + +static int +call_qcsapi_wifi_backoff_fail_max( call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[] ) +{ + int statval = 0; + qcsapi_output *print = p_calling_bundle->caller_output; + + if (argc < 1) + { + print_err( print, + "Not enough parameters in call qcsapi backoff fail max, count is %d\n", argc + ); + statval = 1; + } + else + { + const char *the_interface = p_calling_bundle->caller_interface; + int qcsapi_retval; + int backoff_fail_max = atoi( argv[ 0 ] ); + + qcsapi_retval = qcsapi_wifi_backoff_fail_max( the_interface, backoff_fail_max ); + + if (qcsapi_retval >= 0) + { + if (verbose_flag >= 0) + { + print_out( print, "complete\n" ); + } + } + else + { + report_qcsapi_error( p_calling_bundle, qcsapi_retval ); + statval = 1; + } + } + + return( statval ); +} + +static int +call_qcsapi_wifi_backoff_timeout( call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[] ) +{ + int statval = 0; + qcsapi_output *print = p_calling_bundle->caller_output; + + if (argc < 1) + { + print_err( print, + "Not enough parameters in call qcsapi backoff timeout, count is %d\n", argc + ); + statval = 1; + } + else + { + const char *the_interface = p_calling_bundle->caller_interface; + int qcsapi_retval; + int backoff_timeout = atoi( argv[ 0 ] ); + + qcsapi_retval = qcsapi_wifi_backoff_timeout( the_interface, backoff_timeout ); + + if (qcsapi_retval >= 0) + { + if (verbose_flag >= 0) + { + print_out( print, "complete\n" ); + } + } + else + { + report_qcsapi_error( p_calling_bundle, qcsapi_retval ); + statval = 1; + } + } + + return( statval ); +} + +static int +call_qcsapi_wps_registrar_report_button_press( call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[] ) +{ + int statval = 0; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + int qcsapi_retval = qcsapi_wps_registrar_report_button_press( the_interface ); + + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out( print, "complete\n" ); + } + } else { + report_qcsapi_error( p_calling_bundle, qcsapi_retval ); + statval = 1; + } + + return( statval ); +} + +static int +call_qcsapi_wps_registrar_report_pin( call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[] ) +{ + int statval = 0; + qcsapi_output *print = p_calling_bundle->caller_output; + + if (argc < 1) { + print_err( print, "registrar report pin: required WPS PIN not present\n" ); + statval = 1; + } + else { + const char *the_interface = p_calling_bundle->caller_interface; + const char *p_wps_pin = NULL; + int qcsapi_retval; + + if (strcmp( argv[ 0 ], "NULL" ) != 0) { + p_wps_pin = argv[ 0 ]; + } + + qcsapi_retval = qcsapi_wps_registrar_report_pin( the_interface, p_wps_pin ); + + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out( print, "complete\n" ); + } + } else { + report_qcsapi_error( p_calling_bundle, qcsapi_retval ); + statval = 1; + } + } + + return( statval ); +} + +static int +call_qcsapi_wps_registrar_get_pp_devname(call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[]) +{ + int statval = 0; + int qcsapi_retval; + const char *the_interface = p_calling_bundle->caller_interface; + string_128 pp_devname = ""; + char *p_pp_devname = NULL; + qcsapi_output *print = p_calling_bundle->caller_output; + int blacklist = 0; + + if (argc == 1 && strcmp(argv[0], "blacklist") == 0) { + blacklist = 1; + } + if (argc >= 1 && strcmp(argv[0], "NULL") != 0) { + p_pp_devname = &pp_devname[0]; + } + + qcsapi_retval = qcsapi_wps_registrar_get_pp_devname(the_interface, blacklist, p_pp_devname); + + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out(print, "%s\n", p_pp_devname); + } + } else { + report_qcsapi_error( p_calling_bundle, qcsapi_retval ); + statval = 1; + } + + return statval; +} + +static int +call_qcsapi_wps_registrar_set_pp_devname(call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[]) +{ + int statval = 0; + int qcsapi_retval; + const char *the_interface = p_calling_bundle->caller_interface; + char *p_pp_devname = NULL; + qcsapi_output *print = p_calling_bundle->caller_output; + uint32_t wps_pp_status; + int update_blacklist = 0; + + if (argc == 1) { + p_pp_devname = strcmp(argv[0], "NULL") == 0 ? NULL : argv[0]; + } else if (argc == 2 && strcmp(argv[0], "blacklist") == 0) { + update_blacklist = 1; + p_pp_devname = strcmp(argv[1], "NULL") == 0 ? NULL : argv[1]; + } else { + print_err(print, "WPS Registrar Set PP Devname: \n" + "setting white-list: call_qcsapi registrar_set_pp_devname \n" + "setting black-list: call_qcsapi registrar_set_pp_devname blacklist \n"); + return 0; + } + + qcsapi_retval = qcsapi_wps_get_access_control( the_interface, &wps_pp_status ); + if (qcsapi_retval >= 0) { + if (wps_pp_status == 0) { + print_err(print, "enable WPS Pairing Protection before setting device name list\n"); + return 1; + } + } + + if (qcsapi_retval >= 0) + qcsapi_retval = qcsapi_wps_registrar_set_pp_devname(the_interface, update_blacklist, p_pp_devname); + + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out(print, "complete\n"); + } + } else { + report_qcsapi_error( p_calling_bundle, qcsapi_retval ); + statval = 1; + } + + return statval; +} + + +static int +call_qcsapi_wps_enrollee_report_button_press( call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[] ) +{ + int statval = 0; + int ival = 0; + qcsapi_mac_addr local_bssid = { 0, 0, 0, 0, 0, 0 }; + qcsapi_output *print = p_calling_bundle->caller_output; + + if (argc > 0) { + /* + * Interpret BSSID parameter of "any" as direction to pass BSSID of all zeros to the API - + * so the WPS process will associate with any registrar. + */ + if (strcasecmp( argv[ 0 ], "any" ) != 0) { + ival = parse_mac_addr( argv[ 0 ], local_bssid ); + + if (ival < 0) { + print_out( print, "Error parsing MAC address %s\n", argv[ 0 ] ); + statval = 1; + } + } + } + + if (ival >= 0) { + const char *the_interface = p_calling_bundle->caller_interface; + int qcsapi_retval = qcsapi_wps_enrollee_report_button_press(the_interface, + local_bssid); + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out( print, "complete\n" ); + } + } else { + report_qcsapi_error( p_calling_bundle, qcsapi_retval ); + statval = 1; + } + } + + return( statval ); +} + +static int +call_qcsapi_wps_enrollee_report_pin( call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[] ) +{ + int statval = 0; + qcsapi_output *print = p_calling_bundle->caller_output; + + if (argc < 1) { + print_err( print, "enrollee report pin: required WPS PIN not present\n" ); + statval = 1; + } else { + int qcsapi_retval = 0; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_mac_addr local_bssid = { 0, 0, 0, 0, 0, 0 }; + const char *p_wps_pin = NULL; + int ival = 0; + int pin_argv_index = 0; + + if (argc > 1) { + if (strcasecmp( argv[ 0 ], "any" ) != 0) { + ival = parse_mac_addr( argv[ 0 ], local_bssid ); + } + + if (ival < 0) { + print_out( print, "Error parsing MAC address %s\n", argv[ 0 ] ); + statval = 1; + } else { + pin_argv_index = 1; + } + } + + if (ival >= 0) { + if (strcmp( argv[ pin_argv_index ], "NULL" ) != 0) { + p_wps_pin = argv[ pin_argv_index ]; + } + + qcsapi_retval = qcsapi_wps_enrollee_report_pin( the_interface, + local_bssid, + p_wps_pin ); + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out( print, "complete\n" ); + } + } else { + report_qcsapi_error( p_calling_bundle, qcsapi_retval ); + statval = 1; + } + } + } + + return( statval ); +} + +static int +call_qcsapi_wps_enrollee_generate_pin( call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[] ) +{ + int statval = 0; + int ival = 0; + qcsapi_mac_addr local_bssid = { 0, 0, 0, 0, 0, 0 }; + char generated_pin[ QCSAPI_WPS_MAX_PIN_LEN + 1 ]; + char *p_generated_pin = NULL; + qcsapi_output *print = p_calling_bundle->caller_output; + + if (argc > 0) { + if (argc < 2 || strcmp( argv[ 1 ], "NULL" ) != 0) { + p_generated_pin = &generated_pin[ 0 ]; + } + /* + * Interpret BSSID parameter of "any" as direction to pass BSSID of all zeros to the API - + * so the WPS process will associate with any registrar. + */ + if (strcasecmp( argv[ 0 ], "any" ) != 0) { + ival = parse_mac_addr( argv[ 0 ], local_bssid ); + + if (ival < 0) { + print_out( print, "Error parsing MAC address %s\n", argv[ 0 ] ); + statval = 1; + } + } + } else { + p_generated_pin = &generated_pin[ 0 ]; + } + + if (ival >= 0) { + const char *the_interface = p_calling_bundle->caller_interface; + int qcsapi_retval = qcsapi_wps_enrollee_generate_pin(the_interface, + local_bssid, + p_generated_pin); + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out( print, "%s\n", &generated_pin[0 ] ); + } + } else { + report_qcsapi_error( p_calling_bundle, qcsapi_retval ); + statval = 1; + } + } + + return( statval ); +} + +static int +call_qcsapi_wps_get_ap_pin(call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[]) +{ + int statval = 0; + int qcsapi_retval; + const char *iface = p_calling_bundle->caller_interface; + char generated_pin[QCSAPI_WPS_MAX_PIN_LEN + 1]; + qcsapi_output *print = p_calling_bundle->caller_output; + int force_regenerate = 0; + + if (argc == 1) { + force_regenerate = atoi(argv[0]); + } else if (argc > 1) { + print_err(print, "Too many arguments for wps_get_ap_pin\n"); + return 1; + } + + if (force_regenerate != 0 && force_regenerate != 1) { + print_err(print, + "Invalid parameter for force regenerate option: \"%s\" - must be 0 or 1", + argv[0]); + return 1; + } + + qcsapi_retval = qcsapi_wps_get_ap_pin(iface, generated_pin, force_regenerate); + + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out(print, "%s\n", generated_pin); + } + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } + + return statval; +} + +static void local_set_wps_ap_pin_usage(qcsapi_output *print, int out) +{ + if (!out) { + print_out(print, "usage: call_qscapi set_wps_ap_pin \n" + "AP PIN: 8bit or 4 bit digits\n"); + } else { + print_err(print, "usage: call_qscapi set_wps_ap_pin \n" + "AP PIN: 8bit or 4 bit digits\n"); + } +} + +static int +call_qcsapi_wps_set_ap_pin(call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[]) +{ + int statval = 0; + int qcsapi_retval; + const char *iface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + char wps_pin[2 * QCSAPI_WPS_MAX_PIN_LEN] = {0}; + + if (argc <= 0) { + local_set_wps_ap_pin_usage(print, 1); + return 1; + } + + strncpy(wps_pin, argv[0], sizeof(wps_pin)); + + qcsapi_retval = qcsapi_wps_set_ap_pin(iface, wps_pin); + + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out(print, "complete\n"); + } + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } + + return statval; +} + +static int +call_qcsapi_wps_save_ap_pin(call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[]) +{ + int statval = 0; + int qcsapi_retval; + const char *iface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + + if (argc != 0) { + print_err(print, "usage: call_qscapi save_wps_ap_pin\n"); + return 1; + } + + qcsapi_retval = qcsapi_wps_save_ap_pin(iface); + + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out(print, "complete\n"); + } + } else { + if (qcsapi_retval == -qcsapi_parameter_not_found) + print_err(print, "no ap PIN exists, set or generate one\n"); + else + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } + + return statval; +} + +static int +call_qcsapi_wps_enable_ap_pin(call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[]) +{ + int statval = 0; + int qcsapi_retval; + const char *iface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + int enable; + + if (argc != 1) { + print_err(print, "usage: call_qscapi enable_wps_ap_pin [1 | 0]\n"); + return 1; + } + + enable = atoi(argv[0]); + if (strlen(argv[0]) > 1 || !isdigit(*argv[0]) || (enable != 0 && enable != 1)) { + print_err(print, "usage: call_qscapi enable_wps_ap_pin [1 | 0]\n"); + return 1; + } + + qcsapi_retval = qcsapi_wps_enable_ap_pin(iface, enable); + + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out(print, "complete\n"); + } + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } + + return statval; +} + +static int +call_qcsapi_wps_generate_random_pin(call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[]) +{ + int statval = 0; + int qcsapi_retval; + const char *iface = p_calling_bundle->caller_interface; + char generated_pin[QCSAPI_WPS_MAX_PIN_LEN + 1]; + qcsapi_output *print = p_calling_bundle->caller_output; + + qcsapi_retval = qcsapi_wps_get_sta_pin(iface, generated_pin); + + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out(print, "%s\n", generated_pin); + } + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } + + return statval; +} + +#define WPS_GET_STATE_MAX_LEN 128 + +static int +call_qcsapi_wps_get_state( call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[] ) +{ + int statval = 0; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + int qcsapi_retval; + qcsapi_unsigned_int message_len = WPS_GET_STATE_MAX_LEN; + char wps_state[ WPS_GET_STATE_MAX_LEN ] = ""; + char *p_wps_state = &wps_state[ 0 ]; + + if (argc > 0) { + if (strcmp( argv[ 0 ], "NULL" ) == 0 ) { + p_wps_state = NULL; + } + else if (isdigit( argv[ 0 ][ 0 ] )) { + message_len = atoi( argv[ 0 ] ); + + if (message_len > WPS_GET_STATE_MAX_LEN) { + message_len = WPS_GET_STATE_MAX_LEN; + } + } + } + + qcsapi_retval = qcsapi_wps_get_state( the_interface, p_wps_state, message_len ); + + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out( print, "%s\n", p_wps_state ); + } + } + else { + report_qcsapi_error( p_calling_bundle, qcsapi_retval ); + statval = 1; + } + + return( statval ); +} + +#define WPA_GET_STATUS_MAX_LEN 32 +#define MAC_ADDR_STR_LEN 17 +static int +call_qcsapi_wifi_get_wpa_status( call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[] ) +{ + int statval = 0; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + int qcsapi_retval; + qcsapi_unsigned_int message_len = WPA_GET_STATUS_MAX_LEN; + char wpa_status[ WPA_GET_STATUS_MAX_LEN ] = ""; + char *p_wpa_status = &wpa_status[ 0 ]; + char mac_addr[MAC_ADDR_STR_LEN + 1] = {0}; + + if (argc > 0) { + if (argc == 2) { + if (isdigit( argv[ 1 ][ 0 ] )) { + message_len = atoi( argv[ 1 ] ); + + if (message_len > WPA_GET_STATUS_MAX_LEN) { + message_len = WPA_GET_STATUS_MAX_LEN; + } + } + } + + if (strnlen( argv[ 0 ], MAC_ADDR_STR_LEN + 1 ) == MAC_ADDR_STR_LEN ) { + strcpy( mac_addr, argv[ 0 ] ); + } else { + print_out( print, "mac address input error \n"); + return( statval ); + } + } + + qcsapi_retval = qcsapi_wifi_get_wpa_status( the_interface, p_wpa_status, mac_addr, message_len ); + + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out( print, "%s\n", p_wpa_status ); + } + } + else { + report_qcsapi_error( p_calling_bundle, qcsapi_retval ); + statval = 1; + } + + return( statval ); +} + +static int +call_qcsapi_wifi_get_auth_state( call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[] ) +{ + int statval = 0; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + int qcsapi_retval; + char mac_addr[MAC_ADDR_STR_LEN + 1] = {0}; + int auth_state = 0; + + if (argc > 0) { + if (strnlen( argv[ 0 ], (MAC_ADDR_STR_LEN + 1) ) == MAC_ADDR_STR_LEN ) { + strcpy( mac_addr, argv[ 0 ] ); + } else { + print_out( print, "Mac address input is invalid!\n" ); + return( statval ); + } + } else { + print_out( print, "Mac address should be input!\n" ); + return( statval ); + } + + qcsapi_retval = qcsapi_wifi_get_auth_state( the_interface, mac_addr, &auth_state ); + + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out( print, "%d\n", auth_state ); + } + } else { + report_qcsapi_error( p_calling_bundle, qcsapi_retval ); + statval = 1; + } + + return( statval ); +} + +static int +call_qcsapi_wifi_get_disconn_info(call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[]) +{ + int statval = 0; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + int qcsapi_retval; + qcsapi_disconn_info info; + + memset(&info, 0, sizeof(info)); + qcsapi_retval = qcsapi_wifi_get_disconn_info(the_interface, &info); + + if (qcsapi_retval >= 0) { + print_out( print, "association\t%d\n" + "disconnect\t%d\n" + "sequence\t%d\n" + "uptime\t%d\n", info.asso_sta_count, info.disconn_count, info.sequence, + info.up_time); + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } + + return statval; +} + +static int +call_qcsapi_wifi_reset_disconn_info(call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[]) +{ + int statval = 0; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + int qcsapi_retval; + qcsapi_disconn_info info; + + memset(&info, 0, sizeof(info)); + info.resetflag = 1; + qcsapi_retval = qcsapi_wifi_get_disconn_info(the_interface, &info); + + if (qcsapi_retval >= 0) { + print_out( print, "Reset complete\n"); + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } + + return statval; +} + +static int +call_qcsapi_wps_get_configured_state(call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[]) +{ + int statval = 0; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + int qcsapi_retval; + qcsapi_unsigned_int message_len = WPS_GET_STATE_MAX_LEN; + char wps_state[WPS_GET_STATE_MAX_LEN] = ""; + char *p_wps_state = &wps_state[0]; + + if (argc > 0) { + if (strcmp(argv[0], "NULL") == 0) { + p_wps_state = NULL; + } else if (isdigit(argv[0][0])) { + message_len = atoi(argv[0]); + if (message_len > WPS_GET_STATE_MAX_LEN) { + message_len = WPS_GET_STATE_MAX_LEN; + } + } + } + + qcsapi_retval = qcsapi_wps_get_configured_state(the_interface, p_wps_state, message_len); + + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out( print, "%s\n", p_wps_state); + } + } + else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } + + return statval; +} + +static int +call_qcsapi_wps_get_runtime_state(call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[]) +{ + int statval = 0; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + int qcsapi_retval; + qcsapi_unsigned_int message_len = WPS_GET_STATE_MAX_LEN; + char wps_state[WPS_GET_STATE_MAX_LEN] = ""; + char *p_wps_state = &wps_state[0]; + + if (argc > 0) { + if (strcmp(argv[0], "NULL") == 0) { + p_wps_state = NULL; + } else if (isdigit(argv[0][0])) { + message_len = atoi(argv[0]); + if (message_len > WPS_GET_STATE_MAX_LEN) { + message_len = WPS_GET_STATE_MAX_LEN; + } + } + } + + qcsapi_retval = qcsapi_wps_get_runtime_state(the_interface, p_wps_state, message_len); + + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out( print, "%s\n", p_wps_state); + } + } + else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } + + return statval; +} + +static int +call_qcsapi_wps_allow_pbc_overlap(call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[]) +{ + int statval = 0; + int qcsapi_retval; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + int allow = !!atoi(argv[0]); + + qcsapi_retval = qcsapi_wps_allow_pbc_overlap(the_interface, allow); + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out( print, "complete\n"); + } + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } + + return( statval ); +} + + +static int +call_qcsapi_wps_get_allow_pbc_overlap_status(call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[]) +{ + int statval = 0; + int qcsapi_retval; + int status = -1; + const char *iface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + + qcsapi_retval = qcsapi_wps_get_allow_pbc_overlap_status(iface, &status); + + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out(print, "%d\n", status); + } + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } + + return statval; +} + + +#define WPS_GET_CFG_MAX_LEN 100 + +static int +call_qcsapi_wps_get_param(call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[]) +{ + int statval = 0; + const char *the_interface = p_calling_bundle->caller_interface; + int qcsapi_retval; + qcsapi_unsigned_int message_len = WPS_GET_CFG_MAX_LEN; + qcsapi_wps_param_type wps_cfg_str_id; + qcsapi_output *print = p_calling_bundle->caller_output; + char wps_cfg_str[WPS_GET_CFG_MAX_LEN] = ""; + + if (argc > 0) { + if (strcmp(argv[0], "uuid") == 0) { + wps_cfg_str_id = qcsapi_wps_uuid; + } else if(strcmp(argv[0], "os_version") == 0){ + wps_cfg_str_id = qcsapi_wps_os_version; + } else if(strcmp(argv[0], "device_name") == 0){ + wps_cfg_str_id = qcsapi_wps_device_name; + } else if(strcmp(argv[0], "config_methods") == 0){ + wps_cfg_str_id = qcsapi_wps_config_methods; + } else if(strcmp(argv[0], "ap_setup_locked") == 0){ + wps_cfg_str_id = qcsapi_wps_ap_setup_locked; + } else if(strcmp(argv[0], "last_config_error") == 0){ + wps_cfg_str_id = qcsapi_wps_last_config_error; + } else if(strcmp(argv[0], "registrar_number") == 0){ + wps_cfg_str_id = qcsapi_wps_registrar_number; + }else if(strcmp(argv[0], "registrar_established") == 0){ + wps_cfg_str_id = qcsapi_wps_registrar_established; + }else if (strcmp(argv[0], "force_broadcast_uuid") == 0) { + wps_cfg_str_id = qcsapi_wps_force_broadcast_uuid; + }else if (strcmp(argv[0], "ap_pin_fail_method") == 0) { + wps_cfg_str_id = qcsapi_wps_ap_pin_fail_method; + }else if (strcmp(argv[0], "auto_lockdown_max_retry") == 0) { + wps_cfg_str_id = qcsapi_wps_auto_lockdown_max_retry; + }else if (strcmp(argv[0], "auto_lockdown_fail_num") == 0) { + wps_cfg_str_id = qcsapi_wps_auto_lockdown_fail_num; + }else if (strcmp(argv[0], "wps_vendor_spec") == 0) { + wps_cfg_str_id = qcsapi_wps_vendor_spec; + }else if (strcmp(argv[0], "last_wps_client") == 0) { + wps_cfg_str_id = qcsapi_wps_last_successful_client; + }else if (strcmp(argv[0], "last_wps_client_devname") == 0) { + wps_cfg_str_id = qcsapi_wps_last_successful_client_devname; + } else if (strcmp(argv[0], "serial_number") == 0) { + wps_cfg_str_id = qcsapi_wps_serial_number; + } else if (strcmp(argv[0], "manufacturer") == 0) { + wps_cfg_str_id = qcsapi_wps_manufacturer; + } else if (strcmp(argv[0], "model_name") == 0) { + wps_cfg_str_id = qcsapi_wps_model_name; + } else if (strcmp(argv[0], "model_number") == 0) { + wps_cfg_str_id = qcsapi_wps_model_number; + } else if (strcmp(argv[0], "pbc_in_m1") == 0) { + wps_cfg_str_id = qcsapi_wps_pbc_in_m1; + } else { + print_err(print, "wps cfg string ID input error! \n"); + return 1; + } + }else{ + print_err(print, "please input wps cfg string ID\n"); + return 1; + } + + qcsapi_retval = qcsapi_wps_get_param(the_interface, wps_cfg_str_id, wps_cfg_str, message_len); + + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out(print, "%s\n", wps_cfg_str); + } + } + else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } + + return statval; +} + +static int +call_qcsapi_wps_set_param(call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[]) +{ + int statval = 0; + const char *the_interface = p_calling_bundle->caller_interface; + int qcsapi_retval; + qcsapi_wps_param_type wps_cfg_str_id; + qcsapi_output *print = p_calling_bundle->caller_output; + + if (argc >= 2) { + if (strcmp(argv[0], "ap_pin") == 0) { + wps_cfg_str_id = qcsapi_wps_ap_pin; + } else if (strcmp(argv[0], "config_methods") == 0) { + wps_cfg_str_id = qcsapi_wps_config_methods; + } else if (strcmp(argv[0], "setup_lock") == 0) { + wps_cfg_str_id = qcsapi_wps_ap_setup_locked; + } else if (strcmp(argv[0], "ap_setup_locked") == 0) { + wps_cfg_str_id = qcsapi_wps_ap_setup_locked; + } else if (strcmp(argv[0], "uuid") == 0) { + wps_cfg_str_id = qcsapi_wps_uuid; + } else if (strcmp(argv[0], "force_broadcast_uuid") == 0) { + wps_cfg_str_id = qcsapi_wps_force_broadcast_uuid; + } else if(strcmp(argv[0], "device_name") == 0){ + wps_cfg_str_id = qcsapi_wps_device_name; + } else if (strcmp(argv[0], "ap_pin_fail_method") == 0) { + wps_cfg_str_id = qcsapi_wps_ap_pin_fail_method; + } else if (strcmp(argv[0], "auto_lockdown_max_retry") == 0) { + wps_cfg_str_id = qcsapi_wps_auto_lockdown_max_retry; + } else if (strcmp(argv[0], "wps_vendor_spec") == 0) { + wps_cfg_str_id = qcsapi_wps_vendor_spec; + } else if (strcmp(argv[0], "serial_number") == 0) { + wps_cfg_str_id = qcsapi_wps_serial_number; + } else if (strcmp(argv[0], "manufacturer") == 0) { + wps_cfg_str_id = qcsapi_wps_manufacturer; + } else if (strcmp(argv[0], "model_name") == 0) { + wps_cfg_str_id = qcsapi_wps_model_name; + } else if (strcmp(argv[0], "model_number") == 0) { + wps_cfg_str_id = qcsapi_wps_model_number; + } else if (strcmp(argv[0], "pbc_in_m1") == 0) { + wps_cfg_str_id = qcsapi_wps_pbc_in_m1; + } else { + print_err(print, "WPS param type string input error or not supported!\n"); + return statval; + } + } else { + print_err(print, "Input WPS param type string and param value!\n"); + return statval; + } + + qcsapi_retval = qcsapi_wps_set_param(the_interface, wps_cfg_str_id, argv[1]); + + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out(print, "complete\n"); + } + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } + + return statval; +} + +static int +call_qcsapi_wps_set_configured_state(call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[]) +{ + const char *interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + uint8_t new_value; + int qcsapi_retval; + + if (argc < 1) { + print_err( print, "New WPS state argument required"); + return 1; + } + + new_value = (uint8_t) atoi(argv[0]); + + qcsapi_retval = qcsapi_wps_set_configured_state(interface, new_value); + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out( print, "complete\n"); + } + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + return 1; + } + + return 0; +} + +static int +call_qcsapi_wifi_set_dwell_times( call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[] ) +{ + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + int qcsapi_retval; + unsigned int max_dwell_time_active_chan; + unsigned int min_dwell_time_active_chan; + unsigned int max_dwell_time_passive_chan; + unsigned int min_dwell_time_passive_chan; + int statval = 0; + + if (argc < 4) { + print_err( print, "STA Set Dwell Times requires 4 dwell times\n" ); + return(1); + } + + max_dwell_time_active_chan = (unsigned int) atoi(argv[0]); + min_dwell_time_active_chan = (unsigned int) atoi(argv[1]); + max_dwell_time_passive_chan = (unsigned int) atoi(argv[2]); + min_dwell_time_passive_chan = (unsigned int) atoi(argv[3]); + + qcsapi_retval = qcsapi_wifi_set_dwell_times(the_interface, + max_dwell_time_active_chan, + min_dwell_time_active_chan, + max_dwell_time_passive_chan, + min_dwell_time_passive_chan); + + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out( print, "complete\n" ); + } + } else { + report_qcsapi_error( p_calling_bundle, qcsapi_retval ); + statval = 1; + } + + return( statval ); +} + +static int +call_qcsapi_wifi_get_dwell_times( call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[] ) +{ + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + int qcsapi_retval; + unsigned int max_dwell_time_active_chan; + unsigned int min_dwell_time_active_chan; + unsigned int max_dwell_time_passive_chan; + unsigned int min_dwell_time_passive_chan; + int statval = 0; + + qcsapi_retval = qcsapi_wifi_get_dwell_times(the_interface, + &max_dwell_time_active_chan, + &min_dwell_time_active_chan, + &max_dwell_time_passive_chan, + &min_dwell_time_passive_chan); + + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out( print, "%d %d %d %d\n", + max_dwell_time_active_chan, + min_dwell_time_active_chan, + max_dwell_time_passive_chan, + min_dwell_time_passive_chan); + } + } else { + report_qcsapi_error( p_calling_bundle, qcsapi_retval ); + statval = 1; + } + + return( statval ); +} + +static int +call_qcsapi_wifi_set_bgscan_dwell_times( call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[] ) +{ + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + int qcsapi_retval; + unsigned int dwell_time_active_chan; + unsigned int dwell_time_passive_chan; + int statval = 0; + + if (argc < 2) { + print_err( print, "STA Set BGScan Dwell Times requires 2 dwell times\n" ); + return(1); + } + + dwell_time_active_chan = (unsigned int) atoi(argv[0]); + dwell_time_passive_chan = (unsigned int) atoi(argv[1]); + + qcsapi_retval = qcsapi_wifi_set_bgscan_dwell_times(the_interface, + dwell_time_active_chan, dwell_time_passive_chan); + + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out( print, "complete\n" ); + } + } else { + report_qcsapi_error( p_calling_bundle, qcsapi_retval ); + statval = 1; + } + + return( statval ); +} + +static int +call_qcsapi_wifi_get_bgscan_dwell_times( call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[] ) +{ + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + int qcsapi_retval; + unsigned int dwell_time_active_chan; + unsigned int dwell_time_passive_chan; + int statval = 0; + + qcsapi_retval = qcsapi_wifi_get_bgscan_dwell_times(the_interface, + &dwell_time_active_chan, &dwell_time_passive_chan); + + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out( print, "%d %d\n", + dwell_time_active_chan, dwell_time_passive_chan); + } + } else { + report_qcsapi_error( p_calling_bundle, qcsapi_retval ); + statval = 1; + } + + return( statval ); +} + +static int +call_qcsapi_wifi_get_count_associations( call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[] ) +{ + int statval = 0; + qcsapi_unsigned_int association_count, *p_association_count = NULL; + int qcsapi_retval; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + + if (argc < 1 || strcmp( argv[ 0 ], "NULL" ) != 0) + p_association_count = &association_count; + qcsapi_retval = qcsapi_wifi_get_count_associations( the_interface, p_association_count ); + if (qcsapi_retval >= 0) + { + if (verbose_flag >= 0) + { + print_out( print, "%u\n", (unsigned int) association_count ); + } + } + else + { + report_qcsapi_error( p_calling_bundle, qcsapi_retval ); + statval = 1; + } + + return( statval ); +} + +static int +call_qcsapi_wifi_get_associated_device_mac_addr( call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[] ) +{ + int statval = 0; + qcsapi_mac_addr the_mac_addr; + int qcsapi_retval; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_unsigned_int device_index = p_calling_bundle->caller_generic_parameter.index; + + if (argc > 0 && strcmp( argv[ 0 ], "NULL" ) == 0) + qcsapi_retval = qcsapi_wifi_get_associated_device_mac_addr( the_interface, device_index, NULL ); + else + qcsapi_retval = qcsapi_wifi_get_associated_device_mac_addr( the_interface, device_index, the_mac_addr ); + if (qcsapi_retval >= 0) + { + if (verbose_flag >= 0) + { + dump_mac_addr(p_calling_bundle->caller_output, the_mac_addr ); + } + } + else + { + report_qcsapi_error( p_calling_bundle, qcsapi_retval ); + statval = 1; + } + + return( statval ); +} + +static int +call_qcsapi_wifi_get_associated_device_ip_addr(call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[]) +{ + int statval = 0; + unsigned int ip_addr = 0; + char ip_str[IP_ADDR_STR_LEN + 1]; + int qcsapi_retval; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_unsigned_int device_index = p_calling_bundle->caller_generic_parameter.index; + qcsapi_output *print = p_calling_bundle->caller_output; + + if (argc > 0 && strcmp(argv[0], "NULL") == 0) + qcsapi_retval = qcsapi_wifi_get_associated_device_ip_addr(the_interface, device_index, NULL); + else + qcsapi_retval = qcsapi_wifi_get_associated_device_ip_addr(the_interface, device_index, &ip_addr); + + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + inet_ntop(AF_INET, &ip_addr, ip_str, IP_ADDR_STR_LEN); + print_out(print, "%s\n", ip_str); + } + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } + + return(statval); +} + +static int +call_qcsapi_wifi_get_link_quality( call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[] ) +{ + int statval = 0; + qcsapi_unsigned_int link_quality, *p_link_quality = NULL; + int qcsapi_retval; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + qcsapi_unsigned_int association_index = p_calling_bundle->caller_generic_parameter.index; + + if (argc < 1 || strcmp( argv[ 0 ], "NULL" ) != 0) + p_link_quality = &link_quality; + qcsapi_retval = qcsapi_wifi_get_link_quality( the_interface, association_index, p_link_quality ); + if (qcsapi_retval >= 0) + { + if (verbose_flag >= 0) + { + print_out( print, "%u\n", link_quality ); + } + } + else + { + report_qcsapi_error( p_calling_bundle, qcsapi_retval ); + statval = 1; + } + + return( statval ); +} + +static int +call_qcsapi_wifi_get_rssi_per_association( call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[] ) +{ + int statval = 0; + qcsapi_unsigned_int rssi, *p_rssi = NULL; + int qcsapi_retval; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + qcsapi_unsigned_int association_index = p_calling_bundle->caller_generic_parameter.index; + + if (argc < 1 || strcmp( argv[ 0 ], "NULL" ) != 0) + p_rssi = &rssi; + qcsapi_retval = qcsapi_wifi_get_rssi_per_association( the_interface, association_index, p_rssi ); + if (qcsapi_retval >= 0) + { + if (verbose_flag >= 0) + { + print_out( print, "%u\n", rssi ); + } + } + else + { + report_qcsapi_error( p_calling_bundle, qcsapi_retval ); + statval = 1; + } + + return( statval ); +} + +static int +call_qcsapi_wifi_get_rssi_in_dbm_per_association( call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[] ) +{ + int statval = 0; + int rssi, *p_rssi = NULL; + int qcsapi_retval; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_unsigned_int association_index = p_calling_bundle->caller_generic_parameter.index; + qcsapi_output *print = p_calling_bundle->caller_output; + + if (argc < 1 || strcmp( argv[ 0 ], "NULL" ) != 0) { + p_rssi = &rssi; + } + + qcsapi_retval = qcsapi_wifi_get_rssi_in_dbm_per_association( the_interface, association_index, p_rssi ); + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out( print, "%d\n", rssi ); + } + } else { + report_qcsapi_error( p_calling_bundle, qcsapi_retval ); + statval = 1; + } + + return( statval ); +} + +static int +call_qcsapi_wifi_get_snr_per_association( call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[] ) +{ + int statval = 0; + int snr, *p_snr = NULL; + int qcsapi_retval; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_unsigned_int association_index = p_calling_bundle->caller_generic_parameter.index; + qcsapi_output *print = p_calling_bundle->caller_output; + + if (argc < 1 || strcmp( argv[ 0 ], "NULL" ) != 0) + p_snr = &snr; + qcsapi_retval = qcsapi_wifi_get_snr_per_association( the_interface, association_index, p_snr ); + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out( print, "%d\n", snr ); + } + } else { + report_qcsapi_error( p_calling_bundle, qcsapi_retval ); + statval = 1; + } + + return( statval ); +} + +static int +call_qcsapi_wifi_get_hw_noise_per_association( call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[] ) +{ + int statval = 0; + int hw_noise; + int qcsapi_retval; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + qcsapi_unsigned_int association_index = p_calling_bundle->caller_generic_parameter.index; + + qcsapi_retval = qcsapi_wifi_get_hw_noise_per_association( the_interface, association_index, &hw_noise ); + if (qcsapi_retval >= 0) + { + if (verbose_flag >= 0) + { + print_out( print, "%d.%d\n", hw_noise/10, abs(hw_noise%10) ); + } + } + else + { + report_qcsapi_error( p_calling_bundle, qcsapi_retval ); + statval = 1; + } + + return( statval ); +} + +static int +call_qcsapi_wifi_get_rx_bytes_per_association( call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[] ) +{ + int statval = 0; + u_int64_t rx_bytes, *p_rx_bytes = NULL; + int qcsapi_retval; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + qcsapi_unsigned_int association_index = p_calling_bundle->caller_generic_parameter.index; + + if (argc < 1 || strcmp( argv[ 0 ], "NULL" ) != 0) + p_rx_bytes = &rx_bytes; + qcsapi_retval = qcsapi_wifi_get_rx_bytes_per_association( the_interface, association_index, p_rx_bytes ); + if (qcsapi_retval >= 0) + { + if (verbose_flag >= 0) + { + print_out( print, "%llu\n", rx_bytes ); + } + } + else + { + report_qcsapi_error( p_calling_bundle, qcsapi_retval ); + statval = 1; + } + + return( statval ); +} + +static int +call_qcsapi_wifi_get_tx_bytes_per_association( call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[] ) +{ + int statval = 0; + u_int64_t tx_bytes, *p_tx_bytes = NULL; + int qcsapi_retval; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + qcsapi_unsigned_int association_index = p_calling_bundle->caller_generic_parameter.index; + + if (argc < 1 || strcmp( argv[ 0 ], "NULL" ) != 0) + p_tx_bytes = &tx_bytes; + qcsapi_retval = qcsapi_wifi_get_tx_bytes_per_association( the_interface, association_index, p_tx_bytes ); + if (qcsapi_retval >= 0) + { + if (verbose_flag >= 0) + { + print_out( print, "%llu\n", tx_bytes ); + } + } + else + { + report_qcsapi_error( p_calling_bundle, qcsapi_retval ); + statval = 1; + } + + return( statval ); +} + +static int +call_qcsapi_wifi_get_rx_packets_per_association( call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[] ) +{ + int statval = 0; + qcsapi_unsigned_int rx_packets, *p_rx_packets = NULL; + int qcsapi_retval; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + qcsapi_unsigned_int association_index = p_calling_bundle->caller_generic_parameter.index; + + if (argc < 1 || strcmp( argv[ 0 ], "NULL" ) != 0) + p_rx_packets = &rx_packets; + + qcsapi_retval = qcsapi_wifi_get_rx_packets_per_association( the_interface, association_index, p_rx_packets ); + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out(print, "%u\n", rx_packets); + } + } else { + report_qcsapi_error( p_calling_bundle, qcsapi_retval ); + statval = 1; + } + + return( statval ); +} + +static int +call_qcsapi_wifi_get_tx_packets_per_association( call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[] ) +{ + int statval = 0; + qcsapi_unsigned_int tx_packets, *p_tx_packets = NULL; + int qcsapi_retval; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + qcsapi_unsigned_int association_index = p_calling_bundle->caller_generic_parameter.index; + + if (argc < 1 || strcmp( argv[ 0 ], "NULL" ) != 0) + p_tx_packets = &tx_packets; + qcsapi_retval = qcsapi_wifi_get_tx_packets_per_association( the_interface, association_index, p_tx_packets ); + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out(print, "%u\n", tx_packets); + } + } else { + report_qcsapi_error( p_calling_bundle, qcsapi_retval ); + statval = 1; + } + + return( statval ); +} + +static int +call_qcsapi_wifi_get_tx_err_packets_per_association( call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[] ) +{ + int statval = 0; + qcsapi_output *print = p_calling_bundle->caller_output; + qcsapi_unsigned_int tx_err_packets, *p_tx_err_packets = NULL; + int qcsapi_retval; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_unsigned_int association_index = p_calling_bundle->caller_generic_parameter.index; + + if (argc < 1 || strcmp( argv[ 0 ], "NULL" ) != 0) + p_tx_err_packets = &tx_err_packets; + + qcsapi_retval = qcsapi_wifi_get_tx_err_packets_per_association( the_interface, association_index, p_tx_err_packets ); + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out(print, "%u\n", tx_err_packets); + } + } else { + report_qcsapi_error( p_calling_bundle, qcsapi_retval ); + statval = 1; + } + + return( statval ); +} + +static int +call_qcsapi_wifi_get_bw_per_association( call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[] ) +{ + int statval = 0; + int qcsapi_retval; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + qcsapi_unsigned_int association_index = p_calling_bundle->caller_generic_parameter.index; + qcsapi_unsigned_int bw, *p_bw = NULL; + + if (argc < 1 || strcmp( argv[ 0 ], "NULL" ) != 0) + p_bw = &bw; + qcsapi_retval = qcsapi_wifi_get_bw_per_association( the_interface, association_index, p_bw ); + if (qcsapi_retval >= 0) + { + if (verbose_flag >= 0) + { + print_out( print, "%u\n", bw ); + } + } + else + { + report_qcsapi_error( p_calling_bundle, qcsapi_retval ); + statval = 1; + } + + return( statval ); +} + +static int +call_qcsapi_wifi_get_tx_phy_rate_per_association( call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[] ) +{ + int statval = 0; + qcsapi_unsigned_int tx_rate, *p_tx_rate = NULL; + qcsapi_output *print = p_calling_bundle->caller_output; + int qcsapi_retval; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_unsigned_int association_index = p_calling_bundle->caller_generic_parameter.index; + + if (argc < 1 || strcmp( argv[ 0 ], "NULL" ) != 0) + p_tx_rate = &tx_rate; + qcsapi_retval = qcsapi_wifi_get_tx_phy_rate_per_association( the_interface, association_index, p_tx_rate ); + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out(print, "%u\n", tx_rate); + } + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } + + return( statval ); +} + +static int +call_qcsapi_wifi_get_rx_phy_rate_per_association( call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[] ) +{ + int statval = 0; + qcsapi_unsigned_int rx_rate, *p_rx_rate = NULL; + qcsapi_output *print = p_calling_bundle->caller_output; + int qcsapi_retval; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_unsigned_int association_index = p_calling_bundle->caller_generic_parameter.index; + + if (argc < 1 || strcmp( argv[ 0 ], "NULL" ) != 0) + p_rx_rate = &rx_rate; + qcsapi_retval = qcsapi_wifi_get_rx_phy_rate_per_association( the_interface, association_index, p_rx_rate ); + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out(print, "%u\n", rx_rate); + } + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } + + return( statval ); +} + +static int +call_qcsapi_wifi_get_tx_mcs_per_association( call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[] ) +{ + int statval = 0; + qcsapi_unsigned_int tx_mcs; + qcsapi_output *print = p_calling_bundle->caller_output; + int qcsapi_retval; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_unsigned_int association_index = p_calling_bundle->caller_generic_parameter.index; + + qcsapi_retval = qcsapi_wifi_get_tx_mcs_per_association(the_interface, + association_index, &tx_mcs); + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) + print_out(print, "%u\n", tx_mcs); + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } + + return statval; +} + +static int +call_qcsapi_wifi_get_rx_mcs_per_association(call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[]) +{ + int statval = 0; + qcsapi_unsigned_int rx_mcs; + qcsapi_output *print = p_calling_bundle->caller_output; + int qcsapi_retval; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_unsigned_int association_index = p_calling_bundle->caller_generic_parameter.index; + + qcsapi_retval = qcsapi_wifi_get_rx_mcs_per_association(the_interface, + association_index, &rx_mcs); + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) + print_out(print, "%u\n", rx_mcs); + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } + + return statval; +} + +static int +call_qcsapi_wifi_get_achievable_tx_phy_rate_per_association( call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[] ) +{ + int statval = 0; + qcsapi_output *print = p_calling_bundle->caller_output; + qcsapi_unsigned_int achievable_tx_rate, *p_achievable_tx_rate = NULL; + int qcsapi_retval; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_unsigned_int association_index = p_calling_bundle->caller_generic_parameter.index; + + if (argc < 1 || strcmp( argv[ 0 ], "NULL" ) != 0) + p_achievable_tx_rate = &achievable_tx_rate; + + qcsapi_retval = qcsapi_wifi_get_achievable_tx_phy_rate_per_association( the_interface, association_index, p_achievable_tx_rate ); + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out(print, "%u\n", achievable_tx_rate); + } + } + else + { + report_qcsapi_error( p_calling_bundle, qcsapi_retval ); + statval = 1; + } + + return( statval ); +} + +static int +call_qcsapi_wifi_get_achievable_rx_phy_rate_per_association( call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[] ) +{ + int statval = 0; + qcsapi_output *print = p_calling_bundle->caller_output; + qcsapi_unsigned_int achievable_rx_rate, *p_achievable_rx_rate = NULL; + int qcsapi_retval; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_unsigned_int association_index = p_calling_bundle->caller_generic_parameter.index; + + if (argc < 1 || strcmp( argv[ 0 ], "NULL" ) != 0) + p_achievable_rx_rate = &achievable_rx_rate; + + qcsapi_retval = qcsapi_wifi_get_achievable_rx_phy_rate_per_association( the_interface, association_index, p_achievable_rx_rate ); + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out(print, "%u\n", achievable_rx_rate); + } + } else { + report_qcsapi_error( p_calling_bundle, qcsapi_retval ); + statval = 1; + } + + return( statval ); +} + +static int +call_qcsapi_wifi_get_auth_enc_per_association( call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[] ) +{ + int statval = 0; + qcsapi_output *print = p_calling_bundle->caller_output; + int qcsapi_retval; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_unsigned_int association_index = p_calling_bundle->caller_generic_parameter.index; + qcsapi_unsigned_int auth_enc; + uint8_t *casted_ptr = (uint8_t*)&auth_enc; + + qcsapi_retval = qcsapi_wifi_get_auth_enc_per_association( the_interface, association_index, &auth_enc ); + if (qcsapi_retval >= 0) { + if (casted_ptr[IEEE80211_AUTHDESCR_ALGO_POS] >= ARRAY_SIZE(qcsapi_auth_algo_list) || + casted_ptr[IEEE80211_AUTHDESCR_KEYMGMT_POS] >= ARRAY_SIZE(qcsapi_auth_keymgmt_list) || + casted_ptr[IEEE80211_AUTHDESCR_KEYPROTO_POS] >= ARRAY_SIZE(qcsapi_auth_keyproto_list) || + casted_ptr[IEEE80211_AUTHDESCR_CIPHER_POS] >= ARRAY_SIZE(qcsapi_auth_cipher_list)) { + + print_err(print, "error:unknown auth enc value \"%08X\"\n", auth_enc); + return 1; + } + + if (verbose_flag >= 0) { + if (casted_ptr[IEEE80211_AUTHDESCR_KEYPROTO_POS]) { + print_out(print, "%s/%s with %s\n", + qcsapi_auth_keyproto_list[casted_ptr[IEEE80211_AUTHDESCR_KEYPROTO_POS]], + qcsapi_auth_keymgmt_list[casted_ptr[IEEE80211_AUTHDESCR_KEYMGMT_POS]], + qcsapi_auth_cipher_list[casted_ptr[IEEE80211_AUTHDESCR_CIPHER_POS]]); + } else { + print_out(print, "%s/%s\n", + qcsapi_auth_algo_list[casted_ptr[IEEE80211_AUTHDESCR_ALGO_POS]], + qcsapi_auth_keymgmt_list[casted_ptr[IEEE80211_AUTHDESCR_KEYMGMT_POS]]); + } + } + } else { + report_qcsapi_error( p_calling_bundle, qcsapi_retval ); + statval = 1; + } + + return statval; +} + +static int +call_qcsapi_wifi_get_vendor_per_association( call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[] ) +{ + int statval = 0; + qcsapi_output *print = p_calling_bundle->caller_output; + int qcsapi_retval; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_unsigned_int association_index = p_calling_bundle->caller_generic_parameter.index; + qcsapi_unsigned_int vendor; + + qcsapi_retval = qcsapi_wifi_get_vendor_per_association(the_interface, association_index, &vendor); + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + switch (vendor) { + case PEER_VENDOR_QTN: + print_out(print, "quantenna\n"); + break; + case PEER_VENDOR_BRCM: + print_out(print, "broadcom\n"); + break; + case PEER_VENDOR_ATH: + print_out(print, "atheros\n"); + break; + case PEER_VENDOR_RLNK: + print_out(print, "ralink\n"); + break; + case PEER_VENDOR_RTK: + print_out(print, "realtek\n"); + break; + case PEER_VENDOR_INTEL: + print_out(print, "intel\n"); + break; + default: + print_out(print, "unknown\n"); + break; + } + } + } else { + report_qcsapi_error( p_calling_bundle, qcsapi_retval ); + statval = 1; + } + return( statval ); +} + +static int +call_qcsapi_wifi_get_max_mimo( call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[] ) +{ + int statval = 0; + qcsapi_output *print = p_calling_bundle->caller_output; + int qcsapi_retval; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_unsigned_int association_index = p_calling_bundle->caller_generic_parameter.index; + string_16 max_mimo; + + qcsapi_retval = qcsapi_wifi_get_max_mimo(the_interface, association_index, max_mimo); + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out(print, "%s\n", max_mimo); + } + } else { + report_qcsapi_error( p_calling_bundle, qcsapi_retval ); + statval = 1; + } + return statval; +} + +static int +call_qcsapi_wifi_get_tput_caps(call_qcsapi_bundle *p_calling_bundle, + int argc, char *argv[]) +{ + int statval = 0; + qcsapi_output *print = p_calling_bundle->caller_output; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_unsigned_int association_index = p_calling_bundle->caller_generic_parameter.index; + int qcsapi_retval; + struct ieee8011req_sta_tput_caps tput_caps; + struct ieee80211_ie_vhtcap *ie_vhtcap; + struct ieee80211_ie_htcap *ie_htcap; + + qcsapi_retval = qcsapi_wifi_get_tput_caps(the_interface, association_index, &tput_caps); + + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + switch (tput_caps.mode) { + case IEEE80211_WIFI_MODE_AC: + print_out(print, "Mode: VHT\n"); + ie_vhtcap = (struct ieee80211_ie_vhtcap*)tput_caps.vhtcap_ie; + + print_out(print, "VHT Capabilities Info: "); + dump_data_array(print, ie_vhtcap->vht_cap, + sizeof(ie_vhtcap->vht_cap), 16, ' '); + + print_out(print, "Supported VHT MCS & NSS Set: "); + dump_data_array(print, ie_vhtcap->vht_mcs_nss_set, + sizeof(ie_vhtcap->vht_mcs_nss_set), 16, ' '); + /* Fall through */ + case IEEE80211_WIFI_MODE_NA: + /* Fall through */ + case IEEE80211_WIFI_MODE_NG: + if (tput_caps.mode != IEEE80211_WIFI_MODE_AC) { + print_out(print, "Mode: HT\n"); + } + ie_htcap = (struct ieee80211_ie_htcap*)tput_caps.htcap_ie; + + print_out(print, "HT Capabilities Info: "); + dump_data_array(print, ie_htcap->hc_cap, + sizeof(ie_htcap->hc_cap), 16, ' '); + + print_out(print, "A-MPDU Parameters: %02X\n", ie_htcap->hc_ampdu); + + print_out(print, "Supported MCS Set: "); + dump_data_array(print, ie_htcap->hc_mcsset, + sizeof(ie_htcap->hc_mcsset), 16, ' '); + + print_out(print, "HT Extended Capabilities: "); + dump_data_array(print, ie_htcap->hc_extcap, + sizeof(ie_htcap->hc_extcap), 16, ' '); + + print_out(print, "Transmit Beamforming Capabilities: "); + dump_data_array(print, ie_htcap->hc_txbf, + sizeof(ie_htcap->hc_txbf), 16, ' '); + + print_out(print, "ASEL Capabilities: %02X\n", ie_htcap->hc_antenna); + break; + default: + print_out(print, "Mode: non HT\n"); + break; + } + } + } else { + report_qcsapi_error( p_calling_bundle, qcsapi_retval ); + statval = 1; + } + return statval; +} + +static int +call_qcsapi_wifi_get_connection_mode(call_qcsapi_bundle *p_calling_bundle, + int argc, char *argv[]) +{ + int statval = 0; + qcsapi_output *print = p_calling_bundle->caller_output; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_unsigned_int association_index = p_calling_bundle->caller_generic_parameter.index; + int qcsapi_retval; + qcsapi_unsigned_int connection_mode; + + qcsapi_retval = qcsapi_wifi_get_connection_mode(the_interface, + association_index, + &connection_mode); + + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + if (connection_mode >= IEEE80211_WIFI_MODE_MAX) { + connection_mode = IEEE80211_WIFI_MODE_NONE; + } + print_out(print, "%s\n", qcsapi_wifi_modes_strings[connection_mode]); + } + } else { + report_qcsapi_error( p_calling_bundle, qcsapi_retval ); + statval = 1; + } + return statval; +} + +static int +call_qcsapi_wifi_get_node_counter(call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[]) +{ + int statval = 0; + int qcsapi_retval; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + qcsapi_unsigned_int node_index = p_calling_bundle->caller_generic_parameter.index; + qcsapi_counter_type counter_type = QCSAPI_NOSUCH_COUNTER; + int local_remote_flag = QCSAPI_LOCAL_NODE; + uint64_t counter_value = 0; + uint64_t *p_counter_value = &counter_value; + + if (argc < 1) { + print_err(print, "Get Counter Per Association: type of counter required\n"); + return 1; + } + + if (name_to_counter_enum(argv[0], &counter_type ) == 0) { + print_err(print, "No such counter type %s\n", argv[0]); + return 1; + } + + if (argc > 1) { + if (parse_local_remote_flag(print, argv[1], &local_remote_flag) < 0) { + return 1; + } + } + + if (argc > 2 && strcmp(argv[2], "NULL" ) == 0) { + p_counter_value = NULL; + } + + qcsapi_retval = qcsapi_wifi_get_node_counter(the_interface, + node_index, + counter_type, + local_remote_flag, + p_counter_value); + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out(print, "%llu\n", counter_value); + } + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } + + return statval; +} + +static int parse_measure_request_param(qcsapi_measure_request_param *param, + qcsapi_output *print, qcsapi_per_assoc_param type, int argc, char *argv[]) +{ + int i; + int ret; + int qualified; + int pre_len; + int bad_format = 0; + int mac[6]; + + ret = 0; + qualified = 0; + switch (type) { + case QCSAPI_NODE_MEAS_BASIC: + { + for (i = 0; i < argc; i++) { + if ((strncmp(argv[i], "ch=", (pre_len = strlen("ch="))) == 0) && + (strlen(argv[i]) > pre_len)) { + param->basic.channel = atoi(argv[i] + pre_len); + } else if ((strncmp(argv[i], "off=", (pre_len = strlen("off="))) == 0) && + (strlen(argv[i]) > pre_len)) { + param->basic.offset = atoi(argv[i] + pre_len); + } else if ((strncmp(argv[i], "du=", (pre_len = strlen("du="))) == 0) && + (strlen(argv[i]) > pre_len)) { + param->basic.duration = atoi(argv[i] + pre_len); + qualified++; + } else { + print_err(print, "error:unknown parameter \"%s\"\n", argv[i]); + bad_format = 1; + break; + } + } + + if (!qualified || bad_format) { + print_out(print, "basic measurement param:\n" + " [ch=channel] " + "[off=offset to start measuremnt]\n"); + ret = 1; + } + break; + } + case QCSAPI_NODE_MEAS_CCA: + { + for (i = 0; i < argc; i++) { + if ((strncmp(argv[i], "ch=", (pre_len = strlen("ch="))) == 0) && + (strlen(argv[i]) > pre_len)) { + param->cca.channel = atoi(argv[i] + pre_len); + } else if ((strncmp(argv[i], "off=", (pre_len = strlen("off="))) == 0) && + (strlen(argv[i]) > pre_len)) { + param->cca.offset = atoi(argv[i] + pre_len); + } else if ((strncmp(argv[i], "du=", (pre_len = strlen("du="))) == 0) && + (strlen(argv[i]) > pre_len)) { + param->cca.duration = atoi(argv[i] + pre_len); + qualified++; + } else { + print_err(print, "error:unknown parameter \"%s\"\n", argv[i]); + bad_format = 1; + break; + } + } + + if (!qualified || bad_format) { + print_out(print, "cca measurement param:\n" + " [ch=channel] " + "[off=offset to start measuremnt]\n"); + ret = 1; + } + break; + } + case QCSAPI_NODE_MEAS_RPI: + { + for (i = 0; i < argc; i++) { + if ((strncmp(argv[i], "ch=", (pre_len = strlen("ch="))) == 0) && + (strlen(argv[i]) > pre_len)) { + param->rpi.channel = atoi(argv[i] + pre_len); + } else if ((strncmp(argv[i], "off=", (pre_len = strlen("off="))) == 0) && + (strlen(argv[i]) > pre_len)) { + param->rpi.offset = atoi(argv[i] + pre_len); + } else if ((strncmp(argv[i], "du=", (pre_len = strlen("du="))) == 0) && + (strlen(argv[i]) > pre_len)) { + param->rpi.duration = atoi(argv[i] + pre_len); + qualified++; + } else { + print_err(print, "error:unknown parameter \"%s\"\n", argv[i]); + bad_format = 1; + } + } + + if (!qualified || bad_format) { + print_out(print, "rpi measurement param:\n" + " [ch=channel] " + "[off=offset to start measuremnt]\n"); + ret = 1; + } + break; + } + case QCSAPI_NODE_MEAS_CHAN_LOAD: + { + for (i = 0; i < argc; i++) { + if ((strncmp(argv[i], "ch=", (pre_len = strlen("ch="))) == 0) && + (strlen(argv[i]) > pre_len)) { + param->chan_load.channel = atoi(argv[i] + pre_len); + } else if ((strncmp(argv[i], "op=", (pre_len = strlen("op="))) == 0) && + (strlen(argv[i]) > pre_len)) { + param->chan_load.op_class = atoi(argv[i] + pre_len); + } else if ((strncmp(argv[i], "du=", (pre_len = strlen("du="))) == 0) && + (strlen(argv[i]) > pre_len)) { + param->chan_load.duration = atoi(argv[i] + pre_len); + qualified++; + } else { + print_err(print, "error:unknown parameter \"%s\"\n", argv[i]); + bad_format = 1; + break; + } + } + + if (!qualified || bad_format) { + print_out(print, "channel load measurement param:\n" + " [ch=channel] " + "[op=operating class]\n"); + ret = 1; + } + break; + } + case QCSAPI_NODE_MEAS_NOISE_HIS: + { + for (i = 0; i < argc; i++) { + if ((strncmp(argv[i], "ch=", (pre_len = strlen("ch="))) == 0) && + (strlen(argv[i]) > pre_len)) { + param->noise_his.channel = atoi(argv[i] + pre_len); + } else if ((strncmp(argv[i], "op=", (pre_len = strlen("op="))) == 0) && + (strlen(argv[i]) > pre_len)) { + param->noise_his.op_class = atoi(argv[i] + pre_len); + } else if ((strncmp(argv[i], "du=", (pre_len = strlen("du="))) == 0) && + (strlen(argv[i]) > pre_len)) { + param->noise_his.duration = atoi(argv[i] + pre_len); + qualified++; + } else { + print_err(print, "error:unknown parameter \"%s\"\n", argv[i]); + bad_format = 1; + break; + } + } + + if (!qualified || bad_format) { + print_out(print, "noise histogram measurement param:\n" + " [ch=channel] " + "[op=operating class]\n"); + ret = 1; + } + break; + } + case QCSAPI_NODE_MEAS_BEACON: + { + for (i = 0; i < argc; i++) { + if ((strncmp(argv[i], "ch=", (pre_len = strlen("ch="))) == 0) && + (strlen(argv[i]) > pre_len)) { + param->beacon.channel = atoi(argv[i] + pre_len); + } else if ((strncmp(argv[i], "op=", (pre_len = strlen("op="))) == 0) && + (strlen(argv[i]) > pre_len)) { + param->beacon.op_class = atoi(argv[i] + pre_len); + } else if ((strncmp(argv[i], "du=", (pre_len = strlen("du="))) == 0) && + (strlen(argv[i]) > pre_len)) { + param->beacon.duration = atoi(argv[i] + pre_len); + qualified++; + } else if ((strncmp(argv[i], "mode=", (pre_len = strlen("mode="))) == 0) && + (strlen(argv[i]) > pre_len)) { + param->beacon.mode = atoi(argv[i] + pre_len); + } else { + bad_format = 1; + print_err(print, "error:unknown parameter \"%s\"\n", argv[i]); + break; + } + } + + if (!qualified || bad_format) { + print_out(print, "beacon measurement param:\n" + " [ch=channel] " + "[mode=beacon measurement mode][op=operating class]\n"); + ret = 1; + } + break; + } + case QCSAPI_NODE_MEAS_FRAME: + { + int cnt; + + for (i = 0; i < argc; i++) { + if ((strncmp(argv[i], "ch=", (pre_len = strlen("ch="))) == 0) && + (strlen(argv[i]) > pre_len)) { + param->frame.channel = atoi(argv[i] + pre_len); + } else if ((strncmp(argv[i], "op=", (pre_len = strlen("op="))) == 0) && + (strlen(argv[i]) > pre_len)) { + param->frame.op_class = atoi(argv[i] + pre_len); + } else if ((strncmp(argv[i], "du=", (pre_len = strlen("du="))) == 0) && + (strlen(argv[i]) > pre_len)) { + param->frame.duration = atoi(argv[i] + pre_len); + qualified++; + } else if ((strncmp(argv[i], "type=", (pre_len = strlen("type="))) == 0) && + (strlen(argv[i]) > pre_len)) { + param->frame.type = atoi(argv[i] + pre_len); + qualified++; + } else if ((strncmp(argv[i], "mac=", (pre_len = strlen("mac="))) == 0) && + (strlen(argv[i]) > pre_len)) { + if (sscanf(argv[i] + pre_len, "%x:%x:%x:%x:%x:%x", &mac[0], + &mac[1], + &mac[2], + &mac[3], + &mac[4], + &mac[5]) != 6){ + bad_format = 1; + break; + } + for (cnt = 0; cnt < 6; cnt++) + param->frame.mac_address[cnt] = (uint8_t)mac[cnt]; + } else { + bad_format = 1; + print_err(print, "error:unknown parameter \"%s\"\n", argv[i]); + break; + } + } + + if ((qualified < 2) || bad_format) { + print_out(print, "frame measurement param:\n" + "\n" + "\n" + "[ch=channel] [op=operating class] [mac=specified mac address]\n"); + ret = 1; + } + break; + } + case QCSAPI_NODE_MEAS_TRAN_STREAM_CAT: + { + int cnt; + + for (i = 0; i < argc; i++) { + if ((strncmp(argv[i], "tid=", (pre_len = strlen("tid="))) == 0) && + (strlen(argv[i]) > pre_len)) { + param->tran_stream_cat.tid = atoi(argv[i] + pre_len); + qualified++; + } else if ((strncmp(argv[i], "bin0=", (pre_len = strlen("bin0="))) == 0) && + (strlen(argv[i]) > pre_len)) { + param->tran_stream_cat.bin0 = atoi(argv[i] + pre_len); + } else if ((strncmp(argv[i], "du=", (pre_len = strlen("du="))) == 0) && + (strlen(argv[i]) > pre_len)) { + param->tran_stream_cat.duration = atoi(argv[i] + pre_len); + qualified++; + } else if ((strncmp(argv[i], "peer_sta=", (pre_len = strlen("peer_sta="))) == 0) && + (strlen(argv[i]) > pre_len)) { + if (sscanf(argv[i] + pre_len, "%x:%x:%x:%x:%x:%x", &mac[0], + &mac[1], + &mac[2], + &mac[3], + &mac[4], + &mac[5]) != 6) { + bad_format = 1; + break; + } + for (cnt = 0; cnt < 6; cnt++) + param->tran_stream_cat.peer_sta[cnt] = (uint8_t)mac[cnt]; + } else { + bad_format = 1; + print_err(print, "error:unknown parameter \"%s\"\n", argv[i]); + break; + } + } + + if ((qualified < 2) || bad_format) { + print_out(print, "transmit stream category measurement param:\n" + "\n" + "\n" + "[peer_sta=peer station mac address] [bin0=bin0 range]\n"); + ret = 1; + } + break; + } + case QCSAPI_NODE_MEAS_MULTICAST_DIAG: + { + int cnt; + + for (i = 0; i < argc; i++) { + if ((strncmp(argv[i], "du=", (pre_len = strlen("du="))) == 0) && + (strlen(argv[i]) > pre_len)) { + param->multicast_diag.duration = atoi(argv[i] + pre_len); + qualified++; + } else if ((strncmp(argv[i], "group_mac=", (pre_len = strlen("group_mac="))) == 0) && + (strlen(argv[i]) > pre_len)) { + if (sscanf(argv[i] + pre_len, "%x:%x:%x:%x:%x:%x", &mac[0], + &mac[1], + &mac[2], + &mac[3], + &mac[4], + &mac[5]) != 6) { + bad_format = 1; + break; + } + for (cnt = 0; cnt < 6; cnt++) + param->multicast_diag.group_mac[cnt] = (uint8_t)mac[cnt]; + qualified++; + } else { + bad_format = 1; + print_err(print, "error:unknown parameter \"%s\"\n", argv[i]); + break; + } + } + + if ((qualified < 2) || bad_format) { + print_out(print, "multicast diagnostic measurement param:\n" + "\n" + "\n"); + ret = 1; + } + break; + } + default: + break; + } + + return ret; +} + +static int +call_qcsapi_wifi_get_node_param(call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[]) +{ + int statval = 0; + int qcsapi_retval; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + qcsapi_unsigned_int node_index = p_calling_bundle->caller_generic_parameter.index; + qcsapi_per_assoc_param param_type = QCSAPI_NO_SUCH_PER_ASSOC_PARAM; + int local_remote_flag = QCSAPI_LOCAL_NODE; + string_128 input_param_str; + qcsapi_measure_request_param *request_param; + qcsapi_measure_report_result report_result; + int *p_param_value; + + if (argc < 1) { + print_err(print, "Get Parameter Per Association: type of parameter required\n"); + return 1; + } + + if (name_to_per_assoc_parameter(argv[0], ¶m_type) == 0) { + print_err(print, "No such parameter type %s\n", argv[0]); + return 1; + } + + if (argc > 1) { + if (parse_local_remote_flag(print, argv[1], &local_remote_flag) < 0) { + return 1; + } + } + + request_param = (qcsapi_measure_request_param *)input_param_str; + if (argc >= 2) { + argc -= 2; + argv += 2; + memset(request_param, 0, sizeof(*request_param)); + if (parse_measure_request_param(request_param, print, param_type, argc, argv)) { + return 1; + } + } + + memset(&report_result, 0, sizeof(report_result)); + qcsapi_retval = qcsapi_wifi_get_node_param(the_interface, + node_index, + param_type, + local_remote_flag, + input_param_str, + &report_result); + p_param_value = report_result.common; + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + switch (param_type) { + case QCSAPI_SOC_MAC_ADDR: + { + qcsapi_mac_addr the_mac_addr; + memcpy(the_mac_addr, p_param_value, sizeof(qcsapi_mac_addr)); + dump_mac_addr(print, the_mac_addr ); + break; + } + case QCSAPI_SOC_IP_ADDR: + print_out(print, "%d.%d.%d.%d\n", + ((char *)p_param_value)[0], ((char *)p_param_value)[1], + ((char *)p_param_value)[2], ((char *)p_param_value)[3]); + break; + case QCSAPI_NODE_MEAS_RPI: + dump_data_array(print, report_result.rpi, 8, 10, ' '); + break; + case QCSAPI_NODE_TPC_REP: + print_out(print, "link margin = %d db\n", report_result.tpc.link_margin); + print_out(print, "transmit power = %d dbm\n", report_result.tpc.tx_power); + break; + case QCSAPI_NODE_MEAS_NOISE_HIS: + { + int i; + + print_out(print, "anntenna id = %d\n", report_result.noise_histogram.antenna_id); + print_out(print, "anpi = %d\n", (0 - report_result.noise_histogram.anpi)); + for (i = 0; i < 11; i++) + print_out(print, "ipi%d:%d\n", i, report_result.noise_histogram.ipi[i]); + break; + } + case QCSAPI_NODE_MEAS_BEACON: + { + qcsapi_mac_addr the_mac_addr; + + print_out(print, "report frame info = %x\n", report_result.beacon.rep_frame_info); + print_out(print, "rcpi = %d\n", report_result.beacon.rcpi); + print_out(print, "rsni = %d\n", report_result.beacon.rsni); + print_out(print, "mac address:"); + memcpy(the_mac_addr, report_result.beacon.bssid, sizeof(qcsapi_mac_addr)); + dump_mac_addr(print, the_mac_addr ); + print_out(print, "antenna id = %d\n", report_result.beacon.antenna_id); + print_out(print, "parent_tsf = %d\n", report_result.beacon.parent_tsf); + break; + } + case QCSAPI_NODE_MEAS_FRAME: + { + qcsapi_mac_addr the_mac_addr; + + if (report_result.frame.sub_ele_report == 0) { + print_out(print, "no measurement result\n"); + } else { + print_out(print, "TA address:"); + memcpy(the_mac_addr, report_result.frame.ta, sizeof(qcsapi_mac_addr)); + dump_mac_addr(print, the_mac_addr ); + print_out(print, "BSSID:"); + memcpy(the_mac_addr, report_result.frame.bssid, sizeof(qcsapi_mac_addr)); + dump_mac_addr(print, the_mac_addr ); + print_out(print, "phy_type = %d\n", report_result.frame.phy_type); + print_out(print, "average RCPI = %d\n", report_result.frame.avg_rcpi); + print_out(print, "last RSNI = %d\n", report_result.frame.last_rsni); + print_out(print, "last RCPI = %d\n", report_result.frame.last_rcpi); + print_out(print, "antenna id = %d\n", report_result.frame.antenna_id); + print_out(print, "Frame count = %d\n", report_result.frame.frame_count); + } + break; + } + case QCSAPI_NODE_MEAS_TRAN_STREAM_CAT: + { + int i; + + print_out(print, "reason = %d\n", report_result.tran_stream_cat.reason); + print_out(print, "transmitted MSDU count = %d\n", report_result.tran_stream_cat.tran_msdu_cnt); + print_out(print, "MSDU Discarded Count = %d\n", report_result.tran_stream_cat.msdu_discard_cnt); + print_out(print, "MSDU Failed Count = %d\n", report_result.tran_stream_cat.msdu_fail_cnt); + print_out(print, "MSDU Multiple retry Count = %d\n", report_result.tran_stream_cat.msdu_mul_retry_cnt); + print_out(print, "MSDU Qos CF-Polls Lost Count = %d\n", report_result.tran_stream_cat.qos_lost_cnt); + print_out(print, "Average Queue Delay = %d\n", report_result.tran_stream_cat.avg_queue_delay); + print_out(print, "Average Transmit Delay = %d\n", report_result.tran_stream_cat.avg_tran_delay); + print_out(print, "Bin0 range = %d\n", report_result.tran_stream_cat.bin0_range); + for (i = 0; i < 6; i++) + print_out(print, "Bin%d = %d\n", i, report_result.tran_stream_cat.bins[i]); + break; + } + case QCSAPI_NODE_MEAS_MULTICAST_DIAG: + print_out(print, "reason = %d\n", report_result.multicast_diag.reason); + print_out(print, "Multicast Received MSDU Count = %d\n", report_result.multicast_diag.mul_rec_msdu_cnt); + print_out(print, "First Sequence Number = %d\n", report_result.multicast_diag.first_seq_num); + print_out(print, "Last Sequence Number = %d\n", report_result.multicast_diag.last_seq_num); + print_out(print, "Multicast Rate = %d\n", report_result.multicast_diag.mul_rate); + break; + case QCSAPI_NODE_LINK_MEASURE: + print_out(print, "transmit power = %d\n", report_result.link_measure.tpc_report.tx_power); + print_out(print, "link margin = %d\n", report_result.link_measure.tpc_report.link_margin); + print_out(print, "receive antenna id = %d\n", report_result.link_measure.recv_antenna_id); + print_out(print, "transmit antenna id = %d\n", report_result.link_measure.tran_antenna_id); + print_out(print, "RCPI = %d\n", report_result.link_measure.rcpi); + print_out(print, "RSNI = %d\n", report_result.link_measure.rsni); + break; + case QCSAPI_NODE_NEIGHBOR_REP: + { + uint8_t i; + qcsapi_mac_addr the_mac_addr; + + if (report_result.neighbor_report.item_num == 0) { + print_out(print, "no neighbor report\n"); + } else { + for (i = 0; i < report_result.neighbor_report.item_num; i++) { + print_out(print, "bssid="); + memcpy(the_mac_addr, report_result.neighbor_report.items[i].bssid, sizeof(qcsapi_mac_addr)); + dump_mac_addr(print, the_mac_addr); + print_out(print, "BSSID Info = 0x%x\n", report_result.neighbor_report.items[i].bssid_info); + print_out(print, "operating class = %d\n", report_result.neighbor_report.items[i].operating_class); + print_out(print, "channel = %d\n", report_result.neighbor_report.items[i].channel); + print_out(print, "phy_type = %d\n", report_result.neighbor_report.items[i].phy_type); + } + } + } + break; + default: + print_out(print, "%d\n", *p_param_value); + break; + } + } + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } + + return statval; +} + +static int +call_qcsapi_wifi_get_node_stats(call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[]) +{ + int statval = 0; + int qcsapi_retval; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + qcsapi_unsigned_int node_index = p_calling_bundle->caller_generic_parameter.index; + int local_remote_flag = QCSAPI_LOCAL_NODE; + struct qcsapi_node_stats node_stats, *p_node_stats = &node_stats; + + memset(&node_stats, 0, sizeof(node_stats)); + + if (argc > 0) { + if (parse_local_remote_flag(print, argv[0], &local_remote_flag) < 0) { + return 1; + } + } + + if (argc > 1 && strcmp(argv[1], "NULL" ) == 0) { + p_node_stats = NULL; + } + + qcsapi_retval = qcsapi_wifi_get_node_stats(the_interface, + node_index, + local_remote_flag, + p_node_stats); + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + if (node_stats.snr < 0) { + node_stats.snr = (node_stats.snr - QCSAPI_RSSI_OR_SNR_NZERO_CORRECT_VALUE) / QCSAPI_RSSI_OR_SNR_FACTOR; + } else { + node_stats.snr = (node_stats.snr + QCSAPI_RSSI_OR_SNR_NZERO_CORRECT_VALUE) / QCSAPI_RSSI_OR_SNR_FACTOR; + } + node_stats.snr = (0 - node_stats.snr); + + if (node_stats.rssi < 0) { + node_stats.rssi = 0; + } else { + node_stats.rssi = (qcsapi_unsigned_int)(node_stats.rssi + + QCSAPI_RSSI_OR_SNR_NZERO_CORRECT_VALUE) / QCSAPI_RSSI_OR_SNR_FACTOR; + } + + print_out(print, "tx_bytes:\t%llu\n" + "tx_pkts:\t%lu\n" + "tx_discard:\t%lu\n" + "tx_err:\t\t%lu\n" + "tx_unicast:\t%lu\n" + "tx_multicast:\t%lu\n" + "tx_broadcast:\t%lu\n" + "tx_phy_rate:\t%lu\n" + "rx_bytes:\t%llu\n" + "rx_pkts:\t%lu\n" + "rx_discard:\t%lu\n" + "rx_err:\t\t%lu\n" + "rx_unicast:\t%lu\n" + "rx_multicast:\t%lu\n" + "rx_broadcast:\t%lu\n" + "rx_unknown:\t%lu\n" + "rx_phy_rate:\t%lu\n" + "mac_addr:\t%.2x:%.2x:%.2x:%.2x:%.2x:%.2x\n" + "hw_noise:\t%d.%d\n" + "snr:\t\t%d\n" + "rssi:\t\t%d\n" + "bw:\t\t%d\n" + , + node_stats.tx_bytes, + node_stats.tx_pkts, + node_stats.tx_discard, + node_stats.tx_err, + node_stats.tx_unicast, + node_stats.tx_multicast, + node_stats.tx_broadcast, + node_stats.tx_phy_rate, + node_stats.rx_bytes, + node_stats.rx_pkts, + node_stats.rx_discard, + node_stats.rx_err, + node_stats.rx_unicast, + node_stats.rx_multicast, + node_stats.rx_broadcast, + node_stats.rx_unknown, + node_stats.rx_phy_rate, + node_stats.mac_addr[0], + node_stats.mac_addr[1], + node_stats.mac_addr[2], + node_stats.mac_addr[3], + node_stats.mac_addr[4], + node_stats.mac_addr[5], + (node_stats.hw_noise/10), + abs(node_stats.hw_noise%10), + node_stats.snr, + node_stats.rssi, + node_stats.bw + ); + } + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } + + return statval; +} + +static int +call_qcsapi_wifi_get_max_queued(call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[]) +{ + int statval = 0; + int qcsapi_retval; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + uint32_t node_index = p_calling_bundle->caller_generic_parameter.index; + int local_remote_flag = QCSAPI_LOCAL_NODE; + int reset_flag = 0; + uint32_t max_queued, *p_max_queued = &max_queued; + + if (argc > 0) { + if (parse_local_remote_flag(print, argv[0], &local_remote_flag) < 0) { + return 1; + } + } + + if (argc > 1) { + if (!isdigit(*argv[1])) { + print_err(print, "Invalid format for reset flag\n", argv[1]); + return 1; + } else { + reset_flag = atoi(argv[1]); + } + } + + if (argc > 2 && strcmp(argv[2], "NULL") == 0) { + p_max_queued = NULL; + } + + qcsapi_retval = qcsapi_wifi_get_max_queued(the_interface, + node_index, + local_remote_flag, + reset_flag, + p_max_queued); + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out(print, "%d\n", max_queued); + } + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } + + return statval; +} + +static int +call_qcsapi_wifi_associate(call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[]) +{ + int statval = 0; + int qcsapi_retval; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + + if (argc < 1) { + print_err( print, "Not enough parameters in call qcsapi associate," + " count is %d\n", argc ); + statval = 1; + } else { + char *join_ssid = argv[0]; + + qcsapi_retval = qcsapi_wifi_associate(the_interface, join_ssid); + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out( print, "complete\n"); + } + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } + } + + return( statval ); +} + +static int +call_qcsapi_wifi_disassociate(call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[]) +{ + int statval = 0; + int qcsapi_retval; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + + qcsapi_retval = qcsapi_wifi_disassociate(the_interface); + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out( print, "complete\n"); + } + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } + + return( statval ); +} + +static int +call_qcsapi_wifi_disassociate_sta(call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[]) +{ + int statval = 1; + int qcsapi_retval; + const char* the_interface = p_calling_bundle->caller_interface; + qcsapi_output* print = p_calling_bundle->caller_output; + qcsapi_mac_addr mac_addr = {0}; + + if (argc < 1) { + print_err( print, "MAC address required to be passed as a parameter\n"); + } else { + qcsapi_retval = parse_mac_addr( argv[ 0 ], mac_addr ); + + if (qcsapi_retval >= 0) { + qcsapi_retval = qcsapi_wifi_disassociate_sta(the_interface, mac_addr); + if (qcsapi_retval >= 0) { + statval = 0; + + if (verbose_flag >= 0) { + print_out( print, "complete\n"); + } + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + } + } else { + print_out( print, "Error parsing MAC address %s\n", argv[ 0 ] ); + } + } + + return statval; +} + +static int +call_qcsapi_wifi_reassociate(call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[]) +{ + int statval = 0; + int qcsapi_retval; + const char* the_interface = p_calling_bundle->caller_interface; + qcsapi_output* print = p_calling_bundle->caller_output; + + qcsapi_retval = qcsapi_wifi_reassociate(the_interface); + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out(print, "complete\n"); + } + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } + + return statval; +} + +static int +call_qcsapi_SSID_create_SSID( call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[] ) +{ + int statval = 0; + int qcsapi_retval; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + + if (argc < 1) + { + print_err( print, "Not enough parameters in call qcsapi SSID create SSID, count is %d\n", argc ); + statval = 1; + } + else + { + char *new_SSID = argv[ 0 ]; + /* + * For create SSID, require the Force NULL address flag to be set, so NULL can be used as an SSID. + */ + if (((internal_flags & m_force_NULL_address) == m_force_NULL_address) && + (strcmp( argv[ 0 ], "NULL" ) == 0)) + new_SSID = NULL; + + qcsapi_retval = qcsapi_SSID_create_SSID( the_interface, new_SSID ); + if (qcsapi_retval >= 0) + { + if (verbose_flag >= 0) + { + print_out( print, "complete\n" ); + } + } + else + { + report_qcsapi_error( p_calling_bundle, qcsapi_retval ); + statval = 1; + } + } + + return( statval ); +} + +static int +call_qcsapi_SSID_remove_SSID(call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[]) +{ + int statval = 0; + int qcsapi_retval; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + + if (argc < 1) { + print_err(print, "Not enough parameters in call qcsapi SSID remove SSID, count is %d\n", argc); + statval = 1; + } else { + char *del_SSID = argv[0]; + /* + * For remove SSID, require the Force NULL address flag to be set, so NULL can be used as an SSID. + */ + if (((internal_flags & m_force_NULL_address) == m_force_NULL_address) && + (strcmp( argv[0], "NULL" ) == 0)) + del_SSID = NULL; + + qcsapi_retval = qcsapi_SSID_remove_SSID(the_interface, del_SSID); + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out(print, "complete\n"); + } + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } + } + + return (statval); +} + +static int +call_qcsapi_SSID_verify_SSID( call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[] ) +{ + int statval = 0; + int qcsapi_retval; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + + if (argc < 1) + { + print_err( print, "Not enough parameters in call qcsapi SSID verify SSID, count is %d\n", argc ); + statval = 1; + } + else + { + char *existing_SSID = argv[ 0 ]; + /* + * For verify SSID, require the Force NULL address flag to be set, so NULL can be used as an SSID. + */ + if (((internal_flags & m_force_NULL_address) == m_force_NULL_address) && + (strcmp( argv[ 0 ], "NULL" ) == 0)) + existing_SSID = NULL; + + qcsapi_retval = qcsapi_SSID_verify_SSID( the_interface, existing_SSID ); + if (qcsapi_retval >= 0) + { + if (verbose_flag >= 0) + { + print_out( print, "complete\n" ); + } + } + else + { + report_qcsapi_error( p_calling_bundle, qcsapi_retval ); + statval = 1; + } + } + + return( statval ); +} + +static int +call_qcsapi_SSID_rename_SSID( call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[] ) +{ + int statval = 0; + qcsapi_output *print = p_calling_bundle->caller_output; + + if (argc < 1) + { + print_err( print, "Not enough parameters in call qcsapi SSID rename SSID, count is %d\n", argc ); + statval = 1; + } + else + { + int qcsapi_retval; + char *new_SSID = argv[ 0 ]; + const char *the_interface = p_calling_bundle->caller_interface; + char *existing_SSID = p_calling_bundle->caller_generic_parameter.parameter_type.the_SSID; + /* + * For rename SSID, require the Force NULL address flag to be set, so NULL can be used as an SSID. + */ + if (((internal_flags & m_force_NULL_address) == m_force_NULL_address) && + (strcmp( existing_SSID, "NULL" ) == 0)) + existing_SSID = NULL; + if (((internal_flags & m_force_NULL_address) == m_force_NULL_address) && + (strcmp( new_SSID, "NULL" ) == 0)) + new_SSID = NULL; + + qcsapi_retval = qcsapi_SSID_rename_SSID( the_interface, existing_SSID, new_SSID ); + if (qcsapi_retval >= 0) + { + if (verbose_flag >= 0) + { + print_out( print, "complete\n" ); + } + } + else + { + report_qcsapi_error( p_calling_bundle, qcsapi_retval ); + statval = 1; + } + } + + return( statval ); +} + +#define DEFAULT_SSID_LIST_SIZE 2 +#define MAX_SSID_LIST_SIZE 10 + +static int +call_qcsapi_SSID_get_SSID_list( call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[] ) +{ + int statval = 0; + qcsapi_output *print = p_calling_bundle->caller_output; + + /* + * array_SSIDs has the space that receives the SSIDs from the API. + * Let this get as large as required, without affecting the integrity of the stack. + */ + static qcsapi_SSID array_ssids[MAX_SSID_LIST_SIZE]; + + int qcsapi_retval; + unsigned int iter; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_unsigned_int sizeof_list = DEFAULT_SSID_LIST_SIZE; + char *list_ssids[MAX_SSID_LIST_SIZE + 1]; + + if (argc > 0) { + if (!isdigit(*argv[0])) { + print_err(print, + "SSID Get List of (configured) SSIDs: size of list must be a numeric value\n"); + return 1; + } + + sizeof_list = atoi(argv[0]); + + if (sizeof_list > MAX_SSID_LIST_SIZE) { + print_err(print, + "SSID Get List of (configured) SSIDs: cannot exceed max list size of %d\n", + MAX_SSID_LIST_SIZE); + return 1; + } + } + + for (iter = 0; iter < sizeof_list; iter++) { + list_ssids[iter] = array_ssids[iter]; + *(list_ssids[iter]) = '\0'; + } + + qcsapi_retval = qcsapi_SSID_get_SSID_list(the_interface, sizeof_list, &list_ssids[0]); + + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + for (iter = 0; iter < sizeof_list; iter++) { + if ((list_ssids[iter] == NULL) || strlen(list_ssids[iter]) < 1) { + break; + } + + print_out(print, "%s\n", list_ssids[iter]); + } + } + } else { + report_qcsapi_error( p_calling_bundle, qcsapi_retval ); + statval = 1; + } + + return( statval ); +} + +static int +call_qcsapi_SSID_get_protocol( call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[] ) +{ + int statval = 0; + string_16 SSID_proto; + char *p_SSID_proto = NULL; + int qcsapi_retval; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + char *p_SSID = p_calling_bundle->caller_generic_parameter.parameter_type.the_SSID; + + if (((internal_flags & m_force_NULL_address) == m_force_NULL_address) && + (strcmp( p_SSID, "NULL" ) == 0)) + p_SSID = NULL; + if (argc < 1 || strcmp( argv[ 0 ], "NULL" ) != 0) + p_SSID_proto = &SSID_proto[ 0 ]; + qcsapi_retval = qcsapi_SSID_get_protocol( the_interface, p_SSID, p_SSID_proto ); + + if (qcsapi_retval >= 0) + { + if (verbose_flag >= 0) + { + print_out( print, "%s\n", &SSID_proto[ 0 ] ); + } + } + else + { + report_qcsapi_error( p_calling_bundle, qcsapi_retval ); + statval = 1; + } + + return( statval ); +} + +static int +call_qcsapi_SSID_get_encryption_modes( call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[] ) +{ + int statval = 0; + char encryption_modes[ 36 ], *p_encryption_modes = NULL; + int qcsapi_retval; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + char *p_SSID = p_calling_bundle->caller_generic_parameter.parameter_type.the_SSID; + + if (((internal_flags & m_force_NULL_address) == m_force_NULL_address) && + (strcmp( p_SSID, "NULL" ) == 0)) + p_SSID = NULL; + if (argc < 1 || strcmp( argv[ 0 ], "NULL" ) != 0) + p_encryption_modes = &encryption_modes[ 0 ]; + qcsapi_retval = qcsapi_SSID_get_encryption_modes( the_interface, p_SSID, p_encryption_modes ); + + if (qcsapi_retval >= 0) + { + if (verbose_flag >= 0) + { + print_out( print, "%s\n", &encryption_modes[ 0 ] ); + } + } + else + { + report_qcsapi_error( p_calling_bundle, qcsapi_retval ); + statval = 1; + } + + return( statval ); +} + +static int +call_qcsapi_SSID_get_group_encryption( call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[] ) +{ + int statval = 0; + char group_encryption[ 36 ], *p_group_encryption = NULL; + int qcsapi_retval; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + char *p_SSID = p_calling_bundle->caller_generic_parameter.parameter_type.the_SSID; + + if (((internal_flags & m_force_NULL_address) == m_force_NULL_address) && + (strcmp( p_SSID, "NULL" ) == 0)) + p_SSID = NULL; + if (argc < 1 || strcmp( argv[ 0 ], "NULL" ) != 0) + p_group_encryption = &group_encryption[ 0 ]; + qcsapi_retval = qcsapi_SSID_get_group_encryption( the_interface, p_SSID, p_group_encryption ); + + if (qcsapi_retval >= 0) + { + if (verbose_flag >= 0) + { + print_out( print, "%s\n", &group_encryption[ 0 ] ); + } + } + else + { + report_qcsapi_error( p_calling_bundle, qcsapi_retval ); + statval = 1; + } + + return( statval ); +} + +static int +call_qcsapi_SSID_get_authentication_mode( call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[] ) +{ + int statval = 0; + char authentication_mode[ 36 ], *p_authentication_mode = NULL; + int qcsapi_retval; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + char *p_SSID = p_calling_bundle->caller_generic_parameter.parameter_type.the_SSID; + + if (((internal_flags & m_force_NULL_address) == m_force_NULL_address) && + (strcmp( p_SSID, "NULL" ) == 0)) + p_SSID = NULL; + if (argc < 1 || strcmp( argv[ 0 ], "NULL" ) != 0) + p_authentication_mode = &authentication_mode[ 0 ]; + qcsapi_retval = qcsapi_SSID_get_authentication_mode( the_interface, p_SSID, p_authentication_mode ); + + if (qcsapi_retval >= 0) + { + if (verbose_flag >= 0) + { + print_out( print, "%s\n", &authentication_mode[ 0 ] ); + } + } + else + { + report_qcsapi_error( p_calling_bundle, qcsapi_retval ); + statval = 1; + } + + return( statval ); +} + +static int +call_qcsapi_SSID_set_protocol( call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[] ) +{ + int statval = 0; + qcsapi_output *print = p_calling_bundle->caller_output; + + if (argc < 1) + { + print_err( print, "Not enough parameters in call qcsapi SSID set protocol, count is %d\n", argc ); + statval = 1; + } + else + { + int qcsapi_retval; + const char *the_interface = p_calling_bundle->caller_interface; + char *p_SSID = p_calling_bundle->caller_generic_parameter.parameter_type.the_SSID; + char *p_SSID_proto = argv[ 0 ]; + + if (((internal_flags & m_force_NULL_address) == m_force_NULL_address) && + (strcmp( p_SSID, "NULL" ) == 0)) + p_SSID = NULL; + + /* SSID protocol will not be NULL ... */ + + if (strcmp( argv[ 0 ], "NULL" ) == 0) + p_SSID_proto = NULL; + qcsapi_retval = qcsapi_SSID_set_protocol( the_interface, p_SSID, p_SSID_proto ); + + if (qcsapi_retval >= 0) + { + if (verbose_flag >= 0) + { + print_out( print, "complete\n" ); + } + } + else + { + report_qcsapi_error( p_calling_bundle, qcsapi_retval ); + statval = 1; + } + } + + return( statval ); +} + +static int +call_qcsapi_SSID_set_encryption_modes( call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[] ) +{ + int statval = 0; + qcsapi_output *print = p_calling_bundle->caller_output; + + if (argc < 1) + { + print_err( print, "Not enough parameters in call qcsapi SSID set encryption modes, count is %d\n", argc ); + statval = 1; + } + else + { + int qcsapi_retval; + const char *the_interface = p_calling_bundle->caller_interface; + char *p_SSID = p_calling_bundle->caller_generic_parameter.parameter_type.the_SSID; + char *p_encryption_modes = argv[ 0 ]; + + if (((internal_flags & m_force_NULL_address) == m_force_NULL_address) && + (strcmp( p_SSID, "NULL" ) == 0)) + p_SSID = NULL; + + /* Encryption modes will not be NULL ... */ + + if (strcmp( argv[ 0 ], "NULL" ) == 0) + p_encryption_modes = NULL; + qcsapi_retval = qcsapi_SSID_set_encryption_modes( the_interface, p_SSID, p_encryption_modes ); + + if (qcsapi_retval >= 0) + { + if (verbose_flag >= 0) + { + print_out( print, "complete\n" ); + } + } + else + { + report_qcsapi_error( p_calling_bundle, qcsapi_retval ); + statval = 1; + } + } + + return( statval ); +} + +static int +call_qcsapi_SSID_set_group_encryption( call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[] ) +{ + int statval = 0; + qcsapi_output *print = p_calling_bundle->caller_output; + + if (argc < 1) + { + print_err( print, "Not enough parameters in call qcsapi SSID set group encryption\n" ); + print_err( print, "Usage: call_qcsapi SSID_set_group_encryption <\"TKIP\"|\"CCMP\">\n" ); + statval = 1; + } + else + { + int qcsapi_retval; + const char *the_interface = p_calling_bundle->caller_interface; + char *p_SSID = p_calling_bundle->caller_generic_parameter.parameter_type.the_SSID; + char *p_group_encryption = argv[ 0 ]; + + if (((internal_flags & m_force_NULL_address) == m_force_NULL_address) && + (strcmp( p_SSID, "NULL" ) == 0)) + p_SSID = NULL; + + /* Group encryption will not be NULL ... */ + + if (strcmp( argv[ 0 ], "NULL" ) == 0) + p_group_encryption = NULL; + qcsapi_retval = qcsapi_SSID_set_group_encryption( the_interface, p_SSID, p_group_encryption ); + + if (qcsapi_retval >= 0) + { + if (verbose_flag >= 0) + { + print_out( print, "complete\n" ); + } + } + else + { + report_qcsapi_error( p_calling_bundle, qcsapi_retval ); + statval = 1; + } + } + + return( statval ); +} + +static int +call_qcsapi_SSID_set_authentication_mode( call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[] ) +{ + int statval = 0; + qcsapi_output *print = p_calling_bundle->caller_output; + + if (argc < 1) + { + print_err( print, "Not enough parameters in call qcsapi SSID set authentication mode, count is %d\n", argc ); + statval = 1; + } + else + { + int qcsapi_retval; + const char *the_interface = p_calling_bundle->caller_interface; + char *p_SSID = p_calling_bundle->caller_generic_parameter.parameter_type.the_SSID; + char *p_authentication_mode = argv[ 0 ]; + + if (((internal_flags & m_force_NULL_address) == m_force_NULL_address) && + (strcmp( p_SSID, "NULL" ) == 0)) + p_SSID = NULL; + + /* Authentication mode will not be NULL ... */ + + if (strcmp( argv[ 0 ], "NULL" ) == 0) + p_authentication_mode = NULL; + qcsapi_retval = qcsapi_SSID_set_authentication_mode( the_interface, p_SSID, p_authentication_mode ); + + if (qcsapi_retval >= 0) + { + if (verbose_flag >= 0) + { + print_out( print, "complete\n" ); + } + } + else + { + report_qcsapi_error( p_calling_bundle, qcsapi_retval ); + statval = 1; + } + } + + return( statval ); +} + +static int +call_qcsapi_SSID_get_pre_shared_key( call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[] ) +{ + int statval = 0; + qcsapi_output *print = p_calling_bundle->caller_output; + + /* + * Argument list needs to have the index. + */ + if (argc < 1) + { + print_err( print, "Not enough parameters in call qcsapi SSID get key passphrase, count is %d\n", argc ); + statval = 1; + } + else + { + char pre_shared_key[ 68 ], *p_pre_shared_key = NULL; + int qcsapi_retval; + const char *the_interface = p_calling_bundle->caller_interface; + char *p_SSID = p_calling_bundle->caller_generic_parameter.parameter_type.the_SSID; + qcsapi_unsigned_int the_index = (qcsapi_unsigned_int) atoi( argv[ 0 ] ); + + if (((internal_flags & m_force_NULL_address) == m_force_NULL_address) && + (strcmp( p_SSID, "NULL" ) == 0)) + p_SSID = NULL; + + if (argc < 2 || strcmp( argv[ 1 ], "NULL" ) != 0) + p_pre_shared_key = &pre_shared_key[ 0 ]; + qcsapi_retval = qcsapi_SSID_get_pre_shared_key( the_interface, p_SSID, the_index, p_pre_shared_key ); + + if (qcsapi_retval >= 0) + { + if (verbose_flag >= 0) + { + print_out( print, "%s\n", &pre_shared_key[ 0 ] ); + } + } + else + { + report_qcsapi_error( p_calling_bundle, qcsapi_retval ); + statval = 1; + } + } + + return( statval ); +} + +static int +call_qcsapi_SSID_get_key_passphrase( call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[] ) +{ + int statval = 0; + qcsapi_output *print = p_calling_bundle->caller_output; + + /* + * Argument list needs to have the index. + */ + if (argc < 1) + { + print_err( print, "Not enough parameters in call qcsapi SSID get key passphrase, count is %d\n", argc ); + statval = 1; + } + else + { + char passphrase[ 68 ], *p_passphrase = NULL; + int qcsapi_retval; + const char *the_interface = p_calling_bundle->caller_interface; + char *p_SSID = p_calling_bundle->caller_generic_parameter.parameter_type.the_SSID; + qcsapi_unsigned_int the_index = (qcsapi_unsigned_int) atoi( argv[ 0 ] ); + + if (((internal_flags & m_force_NULL_address) == m_force_NULL_address) && + (strcmp( p_SSID, "NULL" ) == 0)) + p_SSID = NULL; + + if (argc < 2 || strcmp( argv[ 1 ], "NULL" ) != 0) + p_passphrase = &passphrase[ 0 ]; + qcsapi_retval = qcsapi_SSID_get_key_passphrase( the_interface, p_SSID, the_index, p_passphrase ); + + if (qcsapi_retval >= 0) + { + if (verbose_flag >= 0) + { + print_out( print, "%s\n", &passphrase[ 0 ] ); + } + } + else + { + report_qcsapi_error( p_calling_bundle, qcsapi_retval ); + statval = 1; + } + } + + return( statval ); +} + +static int +call_qcsapi_SSID_set_pre_shared_key( call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[] ) +{ + int statval = 0; + qcsapi_output *print = p_calling_bundle->caller_output; + + /* + * Argument list needs to have both the index and the PSK. + */ + if (argc < 2) + { + print_err( print, "Not enough parameters in call qcsapi SSID set key passphrase, count is %d\n", argc ); + statval = 1; + } + else + { + int qcsapi_retval; + const char *the_interface = p_calling_bundle->caller_interface; + char *p_SSID = p_calling_bundle->caller_generic_parameter.parameter_type.the_SSID; + qcsapi_unsigned_int the_index = (qcsapi_unsigned_int) atoi( argv[ 0 ] ); + char *p_PSK = argv[ 1 ]; + + if (((internal_flags & m_force_NULL_address) == m_force_NULL_address) && + (strcmp( p_SSID, "NULL" ) == 0)) + p_SSID = NULL; + + /* PSK will not be NULL. */ + + if (strcmp( argv[ 1 ], "NULL" ) == 0) + p_PSK = NULL; + qcsapi_retval = qcsapi_SSID_set_pre_shared_key( the_interface, p_SSID, the_index, p_PSK ); + + if (qcsapi_retval >= 0) + { + if (verbose_flag >= 0) + { + print_out( print, "complete\n" ); + } + } + else + { + report_qcsapi_error( p_calling_bundle, qcsapi_retval ); + statval = 1; + } + } + + return( statval ); +} + +static int +call_qcsapi_wifi_add_radius_auth_server_cfg(call_qcsapi_bundle *p_calling_bundle, + int argc, char *argv[]) +{ + int statval = 0; + qcsapi_output *print = p_calling_bundle->caller_output; + + if (argc < 3) { + print_err( print, "Not enough parameters in call qcsapi add radius auth server cfg," + " count is %d\n", argc); + print_err( print, "Usage: call_qcsapi add_radius_auth_server_cfg " + " \n"); + statval = 1; + } else { + int qcsapi_retval = 0; + const char *the_interface = p_calling_bundle->caller_interface; + char *p_radius_auth_server_ipaddr = argv[0]; + char *p_radius_auth_server_port = argv[1]; + char *p_radius_auth_server_sh_key = argv[2]; + + qcsapi_retval = qcsapi_wifi_add_radius_auth_server_cfg(the_interface, + p_radius_auth_server_ipaddr, + p_radius_auth_server_port, + p_radius_auth_server_sh_key); + + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out( print, "complete\n" ); + } + } else { + report_qcsapi_error( p_calling_bundle, qcsapi_retval ); + statval = 1; + } + } + + return( statval ); +} + +static int +call_qcsapi_wifi_del_radius_auth_server_cfg(call_qcsapi_bundle *p_calling_bundle, + int argc, char *argv[]) +{ + int statval = 0; + qcsapi_output *print = p_calling_bundle->caller_output; + + if (argc < 2) { + print_err( print, "Not enough parameters in call qcsapi add radius auth server cfg," + " count is %d\n", argc); + print_err( print, "Usage: call_qcsapi add_radius_auth_server_cfg " + " \n"); + statval = 1; + } else { + int qcsapi_retval = 0; + const char *the_interface = p_calling_bundle->caller_interface; + char *p_radius_auth_server_ipaddr = argv[0]; + char *p_radius_auth_server_port = argv[1]; + + qcsapi_retval = qcsapi_wifi_del_radius_auth_server_cfg(the_interface, + p_radius_auth_server_ipaddr, + p_radius_auth_server_port); + + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out( print, "complete\n" ); + } + } else { + report_qcsapi_error( p_calling_bundle, qcsapi_retval ); + statval = 1; + } + } + + return( statval ); +} + +static int +call_qcsapi_wifi_get_radius_auth_server_cfg(call_qcsapi_bundle *p_calling_bundle, + int argc, char *argv[]) +{ + int statval = 0; + int qcsapi_retval = 0; + qcsapi_output *print = p_calling_bundle->caller_output; + const char *the_interface = p_calling_bundle->caller_interface; + string_1024 radius_auth_server_cfg; + char *p_radius_auth_server_cfg = &radius_auth_server_cfg[0]; + + qcsapi_retval = qcsapi_wifi_get_radius_auth_server_cfg(the_interface, + p_radius_auth_server_cfg); + + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out( print, "%s\n", p_radius_auth_server_cfg); + } + } else { + report_qcsapi_error( p_calling_bundle, qcsapi_retval ); + statval = 1; + } + + return( statval ); +} + +static int +call_qcsapi_wifi_set_own_ip_addr( call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[] ) +{ + int statval = 0; + qcsapi_output *print = p_calling_bundle->caller_output; + + if (argc < 1) + { + print_err( print, "Not enough parameters in call qcsapi set own ip addr, count is %d\n", argc); + print_err( print, "Usage: call_qcsapi set_own_ip_addr \n"); + statval = 1; + } + else + { + int qcsapi_retval; + const char *the_interface = p_calling_bundle->caller_interface; + char *p_own_ip_addr = argv[ 0 ]; + + if (strcmp( argv[ 0 ], "NULL" ) == 0) + p_own_ip_addr = NULL; + qcsapi_retval = qcsapi_wifi_set_own_ip_addr( the_interface, p_own_ip_addr ); + + if (qcsapi_retval >= 0) + { + if (verbose_flag >= 0) + { + print_out( print, "complete\n" ); + } + } + else + { + report_qcsapi_error( p_calling_bundle, qcsapi_retval ); + statval = 1; + } + } + + return( statval ); +} + +static int +call_qcsapi_SSID_set_key_passphrase( call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[] ) +{ + int statval = 0; + qcsapi_output *print = p_calling_bundle->caller_output; + + /* + * Argument list needs to have both the index and the passphrase. + */ + if (argc < 2) + { + print_err( print, "Not enough parameters in call qcsapi SSID set key passphrase, count is %d\n", argc ); + statval = 1; + } + else + { + int qcsapi_retval; + const char *the_interface = p_calling_bundle->caller_interface; + char *p_SSID = p_calling_bundle->caller_generic_parameter.parameter_type.the_SSID; + qcsapi_unsigned_int the_index = (qcsapi_unsigned_int) atoi( argv[ 0 ] ); + char *p_passphrase = argv[ 1 ]; + + if (((internal_flags & m_force_NULL_address) == m_force_NULL_address) && + (strcmp( p_SSID, "NULL" ) == 0)) + p_SSID = NULL; + + /* Passphrase of NULL is not valid. */ + + if (strcmp( argv[ 1 ], "NULL" ) == 0) + p_passphrase = NULL; + qcsapi_retval = qcsapi_SSID_set_key_passphrase( the_interface, p_SSID, the_index, p_passphrase ); + + if (qcsapi_retval >= 0) + { + if (verbose_flag >= 0) + { + print_out( print, "complete\n" ); + } + } + else + { + report_qcsapi_error( p_calling_bundle, qcsapi_retval ); + statval = 1; + } + } + + return( statval ); +} + +static int +call_qcsapi_SSID_get_pmf( call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[] ) +{ + int statval = 0; + int pmf_cap, *p_pmf_cap = NULL; + int qcsapi_retval; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + char *p_SSID = p_calling_bundle->caller_generic_parameter.parameter_type.the_SSID; + + if (((internal_flags & m_force_NULL_address) == m_force_NULL_address) && + (strcmp( p_SSID, "NULL" ) == 0)) + p_SSID = NULL; + + if (argc < 1 || strcmp( argv[ 0 ], "NULL" ) != 0) + p_pmf_cap = &pmf_cap; + + qcsapi_retval = qcsapi_SSID_get_pmf( the_interface, p_SSID, p_pmf_cap); + + if (qcsapi_retval >= 0) + { + if (verbose_flag >= 0) + { + print_out( print, "%d\n", pmf_cap ); + } + } + else + { + report_qcsapi_error( p_calling_bundle, qcsapi_retval ); + statval = 1; + } + + return( statval ); +} + +static int +call_qcsapi_SSID_set_pmf( call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[] ) +{ + int statval = 0; + qcsapi_output *print = p_calling_bundle->caller_output; + int qcsapi_retval; + const char *the_interface = p_calling_bundle->caller_interface; + char *p_SSID = p_calling_bundle->caller_generic_parameter.parameter_type.the_SSID; + + if (argc < 1) + { + print_err( print, "Not enough parameters in call qcsapi SSID set pmf mode, count is %d\n", argc ); + statval = 1; + } + else + { + qcsapi_unsigned_int pmf_cap = atoi( argv[ 0 ] ); + + if (((internal_flags & m_force_NULL_address) == m_force_NULL_address) && + (strcmp( p_SSID, "NULL" ) == 0)) + p_SSID = NULL; + + qcsapi_retval = qcsapi_SSID_set_pmf( the_interface, p_SSID, pmf_cap ); + + if (qcsapi_retval >= 0) + { + if (verbose_flag >= 0) + { + print_out( print, "complete\n" ); + } + } + else + { + report_qcsapi_error( p_calling_bundle, qcsapi_retval ); + statval = 1; + } + } + + return( statval ); +} + +static int +call_qcsapi_SSID_get_wps_SSID( const call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[] ) +{ + int statval = 0; + qcsapi_SSID the_wps_SSID = ""; + int qcsapi_retval; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + + if (argc > 0 && strcmp( argv[ 0 ], "NULL" ) == 0) + qcsapi_retval = qcsapi_SSID_get_wps_SSID( the_interface, NULL ); + else + qcsapi_retval = qcsapi_SSID_get_wps_SSID( the_interface, the_wps_SSID ); + + if (qcsapi_retval >= 0) + { + if (verbose_flag >= 0) + { + print_out( print, "%s\n", the_wps_SSID ); + } + } + else + { + report_qcsapi_error( p_calling_bundle, qcsapi_retval ); + statval = 1; + } + + return( statval ); +} + +static int +call_qcsapi_wifi_vlan_config(const call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[]) +{ + int statval = 0; + int qcsapi_retval; + qcsapi_vlan_cmd cmd; + uint32_t vlanid; + uint32_t flags = 0; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + + if (argc < 2) { + print_err(print, "Not enough parameters in call qcsapi vlan_conf\n"); + statval = 1; + goto usage; + } else { + + if (!strcasecmp(argv[0], "bind")) { + cmd = e_qcsapi_vlan_bind; + vlanid = atoi(argv[1]); + if (argc == 3) { + flags = atoi(argv[2]); + } + } else if (!strcasecmp(argv[0], "unbind")) { + cmd = e_qcsapi_vlan_unbind; + vlanid = atoi(argv[1]); + } else if (!strcasecmp(argv[0], "passthru")) { + cmd = e_qcsapi_vlan_passthru; + if (strcmp(argv[1], "all") == 0) + vlanid = QVLAN_VID_ALL; + else + vlanid = atoi(argv[1]); + } else if (!strcasecmp(argv[0], "unpassthru")) { + cmd = e_qcsapi_vlan_unpassthru; + if (strcmp(argv[1], "all") == 0) + vlanid = QVLAN_VID_ALL; + else + vlanid = atoi(argv[1]); + } else if (!strcasecmp(argv[0], "dynamic")) { + vlanid = atoi(argv[1]); + if (!vlanid) + cmd = e_qcsapi_vlan_undynamic; + else + cmd = e_qcsapi_vlan_dynamic; + } else if (!strcasecmp(argv[0], "enable")) { + cmd = e_qcsapi_vlan_enable; + vlanid = QVLAN_VID_ALL; + } else if (!strcasecmp(argv[0], "disable")) { + cmd = e_qcsapi_vlan_disable; + vlanid = QVLAN_VID_ALL; + } else { + statval = 1; + goto usage; + } + + qcsapi_retval = qcsapi_wifi_vlan_config(the_interface, cmd, vlanid, flags); + + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out(print, "complete\n"); + } + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } + } + + return statval; + +usage: + print_err(print, "Usage: call_qcsapi vlan_config "); + print_err(print, " "); + print_err(print, " \n"); + + return statval; +} + +static void +call_qcsapi_wifi_print_vlan_config(const call_qcsapi_bundle *p_calling_bundle, const char *ifname, string_1024 str) +{ + qcsapi_output *print = p_calling_bundle->caller_output; + struct qtn_vlan_config *vcfg = (struct qtn_vlan_config *)str; + uint16_t vmode; + uint16_t vid; + uint16_t i; + + vmode = qtn_vlancfg_reform(vcfg); + if (vmode == QVLAN_MODE_PTHRU) { + print_out(print, "%s VLAN(s):", QVLAN_MODE_STR_PTHRU); + for (i = 0; i < QVLAN_VID_MAX; i++) { + if (vcfg->vlan_bitmap[i / 7] & (1 << (i % 7))) + print_out(print, "%u,", i); + } + print_out(print, "\n"); + } else if (vmode == QVLAN_MODE_MBSS) { + vid = (vcfg->vlan_cfg & QVLAN_MASK_VID); + print_out(print, "%s, bound to VLAN %u\n", QVLAN_MODE_STR_BIND, vid); + } else if (vmode == QVLAN_MODE_DYNAMIC) { + print_out(print, "%s\n", QVLAN_MODE_STR_DYNAMIC); + } else { + print_out(print, "VLAN disabled\n"); + } +} + +static int +call_qcsapi_wifi_show_vlan_config(const call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[]) +{ + int qcsapi_retval = 0; + struct qtn_vlan_config *vcfg; + const char *ifname = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + + COMPILE_TIME_ASSERT(sizeof(string_1024) > sizeof(struct qtn_vlan_config)); + + if (argc > 0) { + print_err(print, "Too many parameters for show_vlan_config command\n"); + qcsapi_retval = 1; + } else { + vcfg = (struct qtn_vlan_config *)malloc(sizeof(struct qtn_vlan_config)); + if (!vcfg) { + print_err(print, "Not enough memory to execute the API\n"); + return -1; + } + + memset(vcfg, 0, sizeof(*vcfg)); + qcsapi_retval = qcsapi_wifi_show_vlan_config(ifname, (char *)vcfg); + if (qcsapi_retval < 0) { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + qcsapi_retval = 1; + } else { + call_qcsapi_wifi_print_vlan_config(p_calling_bundle, ifname, (char *)vcfg); + qcsapi_retval = 0; + } + free(vcfg); + } + + return qcsapi_retval; +} + +static int +call_qcsapi_enable_wlan_pass_through(call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[]) +{ + int statval = 0; + int qcsapi_retval; + const char *ifname = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + int enabled = !!atoi(argv[0]); + + qcsapi_retval = qcsapi_enable_vlan_pass_through(ifname, enabled); + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out( print, "complete\n"); + } + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } + + return statval; +} + +static int +call_qcsapi_enable_vlan_promisc(call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[]) +{ + int statval = 0; + int qcsapi_retval; + qcsapi_output *print = p_calling_bundle->caller_output; + int enabled = !!atoi(argv[0]); + + qcsapi_retval = qcsapi_wifi_set_vlan_promisc(enabled); + + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out( print, "complete\n"); + } + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } + + return statval; +} + +static int +call_qcsapi_set_ipff(call_qcsapi_bundle *p_calling_bundle, int add, int argc, char *argv[]) +{ + int qcsapi_retval; + qcsapi_output *print = p_calling_bundle->caller_output; + uint32_t ipaddr; + uint32_t ipaddr_ne; + char *usage = "Usage: call_qcsapi [add_ipff | del_ipff ] \n"; + + /* FIXME subnets and IPv6 are not yet supported */ + + if (argc != 1) { + print_out(print, usage); + return -EINVAL; + } + + if (inet_pton(AF_INET, argv[0], &ipaddr_ne) != 1) { + print_err(print, "invalid IPv4 address %s\n", argv[0]); + return -EINVAL; + } + ipaddr = ntohl(ipaddr_ne); + + if (!IN_MULTICAST(ipaddr)) { + print_err(print, "invalid multicast IPv4 address " NIPQUAD_FMT "\n", + NIPQUAD(ipaddr_ne)); + return -EINVAL; + } + + if (add) { + qcsapi_retval = qcsapi_wifi_add_ipff(ipaddr); + } else { + qcsapi_retval = qcsapi_wifi_del_ipff(ipaddr); + } + + if (qcsapi_retval < 0) { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + return 1; + } + + if (verbose_flag >= 0) { + print_out(print, "complete\n"); + } + + return 0; +} + +static int +call_qcsapi_get_ipff(call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[]) +{ + qcsapi_output *print = p_calling_bundle->caller_output; +#define QCSAPI_IPFF_GET_MAX 256 + char buf[IP_ADDR_STR_LEN * QCSAPI_IPFF_GET_MAX]; + + qcsapi_wifi_get_ipff(buf, sizeof(buf)); + + print_out(print, "%s", buf); + + if (verbose_flag >= 0) { + print_out( print, "complete\n"); + } + + return 0; +} + +static int +call_qcsapi_wifi_get_rts_threshold(call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[]) +{ + int qcsapi_retval; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + qcsapi_unsigned_int rts_threshold; + + qcsapi_retval = qcsapi_wifi_get_rts_threshold(the_interface, &rts_threshold); + if (qcsapi_retval >= 0) { + print_out(print, "%d\n", rts_threshold); + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + return 1; + } + + return qcsapi_retval; +} + +static int +call_qcsapi_wifi_set_rts_threshold(call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[]) +{ + int qcsapi_retval; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + qcsapi_unsigned_int rts_threshold; + int32_t arg; + + if (sscanf(argv[0], "%d", &arg) != 1) { + print_err(print, "Error parsing '%s'\n", argv[0]); + return 1; + } + + if (arg < IEEE80211_RTS_MIN) { + print_err(print, "Value should be non negative\n"); + return 1; + } + + rts_threshold = arg; + + qcsapi_retval = qcsapi_wifi_set_rts_threshold(the_interface, rts_threshold); + if (qcsapi_retval >= 0) { + print_out(print, "complete\n"); + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + return 1; + } + + return qcsapi_retval; +} + +static int +call_qcsapi_wifi_disable_wps(call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[]) +{ + int statval = 0; + int qcsapi_retval; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + int disable_wps = atoi(argv[0]); + + qcsapi_retval = qcsapi_wifi_disable_wps(the_interface, disable_wps); + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out( print, "complete\n"); + } + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } + + return( statval ); +} + +static int +call_qcsapi_wifi_start_cca(call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[]) +{ + int qcsapi_retval; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + int channel; + int duration; + + if (argc < 2) { + print_err( print, "Format: start_cca \n"); + return(1); + } + + channel = atoi(argv[0]); + duration = atoi(argv[1]); + + qcsapi_retval = qcsapi_wifi_start_cca(the_interface, channel, duration); + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out( print, "Complete.\n"); + } + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + return 1; + } + + return 0; +} + +static int +call_qcsapi_wifi_start_scan(call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[]) +{ + int statval = 0; + int qcsapi_retval; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + int pick_flags = 0; + + if (argc > 0) { + while (argc > 0) { + if (!strcasecmp("reentry", argv[0])) { + pick_flags |= IEEE80211_PICK_REENTRY; + } else if (!strcasecmp("clearest", argv[0])) { + pick_flags |= IEEE80211_PICK_CLEAREST; + } else if (!strcasecmp("no_pick", argv[0])) { + pick_flags |= IEEE80211_PICK_NOPICK; + } else if (!strcasecmp("background", argv[0])) { + pick_flags |= IEEE80211_PICK_NOPICK_BG; + } else if (!strcasecmp("dfs", argv[0])) { + pick_flags |= IEEE80211_PICK_DFS; + } else if (!strcasecmp("non_dfs", argv[0])) { + pick_flags |= IEEE80211_PICK_NONDFS; + } else if (!strcasecmp("all", argv[0])) { + pick_flags |= IEEE80211_PICK_ALL; + } else if (!strcasecmp("flush", argv[0])) { + pick_flags |= IEEE80211_PICK_SCAN_FLUSH; + } else if (!strcasecmp("active", argv[0])) { + pick_flags |= IEEE80211_PICK_BG_ACTIVE; + } else if (!strcasecmp("fast", argv[0])) { + pick_flags |= IEEE80211_PICK_BG_PASSIVE_FAST; + } else if (!strcasecmp("normal", argv[0])) { + pick_flags |= IEEE80211_PICK_BG_PASSIVE_NORMAL; + } else if (!strcasecmp("slow", argv[0])) { + pick_flags |= IEEE80211_PICK_BG_PASSIVE_SLOW; + } else { + goto err_ret; + } + argc--; + argv++; + } + + if (pick_flags & IEEE80211_PICK_ALGORITHM_MASK) { + uint32_t algorithm = pick_flags & IEEE80211_PICK_ALGORITHM_MASK; + uint32_t chan_set = pick_flags & IEEE80211_PICK_DOMIAN_MASK; + + if (IS_MULTIPLE_BITS_SET(algorithm)) { + print_out(print, "Only one pick algorithm can be specified\n"); + goto err_ret; + } + if (chan_set) { + if (IS_MULTIPLE_BITS_SET(chan_set)) { + print_out(print, "Only one channel set can be specified\n"); + goto err_ret; + } + } else { + pick_flags |= IEEE80211_PICK_ALL; + } + } else { + print_out(print, "pick algorithm was not specified\n"); + goto err_ret; + } + + if (pick_flags & IEEE80211_PICK_NOPICK_BG) { + uint32_t dfs_mode = pick_flags & IEEE80211_PICK_BG_MODE_MASK; + + if (IS_MULTIPLE_BITS_SET(dfs_mode)) { + print_out(print, "Please specify only one DFS scan mode " + "from active, (passive)fast, normal and slow\n"); + goto err_ret; + } + } + } + + qcsapi_retval = qcsapi_wifi_start_scan_ext(the_interface, pick_flags); + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out( print, "complete\n"); + } + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } + + return( statval ); + +err_ret: + print_start_scan_usage(print); + return 1; +} + +static int +call_qcsapi_wifi_cancel_scan(call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[]) +{ + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + int force = 0; + int qcsapi_retval; + + if (argc == 1) { + if (!strcasecmp("force", argv[0])) { + force = 1; + } else { + print_out(print, "Unknown parameter: %s\n", argv[0]); + print_cancel_scan_usage(print); + return 1; + } + } else if (argc != 0) { + print_cancel_scan_usage(print); + return 1; + } + + qcsapi_retval = qcsapi_wifi_cancel_scan(the_interface, force); + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out( print, "complete\n"); + } + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + return 1; + } + + return 0; +} + +static int +call_qcsapi_wifi_get_scan_status(call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[]) +{ + int statval = 0; + int qcsapi_retval; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + int scanstatus = -1; + + qcsapi_retval = qcsapi_wifi_get_scan_status(the_interface, &scanstatus); + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out(print, "%d\n", scanstatus); + } + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } + + return statval; +} + +static int +call_qcsapi_wifi_get_cac_status(call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[]) +{ + int statval = 0; + int qcsapi_retval; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + int cacstatus = -1; + + qcsapi_retval = qcsapi_wifi_get_cac_status(the_interface, &cacstatus); + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out(print, "%d\n", cacstatus); + } + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } + + return statval; +} + +static int +call_qcsapi_wifi_wait_scan_completes(call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[]) +{ + int statval = 0; + int qcsapi_retval; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + time_t timeout; + + if (argc < 1) { + print_err( print, "Wait Scan Completes requires a timeout\n" ); + return(1); + } + + timeout = (time_t) atoi( argv[ 0 ] ); + + qcsapi_retval = qcsapi_wifi_wait_scan_completes(the_interface, timeout); + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out( print, "complete\n"); + } + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } + + return( statval ); +} + +static int +call_qcsapi_wifi_get_results_AP_scan( call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[] ) +{ + int statval = 0; + qcsapi_unsigned_int count_APs_scanned, *p_count_APs_scanned = NULL; + int qcsapi_retval; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + + if (argc < 1 || strcmp( argv[ 0 ], "NULL" ) != 0) + p_count_APs_scanned = &count_APs_scanned; + qcsapi_retval = qcsapi_wifi_get_results_AP_scan( the_interface, p_count_APs_scanned ); + if (qcsapi_retval >= 0) + { + if (verbose_flag >= 0) + { + /* + * Unlike most APIs that return a value by reference, this API permits + * that reference address to be 0. + * + * Primary purpose of this API is to get the results of the last AP scan. + */ + if (p_count_APs_scanned != NULL) + print_out( print, "%d\n", (int) count_APs_scanned ); + else + print_out( print, "complete\n" ); + } + } + else + { + report_qcsapi_error( p_calling_bundle, qcsapi_retval ); + statval = 1; + } + + return( statval ); +} + +static int +call_qcsapi_wifi_get_count_APs_scanned( call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[] ) +{ + int statval = 0; + qcsapi_unsigned_int count_APs_scanned, *p_count_APs_scanned = NULL; + int qcsapi_retval; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + + if (argc < 1 || strcmp( argv[ 0 ], "NULL" ) != 0) + p_count_APs_scanned = &count_APs_scanned; + qcsapi_retval = qcsapi_wifi_get_count_APs_scanned( the_interface, p_count_APs_scanned ); + if (qcsapi_retval >= 0) + { + if (verbose_flag >= 0) + { + print_out( print, "%d\n", (int) count_APs_scanned ); + } + } + else + { + report_qcsapi_error( p_calling_bundle, qcsapi_retval ); + statval = 1; + } + + return( statval ); +} + +static int +call_qcsapi_wifi_get_properties_AP( call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[] ) +{ + int statval = 0; + qcsapi_ap_properties ap_properties, *p_ap_properties = NULL; + int qcsapi_retval; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + qcsapi_unsigned_int ap_index = p_calling_bundle->caller_generic_parameter.index; + + if (argc < 1 || strcmp( argv[ 0 ], "NULL" ) != 0) + p_ap_properties = &ap_properties; + qcsapi_retval = qcsapi_wifi_get_properties_AP( the_interface, ap_index, p_ap_properties ); + if (qcsapi_retval >= 0) + { + if (verbose_flag >= 0) + { + char mac_addr_string[ 24 ]; + + snprintf( &mac_addr_string[ 0 ], sizeof(mac_addr_string), MACFILTERINGMACFMT, + p_ap_properties->ap_mac_addr[ 0 ], + p_ap_properties->ap_mac_addr[ 1 ], + p_ap_properties->ap_mac_addr[ 2 ], + p_ap_properties->ap_mac_addr[ 3 ], + p_ap_properties->ap_mac_addr[ 4 ], + p_ap_properties->ap_mac_addr[ 5 ] + ); + + print_out( print, "\"%s\" %s %d %d %x %d %d %d %d %d\n", + p_ap_properties->ap_name_SSID, + &mac_addr_string[ 0 ], + p_ap_properties->ap_channel, + p_ap_properties->ap_RSSI, + p_ap_properties->ap_flags, + p_ap_properties->ap_protocol, + p_ap_properties->ap_authentication_mode, + p_ap_properties->ap_encryption_modes, + p_ap_properties->ap_qhop_role, + p_ap_properties->ap_wps + ); + } + } + else + { + report_qcsapi_error( p_calling_bundle, qcsapi_retval ); + statval = 1; + } + + return( statval ); +} + +static int +call_qcsapi_wifi_get_mcs_rate( call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[] ) +{ + int statval = 0; + char mcs_rate[16]; + char *p_mcs_rate = NULL; + int qcsapi_retval; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + + p_mcs_rate = &mcs_rate[0]; + qcsapi_retval = qcsapi_wifi_get_mcs_rate(the_interface, p_mcs_rate); + + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) + print_out(print, "%s\n", &mcs_rate[0]); + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } + + return statval; +} + +static int +call_qcsapi_wifi_set_mcs_rate( call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[] ) +{ + int statval = 0; + qcsapi_output *print = p_calling_bundle->caller_output; + + if (argc < 1) + { + print_err( print, "Not enough parameters in call qcsapi WiFi set MCS rate, count is %d\n", argc ); + statval = 1; + } + else + { + int qcsapi_retval; + const char *the_interface = p_calling_bundle->caller_interface; + char *p_mcs_rate = argv[ 0 ]; + + /* MCS rate will not be NULL ... */ + + if (strcmp( argv[ 0 ], "NULL" ) == 0) + p_mcs_rate = NULL; + qcsapi_retval = qcsapi_wifi_set_mcs_rate( the_interface, p_mcs_rate ); + + if (qcsapi_retval >= 0) + { + if (verbose_flag >= 0) + { + print_out( print, "complete\n" ); + } + } + else + { + report_qcsapi_error( p_calling_bundle, qcsapi_retval ); + statval = 1; + } + } + + return( statval ); +} + +/****************************************************************************** +DESCRIPTION: This API returns the time that station has associated with AP. + +*******************************************************************************/ +static int +call_qcsapi_wifi_get_time_associated_per_association( call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[] ) +{ + int statval = 0; + int qcsapi_retval = 0; + qcsapi_unsigned_int time_associated = 0; + qcsapi_unsigned_int *p_time_associated = NULL; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + qcsapi_unsigned_int association_index = p_calling_bundle->caller_generic_parameter.index; + + if (argc < 1 || strcmp( argv[ 0 ], "NULL" ) != 0) + p_time_associated = &time_associated; + + qcsapi_retval = qcsapi_wifi_get_time_associated_per_association(the_interface, association_index, p_time_associated); + + if (qcsapi_retval >= 0) + { + if (verbose_flag >= 0) + { + print_out( print, "%d\n", time_associated); + } + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } + + return( statval ); +} + +static int +call_qcsapi_wifi_wds_add_peer(call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[]) +{ + int statval = 0; + int qcsapi_retval = 0; + qcsapi_mac_addr the_mac_addr; + int ival = 0; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + qcsapi_unsigned_int encryption = 0; + + if (argc < 1) { + print_err( print, "Not enough parameters in call qcsapi WiFi wds add peer, count is %d\n", argc); + statval = 1; + } else { + ival = parse_mac_addr(argv[ 0 ], the_mac_addr); + if ((argc > 1) && (strcasecmp(argv[1], "encrypt") == 0)) + encryption = 1; + + if (ival >= 0) { + qcsapi_retval = qcsapi_wds_add_peer_encrypt(the_interface, the_mac_addr, encryption); + + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out( print, "complete\n"); + } + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } + + } else { + print_out( print, "Error parsing MAC address %s\n", argv[ 0 ]); + statval = 1; + } + } + + return statval; +} + +static int +call_qcsapi_wifi_wds_remove_peer(call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[]) +{ + int statval = 0; + int qcsapi_retval = 0; + qcsapi_mac_addr the_mac_addr; + int ival = 0; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + + if (argc < 1) { + print_err( print, + "Not enough parameters in call qcsapi WiFi wds remove peer, count is %d\n", argc ); + statval = 1; + } else { + ival = parse_mac_addr(argv[ 0 ], the_mac_addr); + + if (ival >= 0) { + qcsapi_retval = qcsapi_wds_remove_peer(the_interface, the_mac_addr); + + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out( print, "complete\n"); + } + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } + + } else { + print_out( print, "Error parsing MAC address %s\n", argv[0]); + statval = 1; + } + } + + return statval; +} + +static int +call_qcsapi_wifi_wds_get_peer_address(call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[]) +{ + int statval = 0; + int qcsapi_retval = 0; + qcsapi_mac_addr peer_address; + qcsapi_unsigned_int index = 0; + char temp_peer_address_str[20]; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + + if (argc < 1) { + print_err( print, + "Not enough parameters in call qcsapi WiFi get peer address, count is %d\n", argc ); + statval = 1; + } else { + index = (qcsapi_unsigned_int) atoi(argv[0]); + qcsapi_retval = qcsapi_wds_get_peer_address(the_interface, index, peer_address); + + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + snprintf(&temp_peer_address_str[0], sizeof(temp_peer_address_str), + MACFILTERINGMACFMT, + peer_address[0], + peer_address[1], + peer_address[2], + peer_address[3], + peer_address[4], + peer_address[5]); + print_out( print, "%s\n", temp_peer_address_str); + } + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } + } + + return statval; +} + +static int +call_qcsapi_wifi_wds_set_psk(call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[]) +{ + int statval = 0; + int qcsapi_retval = 0; + qcsapi_mac_addr peer_address; + char *p_pre_shared_key = NULL; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + int ival = 0; + + if (argc < 2) { + print_err( print, + "Not enough parameters in call qcsapi WiFi wds set psk, count is %d\n", argc ); + statval = 1; + } else { + ival = parse_mac_addr(argv[0], peer_address); + + if (ival >= 0) { + p_pre_shared_key = argv[1]; + if (strcmp(p_pre_shared_key, "NULL") == 0) { + p_pre_shared_key = NULL; + } + qcsapi_retval = qcsapi_wds_set_psk(the_interface, peer_address, p_pre_shared_key); + + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out( print, "complete\n"); + } + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } + } else { + print_out( print, "Error parsing MAC address %s\n", argv[ 0 ]); + statval = 1; + } + } + + return statval; +} + +static int +call_qcsapi_wifi_wds_set_mode(call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[]) +{ + int statval = 0; + int qcsapi_retval = 0; + qcsapi_mac_addr peer_address; + int rbs_mode; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + int ival = 0; + + if (argc < 2) { + print_err( print, "Not enough parameters in call qcsapi WiFi wds set " + "mode, count is %d\n", argc ); + statval = 1; + } else { + ival = parse_mac_addr(argv[0], peer_address); + + if (ival >= 0) { + if (strcasecmp(argv[1], "rbs") == 0) { + rbs_mode = 1; + } else if (strcasecmp(argv[1], "mbs") == 0) { + rbs_mode = 0; + } else { + print_out(print, "Error parsing WDS mode %s\n", argv[1]); + return 1; + } + + qcsapi_retval = qcsapi_wds_set_mode(the_interface, peer_address, rbs_mode); + + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out( print, "complete\n"); + } + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } + } else { + print_out( print, "Error parsing MAC address %s\n", argv[ 0 ]); + statval = 1; + } + } + + return statval; +} + +static int +call_qcsapi_wifi_wds_get_mode(call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[]) +{ + int statval = 0; + int qcsapi_retval = 0; + int rbs_mode; + qcsapi_unsigned_int index = 0; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + const char *mode_str[] = {"mbs", "rbs", "none"}; + + if (argc < 1) { + print_err( print, "Not enough parameters in call qcsapi WiFi get " + "peer address, count is %d\n", argc ); + statval = 1; + } else { + index = (qcsapi_unsigned_int) atoi(argv[0]); + qcsapi_retval = qcsapi_wds_get_mode(the_interface, index, &rbs_mode); + + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out( print, "wds %s\n", mode_str[rbs_mode]); + } + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } + } + + return statval; +} + +static int +call_qcsapi_wifi_qos_get_param(call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[]) +{ + int statval = 0; + int qcsapi_retval = 0; + const char *the_interface = p_calling_bundle->caller_interface; + int the_queue = -1; + int the_param = -1; + int ap_bss_flag = 0; + int qos_param_value; + int i; + qcsapi_output *print = p_calling_bundle->caller_output; + + if (argc < 2) { + print_err(print, "Usage: call_qcsapi qos_get_param " + " [AP / BSS flag]\n"); + return 1; + } + + if (isdigit(*argv[0])) { + the_queue = atoi(argv[0]); + } else if (name_to_qos_queue_type(argv[0], &the_queue) == 0) { + print_err(print, "Unrecognized QoS queue %s\n", argv[0]); + if (verbose_flag >= 0) { + print_out( print, "Supported QOS queue ID and name:\n" ); + for (i = 0; i < ARRAY_SIZE(qcsapi_qos_queue_table); i++) + print_out( print, "%d: %s\n", + qcsapi_qos_queue_table[i].qos_queue_type, + qcsapi_qos_queue_table[i].qos_queue_name ); + } + return 1; + } + + if (isdigit(*argv[1])) { + the_param = atoi(argv[1]); + } else if (name_to_qos_param_type(argv[1], &the_param) == 0) { + print_err(print, "Unrecognized QoS param %s\n", argv[1]); + if (verbose_flag >= 0) { + print_out( print, "Supported QOS param ID and name:\n" ); + for (i = 0; i < ARRAY_SIZE(qcsapi_qos_param_table); i++) + print_out( print, "%d: %s\n", + qcsapi_qos_param_table[i].qos_param_type, + qcsapi_qos_param_table[i].qos_param_name ); + } + return 1; + } + + if (argc > 2) { + ap_bss_flag = atoi(argv[2]); + } + + qcsapi_retval = qcsapi_wifi_qos_get_param(the_interface, + the_queue, + the_param, + ap_bss_flag, + &qos_param_value); + + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out(print, "%d\n", qos_param_value); + } + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } + + return statval; +} + +static int +call_qcsapi_wifi_qos_set_param(call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[]) +{ + int statval = 0; + int qcsapi_retval = 0; + const char *the_interface = p_calling_bundle->caller_interface; + int the_queue = -1; + int the_param = -1; + int ap_bss_flag = 0; + int param_value = -1; + int i; + qcsapi_output *print = p_calling_bundle->caller_output; + + if (argc < 3) { + print_err(print, "Usage: call_qcsapi qos_get_param " + " [AP / BSS flag]\n"); + return 1; + } + + if (isdigit(*argv[0])) { + the_queue = atoi(argv[0]); + } else if (name_to_qos_queue_type(argv[0], &the_queue) == 0) { + print_err(print, "Unrecognized QoS queue %s\n", argv[0]); + if (verbose_flag >= 0) { + print_out( print, "Supported QOS queue ID and name:\n" ); + for (i = 0; i < ARRAY_SIZE(qcsapi_qos_queue_table); i++) + print_out( print, "%d: %s\n", + qcsapi_qos_queue_table[i].qos_queue_type, + qcsapi_qos_queue_table[i].qos_queue_name ); + } + return 1; + } + + if (isdigit(*argv[1])) { + the_param = atoi(argv[1]); + } else if (name_to_qos_param_type(argv[1], &the_param) == 0) { + print_err(print, "Unrecognized QoS param %s\n", argv[1]); + if (verbose_flag >= 0) { + print_out( print, "Supported QOS param ID and name:\n" ); + for (i = 0; i < ARRAY_SIZE(qcsapi_qos_param_table); i++) + print_out( print, "%d: %s\n", + qcsapi_qos_param_table[i].qos_param_type, + qcsapi_qos_param_table[i].qos_param_name ); + } + return 1; + } + + if (isdigit(*argv[2])) { + param_value = atoi(argv[2]); + } else { + print_err(print, "Unrecognized QoS param's value %s\n", argv[2]); + return 1; + } + + if (argc > 3) + ap_bss_flag = atoi(argv[3]); + + qcsapi_retval = qcsapi_wifi_qos_set_param(the_interface, + the_queue, + the_param, + ap_bss_flag, + param_value); + + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out(print, "complete\n"); + } + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } + + return statval; +} + +static int +call_qcsapi_wifi_get_wmm_ac_map(call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[]) +{ + int statval = 0; + int qcsapi_retval = 0; + const char *the_interface = p_calling_bundle->caller_interface; + string_64 ac_map; /* Must be a string for the RPC generation Perl script */ + qcsapi_output *print = p_calling_bundle->caller_output; + + assert(sizeof(ac_map) >= QCSAPI_WIFI_AC_MAP_SIZE); + + memset(ac_map, 0, sizeof(ac_map)); + qcsapi_retval = qcsapi_wifi_get_wmm_ac_map(the_interface, ac_map); + + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out(print, "%s\n", ac_map); + } + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } + + return statval; +} + +static int +call_qcsapi_wifi_set_wmm_ac_map(call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[]) +{ + int statval = 0; + int qcsapi_retval = 0; + const char *the_interface = p_calling_bundle->caller_interface; + int user_prio = -1; + int ac_index = -1; + qcsapi_output *print = p_calling_bundle->caller_output; + + if (argc < 2) { + print_err(print, "Usage: call_qcsapi set_wmm_ac_map " + " \n"); + return 1; + } + + if (isdigit(*argv[0])) { + user_prio = atoi(argv[0]); + } else { + print_err(print, "Unrecognized user priority %s," + "Supported user priority range: 0~7\n", argv[0]); + return 1; + } + + if (isdigit(*argv[1])) { + ac_index = atoi(argv[1]); + } else { + print_err(print, "Unrecognized AC index %s, " + "Supported AC index range: 0(AC_BE), 1(AC_BK), 2(AC_VI), 3(AC_VO)\n", argv[1]); + return 1; + } + + qcsapi_retval = qcsapi_wifi_set_wmm_ac_map(the_interface, + user_prio, + ac_index); + + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out(print, "complete\n"); + } + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } + + return statval; +} + +static int +call_qcsapi_wifi_get_dscp_8021p_map(call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[]) +{ + int i; + int statval = 0; + int qcsapi_retval = 0; + string_64 dot1p_mapping; /* Must be a string for the RPC generation Perl script */ + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + + assert(sizeof(dot1p_mapping) >= IP_DSCP_NUM); + + memset(dot1p_mapping, 0, sizeof(dot1p_mapping)); + qcsapi_retval = qcsapi_wifi_get_dscp_8021p_map(the_interface, (char *)dot1p_mapping); + + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out(print, "IP DSCP/802.1p UP:\n"); + for (i = 0; i < IP_DSCP_NUM; i++) { + print_out(print, "%2d/%d ", i, dot1p_mapping[i]); + if ((i+1)%IEEE8021P_PRIORITY_NUM == 0) + print_out(print, "\n"); + } + } + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } + + return statval; +} + +static int +call_qcsapi_wifi_set_dscp_8021p_map(call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[]) +{ + int statval = 0; + int qcsapi_retval = 0; + uint8_t dot1p_up = 0; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + + if (argc < 2) { + print_err(print, "Usage: call_qcsapi set_dscp_8021p_map " + " <802.1p UP>\n"); + return 1; + } + + + if (isdigit(*argv[1])) { + dot1p_up = atoi(argv[1]); + } else { + print_err(print, "Unrecognized 802.1p UP %s, " + "Supported 802.1p UP range: 0-7\n", argv[1]); + return 1; + } + + qcsapi_retval = qcsapi_wifi_set_dscp_8021p_map(the_interface, + argv[0], + dot1p_up); + + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out(print, "complete\n"); + } + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } + + return statval; +} + +static int +call_qcsapi_wifi_get_dscp_ac_map(call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[]) +{ +#define QCSAPI_BINARY_CONVERT_MASK 0x20 + int i; + int statval = 0; + int qcsapi_retval = 0; + struct qcsapi_data_64bytes ac_mapping; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + const char *acstr[] = {"AC_BE", "AC_BK", "AC_VI", "AC_VO"}; + + assert(sizeof(ac_mapping) >= IP_DSCP_NUM); + + memset(&ac_mapping, 0, sizeof(ac_mapping)); + qcsapi_retval = qcsapi_wifi_get_dscp_ac_map(the_interface, &ac_mapping); + + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out(print, "DSCP AC\n"); + for (i = 0; i < IP_DSCP_NUM; i++) { + uint8_t mask = QCSAPI_BINARY_CONVERT_MASK; + /* Print DSCP in binary format */ + while (mask) { + print_out(print, "%d", i & mask ? 1 : 0); + mask >>= 1; + } + print_out(print, "(0x%02x) %s\n", i, acstr[(uint8_t)ac_mapping.data[i]]); + } + } + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } + + return statval; +} + +/* + * Convert given formatted dscp string into digital value + * Two types of formatted dscp string are acceptable + * eg, + * TYPE I -- 3,4,5,25,38 + * TYPE II -- 3-25 +*/ +static int call_qcsapi_convert_ipdscp_digital(const char *dscpstr, uint8_t *array, uint8_t *number) +{ + uint8_t ip_dscp_number = 0; + char *pcur; + char *p; + char buffer[256] = {0}; + + if (dscpstr == NULL || array == NULL || number == NULL) + return -EINVAL; + + strncpy(buffer, dscpstr, (sizeof(buffer) - 1)); + pcur = buffer; + do { + p = strchr(pcur,'-'); + if (p) { + uint8_t dscpstart; + uint8_t dscpend; + int i; + + *p = '\0'; + p++; + if (!isdigit(*pcur) || !isdigit(*p)) + return -EINVAL; + dscpstart = atoi(pcur); + dscpend = atoi(p); + + if ((dscpstart > dscpend) || (dscpstart >= IP_DSCP_NUM) + || (dscpend >= IP_DSCP_NUM)) + return -EINVAL; + ip_dscp_number = dscpend - dscpstart; + for (i = 0; i <= ip_dscp_number; i++) + array[i] = dscpstart + i; + break; + } else { + if (ip_dscp_number > (IP_DSCP_NUM - 1)) + return -EINVAL; + + p = strchr(pcur,','); + if (p) { + *p = '\0'; + p++; + array[ip_dscp_number] = atoi(pcur); + if (array[ip_dscp_number] >= IP_DSCP_NUM) + return -EINVAL; + pcur = p; + ip_dscp_number++; + } else { + array[ip_dscp_number] = atoi(pcur); + if (array[ip_dscp_number] >= IP_DSCP_NUM) + return -EINVAL; + } + } + } while (p); + *number = ip_dscp_number + 1; + + return 0; +} + +static int +call_qcsapi_wifi_set_dscp_ac_map(call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[]) +{ + int statval = 0; + int qcsapi_retval = 0; + uint8_t listlen = 0; + uint8_t ac = 0; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + struct qcsapi_data_64bytes ip_dscp_value; + + if (argc != 2) { + print_err(print, + "Usage: call_qcsapi set_dscp_ac_map " + " \n"); + return 1; + } + + if (!isdigit(*argv[1])) { + print_err(print, + "Unrecognized AC value %s; Supported AC range: 0-3\n", + argv[1]); + return 1; + } else { + ac = atoi(argv[1]); + } + + memset(&ip_dscp_value, 0, sizeof(ip_dscp_value)); + statval = call_qcsapi_convert_ipdscp_digital(argv[0], ip_dscp_value.data, &listlen); + if (statval < 0) + return statval; + + qcsapi_retval = qcsapi_wifi_set_dscp_ac_map(the_interface, + &ip_dscp_value, listlen, ac); + + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out(print, "complete\n"); + } + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } + + return statval; +} + +static int +call_qcsapi_wifi_get_priority(call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[]) +{ + int statval = 0; + int qcsapi_retval = 0; + uint8_t priority; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + + qcsapi_retval = qcsapi_wifi_get_priority(the_interface, &priority); + + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out(print, "%u\n", priority); + } + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } + + return statval; +} + +static void +call_qcsapi_wifi_set_priority_usage(qcsapi_output *print) +{ + print_err(print, "Usage: call_qcsapi set_priority \n"); + print_err(print, "Priority is an integer from 0 to %u.\n", QTN_VAP_PRIORITY_NUM - 1); +} + +static int +call_qcsapi_wifi_set_priority(call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[]) +{ + int statval = 0; + int qcsapi_retval = 0; + uint8_t priority = 0; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + + if (argc != 1) { + call_qcsapi_wifi_set_priority_usage(print); + return 1; + } + + if (isdigit(*argv[0])) { + priority = atoi(argv[0]); + if (priority >= QTN_VAP_PRIORITY_NUM) { + call_qcsapi_wifi_set_priority_usage(print); + return 1; + } + } else { + call_qcsapi_wifi_set_priority_usage(print); + return 1; + } + + qcsapi_retval = qcsapi_wifi_set_priority(the_interface, + priority); + + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out(print, "complete\n"); + } + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } + + return statval; +} + +static int +call_qcsapi_wifi_get_airfair(call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[]) +{ + int statval = 0; + int qcsapi_retval = 0; + uint8_t airfair; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + + qcsapi_retval = qcsapi_wifi_get_airfair(the_interface, &airfair); + + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out(print, "%u\n", airfair); + } + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } + + return statval; +} + +static void +call_qcsapi_wifi_set_airfair_usage(qcsapi_output *print) +{ + print_err(print, "Usage: call_qcsapi set_airfair \n"); + print_err(print, "Status is either 0(disabled) or 1(enabled).\n"); +} + +static int +call_qcsapi_wifi_set_airfair(call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[]) +{ + int statval = 0; + int qcsapi_retval = 0; + uint8_t airfair = 0; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + + if (argc != 1) { + call_qcsapi_wifi_set_airfair_usage(print); + return 1; + } + + if (isdigit(*argv[0])) { + airfair = atoi(argv[0]); + if (airfair > 1) { + call_qcsapi_wifi_set_airfair_usage(print); + return 1; + } + } else { + call_qcsapi_wifi_set_airfair_usage(print); + return 1; + } + + qcsapi_retval = qcsapi_wifi_set_airfair(the_interface, + airfair); + + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out(print, "complete\n"); + } + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } + + return statval; +} + +static int +call_qcsapi_config_get_parameter(call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[]) +{ + int statval = 0; + qcsapi_output *print = p_calling_bundle->caller_output; + + if (argc < 1) { + print_err( print, "Usage: call_qcsapi get_persistent_param \n"); + statval = 1; + } else { + int qcsapi_retval = 0; + const char *the_interface = p_calling_bundle->caller_interface; + char *parameter_name = argv[ 0 ]; + char parameter_value_buffer[QCSAPI_MAX_PARAMETER_VALUE_LEN] = ""; + char *parameter_value = ¶meter_value_buffer[0]; + size_t parameter_value_size = QCSAPI_MAX_PARAMETER_VALUE_LEN; + + if (strcmp(parameter_name, "NULL") == 0) { + parameter_name = NULL; + } + + if (argc > 1) { + if (strcmp(argv[1], "NULL") == 0) { + parameter_value = NULL; + } else { + parameter_value_size = (size_t) atoi(argv[1]); + } + } + + qcsapi_retval = qcsapi_config_get_parameter(the_interface, + parameter_name, + parameter_value, + parameter_value_size); + + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out(print, "%s\n", ¶meter_value_buffer[0]); + } + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } + } + + return statval; +} + +static int +call_qcsapi_config_update_parameter(call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[]) +{ + int statval = 0; + qcsapi_output *print = p_calling_bundle->caller_output; + + if (argc < 2) { + print_err( print, + "Not enough parameters in call qcsapi update persistent parameter, count is %d\n", argc); + print_err( print, "Usage: call_qcsapi update_persistent_param \n"); + statval = 1; + } else { + int qcsapi_retval = 0; + const char *the_interface = p_calling_bundle->caller_interface; + char *parameter_name = argv[ 0 ]; + char *parameter_value = argv[ 1 ]; + + if (strcmp(parameter_name, "NULL") == 0) { + parameter_name = NULL; + } + + if (strcmp(parameter_value, "NULL") == 0) { + parameter_value = NULL; + } + + qcsapi_retval = qcsapi_config_update_parameter(the_interface, parameter_name, parameter_value); + + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out( print, "complete\n"); + } + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } + } + + return statval; +} + +static int +call_qcsapi_config_get_ssid_parameter(call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[]) +{ + int statval = 0; + qcsapi_output *print = p_calling_bundle->caller_output; + + if (argc < 1) { + print_err( print, "Usage: call_qcsapi get_persistent_ssid_param \n"); + statval = 1; + } else { + int qcsapi_retval = 0; + const char *the_interface = p_calling_bundle->caller_interface; + char *parameter_name = argv[ 0 ]; + char parameter_value_buffer[QCSAPI_MAX_PARAMETER_VALUE_LEN] = ""; + char *parameter_value = ¶meter_value_buffer[0]; + size_t parameter_value_size = QCSAPI_MAX_PARAMETER_VALUE_LEN; + + if (strcmp(parameter_name, "NULL") == 0) { + parameter_name = NULL; + } + + if (argc > 1) { + if (strcmp(argv[1], "NULL") == 0) { + parameter_value = NULL; + } else { + parameter_value_size = (size_t) atoi(argv[1]); + } + } + + qcsapi_retval = qcsapi_config_get_ssid_parameter(the_interface, + parameter_name, + parameter_value, + parameter_value_size); + + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out(print, "%s\n", ¶meter_value_buffer[0]); + } + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } + } + + return statval; +} + +static int +call_qcsapi_config_update_ssid_parameter(call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[]) +{ + int statval = 0; + qcsapi_output *print = p_calling_bundle->caller_output; + + if (argc < 2) { + print_err( print, + "Not enough parameters in call_qcsapi update_persistent_ssid_parameter\n"); + print_err( print, + "Usage: call_qcsapi update_persistent_ssid_param \n"); + statval = 1; + } else { + int qcsapi_retval = 0; + const char *the_interface = p_calling_bundle->caller_interface; + char *parameter_name = argv[ 0 ]; + char *parameter_value = argv[ 1 ]; + + if (strcmp(parameter_name, "NULL") == 0) { + parameter_name = NULL; + } + + if (strcmp(parameter_value, "NULL") == 0) { + parameter_value = NULL; + } + + qcsapi_retval = qcsapi_config_update_ssid_parameter(the_interface, parameter_name, parameter_value); + + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out( print, "complete\n"); + } + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } + } + + return statval; +} + +static int +call_qcsapi_bootcfg_get_parameter(call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[]) +{ + int statval = 0; + qcsapi_output *print = p_calling_bundle->caller_output; + + if (argc < 1) { + print_err( print, + "Not enough parameters in call qcsapi get bootcfg parameter, count is %d\n", argc); + print_err( print, "Usage: call_qcsapi get_bootcfg_param \n"); + statval = 1; + } else { + int qcsapi_retval = 0; + char *parameter_name = argv[ 0 ]; + char parameter_value[QCSAPI_MAX_PARAMETER_VALUE_LEN + 1] = {'\0'}; + char *param_value_addr = ¶meter_value[0]; + size_t parameter_len = QCSAPI_MAX_PARAMETER_VALUE_LEN + 1; + + if (strcmp(parameter_name, "NULL") == 0) { + parameter_name = NULL; + } + + if (argc > 1 && strcmp(argv[1], "NULL") == 0) { + param_value_addr = NULL; + } + + if (argc > 2 && isdigit(argv[2][0])) { + parameter_len = atoi(argv[2]); + } + + qcsapi_retval = qcsapi_bootcfg_get_parameter(parameter_name, + param_value_addr, + parameter_len); + + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out( print, "%s\n", param_value_addr); + } + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } + } + + return statval; +} + +static int +call_qcsapi_bootcfg_update_parameter(call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[]) +{ + int statval = 0; + qcsapi_output *print = p_calling_bundle->caller_output; + + if (argc < 2) { + print_err( print, + "Not enough parameters in call qcsapi update bootcfg parameter, count is %d\n", argc); + print_err( print, "Usage: call_qcsapi update_bootcfg_param \n"); + statval = 1; + } else { + int qcsapi_retval = 0; + char *parameter_name = argv[0]; + char *param_value_addr = argv[1]; + + if (strcmp(parameter_name, "NULL") == 0) { + parameter_name = NULL; + } + + if (strcmp(param_value_addr, "NULL") == 0) { + param_value_addr = NULL; + } + + qcsapi_retval = qcsapi_bootcfg_update_parameter(parameter_name, param_value_addr); + + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out( print, "complete\n"); + } + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } + } + + return statval; +} + +static int +call_qcsapi_bootcfg_commit(call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[]) +{ + int statval = 0; + qcsapi_output *print = p_calling_bundle->caller_output; + int qcsapi_retval = 0; + + qcsapi_retval = qcsapi_bootcfg_commit(); + + if (qcsapi_retval >= 0) { + print_out(print, "complete\n"); + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } + + return statval; +} + +static int +call_qcsapi_service_control(call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[]) +{ + int statval = 0; + qcsapi_output *print = p_calling_bundle->caller_output; + + if (argc < 2) { + print_err( print, + "Not enough parameters in call qcsapi service_control, count is %d\n", argc); + print_err( print, "Usage: call_qcsapi service_control \n"); + statval = 1; + } else { + int qcsapi_retval = 0; + char *name = argv[0]; + char *action = argv[1]; + qcsapi_service_name serv_name; + qcsapi_service_action serv_action; + + if (strcmp(argv[0], "NULL") == 0) { + name = NULL; + } else if (strcmp(argv[0], "telnet") == 0) { + name = "inetd"; + } + if (strcmp(argv[1], "NULL") == 0) { + action = NULL; + } + + qcsapi_retval = qcsapi_get_service_name_enum(name, &serv_name); + if (qcsapi_retval >= 0) { + qcsapi_retval = qcsapi_get_service_action_enum(action, &serv_action); + } + + if (qcsapi_retval >= 0) { + qcsapi_retval = qcsapi_service_control(serv_name, serv_action); + } + + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out( print, "complete\n"); + } + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } + } + return statval; +} + +static int +call_qcsapi_wfa_cert(call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[]) +{ + int statval = 0; + int qcsapi_retval = 0; + qcsapi_output *print = p_calling_bundle->caller_output; + uint16_t enable = 1; + + if (argc > 0) { + if (safe_atou16(argv[0], &enable, print, 0, 1) == 0) + return 1; + } + + qcsapi_retval = qcsapi_wfa_cert_mode_enable(!!enable); + + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out( print, "complete\n"); + } + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } + + return statval; +} + +static int +call_qcsapi_wifi_scs_enable(call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[]) +{ + int statval = 0; + int qcsapi_retval = 0; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + uint16_t enable = 1; + + if (argc > 0) { + if (0 == safe_atou16(argv[0], &enable, print, 0, 1)) + return 1; + } + + qcsapi_retval = qcsapi_wifi_scs_enable(the_interface, enable); + + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out( print, "complete\n"); + } + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } + + return statval; +} + +static int +call_qcsapi_wifi_scs_switch_channel(call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[]) +{ + int statval = 0; + int qcsapi_retval = 0; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + + qcsapi_retval = qcsapi_wifi_scs_switch_channel(the_interface); + + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out( print, "complete\n"); + } + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } + + return statval; +} + +static int +call_qcsapi_wifi_set_scs_verbose(call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[]) +{ + int statval = 0; + int qcsapi_retval = 0; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + uint16_t enable = 1; + + if (argc > 0) { + enable = (uint16_t) atoi(argv[0]); + } + + qcsapi_retval = qcsapi_wifi_set_scs_verbose(the_interface, enable); + + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out( print, "complete\n"); + } + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } + + return statval; +} + +static int +call_qcsapi_wifi_get_scs_status(call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[]) +{ + int statval = 0; + int qcsapi_retval = 0; + qcsapi_unsigned_int status = 0; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + + qcsapi_retval = qcsapi_wifi_get_scs_status(the_interface, &status); + + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + if (status == 1) + print_out( print, "Enabled (%d)\n", status); + else if (status == 0) + print_out( print, "Disabled (%d)\n", status); + else + print_out( print, "Unknown (%d)\n", status); + } + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } + + return statval; +} + +static int +call_qcsapi_wifi_set_scs_smpl_enable(call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[]) +{ + int statval = 0; + int qcsapi_retval = 0; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + uint16_t enable = 1; + + if (argc > 0) { + enable = (uint16_t) atoi(argv[0]); + } + + qcsapi_retval = qcsapi_wifi_set_scs_smpl_enable(the_interface, enable); + + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out(print, "complete\n"); + } + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } + + return statval; +} + +static int +call_qcsapi_wifi_set_scs_smpl_dwell_time(call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[]) +{ + int statval = 0; + int qcsapi_retval = 0; + uint16_t sample_time = 0; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + + if (argc < 1) { + print_out( print, "%s: programming error, expected at least 1 additional parameter\n", __func__); + return(1); + } + + if (safe_atou16(argv[0], &sample_time, print, + IEEE80211_SCS_SMPL_DWELL_TIME_MIN, IEEE80211_SCS_SMPL_DWELL_TIME_MAX) == 0) { + return 1; + } + + qcsapi_retval = qcsapi_wifi_set_scs_smpl_dwell_time(the_interface, sample_time); + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out( print, "complete\n"); + } + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } + + return statval; +} + +static int +call_qcsapi_wifi_set_scs_sample_intv(call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[]) +{ + int statval = 0; + int qcsapi_retval = 0; + uint16_t sample_intv = 0; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + + if (safe_atou16(argv[0], &sample_intv, print, + IEEE80211_SCS_SMPL_INTV_MIN, IEEE80211_SCS_SMPL_INTV_MAX) == 0) { + return 1; + } + + qcsapi_retval = qcsapi_wifi_set_scs_sample_intv(the_interface, sample_intv); + + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out( print, "complete\n"); + } + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } + + return statval; +} + +static int +call_qcsapi_wifi_set_scs_intf_detect_intv(call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[]) +{ + int statval = 0; + int qcsapi_retval = 0; + uint16_t intv = 0; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + + if (safe_atou16(argv[0], &intv, print, + IEEE80211_SCS_CCA_DUR_MIN, IEEE80211_SCS_CCA_DUR_MAX) == 0) { + return 1; + } + + qcsapi_retval = qcsapi_wifi_set_scs_intf_detect_intv(the_interface, intv); + + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out( print, "complete\n"); + } + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } + + return statval; +} + +static int +call_qcsapi_wifi_set_scs_thrshld(call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[]) +{ + int statval = 0; + qcsapi_output *print = p_calling_bundle->caller_output; + + if (argc < 2) { + print_err( print, + "Not enough parameters in call_qcsapi set_scs_thrshld, count is %d\n", + argc); + print_err( print, + "Usage: call_qcsapi set_scs_thrshld \n"); + statval = 1; + } else { + int qcsapi_retval = 0; + const char *the_interface = p_calling_bundle->caller_interface; + char *thrshld_param_name = argv[0]; + uint16_t thrshld_value; + + if (safe_atou16(argv[1], &thrshld_value, print, + 0, 0xFFFF) == 0) { + return 1; + } + + qcsapi_retval = qcsapi_wifi_set_scs_thrshld(the_interface, thrshld_param_name, thrshld_value); + + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out( print, "complete\n"); + } + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } + } + + return statval; +} + +static int +call_qcsapi_wifi_set_scs_report_only(call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[]) +{ + + int statval = 0; + int qcsapi_retval = 0; + uint16_t report_value = 0; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + + report_value = atoi(argv[0]); + + qcsapi_retval = qcsapi_wifi_set_scs_report_only(the_interface, report_value); + + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out( print, "complete\n"); + } + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } + + return statval; +} + +static int +call_qcsapi_wifi_get_scs_report(call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[]) +{ + int statval = 0; + int qcsapi_retval; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + int i; + + if (strcmp(argv[0], "current") == 0) { + struct qcsapi_scs_currchan_rpt rpt; + qcsapi_retval = qcsapi_wifi_get_scs_currchan_report(the_interface, &rpt); + if (qcsapi_retval < 0) { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } else { + print_out(print, "SCS: current channel %d, cca_try=%u, cca_idle=%u cca_busy=%u cca_intf=%u" + " cca_tx=%u tx_ms=%u rx_ms=%u pmbl_cnt=%u\n", + rpt.chan, + rpt.cca_try, + rpt.cca_idle, + rpt.cca_busy, + rpt.cca_intf, + rpt.cca_tx, + rpt.tx_ms, + rpt.rx_ms, + rpt.pmbl); + } + } else if (strcmp(argv[0], "all") == 0) { + struct qcsapi_scs_ranking_rpt rpt; + qcsapi_retval = qcsapi_wifi_get_scs_stat_report(the_interface, &rpt); + if (qcsapi_retval < 0) { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } else { + print_out(print, "SCS ranking report: chan number = %u\n", rpt.num); + print_out(print, "chan dfs txpower cca_intf metric pmbl_ap pmbl_sta" + " age duration times\n"); + for (i = 0; i < rpt.num; i++) { + print_out(print, "%4d %3d %7d %8u %10d %10d %10d %5u %8u %5u\n", + rpt.chan[i], + rpt.dfs[i], + rpt.txpwr[i], + rpt.cca_intf[i], + rpt.metric[i], + rpt.pmbl_ap[i], + rpt.pmbl_sta[i], + rpt.metric_age[i], + rpt.duration[i], + rpt.times[i]); + } + } + } else if (strcmp(argv[0], "autochan") == 0) { + struct qcsapi_autochan_rpt rpt; + qcsapi_retval = qcsapi_wifi_get_autochan_report(the_interface, &rpt); + if (qcsapi_retval < 0) { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } else { + print_out(print, "AP: initial auto channel ranking table: chan number = %u\n", rpt.num); + print_out(print, "chan dfs txpower numbeacon cci aci metric\n"); + for (i = 0; i < rpt.num; i++) { + print_out(print, "%4d %3d %7d %10u %10d %10d %10d\n", + rpt.chan[i], + rpt.dfs[i], + rpt.txpwr[i], + rpt.numbeacons[i], + rpt.cci[i], + rpt.aci[i], + rpt.metric[i]); + } + } + } else if (strcmp(argv[0], "score") == 0) { + struct qcsapi_scs_score_rpt rpt; + qcsapi_retval = qcsapi_wifi_get_scs_score_report(the_interface, &rpt); + if (qcsapi_retval < 0) { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } else { + print_out(print, "SCS score report: channel number = %u\n", rpt.num); + print_out(print, "channel score\n"); + for (i = 0; i < rpt.num; i++) { + print_out(print, "%4d %5d\n", rpt.chan[i], rpt.score[i]); + } + } + } else { + print_err(print, "Invalid parameter:%s\nOptional choice:current all autochan score\n", argv[0]); + return 1; + } + + + + return statval; +} + +static int +call_qcsapi_wifi_set_scs_cca_intf_smth_fctr(call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[]) +{ + + int statval = 0; + int qcsapi_retval = 0; + uint8_t fctr_noxp = 0; + uint8_t fctr_xped = 0; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + + if (argc < 2) { + print_err(print, + "Not enough parameters in call_qcsapi set_scs_cca_intf_smth_fctr, count is %d\n", + argc); + print_err(print, + "Usage: call_qcsapi set_scs_cca_intf_smth_fctr " + " \n" ); + statval = 1; + } else { + fctr_noxp = atoi(argv[0]); + fctr_xped = atoi(argv[1]); + + qcsapi_retval = qcsapi_wifi_set_scs_cca_intf_smth_fctr(the_interface, fctr_noxp, fctr_xped); + + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out( print, "complete\n"); + } + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } + } + + return statval; +} + +static int +call_qcsapi_wifi_set_scs_stats(call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[]) +{ + int statval = 0; + int qcsapi_retval = 0; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + uint16_t start = 1; + + if (argc > 0) { + start = (uint16_t) atoi(argv[0]); + } + + qcsapi_retval = qcsapi_wifi_set_scs_stats(the_interface, start); + + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out(print, "complete\n"); + } + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } + + return statval; +} + +static int +call_qcsapi_wifi_set_vendor_fix(call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[]) +{ + int statval = 0; + int qcsapi_retval = 0; + const char *the_interface = p_calling_bundle->caller_interface; + int fix_param = -1; + int param_value = -1; + int i; + qcsapi_output *print = p_calling_bundle->caller_output; + + if (argc < 2) { + print_err(print, "Usage: call_qcsapi set_vendor_fix " + " \n"); + return 1; + } + + if (name_to_vendor_fix_idx(argv[0], &fix_param) == 0) { + print_err(print, "Unrecognized vendor fix param %s\n", argv[0]); + if (verbose_flag >= 0) { + print_out( print, "Supported vendor fix param:\n" ); + for (i = 0; i < ARRAY_SIZE(qcsapi_vendor_fix_table); i++) + print_out( print, "%s\n", + qcsapi_vendor_fix_table[i].fix_name); + } + return 1; + } + + if (isdigit(*argv[1])) { + param_value = atoi(argv[1]); + } else { + print_err(print, "Unrecognized vendor fix's value %s\n", argv[1]); + return 1; + } + + qcsapi_retval = qcsapi_wifi_set_vendor_fix(the_interface, + fix_param, + param_value); + + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out(print, "complete\n"); + } + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } + + return statval; +} + +static int +call_qcsapi_wifi_set_scs_chan_mtrc_mrgn(call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[]) +{ + + int statval = 0; + int qcsapi_retval = 0; + uint8_t value = 0; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + + if (argc < 1) { + print_err(print, + "Not enough parameters in call_qcsapi set_scs_chan_mtrc_mrgn, count is %d\n", + argc); + print_err(print, + "Usage: call_qcsapi set_scs_chan_mtrc_mrgn " + "\n" ); + statval = 1; + } else { + value = atoi(argv[0]); + + qcsapi_retval = qcsapi_wifi_set_scs_chan_mtrc_mrgn(the_interface, value); + + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out( print, "complete\n"); + } + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } + } + + return statval; +} + +static int +call_qcsapi_wifi_get_scs_dfs_reentry_request(call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[]) +{ + int statval = 0; + int qcsapi_retval = 0; + qcsapi_unsigned_int status = 0; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + + qcsapi_retval = qcsapi_wifi_get_scs_dfs_reentry_request(the_interface, &status); + + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out(print, "%d\n", status); + } + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } + + return statval; +} + +static int +call_qcsapi_wifi_get_scs_cca_intf( call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[] ) +{ + int statval = 0; + qcsapi_output *print = p_calling_bundle->caller_output; + + if (argc < 1) { + print_err( print, "Not enough parameters in call qcsapi to get scs cca interference\n" ); + print_err( print, "Usage: call_qcsapi get_scs_cca_intf \n" ); + statval = 1; + } + else { + int qcsapi_retval; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_unsigned_int the_channel = atoi( argv[ 0 ] ); + int cca_intf = 0; + + qcsapi_retval = qcsapi_wifi_get_scs_cca_intf( the_interface, the_channel, &cca_intf ); + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out( print, "%d\n", cca_intf ); + } + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } + } + + return( statval ); +} + +static int +call_qcsapi_wifi_get_scs_param(call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[]) +{ + int statval = 0; + int qcsapi_retval = 0; + int len = 0; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + qcsapi_scs_param_rpt *p_rpt; + + len = sizeof(*p_rpt)*SCS_PARAM_MAX; + p_rpt = (qcsapi_scs_param_rpt *)malloc(len); + if (p_rpt == NULL) { + print_err( print, "malloc failed - %s\n", __func__); + return 1; + } + + memset(p_rpt, 0, len); + qcsapi_retval = qcsapi_wifi_get_scs_param_report(the_interface, p_rpt, SCS_PARAM_MAX); + if (qcsapi_retval < 0) { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } else { + dump_scs_param(print, p_rpt); + } + + free(p_rpt); + p_rpt = NULL; + return statval; +} + +static int +call_qcsapi_wifi_start_ocac(call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[]) +{ + int statval = 0; + int qcsapi_retval; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + uint16_t channel_value = 0; + + if (argc < 1) { + print_out(print, "Usage:\n" + " call_qcsapi start_ocac wifi0 { auto | }\n"); + return 1; + } + + /* parameter parse */ + if (!strcasecmp("auto", argv[0])) { + channel_value = 0; + } else { + if (safe_atou16(argv[0], &channel_value, print, 0, 0xFFFF) == 0) { + return 1; + } + } + + qcsapi_retval = qcsapi_wifi_start_ocac(the_interface, channel_value); + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out( print, "complete\n"); + } + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } + + return( statval ); +} + +static int +call_qcsapi_wifi_stop_ocac(call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[]) +{ + int statval = 0; + int qcsapi_retval; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + + qcsapi_retval = qcsapi_wifi_stop_ocac(the_interface); + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out( print, "complete\n"); + } + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } + + return( statval ); +} + +static int +call_qcsapi_wifi_get_ocac_status(call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[]) +{ + int statval = 0; + int qcsapi_retval = 0; + qcsapi_unsigned_int status = 0; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + + qcsapi_retval = qcsapi_wifi_get_ocac_status(the_interface, &status); + + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + if (status == 1) + print_out( print, "Enabled\n"); + else if (status == 0) + print_out( print, "Disabled\n"); + else + print_out( print, "Unknown (%u)\n", status); + } + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } + + return statval; +} + +static int +call_qcsapi_wifi_set_ocac_dwell_time(call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[]) +{ + int statval = 0; + int qcsapi_retval; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + uint16_t dwell_time = 0; + + if (argc < 1) { + print_out(print, "Usage:\n" + " call_qcsapi set_ocac_dwell_time wifi0 \n"); + return 1; + } + + if (safe_atou16(argv[0], &dwell_time, print, 0, 0xFFFF) == 0) { + return 1; + } + + qcsapi_retval = qcsapi_wifi_set_ocac_dwell_time(the_interface, dwell_time); + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out( print, "complete\n"); + } + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } + + return( statval ); +} + +static int +call_qcsapi_wifi_set_ocac_duration(call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[]) +{ + int statval = 0; + int qcsapi_retval; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + uint16_t duration = 0; + + if (argc < 1) { + print_out(print, "Usage:\n" + " call_qcsapi set_ocac_duration wifi0 \n"); + return 1; + } + + if (safe_atou16(argv[0], &duration, print, 0, 0xFFFF) == 0) { + return 1; + } + + qcsapi_retval = qcsapi_wifi_set_ocac_duration(the_interface, duration); + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out( print, "complete\n"); + } + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } + + return( statval ); +} + +static int +call_qcsapi_wifi_set_ocac_cac_time(call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[]) +{ + int statval = 0; + int qcsapi_retval; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + uint16_t cac_time = 0; + + if (argc < 1) { + print_out(print, "Usage:\n" + " call_qcsapi set_ocac_cac_time wifi0 \n"); + return 1; + } + + if (safe_atou16(argv[0], &cac_time, print, 0, 0xFFFF) == 0) { + return 1; + } + + qcsapi_retval = qcsapi_wifi_set_ocac_cac_time(the_interface, cac_time); + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out( print, "complete\n"); + } + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } + + return( statval ); +} + +static int +call_qcsapi_wifi_set_ocac_report_only(call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[]) +{ + int statval = 0; + int qcsapi_retval; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + uint16_t value = 0; + + if (argc < 1) { + print_out(print, "Usage:\n" + " call_qcsapi set_ocac_report_only wifi0 { 1 | 0 }\n"); + return 1; + } + + if (safe_atou16(argv[0], &value, print, 0, 0xFFFF) == 0) { + return 1; + } + + qcsapi_retval = qcsapi_wifi_set_ocac_report_only(the_interface, value); + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out( print, "complete\n"); + } + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } + + return( statval ); +} + +static int +call_qcsapi_wifi_set_ocac_threshold(call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[]) +{ + int statval = 0; + qcsapi_output *print = p_calling_bundle->caller_output; + + if (argc < 2) { + print_err( print, + "Usage: call_qcsapi set_ocac_thrshld \n"); + statval = 1; + } else { + int qcsapi_retval = 0; + const char *the_interface = p_calling_bundle->caller_interface; + char *thrshld_param_name = argv[0]; + uint16_t thrshld_value; + + if (safe_atou16(argv[1], &thrshld_value, print, 0, 0xFFFF) == 0) { + return 1; + } + + qcsapi_retval = qcsapi_wifi_set_ocac_thrshld(the_interface, thrshld_param_name, thrshld_value); + + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out( print, "complete\n"); + } + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } + } + + return statval; +} + +static int +call_qcsapi_wifi_start_dfs_s_radio(call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[]) +{ + int statval = 0; + int qcsapi_retval; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + uint16_t channel_value = 0; + + if (argc < 1) { + print_out(print, "Usage:\n" + " call_qcsapi start_dfs_s_radio wifi0 { auto | }\n"); + return 1; + } + + /* parameter parse */ + if (!strcasecmp("auto", argv[0])) { + channel_value = 0; + } else { + if (safe_atou16(argv[0], &channel_value, print, 0, 0xFFFF) == 0) { + return 1; + } + } + + qcsapi_retval = qcsapi_wifi_start_dfs_s_radio(the_interface, channel_value); + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out( print, "complete\n"); + } + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } + + return( statval ); +} + +static int +call_qcsapi_wifi_stop_dfs_s_radio(call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[]) +{ + int statval = 0; + int qcsapi_retval; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + + qcsapi_retval = qcsapi_wifi_stop_dfs_s_radio(the_interface); + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out( print, "complete\n"); + } + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } + + return( statval ); +} + +static int +call_qcsapi_wifi_get_dfs_s_radio_status(call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[]) +{ + int statval = 0; + int qcsapi_retval = 0; + qcsapi_unsigned_int status = 0; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + + qcsapi_retval = qcsapi_wifi_get_dfs_s_radio_status(the_interface, &status); + + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + if (status == 1) + print_out( print, "Enabled\n"); + else if (status == 0) + print_out( print, "Disabled\n"); + else + print_out( print, "Unknown (%u)\n", status); + } + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } + + return statval; +} + +static int +call_qcsapi_wifi_get_dfs_s_radio_availability(call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[]) +{ + int statval = 0; + int qcsapi_retval; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + qcsapi_unsigned_int available = 0; + + qcsapi_retval = qcsapi_wifi_get_dfs_s_radio_availability(the_interface, &available); + + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + if (available == 1) + print_out( print, "Available\n"); + else + print_out( print, "Unavailable\n"); + } + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } + + return( statval ); +} + +static int +call_qcsapi_wifi_set_dfs_s_radio_dwell_time(call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[]) +{ + int statval = 0; + int qcsapi_retval; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + uint16_t dwell_time = 0; + + if (argc < 1) { + print_out(print, "Usage:\n" + " call_qcsapi set_dfs_s_radio_dwell_time wifi0 \n"); + return 1; + } + + if (safe_atou16(argv[0], &dwell_time, print, 0, 0xFFFF) == 0) { + return 1; + } + + qcsapi_retval = qcsapi_wifi_set_dfs_s_radio_dwell_time(the_interface, dwell_time); + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out( print, "complete\n"); + } + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } + + return( statval ); +} + +static int +call_qcsapi_wifi_set_dfs_s_radio_duration(call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[]) +{ + int statval = 0; + int qcsapi_retval; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + uint16_t duration = 0; + + if (argc < 1) { + print_out(print, "Usage:\n" + " call_qcsapi set_dfs_s_radio_duration wifi0 \n"); + return 1; + } + + if (safe_atou16(argv[0], &duration, print, 0, 0xFFFF) == 0) { + return 1; + } + + qcsapi_retval = qcsapi_wifi_set_dfs_s_radio_duration(the_interface, duration); + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out( print, "complete\n"); + } + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } + + return( statval ); +} + +static int +call_qcsapi_wifi_set_dfs_s_radio_cac_time(call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[]) +{ + int statval = 0; + int qcsapi_retval; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + uint16_t cac_time = 0; + + if (argc < 1) { + print_out(print, "Usage:\n" + " call_qcsapi set_dfs_s_radio_cac_time wifi0 \n"); + return 1; + } + + if (safe_atou16(argv[0], &cac_time, print, 0, 0xFFFF) == 0) { + return 1; + } + + qcsapi_retval = qcsapi_wifi_set_dfs_s_radio_cac_time(the_interface, cac_time); + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out( print, "complete\n"); + } + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } + + return( statval ); +} + +static int +call_qcsapi_wifi_set_dfs_s_radio_report_only(call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[]) +{ + int statval = 0; + int qcsapi_retval; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + uint16_t value = 0; + + if (argc < 1) { + print_out(print, "Usage:\n" + " call_qcsapi set_dfs_s_radio_report_only wifi0 { 1 | 0 }\n"); + return 1; + } + + if (safe_atou16(argv[0], &value, print, 0, 0xFFFF) == 0) { + return 1; + } + + qcsapi_retval = qcsapi_wifi_set_dfs_s_radio_report_only(the_interface, value); + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out( print, "complete\n"); + } + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } + + return( statval ); +} + +static int +call_qcsapi_wifi_set_dfs_s_radio_wea_duration(call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[]) +{ + int statval = 0; + int qcsapi_retval; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + uint32_t duration = 0; + + if (argc < 1) { + print_out(print, "Usage:\n" + " call_qcsapi set_dfs_s_radio_wea_duration wifi0 \n"); + return 1; + } + + if (safe_atou32(argv[0], &duration, print, 0, 0xFFFFFFFF) == 0) { + return 1; + } + + qcsapi_retval = qcsapi_wifi_set_dfs_s_radio_wea_duration(the_interface, duration); + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out( print, "complete\n"); + } + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } + + return( statval ); +} + +static int +call_qcsapi_wifi_set_dfs_s_radio_wea_cac_time(call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[]) +{ + int statval = 0; + int qcsapi_retval; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + uint32_t cac_time = 0; + + if (argc < 1) { + print_out(print, "Usage:\n" + " call_qcsapi set_dfs_s_radio_wea_cac_time wifi0 \n"); + return 1; + } + + if (safe_atou32(argv[0], &cac_time, print, 0, 0xFFFFFFFF) == 0) { + return 1; + } + + qcsapi_retval = qcsapi_wifi_set_dfs_s_radio_wea_cac_time(the_interface, cac_time); + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out( print, "complete\n"); + } + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } + + return( statval ); +} + +static int +call_qcsapi_wifi_set_dfs_s_radio_threshold(call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[]) +{ + int statval = 0; + qcsapi_output *print = p_calling_bundle->caller_output; + + if (argc < 2) { + print_err( print, + "Usage: call_qcsapi set_dfs_s_radio_thrshld \n"); + statval = 1; + } else { + int qcsapi_retval = 0; + const char *the_interface = p_calling_bundle->caller_interface; + char *thrshld_param_name = argv[0]; + uint16_t thrshld_value; + + if (safe_atou16(argv[1], &thrshld_value, print, 0, 0xFFFF) == 0) { + return 1; + } + + qcsapi_retval = qcsapi_wifi_set_dfs_s_radio_thrshld(the_interface, thrshld_param_name, thrshld_value); + + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out( print, "complete\n"); + } + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } + } + + return statval; +} + +static int +call_qcsapi_wifi_set_ap_isolate(call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[]) +{ + int statval = 0; + int qcsapi_retval; + int current_ap_isolate_status; + qcsapi_output *print = p_calling_bundle->caller_output; + const char *the_interface = p_calling_bundle->caller_interface; + char *endptr; + + if (argc < 1) { + print_err( print, + "Parameter count incorrect. Should be 3, is %d\n", argc + ); + statval = 1; + } else { + endptr = NULL; + current_ap_isolate_status = strtol(argv[ 0 ], &endptr, 10); + if (!endptr || (*endptr != 0) || ((endptr - 1) != argv[0]) ) { + print_err( print, "Invalid isolation settting. Should be 0 or 1\n"); + statval = 1; + } else { + qcsapi_retval = qcsapi_wifi_set_ap_isolate(the_interface, current_ap_isolate_status); + + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out(print, "complete\n"); + } + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } + } + } + + return( statval ); +} + +static int +call_qcsapi_wifi_get_ap_isolate(call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[]) +{ + int statval = 0; + int qcsapi_retval; + int current_ap_isolate_status = (int)qcsapi_ap_isolate_disabled; + int *p_current_ap_isolate_status = NULL; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + + if (argc < 1 || strcmp( argv[ 0 ], "NULL" ) != 0) { + p_current_ap_isolate_status = ¤t_ap_isolate_status; + } + + qcsapi_retval = qcsapi_wifi_get_ap_isolate(the_interface, p_current_ap_isolate_status); + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out(print, "%d\n", current_ap_isolate_status); + } + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } + + return( statval ); +} + +static int +call_qcsapi_get_interface_stats(call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[]) +{ + int statval = 0; + int qcsapi_retval; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + qcsapi_interface_stats stats; + + qcsapi_retval = qcsapi_get_interface_stats( the_interface, &stats ); + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + if (sizeof(long) == 8) { + print_out(print, "tx_bytes:\t%llu\n" + "tx_pkts:\t%u\n" + "tx_discard:\t%u\n" + "tx_err:\t\t%u\n" + "tx_unicast:\t%u\n" + "tx_multicast:\t%u\n" + "tx_broadcast:\t%u\n" + "rx_bytes:\t%llu\n" + "rx_pkts:\t%u\n" + "rx_discard:\t%u\n" + "rx_err:\t\t%u\n" + "rx_unicast:\t%u\n" + "rx_multicast:\t%u\n" + "rx_broadcast:\t%u\n" + "rx_unknown:\t%u\n", + stats.tx_bytes, + stats.tx_pkts, + stats.tx_discard, + stats.tx_err, + stats.tx_unicast, + stats.tx_multicast, + stats.tx_broadcast, + stats.rx_bytes, + stats.rx_pkts, + stats.rx_discard, + stats.rx_err, + stats.rx_unicast, + stats.rx_multicast, + stats.rx_broadcast, + stats.rx_unknown); + } else { + print_out(print, "tx_bytes:\t%llu\n" + "tx_pkts:\t%lu\n" + "tx_discard:\t%lu\n" + "tx_err:\t\t%lu\n" + "tx_unicast:\t%lu\n" + "tx_multicast:\t%lu\n" + "tx_broadcast:\t%lu\n" + "rx_bytes:\t%llu\n" + "rx_pkts:\t%lu\n" + "rx_discard:\t%lu\n" + "rx_err:\t\t%lu\n" + "rx_unicast:\t%lu\n" + "rx_multicast:\t%lu\n" + "rx_broadcast:\t%lu\n" + "rx_unknown:\t%lu\n", + stats.tx_bytes, + stats.tx_pkts, + stats.tx_discard, + stats.tx_err, + stats.tx_unicast, + stats.tx_multicast, + stats.tx_broadcast, + stats.rx_bytes, + stats.rx_pkts, + stats.rx_discard, + stats.rx_err, + stats.rx_unicast, + stats.rx_multicast, + stats.rx_broadcast, + stats.rx_unknown); + + } + } + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } + + return( statval ); +} + +static int +call_qcsapi_get_phy_stats(call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[]) +{ + int statval = 0; + int iter; + int qcsapi_retval; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + qcsapi_phy_stats stats; + + qcsapi_retval = qcsapi_get_phy_stats( the_interface, &stats ); + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out(print, "tstamp=\t\t%u\n" + "assoc=\t\t%u\n" + "channel=\t%u\n" + "attenuation=\t%u\n" + "cca_total=\t%u\n" + "cca_tx=\t\t%u\n" + "cca_rx=\t\t%u\n" + "cca_int=\t%u\n" + "cca_idle\t%u\n" + "rx_pkts=\t%u\n" + "rx_gain=\t%u\n" + "rx_cnt_crc=\t%u\n" + "rx_noise=\t%5.1f\n" + "tx_pkts=\t%u\n" + "tx_defers=\t%d\n" + "tx_touts=\t%u\n" + "tx_retries=\t%u\n" + "cnt_sp_fail=\t%u\n" + "cnt_lp_fail=\t%u\n" + "last_rx_mcs=\t%d\n" + "last_tx_mcs=\t%d\n", + stats.tstamp, + stats.assoc, + stats.channel, + stats.atten, + stats.cca_total, + stats.cca_tx, + stats.cca_rx, + stats.cca_int, + stats.cca_idle, + stats.rx_pkts, + stats.rx_gain, + stats.rx_cnt_crc, + stats.rx_noise, + stats.tx_pkts, + stats.tx_defers, + stats.tx_touts, + stats.tx_retries, + stats.cnt_sp_fail, + stats.cnt_lp_fail, + stats.last_rx_mcs, + stats.last_tx_mcs); + print_out(print, "last_evm=\t%5.1f\n", stats.last_evm); + for (iter = 0; iter < QCSAPI_QDRV_NUM_RF_STREAMS; iter++) { + print_out(print, "last_evm_%d=\t%5.1f\n", iter, stats.last_evm_array[iter]); + } + + print_out(print, "last_rcpi=\t%5.1f\n", stats.last_rcpi); + + print_out(print, "last_rssi=\t%5.1f\n", stats.last_rssi); + for (iter = 0; iter < QCSAPI_QDRV_NUM_RF_STREAMS; iter++) { + print_out(print, "last_rssi_%d=\t%5.1f\n", iter, stats.last_rssi_array[iter]); + } + } + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } + + return statval; +} + +static int +call_qcsapi_telnet_enable(call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[]) +{ + int statval = 0; + qcsapi_output *print = p_calling_bundle->caller_output; + qcsapi_unsigned_int on_off; + + if (argc < 1) { + print_err( print, "Usage: call_qcsapi enable_telnet \n"); + print_err( print, "Usage: value: 0 - disable; 1 - enable\n"); + statval = 1; + } else { + int qcsapi_retval = 0; + char *parameter_value = argv[0]; + + if (strcmp(parameter_value, "1") && strcmp(parameter_value, "0")) { + print_err( print, "Usage: call_qcsapi enable_telnet \n"); + print_err( print, "Usage: value: 0 - disable; 1 - enable\n"); + return 1; + } + + on_off = (qcsapi_unsigned_int)atoi(parameter_value); + qcsapi_retval = qcsapi_telnet_enable(on_off); + + if (qcsapi_retval == 0) { + if (verbose_flag >= 0) { + print_out( print, "complete\n"); + } + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } + } + + return statval; +} + +static int +call_qcsapi_wps_set_access_control(call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[]) +{ + int statval = 0; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + int qcsapi_retval = 0; + uint32_t pp_enable; + char wps_state[32]; + + if (argc < 1) { + print_err( print, "Usage: call_qcsapi set_wps_access_control \n" ); + print_err( print, "Usage: value: 0 - disable; 1 - enable\n" ); + statval = 1; + } else { + char *parameter_value = argv[0]; + + if (!strcmp(parameter_value, "1")) { + pp_enable = 1; + } else if (!strcmp(parameter_value, "0")) { + pp_enable = 0; + } else { + print_err( print, "Usage: call_qcsapi set_wps_access_control \n" ); + print_err( print, "Usage: value: 0 - disable; 1 - enable\n" ); + return 1; + } + + qcsapi_retval = qcsapi_wps_get_configured_state(the_interface, wps_state, sizeof(wps_state)); + if (qcsapi_retval >= 0) { + if (strncmp(wps_state, "configured", sizeof(wps_state)) != 0) { + print_err(print, "enable WPS feature before setup WPS Access control\n"); + return 1; + } + } + + if (qcsapi_retval >= 0) + qcsapi_retval = qcsapi_wps_set_access_control( the_interface, pp_enable ); + } + + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out( print, "complete\n" ); + } + } else { + report_qcsapi_error( p_calling_bundle, qcsapi_retval ); + statval = 1; + } + + return statval; +} + +static int +call_qcsapi_wps_get_access_control(call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[]) +{ + int statval = 0; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + int qcsapi_retval = 0; + uint32_t pp_enable; + + if (argc > 0) { + print_err( print, "Usage: call_qcsapi get_wps_access\n" ); + print_err( print, "Usage: This command is used to get pair protection state \n" ); + statval = 1; + } else { + qcsapi_retval = qcsapi_wps_get_access_control( the_interface, &pp_enable ); + + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out( print, "%s\n", (pp_enable ? "1":"0") ); + } + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } + } + + return statval; +} + +static int +call_qcsapi_non_wps_set_pp_enable(call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[]) +{ + int statval = 0; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + int qcsapi_retval = 0; + uint32_t pp_enable; + + if (argc < 1) { + print_err( print, "Usage: call_qcsapi set_non_wps_pp_enable \n" ); + print_err( print, "Usage: value: 0 - disable; 1 - enable\n" ); + statval = 1; + } else { + char *parameter_value = argv[0]; + + if (!strcmp(parameter_value, "1")) { + pp_enable = 1; + } else if (!strcmp(parameter_value, "0")) { + pp_enable = 0; + } else { + print_err( print, "Usage: call_qcsapi set_non_wps_pp_enable \n" ); + print_err( print, "Usage: value: 0 - disable; 1 - enable\n" ); + return 1; + } + + qcsapi_retval = qcsapi_non_wps_set_pp_enable( the_interface, pp_enable ); + } + + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out( print, "complete\n" ); + } + } else { + report_qcsapi_error( p_calling_bundle, qcsapi_retval ); + statval = 1; + } + + return statval; +} + +static int +call_qcsapi_non_wps_get_pp_enable(call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[]) +{ + int statval = 0; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + int qcsapi_retval = 0; + uint32_t pp_enable; + + if (argc > 0) { + print_err( print, "Usage: call_qcsapi get_non_wps_pp_enable\n" ); + print_err( print, "Usage: This command is used to get non_wps pair protection state \n" ); + statval = 1; + } else { + qcsapi_retval = qcsapi_non_wps_get_pp_enable( the_interface, &pp_enable ); + + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out( print, "%s\n", (pp_enable ? "1":"0") ); + } + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } + } + + return statval; +} + +static int +call_qcsapi_wps_cancel(call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[]) +{ + int statval = 0; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + int qcsapi_retval = 0; + + if (argc > 0) { + print_err( print, "Usage: call_qcsapi wps_cancel \n" ); + statval = 1; + } else { + qcsapi_retval = qcsapi_wps_cancel(the_interface); + + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out( print, "complete\n"); + } + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } + } + + return statval; +} + +static int +call_qcsapi_wps_set_pbc_in_srcm(call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[]) +{ + int statval = 0; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + int qcsapi_retval = 0; + uint16_t enabled = 0; + + if (argv[0] != NULL && safe_atou16(argv[0], &enabled, print, 0, 1)) + qcsapi_retval = qcsapi_wps_set_pbc_in_srcm(the_interface, enabled); + else + return 1; + + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) + print_out(print, "complete\n"); + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } + + return statval; +} + +static int +call_qcsapi_wps_get_pbc_in_srcm(call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[]) +{ + int statval = 0; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + int qcsapi_retval = 0; + qcsapi_unsigned_int enabled = 0; + + qcsapi_retval = qcsapi_wps_get_pbc_in_srcm(the_interface, &enabled); + + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) + print_out(print, "%d\n", enabled); + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } + + return statval; +} + +static int call_qcsapi_wps_set_timeout(call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[]) +{ + int statval = 0; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + int qcsapi_retval = 0; + int timeout_val = 0; + + if (argc < 0) { + print_out(print, "Usage: call_qcsapi wps_timeout \n"); + statval = 1; + } else { + timeout_val = atoi(argv[0]); + if (timeout_val < 120 || timeout_val > 600) { + print_out(print, "Error: timeout should be limited from 120s to 600s\n"); + statval = 1; + } else { + qcsapi_retval = qcsapi_wps_set_timeout(the_interface, timeout_val); + + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out( print, "complete\n"); + } + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } + } + } + + return statval; +} + +static int call_qcsapi_wps_on_hidden_ssid(call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[]) +{ + int statval = 0; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + int qcsapi_retval = 0; + int option = -1; + + if (argc < 0) { + print_out(print, "Usage: call_qcsapi wps_on_hidden_ssid <0 | 1>\n"); + statval = 1; + } else { + option = atoi(argv[0]); + if ((strlen(argv[0]) != 1) || (!isdigit(*argv[0])) || ((option != 0) && (option != 1))) { + print_out(print, "Usage: call_qcsapi wps_on_hidden_ssid <0 | 1>\n"); + statval = 1; + } else { + qcsapi_retval = qcsapi_wps_on_hidden_ssid(the_interface, option); + + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out( print, "complete\n"); + } + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } + } + } + + return statval; +} + +static int call_qcsapi_wps_on_hidden_ssid_status(call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[]) +{ + int statval = 0; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + int qcsapi_retval = 0; + char state[64]; + + if (argc > 0) { + print_out(print, "Usage: call_qcsapi wps_on_hidden_ssid_status \n"); + statval = 1; + } else { + qcsapi_retval = qcsapi_wps_on_hidden_ssid_status(the_interface, state, sizeof(state)); + + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out( print, "%s\n", state); + } + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } + } + + return statval; +} + +static int call_qcsapi_wps_upnp_enable(call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[]) +{ + int statval = 0; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + int qcsapi_retval = 0; + int option = -1; + + if (argc < 0) { + print_out(print, "Usage: call_qcsapi wps_upnp_enable <0 | 1>\n"); + statval = 1; + } else { + option = atoi(argv[0]); + if ((strlen(argv[0]) != 1) || (!isdigit(*argv[0])) || ((option != 0) && (option != 1))) { + print_out(print, "Usage: call_qcsapi wps_upnp_enable <0 | 1>\n"); + statval = 1; + } else { + qcsapi_retval = qcsapi_wps_upnp_enable(the_interface, option); + + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out( print, "complete\n"); + } + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } + } + } + + return statval; +} + +static int call_qcsapi_wps_upnp_status(call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[]) +{ + int statval = 0; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + int qcsapi_retval = 0; + char reply_buffer[16]; + + if (argc > 0) { + print_out(print, "Usage: call_qcsapi wps_upnp_status \n"); + statval = 1; + } else { + memset(reply_buffer, 0, sizeof(reply_buffer)); + qcsapi_retval = qcsapi_wps_upnp_status(the_interface, reply_buffer, sizeof(reply_buffer)); + + if (qcsapi_retval >= 0) { + print_out(print, "%s\n", reply_buffer); + if (verbose_flag >= 0) { + print_out( print, "complete\n"); + } + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } + } + + return statval; +} + +static int call_qcsapi_wps_registrar_set_dfl_pbc_bss(call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[]) +{ + int statval = 0; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + int qcsapi_retval = 0; + + if (argc > 0) { + print_out(print, "Usage: call_qcsapi registrar_set_default_pbc_bss \n"); + statval = 1; + } else { + qcsapi_retval = qcsapi_registrar_set_default_pbc_bss(the_interface); + + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out( print, "complete\n"); + } + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } + } + + return statval; +} + +static int call_qcsapi_wps_registrar_get_dfl_pbc_bss(call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[]) +{ + int statval = 0; + qcsapi_output *print = p_calling_bundle->caller_output; + int qcsapi_retval = 0; + char reply_buffer[16]; + + if (argc > 0) { + print_out(print, "Usage: call_qcsapi registrar_get_default_pbc_bss\n"); + statval = 1; + } else { + memset(reply_buffer, 0, sizeof(reply_buffer)); + qcsapi_retval = qcsapi_registrar_get_default_pbc_bss(reply_buffer, sizeof(reply_buffer)); + + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out(print, "%s\n", reply_buffer); + } + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } + } + + return statval; +} + +static int +call_qcsapi_reset_all_counters(call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[]) +{ + int statval = 0; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + qcsapi_unsigned_int node_index = p_calling_bundle->caller_generic_parameter.index; + int local_remote_flag = QCSAPI_LOCAL_NODE; + int qcsapi_retval = 0; + + if (argc > 0) { + if (parse_local_remote_flag(print, argv[0], &local_remote_flag) < 0) { + return 1; + } + } + + qcsapi_retval = qcsapi_reset_all_counters(the_interface, node_index, local_remote_flag); + + if (qcsapi_retval == 0) { + if (verbose_flag >= 0) { + print_out( print, "complete\n"); + } + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } + + return statval; +} + +static int +call_qcsapi_test_traffic(call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[]) +{ + int statval = 0; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + int qcsapi_retval = 0; + uint32_t period = 0; + + if (argc < 1 || argc > 2) { + statval = 1; + } else { + if ((argc == 2) && (!strcasecmp("start", argv[0]))) { + sscanf(argv[1], "%u", &period); + if (period < 10) { + statval = 1; + print_err( print, " MUST >= 10 milliseconds for \"start\"\n"); + goto out; + } + } else if ((argc == 1) && (!strcasecmp("stop", argv[0]))) { + period = 0; + } else { + statval = 1; + goto out; + } + + qcsapi_retval = qcsapi_wifi_test_traffic( the_interface, period ); + + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out( print, "complete\n" ); + } + } else { + report_qcsapi_error( p_calling_bundle, qcsapi_retval ); + statval = 1; + } + } + +out: + if (statval != 0 && qcsapi_retval >= 0) { + print_err( print, "Usage: call_qcsapi test_traffic \n" ); + print_err( print, "Usage: This command is used to start or stop the test traffic\n" ); + } + return statval; +} + +static int +call_qcsapi_pm_get_set_mode(call_qcsapi_bundle *call, int argc, char *argv[]) +{ + qcsapi_output *print = call->caller_output; + int level; + int rc = 0; + + if (argc == 1) { + const char *arg = argv[0]; + if (strcmp(arg, "off") == 0) { + level = QCSAPI_PM_MODE_DISABLE; + } else if (strcmp(arg, "on") == 0 || strcmp(arg, "auto") == 0) { + level = QCSAPI_PM_MODE_AUTO; + } else if (strcmp(arg, "suspend") == 0) { + level = QCSAPI_PM_MODE_SUSPEND; + } else { + print_err(print, "%s: could not parse '%s'\n", __FUNCTION__, arg); + rc = -EINVAL; + goto out; + } + + rc = qcsapi_pm_set_mode(level); + } else if (argc == 0) { + rc = qcsapi_pm_get_mode(&level); + if (rc < 0 || verbose_flag < 0) { + goto out; + } + + switch (level) { + case QCSAPI_PM_MODE_DISABLE: + print_out(print, "off\n"); + break; + case QCSAPI_PM_MODE_SUSPEND: + print_out(print, "suspend\n"); + break; + default: + print_out(print, "auto\n"); + break; + } + } else { + rc = -EINVAL; + } + +out: + if (rc < 0) { + report_qcsapi_error(call, rc); + } + + return rc; +} + +static int +call_qcsapi_qpm_get_level(call_qcsapi_bundle *call, int argc, char *argv[]) +{ + qcsapi_output *print = call->caller_output; + int qpm_level; + int rc = 0; + + if (argc == 0) { + rc = qcsapi_get_qpm_level(&qpm_level); + if (rc < 0 || verbose_flag < 0) { + goto out; + } + print_out(print, "%d\n", qpm_level); + + } else { + rc = -EINVAL; + } + +out: + if (rc < 0) { + report_qcsapi_error(call, rc); + } + + return rc; +} + +static int +call_qcsapi_restore_default_config(call_qcsapi_bundle *call, int argc, char *argv[]) +{ + int flag = 0; + char *argp; + int rc; + + while (argc > 0) { + argp = argv[argc - 1]; + if (strcmp(argp, "1") == 0 || + strcmp(argp, "ip") == 0) { + flag |= QCSAPI_RESTORE_FG_IP; + } else if (strcmp(argp, "noreboot") == 0) { + flag |= QCSAPI_RESTORE_FG_NOREBOOT; + } else if (strcmp(argp, "ap") == 0) { + flag |= QCSAPI_RESTORE_FG_AP; + } else if (strcmp(argp, "sta") == 0) { + flag |= QCSAPI_RESTORE_FG_STA; + } + argc--; + } + + rc = qcsapi_restore_default_config(flag); + + if (rc < 0) + report_qcsapi_error(call, rc); + + return rc; +} + +static int g_is_qtm = 0; + +typedef int(*call_qcsapi_vsp_fn)(call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[]); + +struct call_qcsapi_fnmap { + const char *name; + call_qcsapi_vsp_fn func; +}; + +static call_qcsapi_vsp_fn call_qcsapi_fnmap_find(const char *name, const struct call_qcsapi_fnmap *map, size_t map_size) +{ + int i; + for (i = 0; i < map_size; i++) { + + /* skip whitelist */ + if (g_is_qtm && strcmp(map[i].name, "wl") == 0) + continue; + + if (strcmp(map[i].name, name) == 0) { + return map[i].func; + } + } + + return NULL; +} + +static const struct qvsp_cfg_param qvsp_cfg_params[] = QVSP_CFG_PARAMS; + +static uint32_t +qvsp_cfg_param_get(const char *name) +{ + int i; + + for (i = 0; i < QVSP_CFG_MAX; i++) { + if (strcmp(name, qvsp_cfg_params[i].name) == 0) { + return i; + } + } + return QVSP_CFG_MAX; +} + +static uint32_t qvsp_cfg_name_len = 0; +static uint32_t qvsp_cfg_units_len = 0; +static uint32_t qvsp_rule_name_len = 0; +static uint32_t qvsp_rule_units_len = 0; +static int qvsp_show_cfg_initialised = 0; + +static const char *qvsp_inactive_reason[] = QVSP_INACTIVE_REASON; + +/* + * Getting VSP version: whether it is VSP (v1 for Ruby) or QTM (Quantenna Traffic Management, v2 for Topaz) + */ +static int +qvsp_is_qtm() +{ + struct qcsapi_data_512bytes *stats; + struct qvsp_stats *p_stats; + int rc; + + stats = malloc(sizeof(*stats)); + if (stats == NULL) + return -ENOMEM; + p_stats = (struct qvsp_stats *)stats->data; + rc = qcsapi_qtm_get_stats("wifi0", stats); + free(stats); + if (rc < 0) { + return rc; + } + + return p_stats->is_qtm; +} + +static int +call_qcsapi_vsp_is_active(call_qcsapi_bundle *call) +{ + qcsapi_output *print = call->caller_output; + unsigned long inactive_flags = 0; + int rc; + int i; + int first = 1; + + rc = qcsapi_qtm_get_inactive_flags(call->caller_interface, &inactive_flags); + if (rc || inactive_flags) { + if (rc == 0) { + print_out(print, "QTM is inactive - reason:"); + + for ( i = 0; i < ARRAY_SIZE(qvsp_inactive_reason); i++) { + if ((inactive_flags & 0x1) && qvsp_inactive_reason[i]) { + if (!first) { + print_out(print, ", %s", qvsp_inactive_reason[i]); + } else { + print_out(print, " %s", qvsp_inactive_reason[i]); + first = 0; + } + } + inactive_flags >>= 1; + } + print_out(print, "\n"); + } + return -EPERM; + } + + return rc; +} + +static int +call_qcsapi_vsp_is_enabled(call_qcsapi_bundle *call) +{ + qcsapi_output *print = call->caller_output; + unsigned int enabled; + int rc; + + rc = qcsapi_qtm_get_config(call->caller_interface, QVSP_CFG_ENABLED, &enabled); + if (rc || (enabled == 0)) { + print_out(print, "QTM is not enabled\n"); + return -EPERM; + } + + return rc; +} + +static void +call_qcsapi_vsp_cfg_paramlist(qcsapi_output *print) +{ + int i; + const struct qvsp_cfg_param *param; + int buflen = qvsp_cfg_name_len + qvsp_cfg_units_len + 5; + char buf[buflen]; + + print_out(print, "Parameters\n"); + + + for (i = 0; i < QVSP_CFG_MAX; i++) { + param = &qvsp_cfg_params[i]; + snprintf(buf, buflen, "%s <%s>", + param->name, param->units); + print_out(print, " %-*s - %s [%u to %u]\n", + buflen, + buf, + param->desc, + param->min_val, + param->max_val); + } +} + +static void +call_qcsapi_vsp_get_usage(qcsapi_output *print) +{ + print_out(print, "Usage\n" + " qtm get \n\n"); + + call_qcsapi_vsp_cfg_paramlist(print); +} + +static void +call_qcsapi_vsp_set_usage(qcsapi_output *print) +{ + print_out(print, "Usage\n" + " qtm set \n\n"); + + call_qcsapi_vsp_cfg_paramlist(print); +} + +static int +call_qcsapi_vsp_get(call_qcsapi_bundle *call, int argc, char *argv[]) +{ + qcsapi_output *print = call->caller_output; + unsigned int index; + unsigned int value; + int ret; + + if (argc != 1) { + call_qcsapi_vsp_get_usage(print); + return -EINVAL; + } + + index = qvsp_cfg_param_get(argv[0]); + if (index >= QVSP_CFG_MAX) { + call_qcsapi_vsp_get_usage(print); + return -EINVAL; + } + + ret = qcsapi_qtm_get_config(call->caller_interface, index, &value); + if (ret) { + if (ret == -EINVAL) { + call_qcsapi_vsp_set_usage(print); + } else if (ret == -qcsapi_not_supported) { + print_err(print, "QTM is not supported\n"); + } else { + print_err(print, "QTM get command failed\n"); + } + return ret; + } + + print_out(print, "%u\n", value); + + return 0; +} + +static int +call_qcsapi_vsp_set(call_qcsapi_bundle *call, int argc, char *argv[]) +{ + qcsapi_output *print = call->caller_output; + unsigned int index; + unsigned int value; + int ret; + + if (argc != 2) { + call_qcsapi_vsp_set_usage(print); + return -EINVAL; + } + + index = qvsp_cfg_param_get(argv[0]); + ret = sscanf(argv[1], "%u", &value); + + if (index >= QVSP_CFG_MAX) { + print_err(print, "Invalid argument: '%s'\n", argv[0]); + call_qcsapi_vsp_set_usage(print); + return -EINVAL; + } else if (ret != 1) { + print_err(print, "Error parsing argument '%s'\n", argv[1]); + return -EINVAL; + } + + ret = qcsapi_qtm_set_config(call->caller_interface, index, value); + if (ret != 0) { + if (ret == -EINVAL) { + call_qcsapi_vsp_set_usage(print); + } else if (ret == -qcsapi_not_supported) { + print_err(print, "QTM is not supported\n"); + } else { + print_err(print, "QTM set command failed\n"); + } + return -EINVAL; + } + + return 0; +} + +const struct qvsp_rule_param qvsp_rule_params[] = QVSP_RULE_PARAMS; + +static uint32_t +qvsp_rule_param_get(const char *name) +{ + int i; + + for (i = 0; i < QVSP_RULE_PARAM_MAX; i++) { + if (strcmp(name, qvsp_rule_params[i].name) == 0) { + return i; + } + } + return QVSP_RULE_PARAM_MAX; +} + +const static char *qvsp_rule_order_desc[] = QVSP_RULE_ORDER_DESCS; +const static char *qvsp_rule_order_desc_abbr[] = QVSP_RULE_ORDER_DESCS_ABBR; +const static char *qvsp_rule_dir_desc[] = QVSP_RULE_DIR_DESCS; +const static char *qvsp_if_desc[] = QVSP_IF_DESCS; +const static char *qvsp_strm_throt_desc_abbr[] = QVSP_STRM_THROT_DESCS_ABBR; + +static void +call_qcsapi_vsp_rule_usage(qcsapi_output *print) +{ + const struct qvsp_rule_param *rule_param; + int i; + int j; + int buflen = qvsp_rule_name_len + qvsp_rule_units_len + 6; + char buf[buflen]; + + print_out(print, "Usage\n" + " qtm rule add [ ...]\n" + " - set a stream matching rule\n" + " qtm rule del - delete all stream matching rules\n" + " qtm rule del []\n" + " - delete a stream matching rule\n" + "\n" + "Parameters\n"); + + for (i = 0; i < QVSP_RULE_PARAM_MAX; i++) { + rule_param = &qvsp_rule_params[i]; + snprintf(buf, buflen, " %s <%s>", + rule_param->name, rule_param->units); + print_out(print, "%-*s - %s [%u to %u]\n", + buflen, + buf, + rule_param->desc, + rule_param->min_val, + rule_param->max_val); + switch (i) { + case QVSP_RULE_PARAM_DIR: + print_out(print, "%-*s %u = Any\n", buflen, "", QVSP_RULE_DIR_ANY); + print_out(print, "%-*s %u = Tx\n", buflen, "", QVSP_RULE_DIR_TX); + print_out(print, "%-*s %u = Rx\n", buflen, "", QVSP_RULE_DIR_RX); + break; + case QVSP_RULE_PARAM_VAPPRI: + print_out(print, "%-*s 0x01 = VAP Priority 0\n", buflen, ""); + print_out(print, "%-*s 0x02 = VAP Priority 1\n", buflen, ""); + print_out(print, "%-*s 0x04 = VAP Priority 2\n", buflen, ""); + print_out(print, "%-*s 0x08 = VAP Priority 3\n", buflen, ""); + break; + case QVSP_RULE_PARAM_AC: + print_out(print, "%-*s 0x01 = Best Effort (0)\n", buflen, ""); + print_out(print, "%-*s 0x02 = Background (1)\n", buflen, ""); + print_out(print, "%-*s 0x04 = Video (2)\n", buflen, ""); + print_out(print, "%-*s 0x08 = Voice (3)\n", buflen, ""); + break; + case QVSP_RULE_PARAM_ORDER: + for (j = 0; j < QVSP_RULE_ORDER_MAX; j++) { + print_out(print, "%-*s %u - %s\n", + buflen, + "", + j, + qvsp_rule_order_desc[j]); + } + break; + default: + break; + } + } +} + +static int call_qcsapi_vsp_rule_parse(qcsapi_output *print, + int argc, char **argv, struct qvsp_rule_flds *rule_fields) +{ + const struct qvsp_rule_param *rule_param; + uint32_t rule_param_num; + uint32_t val; + int i; + int ret; + + /* Must be field/value pairs */ + if (argc & 0x1) { + call_qcsapi_vsp_rule_usage(print); + return -EINVAL; + } + + memset(rule_fields, 0, sizeof(*rule_fields)); + /* fields that are not 0 by default */ + rule_fields->param[QVSP_RULE_PARAM_THROT_POLICY] = QVSP_STRM_THROT_ADPT; + if (!g_is_qtm) + rule_fields->param[QVSP_RULE_PARAM_DEMOTE] = 1; + + for (i = 0; i < argc; i = i + 2) { + ret = sscanf(argv[i + 1], "%u", &val); + if (ret != 1) { + print_err(print, "QTM: error parsing number: '%s'\n", argv[i + 1]); + return -EINVAL; + } + + rule_param_num = qvsp_rule_param_get(argv[i]); + if (rule_param_num == QVSP_RULE_PARAM_MAX) { + print_err(print, "QTM: invalid rule - %s\n", argv[i]); + return -EINVAL; + } + + rule_param = &qvsp_rule_params[rule_param_num]; + + if ((val < rule_param->min_val) || (val > rule_param->max_val)) { + print_err(print, "QTM: value for %s must be between %u and %u\n", + argv[i], rule_param->min_val, rule_param->max_val); + return -EINVAL; + } + + if ((rule_param_num == QVSP_RULE_PARAM_PROTOCOL) && + (val != IPPROTO_UDP) && (val != IPPROTO_TCP)) { + print_err(print, "QTM: protocol must be %u (TCP) or %u (UDP)\n", + IPPROTO_TCP, IPPROTO_UDP); + return -EINVAL; + } + + rule_fields->param[rule_param_num] = val; + } + + return 0; +} + + +static int +call_qcsapi_vsp_rule_add(call_qcsapi_bundle *call, int argc, char *argv[]) +{ + qcsapi_output *print = call->caller_output; + struct qvsp_rule_flds rule_fields; + struct qcsapi_data_128bytes rule_flds_buf; + int rc; + + if (argc == 0) { + call_qcsapi_vsp_rule_usage(print); + return -EINVAL; + } + + rc = call_qcsapi_vsp_rule_parse(print, argc, argv, &rule_fields); + if (rc) { + return rc; + } + + memcpy(rule_flds_buf.data, &rule_fields, sizeof(rule_flds_buf.data)); + return qcsapi_qtm_add_rule(call->caller_interface, &rule_flds_buf); +} + +static int +call_qcsapi_vsp_rule_del(call_qcsapi_bundle *call, int argc, char *argv[]) +{ + qcsapi_output *print = call->caller_output; + struct qvsp_rule_flds rule_fields; + struct qcsapi_data_128bytes rule_flds_buf; + int rc; + + if (argc >= 2 && argc % 2 == 0) { + rc = call_qcsapi_vsp_rule_parse(print, argc, argv, &rule_fields); + if (rc) { + return rc; + } + + memcpy(rule_flds_buf.data, &rule_fields, sizeof(rule_flds_buf.data)); + return qcsapi_qtm_del_rule(call->caller_interface, &rule_flds_buf); + } else if (argc == 1) { + unsigned int index; + rc = sscanf(argv[0], "%u", &index); + if (rc != 1) { + print_err(print, "Error parsing argument '%s'\n", argv[0]); + return -EINVAL; + } + + return qcsapi_qtm_del_rule_index(call->caller_interface, index); + } else if (argc == 0) { + return qcsapi_qtm_del_rule_index(call->caller_interface, ~0); + } else { + call_qcsapi_vsp_rule_usage(print); + return -EINVAL; + } +} + +static const char * +call_qcsapi_vsp_dir_desc(enum qvsp_rule_dir_e dir) +{ + if (dir < ARRAY_SIZE(qvsp_rule_dir_desc)) { + return qvsp_rule_dir_desc[dir]; + } + return "invalid"; +} + +static int +call_qcsapi_vsp_rule_getlist(call_qcsapi_bundle *call, int argc, char *argv[]) +{ + qcsapi_output *print = call->caller_output; + const static unsigned int MAX_RULES = 64; + const struct qvsp_rule_param *rule_param; + struct qcsapi_data_3Kbytes *rules_buf; + struct qvsp_rule_flds *rules; + struct qvsp_rule_flds default_rule; + int n; + int i; + int j; + int rc = 0; + + rules_buf = malloc(sizeof(struct qcsapi_data_3Kbytes)); + if (rules_buf == NULL) + return -ENOMEM; + rules = (struct qvsp_rule_flds *)rules_buf->data; + + memset(&default_rule, 0, sizeof(default_rule)); + n = qcsapi_qtm_get_rule(call->caller_interface, rules_buf, MAX_RULES); + if (n < 0) { + rc = n; + goto out; + } + + print_out(print, "Rules\n"); + print_out(print, " Rule "); + for (i = 0; i < QVSP_RULE_PARAM_MAX; i++) { + rule_param = &qvsp_rule_params[i]; + print_out(print, "%-8s ", rule_param->name); + } + print_out(print, "\n"); + + if (n == 0) { + print_out(print, " no rules configured\n"); + } + for (j = 0; j < n; j++) { + const struct qvsp_rule_flds *rf = &rules[j]; + + if (memcmp(&rules[j], &default_rule, sizeof(default_rule)) == 0) { + print_out(print, " dflt "); + } else { + print_out(print, " %-4d ", j + 1); + } + for (i = 0; i < QVSP_RULE_PARAM_MAX; i++) { + switch (i) { + case QVSP_RULE_PARAM_DIR: + print_out(print, "%-8s ", + call_qcsapi_vsp_dir_desc(rf->param[i])); + break; + case QVSP_RULE_PARAM_VAPPRI: + case QVSP_RULE_PARAM_AC: + print_out(print, "0x%-6x ", rf->param[i]); + break; + case QVSP_RULE_PARAM_ORDER: + print_out(print, "%u - %-4s ", rf->param[i], + qvsp_rule_order_desc_abbr[rf->param[i]]); + break; + case QVSP_RULE_PARAM_THROT_POLICY: + print_out(print, "%u - %-8s ", rf->param[i], + qvsp_strm_throt_desc_abbr[rf->param[i]]); + break; + default: + print_out(print, "%-8u ", rf->param[i]); + break; + } + } + print_out(print, "\n"); + } + +out: + if (rules_buf != NULL) + free(rules_buf); + return rc; +} + +static int +call_qcsapi_vsp_rule(call_qcsapi_bundle *call, int argc, char *argv[]) +{ + qcsapi_output *print = call->caller_output; + call_qcsapi_vsp_fn func; + + static const struct call_qcsapi_fnmap mux[] = { + { "add", call_qcsapi_vsp_rule_add }, + { "del", call_qcsapi_vsp_rule_del }, + { "getlist", call_qcsapi_vsp_rule_getlist }, + }; + + if (argc < 1) { + call_qcsapi_vsp_rule_usage(print); + return -EINVAL; + } + + func = call_qcsapi_fnmap_find(argv[0], mux, ARRAY_SIZE(mux)); + if (func == NULL) { + call_qcsapi_vsp_rule_usage(print); + return -EINVAL; + } else { + return func(call, argc - 1, argv + 1); + } +} + +#define QCSAPI_CIDR_STRLEN (4) +#define QCSAPI_PORT_STRLEN (6) + +static void +call_qcsapi_vsp_wl_usage(qcsapi_output *print) +{ + print_out(print, "Usage\n" + " qtm wl add [/] [/] \n" + " - add a whitelist entry\n" + " qtm wl del [/] [/] \n" + " - delete a whitelist entry\n" + " qtm wl del\n" + " - delete all whitelist entries\n" + "\n" + "Parameters\n" + " IPv4:\n" + " - IP source address (0 for any)\n" + " - IP destination address (0 for any)\n" + " - IP netmask (1-32, default is 32)\n" + " IPv6:\n" + " - IP source address (::0 for any)\n" + " - IP destination address (::0 for any)\n" + " - IP netmask (1-128, default is 128)\n" + " IPv4 or IPv6:\n" + " - IP source port (0 for any)\n" + " - IP destination port (0 for any)\n" + ); +} + +static int +call_qcsapi_parse_ip_cidr(call_qcsapi_bundle *call, const char *addr, + __be32 *ipv4, struct in6_addr *ipv6, uint8_t *cidr) +{ + qcsapi_output *print = call->caller_output; + int rc; + int ipv; + int max_cidr; + char ipscan[128]; + + rc = sscanf(addr, "%[^/]/%hhu", ipscan, cidr); + + if (strcmp(ipscan, "0") == 0) { + *ipv4 = 0; + ipv = 4; + } else if (inet_pton(AF_INET, ipscan, ipv4) == 1) { + ipv = 4; + } else if (inet_pton(AF_INET6, ipscan, ipv6) == 1) { + ipv = 6; + } else { + print_err(print, "Invalid value parsing ip[/mask] '%s'\n", addr); + return -EINVAL; + } + + if (ipv == 4) { + max_cidr = sizeof(*ipv4) * NBBY; + } else { + max_cidr = sizeof(*ipv6) * NBBY; + } + + if (rc == 2) { + if (*cidr > max_cidr) { + print_err(print, "Invalid CIDR (%u) for IPv%d address %s\n", + *cidr, ipv, ipscan); + return -EINVAL; + } + } else { + *cidr = max_cidr; + } + + return ipv; +} + +static int +call_qcsapi_vsp_wl_parse_wlf(call_qcsapi_bundle *call, struct qvsp_wl_flds *wl_fields, + const char *saddr, const char *daddr) +{ + qcsapi_output *print = call->caller_output; + int rc; + int ipv; + + rc = call_qcsapi_parse_ip_cidr(call, saddr, + &wl_fields->hflds.ipv4.saddr, + &wl_fields->hflds.ipv6.saddr, + &wl_fields->s_cidr_bits); + if (rc < 0) { + return -EINVAL; + } + ipv = rc; + + rc = call_qcsapi_parse_ip_cidr(call, daddr, + &wl_fields->hflds.ipv4.daddr, + &wl_fields->hflds.ipv6.daddr, + &wl_fields->d_cidr_bits); + if (rc < 0) { + return -EINVAL; + } else if (rc != ipv) { + print_err(print, "IP addresses are not both IPv4 or IPv6\n"); + return -EINVAL; + } + + wl_fields->ip_version = ipv; + + return ipv; +} + +static int +call_qcsapi_vsp_wl_parse(call_qcsapi_bundle *call, int argc, char *argv[], struct qvsp_wl_flds *wl_fields) +{ + qcsapi_output *print = call->caller_output; + uint16_t sport; + uint16_t dport; + int ipv; + + if (argc != 4) { + call_qcsapi_vsp_wl_usage(print); + return -EINVAL; + } + + ipv = call_qcsapi_vsp_wl_parse_wlf(call, wl_fields, argv[0], argv[2]); + if (ipv < 0) { + return -EINVAL; + } + + if (sscanf(argv[1], "%hu", &sport) != 1) { + print_err(print, "Error parsing source port '%s'\n", argv[1]); + return -EINVAL; + } + if (sscanf(argv[3], "%hu", &dport) != 1) { + print_err(print, "Error parsing destination port '%s'\n", argv[3]); + return -EINVAL; + } + + if (ipv == 4) { + wl_fields->hflds.ipv4.sport = htons(sport); + wl_fields->hflds.ipv4.dport = htons(dport); + } else { + wl_fields->hflds.ipv6.sport = htons(sport); + wl_fields->hflds.ipv6.dport = htons(dport); + } + + return 0; +} + +static int +call_qcsapi_vsp_wl_add(call_qcsapi_bundle *call, int argc, char *argv[]) +{ + struct qvsp_wl_flds wl; + int rc; + + if (g_is_qtm) + return 0; + + rc = call_qcsapi_vsp_wl_parse(call, argc, argv, &wl); + if (rc) { + return rc; + } + +#ifdef CALL_QCSAPI_QTM_UNSUPPORTED + return qcsapi_vsp_add_wl(call->caller_interface, &wl); +#else + return 0; +#endif +} + +static int +call_qcsapi_vsp_wl_del(call_qcsapi_bundle *call, int argc, char *argv[]) +{ + qcsapi_output *print = call->caller_output; + struct qvsp_wl_flds wl; + int rc; + + if (g_is_qtm) + return 0; + + if (argc == 4) { + rc = call_qcsapi_vsp_wl_parse(call, argc, argv, &wl); + if (rc) { + return rc; + } + +#ifdef CALL_QCSAPI_QTM_UNSUPPORTED + return qcsapi_vsp_del_wl(call->caller_interface, &wl); +#else + return 0; +#endif + } else if (argc == 1) { + unsigned int index; + rc = sscanf(argv[0], "%u", &index); + if (rc != 1) { + print_err(print, "Error parsing argument '%s'\n", argv[0]); + return -EINVAL; + } + +#ifdef CALL_QCSAPI_QTM_UNSUPPORTED + return qcsapi_vsp_del_wl_index(call->caller_interface, index); +#else + return 0; +#endif + } else if (argc == 0) { +#ifdef CALL_QCSAPI_QTM_UNSUPPORTED + return qcsapi_vsp_del_wl_index(call->caller_interface, ~0); +#else + return 0; +#endif + } else { + call_qcsapi_vsp_wl_usage(print); + return -EINVAL; + } +} + +static void call_qcsapi_vsp_wl_fmt(const struct qvsp_wl_flds *wlf, char *saddr, char *daddr, char *sport, char *dport) +{ + const struct in6_addr zero = IN6ADDR_ANY_INIT; + + strcpy(saddr, QVSP_CFG_SHOW_ANYSTR); + strcpy(daddr, QVSP_CFG_SHOW_ANYSTR); + strcpy(sport, QVSP_CFG_SHOW_ANYSTR); + strcpy(dport, QVSP_CFG_SHOW_ANYSTR); + + if (wlf->ip_version == 4) { + const struct qvsp_hash_flds_ipv4 *ip = &wlf->hflds.ipv4; + + if (ip->saddr) { + sprintf(saddr, NIPQUAD_FMT "/%u", + NIPQUAD(ip->saddr), + wlf->s_cidr_bits); + } + if (ip->daddr) { + sprintf(daddr, NIPQUAD_FMT "/%u", + NIPQUAD(ip->daddr), + wlf->d_cidr_bits); + } + if (ip->sport) { + sprintf(sport, "%u", ntohs(ip->sport)); + } + if (ip->dport) { + sprintf(dport, "%u", ntohs(ip->dport)); + } + } else { + const struct qvsp_hash_flds_ipv6 *ip = &wlf->hflds.ipv6; + char cidr[QCSAPI_CIDR_STRLEN]; + + if (memcmp(&ip->saddr, &zero, sizeof(ip->saddr))) { + inet_ntop(AF_INET6, &ip->saddr, + saddr, INET6_ADDRSTRLEN); + sprintf(cidr, "/%u", wlf->s_cidr_bits); + strcat(saddr, cidr); + } + if (memcmp(&ip->daddr, &zero, sizeof(ip->daddr))) { + inet_ntop(AF_INET6, &ip->daddr, + daddr, INET6_ADDRSTRLEN); + sprintf(cidr, "/%u", wlf->d_cidr_bits); + strcat(daddr, cidr); + } + if (ip->sport) { + sprintf(sport, "%u", ntohs(ip->sport)); + } + if (ip->dport) { + sprintf(dport, "%u", ntohs(ip->dport)); + } + } +} + +static int +call_qcsapi_vsp_wl_getlist(call_qcsapi_bundle *call, int argc, char *argv[]) +{ + qcsapi_output *print = call->caller_output; + const unsigned int MAX_WL = 64; + const char *whitelist_fmt = " %-*s %-*s %-*s %-*s\n"; + char saddr[INET6_ADDRSTRLEN + 1]; + char daddr[INET6_ADDRSTRLEN + 1]; + char sport[QCSAPI_PORT_STRLEN + 1]; + char dport[QCSAPI_PORT_STRLEN + 1]; + int max_saddr_strlen = NIPQUAD_LEN; + int max_daddr_strlen = NIPQUAD_LEN; + struct qvsp_wl_flds *wl; + int n; + int i; + int rc = 0; + + if (g_is_qtm) + return 0; + + wl = malloc(sizeof(*wl) * MAX_WL); + if (!wl) { + return -ENOMEM; + } + +#ifdef CALL_QCSAPI_QTM_UNSUPPORTED + n = qcsapi_vsp_get_wl(call->caller_interface, wl, MAX_WL); +#else + n = 0; +#endif + if (n < 0) { + rc = n; + } else { + /* find max string length for ip addresses */ + for (i = 0; i < n; i++) { + int saddr_strlen; + int daddr_strlen; + call_qcsapi_vsp_wl_fmt(&wl[i], saddr, daddr, sport, dport); + saddr_strlen = strlen(saddr); + daddr_strlen = strlen(daddr); + max_saddr_strlen = max(max_saddr_strlen, saddr_strlen); + max_daddr_strlen = max(max_daddr_strlen, daddr_strlen); + } + + print_out(print, "Whitelist\n"); + print_out(print, whitelist_fmt, + max_saddr_strlen, "Source IP", QCSAPI_PORT_STRLEN, "SPort", + max_daddr_strlen, "Dest IP", QCSAPI_PORT_STRLEN, "DPort"); + if (n == 0) { + print_out(print, " no whitelist entries\n"); + } + + for (i = 0; i < n; i++) { + call_qcsapi_vsp_wl_fmt(&wl[i], saddr, daddr, sport, dport); + print_out(print, whitelist_fmt, + max_saddr_strlen, saddr, QCSAPI_PORT_STRLEN, sport, + max_daddr_strlen, daddr, QCSAPI_PORT_STRLEN, dport); + } + } + + free(wl); + + return rc; +} + +static int +call_qcsapi_vsp_wl(call_qcsapi_bundle *call, int argc, char *argv[]) +{ + qcsapi_output *print = call->caller_output; + call_qcsapi_vsp_fn func; + + static const struct call_qcsapi_fnmap mux[] = { + { "add", call_qcsapi_vsp_wl_add }, + { "del", call_qcsapi_vsp_wl_del }, + { "getlist", call_qcsapi_vsp_wl_getlist }, + }; + + if (argc < 1) { + call_qcsapi_vsp_wl_usage(print); + return -EINVAL; + } + + func = call_qcsapi_fnmap_find(argv[0], mux, ARRAY_SIZE(mux)); + if (func == NULL) { + call_qcsapi_vsp_rule_usage(print); + return -EINVAL; + } else { + return func(call, argc - 1, argv + 1); + } +} + +static void +call_qcsapi_vsp_show_usage(qcsapi_output *print) +{ + print_out(print, "Usage\n" + " qtm show - show current state and high throughput streams\n" + " qtm show all - show current state and all streams\n" + " qtm show stats - show stream and packet statistics\n" + " qtm show config - show config parameters, rules, and whitelist\n"); +} + +static int +call_qcsapi_vsp_show_config(call_qcsapi_bundle *call, int argc, char *argv[]) +{ + qcsapi_wifi_mode wifi_mode = qcsapi_nosuch_mode; + qcsapi_output *print = call->caller_output; + struct qcsapi_data_1Kbytes *cfg_buf; + unsigned int *cfg; + int rc; + int i; + + cfg_buf = (struct qcsapi_data_1Kbytes *)malloc(sizeof(struct qcsapi_data_1Kbytes)); + if (cfg_buf == NULL) { + return -ENOMEM; + } + cfg = (unsigned int *)cfg_buf->data; + + rc = qcsapi_qtm_get_config_all(call->caller_interface, cfg_buf, QVSP_CFG_MAX); + if (rc) { + free(cfg_buf); + return rc; + } + + print_out(print, "Parameters\n"); + for (i = 0; i < QVSP_CFG_MAX; i++) { + if (cfg[i] == QCSAPI_QTM_CFG_INVALID) + continue; + print_out(print, " %-*s %-8u\n", + qvsp_cfg_name_len, + qvsp_cfg_params[i].name, + cfg[i]); + } + free(cfg_buf); + + qcsapi_wifi_get_mode(call->caller_interface, &wifi_mode); + if (wifi_mode == qcsapi_station) { + return 0; + } + + print_out(print, "\n"); + call_qcsapi_vsp_rule_getlist(call, 0, NULL); + + if (!g_is_qtm) { + print_out(print, "\n"); + call_qcsapi_vsp_wl_getlist(call, 0, NULL); + } + return 0; +} + +static const char * +call_qcsapi_qvsp_state_desc(enum qvsp_strm_state_e strm_state) +{ + switch (strm_state) { + case QVSP_STRM_STATE_NONE: + return "none"; + case QVSP_STRM_STATE_DISABLED: + return "dis"; + case QVSP_STRM_STATE_LOW_TPUT: + return "low"; + case QVSP_STRM_STATE_PRE_ENABLED: + return "pre"; + case QVSP_STRM_STATE_ENABLED: + return "ena"; + case QVSP_STRM_STATE_DELETED: + return "del"; + case QVSP_STRM_STATE_MAX: + break; + } + + return "invalid"; +} + +static void call_qcsapi_vsp_strm_fmt(const struct qvsp_strm_info *strm, char *saddr, char *daddr, char *sport, char *dport) +{ + if (strm->ip_version == 4) { + inet_ntop(AF_INET, &strm->hash_flds.ipv4.saddr, saddr, INET_ADDRSTRLEN); + inet_ntop(AF_INET, &strm->hash_flds.ipv4.daddr, daddr, INET_ADDRSTRLEN); + sprintf(sport, "%hu", ntohs(strm->hash_flds.ipv4.sport)); + sprintf(dport, "%hu", ntohs(strm->hash_flds.ipv4.dport)); + } else { + inet_ntop(AF_INET6, &strm->hash_flds.ipv6.saddr, saddr, INET6_ADDRSTRLEN); + inet_ntop(AF_INET6, &strm->hash_flds.ipv6.daddr, daddr, INET6_ADDRSTRLEN); + sprintf(sport, "%hu", ntohs(strm->hash_flds.ipv6.sport)); + sprintf(dport, "%hu", ntohs(strm->hash_flds.ipv6.dport)); + } +} + +static int +call_qcsapi_vsp_show_strms(call_qcsapi_bundle *call, int show_all) +{ + qcsapi_output *print = call->caller_output; + unsigned int state[(sizeof(struct qcsapi_data_128bytes) / sizeof(unsigned int))]; + int rc; + int i; + struct qcsapi_data_4Kbytes *strms_buf = NULL; + unsigned int strm_max = sizeof(*strms_buf) / sizeof(struct qvsp_strm_info); + struct qvsp_strm_info *strms; + qcsapi_wifi_mode wifi_mode = qcsapi_nosuch_mode; + char *ip_proto; + char saddr[INET6_ADDRSTRLEN + 1]; + char daddr[INET6_ADDRSTRLEN + 1]; + char sport[QCSAPI_PORT_STRLEN + 1]; + char dport[QCSAPI_PORT_STRLEN + 1]; + int max_saddr_strlen = NIPQUAD_LEN; + int max_daddr_strlen = NIPQUAD_LEN; + char node_idx_buf[5]; + char *sta_str; + uint32_t bytes; + uint32_t pkts; + + strms_buf = (struct qcsapi_data_4Kbytes *)malloc(sizeof(struct qcsapi_data_4Kbytes)); + if (strms_buf == NULL) + return -ENOMEM; + strms = (struct qvsp_strm_info *)strms_buf->data; + + qcsapi_wifi_get_mode(call->caller_interface, &wifi_mode); + + rc = qcsapi_qtm_get_state_all(call->caller_interface, (void *)&state, QVSP_STATE_READ_MAX); + if (rc < 0) { + goto out; + } + + rc = qcsapi_qtm_get_strm(call->caller_interface, strms_buf, strm_max, show_all); + if (rc < 0) { + goto out; + } + + print_out(print, "Free airtime: %u\n", state[QVSP_STATE_FAT]); + print_out(print, "Interference: %u\n", state[QVSP_STATE_FAT_INTF]); + print_out(print, "Streams:\n"); + print_out(print, " Total: %u\n", state[QVSP_STATE_STRM_TOT]); + print_out(print, " QTM peers: %u\n", state[QVSP_STATE_STRM_QTN]); + print_out(print, " Enabled: %u\n", state[QVSP_STATE_STRM_ENA]); + print_out(print, " Disabled: %u\n", state[QVSP_STATE_STRM_DIS]); + print_out(print, " Demoted: %u\n", state[QVSP_STATE_STRM_DMT]); + + /* find max length of IP addresses */ + for (i = 0; i < rc; i++) { + const struct qvsp_strm_info *strm = &strms[i]; + int saddr_strlen; + int daddr_strlen; + + if (show_all == 0 && strm->strm_state == QVSP_STRM_STATE_LOW_TPUT) { + continue; + } + + call_qcsapi_vsp_strm_fmt(strm, saddr, daddr, sport, dport); + saddr_strlen = strlen(saddr); + daddr_strlen = strlen(daddr); + max_saddr_strlen = max(max_saddr_strlen, saddr_strlen); + max_daddr_strlen = max(max_daddr_strlen, daddr_strlen); + } + + print_out(print, "Hash Dir Sta "); + if (g_is_qtm) { + print_out(print, "%-17s ", "Station"); + print_out(print, "NdIdx TID VapPri AC "); + } else { + print_out(print, "%-*s %-*s %-*s %-*s ", + max_saddr_strlen, "Source IP", QCSAPI_PORT_STRLEN, "SPort", + max_daddr_strlen, "Dest IP", QCSAPI_PORT_STRLEN, "DPort"); + print_out(print, "NdIdx Prot AC "); + } + print_out(print, "pps TotPps Kbps MaxKbps Rate NdCst Cost Max Age Status Dmt ThrKbps\n"); + + for (i = 0; i < rc; i++) { + const struct qvsp_strm_info *strm = &strms[i]; + + if (show_all == 0 && strm->strm_state == QVSP_STRM_STATE_LOW_TPUT) { + continue; + } + + call_qcsapi_vsp_strm_fmt(strm, saddr, daddr, sport, dport); + + switch (strm->ip_proto) { + case IPPROTO_TCP: + ip_proto = "TCP"; + break; + case IPPROTO_UDP: + ip_proto = "UDP"; + break; + default: + ip_proto = "?"; + break; + } + + if (wifi_mode == qcsapi_station) { + sta_str = "-"; + } else if (strm->is_3rdpt_udp_us) { + sta_str = QVSP_3RDPT_STR; + } else { + sta_str = strm->disable_remote ? "y" : "n"; + } + + /* pkts and bytes in the air */ + if (strm->is_3rdpt_udp_us) { + pkts = strm->prev_stats.pkts; + bytes = strm->prev_stats.bytes; + } else { + pkts = strm->prev_stats.pkts_sent; + bytes = strm->prev_stats.bytes_sent; + } + + print_out(print, "%03u %-3s %-3s ", + strm->hash, + call_qcsapi_vsp_dir_desc(strm->dir), + sta_str); + + if (g_is_qtm) { + print_out(print, MACSTR" ", MAC2STR(strm->node_mac)); + } else { + print_out(print, "%-*s %-6s %-*s %-6s ", + max_saddr_strlen, saddr, sport, + max_daddr_strlen, daddr, dport); + } + + switch (strm->hairpin_type) { + case QVSP_HAIRPIN_NONE: + snprintf(node_idx_buf, sizeof(node_idx_buf) - 1, "%u", + strm->node_idx); + break; + case QVSP_HAIRPIN_UCAST: + snprintf(node_idx_buf, sizeof(node_idx_buf) - 1, "%u-%u", + strm->node_idx, strm->hairpin_id); + break; + case QVSP_HAIRPIN_MCAST: + snprintf(node_idx_buf, sizeof(node_idx_buf) - 1, "%u-%u", + strm->hairpin_id, strm->node_idx); + } + print_out(print, "%-5s ", node_idx_buf); + + if (g_is_qtm) + print_out(print, "%-3u %-6u ", strm->tid, (uint32_t)strm->vap_pri); + else + print_out(print, "%-4s ", ip_proto); + print_out(print, "%u %-6u %-6u %-7u %-7u %-4u %-5u %-5u %-5u %-3lu %-6s %u-%u [%s]%-7u\n", + strm->ac_in, + pkts, strm->prev_stats.pkts, + qvsp_b2kbit(bytes), + qvsp_b2kbit(strm->bytes_max), + (strm->ni_inv_phy_rate == 0) ? + 0 : qvsp_inv2phy(strm->ni_inv_phy_rate), + strm->ni_cost, + strm->cost_current, + strm->cost_max, + strm->last_ref_secs, + call_qcsapi_qvsp_state_desc(strm->strm_state), + strm->demote_rule, + strm->demote_state, + qvsp_strm_throt_desc_abbr[strm->throt_policy], + strm->throt_rate); + } + + if (rc >= strm_max) { + print_out(print, ".... [list truncated]\n"); + } + + rc = 0; +out: + if (strms_buf != NULL) + free(strms_buf); + return rc; +} + +static int +call_qcsapi_vsp_show_all(call_qcsapi_bundle *call, int argc, char *argv[]) +{ + return call_qcsapi_vsp_show_strms(call, 1); +} + +static const char * +call_qcsapi_vsp_if_desc(enum qvsp_if_e vsp_if) +{ + if (vsp_if < ARRAY_SIZE(qvsp_if_desc)) { + return qvsp_if_desc[vsp_if]; + } + return "invalid"; +} + +static int +call_qcsapi_vsp_show_stats(call_qcsapi_bundle *call, int argc, char *argv[]) +{ + qcsapi_output *print = call->caller_output; + struct qvsp_stats stats; + enum qvsp_if_e vsp_if; + int rc; + + rc = qcsapi_qtm_get_stats(call->caller_interface, (void *)&stats); + if (rc < 0) { + return rc; + } + + print_out(print, "Free airtime\n"); + print_out(print, " Oversubscription: %u\n", stats.fat_over); + print_out(print, " Streams disabled: %u\n", stats.fat_chk_disable); + print_out(print, " Undersubscription: %u\n", stats.fat_under); + print_out(print, " Stream re-enabled: %u\n", stats.fat_chk_reenable); + print_out(print, "Streams\n"); + print_out(print, " Enabled: %u\n", stats.strm_enable); + print_out(print, " Disabled: %u\n", stats.strm_disable); + print_out(print, " Re-enabled: %u\n", stats.strm_reenable); + print_out(print, "\n"); + print_out(print, " Interface Added Not Fnd\n"); + for (vsp_if = 0; vsp_if < QVSP_IF_MAX; vsp_if++) { + print_out(print, " %-8s %8u %8u\n", + call_qcsapi_vsp_if_desc(vsp_if), + stats.stats_if[vsp_if].strm_add, + stats.stats_if[vsp_if].strm_none); + } + print_out(print, "Packets\n"); + print_out(print, " Interface Checked UDP TCP Other " + "Ignore Sent Throttled Disabled Frag Found Not Found Demoted\n"); + for (vsp_if = 0; vsp_if < QVSP_IF_MAX; vsp_if++) { + print_out(print, + " %-8s %10u %10u %10u %10u %10u %10u %10u %10u %10u %10u %10u\n", + call_qcsapi_vsp_if_desc(vsp_if), + stats.stats_if[vsp_if].pkt_chk, + stats.stats_if[vsp_if].pkt_udp, + stats.stats_if[vsp_if].pkt_tcp, + stats.stats_if[vsp_if].pkt_other, + stats.stats_if[vsp_if].pkt_ignore, + stats.stats_if[vsp_if].pkt_sent, + stats.stats_if[vsp_if].pkt_drop_throttle, + stats.stats_if[vsp_if].pkt_drop_disabled, + stats.stats_if[vsp_if].pkt_frag_found, + stats.stats_if[vsp_if].pkt_frag_not_found, + stats.stats_if[vsp_if].pkt_demoted); + } + + return 0; +} + +static int +call_qcsapi_vsp_show(call_qcsapi_bundle *call, int argc, char *argv[]) +{ + qcsapi_output *print = call->caller_output; + call_qcsapi_vsp_fn func; + int rc; + + static const struct call_qcsapi_fnmap mux[] = { + { "all", call_qcsapi_vsp_show_all }, + { "config", call_qcsapi_vsp_show_config }, + { "stats", call_qcsapi_vsp_show_stats }, + }; + + rc = call_qcsapi_vsp_is_enabled(call); + if (rc < 0) { + return rc; + } + + if ((argv[0] == NULL) || (strcmp(argv[0], "config") != 0)) { + rc = call_qcsapi_vsp_is_active(call); + if (rc < 0) { + return rc; + } + } + + if (argc == 0) { + return call_qcsapi_vsp_show_strms(call, 0); + } + + func = call_qcsapi_fnmap_find(argv[0], mux, ARRAY_SIZE(mux)); + if (func == NULL) { + call_qcsapi_vsp_show_usage(print); + return -EINVAL; + } else { + return func(call, argc - 1, argv + 1); + } +} + +static void +call_qcsapi_vsp_test_usage(qcsapi_output *print) +{ + print_out(print, "Usage:\n" + " qtm test fat \n"); +} + + +static int +call_qcsapi_vsp_reset(call_qcsapi_bundle *call, int argc, char *argv[]) +{ + int rc; + + rc = call_qcsapi_vsp_is_enabled(call); + if (rc < 0) { + return rc; + } + + return qcsapi_qtm_set_state(call->caller_interface, QVSP_STATE_RESET, 0); +} + +static int +call_qcsapi_vsp_test_fat(call_qcsapi_bundle *call, int argc, char *argv[]) +{ + qcsapi_output *print = call->caller_output; + unsigned int val; + int rc; + + if (argc != 1) { + goto err; + } + + rc = sscanf(argv[0], "%u", &val); + if (rc != 1) { + print_err(print, "QTM: error parsing '%s'\n", argv[0]); + goto err; + } + + rc = call_qcsapi_vsp_is_enabled(call); + if (rc < 0) { + return rc; + } + + return qcsapi_qtm_set_state(call->caller_interface, QVSP_STATE_TEST_FAT, val); + +err: + call_qcsapi_vsp_test_usage(print); + return -EINVAL; +} + +static int +call_qcsapi_vsp_test(call_qcsapi_bundle *call, int argc, char *argv[]) +{ + qcsapi_output *print = call->caller_output; + call_qcsapi_vsp_fn func; + int rc; + + static const struct call_qcsapi_fnmap mux[] = { + { "fat", call_qcsapi_vsp_test_fat }, + }; + + if (argc < 1) { + call_qcsapi_vsp_test_usage(print); + return -EINVAL; + } + + rc = call_qcsapi_vsp_is_enabled(call); + if (rc < 0) { + return rc; + } + + func = call_qcsapi_fnmap_find(argv[0], mux, ARRAY_SIZE(mux)); + if (func == NULL) { + call_qcsapi_vsp_test_usage(print); + return -EINVAL; + } else { + return func(call, argc - 1, argv + 1); + } +} + +static void call_qcsapi_vsp_init(void) +{ + int i; + + if (!qvsp_show_cfg_initialised) { + qvsp_show_cfg_initialised = 1; + + for (i = 0; i < QVSP_CFG_MAX; i++) { + if (strlen(qvsp_cfg_params[i].name) > qvsp_cfg_name_len) { + qvsp_cfg_name_len = strlen(qvsp_cfg_params[i].name); + } + if (strlen(qvsp_cfg_params[i].units) > qvsp_cfg_units_len) { + qvsp_cfg_units_len = strlen(qvsp_cfg_params[i].units); + } + } + + for (i = 0; i < QVSP_RULE_PARAM_MAX; i++) { + if (strlen(qvsp_rule_params[i].name) > qvsp_rule_name_len) { + qvsp_rule_name_len = strlen(qvsp_rule_params[i].name); + } + if (strlen(qvsp_rule_params[i].units) > qvsp_rule_units_len) { + qvsp_rule_units_len = strlen(qvsp_rule_params[i].units); + } + } + } +} + +static void +call_qcsapi_vsp_usage(qcsapi_output *print) +{ + if (!g_is_qtm) { + print_out(print, "Usage:\n" + " qtm show [config | all]\n" + " qtm reset\n" + " qtm set \n" + " qtm get \n" + " qtm rule [add | del] [ ...]\n" + " qtm wl [add | del] \n" + " qtm test \n"); + } else { + print_out(print, "Usage:\n" + " qtm show [config | all]\n" + " qtm reset\n" + " qtm set \n" + " qtm get \n" + " qtm rule [add | del] [ ...]\n" + " qtm test \n"); + } +} + +static int +call_qcsapi_vsp(call_qcsapi_bundle *call, int argc, char *argv[]) +{ + qcsapi_wifi_mode wifi_mode = qcsapi_nosuch_mode; + qcsapi_output *print = call->caller_output; + call_qcsapi_vsp_fn func; + int rc; + int statval = 0; + + static const struct call_qcsapi_fnmap mux[] = { + { "set", call_qcsapi_vsp_set }, + { "get", call_qcsapi_vsp_get }, + { "rule", call_qcsapi_vsp_rule }, + { "wl", call_qcsapi_vsp_wl }, + { "show", call_qcsapi_vsp_show }, + { "reset", call_qcsapi_vsp_reset }, + { "test", call_qcsapi_vsp_test }, + }; + + call_qcsapi_vsp_init(); + + if (argc < 1) { + call_qcsapi_vsp_usage(print); + return -EINVAL; + } + + rc = qvsp_is_qtm(); + if (rc < 0) + return rc; + g_is_qtm = rc; + + func = call_qcsapi_fnmap_find(argv[0], mux, ARRAY_SIZE(mux)); + if (func == NULL) { + call_qcsapi_vsp_usage(print); + return -EINVAL; + } + + qcsapi_wifi_get_mode(call->caller_interface, &wifi_mode); + if (wifi_mode == qcsapi_station) { + if (func == call_qcsapi_vsp_set || + func == call_qcsapi_vsp_rule + || func == call_qcsapi_vsp_wl + ) { + + print_err(print, "QTM: %s command cannot be used on stations\n", + argv[0]); + return -EINVAL; + } + } + + rc = func(call, argc - 1, argv + 1); + + if (rc < 0) { + report_qcsapi_error( call, rc ); + statval = 1; + } + + return statval; +} + +static int +verify_script_name(const char *script) +{ + int index; + int number = TABLE_SIZE( support_script_table ); + for (index = 0; index < number; index++) { + if (strcmp(script, support_script_table[index]) == 0) + return 0; + } + + return -1; +} + +static int +call_qcsapi_run_script(call_qcsapi_bundle *call, int argc, char *argv[]) +{ + int statval = 0; + int i = 0; + char *scriptname = NULL; + char param[QCSAPI_CMD_BUFSIZE], *param_p; + int len = 0; + int space = sizeof(param) - 1; + int qcsapi_retval; + qcsapi_output *print = call->caller_output; + param_p = param; + + if (argc == 0) { + print_err(print, "Not enough parameters\n"); + return 1; + } + + scriptname = argv[0]; + statval = verify_script_name(scriptname); + if (statval < 0) { + print_err(print, "Script %s is not supported\n", scriptname); + return 1; + } + + for (i = 1; i < argc; i++) { + if (strlen(argv[i]) + 1 < space) { + len = sprintf(param_p , "%s ", argv[i]); + param_p += len; + space -= len; + } else { + print_err(print, "Parameter string is too long\n"); + return 1; + } + } + + *param_p = '\0'; + qcsapi_retval = qcsapi_wifi_run_script(scriptname, param); + if (qcsapi_retval < 0) { + report_qcsapi_error(call, qcsapi_retval); + statval = 1; + } + +#ifdef BUILDIN_TARGET_BOARD +{ + char strbuf[QCSAPI_MSG_BUFSIZE] = {0}; + FILE *log; + /* output the script message */ + log = fopen(QCSAPI_SCRIPT_LOG, "r"); + if (log != NULL) { + while (fgets(strbuf, sizeof(strbuf), log)) + print_out(print, "%s", strbuf); + fclose(log); + } else { + print_err(print, "Failed to open file %s\n", QCSAPI_SCRIPT_LOG); + return 1; + } +} +#endif + + return statval; +} + +#define QCSAPI_TEMP_INVALID (-274 * QDRV_TEMPSENS_COEFF10) + +static int +call_qcsapi_get_temperature(call_qcsapi_bundle *call, int argc, char *argv[]) +{ + int statval = 0; + int qcsapi_retval; + int temp_rfic_external = QCSAPI_TEMP_INVALID; + int temp_rfic_internal = QCSAPI_TEMP_INVALID; + int temp_bbic_internal = QCSAPI_TEMP_INVALID; + + qcsapi_output *print = call->caller_output; + + qcsapi_retval = qcsapi_get_temperature_info(&temp_rfic_external, &temp_rfic_internal, + &temp_bbic_internal); + + if (qcsapi_retval >= 0) { + if (temp_rfic_external != QCSAPI_TEMP_INVALID) { + print_out(print, "temperature_rfic_external = %3.1f\n", + (float)temp_rfic_external / QDRV_TEMPSENS_COEFF); + } + if (temp_rfic_internal != QCSAPI_TEMP_INVALID) { + print_out(print, "temperature_rfic_internal = %3.1f\n", + (float)temp_rfic_internal / QDRV_TEMPSENS_COEFF10); + } + if (temp_bbic_internal != QCSAPI_TEMP_INVALID) { + print_out(print, "temperature_bbic_internal = %3.1f\n", + (float)temp_bbic_internal / QDRV_TEMPSENS_COEFF10); + } + } else { + report_qcsapi_error(call, qcsapi_retval); + statval = 1; + } + + return statval; +} + +static int +call_qcsapi_set_accept_oui_filter(call_qcsapi_bundle *call, int argc, char *argv[]) +{ + int statval = 0; + qcsapi_output *print = call->caller_output; + + if (argc < 2) + { + print_err(print, "Not enough parameters\n"); + statval = 1; + } + else + { + const char *the_interface = call->caller_interface; + qcsapi_mac_addr the_mac_addr; + qcsapi_mac_addr oui = {0}; + int qcsapi_retval; + int ival = 0; + int action; + + action = atoi(argv[1]); + ival = parse_mac_addr(argv[0], the_mac_addr); + + if (ival >= 0) { + memcpy(oui, the_mac_addr, 3); + qcsapi_retval = qcsapi_wifi_set_accept_oui_filter(the_interface, oui, action); + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) + print_out(print, "complete\n"); + + } else { + report_qcsapi_error(call, qcsapi_retval); + statval = 1; + } + + } else { + print_out(print, "Error parsing MAC address %s\n", argv[0]); + statval = 1; + } + } + + return statval; +} + +static int +call_qcsapi_get_accept_oui_filter(call_qcsapi_bundle *call, int argc, char *argv[]) +{ + int statval = 0; + int qcsapi_retval; + const char *the_interface = call->caller_interface; + qcsapi_output *print = call->caller_output; + char *oui_list = NULL; + unsigned int sizeof_oui_list = 126; + + if (argc > 0) { + sizeof_oui_list = (unsigned int)atoi(argv[0]); + } + + if (sizeof_oui_list > 0) { + oui_list = malloc(sizeof_oui_list); + if (oui_list == NULL) { + print_err( print, "Failed to allocate %u chars\n", sizeof_oui_list); + return 1; + } + } + + qcsapi_retval = qcsapi_wifi_get_accept_oui_filter(the_interface, oui_list, sizeof_oui_list); + + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) + print_out(print, "%s\n", oui_list); + } else { + report_qcsapi_error(call, qcsapi_retval); + statval = 1; + } + + if (oui_list != NULL) + free(oui_list); + + return statval; +} + +static int +call_qcsapi_wifi_set_vht(call_qcsapi_bundle *call, int argc, char *argv[]) +{ + int rc = 0; + qcsapi_output *print = call->caller_output; + + if (argc < 1) { + print_err( print, "Not enough parameters in call qcsapi wifi set_vht, count is %d\n", argc ); + print_err( print, "Usage: call_qcsapi set_vht <0 | 1>\n" ); + rc = 1; + } else { + qcsapi_unsigned_int vht_status = (qcsapi_unsigned_int) atoi( argv[0] ); + const char *the_interface = call->caller_interface; + int qcsapi_retval; + + qcsapi_retval = qcsapi_wifi_set_vht( the_interface, vht_status ); + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out( print, "complete\n"); + } + } else { + report_qcsapi_error( call, qcsapi_retval ); + rc = 1; + } + } + return rc; +} + +static int +call_qcsapi_get_swfeat_list(call_qcsapi_bundle *call, int argc, char *argv[]) +{ + int qcsapi_retval; + qcsapi_output *print = call->caller_output; + string_4096 buf; + + qcsapi_retval = qcsapi_get_swfeat_list(buf); + if (qcsapi_retval < 0) { + report_qcsapi_error(call, qcsapi_retval); + return 1; + } + + print_out(print, "%s\n", buf); + + return 0; +} + +/* + * Pass-in epoch time (UTC secs) to convert to readable date string + */ +static void +local_qcsapi_timestr(char *const buf, const size_t bufsize, const uint32_t utc_time_secs) +{ + const time_t epoch_seconds = utc_time_secs; + struct tm tm_parsed; + + gmtime_r(&epoch_seconds, &tm_parsed); + + strftime(buf, bufsize, "%d %B %Y %H:%M:%S", &tm_parsed); +} + +static char *uboot_type_to_str(char type) +{ + char *ptr; + + switch (type - '0') { + case UBOOT_INFO_LARGE: + ptr = "Large"; + break; + case UBOOT_INFO_MINI: + ptr = "Mini"; + break; + case UBOOT_INFO_TINY: + ptr = "Tiny"; + break; + default: + ptr = "Unknown"; + } + + return ptr; +} + +/* + * Primary userspace call_qcsapi handler to get u-boot information + */ +static int +call_qcsapi_get_uboot_info(call_qcsapi_bundle *call, int argc, char *argv[]) +{ + qcsapi_output *print = call->caller_output; + struct early_flash_config ef_config; + string_32 version_str; + string_32 built_str = {0}; + uint32_t u_boot_time; + int qcsapi_retval; + int uboot_info; + + if (argc < 1) { + print_err(print, "Not enough parameters in call_qcsapi get_uboot_info, " + "count is %d\n", argc); + print_err(print, "Usage: call_qcsapi get_uboot_info : " + "0 - ver, 1 - built, 2 - type, 3 - all\n"); + return -1; + } + + qcsapi_retval = qcsapi_get_uboot_info(version_str, &ef_config); + if (qcsapi_retval) { + print_err(print, "Call to qcsapi_get_uboot_info failed qcsapi_retval=%d\n", + qcsapi_retval); + return -1; + } + + errno = 0; + u_boot_time = strtol((char *)ef_config.built_time_utc_sec, NULL, 10); + if (errno) { + print_err(print, "strtol(%s) failed, errno=-%d\n", + (char *)ef_config.built_time_utc_sec, errno); + return -errno; + } + + /* Convert UTC seconds to readable date string */ + local_qcsapi_timestr(built_str, sizeof(built_str) - 1, u_boot_time); + + uboot_info = atoi(argv[0]); + switch (uboot_info) { + case UBOOT_INFO_VER: + print_out(print, "Version: %s\n", version_str); + break; + case UBOOT_INFO_BUILT: + print_out(print, "Built: %s\n", built_str); + break; + default: + case UBOOT_INFO_TYPE: + case UBOOT_INFO_ALL: + if (uboot_info == UBOOT_INFO_ALL) { + print_out(print, "Version: %s\nBuilt : %s\n", version_str, built_str); + } + print_out(print, "Type : U-boot (%s)\n", + uboot_type_to_str(ef_config.uboot_type)); + break; + } + return 0; +} + +static int +call_qcsapi_wifi_get_vht(call_qcsapi_bundle *call, int argc, char *argv[]) +{ + int rc = 0; + int qcsapi_retval; + + qcsapi_unsigned_int vht_status; + qcsapi_output *print = call->caller_output; + const char *the_interface = call->caller_interface; + + qcsapi_retval = qcsapi_wifi_get_vht( the_interface, &vht_status); + if (qcsapi_retval >= 0) { + print_out(print, "%d\n", vht_status); + } else { + report_qcsapi_error(call, qcsapi_retval); + rc = 1; + } + + return rc; +} + +static int +call_qcsapi_calcmd_set_test_mode(call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[]) +{ + int qcsapi_retval; + qcsapi_output *print = p_calling_bundle->caller_output; + int channel; + int antenna ; + int mcs; + int bw; + int pkt_size; + int eleven_n; + int primary_chan; + if (argc < 7) { + print_err( print, "Format: set_test_mode calcmd <11n> \n"); + print_err( print, "Example: set_test_mode calcmd 36 127 7 40 40 1 1\n"); + return(1); + } + + channel = atoi(argv[0]); + antenna = atoi(argv[1]); + mcs = atoi(argv[2]); + bw = atoi(argv[3]); + pkt_size = atoi(argv[4]); + eleven_n = atoi(argv[5]); + primary_chan = atoi(argv[6]); + + qcsapi_retval = qcsapi_calcmd_set_test_mode(channel, antenna, mcs, bw, pkt_size, eleven_n, primary_chan); + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out( print, "Complete.\n"); + } + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + return 1; + } + + return 0; +} + + +static int +call_qcsapi_calcmd_show_test_packet(call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[]) +{ + int qcsapi_retval; + uint32_t txnum; + uint32_t rxnum; + uint32_t crc; + + qcsapi_output *print = p_calling_bundle->caller_output; + + qcsapi_retval = qcsapi_calcmd_show_test_packet(&txnum, &rxnum, &crc); + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out(print, "tx_pkts# = \t%d\nrx_pkts# = \t%d\nCRC_err# = \t%d\n", txnum, rxnum, crc); + print_out(print, "Complete.\n"); + } + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + return 1; + } + + return 0; +} + + +static int +call_qcsapi_calcmd_send_test_packet(call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[]) +{ + int qcsapi_retval; + int packet_num; + qcsapi_output *print = p_calling_bundle->caller_output; + + if (argc < 1) { + print_err( print, "Format: send_test_packet calcmd \n"); + print_err( print, "Example: send_test_packet calcmd 0\n"); + return(1); + } + + packet_num = atoi(argv[0]); + + qcsapi_retval = qcsapi_calcmd_send_test_packet(packet_num); + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out(print, "Complete.\n"); + } + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + return 1; + } + + return qcsapi_retval; +} + +static int +call_qcsapi_calcmd_stop_test_packet(call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[]) +{ + int qcsapi_retval; + qcsapi_output *print = p_calling_bundle->caller_output; + + qcsapi_retval = qcsapi_calcmd_stop_test_packet(); + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out(print, "Complete.\n"); + } + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + return 1; + } + + return qcsapi_retval; +} + +static int +call_qcsapi_calcmd_send_dc_cw_signal(call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[]) +{ + int qcsapi_retval; + qcsapi_unsigned_int channel; + qcsapi_output *print = p_calling_bundle->caller_output; + + if (argc < 1) { + print_err( print, "Format: send_dc_cw_signal calcmd \n"); + print_err( print, "Example: send_dc_cw_signal calcmd 36\n"); + return(1); + } + + channel = atoi(argv[0]); + qcsapi_retval = qcsapi_calcmd_send_dc_cw_signal(channel); + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out(print, "Complete.\n"); + } + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + return 1; + } + + return qcsapi_retval; +} + +static int +call_qcsapi_calcmd_stop_dc_cw_signal(call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[]) +{ + int qcsapi_retval; + qcsapi_output *print = p_calling_bundle->caller_output; + + qcsapi_retval = qcsapi_calcmd_stop_dc_cw_signal(); + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out(print, "Complete.\n"); + } + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + return 1; + } + + return qcsapi_retval; +} + +static int +call_qcsapi_calcmd_get_test_mode_antenna_sel(call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[]) +{ + int qcsapi_retval; + qcsapi_unsigned_int antenna; + qcsapi_output *print = p_calling_bundle->caller_output; + + qcsapi_retval = qcsapi_calcmd_get_test_mode_antenna_sel(&antenna); + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out(print, "%d\n", antenna); + print_out(print, "Complete.\n"); + } + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + return 1; + } + + return qcsapi_retval; +} + +static int +call_qcsapi_calcmd_get_test_mode_mcs(call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[]) +{ + int qcsapi_retval; + qcsapi_unsigned_int mcs; + qcsapi_output *print = p_calling_bundle->caller_output; + + qcsapi_retval = qcsapi_calcmd_get_test_mode_mcs(&mcs); + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out(print, "%d\n", mcs); + print_out(print, "Complete.\n"); + } + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + return 1; + } + + return qcsapi_retval; +} + +static int +call_qcsapi_calcmd_get_test_mode_bw(call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[]) +{ + int qcsapi_retval; + qcsapi_unsigned_int bw; + qcsapi_output *print = p_calling_bundle->caller_output; + + qcsapi_retval = qcsapi_calcmd_get_test_mode_bw(&bw); + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out(print, "%d\n", bw); + print_out(print, "Complete.\n"); + } + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + return 1; + } + + return qcsapi_retval; +} + +static int +call_qcsapi_calcmd_get_tx_power(call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[]) +{ + int qcsapi_retval; + qcsapi_calcmd_tx_power_rsp tx_power; + qcsapi_output *print = p_calling_bundle->caller_output; + + qcsapi_retval = qcsapi_calcmd_get_tx_power(&tx_power); + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out(print, "%d.%ddBm %d.%ddBm %d.%ddBm %d.%ddBm\n", + tx_power.value[0]>>2,(tx_power.value[0]&3)*25, + tx_power.value[1]>>2,(tx_power.value[1]&3)*25, + tx_power.value[2]>>2,(tx_power.value[2]&3)*25, + tx_power.value[3]>>2,(tx_power.value[3]&3)*25); + print_out(print, "Complete.\n"); + } + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + return 1; + } + + return qcsapi_retval; +} + +static int +call_qcsapi_calcmd_set_tx_power(call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[]) +{ + int qcsapi_retval; + qcsapi_unsigned_int tx_power; + qcsapi_output *print = p_calling_bundle->caller_output; + + if (argc < 1) { + print_err( print, "Format: set_test_mode_tx_power calcmd \n"); + print_err( print, "Example: set_test_mode_tx_power calcmd 19\n"); + return(1); + } + + tx_power = atoi(argv[0]); + qcsapi_retval = qcsapi_calcmd_set_tx_power(tx_power); + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out(print, "Complete.\n"); + } + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + return 1; + } + + return qcsapi_retval; +} + + +static int +call_qcsapi_calcmd_get_test_mode_rssi(call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[]) +{ + int qcsapi_retval; + qcsapi_calcmd_rssi_rsp rssi; + qcsapi_output *print = p_calling_bundle->caller_output; + + qcsapi_retval = qcsapi_calcmd_get_test_mode_rssi(&rssi); + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out(print, "%d.%d %d.%d %d.%d %d.%d\n", + rssi.value[0]/10, rssi.value[0]%10, + rssi.value[1]/10, rssi.value[1]%10, + rssi.value[2]/10, rssi.value[2]%10, + rssi.value[3]/10, rssi.value[3]%10); + print_out(print, "Complete.\n"); + } + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + return 1; + } + + return qcsapi_retval; +} + +static int +call_qcsapi_calcmd_set_mac_filter(call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[]) +{ + int qcsapi_retval = 0; + int sec_enable; + int q_num; + qcsapi_mac_addr mac_addr; + qcsapi_output *print = p_calling_bundle->caller_output; + + if (argc != 3) { + print_out(print, "Parameter input error! \n"); + print_out(print, "Format:\n"); + print_out(print, "call_qcsapi set_mac_filter wifi0 #q_num #sec_enable #mac_addr \n"); + print_out(print, "Example: call_qcsapi set_mac_filter wifi0 1 2 00:11:22:33:44:55\n"); + + return qcsapi_retval; + } + + q_num = atoi(argv[0]); + sec_enable = atoi(argv[1]); + qcsapi_retval = parse_mac_addr(argv[2], mac_addr); + + if (qcsapi_retval >= 0) { + qcsapi_retval = qcsapi_calcmd_set_mac_filter(q_num, sec_enable, mac_addr); + } + + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out(print, "Complete.\n"); + } + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + qcsapi_retval = 1; + } + + return qcsapi_retval; +} + +static int +call_qcsapi_calcmd_get_antenna_count(call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[]) +{ + int qcsapi_retval; + qcsapi_unsigned_int antenna_count; + qcsapi_output *print = p_calling_bundle->caller_output; + + qcsapi_retval = qcsapi_calcmd_get_antenna_count(&antenna_count); + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out(print, "%d\n", antenna_count); + print_out(print, "Complete.\n"); + } + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + return 1; + } + + return qcsapi_retval; +} + +static int +call_qcsapi_calcmd_clear_counter(call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[]) +{ + int qcsapi_retval; + qcsapi_output *print = p_calling_bundle->caller_output; + + qcsapi_retval = qcsapi_calcmd_clear_counter(); + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out(print, "Complete.\n"); + } + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + return 1; + } + + return qcsapi_retval; +} + +static int +call_qcsapi_calcmd_get_info(call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[]) +{ + int qcsapi_retval; + qcsapi_output *print = p_calling_bundle->caller_output; + string_1024 output_info; + + qcsapi_retval = qcsapi_calcmd_get_info(output_info); + if (qcsapi_retval >= 0) { + print_out(print, "%s", output_info); + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + return 1; + } + + return qcsapi_retval; +} + + +int +call_qcsapi_disable_dfs_channels(call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[]) +{ + int qcsapi_retval = 0; + qcsapi_output *print = p_calling_bundle->caller_output; + const char *the_interface = p_calling_bundle->caller_interface; + int new_channel = 0; + + if (argc < 1) { + print_err(print, "usage:\ncall_qcsapi disable_dfs_channels <0|1> [new channel]\n"); + return 1; + } else if (argc > 1) { + new_channel = atoi(argv[1]); + } + + qcsapi_retval = qcsapi_wifi_disable_dfs_channels(the_interface, atoi(argv[0]), new_channel); + if (qcsapi_retval >= 0) + { + if (verbose_flag >= 0) + { + print_out( print, "complete\n" ); + } + } + else + { + report_qcsapi_error( p_calling_bundle, qcsapi_retval ); + } + + return qcsapi_retval; +} + +static int +call_qcsapi_wifi_set_soc_macaddr(call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[]) +{ + int statval = 0; + qcsapi_mac_addr new_mac_addr; + int qcsapi_retval = 0;; + int ival = 0; + qcsapi_output *print = p_calling_bundle->caller_output; + const char *the_interface = p_calling_bundle->caller_interface; + + if (argc < 1) + { + print_err( print, "Not enough parameters in call qcsapi file path, count is %d\n", argc ); + statval = 1; + } + else + { + if (strcmp( "NULL", argv[ 0 ] ) == 0) + { + print_out( print, "Mac addr is NULL \n"); + statval = 1; + } + else + { + ival = parse_mac_addr( argv[ 0 ], new_mac_addr ); + if (ival >= 0) + qcsapi_retval = qcsapi_set_soc_mac_addr( the_interface, new_mac_addr ); + else + { + print_out( print, "Error parsing MAC address %s\n", argv[ 0 ] ); + statval = 1; + } + } + + if (ival >= 0) + { + if (qcsapi_retval >= 0) + { + if (verbose_flag >= 0) + { + print_out( print, "complete\n" ); + } + } + else + { + report_qcsapi_error( p_calling_bundle, qcsapi_retval ); + statval = 1; + } + } + } + + return statval; + +} + +static int +call_qcsapi_wifi_enable_tdls(call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[]) +{ + int statval = 0; + int qcsapi_retval = 0; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + uint32_t enable_tdls = 1; + + if (argc > 0) { + /*type conversion and parameter value check*/ + if (0 == safe_atou32(argv[0], &enable_tdls, print, 0, 1)) + return 1; + } + + qcsapi_retval = qcsapi_wifi_enable_tdls(the_interface, enable_tdls); + + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) + print_out(print, "complete\n"); + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } + + return statval; +} + +static int +call_qcsapi_wifi_enable_tdls_over_qhop(call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[]) +{ + int statval = 0; + int qcsapi_retval = 0; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + uint32_t tdls_over_qhop_en = 0; + + if (argc > 0) { + /*type conversion and parameter value check*/ + if (0 == safe_atou32(argv[0], &tdls_over_qhop_en, print, 0, 1)) + return 1; + } + + qcsapi_retval = qcsapi_wifi_enable_tdls_over_qhop(the_interface, tdls_over_qhop_en); + + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) + print_out(print, "complete\n"); + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } + + return statval; +} + +static int call_qcsapi_wifi_get_tdls_status(call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[]) +{ + int statval = 0; + uint32_t tdls_status = 0; + int32_t tdls_mode = 0; + int32_t tdls_over_qhop_en = 0; + int qcsapi_retval; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + qcsapi_tdls_type type = qcsapi_tdls_nosuch_param; + + qcsapi_retval = qcsapi_wifi_get_tdls_status(the_interface, &tdls_status); + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + if (tdls_status == 0) + print_out(print, "tdls function: disabled\n"); + else + print_out(print, "tdls function: enabled\n"); + } + + if(tdls_status != 0) { + type = qcsapi_tdls_over_qhop_enabled; + qcsapi_retval = qcsapi_wifi_get_tdls_params(the_interface, type, &tdls_over_qhop_en); + + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) + print_out(print, "tdls over qhop: %s\n", tdls_over_qhop_en ? "enabled" : "disabled"); + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } + + if (qcsapi_retval >= 0) { + type = qcsapi_tdls_mode; + qcsapi_retval = qcsapi_wifi_get_tdls_params(the_interface, type, &tdls_mode); + + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) + print_out(print, "tdls mode: %s\n", tdls_mode ? "forced" : "auto"); + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } + } + } + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } + + return (statval); +} + +static int call_qcsapi_wifi_set_tdls_params(call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[]) +{ + int statval = 0; + int qcsapi_retval = 0; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + qcsapi_tdls_type type = p_calling_bundle->caller_generic_parameter.parameter_type.type_of_tdls; + int value = 0; + + if (argc < 1) { + print_err(print, "Not enough parameters, count is %d\n", argc); + return 1; + } + + value = atoi(argv[0]); + + qcsapi_retval = qcsapi_wifi_set_tdls_params(the_interface, type, value); + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) + print_out(print, "complete\n"); + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } + + return statval; +} + +static int call_qcsapi_wifi_get_tdls_params(call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[]) +{ + int statval = 0; + uint32_t tdls_status = 0; + int qcsapi_retval; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + qcsapi_tdls_type type = 0; + int value = 0; + unsigned int iter; + uint32_t param_num = 0; + + qcsapi_retval = qcsapi_wifi_get_tdls_status(the_interface, &tdls_status); + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) + print_out(print, "tdls function: %s\n", tdls_status ? "enabled" : "disabled"); + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + goto out; + } + + param_num = TABLE_SIZE(qcsapi_tdls_param_table); + for (iter = 0; iter < param_num; iter++) { + type = qcsapi_tdls_param_table[iter].param_type; + qcsapi_retval = qcsapi_wifi_get_tdls_params(the_interface, type, &value); + + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + if (type == qcsapi_tdls_over_qhop_enabled) + print_out(print, "tdls over qhop: %s\n", value ? "enabled" : "disabled"); + else if (type == qcsapi_tdls_mode) + print_out(print, "tdls mode: %s\n", value ? "forced" : "auto"); + else if((type >= qcsapi_tdls_min_rssi) && (type <= qcsapi_tdls_path_select_rate_thrshld)) + print_out(print, "\t%s: %d\n", qcsapi_tdls_param_table[iter].param_name, value); + else + print_out(print, "%s: %d\n", qcsapi_tdls_param_table[iter].param_name, value); + } + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + goto out; + } + } +out: + return (statval); +} + +static int +call_qcsapi_get_carrier_id(call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[]) +{ + int statval = 0; + int qcsapi_retval = 0; + qcsapi_unsigned_int carrier_id = 0; + qcsapi_output *print = p_calling_bundle->caller_output; + + qcsapi_retval = qcsapi_get_carrier_id(&carrier_id); + + if (qcsapi_retval >= 0) { + print_out( print, "%d\n", carrier_id); + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } + + return statval; +} + +static int +call_qcsapi_set_carrier_id(call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[]) +{ + int statval = 0; + int qcsapi_retval = 0; + qcsapi_output *print = p_calling_bundle->caller_output; + uint32_t carrier_id; + uint32_t update_uboot = 0; + + if (argc < 1) + { + print_err( print, "Not enough parameters in call qcsapi set_carrier_id\n" ); + print_err( print, "Usage: call_qcsapi set_carrier_id \n"); + print_err( print, " The second parameter is optional\n"); + print_err( print, "Example: call_qcsapi set_carrier_id 1\n"); + return 1; + } + + if (isdigit(*argv[0])) { + carrier_id = atoi(argv[0]); + } else { + print_err(print, "Unrecognized carrier id value %s\n", argv[0]); + return 1; + } + + /* + * The second parameter is optional and it indicates whether it is needed to update uboot. + * By default no update about uboot env. If the setting carrier ID is needed to write back into uboot + * this parameter is needed and should be set to 1. + */ + if (argc > 1) { + if (isdigit(*argv[1])) { + update_uboot = atoi(argv[1]); + } else { + print_err(print, "Unrecognized uboot update flag %s\n", argv[1]); + return 1; + } + } + + qcsapi_retval = qcsapi_set_carrier_id(carrier_id, update_uboot); + + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) + print_out( print, "complete\n"); + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } + + return statval; +} + +static int +call_qcsapi_wifi_get_spinor_jedecid( const call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[] ) +{ + int statval = 0; + unsigned int jedecid; + int qcsapi_retval; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + + qcsapi_retval = qcsapi_wifi_get_spinor_jedecid( the_interface, &jedecid ); + + if (qcsapi_retval >= 0) + { + if (verbose_flag >= 0) + { + print_out( print, "0x%08x\n", jedecid ); + } + } + else + { + report_qcsapi_error( p_calling_bundle, qcsapi_retval ); + statval = 1; + } + + return( statval ); +} + +static int +call_qcsapi_wifi_get_custom_value( const call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[] ) +{ + int statval = 0; + int qcsapi_retval; + qcsapi_output *print = p_calling_bundle->caller_output; + char *key; + char value[QCSAPI_CUSTOM_VALUE_MAX_LEN] = {'\0'}; + + if (argc != 1) { + print_err(print, "Usage: call_qcsapi get_custom_value \n"); + return 1; + } + + key = argv[0]; + qcsapi_retval = qcsapi_get_custom_value(key, value); + + if (qcsapi_retval >= 0) { + print_out(print, "%s\n", value); + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } + + return statval; +} + +static int +call_qcsapi_wifi_get_mlme_stats_per_mac(const call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[]) +{ + int statval = 0; + int qcsapi_retval = 0; + qcsapi_mac_addr the_mac_addr; + qcsapi_mlme_stats stats; + qcsapi_output *print = p_calling_bundle->caller_output; + + if (argc >= 1 && strcmp(argv[0], "NULL") != 0) { + if (parse_mac_addr(argv[0], the_mac_addr) < 0) { + print_out(print, "Error parsing MAC address %s\n", argv[0]); + return 1; + } + } else { + memset(the_mac_addr, 0x00, sizeof(the_mac_addr)); + } + + qcsapi_retval = qcsapi_wifi_get_mlme_stats_per_mac(the_mac_addr, &stats); + + if (qcsapi_retval >= 0) { + print_out(print, + "auth:\t\t%u\n" + "auth_fails:\t%u\n" + "assoc:\t\t%u\n" + "assoc_fails:\t%u\n" + "deauth:\t\t%u\n" + "diassoc:\t%u\n", + stats.auth, + stats.auth_fails, + stats.assoc, + stats.assoc_fails, + stats.deauth, + stats.diassoc); + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } + + return statval; +} +static int +call_qcsapi_wifi_get_mlme_stats_per_association(const call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[]) +{ + int statval = 0; + int qcsapi_retval = 0; + qcsapi_mlme_stats stats; + qcsapi_output *print = p_calling_bundle->caller_output; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_unsigned_int association_index = p_calling_bundle->caller_generic_parameter.index; + + qcsapi_retval = qcsapi_wifi_get_mlme_stats_per_association(the_interface, association_index, &stats); + + if (qcsapi_retval >= 0) { + print_out(print, + "auth:\t\t%u\n" + "auth_fails:\t%u\n" + "assoc:\t\t%u\n" + "assoc_fails:\t%u\n" + "deauth:\t\t%u\n" + "diassoc:\t%u\n", + stats.auth, + stats.auth_fails, + stats.assoc, + stats.assoc_fails, + stats.deauth, + stats.diassoc); + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } + + return statval; +} + +static int +call_qcsapi_wifi_get_mlme_stats_macs_list(const call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[]) +{ + int statval = 0; + int qcsapi_retval = 0; + qcsapi_output *print = p_calling_bundle->caller_output; + qcsapi_mlme_stats_macs mac_list; + qcsapi_mac_addr terminator_addr; + int i; + + memset(&terminator_addr, 0xFF, sizeof(terminator_addr)); + + qcsapi_retval = qcsapi_wifi_get_mlme_stats_macs_list(&mac_list); + + if (qcsapi_retval >= 0) { + for (i = 0;i < QCSAPI_MLME_STATS_MAX_MACS; ++i) { + if (memcmp(mac_list.addr[i], terminator_addr, sizeof(qcsapi_mac_addr)) == 0) { + break; + } + dump_mac_addr(print, mac_list.addr[i]); + } + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } + + return statval; +} + +static int +call_qcsapi_wifi_get_nss_cap(const call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[]) +{ + qcsapi_output *print = p_calling_bundle->caller_output; + qcsapi_mimo_type modulation; + int qcsapi_retval; + unsigned int nss; + + modulation = p_calling_bundle->caller_generic_parameter.parameter_type.modulation; + qcsapi_retval = qcsapi_wifi_get_nss_cap(p_calling_bundle->caller_interface, + modulation, &nss); + + if (qcsapi_retval >= 0) { + print_out(print, "%u\n", nss); + if (verbose_flag >= 0) { + print_out(print, "complete\n"); + } + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + return 1; + } + + return 0; +} + +static int +call_qcsapi_wifi_set_nss_cap(const call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[]) +{ + qcsapi_output *const print = p_calling_bundle->caller_output; + qcsapi_mimo_type modulation; + int retval = 0; + + modulation = p_calling_bundle->caller_generic_parameter.parameter_type.modulation; + + if (argc != 1) { + print_err(print, "Usage: call_qcsapi set_nss_cap " + " {ht|vht} \n"); + retval = 1; + } else { + qcsapi_unsigned_int nss = (qcsapi_unsigned_int)atoi(argv[0]); + int qcsapi_retval; + + qcsapi_retval = qcsapi_wifi_set_nss_cap(p_calling_bundle->caller_interface, + modulation, nss); + + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out(print, "complete\n"); + } + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + retval = 1; + } + } + + return retval; +} + +static int +call_qcsapi_wifi_get_security_defer_mode(const call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[]) +{ + qcsapi_output *print = p_calling_bundle->caller_output; + int qcsapi_retval; + int defer; + + qcsapi_retval = qcsapi_wifi_get_security_defer_mode(p_calling_bundle->caller_interface, &defer); + + if (qcsapi_retval >= 0) { + print_out(print, "%d\n", defer); + if (verbose_flag >= 0) { + print_out(print, "complete\n"); + } + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + return 1; + } + + return 0; +} + +static int +call_qcsapi_wifi_set_security_defer_mode(const call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[]) +{ + qcsapi_output *const print = p_calling_bundle->caller_output; + int retval = 0; + + if (argc != 1) { + print_err(print, "Usage: call_qcsapi set_defer " + "wifi0 {0|1}\n"); + retval = 1; + } else { + int defer = (qcsapi_unsigned_int)atoi(argv[0]); + int qcsapi_retval; + + qcsapi_retval = qcsapi_wifi_set_security_defer_mode(p_calling_bundle->caller_interface, defer); + + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out(print, "complete\n"); + } + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + retval = 1; + } + } + + return retval; +} + +static int +call_qcsapi_wifi_apply_security_config(const call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[]) +{ + qcsapi_output *const print = p_calling_bundle->caller_output; + int retval = 0; + + if (argc != 0) { + print_err(print, "Usage: call_qcsapi apply_security_config " + "\n"); + retval = 1; + } else { + int qcsapi_retval = 0; + + qcsapi_retval = qcsapi_wifi_apply_security_config(p_calling_bundle->caller_interface); + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out(print, "complete\n"); + } + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + retval = 1; + } + } + + return retval; +} + +static int +call_qcsapi_wifi_set_intra_bss_isolate(call_qcsapi_bundle *p_calling_bundle, + int argc, char *argv[]) +{ + int statval = 0; + int qcsapi_retval = 0; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + qcsapi_unsigned_int enable; + + if (argc < 1) { + print_err(print, "Not enough parameters, count is %d\n", argc); + return 1; + } + + enable = (qcsapi_unsigned_int)atoi(argv[0]); + if (enable > 1) { + print_err(print, "bad parameter %s\n", argv[0]); + return 1; + } + + qcsapi_retval = qcsapi_wifi_set_intra_bss_isolate(the_interface, enable); + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) + print_out(print, "complete\n"); + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } + + return statval; +} + +static int +call_qcsapi_wifi_get_intra_bss_isolate(call_qcsapi_bundle *p_calling_bundle, + int argc, char *argv[]) +{ + int statval = 0; + int qcsapi_retval = 0; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + qcsapi_unsigned_int enable; + + qcsapi_retval = qcsapi_wifi_get_intra_bss_isolate(the_interface, &enable); + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) + print_out(print, "%u\n", enable); + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } + + return statval; +} + +static int +call_qcsapi_wifi_set_bss_isolate(call_qcsapi_bundle *p_calling_bundle, + int argc, char *argv[]) +{ + int statval = 0; + int qcsapi_retval = 0; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + qcsapi_unsigned_int enable; + + if (argc < 1) { + print_err(print, "Not enough parameters, count is %d\n", argc); + return 1; + } + + enable = (qcsapi_unsigned_int)atoi(argv[0]); + if (enable > 1) { + print_err(print, "bad parameter %s\n", argv[0]); + return 1; + } + + qcsapi_retval = qcsapi_wifi_set_bss_isolate(the_interface, enable); + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) + print_out(print, "complete\n"); + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } + + return statval; +} + +static int +call_qcsapi_wifi_get_bss_isolate(call_qcsapi_bundle *p_calling_bundle, + int argc, char *argv[]) +{ + int statval = 0; + int qcsapi_retval = 0; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + qcsapi_unsigned_int enable; + + qcsapi_retval = qcsapi_wifi_get_bss_isolate(the_interface, &enable); + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) + print_out(print, "%u\n", enable); + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } + + return statval; +} + +static int +call_qcsapi_wifi_host_state_set(const call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[]) +{ + int statval = 0; + uint16_t host_state; + int qcsapi_retval; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + + if (argc < 1) { + print_err(print, "not enough params\n"); + print_err(print, "Usage: call_qcsapi wowlan_host_state " + " {0|1}\n"); + return 1; + } + + if (isdigit(*argv[0])) { + host_state = atoi(argv[0]); + } else { + return 1; + } + qcsapi_retval = qcsapi_set_host_state(the_interface, host_state); + + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out(print, "success\n"); + } + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } + + return( statval ); +} + +static int +call_qcsapi_wifi_host_state_get(call_qcsapi_bundle *p_calling_bundle, + int argc, char *argv[]) +{ + int statval = 0; + int qcsapi_retval = 0; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + uint16_t host_state; + qcsapi_unsigned_int host_state_len = sizeof(host_state); + + qcsapi_retval = qcsapi_wifi_wowlan_get_host_state(the_interface, &host_state, &host_state_len); + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) + print_out(print, "%u\n", host_state); + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } + + return statval; +} + +static int +call_qcsapi_wifi_wowlan_match_type_set(const call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[]) +{ + int statval = 0; + uint16_t wowlan_match; + int qcsapi_retval; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + + if (argc < 1) { + print_err(print, "not enough params\n"); + print_err(print, "Usage: call_qcsapi wowlan_match_type " + " " + "protocol should be 0, 1(L2) or 2(L3) " + "0 means match standard magic L2 type(0x0842) or L3 UDP destination port(7 or 9)\n"); + return 1; + } + + if (isdigit(*argv[0])) { + wowlan_match = atoi(argv[0]); + } else { + return 1; + } + qcsapi_retval = qcsapi_wowlan_set_match_type(the_interface, wowlan_match); + + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out(print, "success\n"); + } + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } + + return( statval ); +} + +static int +call_qcsapi_wifi_wowlan_match_type_get(call_qcsapi_bundle *p_calling_bundle, + int argc, char *argv[]) +{ + int statval = 0; + int qcsapi_retval = 0; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + uint16_t match_type; + qcsapi_unsigned_int len = sizeof(match_type); + + qcsapi_retval = qcsapi_wifi_wowlan_get_match_type(the_interface, &match_type, &len); + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) + print_out(print, "%u\n", match_type); + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } + + return statval; +} +static int +call_qcsapi_wifi_wowlan_L2_type_set(const call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[]) +{ + int statval = 0; + uint16_t ether_type; + int qcsapi_retval; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + + if (argc < 1) { + print_err(print, "not enough params\n"); + print_err(print, "Usage: call_qcsapi wowlan_L2_type " + " \n"); + return 1; + } + + if (isdigit(*argv[0])) { + ether_type = atoi(argv[0]); + } else { + return 1; + } + qcsapi_retval = qcsapi_wowlan_set_L2_type(the_interface, ether_type); + + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out(print, "success\n"); + } + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } + + return( statval ); +} + +static int +call_qcsapi_wifi_wowlan_L2_type_get(call_qcsapi_bundle *p_calling_bundle, + int argc, char *argv[]) +{ + int statval = 0; + int qcsapi_retval = 0; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + uint16_t l2_type; + qcsapi_unsigned_int len = sizeof(l2_type); + + qcsapi_retval = qcsapi_wifi_wowlan_get_l2_type(the_interface, &l2_type, &len); + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) + print_out(print, "%u\n", l2_type); + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } + + return statval; +} +static int +call_qcsapi_wifi_wowlan_udp_port_set(const call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[]) +{ + int statval = 0; + uint16_t udp_port; + int qcsapi_retval; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + + if (argc < 1) { + print_err(print, "not enough params\n"); + print_err(print, "Usage: call_qcsapi wowlan_udp_port " + " \n"); + return 1; + } + + if (isdigit(*argv[0])) { + udp_port = atoi(argv[0]); + } else { + return 1; + } + qcsapi_retval = qcsapi_wowlan_set_udp_port(the_interface, udp_port); + + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out(print, "success\n"); + } + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } + + return( statval ); +} + +static int +call_qcsapi_wifi_wowlan_udp_port_get(call_qcsapi_bundle *p_calling_bundle, + int argc, char *argv[]) +{ + int statval = 0; + int qcsapi_retval = 0; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + uint16_t udp_port; + qcsapi_unsigned_int len = sizeof(udp_port); + + qcsapi_retval = qcsapi_wifi_wowlan_get_udp_port(the_interface, &udp_port, &len); + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) + print_out(print, "%u\n", udp_port); + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } + + return statval; +} +#define MAX_USER_DEFINED_MAGIC 256 +void str_to_hex(uint8_t *pbDest, const char *pbSrc, int nLen) +{ + char h1,h2; + uint8_t s1,s2; + int i; + + for (i = 0; i < nLen; i++) + { + h1 = pbSrc[2*i]; + h2 = pbSrc[2*i+1]; + + s1 = toupper(h1) - 0x30; + if (s1 > 9) + s1 -= 7; + + s2 = toupper(h2) - 0x30; + if (s2 > 9) + s2 -= 7; + + pbDest[i] = s1*16 + s2; + } +} + +int get_pattern_string(const char *arg, uint8_t *pattern) +{ + int loop = 0; + int num = 0; + int pattern_len = strnlen(arg, MAX_USER_DEFINED_MAGIC<<1); + + while (loop < pattern_len) { + if (isxdigit(arg[loop]) && isxdigit(arg[loop+1])) { + str_to_hex(&pattern[num], &arg[loop], 1); + num++; + loop += 2; + } else { + loop++; + } + } + return num; +} + +static int +call_qcsapi_wifi_wowlan_pattern_set(const call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[]) +{ + int statval = 0; + int qcsapi_retval; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + uint8_t pattern[MAX_USER_DEFINED_MAGIC]; + struct qcsapi_data_256bytes pattern_data; + uint32_t input_string_len; + uint32_t actual_string_len; + + if (argc < 1) { + print_err(print, "not enough params\n"); + print_err(print, "Usage: call_qcsapi wowlan_pattern " + " " + "pattern should be aabb0a0b and 256 bytes in total length\n"); + return 1; + } + + memset(pattern, 0, MAX_USER_DEFINED_MAGIC); + if ((input_string_len = strnlen(argv[0], (MAX_USER_DEFINED_MAGIC<<1)+1)) > (MAX_USER_DEFINED_MAGIC<<1)) { + print_err(print, "pattern should be 256 bytes in total length\n"); + return 1; + } + + actual_string_len = get_pattern_string(argv[0], pattern); + if (actual_string_len != (input_string_len>>1)) { + print_err(print, "there are unrecognized chars\n"); + return 1; + } + + memset(&pattern_data, 0, sizeof(pattern_data)); + memcpy(pattern_data.data, pattern, actual_string_len); + qcsapi_retval = qcsapi_wowlan_set_magic_pattern(the_interface, &pattern_data, actual_string_len); + + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out( print, "success\n"); + } + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } + return( statval ); +} + +static void +dump_magic_pattern(qcsapi_output *print, struct qcsapi_data_256bytes *magic_pattern, qcsapi_unsigned_int pattern_len) +{ + int i; + + for (i = 0; i < pattern_len; i++) { + print_out(print, "%02X", magic_pattern->data[i]); + } + print_out(print, "\n"); +} + +static int +call_qcsapi_wifi_wowlan_pattern_get(call_qcsapi_bundle *p_calling_bundle, + int argc, char *argv[]) +{ + int statval = 0; + int qcsapi_retval = 0; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + struct qcsapi_data_256bytes magic_pattern; + qcsapi_unsigned_int pattern_len = sizeof(magic_pattern); + + memset(&magic_pattern, 0, sizeof(magic_pattern)); + qcsapi_retval = qcsapi_wifi_wowlan_get_magic_pattern(the_interface, &magic_pattern, &pattern_len); + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) + dump_magic_pattern(print, &magic_pattern, pattern_len); + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } + + return statval; +} + +static int +call_qcsapi_wifi_tdls_operate(call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[]) +{ + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + qcsapi_tdls_oper operate = p_calling_bundle->caller_generic_parameter.parameter_type.tdls_oper; + int statval = 0; + int qcsapi_retval = 0; + int cs_interval = 0; + + if (operate == qcsapi_tdls_oper_switch_chan) { + if (argc < 2) { + print_err(print, "Not enough parameters, count is %d\n", argc); + return 1; + } + cs_interval = atoi(argv[1]); + } else { + if (argc < 1) { + print_err(print, "Not enough parameters, count is %d\n", argc); + return 1; + } + } + + qcsapi_retval = qcsapi_wifi_tdls_operate(the_interface, operate, argv[0], cs_interval); + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) + print_out(print, "complete\n"); + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } + + return statval; +} + +static int call_qcsapi_wifi_set_extender_params(call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[]) +{ + int statval = 0; + int qcsapi_retval = 0; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + qcsapi_extender_type type = p_calling_bundle->caller_generic_parameter.parameter_type.type_of_extender; + int value = 0; + + if (argc < 1) { + print_err(print, "Not enough parameters\n"); + statval = 1; + goto out; + } + + switch (type) { + case qcsapi_extender_role: + if (strcasecmp(argv[0], "mbs") == 0) { + value = IEEE80211_EXTENDER_ROLE_MBS; + } else if (strcasecmp(argv[0], "rbs") == 0) { + value = IEEE80211_EXTENDER_ROLE_RBS; + } else if (strcasecmp(argv[0], "none") == 0) { + value = IEEE80211_EXTENDER_ROLE_NONE; + } else { + print_err(print, "invalid role [%s]\n", argv[0]); + statval = 1; + goto out; + } + break; + case qcsapi_extender_mbs_best_rssi: + case qcsapi_extender_rbs_best_rssi: + case qcsapi_extender_mbs_wgt: + case qcsapi_extender_rbs_wgt: + case qcsapi_extender_verbose: + case qcsapi_extender_roaming: + case qcsapi_extender_bgscan_interval: + if (sscanf(argv[0], "%d", &value) != 1) { + print_err(print, "Error parsing '%s'\n", argv[0]); + return 1; + } + break; + default: + statval = 1; + goto out; + break; + } + + qcsapi_retval = qcsapi_wifi_set_extender_params(the_interface, type, value); + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) + print_out(print, "complete\n"); + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } +out: + return statval; +} + +static int +call_qcsapi_wifi_get_bgscan_status(call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[]) +{ + int statval = 0; + int qcsapi_retval = 0; + int enable = 0; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + + qcsapi_retval = qcsapi_wifi_get_bgscan_status(the_interface, &enable); + + if (qcsapi_retval >= 0) { + print_out( print, "Bgscan enable: %d\n", enable); + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } + + return statval; +} + +static int +call_qcsapi_wifi_enable_bgscan(call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[]) +{ + int statval = 0; + int qcsapi_retval = 0; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + int enable = 0; + + if (argc < 1) { + print_err(print, "Not enough parameters, count is %d\n", argc); + return 1; + } + + if (isdigit(*argv[0])) { + enable = atoi(argv[0]); + } else { + print_err(print, "Unrecognized parameter value %s\n", argv[0]); + return 1; + } + + qcsapi_retval = qcsapi_wifi_enable_bgscan(the_interface, enable); + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) + print_out(print, "complete\n"); + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } + + return statval; +} + +static void +print_extender_params(qcsapi_extender_type type, int value, qcsapi_output *print, + int iter) +{ + char *role = NULL; + if (type == qcsapi_extender_role) { + switch(value) { + case IEEE80211_EXTENDER_ROLE_NONE: + role = "NONE"; + break; + case IEEE80211_EXTENDER_ROLE_MBS: + role = "MBS"; + break; + case IEEE80211_EXTENDER_ROLE_RBS: + role = "RBS"; + break; + default: + break; + } + print_out(print, "%s: %s\n", + qcsapi_extender_param_table[iter].param_name, role); + } else { + print_out(print, "%s: %d\n", + qcsapi_extender_param_table[iter].param_name, value); + } +} + +static void +print_eth_info(qcsapi_eth_info_type type, qcsapi_eth_info_result value, qcsapi_output *print) +{ + int iter; + int mask = 0; + + for (iter = 0; iter < ARRAY_SIZE(qcsapi_eth_info_type_mask_table); iter++) { + if (qcsapi_eth_info_type_mask_table[iter].type == type) { + mask = qcsapi_eth_info_type_mask_table[iter].mask; + break; + } + } + + for (iter = 0; iter < ARRAY_SIZE(qcsapi_eth_info_result_table); iter++) { + if (!(mask & 1 << iter)) + continue; + if (value & qcsapi_eth_info_result_table[iter].result_type) { + if (qcsapi_eth_info_result_table[iter].result_bit_set) { + print_out(print, "%s: %s\n", + qcsapi_eth_info_result_table[iter].result_label, + qcsapi_eth_info_result_table[iter].result_bit_set); + } + } else { + if (qcsapi_eth_info_result_table[iter].result_bit_unset) { + print_out(print, "%s: %s\n", + qcsapi_eth_info_result_table[iter].result_label, + qcsapi_eth_info_result_table[iter].result_bit_unset); + } + } + } +} + +static int +call_qcsapi_wifi_get_tx_amsdu(call_qcsapi_bundle *p_calling_bundle, + int argc, char *argv[]) +{ + int statval = 0; + int enable, qcsapi_retval; + const char *wifi = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + + qcsapi_retval = qcsapi_wifi_get_tx_amsdu(wifi, &enable); + + if (qcsapi_retval >= 0) { + print_out(print, "%d\n", enable); + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } + + return statval; +} + +static int +call_qcsapi_wifi_set_tx_amsdu(call_qcsapi_bundle *p_calling_bundle, + int argc, char *argv[]) +{ + int statval = 0; + int enable, qcsapi_retval; + const char *wifi = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + + if (argc < 1) { + print_err(print, "Usage: call_qcsapi set_tx_amsdu " + " { 0 | 1 }\n"); + return 1; + } + + enable = atoi(argv[0]); + if ((enable != 0) && (enable != 1)) { + print_err(print, "bad parameter %s\n", argv[0]); + return 1; + } + + qcsapi_retval = qcsapi_wifi_set_tx_amsdu(wifi, enable); + + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) + print_out(print, "success\n"); + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } + + return statval; +} + +static int +call_qcsapi_wifi_get_extender_status(call_qcsapi_bundle *p_calling_bundle, + int argc, char *argv[]) +{ + int qcsapi_retval; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + qcsapi_extender_type type = 0; + int value = 0; + unsigned int iter; + + for (iter = 0; iter < ARRAY_SIZE(qcsapi_extender_param_table); iter++) { + type = qcsapi_extender_param_table[iter].param_type; + if (type == qcsapi_extender_nosuch_param) + continue; + qcsapi_retval = qcsapi_wifi_get_extender_params(the_interface, + type, &value); + + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_extender_params(type, value, print, iter); + } + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + return 1; + } + } + + return 0; +} + +static int +call_qcsapi_is_startprod_done(call_qcsapi_bundle *p_calling_bundle, + int argc, char *argv[]) +{ + int qcsapi_retval=0; + int status=0; + + qcsapi_output *print = p_calling_bundle->caller_output; + + qcsapi_retval = qcsapi_is_startprod_done(&status); + + if (qcsapi_retval < 0) { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + return 1; + } + + if (verbose_flag >= 0) { + print_out(print, "%d\n",status); + } + + return 0; +} + +static int +call_qcsapi_wifi_get_disassoc_reason(call_qcsapi_bundle *call, int argc, char *argv[]) +{ + int rc = 0; + int qcsapi_retval; + + qcsapi_unsigned_int disassoc_reason; + qcsapi_output *print = call->caller_output; + const char *the_interface = call->caller_interface; + + qcsapi_retval = qcsapi_wifi_get_disassoc_reason( the_interface, &disassoc_reason); + if (qcsapi_retval >= 0) { + if (disassoc_reason <= ARRAY_SIZE(qcsapi_disassoc_reason_list)) { + print_out(print,"Disassoc Reason Code - %d: %s\n", disassoc_reason, qcsapi_disassoc_reason_list[disassoc_reason].reason_string); + } else { + print_out(print,"Reserved Code [%d]", disassoc_reason); + } + } else { + report_qcsapi_error(call, qcsapi_retval); + rc = 1; + } + + return rc; +} + +static int +call_qcsapi_wifi_get_bb_param( const call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[] ) +{ + int statval = 0; + int qcsapi_retval; + qcsapi_output *print = p_calling_bundle->caller_output; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_unsigned_int bb_param; + + qcsapi_retval = qcsapi_wifi_get_bb_param(the_interface, &bb_param); + + if (qcsapi_retval >= 0) { + print_out(print, "%d\n", bb_param); + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } + + return statval; +} + +static int +call_qcsapi_wifi_set_bb_param(call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[]) +{ + + int statval = 0; + qcsapi_output *print = p_calling_bundle->caller_output; + + if (argc < 1) + { + print_err( print, "Not enough parameters in call qcsapi WiFi bb_param, count is %d\n", argc ); + statval = 1; + } + else + { + qcsapi_unsigned_int bb_param = atoi( argv[ 0 ] ); + int qcsapi_retval; + const char *the_interface = p_calling_bundle->caller_interface; + + qcsapi_retval = qcsapi_wifi_set_bb_param(the_interface, bb_param); + if (qcsapi_retval >= 0) + { + if (bb_param >= 0) + { + print_out( print, "complete\n" ); + } + } + else + { + report_qcsapi_error(p_calling_bundle, qcsapi_retval ); + statval = 1; + } + } + + return( statval ); +} + +static int +call_qcsapi_wifi_set_scan_buf_max_size(call_qcsapi_bundle *p_calling_bundle, + int argc, char *argv[]) +{ + int statval = 0; + int qcsapi_retval = 0; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + qcsapi_unsigned_int max_buf_size; + + if (argc < 1) { + print_err(print, "Not enough parameters, count is %d\n", argc); + return 1; + } + + max_buf_size = (qcsapi_unsigned_int)atoi(argv[0]); + + qcsapi_retval = qcsapi_wifi_set_scan_buf_max_size(the_interface, max_buf_size); + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) + print_out(print, "complete\n"); + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } + + return statval; +} + +static int +call_qcsapi_wifi_get_scan_buf_max_size(call_qcsapi_bundle *p_calling_bundle, + int argc, char *argv[]) +{ + int statval = 0; + int qcsapi_retval = 0; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + qcsapi_unsigned_int max_buf_size; + + qcsapi_retval = qcsapi_wifi_get_scan_buf_max_size(the_interface, &max_buf_size); + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) + print_out(print, "%u\n", max_buf_size); + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } + + return statval; +} + +static int +call_qcsapi_wifi_set_scan_table_max_len(call_qcsapi_bundle *p_calling_bundle, + int argc, char *argv[]) +{ + int statval = 0; + int qcsapi_retval = 0; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + qcsapi_unsigned_int max_table_len; + + if (argc < 1) { + print_err(print, "Not enough parameters, count is %d\n", argc); + return 1; + } + + max_table_len = (qcsapi_unsigned_int)atoi(argv[0]); + qcsapi_retval = qcsapi_wifi_set_scan_table_max_len(the_interface, max_table_len); + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) + print_out(print, "complete\n"); + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } + + return statval; +} + +static int +call_qcsapi_wifi_get_scan_table_max_len(call_qcsapi_bundle *p_calling_bundle, + int argc, char *argv[]) +{ + int statval = 0; + int qcsapi_retval = 0; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + qcsapi_unsigned_int max_table_len; + + qcsapi_retval = qcsapi_wifi_get_scan_table_max_len(the_interface, &max_table_len); + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) + print_out(print, "%u\n", max_table_len); + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } + + return statval; +} + +static int +call_qcsapi_wifi_set_enable_mu(call_qcsapi_bundle *p_calling_bundle, + int argc, char *argv[]) +{ + int statval = 0; + int qcsapi_retval = 0; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + qcsapi_unsigned_int mu_enable; + + if (argc < 1 || strcmp(argv[0], "NULL") == 0) { + print_err(print, "Not enough parameters, count is %d\n", argc); + return 1; + } + + mu_enable = (qcsapi_unsigned_int)atoi(argv[0]); + qcsapi_retval = qcsapi_wifi_set_enable_mu(the_interface, mu_enable); + + if (qcsapi_retval < 0) { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } else if (verbose_flag >= 0) { + print_out(print, "complete\n"); + } + + return statval; +} + +static int +call_qcsapi_wifi_get_enable_mu(call_qcsapi_bundle *p_calling_bundle, + int argc, char *argv[]) +{ + int statval = 0; + int qcsapi_retval = 0; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + qcsapi_unsigned_int mu_enable; + + qcsapi_retval = qcsapi_wifi_get_enable_mu(the_interface, &mu_enable); + + if (qcsapi_retval < 0) { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } else if (verbose_flag >= 0) { + print_out(print, "%u\n", mu_enable); + } + + return statval; +} + +static int +call_qcsapi_wifi_set_mu_use_precode(call_qcsapi_bundle *p_calling_bundle, + int argc, char *argv[]) +{ + int statval = 0; + int qcsapi_retval = 0; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + qcsapi_unsigned_int prec_enable; + qcsapi_unsigned_int grp; + + if (argc < 2 || strcmp(argv[1], "NULL") == 0 || strcmp(argv[0], "NULL") == 0) { + print_err(print, "Not enough parameters, count is %d\n", argc); + return 1; + } + + grp = (qcsapi_unsigned_int)atoi(argv[0]); + prec_enable = (qcsapi_unsigned_int)atoi(argv[1]); + + qcsapi_retval = qcsapi_wifi_set_mu_use_precode(the_interface, grp, prec_enable); + + if (qcsapi_retval < 0) { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } else if (verbose_flag >= 0) { + print_out(print, "complete\n"); + } + + return statval; +} + +static int +call_qcsapi_wifi_get_mu_use_precode(call_qcsapi_bundle *p_calling_bundle, + int argc, char *argv[]) +{ + int statval = 0; + int qcsapi_retval = 0; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + qcsapi_unsigned_int prec_enable; + qcsapi_unsigned_int grp; + + if (argc < 1 || strcmp(argv[0], "NULL") == 0) { + print_err(print, "Not enough parameters, count is %d\n", argc); + return 1; + } + + grp = (qcsapi_unsigned_int)atoi(argv[0]); + qcsapi_retval = qcsapi_wifi_get_mu_use_precode(the_interface, grp, &prec_enable); + + if (qcsapi_retval < 0) { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } else if (verbose_flag >= 0) { + print_out(print, "%u\n", prec_enable); + } + + return statval; +} + +static int +call_qcsapi_wifi_set_mu_use_eq(call_qcsapi_bundle *p_calling_bundle, + int argc, char *argv[]) +{ + int statval = 0; + int qcsapi_retval = 0; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + qcsapi_unsigned_int eq_enable; + + if (argc < 1 || strcmp(argv[0], "NULL") == 0) { + print_err(print, "Not enough parameters, count is %d\n", argc); + return 1; + } + + eq_enable = (qcsapi_unsigned_int)atoi(argv[0]); + qcsapi_retval = qcsapi_wifi_set_mu_use_eq(the_interface, eq_enable); + + if (qcsapi_retval < 0) { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } else if (verbose_flag >= 0) { + print_out(print, "complete\n"); + } + + return statval; +} + +static int +call_qcsapi_wifi_get_mu_use_eq(call_qcsapi_bundle *p_calling_bundle, + int argc, char *argv[]) +{ + int statval = 0; + int qcsapi_retval = 0; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + qcsapi_unsigned_int eq_enable; + + qcsapi_retval = qcsapi_wifi_get_mu_use_eq(the_interface, &eq_enable); + + if (qcsapi_retval < 0) { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } else if (verbose_flag >= 0) { + print_out(print, "%u\n", eq_enable); + } + + return statval; +} + +static int +call_qcsapi_wifi_get_mu_groups(call_qcsapi_bundle *p_calling_bundle, + int argc, char *argv[]) +{ + int statval = 0; + int qcsapi_retval = 0; + const char *the_interface = p_calling_bundle->caller_interface; + qcsapi_output *print = p_calling_bundle->caller_output; + char buf[1024]; + + qcsapi_retval = qcsapi_wifi_get_mu_groups(the_interface, &buf[0], sizeof(buf)); + + if (qcsapi_retval < 0) { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } else if (verbose_flag >= 0) { + print_out(print, "%s", buf); + } + + return statval; +} + +static int +call_qcsapi_wifi_set_optim_stats(call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[]) +{ + int statval = 0; + qcsapi_output *print = p_calling_bundle->caller_output; + char *str_ptr; + + if (argc < 1) + { + print_err( print, "Not enough parameters in call qcsapi WiFi set_optim_stats, count is %d\n", argc ); + statval = 1; + } + else + { + qcsapi_unsigned_int rx_optim_stats = strtol(argv[ 0 ], &str_ptr, 10); + int qcsapi_retval; + const char *the_interface = p_calling_bundle->caller_interface; + + qcsapi_retval = qcsapi_wifi_set_optim_stats(the_interface, rx_optim_stats); + if (qcsapi_retval >= 0) + { + print_out( print, "complete\n" ); + } + else + { + report_qcsapi_error(p_calling_bundle, qcsapi_retval ); + statval = 1; + } + } + + return( statval ); +} + +static int call_qcsapi_send_file(call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[]) +{ + int statval = 0; + int qcsapi_retval; + const char *image_file_path = NULL; + int image_flags = 0; + qcsapi_output *print = p_calling_bundle->caller_output; + + if (argc != 1 && argc != 2) { + print_err(print, "Usage: call_qcsapi send_file \n"); + statval = 1; + } else { + if (strcmp(argv[0], "NULL") != 0) { + image_file_path = argv[0]; + + qcsapi_retval = qcsapi_send_file(image_file_path, image_flags); + if (qcsapi_retval < 0) { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } + } else { + statval = 1; + } + } + + return statval; +} + +static int +call_qcsapi_dscp_fill(call_qcsapi_bundle *p_calling_bundle, + int argc, char *argv[]) +{ + int statval = 0; + qcsapi_output *print = p_calling_bundle->caller_output; + + if (argc < 3) { + statval = 1; + print_err(print, "Usage: call_qcsapi dscp \n"); + } + else { + int qcsapi_retval; + const char *eth_type = argv[1]; + const char *value = argv[2]; + + if (strcmp(eth_type, "NULL") == 0) { + eth_type = NULL; + } + if (strcmp(value, "NULL") == 0) { + value = NULL; + } + + qcsapi_retval = qcsapi_eth_dscp_map(qcsapi_eth_dscp_fill, + eth_type, + NULL, + value, + NULL, + 0); + + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out(print, "complete\n" ); + } + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } + } + + return statval; +} + +static int +call_qcsapi_dscp_poke(call_qcsapi_bundle *p_calling_bundle, + int argc, char *argv[]) +{ + int statval = 0; + qcsapi_output *print = p_calling_bundle->caller_output; + + if (argc < 4) { + print_err(print, "Usage: call_qcsapi dscp \n"); + statval = 1; + } + else { + int qcsapi_retval; + const char *eth_type = argv[1]; + const char *level = argv[2]; + const char *value = argv[3]; + + if (strcmp(eth_type, "NULL") == 0) { + eth_type = NULL; + } + if (strcmp(level, "NULL") == 0) { + level = NULL; + } + if (strcmp(value, "NULL") == 0) { + value = NULL; + } + + qcsapi_retval = qcsapi_eth_dscp_map(qcsapi_eth_dscp_poke, + eth_type, + level, + value, + NULL, + 0); + + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out(print, "complete\n"); + } + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } + } + + return statval; +} + +static int +call_qcsapi_dscp_dump(call_qcsapi_bundle *p_calling_bundle, + int argc, char *argv[]) +{ + int statval = 0; + int qcsapi_retval = 0; + qcsapi_output *print = p_calling_bundle->caller_output; + char buf[2048] = {0}; + char *eth_type = argv[1]; + + if (strcmp(eth_type, "NULL") == 0) { + eth_type = NULL; + } + + qcsapi_retval = qcsapi_eth_dscp_map(qcsapi_eth_dscp_dump, + eth_type, + NULL, + NULL, + &buf[0], + sizeof(buf)); + + if (qcsapi_retval < 0) { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } else if (verbose_flag >= 0) { + print_out(print, "%s", buf); + } + + return statval; +} + +static int +call_qcsapi_get_emac_switch(call_qcsapi_bundle *p_calling_bundle, + int argc, char *argv[]) +{ + int statval = 0; + qcsapi_output *print = p_calling_bundle->caller_output; + int qcsapi_retval = 0; + char buf[2048] = {0}; + + qcsapi_retval = qcsapi_get_emac_switch(buf); + + if (qcsapi_retval < 0) { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } else if (verbose_flag >= 0) { + print_out(print, "%s\n", buf); + } + + return statval; +} + +static int +call_qcsapi_set_emac_switch(call_qcsapi_bundle *p_calling_bundle, + int argc, char *argv[]) +{ + int statval = 0; + qcsapi_output *print = p_calling_bundle->caller_output; + int qcsapi_retval = 0; + qcsapi_unsigned_int value; + + value = (qcsapi_unsigned_int)atoi(argv[0]); + if (value == 0) { + qcsapi_retval = qcsapi_set_emac_switch(qcsapi_emac_switch_enable); + } else { + qcsapi_retval = qcsapi_set_emac_switch(qcsapi_emac_switch_disable); + } + + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out(print, "complete\n"); + } + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } + + return statval; +} + +static int +call_qcsapi_eth_dscp_map(call_qcsapi_bundle *p_calling_bundle, + int argc, char *argv[]) +{ + int statval = 0; + qcsapi_output *print = p_calling_bundle->caller_output; + + if (argc < 2) { + print_err(print, "Usage: call_qcsapi dscp " + " [level] [value]\n"); + statval = 1; + } else { + char *param = argv[0]; + + if (strcmp(param, "fill") == 0) { + statval = call_qcsapi_dscp_fill(p_calling_bundle, argc, argv); + } else if (strcmp(param, "poke") == 0) { + statval = call_qcsapi_dscp_poke(p_calling_bundle, argc, argv); + } else if (strcmp(param, "dump") == 0) { + statval = call_qcsapi_dscp_dump(p_calling_bundle, argc, argv); + } else { + print_err(print, "Usage: call_qcsapi dscp " + " [level] [value]\n"); + statval = 1; + } + } + + return statval; +} + +static int +call_qcsapi_get_eth_info(call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[]) +{ + qcsapi_output *print = p_calling_bundle->caller_output; + qcsapi_eth_info_type eth_info_type = qcsapi_eth_nosuch_type; + qcsapi_eth_info_result eth_info_result = qcsapi_eth_info_unknown; + int qcsapi_retval; + const char *the_interface = p_calling_bundle->caller_interface; + + if (argc != 0 && argc != 1) { + print_err(print, "Usage: call_qcsapi get_eth_info " + "{ link | speed | duplex | autoneg }\n"); + return 1; + } + + if (argc == 0) { + for (eth_info_type = qcsapi_eth_info_start; + eth_info_type < qcsapi_eth_info_all; + eth_info_type++) { + qcsapi_retval = qcsapi_get_eth_info(the_interface, eth_info_type); + if (qcsapi_retval >= 0) { + eth_info_result |= (qcsapi_eth_info_result)qcsapi_retval; + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + return 1; + } + } + print_eth_info(eth_info_type, eth_info_result, print); + return 0; + } + + if (!strcmp("link", argv[0])) { + eth_info_type = qcsapi_eth_info_link; + } else if (!strcmp("speed", argv[0])) { + eth_info_type = qcsapi_eth_info_speed; + } else if (!strcmp("duplex", argv[0])) { + eth_info_type = qcsapi_eth_info_duplex; + } else if (!strcmp("autoneg", argv[0])) { + eth_info_type = qcsapi_eth_info_autoneg; + } else { + print_out(print, "Invalid option\n"); + return 1; + } + + qcsapi_retval = qcsapi_get_eth_info(the_interface, eth_info_type); + if (qcsapi_retval >= 0) { + print_eth_info(eth_info_type, qcsapi_retval, print); + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + return 1; + } + + return 0; +} + +static int +call_qcsapi_set_sys_time(call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[]) +{ + int statval; + qcsapi_output *print = p_calling_bundle->caller_output; + unsigned long sec; + + if (argc != 1) { + print_err(print, "Usage: call_qcsapi set_sys_time \n"); + return 1; + } + + if (qcsapi_verify_numeric(argv[0]) < 0) { + print_err(print, "Invalid value for seconds since epoch\n"); + return 1; + } + + sec = strtoul(argv[0], NULL, 10); + if (sec == 0 || sec >= UINT32_MAX) { + print_err(print, "Invalid value for seconds since epoch\n"); + return 1; + } + + statval = qcsapi_wifi_set_sys_time((uint32_t)sec); + if (statval >= 0 && verbose_flag >= 0) + print_out(print, "complete\n"); + else + report_qcsapi_error(p_calling_bundle, statval); + + return statval; +} + +static int +call_qcsapi_get_sys_time(call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[]) +{ + int statval = 0; + qcsapi_output *print = p_calling_bundle->caller_output; + uint32_t sec; + + if (argc != 0) { + print_err(print, "Usage: call_qcsapi get_sys_time\n"); + return 1; + } + + statval = qcsapi_wifi_get_sys_time(&sec); + if (statval == 0) { + print_out(print, "%u\n", sec); + } else { + report_qcsapi_error(p_calling_bundle, statval); + } + + return statval; +} + +static int +call_qcsapi_wifi_block_bss(call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[]) +{ + int statval = 0; + int qcsapi_retval; + qcsapi_output *print = p_calling_bundle->caller_output; + qcsapi_unsigned_int flag; + const char *the_interface = p_calling_bundle->caller_interface; + + if (argc < 1) { + print_err( print, "Not enough parameters in call_qcsapi block_bss\n" ); + print_err( print, "Usage: call_qcsapi block_bss <0/1> \n"); + return 1; + } + + if (isdigit(*argv[0])) { + flag = atoi(argv[0]); + } else { + print_err(print, "Unrecognized %s\n", argv[0]); + return 1; + } + + qcsapi_retval = qcsapi_wifi_block_bss(the_interface, flag); + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out( print, "complete\n" ); + } + } else { + report_qcsapi_error( p_calling_bundle, qcsapi_retval ); + statval = 1; + } + + return (statval); +} + +static int +call_qcsapi_wifi_set_ap_interface_name(call_qcsapi_bundle *p_calling_bundle, + int argc, char *argv[]) +{ + int qcsapi_retval; + int statval = 0; + qcsapi_output *print = p_calling_bundle->caller_output; + + if (argc != 1) { + print_out(print, "Usage: call_qcsapi " + "set_ap_interface_name \n"); + return -EINVAL; + } + + qcsapi_retval = qcsapi_wifi_set_ap_interface_name(argv[0]); + + if (qcsapi_retval >= 0) { + if (verbose_flag >= 0) { + print_out( print, "complete\n"); + } + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } + + return statval; +} + +static int +call_qcsapi_wifi_get_ap_interface_name(call_qcsapi_bundle *p_calling_bundle, + int argc, char *argv[]) +{ + int qcsapi_retval = 0; + int statval = 0; + qcsapi_output *print = p_calling_bundle->caller_output; + char ifname[IFNAMSIZ] = {0}; + + if (argc > 0) { + print_out(print, "Usage: call_qcsapi " + "get_ap_interface_name\n"); + return -EINVAL; + } + + qcsapi_retval = qcsapi_wifi_get_ap_interface_name(ifname); + if(qcsapi_retval >= 0) { + print_out(print, "%s\n", ifname); + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } + + return statval; +} + +static int +call_qcsapi_wifi_verify_repeater_mode(call_qcsapi_bundle *p_calling_bundle, + int argc, char *argv[]) +{ + int qcsapi_retval = 0; + int statval = 0; + qcsapi_output *print = p_calling_bundle->caller_output; + + if (argc > 0) { + print_out(print, "Usage: call_qcsapi " + "verify_repeater_mode\n"); + return -EINVAL; + } + + qcsapi_retval = qcsapi_wifi_verify_repeater_mode(); + if(qcsapi_retval >= 0) { + print_out(print, "%d\n", qcsapi_retval); + } else { + report_qcsapi_error(p_calling_bundle, qcsapi_retval); + statval = 1; + } + + return statval; +} + +/* end of programs to call individual QCSAPIs */ + +static int +call_particular_qcsapi( call_qcsapi_bundle *p_calling_bundle, int argc, char *argv[] ) +{ + int statval = 0; + qcsapi_output *print = p_calling_bundle->caller_output; + + /* + * Interface programs that SET a parameter require the + * current list of arguments to get additional parameters + */ + switch (p_calling_bundle->caller_qcsapi) + { + case e_qcsapi_errno_get_message: + statval = call_qcsapi_errno_get_message( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_store_ipaddr: + statval = call_qcsapi_store_ipaddr( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_interface_enable: + statval = call_qcsapi_interface_enable( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_interface_get_BSSID: + statval = call_qcsapi_interface_get_BSSID( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_interface_get_mac_addr: + statval = call_qcsapi_interface_get_mac_addr( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_interface_set_mac_addr: + statval = call_qcsapi_interface_set_mac_addr( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_interface_get_counter: + statval = call_qcsapi_interface_get_counter( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_interface_get_counter64: + statval = call_qcsapi_interface_get_counter64( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_flash_image_update: + statval = call_qcsapi_flash_image_update( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_firmware_get_version: + statval = call_qcsapi_firmware_get_version( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_system_get_time_since_start: + statval = call_qcsapi_system_get_time_since_start( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_get_system_status: + statval = call_qcsapi_get_system_status( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_get_random_seed: + statval = call_qcsapi_get_random_seed( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_set_random_seed: + statval = call_qcsapi_set_random_seed( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_led_get: + statval = call_qcsapi_led_get( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_led_set: + statval = call_qcsapi_led_set( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_led_pwm_enable: + statval = call_qcsapi_led_pwm_enable( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_led_brightness: + statval = call_qcsapi_led_brightness( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_gpio_get_config: + statval = call_qcsapi_gpio_get_config( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_gpio_set_config: + statval = call_qcsapi_gpio_set_config( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_gpio_enable_wps_push_button: + statval = call_qcsapi_gpio_enable_wps_push_button( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_file_path_get_config: + statval = call_qcsapi_file_path_get_config( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_file_path_set_config: + statval = call_qcsapi_file_path_set_config( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wifi_set_wifi_macaddr: + statval = call_qcsapi_wifi_set_wifi_macaddr( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wifi_create_restricted_bss: + statval = call_qcsapi_wifi_create_restricted_bss(p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wifi_create_bss: + statval = call_qcsapi_wifi_create_bss(p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wifi_remove_bss: + statval = call_qcsapi_wifi_remove_bss(p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wifi_get_primary_interface: + statval = call_qcsapi_wifi_get_primary_interface(p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wifi_get_interface_by_index: + statval = call_qcsapi_wifi_get_interface_by_index(p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wifi_get_mode: + statval = call_qcsapi_wifi_get_mode( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wifi_set_mode: + statval = call_qcsapi_wifi_set_mode( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wifi_get_phy_mode: + statval = call_qcsapi_wifi_get_phy_mode( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wifi_set_phy_mode: + statval = call_qcsapi_wifi_set_phy_mode( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wifi_reload_in_mode: + statval = call_qcsapi_wifi_reload_in_mode( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wifi_rfenable: + statval = call_qcsapi_wifi_rfenable( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wifi_rfstatus: + statval = call_qcsapi_wifi_rfstatus( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wifi_startprod: + statval = call_qcsapi_wifi_startprod( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wifi_get_bw: + statval = call_qcsapi_wifi_get_bw( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wifi_set_bw: + statval = call_qcsapi_wifi_set_bw( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wifi_get_noise: + statval = call_qcsapi_wifi_get_noise( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wifi_get_rssi_by_chain: + statval = call_qcsapi_wifi_get_rssi_by_chain( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wifi_get_avg_snr: + statval = call_qcsapi_wifi_get_avg_snr( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wifi_get_BSSID: + statval = call_qcsapi_wifi_get_BSSID( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wifi_get_config_BSSID: + statval = call_qcsapi_wifi_get_config_BSSID( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wifi_ssid_get_bssid: + statval = call_qcsapi_wifi_ssid_get_bssid( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wifi_ssid_set_bssid: + statval = call_qcsapi_wifi_ssid_set_bssid( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wifi_get_SSID: + statval = call_qcsapi_wifi_get_SSID( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wifi_set_SSID: + statval = call_qcsapi_wifi_set_SSID( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wifi_get_channel: + statval = call_qcsapi_wifi_get_channel( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wifi_set_channel: + statval = call_qcsapi_wifi_set_channel( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wifi_get_auto_channel: + statval = call_qcsapi_wifi_get_auto_channel( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wifi_set_auto_channel: + statval = call_qcsapi_wifi_set_auto_channel( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wifi_get_standard: + statval = call_qcsapi_wifi_get_standard( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wifi_get_dtim: + statval = call_qcsapi_wifi_get_dtim( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wifi_set_dtim: + statval = call_qcsapi_wifi_set_dtim( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wifi_get_assoc_limit: + statval = call_qcsapi_wifi_get_assoc_limit( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wifi_set_assoc_limit: + statval = call_qcsapi_wifi_set_assoc_limit( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wifi_get_bss_assoc_limit: + statval = call_qcsapi_wifi_get_bss_assoc_limit( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wifi_set_bss_assoc_limit: + statval = call_qcsapi_wifi_set_bss_assoc_limit( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_interface_get_status: + statval = call_qcsapi_interface_get_status( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_interface_get_ip4: + statval = call_qcsapi_interface_get_ip4( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_pm_get_counter: + statval = call_qcsapi_pm_get_counter( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_pm_get_elapsed_time: + statval = call_qcsapi_pm_get_elapsed_time( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_interface_set_ip4: + statval = call_qcsapi_interface_set_ip4( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wifi_get_list_channels: + statval = call_qcsapi_wifi_get_list_channels( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wifi_get_mode_switch: + statval = call_qcsapi_wifi_get_mode_switch( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wifi_get_option: + statval = call_qcsapi_wifi_get_option( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_get_board_parameter: + statval = call_qcsapi_get_board_parameter( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wifi_set_option: + statval = call_qcsapi_wifi_set_option( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wifi_get_rates: + statval = call_qcsapi_wifi_get_rates( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wifi_set_rates: + statval = call_qcsapi_wifi_set_rates( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wifi_get_max_bitrate: + statval = call_qcsapi_wifi_get_max_bitrate( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wifi_set_max_bitrate: + statval = call_qcsapi_wifi_set_max_bitrate( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wifi_get_beacon_type: + statval = call_qcsapi_wifi_get_beacon_type( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wifi_set_beacon_type: + statval = call_qcsapi_wifi_set_beacon_type( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wifi_get_beacon_interval: + statval = call_qcsapi_wifi_get_beacon_interval( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wifi_set_beacon_interval: + statval = call_qcsapi_wifi_set_beacon_interval( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wifi_get_list_regulatory_regions: + statval = call_qcsapi_wifi_get_list_regulatory_regions( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wifi_get_regulatory_tx_power: + statval = call_qcsapi_wifi_get_regulatory_tx_power( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wifi_get_configured_tx_power: + statval = call_qcsapi_wifi_get_configured_tx_power( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wifi_set_regulatory_channel: + statval = call_qcsapi_wifi_set_regulatory_channel( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wifi_set_regulatory_region: + statval = call_qcsapi_wifi_set_regulatory_region( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wifi_restore_regulatory_tx_power: + statval = call_qcsapi_wifi_restore_regulatory_tx_power( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wifi_get_regulatory_region: + statval = call_qcsapi_wifi_get_regulatory_region( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wifi_overwrite_country_code: + statval = call_qcsapi_wifi_overwrite_country_code( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wifi_get_list_regulatory_channels: + statval = call_qcsapi_wifi_get_list_regulatory_channels( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wifi_get_list_regulatory_bands: + statval = call_qcsapi_wifi_get_list_regulatory_bands( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wifi_get_regulatory_db_version: + statval = call_qcsapi_wifi_get_regulatory_db_version( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wifi_set_regulatory_tx_power_cap: + statval = call_qcsapi_wifi_set_regulatory_tx_power_cap( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wifi_set_chan_pri_inactive: + statval = call_qcsapi_wifi_set_chan_pri_inactive( p_calling_bundle, argc, argv ); + break; + case e_qcsapi_wifi_set_chan_disabled: + statval = call_qcsapi_wifi_set_chan_disabled( p_calling_bundle, argc, argv ); + break; + case e_qcsapi_wifi_get_chan_disabled: + statval = call_qcsapi_wifi_get_chan_disabled( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wifi_get_tx_power: + statval = call_qcsapi_wifi_get_tx_power( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wifi_set_tx_power: + statval = call_qcsapi_wifi_set_tx_power( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wifi_get_tx_power_ext: + statval = call_qcsapi_wifi_get_tx_power_ext( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wifi_set_tx_power_ext: + statval = call_qcsapi_wifi_set_tx_power_ext( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wifi_get_chan_power_table: + statval = call_qcsapi_wifi_get_chan_power_table( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wifi_set_chan_power_table: + statval = call_qcsapi_wifi_set_chan_power_table( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wifi_get_bw_power: + statval = call_qcsapi_wifi_get_bw_power( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wifi_set_bw_power: + statval = call_qcsapi_wifi_set_bw_power( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wifi_get_bf_power: + statval = call_qcsapi_wifi_get_bf_power( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wifi_set_bf_power: + statval = call_qcsapi_wifi_set_bf_power( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wifi_get_power_selection: + statval = call_qcsapi_wifi_get_power_selection( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wifi_set_power_selection: + statval = call_qcsapi_wifi_set_power_selection( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wifi_get_carrier_interference: + statval = call_qcsapi_wifi_get_carrier_interference( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wifi_get_congestion_idx: + statval = call_qcsapi_wifi_get_congestion_idx( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wifi_get_supported_tx_power_levels: + statval = call_qcsapi_wifi_get_supported_tx_power_levels( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wifi_get_current_tx_power_level: + statval = call_qcsapi_wifi_get_current_tx_power_level( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wifi_set_power_constraint: + statval = call_qcsapi_wifi_set_power_constraint( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wifi_get_power_constraint: + statval = call_qcsapi_wifi_get_power_constraint( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wifi_set_tpc_interval: + statval = call_qcsapi_wifi_set_tpc_interval( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wifi_get_tpc_interval: + statval = call_qcsapi_wifi_get_tpc_interval( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wifi_get_assoc_records: + statval = call_qcsapi_wifi_get_assoc_records(p_calling_bundle, argc, argv); + break; + + case e_qcsapi_wifi_get_list_DFS_channels: + statval = call_qcsapi_wifi_get_list_DFS_channels( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wifi_is_channel_DFS: + statval = call_qcsapi_wifi_is_channel_DFS( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wifi_get_DFS_alt_channel: + statval = call_qcsapi_wifi_get_DFS_alt_channel( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wifi_set_DFS_alt_channel: + statval = call_qcsapi_wifi_set_DFS_alt_channel( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wifi_set_DFS_reentry: + statval = call_qcsapi_wifi_set_dfs_reentry( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wifi_get_scs_cce_channels: + statval = call_qcsapi_wifi_get_scs_cce_channels( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wifi_get_dfs_cce_channels: + statval = call_qcsapi_wifi_get_dfs_cce_channels( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wifi_get_csw_records: + statval = call_qcsapi_wifi_get_csw_records( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wifi_get_radar_status: + statval = call_qcsapi_wifi_get_radar_status( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wifi_get_WEP_encryption_level: + statval = call_qcsapi_wifi_get_WEP_encryption_level( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wifi_get_WPA_encryption_modes: + statval = call_qcsapi_wifi_get_WPA_encryption_modes( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wifi_set_WPA_encryption_modes: + statval = call_qcsapi_wifi_set_WPA_encryption_modes( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wifi_get_WPA_authentication_mode: + statval = call_qcsapi_wifi_get_WPA_authentication_mode( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wifi_set_WPA_authentication_mode: + statval = call_qcsapi_wifi_set_WPA_authentication_mode( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wifi_get_interworking: + statval = call_qcsapi_wifi_get_interworking( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wifi_set_interworking: + statval = call_qcsapi_wifi_set_interworking( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wifi_get_80211u_params: + statval = call_qcsapi_wifi_get_80211u_params( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wifi_set_80211u_params: + statval = call_qcsapi_wifi_set_80211u_params( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_security_get_nai_realms: + statval = call_qcsapi_security_get_nai_realms( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_security_add_nai_realm: + statval = call_qcsapi_security_add_nai_realm( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_security_del_nai_realm: + statval = call_qcsapi_security_del_nai_realm( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_security_add_roaming_consortium: + statval = call_qcsapi_security_add_roaming_consortium( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_security_del_roaming_consortium: + statval = call_qcsapi_security_del_roaming_consortium( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_security_get_roaming_consortium: + statval = call_qcsapi_security_get_roaming_consortium( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_security_get_venue_name: + statval = call_qcsapi_security_get_venue_name( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_security_add_venue_name: + statval = call_qcsapi_security_add_venue_name( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_security_del_venue_name: + statval = call_qcsapi_security_del_venue_name( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_security_get_oper_friendly_name: + statval = call_qcsapi_security_get_oper_friendly_name( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_security_add_oper_friendly_name: + statval = call_qcsapi_security_add_oper_friendly_name( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_security_del_oper_friendly_name: + statval = call_qcsapi_security_del_oper_friendly_name( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_security_get_hs20_conn_capab: + statval = call_qcsapi_security_get_hs20_conn_capab( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_security_add_hs20_conn_capab: + statval = call_qcsapi_security_add_hs20_conn_capab( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_security_del_hs20_conn_capab: + statval = call_qcsapi_security_del_hs20_conn_capab( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wifi_get_hs20_status: + statval = call_qcsapi_wifi_get_hs20_status( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wifi_set_hs20_status: + statval = call_qcsapi_wifi_set_hs20_status( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wifi_get_hs20_params: + statval = call_qcsapi_wifi_get_hs20_params( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wifi_set_hs20_params: + statval = call_qcsapi_wifi_set_hs20_params( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_remove_11u_param: + statval = call_qcsapi_remove_11u_param( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_remove_hs20_param: + statval = call_qcsapi_remove_hs20_param( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wifi_set_proxy_arp: + statval = call_qcsapi_wifi_set_proxy_arp( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wifi_get_proxy_arp: + statval = call_qcsapi_wifi_get_proxy_arp( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wifi_get_l2_ext_filter: + statval = call_qcsapi_wifi_get_l2_ext_filter( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wifi_set_l2_ext_filter: + statval = call_qcsapi_wifi_set_l2_ext_filter( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wifi_get_IEEE11i_encryption_modes: + statval = call_qcsapi_wifi_get_IEEE11i_encryption_modes( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wifi_set_IEEE11i_encryption_modes: + statval = call_qcsapi_wifi_set_IEEE11i_encryption_modes( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wifi_get_IEEE11i_authentication_mode: + statval = call_qcsapi_wifi_get_IEEE11i_authentication_mode( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wifi_set_IEEE11i_authentication_mode: + statval = call_qcsapi_wifi_set_IEEE11i_authentication_mode( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wifi_get_michael_errcnt: + statval = call_qcsapi_wifi_get_michael_errcnt( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wifi_get_pre_shared_key: + statval = call_qcsapi_wifi_get_pre_shared_key( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wifi_set_pre_shared_key: + statval = call_qcsapi_wifi_set_pre_shared_key( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wifi_get_psk_auth_failures: + statval = call_qcsapi_wifi_get_psk_auth_failures( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wifi_get_key_passphrase: + statval = call_qcsapi_wifi_get_key_passphrase( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wifi_set_key_passphrase: + statval = call_qcsapi_wifi_set_key_passphrase( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wifi_get_group_key_interval: + statval = call_qcsapi_wifi_get_group_key_interval( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wifi_set_group_key_interval: + statval = call_qcsapi_wifi_set_group_key_interval( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wifi_get_pmf: + statval = call_qcsapi_wifi_get_pmf( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wifi_set_pmf: + statval = call_qcsapi_wifi_set_pmf( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_SSID_get_wps_SSID: + statval = call_qcsapi_SSID_get_wps_SSID( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wifi_vlan_config: + statval = call_qcsapi_wifi_vlan_config( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wifi_show_vlan_config: + statval = call_qcsapi_wifi_show_vlan_config( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_enable_vlan_pass_through: + statval = call_qcsapi_enable_wlan_pass_through( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_br_vlan_promisc: + statval = call_qcsapi_enable_vlan_promisc( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_add_ipff: + statval = call_qcsapi_set_ipff( p_calling_bundle, 1, argc, argv ); + break; + + case e_qcsapi_del_ipff: + statval = call_qcsapi_set_ipff( p_calling_bundle, 0, argc, argv ); + break; + + case e_qcsapi_get_ipff: + statval = call_qcsapi_get_ipff( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wifi_get_rts_threshold: + statval = call_qcsapi_wifi_get_rts_threshold( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wifi_set_rts_threshold: + statval = call_qcsapi_wifi_set_rts_threshold( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wifi_get_mac_address_filtering: + statval = call_qcsapi_wifi_get_mac_address_filtering( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wifi_set_mac_address_filtering: + statval = call_qcsapi_wifi_set_mac_address_filtering( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wifi_is_mac_address_authorized: + statval = call_qcsapi_wifi_is_mac_address_authorized( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wifi_get_authorized_mac_addresses: + statval = call_qcsapi_wifi_get_authorized_mac_addresses( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wifi_get_denied_mac_addresses: + statval = call_qcsapi_wifi_get_denied_mac_addresses( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wifi_authorize_mac_address: + statval = call_qcsapi_wifi_authorize_mac_address( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wifi_deny_mac_address: + statval = call_qcsapi_wifi_deny_mac_address( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wifi_remove_mac_address: + statval = call_qcsapi_wifi_remove_mac_address( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wifi_clear_mac_address_filters: + statval = call_qcsapi_wifi_clear_mac_address_filters( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wifi_set_mac_address_reserve: + statval = call_qcsapi_wifi_set_mac_address_reserve( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wifi_get_mac_address_reserve: + statval = call_qcsapi_wifi_get_mac_address_reserve( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wifi_clear_mac_address_reserve: + statval = call_qcsapi_wifi_clear_mac_address_reserve( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wifi_backoff_fail_max: + statval = call_qcsapi_wifi_backoff_fail_max( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wifi_backoff_timeout: + statval = call_qcsapi_wifi_backoff_timeout( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wps_registrar_report_button_press: + statval = call_qcsapi_wps_registrar_report_button_press( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wps_registrar_report_pin: + statval = call_qcsapi_wps_registrar_report_pin( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wps_registrar_get_pp_devname: + statval = call_qcsapi_wps_registrar_get_pp_devname( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wps_registrar_set_pp_devname: + statval = call_qcsapi_wps_registrar_set_pp_devname( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wps_enrollee_report_button_press: + statval = call_qcsapi_wps_enrollee_report_button_press( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wps_enrollee_report_pin: + statval = call_qcsapi_wps_enrollee_report_pin( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wps_enrollee_generate_pin: + statval = call_qcsapi_wps_enrollee_generate_pin( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wps_get_sta_pin: + statval = call_qcsapi_wps_generate_random_pin( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wps_get_ap_pin: + statval = call_qcsapi_wps_get_ap_pin( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wps_set_ap_pin: + statval = call_qcsapi_wps_set_ap_pin( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wps_save_ap_pin: + statval = call_qcsapi_wps_save_ap_pin( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wps_enable_ap_pin: + statval = call_qcsapi_wps_enable_ap_pin( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wps_get_state: + statval = call_qcsapi_wps_get_state( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wps_get_configured_state: + statval = call_qcsapi_wps_get_configured_state( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wps_set_configured_state: + statval = call_qcsapi_wps_set_configured_state( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wps_get_runtime_state: + statval = call_qcsapi_wps_get_runtime_state( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wps_allow_pbc_overlap: + statval = call_qcsapi_wps_allow_pbc_overlap( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wps_get_allow_pbc_overlap_status: + statval = call_qcsapi_wps_get_allow_pbc_overlap_status( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wps_get_param: + statval = call_qcsapi_wps_get_param( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wps_set_param: + statval = call_qcsapi_wps_set_param( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wps_set_access_control: + statval = call_qcsapi_wps_set_access_control( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wps_get_access_control: + statval = call_qcsapi_wps_get_access_control( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_non_wps_set_pp_enable: + statval = call_qcsapi_non_wps_set_pp_enable( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_non_wps_get_pp_enable: + statval = call_qcsapi_non_wps_get_pp_enable( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wps_cancel: + statval = call_qcsapi_wps_cancel(p_calling_bundle, argc, argv); + break; + + case e_qcsapi_wps_set_pbc_in_srcm: + statval = call_qcsapi_wps_set_pbc_in_srcm(p_calling_bundle, argc, argv); + break; + + case e_qcsapi_wps_get_pbc_in_srcm: + statval = call_qcsapi_wps_get_pbc_in_srcm(p_calling_bundle, argc, argv); + break; + + case e_qcsapi_wps_timeout: + statval = call_qcsapi_wps_set_timeout(p_calling_bundle, argc, argv); + break; + + case e_qcsapi_wps_on_hidden_ssid: + statval = call_qcsapi_wps_on_hidden_ssid(p_calling_bundle, argc, argv); + break; + + case e_qcsapi_wps_on_hidden_ssid_status: + statval = call_qcsapi_wps_on_hidden_ssid_status(p_calling_bundle, argc, argv); + break; + + case e_qcsapi_wps_upnp_enable: + statval = call_qcsapi_wps_upnp_enable(p_calling_bundle, argc, argv); + break; + + case e_qcsapi_wps_upnp_status: + statval = call_qcsapi_wps_upnp_status(p_calling_bundle, argc, argv); + break; + + case e_qcsapi_wps_registrar_set_dfl_pbc_bss: + statval = call_qcsapi_wps_registrar_set_dfl_pbc_bss( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wps_registrar_get_dfl_pbc_bss: + statval = call_qcsapi_wps_registrar_get_dfl_pbc_bss( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wifi_get_wpa_status: + statval = call_qcsapi_wifi_get_wpa_status( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wifi_get_auth_state: + statval = call_qcsapi_wifi_get_auth_state( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wifi_get_disconn_info: + statval = call_qcsapi_wifi_get_disconn_info( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wifi_reset_disconn_info: + statval = call_qcsapi_wifi_reset_disconn_info( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wifi_set_dwell_times: + statval = call_qcsapi_wifi_set_dwell_times( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wifi_get_dwell_times: + statval = call_qcsapi_wifi_get_dwell_times( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wifi_set_bgscan_dwell_times: + statval = call_qcsapi_wifi_set_bgscan_dwell_times( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wifi_get_bgscan_dwell_times: + statval = call_qcsapi_wifi_get_bgscan_dwell_times( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wifi_get_count_associations: + statval = call_qcsapi_wifi_get_count_associations( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wifi_get_associated_device_mac_addr: + statval = call_qcsapi_wifi_get_associated_device_mac_addr( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wifi_get_associated_device_ip_addr: + statval = call_qcsapi_wifi_get_associated_device_ip_addr(p_calling_bundle, argc, argv); + break; + + case e_qcsapi_wifi_get_link_quality: + statval = call_qcsapi_wifi_get_link_quality( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wifi_get_rssi_per_association: + statval = call_qcsapi_wifi_get_rssi_per_association( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wifi_get_rssi_in_dbm_per_association: + statval = call_qcsapi_wifi_get_rssi_in_dbm_per_association( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wifi_get_snr_per_association: + statval = call_qcsapi_wifi_get_snr_per_association( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wifi_get_hw_noise_per_association: + statval = call_qcsapi_wifi_get_hw_noise_per_association( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wifi_get_rx_bytes_per_association: + statval = call_qcsapi_wifi_get_rx_bytes_per_association( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wifi_get_tx_bytes_per_association: + statval = call_qcsapi_wifi_get_tx_bytes_per_association( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wifi_get_rx_packets_per_association: + statval = call_qcsapi_wifi_get_rx_packets_per_association( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wifi_get_tx_packets_per_association: + statval = call_qcsapi_wifi_get_tx_packets_per_association( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wifi_get_tx_err_packets_per_association: + statval = call_qcsapi_wifi_get_tx_err_packets_per_association( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wifi_get_bw_per_association: + statval = call_qcsapi_wifi_get_bw_per_association( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wifi_get_tx_phy_rate_per_association: + call_qcsapi_wifi_get_tx_phy_rate_per_association(p_calling_bundle, argc, argv); + break; + + case e_qcsapi_wifi_get_rx_phy_rate_per_association: + call_qcsapi_wifi_get_rx_phy_rate_per_association(p_calling_bundle, argc, argv); + break; + + case e_qcsapi_wifi_get_tx_mcs_per_association: + call_qcsapi_wifi_get_tx_mcs_per_association(p_calling_bundle, argc, argv); + break; + + case e_qcsapi_wifi_get_rx_mcs_per_association: + call_qcsapi_wifi_get_rx_mcs_per_association(p_calling_bundle, argc, argv); + break; + + case e_qcsapi_wifi_get_achievable_tx_phy_rate_per_association: + call_qcsapi_wifi_get_achievable_tx_phy_rate_per_association( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wifi_get_achievable_rx_phy_rate_per_association: + call_qcsapi_wifi_get_achievable_rx_phy_rate_per_association( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wifi_get_auth_enc_per_association: + call_qcsapi_wifi_get_auth_enc_per_association( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wifi_get_tput_caps: + call_qcsapi_wifi_get_tput_caps(p_calling_bundle, argc, argv); + break; + + case e_qcsapi_wifi_get_connection_mode: + call_qcsapi_wifi_get_connection_mode(p_calling_bundle, argc, argv); + break; + + case e_qcsapi_wifi_get_vendor_per_association: + call_qcsapi_wifi_get_vendor_per_association( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wifi_get_max_mimo: + call_qcsapi_wifi_get_max_mimo( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wifi_get_node_counter: + statval = call_qcsapi_wifi_get_node_counter(p_calling_bundle, argc, argv); + break; + + case e_qcsapi_wifi_get_node_param: + statval = call_qcsapi_wifi_get_node_param(p_calling_bundle, argc, argv); + break; + + case e_qcsapi_wifi_get_node_stats: + statval = call_qcsapi_wifi_get_node_stats(p_calling_bundle, argc, argv); + break; + + case e_qcsapi_wifi_get_max_queued: + statval = call_qcsapi_wifi_get_max_queued(p_calling_bundle, argc, argv); + break; + + case e_qcsapi_wifi_disassociate: + statval = call_qcsapi_wifi_disassociate(p_calling_bundle, argc, argv); + break; + + case e_qcsapi_wifi_disassociate_sta: + statval = call_qcsapi_wifi_disassociate_sta(p_calling_bundle, argc, argv); + break; + + case e_qcsapi_wifi_reassociate: + statval = call_qcsapi_wifi_reassociate(p_calling_bundle, argc, argv); + break; + + case e_qcsapi_wifi_associate: + statval = call_qcsapi_wifi_associate(p_calling_bundle, argc, argv); + break; + + case e_qcsapi_SSID_create_SSID: + statval = call_qcsapi_SSID_create_SSID( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_SSID_remove_SSID: + statval = call_qcsapi_SSID_remove_SSID( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_SSID_verify_SSID: + statval = call_qcsapi_SSID_verify_SSID( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_SSID_rename_SSID: + statval = call_qcsapi_SSID_rename_SSID( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_SSID_get_SSID_list: + statval = call_qcsapi_SSID_get_SSID_list( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_SSID_get_protocol: + statval = call_qcsapi_SSID_get_protocol( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_SSID_get_encryption_modes: + statval = call_qcsapi_SSID_get_encryption_modes( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_SSID_get_group_encryption: + statval = call_qcsapi_SSID_get_group_encryption( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_SSID_get_authentication_mode: + statval = call_qcsapi_SSID_get_authentication_mode( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_SSID_set_protocol: + statval = call_qcsapi_SSID_set_protocol( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_SSID_set_encryption_modes: + statval = call_qcsapi_SSID_set_encryption_modes( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_SSID_set_group_encryption: + statval = call_qcsapi_SSID_set_group_encryption( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_SSID_set_authentication_mode: + statval = call_qcsapi_SSID_set_authentication_mode( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_SSID_get_pre_shared_key: + statval = call_qcsapi_SSID_get_pre_shared_key( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_SSID_set_pre_shared_key: + statval = call_qcsapi_SSID_set_pre_shared_key( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wifi_add_radius_auth_server_cfg: + statval = call_qcsapi_wifi_add_radius_auth_server_cfg( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wifi_del_radius_auth_server_cfg: + statval = call_qcsapi_wifi_del_radius_auth_server_cfg( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wifi_get_radius_auth_server_cfg: + statval = call_qcsapi_wifi_get_radius_auth_server_cfg( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wifi_set_own_ip_addr: + statval = call_qcsapi_wifi_set_own_ip_addr( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_SSID_get_key_passphrase: + statval = call_qcsapi_SSID_get_key_passphrase( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_SSID_set_key_passphrase: + statval = call_qcsapi_SSID_set_key_passphrase( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_SSID_get_pmf: + statval = call_qcsapi_SSID_get_pmf( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_SSID_set_pmf: + statval = call_qcsapi_SSID_set_pmf( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wifi_start_scan: + statval = call_qcsapi_wifi_start_scan(p_calling_bundle, argc, argv); + break; + + case e_qcsapi_wifi_cancel_scan: + statval = call_qcsapi_wifi_cancel_scan(p_calling_bundle, argc, argv); + break; + + case e_qcsapi_wifi_get_scan_status: + statval = call_qcsapi_wifi_get_scan_status(p_calling_bundle, argc, argv); + break; + + case e_qcsapi_wifi_get_cac_status: + statval = call_qcsapi_wifi_get_cac_status(p_calling_bundle, argc, argv); + break; + + case e_qcsapi_wifi_wait_scan_completes: + statval = call_qcsapi_wifi_wait_scan_completes(p_calling_bundle, argc, argv); + break; + + case e_qcsapi_wifi_set_scan_chk_inv: + statval = call_qcsapi_wifi_set_scan_chk_inv(p_calling_bundle, argc, argv); + + break; + + case e_qcsapi_wifi_get_scan_chk_inv: + statval = call_qcsapi_wifi_get_scan_chk_inv(p_calling_bundle, argc, argv); + + break; + + case e_qcsapi_wifi_start_cca: + statval = call_qcsapi_wifi_start_cca(p_calling_bundle, argc, argv); + break; + + case e_qcsapi_wifi_disable_wps: + statval = call_qcsapi_wifi_disable_wps(p_calling_bundle, argc, argv); + break; + + case e_qcsapi_wifi_get_results_AP_scan: + statval = call_qcsapi_wifi_get_results_AP_scan( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wifi_get_count_APs_scanned: + statval = call_qcsapi_wifi_get_count_APs_scanned( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wifi_get_properties_AP: + statval = call_qcsapi_wifi_get_properties_AP( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wifi_get_mcs_rate: + statval = call_qcsapi_wifi_get_mcs_rate( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wifi_set_mcs_rate: + statval = call_qcsapi_wifi_set_mcs_rate( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wifi_get_time_associated_per_association: + statval = call_qcsapi_wifi_get_time_associated_per_association( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wifi_wds_add_peer: + statval = call_qcsapi_wifi_wds_add_peer( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wifi_wds_remove_peer: + statval = call_qcsapi_wifi_wds_remove_peer( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wifi_wds_get_peer_address: + statval = call_qcsapi_wifi_wds_get_peer_address( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wifi_wds_set_psk: + statval = call_qcsapi_wifi_wds_set_psk( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wifi_wds_set_mode: + statval = call_qcsapi_wifi_wds_set_mode( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wifi_wds_get_mode: + statval = call_qcsapi_wifi_wds_get_mode( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wifi_qos_get_param: + statval = call_qcsapi_wifi_qos_get_param( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wifi_qos_set_param: + statval = call_qcsapi_wifi_qos_set_param( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wifi_get_wmm_ac_map: + statval = call_qcsapi_wifi_get_wmm_ac_map( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wifi_set_wmm_ac_map: + statval = call_qcsapi_wifi_set_wmm_ac_map( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wifi_get_dscp_8021p_map: + statval = call_qcsapi_wifi_get_dscp_8021p_map( p_calling_bundle, argc, argv ); + break; + case e_qcsapi_wifi_set_dscp_8021p_map: + statval = call_qcsapi_wifi_set_dscp_8021p_map( p_calling_bundle, argc, argv ); + break; + case e_qcsapi_wifi_get_dscp_ac_map: + statval = call_qcsapi_wifi_get_dscp_ac_map( p_calling_bundle, argc, argv ); + break; + case e_qcsapi_wifi_set_dscp_ac_map: + statval = call_qcsapi_wifi_set_dscp_ac_map( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wifi_get_priority: + statval = call_qcsapi_wifi_get_priority( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wifi_set_priority: + statval = call_qcsapi_wifi_set_priority( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wifi_get_airfair: + statval = call_qcsapi_wifi_get_airfair( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wifi_set_airfair: + statval = call_qcsapi_wifi_set_airfair( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_config_get_parameter: + statval = call_qcsapi_config_get_parameter( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_config_update_parameter: + statval = call_qcsapi_config_update_parameter( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_config_get_ssid_parameter: + statval = call_qcsapi_config_get_ssid_parameter( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_config_update_ssid_parameter: + statval = call_qcsapi_config_update_ssid_parameter( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_service_control: + statval = call_qcsapi_service_control(p_calling_bundle, argc, argv); + break; + + case e_qcsapi_wfa_cert: + statval = call_qcsapi_wfa_cert(p_calling_bundle, argc, argv); + break; + + case e_qcsapi_wifi_enable_scs: + statval = call_qcsapi_wifi_scs_enable(p_calling_bundle, argc, argv); + break; + + case e_qcsapi_wifi_scs_switch_channel: + statval = call_qcsapi_wifi_scs_switch_channel(p_calling_bundle, argc, argv); + break; + + case e_qcsapi_wifi_set_scs_verbose: + statval = call_qcsapi_wifi_set_scs_verbose(p_calling_bundle, argc, argv); + break; + + case e_qcsapi_wifi_get_scs_status: + statval = call_qcsapi_wifi_get_scs_status(p_calling_bundle, argc, argv); + break; + + case e_qcsapi_wifi_set_scs_smpl_enable: + statval = call_qcsapi_wifi_set_scs_smpl_enable(p_calling_bundle, argc, argv); + break; + + case e_qcsapi_wifi_set_scs_smpl_dwell_time: + statval = call_qcsapi_wifi_set_scs_smpl_dwell_time(p_calling_bundle, argc, argv); + break; + + case e_qcsapi_wifi_set_scs_smpl_intv: + statval = call_qcsapi_wifi_set_scs_sample_intv(p_calling_bundle, argc, argv); + break; + + case e_qcsapi_wifi_set_scs_intf_detect_intv: + statval = call_qcsapi_wifi_set_scs_intf_detect_intv(p_calling_bundle, argc, argv); + break; + + case e_qcsapi_wifi_set_scs_thrshld: + statval = call_qcsapi_wifi_set_scs_thrshld(p_calling_bundle, argc, argv); + break; + + case e_qcsapi_wifi_set_scs_report_only: + statval = call_qcsapi_wifi_set_scs_report_only(p_calling_bundle, argc, argv); + break; + + case e_qcsapi_wifi_get_scs_report_stat: + statval = call_qcsapi_wifi_get_scs_report(p_calling_bundle, argc, argv); + break; + + case e_qcsapi_wifi_set_scs_cca_intf_smth_fctr: + statval = call_qcsapi_wifi_set_scs_cca_intf_smth_fctr(p_calling_bundle, argc, argv); + break; + + case e_qcsapi_wifi_set_scs_chan_mtrc_mrgn: + statval = call_qcsapi_wifi_set_scs_chan_mtrc_mrgn(p_calling_bundle, argc, argv); + break; + + case e_qcsapi_wifi_get_scs_dfs_reentry_request: + statval = call_qcsapi_wifi_get_scs_dfs_reentry_request(p_calling_bundle, argc, argv); + break; + + case e_qcsapi_wifi_get_scs_cca_intf: + statval = call_qcsapi_wifi_get_scs_cca_intf( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wifi_get_scs_param: + statval = call_qcsapi_wifi_get_scs_param(p_calling_bundle, argc, argv); + break; + + case e_qcsapi_wifi_set_scs_stats: + statval = call_qcsapi_wifi_set_scs_stats(p_calling_bundle, argc, argv); + break; + + case e_qcsapi_wifi_start_ocac: + statval = call_qcsapi_wifi_start_ocac(p_calling_bundle, argc, argv); + break; + + case e_qcsapi_wifi_stop_ocac: + statval = call_qcsapi_wifi_stop_ocac(p_calling_bundle, argc, argv); + break; + + case e_qcsapi_wifi_get_ocac_status: + statval = call_qcsapi_wifi_get_ocac_status(p_calling_bundle, argc, argv); + break; + + case e_qcsapi_wifi_set_ocac_threshold: + statval = call_qcsapi_wifi_set_ocac_threshold(p_calling_bundle, argc, argv); + break; + + case e_qcsapi_wifi_set_ocac_dwell_time: + statval = call_qcsapi_wifi_set_ocac_dwell_time(p_calling_bundle, argc, argv); + break; + + case e_qcsapi_wifi_set_ocac_duration: + statval = call_qcsapi_wifi_set_ocac_duration(p_calling_bundle, argc, argv); + break; + + case e_qcsapi_wifi_set_ocac_cac_time: + statval = call_qcsapi_wifi_set_ocac_cac_time(p_calling_bundle, argc, argv); + break; + + case e_qcsapi_wifi_set_ocac_report_only: + statval = call_qcsapi_wifi_set_ocac_report_only(p_calling_bundle, argc, argv); + break; + + case e_qcsapi_wifi_start_dfs_s_radio: + statval = call_qcsapi_wifi_start_dfs_s_radio(p_calling_bundle, argc, argv); + break; + + case e_qcsapi_wifi_stop_dfs_s_radio: + statval = call_qcsapi_wifi_stop_dfs_s_radio(p_calling_bundle, argc, argv); + break; + + case e_qcsapi_wifi_get_dfs_s_radio_status: + statval = call_qcsapi_wifi_get_dfs_s_radio_status(p_calling_bundle, argc, argv); + break; + + case e_qcsapi_wifi_get_dfs_s_radio_availability: + statval = call_qcsapi_wifi_get_dfs_s_radio_availability(p_calling_bundle, argc, argv); + break; + + case e_qcsapi_wifi_set_dfs_s_radio_threshold: + statval = call_qcsapi_wifi_set_dfs_s_radio_threshold(p_calling_bundle, argc, argv); + break; + + case e_qcsapi_wifi_set_dfs_s_radio_dwell_time: + statval = call_qcsapi_wifi_set_dfs_s_radio_dwell_time(p_calling_bundle, argc, argv); + break; + + case e_qcsapi_wifi_set_dfs_s_radio_duration: + statval = call_qcsapi_wifi_set_dfs_s_radio_duration(p_calling_bundle, argc, argv); + break; + + case e_qcsapi_wifi_set_dfs_s_radio_cac_time: + statval = call_qcsapi_wifi_set_dfs_s_radio_cac_time(p_calling_bundle, argc, argv); + break; + + case e_qcsapi_wifi_set_dfs_s_radio_report_only: + statval = call_qcsapi_wifi_set_dfs_s_radio_report_only(p_calling_bundle, argc, argv); + break; + + case e_qcsapi_wifi_set_dfs_s_radio_wea_duration: + statval = call_qcsapi_wifi_set_dfs_s_radio_wea_duration(p_calling_bundle, argc, argv); + break; + + case e_qcsapi_wifi_set_dfs_s_radio_wea_cac_time: + statval = call_qcsapi_wifi_set_dfs_s_radio_wea_cac_time(p_calling_bundle, argc, argv); + break; + + case e_qcsapi_wifi_set_vendor_fix: + statval = call_qcsapi_wifi_set_vendor_fix( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wifi_set_ap_isolate: + statval = call_qcsapi_wifi_set_ap_isolate(p_calling_bundle, argc, argv); + break; + case e_qcsapi_wifi_get_ap_isolate: + statval = call_qcsapi_wifi_get_ap_isolate(p_calling_bundle, argc, argv); + break; + + case e_qcsapi_power_save: + statval = call_qcsapi_pm_get_set_mode(p_calling_bundle, argc, argv); + break; + + case e_qcsapi_qpm_level: + statval = call_qcsapi_qpm_get_level(p_calling_bundle, argc, argv); + break; + + case e_qcsapi_get_interface_stats: + statval = call_qcsapi_get_interface_stats( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_get_phy_stats: + statval = call_qcsapi_get_phy_stats( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_bootcfg_get_parameter: + statval = call_qcsapi_bootcfg_get_parameter( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_bootcfg_update_parameter: + statval = call_qcsapi_bootcfg_update_parameter( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_bootcfg_commit: + statval = call_qcsapi_bootcfg_commit( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_telnet_enable: + statval = call_qcsapi_telnet_enable( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_restore_default_config: + statval = call_qcsapi_restore_default_config( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_reset_all_stats: + statval = call_qcsapi_reset_all_counters( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_run_script: + statval = call_qcsapi_run_script( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_qtm: + statval = call_qcsapi_vsp( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wifi_get_pairing_id: + statval = call_qcsapi_wifi_get_pairing_id( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wifi_set_pairing_id: + statval = call_qcsapi_wifi_set_pairing_id( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wifi_get_pairing_enable: + statval = call_qcsapi_wifi_get_pairing_enable( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wifi_set_pairing_enable: + statval = call_qcsapi_wifi_set_pairing_enable( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wifi_set_txqos_sched_tbl: + statval = call_qcsapi_wifi_set_txqos_sched_tbl( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_wifi_get_txqos_sched_tbl: + statval = call_qcsapi_wifi_get_txqos_sched_tbl( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_eth_phy_power_off: + statval = call_qcsapi_eth_phy_power_off( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_aspm_l1: + statval = call_qcsapi_set_aspm_l1( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_l1: + statval = call_qcsapi_set_l1( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_test_traffic: + statval = call_qcsapi_test_traffic( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_get_temperature: + statval = call_qcsapi_get_temperature( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_set_accept_oui_filter: + statval = call_qcsapi_set_accept_oui_filter( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_get_accept_oui_filter: + statval = call_qcsapi_get_accept_oui_filter( p_calling_bundle, argc, argv ); + break; + + case e_qcsapi_get_swfeat_list: + statval = call_qcsapi_get_swfeat_list( p_calling_bundle, argc, argv); + break; + + case e_qcsapi_wifi_set_vht: + statval = call_qcsapi_wifi_set_vht( p_calling_bundle, argc, argv); + break; + + case e_qcsapi_wifi_get_vht: + statval = call_qcsapi_wifi_get_vht( p_calling_bundle, argc, argv); + break; + + case e_qcsapi_calcmd_set_test_mode: + statval = call_qcsapi_calcmd_set_test_mode(p_calling_bundle, argc, argv); + break; + + case e_qcsapi_calcmd_show_test_packet: + statval = call_qcsapi_calcmd_show_test_packet(p_calling_bundle, argc, argv); + break; + + case e_qcsapi_calcmd_send_test_packet: + statval = call_qcsapi_calcmd_send_test_packet(p_calling_bundle, argc, argv); + break; + + case e_qcsapi_calcmd_stop_test_packet: + statval = call_qcsapi_calcmd_stop_test_packet(p_calling_bundle, argc, argv); + break; + + case e_qcsapi_calcmd_send_dc_cw_signal: + statval = call_qcsapi_calcmd_send_dc_cw_signal(p_calling_bundle, argc, argv); + break; + + case e_qcsapi_calcmd_stop_dc_cw_signal: + statval = call_qcsapi_calcmd_stop_dc_cw_signal(p_calling_bundle, argc, argv); + break; + + case e_qcsapi_calcmd_get_test_mode_antenna_sel: + statval = call_qcsapi_calcmd_get_test_mode_antenna_sel(p_calling_bundle, argc, argv); + break; + + case e_qcsapi_calcmd_get_test_mode_mcs: + statval = call_qcsapi_calcmd_get_test_mode_mcs(p_calling_bundle, argc, argv); + break; + + case e_qcsapi_calcmd_get_test_mode_bw: + statval = call_qcsapi_calcmd_get_test_mode_bw(p_calling_bundle, argc, argv); + break; + + case e_qcsapi_calcmd_get_tx_power: + statval = call_qcsapi_calcmd_get_tx_power(p_calling_bundle, argc, argv); + break; + + case e_qcsapi_calcmd_set_tx_power: + statval = call_qcsapi_calcmd_set_tx_power(p_calling_bundle, argc, argv); + break; + + case e_qcsapi_calcmd_get_test_mode_rssi: + statval = call_qcsapi_calcmd_get_test_mode_rssi(p_calling_bundle, argc, argv); + break; + + case e_qcsapi_calcmd_set_mac_filter: + statval = call_qcsapi_calcmd_set_mac_filter(p_calling_bundle, argc, argv); + break; + + case e_qcsapi_calcmd_get_antenna_count: + statval = call_qcsapi_calcmd_get_antenna_count(p_calling_bundle, argc, argv); + break; + + case e_qcsapi_calcmd_clear_counter: + statval = call_qcsapi_calcmd_clear_counter(p_calling_bundle, argc, argv); + break; + + case e_qcsapi_calcmd_get_info: + statval = call_qcsapi_calcmd_get_info(p_calling_bundle, argc, argv); + break; + + case e_qcsapi_set_soc_macaddr: + statval = call_qcsapi_wifi_set_soc_macaddr(p_calling_bundle, argc, argv); + break; + + case e_qcsapi_wifi_enable_tdls: + statval = call_qcsapi_wifi_enable_tdls(p_calling_bundle, argc, argv); + break; + case e_qcsapi_wifi_enable_tdls_over_qhop: + statval = call_qcsapi_wifi_enable_tdls_over_qhop(p_calling_bundle, argc, argv); + break; + case e_qcsapi_wifi_disable_dfs_channels: + statval = call_qcsapi_disable_dfs_channels(p_calling_bundle, argc, argv); + break; + case e_qcsapi_wifi_get_tdls_status: + statval = call_qcsapi_wifi_get_tdls_status(p_calling_bundle, argc, argv); + break; + case e_qcsapi_wifi_set_tdls_params: + statval = call_qcsapi_wifi_set_tdls_params(p_calling_bundle, argc, argv); + break; + case e_qcsapi_wifi_get_tdls_params: + statval = call_qcsapi_wifi_get_tdls_params(p_calling_bundle, argc, argv); + break; + case e_qcsapi_get_carrier_id: + statval = call_qcsapi_get_carrier_id( p_calling_bundle, argc, argv ); + break; + case e_qcsapi_set_carrier_id: + statval = call_qcsapi_set_carrier_id( p_calling_bundle, argc, argv ); + break; + case e_qcsapi_get_spinor_jedecid: + statval = call_qcsapi_wifi_get_spinor_jedecid(p_calling_bundle, argc, argv); + break; + case e_qcsapi_get_custom_value: + statval = call_qcsapi_wifi_get_custom_value(p_calling_bundle, argc, argv); + break; + case e_qcsapi_wifi_tdls_operate: + statval = call_qcsapi_wifi_tdls_operate(p_calling_bundle, argc, argv); + break; + case e_qcsapi_wifi_get_mlme_stats_per_mac: + statval = call_qcsapi_wifi_get_mlme_stats_per_mac(p_calling_bundle, argc, argv); + break; + case e_qcsapi_wifi_get_mlme_stats_per_association: + statval = call_qcsapi_wifi_get_mlme_stats_per_association(p_calling_bundle, argc, argv); + break; + case e_qcsapi_wifi_get_mlme_stats_macs_list: + statval = call_qcsapi_wifi_get_mlme_stats_macs_list(p_calling_bundle, argc, argv); + break; + case e_qcsapi_get_nss_cap: + statval = call_qcsapi_wifi_get_nss_cap(p_calling_bundle, argc, argv); + break; + case e_qcsapi_set_nss_cap: + statval = call_qcsapi_wifi_set_nss_cap(p_calling_bundle, argc, argv); + break; + case e_qcsapi_get_security_defer_mode: + statval = call_qcsapi_wifi_get_security_defer_mode(p_calling_bundle, argc, argv); + break; + case e_qcsapi_set_security_defer_mode: + statval = call_qcsapi_wifi_set_security_defer_mode(p_calling_bundle, argc, argv); + break; + case e_qcsapi_apply_security_config: + statval = call_qcsapi_wifi_apply_security_config(p_calling_bundle, argc, argv); + break; + case e_qcsapi_wifi_set_intra_bss_isolate: + statval = call_qcsapi_wifi_set_intra_bss_isolate(p_calling_bundle, argc, argv); + break; + case e_qcsapi_wifi_get_intra_bss_isolate: + statval = call_qcsapi_wifi_get_intra_bss_isolate(p_calling_bundle, argc, argv); + break; + case e_qcsapi_wifi_set_bss_isolate: + statval = call_qcsapi_wifi_set_bss_isolate(p_calling_bundle, argc, argv); + break; + case e_qcsapi_wifi_get_bss_isolate: + statval = call_qcsapi_wifi_get_bss_isolate(p_calling_bundle, argc, argv); + break; + case e_qcsapi_wowlan_host_state: + statval = call_qcsapi_wifi_host_state_set(p_calling_bundle, argc, argv); + break; + case e_qcsapi_wowlan_match_type: + statval = call_qcsapi_wifi_wowlan_match_type_set(p_calling_bundle, argc, argv); + break; + case e_qcsapi_wowlan_L2_type: + statval = call_qcsapi_wifi_wowlan_L2_type_set(p_calling_bundle, argc, argv); + break; + case e_qcsapi_wowlan_udp_port: + statval = call_qcsapi_wifi_wowlan_udp_port_set(p_calling_bundle, argc, argv); + break; + case e_qcsapi_wowlan_pattern: + statval = call_qcsapi_wifi_wowlan_pattern_set(p_calling_bundle, argc, argv); + break; + case e_qcsapi_wowlan_get_host_state: + statval = call_qcsapi_wifi_host_state_get(p_calling_bundle, argc, argv); + break; + case e_qcsapi_wowlan_get_match_type: + statval = call_qcsapi_wifi_wowlan_match_type_get(p_calling_bundle, argc, argv); + break; + case e_qcsapi_wowlan_get_L2_type: + statval = call_qcsapi_wifi_wowlan_L2_type_get(p_calling_bundle, argc, argv); + break; + case e_qcsapi_wowlan_get_udp_port: + statval = call_qcsapi_wifi_wowlan_udp_port_get(p_calling_bundle, argc, argv); + break; + case e_qcsapi_wowlan_get_pattern: + statval = call_qcsapi_wifi_wowlan_pattern_get(p_calling_bundle, argc, argv); + break; + case e_qcsapi_wifi_set_extender_params: + statval = call_qcsapi_wifi_set_extender_params(p_calling_bundle, + argc, argv); + break; + case e_qcsapi_wifi_get_extender_status: + statval = call_qcsapi_wifi_get_extender_status(p_calling_bundle, + argc, argv); + break; + case e_qcsapi_wifi_enable_bgscan: + statval = call_qcsapi_wifi_enable_bgscan(p_calling_bundle, + argc, argv); + break; + case e_qcsapi_wifi_get_bgscan_status: + statval = call_qcsapi_wifi_get_bgscan_status(p_calling_bundle, + argc, argv); + break; + case e_qcsapi_get_uboot_info: + statval = call_qcsapi_get_uboot_info(p_calling_bundle, argc, argv); + break; + case e_qcsapi_wifi_get_disassoc_reason: + statval = call_qcsapi_wifi_get_disassoc_reason(p_calling_bundle, argc, argv); + break; + case e_qcsapi_is_startprod_done: + statval = call_qcsapi_is_startprod_done(p_calling_bundle, argc, argv); + break; + case e_qcsapi_get_bb_param: + statval = call_qcsapi_wifi_get_bb_param(p_calling_bundle, argc, argv); + break; + case e_qcsapi_set_bb_param: + statval = call_qcsapi_wifi_set_bb_param(p_calling_bundle, argc, argv); + break; + case e_qcsapi_wifi_get_tx_amsdu: + statval = call_qcsapi_wifi_get_tx_amsdu(p_calling_bundle, argc, argv); + break; + case e_qcsapi_wifi_set_tx_amsdu: + statval = call_qcsapi_wifi_set_tx_amsdu(p_calling_bundle, argc, argv); + break; + case e_qcsapi_wifi_set_scan_buf_max_size: + statval = call_qcsapi_wifi_set_scan_buf_max_size(p_calling_bundle, argc, argv); + break; + case e_qcsapi_wifi_get_scan_buf_max_size: + statval = call_qcsapi_wifi_get_scan_buf_max_size(p_calling_bundle, argc, argv); + break; + case e_qcsapi_wifi_set_scan_table_max_len: + statval = call_qcsapi_wifi_set_scan_table_max_len(p_calling_bundle, argc, argv); + break; + case e_qcsapi_wifi_get_scan_table_max_len: + statval = call_qcsapi_wifi_get_scan_table_max_len(p_calling_bundle, argc, argv); + break; + case e_qcsapi_wifi_set_enable_mu: + statval = call_qcsapi_wifi_set_enable_mu(p_calling_bundle, argc, argv); + break; + case e_qcsapi_wifi_get_enable_mu: + statval = call_qcsapi_wifi_get_enable_mu(p_calling_bundle, argc, argv); + break; + case e_qcsapi_wifi_set_mu_use_precode: + statval = call_qcsapi_wifi_set_mu_use_precode(p_calling_bundle, argc, argv); + break; + case e_qcsapi_wifi_get_mu_use_precode: + statval = call_qcsapi_wifi_get_mu_use_precode(p_calling_bundle, argc, argv); + break; + case e_qcsapi_wifi_set_mu_use_eq: + statval = call_qcsapi_wifi_set_mu_use_eq(p_calling_bundle, argc, argv); + break; + case e_qcsapi_wifi_get_mu_use_eq: + statval = call_qcsapi_wifi_get_mu_use_eq(p_calling_bundle, argc, argv); + break; + case e_qcsapi_wifi_get_mu_groups: + statval = call_qcsapi_wifi_get_mu_groups(p_calling_bundle, argc, argv); + break; + case e_qcsapi_send_file: + statval = call_qcsapi_send_file(p_calling_bundle, argc, argv); + break; + case e_qcsapi_get_emac_switch: + statval = call_qcsapi_get_emac_switch(p_calling_bundle, argc, argv); + break; + case e_qcsapi_set_emac_switch: + statval = call_qcsapi_set_emac_switch(p_calling_bundle, argc, argv); + break; + case e_qcsapi_eth_dscp_map: + statval = call_qcsapi_eth_dscp_map(p_calling_bundle, argc, argv); + break; + case e_qcsapi_set_optim_stats: + statval = call_qcsapi_wifi_set_optim_stats(p_calling_bundle, argc, argv); + break; + case e_qcsapi_set_sys_time: + statval = call_qcsapi_set_sys_time(p_calling_bundle, argc, argv); + break; + case e_qcsapi_get_sys_time: + statval = call_qcsapi_get_sys_time(p_calling_bundle, argc, argv); + break; + case e_qcsapi_get_eth_info: + statval = call_qcsapi_get_eth_info(p_calling_bundle, argc, argv); + break; + case e_qcsapi_wifi_block_bss: + statval = call_qcsapi_wifi_block_bss(p_calling_bundle, argc, argv); + break; + case e_qcsapi_wifi_verify_repeater_mode: + statval = call_qcsapi_wifi_verify_repeater_mode(p_calling_bundle, argc, argv); + break; + case e_qcsapi_wifi_set_ap_interface_name: + statval = call_qcsapi_wifi_set_ap_interface_name(p_calling_bundle, argc, argv); + break; + case e_qcsapi_wifi_get_ap_interface_name: + statval = call_qcsapi_wifi_get_ap_interface_name(p_calling_bundle, argc, argv); + break; + default: + print_out( print, "no interface program (yet) for QCS API enum %d\n", p_calling_bundle->caller_qcsapi ); + } + + return( statval ); +} + +static int +call_qcsapi(qcsapi_output *print, int argc, char *argv[] ) +{ + qcsapi_entry_point e_the_entry_point = e_qcsapi_nosuch_api; + int ok_to_continue = 1; + int expected_argc = 1; + call_qcsapi_bundle calling_bundle; + const struct qcsapi_entry *qcsapi_table_entry = NULL; + int statval = 0; + + calling_bundle.caller_output = print; + + /* + * Argument count (argc) required to be at least 1, the name of the QCS API to be called. + */ + if (argc < 1) + { + print_out( print, "programming error in call_qcsapi, argc = %d\n", argc ); + ok_to_continue = 0; + } + + if (ok_to_continue) + { + if (name_to_entry_point_enum( argv[ 0 ], &e_the_entry_point ) == 0) + { + print_out( print, "QCSAPI entry point %s not found\n", argv[ 0 ] ); + ok_to_continue = 0; + } + } + /* + * Selected QCSAPIs are NOT supported by call_qcsapi. + */ + if (ok_to_continue) + { + if (e_the_entry_point == e_qcsapi_gpio_monitor_reset_device) + { + print_out( print, "GPIO monitor reset device cannot be accessed from call_qcsapi\n" ); + ok_to_continue = 0; + } + } + + if (ok_to_continue) + { + qcsapi_table_entry = entry_point_enum_to_table_entry( e_the_entry_point ); + + if (qcsapi_table_entry == NULL) + { + print_out( print, "programming error in call_qcsapi, no entry for enum %d\n", (int) e_the_entry_point ); + ok_to_continue = 0; + } + else + { + /* + * Originally all APIs expected an interface name. Now a few APIs apply to the entire system, + * and thus do not require an interface name. These new APIs are identified as get system value + * and set system value. Older APIs are identified as get and set APIs. They require an + * interface, which now needs to be accounted for here. And set system value APIs will require + * an additional parameter, the new system-wide value. + * + * APIs that expect an additional parameter (counters, rates, etc.) require an additional parameter + * APIs that expect an SSID AND an index (SSID get passphrase) require yet another parameter + * APIs that SET a value require yet another parameter + * + * No interdependencies. + */ + if (qcsapi_table_entry->e_typeof_api == e_qcsapi_get_api || + qcsapi_table_entry->e_typeof_api == e_qcsapi_set_api) + expected_argc++; // account for the interface + if (qcsapi_table_entry->e_generic_param_type != e_qcsapi_none) + expected_argc++; + if (qcsapi_table_entry->e_generic_param_type == e_qcsapi_SSID_index) + expected_argc++; + if (qcsapi_table_entry->e_typeof_api == e_qcsapi_set_api || + qcsapi_table_entry->e_typeof_api == e_qcsapi_set_system_value) + expected_argc++; + if (qcsapi_table_entry->e_typeof_api == e_qcsapi_set_api_without_parameter) + expected_argc++; + + if (expected_argc > argc) + { + print_out( print, + "Too few command line parameters in call_qcsapi, expected %d, found %d\n", expected_argc, argc + ); + ok_to_continue = 0; + } + } + + if (ok_to_continue) + { + /* Eliminate the QCS API name from the argument list. */ + + argc--; + argv++; + + /* Begin filling in the calling bundle ... */ + + calling_bundle.caller_qcsapi = e_the_entry_point; + + if (qcsapi_table_entry->e_typeof_api == e_qcsapi_get_api || + qcsapi_table_entry->e_typeof_api == e_qcsapi_set_api || + qcsapi_table_entry->e_typeof_api == e_qcsapi_set_api_without_parameter) + { + calling_bundle.caller_interface = argv[ 0 ]; + argc--; + argv++; + } + else + calling_bundle.caller_interface = NULL; + + calling_bundle.caller_generic_parameter.generic_parameter_type = qcsapi_table_entry->e_generic_param_type; + } + } + + if (ok_to_continue) + { + if (calling_bundle.caller_generic_parameter.generic_parameter_type != e_qcsapi_none) + { + /* Again we checked previously that enough arguments were present ... */ + + if (parse_generic_parameter_name(print, argv[ 0 ], &(calling_bundle.caller_generic_parameter)) == 0) + ok_to_continue = 0; + else + { + /* And remove the parameter name from the argument list. */ + + argc--; + argv++; + } + } + } + + if (ok_to_continue) + { + unsigned int iter; + + if (verbose_flag > 0) + { + print_out( print, "call QCSAPI: %s", entry_point_enum_to_name( calling_bundle.caller_qcsapi ) ); + + if (qcsapi_table_entry->e_typeof_api == e_qcsapi_get_api || + qcsapi_table_entry->e_typeof_api == e_qcsapi_set_api || + qcsapi_table_entry->e_typeof_api == e_qcsapi_set_api_without_parameter) + { + print_out( print, " %s", calling_bundle.caller_interface ); + } + + if (calling_bundle.caller_generic_parameter.generic_parameter_type != e_qcsapi_none) + { + print_out( print, " " ); + dump_generic_parameter_name(print, &(calling_bundle.caller_generic_parameter) ); + } + + if (argc > 0) + { + for (iter = 0; iter < argc; iter++) + print_out( print, " %s", argv[ iter ] ); + } + + print_out( print, "\n" ); + } + + if (call_qcsapi_init_count > 0) + { + if (call_qcsapi_init_count == 1) + qcsapi_init(); + else + { + for (iter = 0; iter < call_qcsapi_init_count; iter++) + qcsapi_init(); + } + } + + if (call_count < 2) { + statval = call_particular_qcsapi( &calling_bundle, argc, argv ); + } else { + for (iter = 0; iter < call_count - 1; iter++) { + call_particular_qcsapi( &calling_bundle, argc, argv ); + if (delay_time > 0) { + sleep( delay_time ); + } + } + + call_particular_qcsapi( &calling_bundle, argc, argv ); + } + } + + return( statval ); +} + +static int +process_options(qcsapi_output *print, int argc, char **argv) +{ + int local_index = 0; + + while (local_index < argc && *(argv[ local_index ]) == '-') + { + char *option_arg = argv[ local_index ]; + unsigned int length_option = strlen( option_arg ); + + if (length_option > 1) + { + char option_letter = option_arg[ 1 ]; + + if (option_letter == 'v') + { + unsigned int index_2 = 1; + + while (option_arg[ index_2 ] == 'v') + { + verbose_flag++; + index_2++; + } + } + else if (option_letter == 'q') + { + unsigned int index_2 = 1; + + while (option_arg[ index_2 ] == 'q') + { + verbose_flag--; + index_2++; + } + } + /* + * Process all options that require a numeric (integer) value here. + */ + else if (option_letter == 'n' || option_letter == 'd' || option_letter == 'i') + { + char *local_addr = NULL; + + if (length_option > 2) + { + local_addr = option_arg + 2; + } + else + { + if (local_index + 1 >= argc) + { + print_err( print, "Missing numeric value for %c option\n", option_letter ); + } + else + { + local_index++; + local_addr = argv[ local_index ]; + } + + } + + if (local_addr != NULL) + { + int min_value = 1; + int local_value = atoi( local_addr ); + /* + * Most options require a numeric value to be greater than 0. 'i' is an exception. + */ + if (option_letter == 'i') + min_value = 0; + + if (local_value < min_value) + { + print_err( print, + "Invalid numeric value %d for %c option\n", + local_value, option_letter); + return -EINVAL; + } + else + { + if (option_letter == 'n') + call_count = (unsigned int) local_value; + else if (option_letter == 'i') + call_qcsapi_init_count = (unsigned int) local_value; + else + delay_time = (unsigned int) local_value; + } + } + /* + * Error causing local_addr to be NULL has already been reported. + */ + } + else if (option_letter == 'h') + { + if (local_index + 1 >= argc) + { + list_entry_point_names(print); + } + else + { + char *local_addr = NULL; + + local_index++; + local_addr = argv[ local_index ]; + + if (strcasecmp( local_addr, "options" ) == 0) + list_option_names(print); + else if (strcasecmp( local_addr, "entry_points" ) == 0) + list_entry_point_names(print); + else if (strcasecmp( local_addr, "counters" ) == 0) + list_counter_names(print); + else if (strcasecmp( local_addr, "per_node_params" ) == 0) + list_per_node_param_names(print); + else if (strcasecmp( local_addr, "board_parameters" ) == 0) + list_board_parameter_names(print); + else { + print_err(print, "Unrecognized help option %s\n", local_addr ); + print_err(print, "Choose from 'entry_points', 'counters', 'options', 'per_node_params', or 'board_parameters'\n"); + } + } + + return -EINVAL; + } + else if (option_letter == 'g') + { + char *reg; + + if (local_index + 1 >= argc) + { + return -EINVAL; + } + + reg = argv[ ++local_index ]; + + grep_entry_point_names(print, reg); + + return -EINVAL; + } + else if (option_letter == 'f') + { + if (local_index + 1 >= argc) + { + print_err( print, "Missing numeric value for %c option\n", option_letter ); + } + else + { + char *local_addr = NULL; + + local_index++; + local_addr = argv[ local_index ]; + + if (strcmp( "force_NULL", local_addr ) == 0) + { + internal_flags |= m_force_NULL_address; + } + else + { + print_err( print, "Unrecognized parameter %s for %c option\n", + local_addr, option_letter); + } + } + } + else if (option_letter == 'u') + { + qcsapi_sem_disable(); + } + else + { + print_out( print, "unrecognized option '%c'\n", option_letter ); + } + } + /* + * Control would take the non-existent else clause if the argument were just "-". + */ + local_index++; + } + + if( verbose_flag > 1) + { + print_out( print, "Verbose flag: %d, call count: %u\n", verbose_flag, call_count ); + } + + return( local_index ); +} + +static void +call_qscapi_help(qcsapi_output *print) +{ + print_out( print, "Usage:\n" ); + print_out( print, " To get a parameter value: call_qcsapi \n" ); + print_out( print, " call_qcsapi \n" ); + print_out( print, " To set a parameter: call_qcsapi \n" ); + print_out( print, " call_qcsapi \n" ); +} + +int +qcsapi_main(qcsapi_output *print, int argc, char **argv) +{ + int ival; + int exitval = 0; + + if (argc <= 1) { + call_qscapi_help(print); + return -EINVAL; + } + + argc--; + argv++; + + ival = process_options(print, argc, argv); + if (ival < 0) { + exitval = ival; + } else { + argc = argc - ival; + argv += ival; + + exitval = call_qcsapi(print, argc, argv); + } + + return exitval; +} + diff --git a/package/firmware/quantenna/src/call_qcsapi.h b/package/firmware/quantenna/src/call_qcsapi.h new file mode 100644 index 000000000..449835ed6 --- /dev/null +++ b/package/firmware/quantenna/src/call_qcsapi.h @@ -0,0 +1,52 @@ +/*SH1 +******************************************************************************* +** ** +** Copyright (c) 2009 - 2011 Quantenna Communications Inc ** +** ** +** File : qcsapi.h ** +** Description : ** +** ** +******************************************************************************* +** ** +** Redistribution and use in source and binary forms, with or without ** +** modification, are permitted provided that the following conditions ** +** are met: ** +** 1. Redistributions of source code must retain the above copyright ** +** notice, this list of conditions and the following disclaimer. ** +** 2. Redistributions in binary form must reproduce the above copyright ** +** notice, this list of conditions and the following disclaimer in the ** +** documentation and/or other materials provided with the distribution. ** +** 3. The name of the author may not be used to endorse or promote products ** +** derived from this software without specific prior written permission. ** +** ** +** Alternatively, this software may be distributed under the terms of the ** +** GNU General Public License ("GPL") version 2, or (at your option) any ** +** later version as published by the Free Software Foundation. ** +** ** +** In the case this software is distributed under the GPL license, ** +** you should have received a copy of the GNU General Public License ** +** along with this software; if not, write to the Free Software ** +** Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ** +** ** +** THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR ** +** IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES** +** OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. ** +** IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, ** +** INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT ** +** NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,** +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ** +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ** +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF ** +** THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ** +** ** +******************************************************************************* +EH1*/ + +#ifndef _CALL_QCSAPI_H +#define _CALL_QCSAPI_H + +#include "qcsapi_output.h" + +extern int qcsapi_main(qcsapi_output *print, int argc, char **argv); + +#endif /* _CALL_QCSAPI_H */ diff --git a/package/firmware/quantenna/src/common/client/find_host_addr.h b/package/firmware/quantenna/src/common/client/find_host_addr.h new file mode 100644 index 000000000..6ca653955 --- /dev/null +++ b/package/firmware/quantenna/src/common/client/find_host_addr.h @@ -0,0 +1,52 @@ +/*SH0 +******************************************************************************* +** ** +** Copyright (c) 2009 - 2011 Quantenna Communications Inc ** +** ** +** File : call_qcsapi_local.c ** +** Description : tiny wrapper to invoke call_qcsapi locally, from main() ** +** ** +******************************************************************************* +** ** +** Redistribution and use in source and binary forms, with or without ** +** modification, are permitted provided that the following conditions ** +** are met: ** +** 1. Redistributions of source code must retain the above copyright ** +** notice, this list of conditions and the following disclaimer. ** +** 2. Redistributions in binary form must reproduce the above copyright ** +** notice, this list of conditions and the following disclaimer in the ** +** documentation and/or other materials provided with the distribution. ** +** 3. The name of the author may not be used to endorse or promote products ** +** derived from this software without specific prior written permission. ** +** ** +** Alternatively, this software may be distributed under the terms of the ** +** GNU General Public License ("GPL") version 2, or (at your option) any ** +** later version as published by the Free Software Foundation. ** +** ** +** In the case this software is distributed under the GPL license, ** +** you should have received a copy of the GNU General Public License ** +** along with this software; if not, write to the Free Software ** +** Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ** +** ** +** THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR ** +** IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES** +** OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. ** +** IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, ** +** INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT ** +** NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,** +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ** +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ** +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF ** +** THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ** +** ** +******************************************************************************* +EH0*/ + +#ifndef __QCSAPI_FIND_HOST_ADDR_H__ +#define __QCSAPI_FIND_HOST_ADDR_H__ + +extern const char* client_qcsapi_find_host_addr(int *argc, char ***argv); +extern void client_qcsapi_find_host_errmsg(const char *progname); + +#endif /* __QCSAPI_FIND_HOST_ADDR_H__ */ + diff --git a/package/firmware/quantenna/src/common/client/qftc.h b/package/firmware/quantenna/src/common/client/qftc.h new file mode 100644 index 000000000..7a8894968 --- /dev/null +++ b/package/firmware/quantenna/src/common/client/qftc.h @@ -0,0 +1,8 @@ +/* + * Copyright (c) 2015 Quantenna Communications, Inc. + * All rights reserved. + */ +#ifndef __QCSAPI_QFTC_H__ +#define __QCSAPI_QFTC_H__ +extern int qftc_start(const char *file_path_name, const char *sif_name, const uint8_t *dmac_addr); +#endif diff --git a/package/firmware/quantenna/src/common/common_mem.h b/package/firmware/quantenna/src/common/common_mem.h new file mode 100644 index 000000000..797c31a0d --- /dev/null +++ b/package/firmware/quantenna/src/common/common_mem.h @@ -0,0 +1,268 @@ +/* + * (C) Copyright 2014 Quantenna Communications Inc. + * + * See file CREDITS for list of people who contributed to this + * project. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + */ + +/* + * Header file which describes the Ruby and Topaz platforms. + * Used by both run-time and boot loader images. + * + * Do not put run-time specific definitions in this file. + */ + +#ifndef __COMMON_MEM_H +#define __COMMON_MEM_H + +#include "ruby_config.h" + +/* Platform memory */ +/* SRAM */ +#define RUBY_SRAM_UNIFIED_BEGIN 0x98000000 +#define RUBY_SRAM_UNIFIED_NOCACHE_BEGIN 0xf8000000 +#define RUBY_SRAM_FLIP_BEGIN 0x88000000 +#define RUBY_SRAM_FLIP_NOCACHE_BEGIN 0x60000000 +#define RUBY_SRAM_NOFLIP_BEGIN 0x80000000 +#define RUBY_SRAM_NOFLIP_NOCACHE_BEGIN 0x60000000 +#define RUBY_SRAM_BANK_SIZE (64 * 1024) + +#ifdef TOPAZ_PLATFORM + #define RUBY_SRAM_SIZE (8 * RUBY_SRAM_BANK_SIZE) + #define RUBY_SRAM_BANK_SAFE_SIZE RUBY_SRAM_BANK_SIZE +#else + #define RUBY_SRAM_END_BANK_GUARD_SIZE 32 + #define RUBY_SRAM_SIZE (4 * RUBY_SRAM_BANK_SIZE) + #define RUBY_SRAM_BANK_SAFE_SIZE (RUBY_SRAM_BANK_SIZE - RUBY_SRAM_END_BANK_GUARD_SIZE) +#endif + +/* DDR */ +#define RUBY_DRAM_UNIFIED_BEGIN 0x80000000 +#define RUBY_DRAM_UNIFIED_NOCACHE_BEGIN 0xd0000000 +#define RUBY_DRAM_FLIP_BEGIN 0x80000000 +#define RUBY_DRAM_FLIP_NOCACHE_BEGIN 0x40000000 +#define RUBY_DRAM_NOFLIP_BEGIN 0x0 +#define RUBY_DRAM_NOFLIP_NOCACHE_BEGIN 0x40000000 +#define RUBY_MAX_DRAM_SIZE DDR_128MB +#define RUBY_MIN_DRAM_SIZE DDR_64MB + +#if TOPAZ_MMAP_UNIFIED + #define RUBY_SRAM_BEGIN RUBY_SRAM_UNIFIED_BEGIN + #define RUBY_SRAM_BUS_BEGIN RUBY_SRAM_UNIFIED_BEGIN + #define RUBY_SRAM_NOCACHE_BEGIN RUBY_SRAM_UNIFIED_NOCACHE_BEGIN + #define RUBY_DRAM_BEGIN RUBY_DRAM_UNIFIED_BEGIN + #define RUBY_DRAM_BUS_BEGIN RUBY_DRAM_UNIFIED_BEGIN + #define RUBY_DRAM_NOCACHE_BEGIN RUBY_DRAM_UNIFIED_NOCACHE_BEGIN +#elif RUBY_MMAP_FLIP + #define RUBY_SRAM_BEGIN RUBY_SRAM_FLIP_BEGIN + #define RUBY_SRAM_BUS_BEGIN RUBY_SRAM_NOFLIP_BEGIN + #define RUBY_SRAM_NOCACHE_BEGIN RUBY_SRAM_FLIP_NOCACHE_BEGIN + #define RUBY_DRAM_BEGIN RUBY_DRAM_FLIP_BEGIN + #define RUBY_DRAM_BUS_BEGIN RUBY_DRAM_NOFLIP_BEGIN + #define RUBY_DRAM_NOCACHE_BEGIN RUBY_DRAM_FLIP_NOCACHE_BEGIN +#else + #define RUBY_SRAM_BEGIN RUBY_SRAM_NOFLIP_BEGIN + #define RUBY_SRAM_BUS_BEGIN RUBY_SRAM_NOFLIP_BEGIN + #define RUBY_SRAM_NOCACHE_BEGIN RUBY_SRAM_NOFLIP_NOCACHE_BEGIN + #define RUBY_DRAM_BEGIN RUBY_DRAM_NOFLIP_BEGIN + #define RUBY_DRAM_BUS_BEGIN RUBY_DRAM_NOFLIP_BEGIN + #define RUBY_DRAM_NOCACHE_BEGIN RUBY_DRAM_NOFLIP_NOCACHE_BEGIN +#endif + +/*****************************************************************************/ +/* SPI memory mapped */ +/*****************************************************************************/ +#define RUBY_SPI_FLASH_ADDR 0x90000000 + + /* Hardware */ +#define RUBY_HARDWARE_BEGIN 0xC0000000 + +#define ROUNDUP(x, y) ((((x)+((y)-1))/(y))*(y)) + +/* Config space */ +#define CONFIG_ARC_CONF_SIZE (8 * 1024) +/* Config area for Universal H/W ID */ +#define CONFIG_ARC_CONF_BASE (0x80000000 + CONFIG_ARC_CONF_SIZE) + +#define CONFIG_ARC_KERNEL_PAGE_SIZE (8 * 1024) + +#define RUBY_KERNEL_LOAD_DRAM_BEGIN (RUBY_DRAM_BEGIN + 0x3000000) + +/* DDR layout */ +#define CONFIG_ARC_NULL_BASE 0x00000000 +#define CONFIG_ARC_NULL_SIZE (64 * 1024) +#define CONFIG_ARC_NULL_END (CONFIG_ARC_NULL_BASE + CONFIG_ARC_NULL_SIZE) + +/* PCIe BDA area */ +#define CONFIG_ARC_PCIE_BASE (RUBY_DRAM_BEGIN + CONFIG_ARC_NULL_END) +#define CONFIG_ARC_PCIE_SIZE (64 * 1024) /* minimal PCI BAR size */ +#if ((CONFIG_ARC_PCIE_BASE & (64 * 1024 - 1)) != 0) + #error "The reserved region for PCIe BAR should 64k aligned!" +#endif + +/* + * CONFIG_ARC_MUC_STACK_OFFSET_UBOOT must be equal to CONFIG_ARC_MUC_STACK_OFFSET + * and RUBY_CRUMBS_OFFSET_UBOOT must be equal to RUBY_CRUMBS_OFFSET. + * Their values can be obtained with host/utilities/ruby_mem_helper. + */ +#if TOPAZ_RX_ACCELERATE + /* Must be equal to CONFIG_ARC_MUC_STACK_OFFSET */ + #define CONFIG_ARC_MUC_STACK_OFFSET_UBOOT (0x0003F7C0) + /* MuC stack, included in CONFIG_ARC_MUC_SRAM_SIZE */ + #define CONFIG_ARC_MUC_STACK_SIZE (4 * 1024) +#else + /* Must be equal to CONFIG_ARC_MUC_STACK_OFFSET */ + #define CONFIG_ARC_MUC_STACK_OFFSET_UBOOT (0x0003FFA0) + /* MuC stack, included in CONFIG_ARC_MUC_SRAM_SIZE */ + #define CONFIG_ARC_MUC_STACK_SIZE (6 * 1024) +#endif + +#define CONFIG_ARC_MUC_STACK_INIT_UBOOT (RUBY_SRAM_BEGIN + CONFIG_ARC_MUC_STACK_OFFSET_UBOOT) + +#ifdef TOPAZ_PLATFORM + /* Must be equal to RUBY_CRUMBS_OFFSET */ + #define RUBY_CRUMBS_OFFSET_UBOOT (0x0003FFC0) +#else + #define RUBY_CRUMBS_OFFSET_UBOOT (0x0003FFA0) +#endif + +#define RUBY_CRUMBS_ADDR_UBOOT (RUBY_SRAM_BEGIN + RUBY_CRUMBS_OFFSET_UBOOT) + +/* + * Crumb structure, sits at the end of SRAM. Each core can use it to + * store the last run function to detect bus hangs. + */ +#ifndef __ASSEMBLY__ + struct ruby_crumbs_percore { + unsigned long blink; + unsigned long status32; + unsigned long sp; + }; + + struct ruby_crumbs_mem_section { + unsigned long start; + unsigned long end; + }; + + struct ruby_crumbs { + struct ruby_crumbs_percore lhost; + struct ruby_crumbs_percore muc; + struct ruby_crumbs_percore dsp; + /* + * allow (somewhat) intelligent parsing of muc stacks by + * specifying the text section + */ + struct ruby_crumbs_mem_section muc_dram; + struct ruby_crumbs_mem_section muc_sram; + + /* + * magic token; if set incorrectly we probably have + * random values after power-on + */ + unsigned long magic; + }; + + #define RUBY_CRUMBS_MAGIC 0x7c97be8f + +#endif /* __ASSEMBLY__ */ + +/* Utility functions */ +#ifndef __ASSEMBLY__ + #if defined(AUC_BUILD) || defined(RUBY_MINI) + #define NO_RUBY_WEAK 1 + #else + #define NO_RUBY_WEAK 0 + #endif + + #define RUBY_BAD_BUS_ADDR ((unsigned long)0) + #define RUBY_BAD_VIRT_ADDR ((void*)RUBY_BAD_BUS_ADDR) + #define RUBY_ERROR_ADDR ((unsigned long)0xefefefef) + + #if defined(__CHECKER__) + #define RUBY_INLINE static inline __attribute__((always_inline)) + #define RUBY_WEAK(name) RUBY_INLINE + #elif defined(__GNUC__) + /*GCC*/ + #define RUBY_INLINE static inline __attribute__((always_inline)) + #if NO_RUBY_WEAK + #define RUBY_WEAK(name) RUBY_INLINE + #else + #define RUBY_WEAK(name) __attribute__((weak)) + #endif + #else + /*MCC*/ + #define RUBY_INLINE static _Inline + #if NO_RUBY_WEAK + #define RUBY_WEAK(name) RUBY_INLINE + #else + #define RUBY_WEAK(name) pragma Weak(name); + #endif + #pragma Offwarn(428) + #endif + + #define ____in_mem_range(addr, start, size) \ + (((addr) >= (start)) && ((addr) < (start) + (size))) + + #if defined(STATIC_CHECK) || defined(__CHECKER__) + RUBY_INLINE int __in_mem_range(unsigned long addr, unsigned long start, unsigned long size) + { + return (((addr) >= (start)) && ((addr) < (start) + (size))); + } + #else + #define __in_mem_range ____in_mem_range + #endif + + #if RUBY_MMAP_FLIP + RUBY_INLINE unsigned long virt_to_bus(const void *addr) + { + unsigned long ret = (unsigned long)addr; + if (__in_mem_range(ret, RUBY_SRAM_FLIP_BEGIN, RUBY_SRAM_SIZE)) { + ret = ret - RUBY_SRAM_FLIP_BEGIN + RUBY_SRAM_NOFLIP_BEGIN; + } else if (__in_mem_range(ret, RUBY_DRAM_FLIP_BEGIN, RUBY_MAX_DRAM_SIZE)) { + ret = ret - RUBY_DRAM_FLIP_BEGIN + RUBY_DRAM_NOFLIP_BEGIN; + } else if (ret < RUBY_HARDWARE_BEGIN) { + ret = RUBY_BAD_BUS_ADDR; + } + return ret; + } + RUBY_WEAK(bus_to_virt) void* bus_to_virt(unsigned long addr) + { + unsigned long ret = addr; + if (__in_mem_range(ret, RUBY_SRAM_NOFLIP_BEGIN, RUBY_SRAM_SIZE)) { + ret = ret - RUBY_SRAM_NOFLIP_BEGIN + RUBY_SRAM_FLIP_BEGIN; + } else if (__in_mem_range(ret, RUBY_DRAM_NOFLIP_BEGIN, RUBY_MAX_DRAM_SIZE)) { + ret = ret - RUBY_DRAM_NOFLIP_BEGIN + RUBY_DRAM_FLIP_BEGIN; + } else if (ret < RUBY_HARDWARE_BEGIN) { + ret = (unsigned long)RUBY_BAD_VIRT_ADDR; + } + return (void*)ret; + } + #else + /* Map 1:1, (x) address must be upper then 0x8000_0000. */ + #define virt_to_bus(x) ((unsigned long)(x)) + #define bus_to_virt(x) ((void *)(x)) + #endif /* #if RUBY_MMAP_FLIP */ + + #ifndef __GNUC__ + /* MCC */ + #pragma Popwarn() + #endif + +#endif /* #ifndef __ASSEMBLY__ */ + +#endif /* __COMMON_MEM_H */ diff --git a/package/firmware/quantenna/src/common/current_platform.h b/package/firmware/quantenna/src/common/current_platform.h new file mode 100644 index 000000000..bc0d20f8e --- /dev/null +++ b/package/firmware/quantenna/src/common/current_platform.h @@ -0,0 +1,8 @@ +#define TOPAZ_PLATFORM +#define TOPAZ_FPGA_PLATFORM 0 +#define TOPAZ_EMAC_NULL_BUF_WR +#undef TOPAZ_FPGA_UMCTL1 +#define PLATFORM_WMAC_MODE ap +#undef PLATFORM_DEFAULT_BOARD_ID +#define ARC_HW_REV_NEEDS_TLBMISS_FIX +#define TOPAZ_VNET_WR_STAGING 0 diff --git a/package/firmware/quantenna/src/common/rpc_pci.h b/package/firmware/quantenna/src/common/rpc_pci.h new file mode 100644 index 000000000..6841b8db1 --- /dev/null +++ b/package/firmware/quantenna/src/common/rpc_pci.h @@ -0,0 +1,14 @@ +#ifndef _PCI_RPC_H +#define _PCI_RPC_H + +#include "rpc_pci_nlm.h" + +extern CLIENT * +clnt_pci_create (const char *hostname, + u_long prog, + u_long vers, + const char *proto); + +extern SVCXPRT *svc_pci_create (int sock); + +#endif diff --git a/package/firmware/quantenna/src/common/rpc_pci_nlm.h b/package/firmware/quantenna/src/common/rpc_pci_nlm.h new file mode 100644 index 000000000..c26cc79de --- /dev/null +++ b/package/firmware/quantenna/src/common/rpc_pci_nlm.h @@ -0,0 +1,26 @@ +#ifndef __PCI_NLM_H__ + +#define __PCI_NLM_H__ + +/* + * We seperate the netlink type for client and server here. + * If the netlink type is conflicted with customers', they just need to modify + * NETLINK_RPC_PCI_CLNT and the type define in the PCIe RC driver and the netlink + * type in the rpc server and PCIe EP driver will not be affected. + */ +#define NETLINK_RPC_PCI_CLNT 31 +#define NETLINK_RPC_PCI_SVC 31 +#define PCIMSGSIZE (64 * 1024 - 1) + +/* + * Nelink Message types. + */ +#define RPC_TYPE_CALL_QCSAPI_PCIE 0x0100 +#define RPC_TYPE_QCSAPI_PCIE 0x0200 + +#define NETLINK_TYPE_SVC_REGISTER (PCIE_RPC_TYPE | 0x0010) +#define NETLINK_TYPE_SVC_RESPONSE (PCIE_RPC_TYPE | 0x0011) +#define NETLINK_TYPE_CLNT_REGISTER (PCIE_RPC_TYPE | 0x0010) +#define NETLINK_TYPE_CLNT_REQUEST (PCIE_RPC_TYPE | 0x0011) + +#endif diff --git a/package/firmware/quantenna/src/common/rpc_raw.h b/package/firmware/quantenna/src/common/rpc_raw.h new file mode 100644 index 000000000..a1f11113e --- /dev/null +++ b/package/firmware/quantenna/src/common/rpc_raw.h @@ -0,0 +1,94 @@ +/* + * Copyright (c) 2015 Quantenna Communications, Inc. + * All rights reserved. + */ +#ifndef RPC_RAW_H +#define RPC_RAW_H +#include +#include +#include + +#ifndef ARRAY_SIZE +#define ARRAY_SIZE(a) (sizeof (a) / sizeof ((a)[0])) +#endif + +#define QRPC_RAW_SOCK_PROT 11 +#define QFTP_RAW_SOCK_PROT 22 +#define ETH_P_OUI_EXT 0x88B7 +#define QUANTENNA_OUI 0x002686 + +#define QFTP_DATA_PKT_HDR_SIZE (sizeof(struct q_raw_ethoui_hdr) +\ + sizeof(struct qftp_data_pkt) - 1) +#define QFTP_ACK_NACK_FRAME_LEN (sizeof(struct q_raw_ethoui_hdr) +\ + sizeof(struct qftp_ack_nack_pkt)) + +/* QFT */ +#define QFTP_FRAME_TYPE_NACK 0 +#define QFTP_FRAME_TYPE_ACK 1 +#define QFTP_FRAME_TYPE_CONNECT 2 +#define QFTP_FRAME_TYPE_DATA 3 +/* RPC QCSAPI */ +#define QRPC_FRAME_TYPE_COMPLETE 4 +#define QRPC_FRAME_TYPE_FRAG 5 + +#define QRPC_BUFFER_LEN (16 * 1024) + +#define QRPC_QCSAPI_RPCD_SID 0 +#define QRPC_CALL_QCSAPI_RPCD_SID 1 + +struct q_raw_ethoui_hdr { + struct ethhdr eth_hdr; + uint8_t prot_id[5]; /* Protocol Identifier */ + uint8_t _pad1; +} __attribute__ ((packed)); + +/* QRPC frames */ +struct qrpc_frame_hdr { + struct q_raw_ethoui_hdr qhdr; + uint8_t sub_type; + uint8_t sid; + uint16_t seq; +} __attribute__ ((packed)); + +struct qrpc_raw_ethpkt { + struct qrpc_frame_hdr fhdr; + char payload[ETH_FRAME_LEN - sizeof(struct qrpc_frame_hdr)]; +} __attribute__ ((packed)); + +/* QFTP frame payloads */ +struct qftp_raw_ethpkt { + struct q_raw_ethoui_hdr hdr; + char payload[ETH_FRAME_LEN - sizeof(struct q_raw_ethoui_hdr)]; +} __attribute__ ((packed)); + +struct qftp_connect_pkt { + uint16_t sub_type; + uint16_t seq; + uint32_t image_size; + char image_name[1]; +} __attribute__ ((packed)); + +struct qftp_data_pkt { + uint16_t sub_type; + uint16_t seq; + char data[1]; +} __attribute__ ((packed)); + +struct qftp_ack_nack_pkt { + uint16_t sub_type; + uint16_t seq; +} __attribute__ ((packed)); + +extern CLIENT *qrpc_clnt_raw_create(u_long prog, u_long vers, + const char *const srcif_name, const uint8_t * dmac_addr, uint8_t sess_id); +extern SVCXPRT *qrpc_svc_raw_create(int sock, const char *const bind_interface, uint8_t sess_id); +extern int qrpc_set_prot_filter(const int sock, const short prot); +extern int qrpc_raw_bind(const int sock, const char *const if_name, const int protocol); +extern int str_to_mac(const char *txt_mac, uint8_t * mac); +extern int qrpc_clnt_raw_config_dst(const int sock, const char *const srcif_name, + struct sockaddr_ll *dst_addr, + const uint8_t *dmac_addr, + struct q_raw_ethoui_hdr *pkt_outbuf, + uint8_t qprot); +extern int qrpc_raw_read_timeout(const int sock_fd, const int timeout); +#endif diff --git a/package/firmware/quantenna/src/common/ruby_config.h b/package/firmware/quantenna/src/common/ruby_config.h new file mode 100644 index 000000000..059538108 --- /dev/null +++ b/package/firmware/quantenna/src/common/ruby_config.h @@ -0,0 +1,182 @@ +/* + * (C) Copyright 2010 Quantenna Communications Inc. + * + * See file CREDITS for list of people who contributed to this + * project. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + */ + +/* + * Header file which describes Ruby platform. + * Has to be used by both kernel and bootloader. + */ + +#ifndef __RUBY_CONFIG_H +#define __RUBY_CONFIG_H + +#include "topaz_config.h" + +/*******************************************************************/ + +#if TOPAZ_MMAP_UNIFIED + #define RUBY_MMAP_FLIP 0 +#else + #if !(defined(MUC_BUILD) || defined(DSP_BUILD) || defined(AUC_BUILD)) + #define RUBY_MMAP_FLIP 1 + #else + #define RUBY_MMAP_FLIP 0 + #endif +#endif + +/* Set to 1 if MuC need to enable TLB, otherwise set to 0 */ +#define RUBY_MUC_TLB_ENABLE 1 + +/*******************************************************************/ + +#ifdef RUBY_PLATFORM + + #if RUBY_FPGA_PLATFORM + #define RUBY_SERIAL_BAUD 38400 + #define RUBY_FIXED_DEV_CLK 12500000 + #define RUBY_FIXED_CPU_CLK 40000000 + #define RUBY_FPGA_DDR + #else + #define RUBY_SERIAL_BAUD 115200 + #define RUBY_FIXED_DEV_CLK 125000000 + #define RUBY_FIXED_CPU_CLK 400000000 + #define RUBY_ASIC_DDR + #endif /* #if RUBY_FPGA_PLATFORM */ + + #define UPF_SPD_FLAG 0 + #define DEFAULT_BAUD RUBY_SERIAL_BAUD + +#endif /* #ifdef RUBY_PLATFORM */ + +/*******************************************************************/ +/* Define some constants for Linux ARC kernel */ +#define CONFIG_ARC700_SERIAL_BAUD RUBY_SERIAL_BAUD +#define CONFIG_ARC700_CLK RUBY_FIXED_CPU_CLK +#define CONFIG_ARC700_DEV_CLK RUBY_FIXED_DEV_CLK + +/*******************************************************************/ + +/* RGMII related defines */ +#define CONFIG_ARCH_RUBY_ENET_RGMII + +#define CONFIG_ARCH_RGMII_DEFAULT 0x8F8F8F8F +#define CONFIG_ARCH_RGMII_DLL_TIMING 0x8F8D8F8F +#define CONFIG_ARCH_RGMII_S1P8NS_H1P9NS 0x8F891F1F +#define CONFIG_ARCH_RGMII_NODELAY 0x1F1F1F1F +#define CONFIG_ARCH_RGMII_710F CONFIG_ARCH_RGMII_NODELAY +#define CONFIG_ARCH_RGMII_P1RX00TX0E 0x0E8E1F1F + +/* EMAC related defines */ + +/* EMAC flags */ +#define EMAC_NOT_IN_USE (0) +#define EMAC_IN_USE (BIT(0)) +#define EMAC_PHY_NOT_IN_USE (BIT(1)) // do not initialize/access phy mdio +#define EMAC_PHY_FORCE_10MB (BIT(2)) +#define EMAC_PHY_FORCE_100MB (BIT(3)) +#define EMAC_PHY_FORCE_1000MB (BIT(4)) +#define EMAC_PHY_FORCE_HDX (BIT(5)) +#define EMAC_PHY_RESET (BIT(6)) // force PHY reset +#define EMAC_PHY_MII (BIT(7)) // default is rgmii +#define EMAC_PHY_AUTO_MASK (EMAC_PHY_FORCE_10MB | EMAC_PHY_FORCE_100MB | EMAC_PHY_FORCE_1000MB) +#define EMAC_PHY_AR8236 (BIT(8)) +#define EMAC_PHY_AR8327 (BIT(9)) +#define EMAC_PHY_GPIO1_RESET (BIT(10)) +#define EMAC_PHY_GPIO13_RESET (BIT(11)) +#define EMAC_PHY_NO_COC (BIT(12)) // do not adjust link speed for power savings +#define EMAC_PHY_MV88E6071 (BIT(13)) +#define EMAC_PHY_FPGAA_ONLY (BIT(15)) +#define EMAC_PHY_FPGAB_ONLY (BIT(16)) +#define EMAC_PHY_RTL8363SB_P0 (BIT(18)) +#define EMAC_PHY_RTL8363SB_P1 (BIT(19)) +#define EMAC_BONDED (BIT(20)) +#define EMAC_PHY_RTL8365MB (BIT(21)) +#define EMAC_PHY_RTL8211DS (BIT(22)) +#define EMAC_PHY_CUSTOM (BIT(31)) + +#define EMAC_MV88E6071 (EMAC_IN_USE | EMAC_PHY_MII | EMAC_PHY_NOT_IN_USE | \ + EMAC_PHY_NO_COC | EMAC_PHY_FORCE_100MB | EMAC_PHY_MV88E6071) +#define EMAC_SLOW_PHY (EMAC_PHY_FORCE_10MB|EMAC_PHY_FORCE_100MB|EMAC_PHY_MII) + +/* force phy addr scan */ +#define EMAC_PHY_ADDR_SCAN (32) // scan bus for addr + +/* Flash memory sizes */ +#define FLASH_32MB (32*1024*1024) +#define FLASH_16MB (16*1024*1024) +#define FLASH_8MB (8*1024*1024) +#define FLASH_4MB (4*1024*1024) +#define FLASH_2MB (2*1024*1024) +#define FLASH_64KB (64*1024) +#define DEFAULT_FLASH_SIZE (FLASH_8MB) +#define FLASH_SIZE_JEDEC (0) + +/* DDR memory sizes */ +#define DDR_256MB (256*1024*1024) +#define DDR_128MB (128*1024*1024) +#define DDR_64MB (64*1024*1024) +#define DDR_32MB (32*1024*1024) +#define DDR_AUTO (0) +#define DEFAULT_DDR_SIZE (DDR_64MB) + +/* Other DDR defines */ +#define DDR3_800MHz 800 +#define DDR3_640MHz 640 +#define DDR3_500MHz 500 +#define DDR3_400MHz 400 +#define DDR3_320MHz 320 +#define DDR_400 400 +#define DDR_320 320 +#define DDR_250 250 +#define DDR_200 200 +#define DDR_160 160 +#define DDR_125 125 +#define DEFAULT_DDR_SPEED (DDR_160) + +#define DDR_32_MICRON 0 +#define DDR_16_MICRON 1 +#define DDR_16_ETRON 2 +#define DDR_16_SAMSUNG 3 +#define DDR_32_ETRON 4 +#define DDR_32_SAMSUNG 5 +#define DDR_16_HYNIX 6 +#define DDR3_16_WINBOND 7 +#define DDR3_32_WINBOND 8 +#define DEFAULT_DDR_CFG (DDR_16_MICRON) + +/* UART1 defines */ +#define UART1_NOT_IN_USE 0 +#define UART1_IN_USE 1 + +#define PCIE_NOT_IN_USE 0 +#define PCIE_IN_USE (BIT(0)) +#define PCIE_USE_PHY_LOOPBK (BIT(1)) +#define PCIE_RC_MODE (BIT(2)) +#define PCIE_ENDPOINT (PCIE_IN_USE | PCIE_USE_PHY_LOOPBK) +#define PCIE_ROOTCOMPLEX (PCIE_IN_USE | PCIE_RC_MODE | PCIE_USE_PHY_LOOPBK) + +/*******************************************************************/ + +#define CONFIG_USE_SPI1_FOR_IPC PLATFORM_REG_SWITCH(1, 0) + +#endif // #ifndef __RUBY_CONFIG_H + + diff --git a/package/firmware/quantenna/src/common/ruby_mem.h b/package/firmware/quantenna/src/common/ruby_mem.h new file mode 100644 index 000000000..2bdc1b58c --- /dev/null +++ b/package/firmware/quantenna/src/common/ruby_mem.h @@ -0,0 +1,532 @@ +/* + * (C) Copyright 2010 Quantenna Communications Inc. + * + * See file CREDITS for list of people who contributed to this + * project. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + */ + +/* + * Header file which describes Ruby platform. + * Has to be used by runtime firmware. + */ + +#ifndef __RUBY_MEM_H +#define __RUBY_MEM_H + +#include "common_mem.h" + +/* FIXME: Move CPU related macros to a separate header file. */ +#define ARC_DCACHE_LINE_LENGTH 32 + +/* NEVTBD - put in real XYMEM values */ +#define RUBY_DSP_XYMEM_BEGIN 0xD0000000 +#define RUBY_DSP_XYMEM_END 0xDFFFFFFF + +/* SRAM layout */ +#define RUBY_CRUMBS_SIZE 64 /* bytes at the very end of sram for crash tracing */ + +#ifdef TOPAZ_PLATFORM +#ifdef QTN_RC_ENABLE_HDP + #define TOPAZ_HBM_BUF_EMAC_RX_COUNT_S (14) + #define TOPAZ_HBM_BUF_WMAC_RX_COUNT_S (0) +#else + #define TOPAZ_HBM_BUF_EMAC_RX_COUNT_S (13) + #define TOPAZ_HBM_BUF_WMAC_RX_COUNT_S (11) +#endif + #define TOPAZ_HBM_EMAC_TX_DONE_COUNT_S (12) + + #define TOPAZ_HBM_BUF_EMAC_RX_COUNT (1 << TOPAZ_HBM_BUF_EMAC_RX_COUNT_S) + #define TOPAZ_HBM_BUF_WMAC_RX_COUNT (1 << TOPAZ_HBM_BUF_WMAC_RX_COUNT_S) + #define TOPAZ_HBM_EMAC_TX_DONE_COUNT (1 << TOPAZ_HBM_EMAC_TX_DONE_COUNT_S) + + /* dedicated SRAM space for HBM pointer pools */ + #define TOPAZ_HBM_POOL_PTR_SIZE 4 /* sizeof(void *), 32 bit arch */ + #define TOPAZ_HBM_POOL_EMAC_RX_START 0x00000000 + #define TOPAZ_HBM_POOL_EMAC_RX_SIZE (TOPAZ_HBM_BUF_EMAC_RX_COUNT * TOPAZ_HBM_POOL_PTR_SIZE) + #define TOPAZ_HBM_POOL_EMAC_RX_END (TOPAZ_HBM_POOL_EMAC_RX_START + TOPAZ_HBM_POOL_EMAC_RX_SIZE) + #define TOPAZ_HBM_POOL_WMAC_RX_START TOPAZ_HBM_POOL_EMAC_RX_END + #define TOPAZ_HBM_POOL_WMAC_RX_SIZE (TOPAZ_HBM_BUF_WMAC_RX_COUNT * TOPAZ_HBM_POOL_PTR_SIZE) + #define TOPAZ_HBM_POOL_WMAC_RX_END (TOPAZ_HBM_POOL_WMAC_RX_START + TOPAZ_HBM_POOL_WMAC_RX_SIZE) + #define TOPAZ_HBM_POOL_EMAC_TX_DONE_START TOPAZ_HBM_POOL_WMAC_RX_END + #define TOPAZ_HBM_POOL_EMAC_TX_DONE_SIZE (TOPAZ_HBM_EMAC_TX_DONE_COUNT * TOPAZ_HBM_POOL_PTR_SIZE) + #define TOPAZ_HBM_POOL_EMAC_TX_DONE_END (TOPAZ_HBM_POOL_EMAC_TX_DONE_START + TOPAZ_HBM_POOL_EMAC_TX_DONE_SIZE) + #define TOPAZ_FWT_SW_START TOPAZ_HBM_POOL_EMAC_TX_DONE_END + #define TOPAZ_FWT_SW_SIZE (4096) + #define TOPAZ_FWT_SW_END (TOPAZ_FWT_SW_START + TOPAZ_FWT_SW_SIZE) + + #define CONFIG_MUC_EXTRA_RES_BASE TOPAZ_FWT_SW_END + #define CONFIG_MUC_EXTRA_RESERVE_SIZE (8 * 1024) + #define CONFIG_MUC_EXTRA_RES_END (CONFIG_MUC_EXTRA_RES_BASE + CONFIG_MUC_EXTRA_RESERVE_SIZE) + + #define CONFIG_ARC_KERNEL_SRAM_B1_BASE ROUNDUP(CONFIG_MUC_EXTRA_RES_END, CONFIG_ARC_KERNEL_PAGE_SIZE) + #define CONFIG_ARC_KERNEL_SRAM_B1_SIZE (22 * 1024) + #define CONFIG_ARC_KERNEL_SRAM_B1_END (CONFIG_ARC_KERNEL_SRAM_B1_BASE + CONFIG_ARC_KERNEL_SRAM_B1_SIZE) + #define CONFIG_ARC_KERNEL_SRAM_B2_BASE CONFIG_ARC_KERNEL_SRAM_B1_END + #define CONFIG_ARC_KERNEL_SRAM_B2_END (ROUNDUP(CONFIG_ARC_KERNEL_SRAM_B2_BASE, RUBY_SRAM_BANK_SIZE) - \ + ROUNDUP(TOPAZ_VNET_WR_STAGING_RESERVE, CONFIG_ARC_KERNEL_PAGE_SIZE)) + #define CONFIG_ARC_KERNEL_SRAM_B2_SIZE (CONFIG_ARC_KERNEL_SRAM_B2_END - CONFIG_ARC_KERNEL_SRAM_B2_BASE) + #define TOPAZ_VNET_WR_STAGING_1_START CONFIG_ARC_KERNEL_SRAM_B2_END + #define TOPAZ_VNET_WR_STAGING_1_SIZE TOPAZ_VNET_WR_STAGING_RESERVE + #define TOPAZ_VNET_WR_STAGING_1_END (TOPAZ_VNET_WR_STAGING_1_START + TOPAZ_VNET_WR_STAGING_1_SIZE) + #define TOPAZ_VNET_WR_STAGING_2_START ROUNDUP(TOPAZ_VNET_WR_STAGING_1_END, RUBY_SRAM_BANK_SIZE) + #define TOPAZ_VNET_WR_STAGING_2_SIZE TOPAZ_VNET_WR_STAGING_RESERVE + #define TOPAZ_VNET_WR_STAGING_2_END (TOPAZ_VNET_WR_STAGING_2_START + TOPAZ_VNET_WR_STAGING_2_SIZE) + #if TOPAZ_VNET_WR_STAGING_2_START != (2 * RUBY_SRAM_BANK_SIZE) + #error SRAM linkmap error forming topaz sram wr staging + #endif + #define CONFIG_ARC_MUC_SRAM_B1_BASE ROUNDUP(TOPAZ_VNET_WR_STAGING_2_END, CONFIG_ARC_KERNEL_PAGE_SIZE) + #define CONFIG_ARC_MUC_SRAM_B1_END ROUNDUP(CONFIG_ARC_MUC_SRAM_B1_BASE + 1, RUBY_SRAM_BANK_SIZE) + #define CONFIG_ARC_MUC_SRAM_B1_SIZE (CONFIG_ARC_MUC_SRAM_B1_END - CONFIG_ARC_MUC_SRAM_B1_BASE) + #define CONFIG_ARC_MUC_SRAM_B2_BASE ROUNDUP(CONFIG_ARC_MUC_SRAM_B1_END, RUBY_SRAM_BANK_SIZE) + #define CONFIG_ARC_MUC_SRAM_B2_SIZE (RUBY_SRAM_BANK_SAFE_SIZE - RUBY_CRUMBS_SIZE) + #define CONFIG_ARC_MUC_SRAM_B2_END (CONFIG_ARC_MUC_SRAM_B2_BASE + CONFIG_ARC_MUC_SRAM_B2_SIZE) + #define CONFIG_ARC_AUC_SRAM_BASE ROUNDUP(CONFIG_ARC_MUC_SRAM_B2_END, RUBY_SRAM_BANK_SIZE) + #define CONFIG_ARC_AUC_SRAM_SIZE (3 * RUBY_SRAM_BANK_SIZE) + #define CONFIG_ARC_AUC_SRAM_END (CONFIG_ARC_AUC_SRAM_BASE + CONFIG_ARC_AUC_SRAM_SIZE) + #define CONFIG_ARC_SRAM_END CONFIG_ARC_AUC_SRAM_END + + /* MU TxBF qmatrix is stored at the last bank of SRAM, DSP writes to it, has to use SRAM BUS addr */ + #define CONFIG_ARC_MU_QMAT_BASE (RUBY_SRAM_BUS_BEGIN + 0X70000) + #define CONFIG_ARC_MU_QMAT_SIZE RUBY_SRAM_BANK_SIZE + #define CONFIG_ARC_MU_QMAT_END (CONFIG_ARC_MU_QMAT_BASE + CONFIG_ARC_MU_QMAT_SIZE) + +#else /* Ruby */ + #define CONFIG_ARC_KERNEL_SRAM_B1_BASE 0x00000000 + #define CONFIG_ARC_KERNEL_SRAM_B1_SIZE RUBY_SRAM_BANK_SAFE_SIZE + #define CONFIG_ARC_KERNEL_SRAM_B1_END (CONFIG_ARC_KERNEL_SRAM_B1_BASE + CONFIG_ARC_KERNEL_SRAM_B1_SIZE) + #define CONFIG_ARC_KERNEL_SRAM_B2_BASE (CONFIG_ARC_KERNEL_SRAM_B1_BASE + RUBY_SRAM_BANK_SIZE) + #define CONFIG_ARC_KERNEL_SRAM_B2_SIZE RUBY_SRAM_BANK_SAFE_SIZE + #define CONFIG_ARC_KERNEL_SRAM_B2_END (CONFIG_ARC_KERNEL_SRAM_B2_BASE + CONFIG_ARC_KERNEL_SRAM_B2_SIZE) + #define CONFIG_ARC_MUC_SRAM_B1_BASE ROUNDUP(CONFIG_ARC_KERNEL_SRAM_B2_END, RUBY_SRAM_BANK_SIZE) + #define CONFIG_ARC_MUC_SRAM_B1_SIZE RUBY_SRAM_BANK_SAFE_SIZE + #define CONFIG_ARC_MUC_SRAM_B1_END (CONFIG_ARC_MUC_SRAM_B1_BASE + CONFIG_ARC_MUC_SRAM_B1_SIZE) + #define CONFIG_ARC_MUC_SRAM_B2_BASE ROUNDUP(CONFIG_ARC_MUC_SRAM_B1_END, RUBY_SRAM_BANK_SIZE) + #define CONFIG_ARC_MUC_SRAM_B2_SIZE (RUBY_SRAM_BANK_SAFE_SIZE - RUBY_CRUMBS_SIZE) + #define CONFIG_ARC_MUC_SRAM_B2_END (CONFIG_ARC_MUC_SRAM_B2_BASE + CONFIG_ARC_MUC_SRAM_B2_SIZE) +#endif /* TOPAZ_PLATFORM */ + +#if TOPAZ_RX_ACCELERATE + /* TODO FIXME - MuC crashed when copying data between SRAM and DDR */ + #define CONFIG_ARC_MUC_STACK_OFFSET (CONFIG_ARC_MUC_SRAM_B2_END - 2048) +#else + #define CONFIG_ARC_MUC_STACK_OFFSET (CONFIG_ARC_MUC_SRAM_B2_END) +#endif + +#if CONFIG_ARC_MUC_STACK_OFFSET_UBOOT != CONFIG_ARC_MUC_STACK_OFFSET + #error "CONFIG_ARC_MUC_STACK_OFFSET_UBOOT must be equal to CONFIG_ARC_MUC_STACK_OFFSET!" +#endif + +#define CONFIG_ARC_MUC_STACK_INIT (RUBY_SRAM_BEGIN + CONFIG_ARC_MUC_STACK_OFFSET) + +#define RUBY_CRUMBS_OFFSET (CONFIG_ARC_MUC_SRAM_B2_END) + +#if RUBY_CRUMBS_OFFSET != RUBY_CRUMBS_OFFSET_UBOOT + #error "RUBY_CRUMBS_OFFSET_UBOOT must be equal to RUBY_CRUMBS_OFFSET!" +#endif + +#define RUBY_CRUMBS_ADDR (RUBY_SRAM_BEGIN + RUBY_CRUMBS_OFFSET) + +/* DDR layout */ +#define CONFIG_ARC_PCIE_RSVD_SIZE (64 * 1024) +#define CONFIG_ARC_DSP_BASE (CONFIG_ARC_NULL_END + CONFIG_ARC_PCIE_RSVD_SIZE) +#define CONFIG_ARC_DSP_SIZE (768 * 1024) +#define CONFIG_ARC_DSP_END (CONFIG_ARC_DSP_BASE + CONFIG_ARC_DSP_SIZE) +#define CONFIG_ARC_MUC_BASE CONFIG_ARC_DSP_END +#ifdef TOPAZ_128_NODE_MODE +#define CONFIG_ARC_MUC_SIZE ((3 * 1024 * 1024) + (528 * 1024)) +#else +#define CONFIG_ARC_MUC_SIZE ((2 * 1024 * 1024) + (768 * 1024)) +#endif +#define MUC_DRAM_RX_RESVERED_RELOC_SIZE (8 * 1024) +#define CONFIG_ARC_MUC_END (CONFIG_ARC_MUC_BASE + CONFIG_ARC_MUC_SIZE) +#define CONFIG_ARC_MUC_MAPPED_BASE CONFIG_ARC_MUC_BASE +#define CONFIG_ARC_MUC_MAPPED_SIZE (RUBY_MAX_DRAM_SIZE - CONFIG_ARC_MUC_MAPPED_BASE) +#ifdef TOPAZ_PLATFORM + #define CONFIG_ARC_AUC_BASE CONFIG_ARC_MUC_END + #define CONFIG_ARC_AUC_SIZE (1024 * 1024 + 768 * 1024 + 40 * 1024) + #define CONFIG_ARC_AUC_END (CONFIG_ARC_AUC_BASE + CONFIG_ARC_AUC_SIZE) + #define TOPAZ_HBM_BUF_ALIGN (1 * 1024) + + #define TOPAZ_HBM_BUF_EMAC_RX_POOL 0 + #define TOPAZ_HBM_BUF_WMAC_RX_POOL 1 + #define TOPAZ_HBM_AUC_FEEDBACK_POOL 2 + #define TOPAZ_HBM_EMAC_TX_DONE_POOL 3 + + #define TOPAZ_HBM_BUF_EMAC_RX_SIZE (4 * 1024) + #define TOPAZ_HBM_BUF_WMAC_RX_SIZE (17 * 1024) + + #define TOPAZ_HBM_BUF_META_SIZE 64 /* keep it 2^n */ + #define TOPAZ_HBM_POOL_GUARD_SIZE (64 * 1024) + + #define TOPAZ_HBM_BUF_EMAC_RX_TOTAL (TOPAZ_HBM_BUF_EMAC_RX_COUNT * \ + TOPAZ_HBM_BUF_EMAC_RX_SIZE) + #define TOPAZ_HBM_BUF_WMAC_RX_TOTAL (TOPAZ_HBM_BUF_WMAC_RX_COUNT * \ + TOPAZ_HBM_BUF_WMAC_RX_SIZE) + #define TOPAZ_HBM_BUF_META_BASE CONFIG_ARC_AUC_END + + #define TOPAZ_HBM_BUF_META_EMAC_RX_BASE (TOPAZ_HBM_BUF_META_BASE + TOPAZ_HBM_BUF_META_SIZE) + #define TOPAZ_HBM_BUF_META_EMAC_RX_BASE_VIRT (RUBY_DRAM_BEGIN + TOPAZ_HBM_BUF_META_EMAC_RX_BASE) + #define TOPAZ_HBM_BUF_META_EMAC_RX_TOTAL (TOPAZ_HBM_BUF_EMAC_RX_COUNT * \ + TOPAZ_HBM_BUF_META_SIZE) + #define TOPAZ_HBM_BUF_META_EMAC_RX_END (TOPAZ_HBM_BUF_META_EMAC_RX_BASE + \ + TOPAZ_HBM_BUF_META_EMAC_RX_TOTAL) + + #define TOPAZ_HBM_BUF_META_WMAC_RX_BASE (TOPAZ_HBM_BUF_META_EMAC_RX_END + TOPAZ_HBM_BUF_META_SIZE) + #define TOPAZ_HBM_BUF_META_WMAC_RX_BASE_VIRT (RUBY_DRAM_BEGIN + TOPAZ_HBM_BUF_META_WMAC_RX_BASE) + #define TOPAZ_HBM_BUF_META_WMAC_RX_TOTAL (TOPAZ_HBM_BUF_WMAC_RX_COUNT * \ + TOPAZ_HBM_BUF_META_SIZE) + #define TOPAZ_HBM_BUF_META_WMAC_RX_END (TOPAZ_HBM_BUF_META_WMAC_RX_BASE + \ + TOPAZ_HBM_BUF_META_WMAC_RX_TOTAL) + + #define TOPAZ_HBM_BUF_META_END (TOPAZ_HBM_BUF_META_WMAC_RX_END + TOPAZ_HBM_BUF_META_SIZE) + #define TOPAZ_HBM_BUF_META_TOTAL (TOPAZ_HBM_BUF_META_END - TOPAZ_HBM_BUF_META_BASE) + + #define TOPAZ_HBM_BUF_BASE ROUNDUP(TOPAZ_HBM_BUF_META_END, TOPAZ_HBM_BUF_ALIGN) + + #define TOPAZ_HBM_BUF_EMAC_RX_BASE (TOPAZ_HBM_BUF_BASE + TOPAZ_HBM_POOL_GUARD_SIZE) + #define TOPAZ_HBM_BUF_EMAC_RX_BASE_VIRT (RUBY_DRAM_BEGIN + TOPAZ_HBM_BUF_EMAC_RX_BASE) + #define TOPAZ_HBM_BUF_EMAC_RX_END (TOPAZ_HBM_BUF_EMAC_RX_BASE + \ + TOPAZ_HBM_BUF_EMAC_RX_TOTAL) + + #define TOPAZ_HBM_BUF_WMAC_RX_BASE (TOPAZ_HBM_BUF_EMAC_RX_END + TOPAZ_HBM_POOL_GUARD_SIZE) + #define TOPAZ_HBM_BUF_WMAC_RX_BASE_VIRT (RUBY_DRAM_BEGIN + TOPAZ_HBM_BUF_WMAC_RX_BASE) + #define TOPAZ_HBM_BUF_WMAC_RX_END (TOPAZ_HBM_BUF_WMAC_RX_BASE + \ + TOPAZ_HBM_BUF_WMAC_RX_TOTAL) + + #define TOPAZ_HBM_BUF_END (TOPAZ_HBM_BUF_WMAC_RX_END + TOPAZ_HBM_POOL_GUARD_SIZE) + + #define TOPAZ_FWT_MCAST_ENTRIES 2048 + #define TOPAZ_FWT_MCAST_FF_ENTRIES 8 /* one per vap */ + #define TOPAZ_FWT_MCAST_IPMAP_ENT_SIZE 64 /* sizeof(struct topaz_fwt_sw_ipmap) */ + #define TOPAZ_FWT_MCAST_TQE_ENT_SIZE 20 /* sizeof(struct topaz_fwt_sw_mcast_entry) */ + /* Tables are cache-line aligned to ensure proper memory flushing. */ + #define TOPAZ_FWT_MCAST_IPMAP_SIZE \ + ROUNDUP(TOPAZ_FWT_MCAST_ENTRIES * TOPAZ_FWT_MCAST_IPMAP_ENT_SIZE, \ + ARC_DCACHE_LINE_LENGTH) + #define TOPAZ_FWT_MCAST_TQE_SIZE \ + ROUNDUP(TOPAZ_FWT_MCAST_ENTRIES * TOPAZ_FWT_MCAST_TQE_ENT_SIZE, \ + ARC_DCACHE_LINE_LENGTH) + #define TOPAZ_FWT_MCAST_TQE_FF_SIZE \ + ROUNDUP(TOPAZ_FWT_MCAST_FF_ENTRIES * TOPAZ_FWT_MCAST_TQE_ENT_SIZE, \ + ARC_DCACHE_LINE_LENGTH) + + #define TOPAZ_FWT_MCAST_IPMAP_BASE TOPAZ_HBM_BUF_END + #define TOPAZ_FWT_MCAST_IPMAP_END (TOPAZ_FWT_MCAST_IPMAP_BASE + TOPAZ_FWT_MCAST_IPMAP_SIZE) + #define TOPAZ_FWT_MCAST_TQE_BASE TOPAZ_FWT_MCAST_IPMAP_END + #define TOPAZ_FWT_MCAST_TQE_END (TOPAZ_FWT_MCAST_TQE_BASE + TOPAZ_FWT_MCAST_TQE_SIZE) + #define TOPAZ_FWT_MCAST_TQE_FF_BASE TOPAZ_FWT_MCAST_TQE_END + #define TOPAZ_FWT_MCAST_TQE_FF_END (TOPAZ_FWT_MCAST_TQE_FF_BASE + TOPAZ_FWT_MCAST_TQE_FF_SIZE) + #define TOPAZ_FWT_MCAST_END TOPAZ_FWT_MCAST_TQE_FF_END + + /* Offset from DDR beginning, from which memory start to belong to Linux */ + #define CONFIG_ARC_KERNEL_MEM_BASE TOPAZ_FWT_MCAST_END + + #if TOPAZ_HBM_BUF_EMAC_RX_BASE & (TOPAZ_HBM_BUF_ALIGN - 1) + #error EMAC Buffer start not aligned + #endif + #if TOPAZ_HBM_BUF_WMAC_RX_BASE & (TOPAZ_HBM_BUF_ALIGN - 1) + #error WMAC Buffer start not aligned + #endif +#else + /* Offset from DDR beginning, from which memory start to belong to Linux */ + #define CONFIG_ARC_KERNEL_MEM_BASE CONFIG_ARC_MUC_END +#endif +#define CONFIG_ARC_UBOOT_RESERVED_SPACE (8 * 1024) + +/* Linux kernel u-boot image start address, for uncompressed images */ +#define CONFIG_ARC_KERNEL_BOOT_BASE ROUNDUP(CONFIG_ARC_KERNEL_MEM_BASE, \ + CONFIG_ARC_KERNEL_PAGE_SIZE) +/* Linux kernel image start */ +#define CONFIG_ARC_KERNEL_BASE (CONFIG_ARC_KERNEL_BOOT_BASE + CONFIG_ARC_UBOOT_RESERVED_SPACE) +#define CONFIG_ARC_KERNEL_MAX_SIZE (RUBY_MAX_DRAM_SIZE - CONFIG_ARC_KERNEL_MEM_BASE) +#define CONFIG_ARC_KERNEL_MIN_SIZE (RUBY_MIN_DRAM_SIZE - CONFIG_ARC_KERNEL_MEM_BASE) + +/* AuC tightly coupled memory specification */ +#define TOPAZ_AUC_IMEM_ADDR 0xE5000000 +#define TOPAZ_AUC_IMEM_SIZE (32 * 1024) +/* BBIC4 RevB AuC DMEM bottom 4KB: 0xE510_0000 to 0xE510_0FFF is aliased with Wmac1 TCM 0xE514_0000 + * exclude the bottom 4K from DMEM, and reduce the size from 16KB to 12KB + */ +#define TOPAZ_AUC_DMEM_ADDR 0xE5101000 +#define TOPAZ_AUC_DMEM_SIZE (12 * 1024) +#define TOPAZ_REVB_DMEM_SIZE_RESERVED (4 *1024) +/***************/ + +/* Utility functions */ +#ifndef __ASSEMBLY__ + + #if defined(__CHECKER__) + #define __sram_text + #define __sram_data + #elif defined(__GNUC__) + /*GCC*/ + #if defined(CONFIG_ARCH_RUBY_NUMA) && defined(__KERNEL__) && defined(__linux__) + /* Kernel is compiled with -mlong-calls option, so we can make calls between code fragments placed in different memories */ + #define __sram_text_sect_name ".sram.text" + #define __sram_data_sect_name ".sram.data" + #if defined(PROFILE_LINUX_EP) || defined(TOPAZ_PLATFORM) + # define __sram_text + # define __sram_data + #else + # define __sram_text __attribute__ ((__section__ (__sram_text_sect_name))) + # define __sram_data __attribute__ ((__section__ (__sram_data_sect_name))) + #endif + #else + #define __sram_text_sect_name ".text" + #define __sram_data_sect_name ".data" + #define __sram_text + #define __sram_data + #endif + #else + #pragma Offwarn(428) + #endif + + RUBY_INLINE int is_valid_mem_addr(unsigned long addr) + { + if (__in_mem_range(addr, RUBY_SRAM_BEGIN, RUBY_SRAM_SIZE)) { + return 1; + } else if (__in_mem_range(addr, RUBY_DRAM_BEGIN, RUBY_MAX_DRAM_SIZE)) { + return 1; + } + return 0; + } + + #if TOPAZ_MMAP_UNIFIED + RUBY_WEAK(virt_to_nocache) void* virt_to_nocache(const void *addr) + { + unsigned long ret = (unsigned long)addr; + if (__in_mem_range(ret, RUBY_SRAM_BEGIN, RUBY_SRAM_SIZE)) { + ret = ret - RUBY_SRAM_BEGIN + RUBY_SRAM_NOCACHE_BEGIN; + } else if (__in_mem_range(ret, RUBY_DRAM_BEGIN, RUBY_MAX_DRAM_SIZE)) { + ret = ret - RUBY_DRAM_BEGIN + RUBY_DRAM_NOCACHE_BEGIN; + } else if (ret < RUBY_HARDWARE_BEGIN) { + ret = (unsigned long)RUBY_BAD_VIRT_ADDR; + } + return (void*)ret; + } + RUBY_WEAK(nocache_to_virt) void* nocache_to_virt(const void *addr) + { + unsigned long ret = (unsigned long)addr; + if (__in_mem_range(ret, RUBY_SRAM_NOCACHE_BEGIN, RUBY_SRAM_SIZE)) { + ret = ret - RUBY_SRAM_NOCACHE_BEGIN + RUBY_SRAM_BEGIN; + } else if (__in_mem_range(ret, RUBY_DRAM_NOCACHE_BEGIN, RUBY_MAX_DRAM_SIZE)) { + ret = ret - RUBY_DRAM_NOCACHE_BEGIN + RUBY_DRAM_BEGIN; + } else if (ret < RUBY_HARDWARE_BEGIN) { + ret = (unsigned long)RUBY_BAD_VIRT_ADDR; + } + return (void*)ret; + } + #endif + + #if RUBY_MUC_TLB_ENABLE + #if TOPAZ_MMAP_UNIFIED + #define muc_to_nocache virt_to_nocache + #define nocache_to_muc nocache_to_virt + #else + RUBY_WEAK(muc_to_nocache) void* muc_to_nocache(const void *addr) + { + unsigned long ret = (unsigned long)addr; + if (__in_mem_range(ret, RUBY_SRAM_NOFLIP_BEGIN, RUBY_SRAM_SIZE)) { + ret = ret - RUBY_SRAM_NOFLIP_BEGIN + RUBY_SRAM_NOFLIP_NOCACHE_BEGIN; + } else if (__in_mem_range(ret, RUBY_DRAM_NOFLIP_BEGIN, RUBY_MAX_DRAM_SIZE)) { + ret = ret - RUBY_DRAM_NOFLIP_BEGIN + RUBY_DRAM_NOFLIP_NOCACHE_BEGIN; + } else if (ret < RUBY_HARDWARE_BEGIN) { + ret = (unsigned long)RUBY_BAD_VIRT_ADDR; + } + return (void*)ret; + } + RUBY_WEAK(nocache_to_muc) void* nocache_to_muc(const void *addr) + { + unsigned long ret = (unsigned long)addr; + if (__in_mem_range(ret, RUBY_SRAM_NOFLIP_NOCACHE_BEGIN, RUBY_SRAM_SIZE)) { + ret = ret - RUBY_SRAM_NOFLIP_NOCACHE_BEGIN + RUBY_SRAM_NOFLIP_BEGIN; + } else if (__in_mem_range(ret, RUBY_DRAM_NOFLIP_NOCACHE_BEGIN, RUBY_MAX_DRAM_SIZE)) { + ret = ret - RUBY_DRAM_NOFLIP_NOCACHE_BEGIN + RUBY_DRAM_NOFLIP_BEGIN; + } else if (ret < RUBY_HARDWARE_BEGIN) { + ret = (unsigned long)RUBY_BAD_VIRT_ADDR; + } + return (void*)ret; + } + #endif + #ifndef MUC_BUILD + RUBY_INLINE unsigned long muc_to_lhost(unsigned long addr) + { + void *tmp = nocache_to_muc((void*)addr); + if (tmp != RUBY_BAD_VIRT_ADDR) { + addr = (unsigned long)tmp; + } + return (unsigned long)bus_to_virt(addr); + } + #endif // #ifndef MUC_BUILD + #else + #define muc_to_nocache(x) ((void*)(x)) + #define nocache_to_muc(x) ((void*)(x)) + #ifndef MUC_BUILD + #define muc_to_lhost(x) ((unsigned long)bus_to_virt((unsigned long)(x))) + #endif // #ifndef MUC_BUILD + #endif // #if RUBY_MUC_TLB_ENABLE + + #ifndef __GNUC__ + /*MCC*/ + #pragma Popwarn() + #endif + +#endif // #ifndef __ASSEMBLY__ + +/* + * "Write memory barrier" instruction emulation. + * Ruby platform has complex net of connected buses. + * Write transactions are buffered. + * qtn_wmb() guarantees that all issued earlier and pending writes + * to system controller, to SRAM and to DDR are completed + * before qtn_wmb() is finished. + * For complete safety Linux's wmb() should be defined + * through qtn_wmb(), but I afraid it would kill performance. + */ +#ifndef __ASSEMBLY__ + #define RUBY_SYS_CTL_SAFE_READ_REGISTER 0xE0000000 + #if defined(__GNUC__) && defined(__i386__) + #define qtn_wmb() do {} while(0) + static inline unsigned long _qtn_addr_wmb(unsigned long *addr) { return *addr; } + #define qtn_addr_wmb(addr) _qtn_addr_wmb((unsigned long *)(addr)) + #define qtn_pipeline_drain() do {} while(0) + #elif defined(__GNUC__) + /*GCC*/ + #if defined(__arc__) + #define qtn_wmb() \ + ({ \ + unsigned long temp; \ + __asm__ __volatile__ ( \ + "ld.di %0, [%1]\n\t" \ + "ld.di %0, [%2]\n\t" \ + "ld.di %0, [%3]\n\t" \ + "sync\n\t" \ + : "=r"(temp) \ + : "i"(RUBY_DRAM_BEGIN + CONFIG_ARC_KERNEL_MEM_BASE), "i"(RUBY_SRAM_BEGIN + CONFIG_ARC_KERNEL_SRAM_B1_BASE), "i"(RUBY_SYS_CTL_SAFE_READ_REGISTER) \ + : "memory"); \ + }) + #define qtn_addr_wmb(addr) \ + ({ \ + unsigned long temp; \ + __asm__ __volatile__ ( \ + "ld.di %0, [%1]\n\t" \ + "sync\n\t" \ + : "=r"(temp) \ + : "r"(addr) \ + : "memory"); \ + temp; \ + }) + #define qtn_pipeline_drain() \ + ({ \ + __asm__ __volatile__ ( \ + "sync\n\t" \ + : : : "memory"); \ + }) + #else + #define qtn_wmb() + #define qtn_addr_wmb(addr) *((volatile uint32_t*)addr) + #define qtn_pipeline_drain() + #endif + #else + /*MCC*/ + #if _ARCVER >= 0x31/*ARC7*/ + #define _qtn_pipeline_drain() \ + sync + #else + #define _qtn_pipeline_drain() \ + nop_s; nop_s; nop_s + #endif + _Asm void qtn_wmb(void) + { + /*r12 is temporary register, so we can use it inside this function freely*/ + ld.di %r12, [RUBY_DRAM_BEGIN + CONFIG_ARC_MUC_BASE] + ld.di %r12, [RUBY_SRAM_BEGIN + CONFIG_ARC_MUC_SRAM_B1_BASE] + ld.di %r12, [RUBY_SYS_CTL_SAFE_READ_REGISTER] + _qtn_pipeline_drain() + } + _Asm u_int32_t qtn_addr_wmb(unsigned long addr) + { + %reg addr; + ld.di %r0, [addr] + _qtn_pipeline_drain() + } + _Asm void qtn_pipeline_drain(void) + { + _qtn_pipeline_drain() + } + #endif +#endif + +/* + * Problem - writing to first half of cache way trash second half. + * Idea is to lock second half. + * Need make sure that invalidation does not unlock these lines (whole + * cache invalidation unlocks), or need to re-lock lines back. + * Also side effect - half of lines will be cached, half - not. + * So may need to shuffle data to make hot data cacheable. + */ +#define TOPAZ_CACHE_WAR_OFFSET 2048 +#ifndef __ASSEMBLY__ +#ifdef __GNUC__ +RUBY_INLINE void qtn_cache_topaz_war_dcache_lock(unsigned long aux_reg, unsigned long val) +{ + unsigned long addr; + unsigned long way_iter; + unsigned long line_iter; + + asm volatile ( + " sr %4, [%3]\n" + " mov %0, 0xA0000000\n" + " mov %1, 0\n" + "1: add %0, %0, 2048\n" + " mov %2, 0\n" + "2: sr %0, [0x49]\n" + " add %0, %0, 32\n" + " add %2, %2, 1\n" + " cmp %2, 64\n" + " bne 2b\n" + " add %1, %1, 1\n" + " cmp %1, 4\n" + " bne 1b\n" + : "=r"(addr), "=r"(way_iter), "=r"(line_iter) + : "r"(aux_reg), "r"(val) + ); +} +#else +_Inline _Asm void qtn_cache_topaz_war_dcache_lock(unsigned long aux_reg, unsigned long val) +{ + % reg aux_reg, reg val; + + sr val, [aux_reg] + mov %r0, 0xA0000000 + mov %r1, 0 + 1: add %r0, %r0, 2048 + mov %r2, 0 + 2: sr %r0, [0x49] + add %r0, %r0, 32 + add %r2, %r2, 1 + cmp %r2, 64 + bne 2b + add %r1, %r1, 1 + cmp %r1, 4 + bne 1b +} +#endif // #ifdef __GNUC__ +#endif // #ifndef __ASSEMBLY__ + +#endif // #ifndef __RUBY_MEM_H diff --git a/package/firmware/quantenna/src/common/ruby_pm.h b/package/firmware/quantenna/src/common/ruby_pm.h new file mode 100644 index 000000000..c12b8cc03 --- /dev/null +++ b/package/firmware/quantenna/src/common/ruby_pm.h @@ -0,0 +1,160 @@ +/* + * (C) Copyright 2012 Quantenna Communications Inc. + * + * See file CREDITS for list of people who contributed to this + * project. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + */ + +#ifndef __RUBY_PM_H +#define __RUBY_PM_H + +/* Power save levels */ +#define BOARD_PM_LEVEL_FORCE_NO (0) +#define BOARD_PM_LEVEL_NO (1) +#define BOARD_PM_LEVEL_SLOW_DOWN (2) +#define BOARD_PM_LEVEL_LATENCY_UP (3) +#define BOARD_PM_LEVEL_DISTANCE_DOWN (4) +#define BOARD_PM_LEVEL_IDLE (5) +#define BOARD_PM_LEVEL_SUSPEND (6) + +#define BOARD_PM_LEVEL_INIT BOARD_PM_LEVEL_FORCE_NO + +/* Duty level, shared between Lhost and MuC */ +#define BOARD_PM_LEVEL_DUTY BOARD_PM_LEVEL_IDLE + +/* Names of power save governors */ +#define BOARD_PM_GOVERNOR_WLAN "wlan" +#define BOARD_PM_GOVERNOR_QDISC "qdisc" +#define BOARD_PM_GOVERNOR_QCSAPI "qcsapi" + +/* wlan timings to switch between modes */ +#define BOARD_PM_WLAN_IDLE_TIMEOUT (120 * HZ) +#define BOARD_PM_WLAN_DEFAULT_TIMEOUT (0) + +/* qdisc parameters to switch between modes */ +#define BOARD_PM_QDISC_TIMER_TIMEOUT (50/*ms*/ * HZ / 1000) +#define BOARD_PM_QDISC_SPEEDUP_THRESHOLD (400) +#define BOARD_PM_QDISC_SLOWDOWN_THRESHOLD (100) +#define BOARD_PM_QDISC_SLOWDOWN_COUNT (80) +#define BOARD_PM_QDISC_SLOWDOWN_TIMEOUT (3 * HZ) +#define BOARD_PM_QDISC_DEFAULT_TIMEOUT (0) + +/* Beacon TSF setting */ +#define BOARD_PM_WAKE_BEACON_TSF_DEADLINE_PCT (50) +#define BOARD_PM_WAKE_BEACON_TSF_ALERT_PCT (25) + +/* Default setting, shared between Lhost and MuC */ +#define BOARD_PM_PDUTY_PERIOD_MS_DEFAULT 80 +#define BOARD_PM_PDUTY_PCT_LOW_DEFAULT 80 +#define BOARD_PM_SUSPEND_PERIOD_MS_DEFAULT 100 +#define BOARD_PM_SUSPEND_PCT_LOW_DEFAULT 99 + +/* Multiple Periods Support */ +#define BOARD_PM_PERIOD_CHANGE_INTERVAL 1 +#define BOARD_PM_PERIOD_CNT 3 + +enum qtn_pm_param { + QTN_PM_CURRENT_LEVEL, + + QTN_PM_SUSPEND, + QTN_PM_SUSPEND_PERIOD_MS, + QTN_PM_SUSPEND_PCT_LOW, + QTN_PM_SUSPEND_HRESET, + QTN_PM_SUSPEND_ALLCHAINS_DISABLE, + + QTN_PM_PDUTY, + QTN_PM_PDUTY_PERIOD_MS, + QTN_PM_PDUTY_PCT_LOW, + QTN_PM_PDUTY_HRESET, + QTN_PM_PDUTY_RXCHAINS_DISABLE, + + QTN_PM_MUC_SLEEP, + + QTN_PM_RXCHAIN_IDLE_COUNT, + QTN_PM_RXCHAIN_IDLE_LEVEL, + QTN_PM_TXCHAIN_IDLE_COUNT, + QTN_PM_TXCHAIN_IDLE_LEVEL, + + QTN_PM_PAUSE_MGMT_PROBERESP, + QTN_PM_PAUSE_MGMT_ASSOCRESP, + QTN_PM_PAUSE_MGMT_AUTH, + + /* For Multiple Periods Support */ + QTN_PM_PERIOD_CHANGE_INTERVAL, /* How long period setting will be changed(unit: second) */ + QTN_PM_PERIOD_CNT, /* How many periods in period group(Max 3) */ + QTN_PM_PERIOD_GROUP, /* Period group(Max 3 periods, each <= 255ms, unit: millisecond)*/ + + QTN_PM_IOCTL_MAX +}; + +#define QTN_PM_PARAM_NAMES { \ + "level", /* QTN_PM_CURRENT_LEVEL */ \ + "suspend_level", /* QTN_PM_SUSPEND */ \ + "suspend_period", /* QTN_PM_SUSPEND_PERIOD_MS */ \ + "suspend_pct", /* QTN_PM_SUSPEND_PCT_LOW */ \ + "suspend_hreset", /* QTN_PM_SUSPEND_HRESET */ \ + "suspend_allchains", /* QTN_PM_SUSPEND_ALLCHAINS_DISABLE */ \ + "pduty_level", /* QTN_PM_PDUTY */ \ + "pduty_period", /* QTN_PM_PDUTY_PERIOD_MS */ \ + "pduty_pct", /* QTN_PM_PDUTY_PCT_LOW */ \ + "pduty_hreset", /* QTN_PM_PDUTY_HRESET */ \ + "pduty_rxchains", /* QTN_PM_PDUTY_RXCHAINS_DISABLE */ \ + "muc_sleep_level", /* QTN_PM_MUC_SLEEP */ \ + "rxchain_count", /* QTN_PM_RXCHAIN_IDLE_COUNT */ \ + "rxchain_level", /* QTN_PM_RXCHAIN_IDLE_LEVEL */ \ + "txchain_count", /* QTN_PM_TXCHAIN_IDLE_COUNT */ \ + "txchain_level", /* QTN_PM_TXCHAIN_IDLE_LEVEL */ \ + "pause_proberesp", /* QTN_PM_PAUSE_MGMT_PROBERESP */ \ + "pause_assocresp", /* QTN_PM_PAUSE_MGMT_ASSOCRESP */ \ + "pause_auth", /* QTN_PM_PAUSE_MGMT_ASSOCRESP */ \ + "period_change_interval", /* QTN_PM_PERIOD_CHANGE_INTERVAL */ \ + "period_cnt", /* QTN_PM_PERIOD_CNT */ \ + "period_group" /* QTN_PM_PERIOD_GROUP */ \ +} + +#define QTN_PM_PARAM_DEFAULTS { \ + BOARD_PM_LEVEL_INIT, /* QTN_PM_CURRENT_LEVEL */ \ + BOARD_PM_LEVEL_SUSPEND, /* QTN_PM_SUSPEND */ \ + BOARD_PM_SUSPEND_PERIOD_MS_DEFAULT, /* QTN_PM_SUSPEND_PERIOD_MS */ \ + BOARD_PM_SUSPEND_PCT_LOW_DEFAULT, /* QTN_PM_SUSPEND_PCT_LOW */ \ + 1, /* QTN_PM_SUSPEND_HRESET */ \ + 1, /* QTN_PM_SUSPEND_ALL_CHAINS_DISABLE */ \ + BOARD_PM_LEVEL_DUTY, /* QTN_PM_PDUTY */ \ + BOARD_PM_PDUTY_PERIOD_MS_DEFAULT, /* QTN_PM_PDUTY_PERIOD_MS */ \ + BOARD_PM_PDUTY_PCT_LOW_DEFAULT, /* QTN_PM_PDUTY_PCT_LOW */ \ + 0, /* QTN_PM_PDUTY_HRESET */ \ + 1, /* QTN_PM_PDUTY_RXCHAINS_DISABLE */ \ + BOARD_PM_LEVEL_LATENCY_UP, /* QTN_PM_MUC_SLEEP */ \ + 4, /* QTN_PM_RXCHAIN_IDLE_COUNT */ \ + BOARD_PM_LEVEL_DISTANCE_DOWN, /* QTN_PM_RXCHAIN_IDLE_LEVEL */ \ + 4, /* QTN_PM_TXCHAIN_IDLE_COUNT */ \ + BOARD_PM_LEVEL_DISTANCE_DOWN, /* QTN_PM_TXCHAIN_IDLE_LEVEL */ \ + 60000, /* QTN_PM_PAUSE_MGMT_PROBERESP */ \ + 5000, /* QTN_PM_PAUSE_MGMT_ASSOCRESP */ \ + 5000, /* QTN_PM_PAUSE_MGMT_AUTH */ \ + BOARD_PM_PERIOD_CHANGE_INTERVAL, /* QTN_PM_PERIOD_CHANGE_INTERVAL */ \ + BOARD_PM_PERIOD_CNT, /* QTN_PM_PERIOD_CNT */ \ + 0x50321E /* QTN_PM_PERIOD_GROUP(30ms, 50ms, 80ms) */ \ +} + +#define QTN_PM_UNPACK_PARAM(x) ((x) & 0xFF) +#define QTN_PM_UNPACK_VALUE(x) ((x) >> 8) +#define QTN_PM_PACK_PARAM_VALUE(p, v) (((p) & 0xFF) | (((v) << 8) & 0xFFFFFF00)) + +#endif /* __RUBY_PM_H */ + diff --git a/package/firmware/quantenna/src/common/topaz_config.h b/package/firmware/quantenna/src/common/topaz_config.h new file mode 100644 index 000000000..bc488bc3e --- /dev/null +++ b/package/firmware/quantenna/src/common/topaz_config.h @@ -0,0 +1,189 @@ +/* + * (C) Copyright 2010 Quantenna Communications Inc. + * + * See file CREDITS for list of people who contributed to this + * project. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + */ + +/* + * Header file which describes Topaz platform. + * Has to be used by both kernel and bootloader. + */ + +#ifndef __TOPAZ_CONFIG_H +#define __TOPAZ_CONFIG_H + +#include "current_platform.h" + +#ifdef TOPAZ_PLATFORM +#if !TOPAZ_FPGA_PLATFORM +#undef TOPAZ_ICACHE_WORKAROUND +#endif +#endif + +/* + * Control registers move depending on unified + alias bit + */ + +#ifdef TOPAZ_PLATFORM + #define TOPAZ_MMAP_UNIFIED 0 + #define TOPAZ_MMAP_ALIAS 0 + #define TOPAZ_RX_ACCELERATE 1 +#else + #define TOPAZ_MMAP_UNIFIED 0 + #define TOPAZ_MMAP_ALIAS 0 + #define TOPAZ_RX_ACCELERATE 0 +#endif + +/* If MU-MIMO done in HDP or SDP */ +#ifdef TOPAZ_PLATFORM + #define QTN_HDP_MU 1 +#else + #define QTN_HDP_MU 0 +#endif + +#if QTN_HDP_MU +#define QTN_HDP_MU_FCS_WORKROUND 1 +#else +#define QTN_HDP_MU_FCS_WORKROUND 0 +#endif + +#if TOPAZ_MMAP_ALIAS && !TOPAZ_MMAP_UNIFIED + #error Alias map requires unified map +#endif + +#if TOPAZ_MMAP_ALIAS + #define TOPAZ_ALIAS_MAP_SWITCH(a, b) (b) +#else + #define TOPAZ_ALIAS_MAP_SWITCH(a, b) (a) +#endif + +/* Topaz fixed phy addresses */ +#define TOPAZ_FPGAA_PHY0_ADDR 2 +#define TOPAZ_FPGAA_PHY1_ADDR 3 +#define TOPAZ_FPGAB_PHY0_ADDR 4 +#define TOPAZ_FPGAB_PHY1_ADDR 1 +#define TOPAZ_PHY0_ADDR 1 +#define TOPAZ_PHY1_ADDR 3 + +#ifndef TOPAZ_FPGA_PLATFORM + #define TOPAZ_FPGA_PLATFORM 0 +#endif + +#ifndef TOPAZ_VNET_WR_STAGING + #define TOPAZ_VNET_WR_STAGING 0 +#endif +#define TOPAZ_VNET_WR_DMA_CHANNELS 2 +#define TOPAZ_VNET_WR_STAGING_BUF_COUNT_PER_CHAIN 10 +#define TOPAZ_VNET_WR_STAGING_BUF_SIZE 0x600 +#if TOPAZ_VNET_WR_STAGING + #define TOPAZ_VNET_WR_STAGING_ALIGN 0x80 + #define TOPAZ_VNET_WR_STAGING_GAP TOPAZ_VNET_WR_STAGING_ALIGN + #define TOPAZ_VNET_WR_STAGING_RESERVE ((TOPAZ_VNET_WR_STAGING_BUF_COUNT_PER_CHAIN * \ + TOPAZ_VNET_WR_STAGING_BUF_SIZE) + \ + TOPAZ_VNET_WR_STAGING_GAP) +#else + #define TOPAZ_VNET_WR_STAGING_RESERVE 0 +#endif + +#ifdef TOPAZ_PLATFORM + /* Definition indicates that Topaz platform is FPGA */ + #if TOPAZ_FPGA_PLATFORM + /* CLK speeds are in MHz and 1/10th the speed of actual ASIC */ + #define TOPAZ_SERIAL_BAUD 38400 + #define TOPAZ_APB_CLK 12500000 + #define TOPAZ_AHB_CLK 25000000 + #define TOPAZ_CPU_CLK 50000000 + #define RUBY_FPGA_DDR + #else + #define TOPAZ_SERIAL_BAUD 115200 + #define TOPAZ_APB_CLK 125000000 + #define TOPAZ_AHB_CLK 250000000 + #define TOPAZ_CPU_CLK 500000000 + #define RUBY_ASIC_DDR + #endif /* #if TOPAZ_FPGA_PLATFORM */ + + /* + * Setting UPF_SPD_FLAG gives a developer the option to set the + * flag to match a UPF_ define from /include/linux/serial_core.h + * or set the value to 0 to use the default baud rate setting DEFAULT_BAUD + */ + #define UPF_SPD_FLAG 0 + #define DEFAULT_BAUD TOPAZ_SERIAL_BAUD + + /* + * Re-use Ruby defines to simplify the number of changes required + * to compile new binaries for Topaz + */ + #define RUBY_SERIAL_BAUD TOPAZ_SERIAL_BAUD + #define RUBY_FIXED_DEV_CLK TOPAZ_APB_CLK + #define RUBY_FIXED_CPU_CLK TOPAZ_CPU_CLK + + #ifdef PLATFORM_DEFAULT_BOARD_ID + #define DEFAULT_BOARD_ID PLATFORM_DEFAULT_BOARD_ID + #else + /* Default board id used to match Topaz setting if there is no SPI Flash */ + #define DEFAULT_BOARD_ID QTN_TOPAZ_BB_BOARD + #endif /* TOPAZ_DEFAULT_BOARD_ID */ + + #ifndef PLATFORM_ARC7_MMU_VER + #define PLATFORM_ARC7_MMU_VER 2 + #endif + + #define CONFIG_RUBY_BROKEN_IPC_IRQS 0 + + #define RUBY_IPC_HI_IRQ(bit_num) ((bit_num) + 8) + #define RUBY_M2L_IPC_HI_IRQ(bit_num) (bit_num) + + #define PLATFORM_REG_SWITCH(reg1, reg2) (reg2) + + #define writel_topaz(a, b) writel(a, b) + #define writel_ruby(a, b) + + #define QTN_VLAN_LLC_ENCAP 1 + + #define TOPAZ_128_NODE_MODE 1 + + #define TOPAZ_ETH_REFLECT_SW_FWD 0 + + #define DSP_ENABLE_STATS 1 +#else + #ifndef PLATFORM_ARC7_MMU_VER + #define PLATFORM_ARC7_MMU_VER 2 + #endif + + /* + * For BBIC3. + * Workaround for IPC interrupt hw flaw. When receiver dynamically masks/unmasks + * interrupt, the transmitter cannot distinguish whether interrupt was acked or just masked. + */ + #define CONFIG_RUBY_BROKEN_IPC_IRQS 1 + + #define RUBY_IPC_HI_IRQ(bit_num) ((bit_num) + 16) + #define RUBY_M2L_IPC_HI_IRQ(bit_num) ((bit_num) + 16) + + #define PLATFORM_REG_SWITCH(reg1, reg2) (reg1) + + #define writel_topaz(a, b) + #define writel_ruby(a, b) writel(a, b) + + #define QTN_VLAN_LLC_ENCAP 0 +#endif /* #ifdef TOPAZ_PLATFORM */ + +#endif /* #ifndef __TOPAZ_CONFIG_H */ + diff --git a/package/firmware/quantenna/src/common/uboot_header.h b/package/firmware/quantenna/src/common/uboot_header.h new file mode 100644 index 000000000..a630d9bfe --- /dev/null +++ b/package/firmware/quantenna/src/common/uboot_header.h @@ -0,0 +1,69 @@ +/* + * Copyright (c) 2015 Quantenna Communications, Inc. + * All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * This code is taken from u-boot/include/image.h file + */ +#ifndef UBOOT_HEADER_H +#define UBOOT_HEADER_H + +#ifndef __ASSEMBLY__ +#define IH_MAGIC 0x27051956 /* Image Magic Number */ +#define IH_NMLEN 32 /* Image Name Length */ + +/* + * Legacy format image header, + * all data in network byte order (aka natural aka bigendian). + */ +typedef struct image_header { + uint32_t ih_magic; /* Image Header Magic Number */ + uint32_t ih_hcrc; /* Image Header CRC Checksum */ + uint32_t ih_time; /* Image Creation Timestamp */ + uint32_t ih_size; /* Image Data Size */ + uint32_t ih_load; /* Data Load Address */ + uint32_t ih_ep; /* Entry Point Address */ + uint32_t ih_dcrc; /* Image Data CRC Checksum */ + uint8_t ih_os; /* Operating System */ + uint8_t ih_arch; /* CPU architecture */ + uint8_t ih_type; /* Image Type */ + uint8_t ih_comp; /* Compression Type */ + uint8_t ih_name[IH_NMLEN]; /* Image Name */ +} image_header_t; + +static inline uint32_t image_get_header_size(void) +{ +#define MAX_KNOWN_PAGE_SIZE 8192 +#define ROUND_UP(N, S) ((((N) + (S) - 1) / (S)) * (S)) + return ROUND_UP(sizeof(image_header_t), MAX_KNOWN_PAGE_SIZE); +} + +struct early_flash_config { + uint32_t method; + uint32_t ipaddr; + uint32_t serverip; + uint8_t built_time_utc_sec[11]; + uint8_t uboot_type; +} __attribute__ ((packed)); +#endif /* __ASSEMBLY__ */ + +#define RUBY_BOOT_METHOD_TRYLOOP 0 +#define RUBY_BOOT_METHOD_TFTP 1 +#define RUBY_BOOT_METHOD_BOOTP 2 +#define RUBY_BOOT_METHOD_MAX 3 + +#endif /* UBOOT_HEADER_H */ + diff --git a/package/firmware/quantenna/src/compat.h b/package/firmware/quantenna/src/compat.h new file mode 100644 index 000000000..500de124f --- /dev/null +++ b/package/firmware/quantenna/src/compat.h @@ -0,0 +1,135 @@ +/*- + * Copyright (c) 2002-2005 Sam Leffler, Errno Consulting + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer, + * without modification. + * 2. Redistributions in binary form must reproduce at minimum a disclaimer + * similar to the "NO WARRANTY" disclaimer below ("Disclaimer") and any + * redistribution must be conditioned upon including a substantially + * similar Disclaimer requirement for further binary redistribution. + * 3. Neither the names of the above-listed copyright holders nor the names + * of any contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * Alternatively, this software may be distributed under the terms of the + * GNU General Public License ("GPL") version 2 as published by the Free + * Software Foundation. + * + * NO WARRANTY + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF NONINFRINGEMENT, MERCHANTIBILITY + * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL + * THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, + * OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF + * THE POSSIBILITY OF SUCH DAMAGES. + * + * $Id: compat.h 2601 2007-07-24 14:14:47Z kelmo $ + */ +#ifndef _ATH_COMPAT_H_ +#define _ATH_COMPAT_H_ + +/* Compatibility with older Linux kernels */ +#if defined(__KERNEL__) || (defined(__linux__) && __linux__) +#include +#endif +#if !defined(__KERNEL__) || !defined (__bitwise) +#define __le16 u_int16_t +#define __le32 u_int32_t +#define __le64 u_int64_t +#define __be16 u_int16_t +#define __be32 u_int32_t +#define __be64 u_int64_t +#define __force +#endif + +#ifndef container_of +#define container_of(ptr, type, member) ({ \ + const typeof( ((type *)0)->member ) *__mptr = (ptr); \ + (type *)( (char *)__mptr - offsetof(type,member) );}) +#endif + +/* + * BSD/Linux compatibility shims. These are used mainly to + * minimize differences when importing necesary BSD code. + */ +#ifndef NBBY +#define NBBY 8 /* number of bits/byte */ +#endif + +/* roundup() appears in Linux 2.6.18 */ +#ifdef __KERNEL__ +#include +#endif + +#ifndef roundup +#define roundup(x, y) ((((x)+((y)-1))/(y))*(y)) /* to any y */ +#endif + +#ifndef howmany +#define howmany(x, y) (((x)+((y)-1))/(y)) +#endif + +/* Bit map related macros. */ +#define setbit(a,i) ((a)[(i)/NBBY] |= 1<<((i)%NBBY)) +#define clrbit(a,i) ((a)[(i)/NBBY] &= ~(1<<((i)%NBBY))) +#define isset(a,i) ((a)[(i)/NBBY] & (1<<((i)%NBBY))) +#define isclr(a,i) (((a)[(i)/NBBY] & (1<<((i)%NBBY))) == 0) + +#ifndef __packed +#define __packed __attribute__((__packed__)) +#endif + +#define __printflike(_a,_b) \ + __attribute__ ((__format__ (__printf__, _a, _b))) +#define __offsetof(t,m) offsetof(t,m) + +#ifndef ALIGNED_POINTER +/* + * ALIGNED_POINTER is a boolean macro that checks whether an address + * is valid to fetch data elements of type t from on this architecture. + * This does not reflect the optimal alignment, just the possibility + * (within reasonable limits). + * + */ +#define ALIGNED_POINTER(p,t) 1 +#endif + +#ifdef __KERNEL__ +#define KASSERT(exp, msg) do { \ + if (unlikely(!(exp))) { \ + printk msg; \ + BUG(); \ + } \ +} while (0) +#endif /* __KERNEL__ */ + +/* + * NetBSD/FreeBSD defines for file version. + */ +#define __FBSDID(_s) +#define __KERNEL_RCSID(_n,_s) + +/* + * Fixes for Linux API changes + */ +#ifdef __KERNEL__ + +#include +#define ATH_REGISTER_SYSCTL_TABLE(t) register_sysctl_table(t) + +#endif /* __KERNEL__ */ + +/* FIXME: this needs changing if we need to support TCM/SRAM for time critical code */ +#define __tcm_text + +#endif /* _ATH_COMPAT_H_ */ diff --git a/package/firmware/quantenna/src/drivers/pcie/host/cavium/Makefile b/package/firmware/quantenna/src/drivers/pcie/host/cavium/Makefile new file mode 100644 index 000000000..1a73e56c0 --- /dev/null +++ b/package/firmware/quantenna/src/drivers/pcie/host/cavium/Makefile @@ -0,0 +1,50 @@ +# +# Makefile for Octeon platform +# + +ifndef OCTEON_ROOT +OCTEON_ROOT := ../.. +endif + +include $(OCTEON_ROOT)/common.mk + +COMMON_DIR := ../common +MAIN_INCLUDES := $(PWD)/../../include +INCLUDES := -I$(COMMON_DIR) -I$(PWD) -I$(MAIN_INCLUDES) + +CAVIUM_INCLUDES := -I ${OCTEON_ROOT}/target/include $(INCLUDES) + +KERNEL_PATH := ../../../../linux/kernel_2.6/linux +kernel_source := $(KERNEL_PATH) +CROSS_COMPILE := mips64-octeon-linux-gnu- + +CC = $(CROSS_COMPILE)gcc +LD = $(CROSS_COMPILE)ld + +# Common flags to be passed for driver compilation +EXTRA_CFLAGS += -Winline -Wall -I arch/mips/cavium-octeon/gpl-executive/config ${CAVIUM_INCLUDES} +EXTRA_CFLAGS += -I $(srctree)/arch/mips/cavium-octeon/gpl-executive/config -I ${OCTEON_ROOT}/executive +EXTRA_CFLAGS += -I drivers/net/cavium-ethernet + +EXTRA_CFLAGS += -DQDPC_CVM_DMA +EXTRA_CFLAGS += -DQTN_PCIE_USE_LOCAL_BUFFER +#EXTRA_CFLAGS += -DDEBUG + +default: all +qdpc-host-objs := qdpc_cvm_dma.o \ + qdpc_platform.o \ + $(COMMON_DIR)/qdpc_ring.o \ + $(COMMON_DIR)/qdpc_net.o \ + $(COMMON_DIR)/qdpc_pcie.o \ + $(COMMON_DIR)/qdpc_init.o + +obj-m := qdpc-host.o + +all: + $(MAKE) -C $(kernel_source) SUBDIRS=`pwd` modules; + +clean: + rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions Module.symvers + rm -rf $(COMMON_DIR)/.*.cmd $(COMMON_DIR)/.tmp_versions + rm -rf Module.markers modules.order $(qdpc-host-objs) + diff --git a/package/firmware/quantenna/src/drivers/pcie/host/cavium/qdpc_cvm_dma.c b/package/firmware/quantenna/src/drivers/pcie/host/cavium/qdpc_cvm_dma.c new file mode 100644 index 000000000..b6ccce5fc --- /dev/null +++ b/package/firmware/quantenna/src/drivers/pcie/host/cavium/qdpc_cvm_dma.c @@ -0,0 +1,159 @@ +/** + * Copyright (c) 2011-2013 Quantenna Communications, Inc. + * All rights reserved. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + **/ +#ifdef QDPC_CVM_DMA + +#include +#include "cvmx-cmd-queue.h" +#include "cvmx-version.h" +#include "cvmx-atomic.h" +#include "cvmx-pip.h" +#include "cvmx-ipd.h" +#include "cvmx-pow.h" +#include "cvmx-spi.h" +#include "cvmx-bootmem.h" +#include "cvmx-app-init.h" +#include "cvmx-helper.h" +#include "cvmx-helper-board.h" +#include "cvmx-npei-defs.h" +#include "cvmx-pexp-defs.h" +#include +#include "cvmx-dma-engine.h" +#include "cvmx-helper-fpa.h" +#include "cvmx-pcie.h" +#include "cvmx-pciercx-defs.h" +#include "cvmx-pescx-defs.h" +#include "cvmx-pemx-defs.h" +#include +#include "qdpc_platform.h" + +#define BYTE_SWAP_MODE_64b 1 +#define NUM_PACKET_BUFFERS 1024 + +#define PRINT_ERROR printk + +extern int cvm_oct_mem_fill_fpa(int pool, int size, int elements); + +int qdpc_pcie_port = 0; + + +int qdpc_init_dma_func(void) +{ + cvmx_npei_dma_control_t dma_control; + int port = 0, value = 0; + + /* Free pool buffers are allocated. These are used by DMA engine. */ + cvmx_fpa_enable(); + cvm_oct_mem_fill_fpa(CVMX_FPA_PACKET_POOL, CVMX_FPA_PACKET_POOL_SIZE, NUM_PACKET_BUFFERS); + cvm_oct_mem_fill_fpa(CVMX_FPA_WQE_POOL, CVMX_FPA_WQE_POOL_SIZE, NUM_PACKET_BUFFERS); + + if (CVMX_FPA_OUTPUT_BUFFER_POOL != CVMX_FPA_PACKET_POOL) { + cvm_oct_mem_fill_fpa(CVMX_FPA_OUTPUT_BUFFER_POOL, + CVMX_FPA_OUTPUT_BUFFER_POOL_SIZE, 128); + } + + cvmx_helper_setup_red(NUM_PACKET_BUFFERS/4, NUM_PACKET_BUFFERS/8); + + /* Initializing DMA engine */ + if(cvmx_dma_engine_initialize()) { + PRINT_ERROR(KERN_ERR " cvmx_dma_engine_initialize failed\n"); + return -1; + } + + dma_control.u64 = 0; + dma_control.u64 = cvmx_read_csr(CVMX_PEXP_NPEI_DMA_CONTROL); + /* Enable endian-swap mode for DMA. */ + dma_control.s.o_es = BYTE_SWAP_MODE_64b; + /* + * 1 = use pointer values for address and register values for O_RO, O_ES, and O_NS. + * 0 = use register values for address and pointer values for O_RO, O_ES, and O_NS. + */ + dma_control.s.o_mode = 1; + cvmx_write_csr(CVMX_PEXP_NPEI_DMA_CONTROL, dma_control.u64); + + for(port = 0 ; port < 2; port ++) { + value = cvmx_pcie_cfgx_read(port, CVMX_PCIERCX_CFG032(port)); + if(value & ( 1<< 29)) { + qdpc_pcie_port = port; + break; /* Assuming only one pcie card is connected to Cavium board */ + } + } + + return 0; +} + +uint32_t cvmx_pcie_cfgx_read(int port, uint32_t cfg_offset) +{ + if (octeon_has_feature(OCTEON_FEATURE_NPEI)) { + cvmx_pescx_cfg_rd_t pescx_cfg_rd; + pescx_cfg_rd.u64 = 0; + pescx_cfg_rd.s.addr = cfg_offset; + cvmx_write_csr(CVMX_PESCX_CFG_RD(port), pescx_cfg_rd.u64); + pescx_cfg_rd.u64 = cvmx_read_csr(CVMX_PESCX_CFG_RD(port)); + + return pescx_cfg_rd.s.data; + } + else { + cvmx_pemx_cfg_rd_t pemx_cfg_rd; + pemx_cfg_rd.u64 = 0; + pemx_cfg_rd.s.addr = cfg_offset; + cvmx_write_csr(CVMX_PEMX_CFG_RD(port), pemx_cfg_rd.u64); + pemx_cfg_rd.u64 = cvmx_read_csr(CVMX_PEMX_CFG_RD(port)); + + return pemx_cfg_rd.s.data; + } +} + + +int qdpc_do_dma_transfer(u_int8_t dma_type, u_int64_t local_addr, u_int64_t host_addr, u_int32_t size) +{ + cvmx_dma_engine_header_t header; + volatile u_int8_t stat; + int count = 0; + + header.u64 = 0; + header.s.type = dma_type; + header.s.lport = qdpc_pcie_port; /* Physical hardware pcie port on which pcie read/write takes place */ + + /* Initializing status to some value */ + stat = 0x65; + header.s.addr = cvmx_ptr_to_phys((void *)&stat); /* DMA completion status */ + + /* DMA transfer. Dma engine number - 1.(0 - 4). + * One engine is assigned for DMAing user data + * between host and octeon user mgmt app. + */ + if(cvmx_dma_engine_transfer(0 , header, local_addr, host_addr & 0xffffffff, size)) { + PRINT_ERROR("cvmx_dma_engine_transfer: qdpc_do_dma_transfer failed\n"); + return -1; + } + + while((stat != 0) &&(count < 10000)) { /* Checking DMA completion status */ + CVMX_SYNCW; + count ++; + } + + if(stat) { + PRINT_ERROR("qdpc_do_dma_transfer failed \n"); + return -1; + } + + return 0; +} + +#endif /* QDPC_CVM_DMA */ diff --git a/package/firmware/quantenna/src/drivers/pcie/host/cavium/qdpc_platform.c b/package/firmware/quantenna/src/drivers/pcie/host/cavium/qdpc_platform.c new file mode 100644 index 000000000..dedce4d46 --- /dev/null +++ b/package/firmware/quantenna/src/drivers/pcie/host/cavium/qdpc_platform.c @@ -0,0 +1,57 @@ +/** + * Copyright (c) 2011-2013 Quantenna Communications, Inc. + * All rights reserved. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + **/ +#include +#include +#include "qdpc_platform.h" + +int qdpc_platform_init(void) +{ +#ifdef QDPC_CVM_DMA + if(qdpc_init_dma_func()) { + printk("Cavium DMA init failed \n"); + return -1; + } +#endif /* QDPC_CVM_DMA */ + + return 0; +} + +void qdpc_platform_exit(void) +{ +#ifdef QDPC_CVM_DMA + /* Shutting down DMA engine */ + cvmx_dma_engine_shutdown(); +#endif /* QDPC_CVM_DMA */ + + return; +} + +void qdpc_platform_xfer(void *dst, void *src, unsigned int len) +{ +#ifdef QDPC_CVM_DMA + qdpc_do_dma_transfer(CVMX_DMA_ENGINE_TRANSFER_OUTBOUND, cvmx_ptr_to_phys(src), + cvmx_ptr_to_phys(dst), len); +#else /* QDPC_CVM_DMA */ + /* Copying skb data into packet buffer */ + memcpy_toio(dst, src, len); +#endif + + return; +} + diff --git a/package/firmware/quantenna/src/drivers/pcie/host/cavium/qdpc_platform.h b/package/firmware/quantenna/src/drivers/pcie/host/cavium/qdpc_platform.h new file mode 100644 index 000000000..ace3d912e --- /dev/null +++ b/package/firmware/quantenna/src/drivers/pcie/host/cavium/qdpc_platform.h @@ -0,0 +1,48 @@ +/** + * Copyright (c) 2011-2013 Quantenna Communications, Inc. + * All rights reserved. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + **/ +#ifndef __QDPC_PFDEP_H__ +#define __QDPC_PFDEP_H__ + +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,27) +#define IOREMAP ioremap_wc +#else /* LINUX_VERSION_CODE < KERNEL_VERSION(2,6,27) */ +#define IOREMAP ioremap +#endif + +#ifdef QDPC_CVM_DMA +#include +#include "cvmx-dma-engine.h" + +int qdpc_init_dma_func(void); +int qdpc_do_dma_transfer(u_int8_t dma_type, u_int64_t local_addr, + u_int64_t host_addr, u_int32_t size); +#endif /* QDPC_CVM_DMA */ + +#define SRAM_TEXT +#define SRAM_DATA + +int qdpc_platform_init(void); +void qdpc_platform_exit(void); +void qdpc_platform_xfer(void *dst, void *src, unsigned int len); + +#endif /* __QDPC_PFDEP_H__ */ + + + + diff --git a/package/firmware/quantenna/src/drivers/pcie/host/common/qdpc_init.c b/package/firmware/quantenna/src/drivers/pcie/host/common/qdpc_init.c new file mode 100644 index 000000000..516a0509c --- /dev/null +++ b/package/firmware/quantenna/src/drivers/pcie/host/common/qdpc_init.c @@ -0,0 +1,547 @@ +/** + * Copyright (c) 2011-2013 Quantenna Communications, Inc. + * All rights reserved. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + **/ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "qdpc_config.h" +#include "qdpc_debug.h" +#include "qdpc_init.h" +#include "qdpc_regs.h" +#include "qdpc_ruby.h" +#include "qdpc_platform.h" + +MODULE_AUTHOR("Quantenna"); +MODULE_LICENSE("GPL"); +MODULE_DESCRIPTION("Virtual ethernet driver for Quantenna Ruby device"); +MODULE_VERSION(QDPC_MODULE_VERSION); + +#ifdef TOPAZ_PLATFORM +#define QDPC_RUBY_IMG "topaz-linux.lzma.img" +#else +#define QDPC_RUBY_IMG "ruby-linux.lzma.img" +#endif +#define EP_BOOT_FROM_FLASH 1 + +/* Quantenna PCIE vendor and device identifiers */ +static struct pci_device_id qdpc_pcie_ids[] = { + {PCI_DEVICE(QDPC_VENDOR_ID, QDPC_DEVICE_ID),}, + {0,} +}; + +MODULE_DEVICE_TABLE(pci, qdpc_pcie_ids); + +static int qdpc_pcie_probe(struct pci_dev *pdev, const struct pci_device_id *id); +static void qdpc_pcie_remove(struct pci_dev *pdev); +static int qdpc_boot_thread(void *data); +static void qdpc_nl_recv_msg(struct sk_buff *skb); +int qdpc_init_netdev(struct net_device **net_dev, struct pci_dev *pdev); + +char qdpc_pcie_driver_name[] = "qdpc_pcie_device_driver"; + +static struct pci_driver qdpc_pcie_driver = { + .name = qdpc_pcie_driver_name, + .id_table = qdpc_pcie_ids, + .probe = qdpc_pcie_probe, + .remove = qdpc_pcie_remove, +}; + +static struct net_device *qdpc_net_dev_g = NULL; +struct sock *qdpc_nl_sk = NULL; +int qdpc_clntPid = 0; + +unsigned int (*qdpc_pci_readl)(void *addr) = qdpc_readl; +void (*qdpc_pci_writel)(unsigned int val, void *addr) = qdpc_writel; + +static int qdpc_bootpoll(struct qdpc_priv *p, uint32_t state) +{ + while (!kthread_should_stop() && (qdpc_isbootstate(p,state) == 0)) { + if (qdpc_booterror(p)) + return -1; + set_current_state(TASK_UNINTERRUPTIBLE); + schedule_timeout(QDPC_SCHED_TIMEOUT); + } + return 0; +} +static void booterror(qdpc_pcie_bda_t *bda) +{ + if (PCIE_BDA_TARGET_FWLOAD_ERR & qdpc_pci_readl(&bda->bda_flags)) + printk("EP boot from download firmware failed!\n"); + else if (PCIE_BDA_TARGET_FBOOT_ERR & qdpc_pci_readl(&bda->bda_flags)) + printk("EP boot from flash failed! Please check if there is usable image in Target flash.\n"); + else + printk("EP boot get in error, dba flag: 0x%x\n", qdpc_pci_readl(&bda->bda_flags)); +} + +static void qdpc_pci_endian_detect(struct qdpc_priv *priv) +{ + __iomem qdpc_pcie_bda_t *bda = priv->bda; + volatile uint32_t pci_endian; + + writel(QDPC_PCI_ENDIAN_DETECT_DATA, &bda->bda_pci_endian); + mmiowb(); + writel(QDPC_PCI_ENDIAN_VALID_STATUS, &bda->bda_pci_pre_status); + + while (readl(&bda->bda_pci_post_status) != QDPC_PCI_ENDIAN_VALID_STATUS) { + if (kthread_should_stop()) + break; + + set_current_state(TASK_UNINTERRUPTIBLE); + schedule_timeout(QDPC_SCHED_TIMEOUT); + } + + pci_endian = readl(&bda->bda_pci_endian); + if (pci_endian == QDPC_PCI_LITTLE_ENDIAN) { + qdpc_pci_readl = qdpc_readl; + qdpc_pci_writel = qdpc_writel; + printk("PCI memory is little endian\n"); + } else if (pci_endian == QDPC_PCI_BIG_ENDIAN) { + qdpc_pci_readl = qdpc_le32_readl; + qdpc_pci_writel = qdpc_le32_writel; + printk("PCI memory is big endian\n"); + } else { + qdpc_pci_readl = qdpc_readl; + qdpc_pci_writel = qdpc_writel; + printk("PCI memory endian value:%08x is invalid - using little endian\n", pci_endian); + } + + /* Clear endian flags */ + writel(0, &bda->bda_pci_pre_status); + writel(0, &bda->bda_pci_post_status); + writel(0, &bda->bda_pci_endian); +} + +static int qdpc_firmware_load(struct pci_dev *pdev, struct qdpc_priv *priv) +{ +#define DMABLOCKSIZE (64*1024) +#define NBLOCKS(size) ((size)/(DMABLOCKSIZE) + (((size)%(DMABLOCKSIZE) > 0) ? 1 : 0)) + + int result = SUCCESS; + const struct firmware *fw; + __iomem qdpc_pcie_bda_t *bda = priv->bda; + + + /* Request compressed firmware from user space */ + if ((result = request_firmware(&fw, QDPC_RUBY_IMG, &pdev->dev)) == -ENOENT) { + /* + * No firmware found in the firmware directory, skip firmware downloading process + * boot from flash directly on target + */ + printk( "no firmware found skip fw downloading\n"); + qdpc_pcie_posted_write((PCIE_BDA_HOST_NOFW_ERR | + qdpc_pci_readl(&bda->bda_flags)), &bda->bda_flags); + return FAILURE; + } else if (result == SUCCESS) { + uint32_t nblocks = NBLOCKS(fw->size); + uint32_t remaining = fw->size; + uint32_t count; + uint32_t dma_offset = qdpc_pci_readl(&bda->bda_dma_offset); + void *data = kmalloc(DMABLOCKSIZE, GFP_KERNEL|GFP_DMA); + const uint8_t *curdata = fw->data; + dma_addr_t handle = 0; + + if (!data) { + printk(KERN_ERR "Allocation failed for memory size[%u] Download firmware failed!\n", DMABLOCKSIZE); + release_firmware(fw); + qdpc_pcie_posted_write((PCIE_BDA_HOST_MEMALLOC_ERR | + qdpc_pci_readl(&bda->bda_flags)), &bda->bda_flags); + return FAILURE; + } + + handle = pci_map_single(priv->pdev, data ,DMABLOCKSIZE, PCI_DMA_TODEVICE); + if (!handle) { + printk("Pci map for memory data block 0x%p error, Download firmware failed!\n", data); + kfree(data); + release_firmware(fw); + qdpc_pcie_posted_write((PCIE_BDA_HOST_MEMMAP_ERR | + qdpc_pci_readl(&bda->bda_flags)), &bda->bda_flags); + return FAILURE; + } + + qdpc_setbootstate(priv, QDPC_BDA_FW_HOST_LOAD); + qdpc_bootpoll(priv, QDPC_BDA_FW_EP_RDY); + + /* Start loading firmware */ + for (count = 0 ; count < nblocks; count++) + { + uint32_t size = (remaining > DMABLOCKSIZE) ? DMABLOCKSIZE : remaining; + + memcpy(data, curdata, size); + /* flush dcache */ + pci_dma_sync_single_for_device(priv->pdev, handle ,size, PCI_DMA_TODEVICE); + + qdpc_pcie_posted_write(handle + dma_offset, &bda->bda_img); + qdpc_pcie_posted_write(size, &bda->bda_img_size); + printk("FW Data[%u]: VA:0x%p PA:0x%p Sz=%u..\n", count, (void *)curdata, (void *)handle, size); + + qdpc_setbootstate(priv, QDPC_BDA_FW_BLOCK_RDY); + qdpc_bootpoll(priv, QDPC_BDA_FW_BLOCK_DONE); + + remaining = (remaining < size) ? remaining : (remaining - size); + curdata += size; + printk("done!\n"); + } + + pci_unmap_single(priv->pdev,handle, DMABLOCKSIZE, PCI_DMA_TODEVICE); + /* Mark end of block */ + qdpc_pcie_posted_write(0, &bda->bda_img); + qdpc_pcie_posted_write(0, &bda->bda_img_size); + qdpc_setbootstate(priv, QDPC_BDA_FW_BLOCK_RDY); + qdpc_bootpoll(priv, QDPC_BDA_FW_BLOCK_DONE); + + qdpc_setbootstate(priv, QDPC_BDA_FW_BLOCK_END); + + PRINT_INFO("Image. Sz:%u State:0x%x\n", (uint32_t)fw->size, qdpc_pci_readl(&bda->bda_bootstate)); + qdpc_bootpoll(priv, QDPC_BDA_FW_LOAD_DONE); + + kfree(data); + release_firmware(fw); + PRINT_INFO("Image downloaded....!\n"); + } else { + PRINT_ERROR("Failed to load firmware:%d\n", result); + return result; + } + return result; +} + +static int qdpc_pcie_probe(struct pci_dev *pdev, const struct pci_device_id *id) +{ + struct qdpc_priv *priv = NULL; + struct net_device *ndev = NULL; + int result = SUCCESS; + + /* Net device initialization */ + if ((result = qdpc_init_netdev(&ndev, pdev)) < 0) { + return result; + } + + qdpc_net_dev_g = ndev; + priv = netdev_priv(ndev); + + /* Check if the device has PCI express capability */ + if (!pci_find_capability(pdev, PCI_CAP_ID_EXP)) { + PRINT_ERROR(KERN_ERR "The device %x does not have PCI Express capability\n", + pdev->device); + result = -ENOSYS; + goto out; + } else { + PRINT_DBG(KERN_INFO "The device %x has PCI Express capability\n", pdev->device); + } + + /* Wake up the device if it is in suspended state and allocate IO, + * memory regions and IRQ if not + */ + if (pci_enable_device(pdev)) { + PRINT_ERROR(KERN_ERR "Failed to initialize PCI device with device ID %x\n", + pdev->device); + + result = -EIO; + goto out; + } else { + PRINT_DBG(KERN_INFO "Initialized PCI device with device ID %x\n", pdev->device); + } + + /* + * Check if the PCI device can support DMA addressing properly. + * The mask gives the bits that the device can address + */ + pci_set_master(pdev); + + /* Initialize PCIE layer */ + if (( result = qdpc_pcie_init_intr_and_mem(ndev)) < 0) { + PRINT_DBG("Interrupt & Memory Initialization failed \n"); + goto release_memory; + } + + + /* Create and start the thread to initiate the INIT Handshake*/ + priv->init_thread = kthread_run(qdpc_boot_thread, priv, "qdpc_init_thread"); + if (priv->init_thread == NULL) { + PRINT_ERROR("Init thread creation failed \n"); + goto free_mem_interrupt; + } + + /* Register net device with the kernel */ + if ((result = register_netdev(ndev))) { + PRINT_DBG("veth: error %d registering net device \"%s\"\n", + result, ndev->name); + goto stop_init_kthread; + } + + + /* Create netlink & register with kernel */ + priv->netlink_socket = netlink_kernel_create(&init_net, QDPC_NETLINK_RPC_PCI, 0, qdpc_nl_recv_msg, + NULL, THIS_MODULE); + if (priv->netlink_socket) { + return SUCCESS; + } + + PRINT_ERROR(KERN_ALERT "Error creating netlink socket.\n"); + result = FAILURE; + + /* If any failure is happened. */ +stop_init_kthread: + if (priv->init_thread) + kthread_stop(priv->init_thread); + +free_mem_interrupt: + qdpc_pcie_free_mem(pdev); + qdpc_free_interrupt(pdev); + +release_memory: +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,28) + /* Releasing the memory region if any error occured */ + pci_clear_master(pdev); +#endif + + pci_disable_device(pdev); + +out: + free_netdev(ndev); + /* Any failure in probe, so it can directly return in remove */ + pci_set_drvdata(pdev, NULL); + + return result; +} + +static void qdpc_pcie_remove(struct pci_dev *pdev) +{ + struct net_device *ndev = pci_get_drvdata(pdev); + struct qdpc_priv *priv = NULL; + + /* Any failure in probe */ + if (ndev == NULL) { + return; + } + + priv = netdev_priv(ndev); + /* Net device cleanup */ + unregister_netdev(ndev); + qdpc_net_dev_g = NULL; + + /* Stoping kthread */ + if (priv->init_thread) + kthread_stop(priv->init_thread); + qdpc_datapath_uninit(priv); + qdpc_unmap_iomem(priv); + if (priv->netlink_socket) { + /* release netlink socket */ + netlink_kernel_release(priv->netlink_socket); + } + + /* Free allocated memory */ + qdpc_pcie_free_mem(pdev); + /* Free interrupt line. */ + qdpc_free_interrupt(pdev); +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,28) + pci_clear_master(pdev); +#endif + /* Disable the device */ + pci_disable_device(pdev); + /* Free netdevice */ + free_netdev(ndev); + + return; +} + +static int __init qdpc_init_module(void) +{ + int ret; + + PRINT_DBG(KERN_INFO "Quantenna pcie driver initialization\n"); + + if (qdpc_platform_init()) { + PRINT_ERROR("Platform initilization failed \n"); + ret = FAILURE; + return ret; + } + + /* Register the pci driver with device*/ + if ((ret = pci_register_driver(&qdpc_pcie_driver)) < 0 ) { + PRINT_ERROR("Could not register the driver to pci : %d\n", ret); + ret = -ENODEV; + return ret; + } + + return ret; +} + + +static void __exit qdpc_exit_module(void) +{ + /* Release netlink */ + qdpc_platform_exit(); + + /* Unregister the pci driver with the device */ + pci_unregister_driver(&qdpc_pcie_driver); + + return; +} + +static int qdpc_boot_thread(void *data) +{ + struct qdpc_priv *priv = (struct qdpc_priv *)data; + __iomem qdpc_pcie_bda_t *bda = priv->bda; + struct net_device *ndev; + unsigned char macaddr[ETH_ALEN] = {0}; + uint32_t tmp; + + qdpc_pci_endian_detect(priv); + + printk("Setting HOST ready...\n"); + qdpc_setbootstate(priv, QDPC_BDA_FW_HOST_RDY); + qdpc_bootpoll(priv, QDPC_BDA_FW_TARGET_RDY); + + if (qdpc_set_dma_mask(priv)){ + printk("Failed to map DMA mask.\n"); + priv->init_thread = NULL; + do_exit(-1); + } + + if ((PCIE_BDA_FLASH_PRESENT & qdpc_pci_readl(&bda->bda_flags)) && EP_BOOT_FROM_FLASH) { + printk("EP have fw in flash, boot from flash\n"); + qdpc_pcie_posted_write((PCIE_BDA_FLASH_BOOT | + qdpc_pci_readl(&bda->bda_flags)), &bda->bda_flags); + qdpc_setbootstate(priv, QDPC_BDA_FW_TARGET_BOOT); + qdpc_bootpoll(priv, QDPC_BDA_FW_FLASH_BOOT); + goto fw_start; + } + qdpc_setbootstate(priv, QDPC_BDA_FW_TARGET_BOOT); + printk("EP FW load request...\n"); + qdpc_bootpoll(priv, QDPC_BDA_FW_LOAD_RDY); + + printk("Start Firmware download...\n"); + if (qdpc_firmware_load(priv->pdev, priv)){ + printk("Failed to download firmware.\n"); + priv->init_thread = NULL; + do_exit(-1); + } + +fw_start: + qdpc_setbootstate(priv, QDPC_BDA_FW_START); + printk("Start booting EP...\n"); + if (qdpc_bootpoll(priv,QDPC_BDA_FW_CONFIG)) { + booterror(bda); + priv->init_thread = NULL; + do_exit(-1); + } + printk("EP boot successful, starting config...\n"); + if (qdpc_dma_setup(priv)) { + printk("Failed to initialize DMA.\n"); + priv->init_thread = NULL; + do_exit(-1); + } + + qdpc_setbootstate(priv, QDPC_BDA_FW_RUN); + qdpc_bootpoll(priv,QDPC_BDA_FW_RUNNING); + + ndev = priv->ndev; + + /* + * Get MAC address from boot data area. + * Two fields (bda_pci_pre_status and bda_pci_endian) are overloaded for + * this purpose in order to avoid updating the bootloader. + */ + tmp = qdpc_pci_readl(&bda->bda_pci_pre_status); + macaddr[0] = tmp & 0xFF; + macaddr[1] = (tmp >> 8) & 0xFF; + macaddr[2] = (tmp >> 16) & 0xFF; + macaddr[3] = (tmp >> 24) & 0xFF; + tmp = qdpc_pci_readl(&bda->bda_pci_endian); + macaddr[4] = tmp & 0xFF; + macaddr[5] = (tmp >> 8) & 0xFF; + memcpy(ndev->dev_addr, macaddr, ETH_ALEN); + +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,29) + ndev->netdev_ops->ndo_open(ndev); +#else + ndev->open(ndev); +#endif + + PRINT_INFO("Connection established with Target BBIC3 board\n"); + + tasklet_enable(&priv->rx_tasklet); + tasklet_enable(&priv->txd_tasklet); + + priv->init_thread = NULL; + do_exit(0); +} + +static void qdpc_nl_recv_msg(struct sk_buff *skb) +{ + struct qdpc_priv *priv = netdev_priv(qdpc_net_dev_g); + struct nlmsghdr *nlh = (struct nlmsghdr*)skb->data; + struct sk_buff *skb2; + /* Parsing the netlink message */ + + PRINT_DBG(KERN_INFO "%s line %d Netlink received pid:%d, size:%d, type:%d\n", + __FUNCTION__, __LINE__, nlh->nlmsg_pid, nlh->nlmsg_len, nlh->nlmsg_type); + + switch (nlh->nlmsg_type) { + case QDPC_NETLINK_TYPE_CLNT_REGISTER: + if (nlh->nlmsg_len) { + PRINT_DBG(KERN_INFO "%s line %d Netlink received client register size:%d\n", + __FUNCTION__, __LINE__, nlh->nlmsg_len); + } + + priv->netlink_pid = nlh->nlmsg_pid; /*pid of sending process */; + return; + case QDPC_NETLINK_TYPE_CLNT_REQUEST: + break; + default: + PRINT_DBG(KERN_INFO "%s line %d Netlink Invalid type %d\n", + __FUNCTION__, __LINE__, nlh->nlmsg_type); + return; + } + + /* + * make a new skb. The old skb will freed in netlink_unicast_kernel, + * but we must hold the skb before DMA transfer done + */ + skb2 = alloc_skb(nlh->nlmsg_len+sizeof(qdpc_cmd_hdr_t), GFP_ATOMIC); + if (skb2) { + qdpc_cmd_hdr_t *cmd_hdr; + cmd_hdr = (qdpc_cmd_hdr_t *)skb2->data; + memcpy(cmd_hdr->dst_magic, QDPC_NETLINK_DST_MAGIC, ETH_ALEN); + memcpy(cmd_hdr->src_magic, QDPC_NETLINK_SRC_MAGIC, ETH_ALEN); + cmd_hdr->type = htons(QDPC_APP_NETLINK_TYPE); + cmd_hdr->len = htons(nlh->nlmsg_len); + memcpy(skb2->data+sizeof(qdpc_cmd_hdr_t), skb->data+sizeof(struct nlmsghdr), nlh->nlmsg_len); + + skb_put(skb2, nlh->nlmsg_len+sizeof(qdpc_cmd_hdr_t)); + qdpc_send_packet(skb2, qdpc_net_dev_g); + } +} + + +module_init(qdpc_init_module); +module_exit(qdpc_exit_module); diff --git a/package/firmware/quantenna/src/drivers/pcie/host/common/qdpc_init.h b/package/firmware/quantenna/src/drivers/pcie/host/common/qdpc_init.h new file mode 100644 index 000000000..ad1d11514 --- /dev/null +++ b/package/firmware/quantenna/src/drivers/pcie/host/common/qdpc_init.h @@ -0,0 +1,168 @@ +/** + * Copyright (c) 2011-2013 Quantenna Communications, Inc. + * All rights reserved. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + **/ +#ifndef __QDPC_INIT_H_ +#define __QDPC_INIT_H_ + +#include +#include +#include + +#define QDPC_MODULE_NAME "qdpc_ruby" +#define QDPC_DEV_NAME "qdpc_ruby" +#define QDPC_MODULE_VERSION "1.0" + +/* + * Netlink Message types. + */ +#define QDPC_NETLINK_RPC_PCI 31 +#define QDPC_NETLINK_TYPE_CLNT_REGISTER 10 +#define QDPC_NETLINK_TYPE_CLNT_REQUEST 11 + + +/* PCIe device information declarations */ +#define QDPC_VENDOR_ID 0x1bb5 +#define QDPC_DEVICE_ID 0x0008 +#define QDPC_PCIE_NUM_BARS 6 + +typedef struct qdpc_bar { + void *b_vaddr; /* PCIe bar virtual address */ + dma_addr_t b_busaddr; /* PCIe bar physical address */ + size_t b_len; /* Bar resource length */ + uint32_t b_offset; /* Offset from start of map */ + uint8_t b_index; /* Bar Index */ +} qdpc_bar_t; + +#define QDPC_BAR_VADDR(bar, off) ((bar).b_vaddr +(off)) + +extern unsigned int (*qdpc_pci_readl)(void *addr); +extern void (*qdpc_pci_writel)(unsigned int val, void *addr); + +/* Driver private housekeeping data structures. */ +struct qdpc_priv { + struct pci_dev *pdev; /* Points Pci device */ + struct net_device *ndev; /* points net device */ + struct net_device_stats stats; /* Network statistics */ + int irq; /* Interupt line */ + struct tasklet_struct rx_tasklet; /* Tasklet scheduled in interrupt handler */ + struct tasklet_struct txd_tasklet; /* Transmit Done Tasklet scheduled in interrupt handler */ + struct task_struct *init_thread; /* Initialization thread */ + struct timer_list txq_enable_timer; /* timer for enable tx */ + spinlock_t lock; /* Private structure lock */ + enum qdpc_drv_state init_done; /* State of driver */ + int msi_enabled; /* Supports msi or not */ + qdpc_pktring_t pktq; + qdpc_dmadata_t *dsdata; /* Downstream data */ + qdpc_dmadata_t *usdata; /* Upstream data */ + + struct sock *netlink_socket; + uint32_t netlink_pid; + qdpc_bar_t sysctl_bar; + qdpc_bar_t epmem_bar; + qdpc_epshmem_hdr_t epmem; + + /* io memory pointers */ + __iomem qdpc_pcie_bda_t *bda; + __iomem uint32_t *ep2host_irqstatus; /* IRQ Cause from EP */ + __iomem uint32_t *host2ep_irqstatus; /* IRQ Cause from HOST */ + __iomem int32_t *host_ep2h_txd_budget; + __iomem int32_t *host_h2ep_txd_budget; +}; + +/* + * End-point(EP) is little-Endian. + * These two macros are used for host side outbound window memory access. + * Outbound here is host side view-point. So memory accessed by these two macros + * should be on EP side. + * NOTE: On some platforms, outbound hardware swap(byte order swap) should be + * enabled for outbound memory access correctly. If enabled, Endian translation + * will be done by hardware, and software Endian translation should be disabled. + * */ +#ifdef OUTBOUND_HW_SWAP + #define le32_readl(x) readl(x) + #define le32_writel(x, addr) writel(x, addr) +#else + #define le32_readl(x) le32_to_cpu(readl((x))) + #define le32_writel(x, addr) writel(cpu_to_le32((x)), addr) +#endif + +static inline unsigned int qdpc_readl(void *addr) +{ + return readl(addr); +} +static inline void qdpc_writel(unsigned int val, void *addr) +{ + writel(val, addr); +} +static inline unsigned int qdpc_le32_readl(void *addr) +{ + return le32_to_cpu(readl((addr))); +} +static inline void qdpc_le32_writel(unsigned int val, void *addr) +{ + writel(cpu_to_le32((val)), addr); +} + +static inline void qdpc_pcie_posted_write(uint32_t val, __iomem void *basereg) +{ + qdpc_pci_writel(val,basereg); + /* flush posted write */ + qdpc_pci_readl(basereg); +} + +static inline int qdpc_isbootstate(struct qdpc_priv *p, uint32_t state) { + __iomem uint32_t *status = &p->bda->bda_bootstate; + uint32_t s = qdpc_pci_readl(status); + return (s == state); +} +static inline int qdpc_booterror(struct qdpc_priv *p) { + __iomem uint32_t *status = &p->bda->bda_flags; + uint32_t s = qdpc_pci_readl(status); + return (s & PCIE_BDA_ERROR_MASK); +} +static inline void qdpc_setbootstate(struct qdpc_priv *p, uint32_t state) { + __iomem qdpc_pcie_bda_t *bda = p->bda; + + qdpc_pcie_posted_write(state, &bda->bda_bootstate); +} + +/* Function prototypes */ +int qdpc_pcie_init_intr_and_mem(struct net_device *ndev); +int qdpc_dma_setup(struct qdpc_priv *priv); +void qdpc_interrupt_target(struct qdpc_priv *priv, uint32_t intr); +void qdpc_disable_irqs(struct qdpc_priv *priv); +void qdpc_enable_irqs(struct qdpc_priv *priv); +void qdpc_free_interrupt(struct pci_dev *pdev); +void qdpc_pcie_free_mem(struct pci_dev *pdev); +void qdpc_datapath_init(struct qdpc_priv *priv); +void qdpc_init_target_buffers(void *data); +void qdpc_veth_rx(struct net_device *ndev); +void qdpc_map_image_loc(struct qdpc_priv *priv); +uint32_t qdpc_host_to_ep_address(struct qdpc_priv *priv, void *addr); +void qdpc_veth_txdone(struct net_device *ndev); +int qdpc_send_packet(struct sk_buff *skb, struct net_device *ndev); +void *qdpc_map_pciemem(unsigned long busaddr, size_t len); +void qdpc_unmap_pciemem(unsigned long busaddr, void *vaddr, size_t len); +int qdpc_dmainit_rxq(struct qdpc_priv *priv); +int qdpc_dmainit_txq(struct qdpc_priv *priv); +int qdpc_unmap_iomem(struct qdpc_priv *priv); +int32_t qdpc_set_dma_mask(struct qdpc_priv *priv); +struct sk_buff *qdpc_get_skb(struct qdpc_priv *priv, size_t len); +void qdpc_datapath_uninit(struct qdpc_priv *priv); + +#endif diff --git a/package/firmware/quantenna/src/drivers/pcie/host/common/qdpc_net.c b/package/firmware/quantenna/src/drivers/pcie/host/common/qdpc_net.c new file mode 100644 index 000000000..d73c5d29a --- /dev/null +++ b/package/firmware/quantenna/src/drivers/pcie/host/common/qdpc_net.c @@ -0,0 +1,771 @@ +/** + * Copyright (c) 2011-2013 Quantenna Communications, Inc. + * All rights reserved. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + **/ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "qdpc_config.h" +#include "qdpc_debug.h" +#include "qdpc_init.h" +#include "qdpc_platform.h" + +#ifdef CONFIG_RUBY_PCIE_HOST +#include +#include +#endif + +#define MAX(X,Y) ((X) > (Y) ? X : Y) +#define MIN(X,Y) ((X) < (Y) ? X : Y) + +/* Net device function prototypes */ +int qdpc_veth_open(struct net_device *ndev); +int qdpc_veth_release(struct net_device *ndev); +struct net_device_stats *qdpc_veth_stats(struct net_device *ndev); +int qdpc_veth_change_mtu(struct net_device *ndev, int new_mtu); +int qdpc_veth_set_mac_addr(struct net_device *ndev, void *paddr); + +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,32) +netdev_tx_t qdpc_veth_tx(struct sk_buff *skb, struct net_device *ndev); +#else +int qdpc_veth_tx(struct sk_buff *skb, struct net_device *ndev); +#endif + +/* Net device operations structure */ +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,29) +static struct net_device_ops veth_ops = { + .ndo_open = qdpc_veth_open, + .ndo_stop = qdpc_veth_release, + .ndo_get_stats = qdpc_veth_stats, + .ndo_set_mac_address = qdpc_veth_set_mac_addr, + .ndo_change_mtu = qdpc_veth_change_mtu, + .ndo_start_xmit = qdpc_veth_tx, +}; +#endif + +#define QDPC_NET_STATS_LEN 10 +#define QDPC_VETH_STATS_LEN ARRAY_SIZE(qdpc_veth_gstrings_stats) + + +/* Ethtool related definitions */ +static const char qdpc_veth_gstrings_stats[][ETH_GSTRING_LEN] = { + "rx_packets", "tx_packets", "rx_bytes", "tx_bytes", "rx_errors", + "tx_errors", "rx_dropped", "tx_dropped", "multicast", "collisions", +}; + +static void qdpc_veth_get_drvinfo(struct net_device *ndev, + struct ethtool_drvinfo *info); +static void qdpc_get_ethtool_stats(struct net_device *netdev, + struct ethtool_stats *stats, u64 *data); +static void qdpc_veth_get_strings(struct net_device *netdev, + u32 stringset, u8 *data); +static int qdpc_veth_get_sset_count(struct net_device *netdev, int sset); + +static struct ethtool_ops qdpc_veth_ethtool_ops = { + .get_drvinfo = qdpc_veth_get_drvinfo, + .get_strings = qdpc_veth_get_strings, + .get_sset_count = qdpc_veth_get_sset_count, + .get_ethtool_stats = qdpc_get_ethtool_stats, +}; + +/* Driver Name */ +extern char qdpc_pcie_driver_name[]; + +static inline bool check_netlink_magic(qdpc_cmd_hdr_t *cmd_hdr) +{ + return ((memcmp(cmd_hdr->dst_magic, QDPC_NETLINK_DST_MAGIC, ETH_ALEN) == 0) + && (memcmp(cmd_hdr->src_magic, QDPC_NETLINK_SRC_MAGIC, ETH_ALEN) == 0)); +} + +int qdpc_veth_open(struct net_device *ndev) +{ + struct qdpc_priv *priv = netdev_priv(ndev); + + if (!qdpc_isbootstate(priv, QDPC_BDA_FW_RUNNING)) + return -ENODEV; + + flush_scheduled_work(); + netif_start_queue(ndev); + + return SUCCESS; +} + +int qdpc_veth_release(struct net_device *ndev) +{ + /* release ports, irq and such -- like fops->close */ + netif_stop_queue(ndev); /* can't transmit any more */ + + return SUCCESS; +} + +SRAM_TEXT struct sk_buff *qdpc_get_skb(struct qdpc_priv *priv, size_t len) +{ + const uint32_t align = dma_get_cache_alignment(); + struct sk_buff *skb = NULL; + uint32_t off; + +#if (defined(CONFIG_RUBY_PCIE_HOST) && defined(QDPC_USE_SKB_RECYCLE)) + uint32_t size; + struct qtn_skb_recycle_list *recycle_list = qtn_get_shared_recycle_list(); + if (recycle_list) { + skb = qtn_skb_recycle_list_pop(recycle_list, &recycle_list->stats_pcie); + } + + if (!skb) { + size = qtn_rx_buf_size(); + if (len > size) + size = len; + skb = dev_alloc_skb(size + align); + } + if (skb) + skb->recycle_list = recycle_list; +#else + skb = dev_alloc_skb(len + align); +#endif + + if (skb) { + off = ((uint32_t)((unsigned long)skb->data)) & (align - 1); + /* skb->data should be cache aligned - do calculation here to be sure. */ + if (off) { + skb_reserve(skb, align - off); + } + } + + return skb; +} + +static inline SRAM_TEXT void qdpc_tx_skb_recycle(struct sk_buff *skb) +{ +#if (defined(CONFIG_RUBY_PCIE_HOST) && defined(QDPC_USE_SKB_RECYCLE)) + + struct qtn_skb_recycle_list *recycle_list = qtn_get_shared_recycle_list(); + + if (qtn_skb_recycle_list_push(recycle_list, + &recycle_list->stats_pcie, skb)) + return; +#endif + dev_kfree_skb_any(skb); +} + +void qdpc_netlink_rx(struct net_device *ndev, void *buf, size_t len) +{ + struct qdpc_priv *priv = netdev_priv(ndev); + struct sk_buff *skb = nlmsg_new(len, 0); + struct nlmsghdr *nlh; + + if (skb == NULL) { + DBGPRINTF(DBG_LL_WARNING, QDRV_LF_WARN, "WARNING: out of netlink SKBs\n"); + return; + } + + nlh = nlmsg_put(skb, 0, 0, NLMSG_DONE, len, 0); ; + memcpy(nlmsg_data(nlh), buf, len); + NETLINK_CB(skb).dst_group = 0; + + /* Send the netlink message to user application */ + nlmsg_unicast(priv->netlink_socket, skb, priv->netlink_pid); + +} + +static inline SRAM_TEXT int qdpc_map_buffer(struct qdpc_priv *priv, qdpc_desc_t *desc, int mapdir) +{ + desc->dd_paddr = pci_map_single(priv->pdev, desc->dd_vaddr, desc->dd_size, mapdir); + return 0; +} + +static inline SRAM_TEXT int qdpc_unmap_buffer(struct qdpc_priv *priv, qdpc_desc_t *desc, uint32_t mapdir) +{ + pci_unmap_single(priv->pdev, desc->dd_paddr, desc->dd_size, mapdir); + desc->dd_paddr = 0; + return 0; +} + +static SRAM_TEXT size_t qdpc_rx_process_frame(struct net_device *ndev, + qdpc_desc_t *rx_desc, uint32_t dma_status, bool lastdesc) +{ + struct qdpc_priv *priv = netdev_priv(ndev); + qdpc_dmadesc_t *rx_hwdesc = rx_desc->dd_hwdesc; + struct sk_buff *skb = NULL; + const uint32_t buffer_size = QDPC_DMA_MAXBUF; + uint32_t dma_data = 0; + uint32_t dma_control = 0; + size_t dmalen; +#ifdef QTN_PCIE_USE_LOCAL_BUFFER + void *data; +#endif + struct ethhdr *eth; + qdpc_cmd_hdr_t *cmd_hdr; + + dmalen = QDPC_DMA_RXLEN(dma_status); +#ifdef QTN_PCIE_USE_LOCAL_BUFFER + data = rx_desc->dd_metadata; + + if ((dmalen >= QDPC_DMA_MINBUF) && (dmalen <= QDPC_DMA_MAXBUF) + && (QDPC_DMA_SINGLE_BUFFER(dma_status))){ + eth = (struct ethhdr *)rx_desc->dd_metadata; + + switch (ntohs(eth->h_proto)) { + case QDPC_APP_NETLINK_TYPE: + /* Double Check if it's netlink packet*/ + cmd_hdr = (qdpc_cmd_hdr_t *)rx_desc->dd_metadata; + if (check_netlink_magic(cmd_hdr)) { + qdpc_netlink_rx(ndev, rx_desc->dd_metadata + + sizeof(qdpc_cmd_hdr_t), ntohs(cmd_hdr->len)); + } + break; + default: + skb = qdpc_get_skb(priv, dmalen); + if (skb) { + skb_put(skb, dmalen); + memcpy(skb->data, rx_desc->dd_vaddr, dmalen); + skb->dev = ndev; + skb->ip_summed = CHECKSUM_UNNECESSARY; + skb->protocol = eth_type_trans(skb, ndev); + netif_rx(skb); + } else { + DBGPRINTF(DBG_LL_WARNING, QDRV_LF_WARN, + "WARNING: out of SKBs\n"); + } + break; + } + } else { + DBGPRINTF(DBG_LL_WARNING, QDRV_LF_WARN, + "RX: Drop packet.S:0x%x B:0x%x L:%u\n", dma_status, rx_hwdesc->dma_data, (uint32_t)dmalen); + } + + rx_desc->dd_vaddr = data; + rx_desc->dd_size = buffer_size; + qdpc_map_buffer(priv, rx_desc, PCI_DMA_FROMDEVICE); + dma_data = rx_desc->dd_paddr + priv->epmem.eps_dma_offset; + dma_control = ((buffer_size & QDPC_DMA_LEN_MASK)|(lastdesc ? QDPC_DMA_LAST_DESC : 0)); +#else + skb = (struct sk_buff *)rx_desc->dd_metadata; + + if (skb && (dmalen >= QDPC_DMA_MINBUF) && (dmalen <= QDPC_DMA_MAXBUF) + && (QDPC_DMA_SINGLE_BUFFER(dma_status))) { + eth = (struct ethhdr *)skb->data; + switch (ntohs(eth->h_proto)) { + case QDPC_APP_NETLINK_TYPE: + /* Double Check if it's netlink packet*/ + cmd_hdr = (qdpc_cmd_hdr_t *)skb->data; + if (check_netlink_magic(cmd_hdr)) { + qdpc_netlink_rx(ndev, skb->data + + sizeof(qdpc_cmd_hdr_t), ntohs(cmd_hdr->len)); + } + break; + default: + skb->dev = ndev; + skb->len = 0; + skb_reset_tail_pointer(skb); + skb_put(skb, dmalen); + skb->ip_summed = CHECKSUM_UNNECESSARY; + skb->protocol = eth_type_trans(skb, ndev); + netif_rx(skb); + skb = NULL; + break; + } + } else { + DBGPRINTF(DBG_LL_WARNING, QDRV_LF_WARN, + "RX: Drop packet. Skb: 0x%p Status:0x%x Len:%u\n", skb, dma_status, dmalen); + } + + if (skb) + dev_kfree_skb_any(skb); + + skb = qdpc_get_skb(priv, buffer_size); + + if (skb == NULL) { + rx_desc->dd_vaddr = 0; + rx_desc->dd_size = 0; + dma_data = 0; + dma_control = (lastdesc ? QDPC_DMA_LAST_DESC : 0); + } else { + rx_desc->dd_vaddr = skb->data; + rx_desc->dd_size = buffer_size; + qdpc_map_buffer(priv, rx_desc, PCI_DMA_FROMDEVICE); + dma_data = rx_desc->dd_paddr + priv->epmem.eps_dma_offset; + dma_control = ((buffer_size & QDPC_DMA_LEN_MASK)|(lastdesc ? QDPC_DMA_LAST_DESC : 0)); + } + + rx_desc->dd_metadata = (void *)skb; +#endif + + qdpc_pci_writel(dma_data, &rx_hwdesc->dma_data); + qdpc_pci_writel(dma_control, &rx_hwdesc->dma_control); + + /* + * Memory mapped IO barrier, if defined on systems forces the other parts of the descriptor to complete + * before ownership status is changed + */ + mmiowb(); + qdpc_pci_writel(QDPC_DMA_OWN, &rx_hwdesc->dma_status); + + return dmalen; +} + +static SRAM_TEXT void qdpc_indicate_peer_rx_nfree(struct qdpc_priv *priv, + qdpc_pdring_t *rxq, qdpc_desc_t *rx_desc, uint32_t dma_status) +{ + uint32_t nfree = rxq->pd_ringsize; + qdpc_desc_t *rx_last_desc; + unsigned long flags; + + local_irq_save(flags); + if (unlikely(QDPC_DMA_OWNED(dma_status) == 0)) { + rx_last_desc = rx_desc; + for(rx_desc = rxq->pd_nextdesc; (rx_desc != rx_last_desc) && (nfree > 0);) { + dma_status = qdpc_pci_readl(&rx_desc->dd_hwdesc->dma_status); + if (QDPC_DMA_OWNED(dma_status) == 0) { + nfree--; + } else { + break; + } + + if (rx_desc == rxq->pd_lastdesc) { + rx_desc = rxq->pd_firstdesc; + } else { + rx_desc++; + } + } + if (nfree <= QDPC_VETH_RX_LOW_WATERMARK) + nfree = 0; + } + + qdpc_pci_writel(nfree, priv->host_h2ep_txd_budget); + mmiowb(); + local_irq_restore(flags); +} + +SRAM_TEXT void qdpc_veth_rx(struct net_device *ndev) +{ + struct qdpc_priv *priv = netdev_priv(ndev); + qdpc_pdring_t *rxq = &priv->pktq.pkt_usq; + uint32_t budget = QDPC_DESC_RING_SIZE << 1; + uint32_t dma_status = 0; + qdpc_desc_t *rx_desc; + qdpc_dmadesc_t *rx_hwdesc; + bool lastdesc; + size_t pktlen; + + if (rxq->pd_nextdesc == NULL) + return; + + rx_desc = rxq->pd_nextdesc; + rx_hwdesc = rx_desc->dd_hwdesc; + dma_status = qdpc_pci_readl(&rx_hwdesc->dma_status); + + while (budget-- > 0 && (QDPC_DMA_OWNED(dma_status) == 0)) { + rx_desc = rxq->pd_nextdesc; + lastdesc = (rxq->pd_nextdesc == rxq->pd_lastdesc); + rx_hwdesc = rx_desc->dd_hwdesc; + + qdpc_unmap_buffer(priv, rx_desc, PCI_DMA_FROMDEVICE); + pktlen = qdpc_rx_process_frame(ndev, rx_desc,dma_status, lastdesc); + + /* Check for end of ring, and loop around */ + if (lastdesc) { + rxq->pd_nextdesc = rxq->pd_firstdesc; + } else { + rxq->pd_nextdesc++; + } + + /* Update the statistics */ + priv->stats.rx_packets++; + priv->stats.rx_bytes += pktlen; + + rx_hwdesc = rxq->pd_nextdesc->dd_hwdesc; + dma_status = qdpc_pci_readl(&rx_hwdesc->dma_status); + } + + qdpc_indicate_peer_rx_nfree(priv, rxq, rx_desc, dma_status); + qdpc_interrupt_target(priv, QDPC_HOST_TXDONE); + +} + +SRAM_TEXT uint32_t qdpc_veth_txprocessq(struct net_device *ndev, uint32_t maxpkts) +{ + struct qdpc_priv *priv = netdev_priv(ndev); + qdpc_pdring_t *txq = &priv->pktq.pkt_dsq; + qdpc_desc_t *tx_desc; + uint32_t nprocessed = 0; + + for (nprocessed = 0; nprocessed < maxpkts; nprocessed++) { + tx_desc = STAILQ_FIRST(&txq->pd_pending); + if (!tx_desc || !(QDPC_DMA_OWNED(qdpc_pci_readl(&tx_desc->dd_hwdesc->dma_status)) == 0)) { + break; + } + STAILQ_REMOVE_HEAD(&txq->pd_pending, dd_entry); + + qdpc_unmap_buffer(priv, tx_desc, PCI_DMA_TODEVICE); + +#if !defined(QTN_PCIE_USE_LOCAL_BUFFER) + qdpc_tx_skb_recycle((struct sk_buff *)tx_desc->dd_metadata); + tx_desc->dd_metadata = NULL; +#endif + tx_desc->dd_qtime = 0; + } + + txq->pd_nfree += nprocessed; + txq->pd_npending -= nprocessed; + + return nprocessed; +} + +static SRAM_TEXT inline void qdpc_start_txdma(struct qdpc_priv *priv) +{ + qdpc_interrupt_target(priv, QDPC_HOST_TXREADY); +} + +static SRAM_TEXT inline void qdpc_start_rxtasklet(struct qdpc_priv *priv) +{ + qdpc_interrupt_target(priv, QDPC_HOST_START_RX); +} + +SRAM_DATA static int peer_rx_nfree = QDPC_DESC_RING_SIZE; + +static SRAM_TEXT int32_t qdpc_update_peer_nfree(struct qdpc_priv *priv) +{ + int32_t budget; + + budget = qdpc_pci_readl(priv->host_ep2h_txd_budget); + if (budget < 0) { + budget = peer_rx_nfree; + } else { + peer_rx_nfree = budget; + qdpc_pci_writel(-1, priv->host_ep2h_txd_budget); + } + + return budget; +} + +/* TX completion routine, Runs as tasklet/softirq priority */ +SRAM_TEXT void qdpc_veth_txdone(struct net_device *ndev) +{ + struct qdpc_priv *priv = netdev_priv(ndev); + qdpc_pdring_t *txq = &priv->pktq.pkt_dsq; + int32_t npending = (int32_t)txq->pd_npending; + uint32_t high_watermark = txq->pd_ringsize >> 1; + + spin_lock_bh(&txq->pd_lock); + + qdpc_veth_txprocessq(ndev, npending >> 1); + npending = (int32_t)txq->pd_npending; + + if (npending <= high_watermark && netif_queue_stopped(ndev)) { + del_timer(&priv->txq_enable_timer); + netif_wake_queue(ndev); + } else if (npending > high_watermark) { + netif_stop_queue(ndev); + mod_timer(&priv->txq_enable_timer, jiffies + msecs_to_jiffies(QDPC_STOP_QUEUE_TIMER_DELAY)); + } + + spin_unlock_bh(&txq->pd_lock); +} + +inline static SRAM_TEXT unsigned long qdpc_align_val_up(unsigned long val, unsigned long step) +{ + return ((val + step - 1) & (~(step - 1))); +} + +inline SRAM_TEXT int qdpc_send_packet_invalid (struct qdpc_priv *priv, struct sk_buff *skb) +{ + qdpc_pdring_t *txq = &priv->pktq.pkt_dsq; + return (!txq->pd_nextdesc || (!skb->len) || (skb->len > QDPC_MAX_MTU)); +} + +static SRAM_TEXT int qdpc_send_desc_check(struct qdpc_priv *priv, + qdpc_pdring_t *txq) +{ + int32_t ret = 1; + int32_t budget; + unsigned long flags; + + local_irq_save(flags); + if (txq->pd_nfree > QDPC_VETH_TX_LOW_WATERMARK) { + budget = qdpc_update_peer_nfree(priv); + if (budget > (txq->pd_npending + QDPC_VETH_RX_LOW_WATERMARK)) { + peer_rx_nfree--; + ret = 0; + } else { + qdpc_start_rxtasklet(priv); + } + } else { + qdpc_start_txdma(priv); + } + local_irq_restore(flags); + + return ret; +} + +SRAM_TEXT int qdpc_send_packet(struct sk_buff *skb, struct net_device *ndev) +{ + struct qdpc_priv *priv = netdev_priv(ndev); + qdpc_pdring_t *txq = &priv->pktq.pkt_dsq; + qdpc_dmadesc_t* tx_hwdesc; + qdpc_desc_t *tx_desc; + bool lastdesc; + uint32_t dma_len = 0; + void *dma_data; + + if (unlikely(qdpc_send_packet_invalid(priv, skb))) { + DBGPRINTF(DBG_LL_WARNING, QDRV_LF_WARN, + "Xmit packet invalid: len %d\n", skb->len); + dev_kfree_skb_any(skb); + priv->stats.tx_dropped++; + return NETDEV_TX_OK; + } + + spin_lock_bh(&txq->pd_lock); + + if (qdpc_send_desc_check(priv, txq)) { + netif_stop_queue(ndev); + mod_timer(&priv->txq_enable_timer, jiffies + msecs_to_jiffies(QDPC_STOP_QUEUE_TIMER_DELAY)); + spin_unlock_bh(&txq->pd_lock); + + priv->stats.tx_errors++; + return NETDEV_TX_BUSY; + } + + if (skb->len <= priv->epmem.eps_minbuf) { + dma_len = priv->epmem.eps_minbuf; + } else { + dma_len = skb->len & QDPC_DMA_LEN_MASK; + } + + if (unlikely(dma_len >= QDPC_DMA_MAXBUF)) { + spin_unlock_bh(&txq->pd_lock); + DBGPRINTF(DBG_LL_WARNING, QDRV_LF_WARN, + "Xmit packet too big: len %d dmalen %d\n", skb->len, dma_len); + dev_kfree_skb_any(skb); + priv->stats.tx_dropped++; + return NETDEV_TX_OK; + } + + if (unlikely(skb_linearize(skb) != 0)) { + DBGPRINTF(DBG_LL_WARNING, QDRV_LF_WARN, + "WARNING:%u Linearize failed\n", __LINE__); + dev_kfree_skb_any(skb); + priv->stats.tx_dropped++; + return NETDEV_TX_OK; + } + + tx_desc = txq->pd_nextdesc; + tx_hwdesc = tx_desc->dd_hwdesc; + lastdesc = (tx_desc == txq->pd_lastdesc); + + if (lastdesc) { + txq->pd_nextdesc = txq->pd_firstdesc; + } else { + txq->pd_nextdesc++; + } + + +#ifdef QTN_PCIE_USE_LOCAL_BUFFER + /* On X86 copy to local buffer + */ + dma_data = tx_desc->dd_metadata; + memcpy(tx_desc->dd_metadata, skb->data, skb->len); +#else + dma_data = skb->data; + /* Hold onto skb. Release when we get a txdone */ + tx_desc->dd_metadata = skb; +#endif + + tx_desc->dd_vaddr = dma_data; + tx_desc->dd_size = dma_len; + qdpc_map_buffer(priv, tx_desc, PCI_DMA_TODEVICE); + qdpc_pci_writel(tx_desc->dd_paddr + priv->epmem.eps_dma_offset, + &tx_hwdesc->dma_data); + qdpc_pci_writel((QDPC_DMA_SINGLE_TXBUFFER | QDPC_DMA_TX_NOCRC | dma_len | + (lastdesc ? QDPC_DMA_LAST_DESC : 0)), &tx_hwdesc->dma_control); + mmiowb(); /* Memory mapped io barrrier */ + qdpc_pci_writel((QDPC_DMA_OWN), &tx_hwdesc->dma_status); + + /* + * Add delay equivalent to enlarge the IFG + * It's a workaround for BBIC3 RX Run-out + */ +#define RUBY_PCIE_HOST_WR_DELAY 50 + udelay(RUBY_PCIE_HOST_WR_DELAY); + + tx_desc->dd_qtime = jiffies; + STAILQ_INSERT_TAIL(&txq->pd_pending, tx_desc, dd_entry); + txq->pd_nfree--; + txq->pd_npending++; + qdpc_start_txdma(priv); + + spin_unlock_bh(&txq->pd_lock); + + priv->stats.tx_packets++; + priv->stats.tx_bytes += skb->len; + +/* Do this for X86 */ +#ifdef QTN_PCIE_USE_LOCAL_BUFFER + qdpc_tx_skb_recycle(skb); +#endif + + return NETDEV_TX_OK; +} + +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,32) +netdev_tx_t qdpc_veth_tx(struct sk_buff *skb, struct net_device *ndev) +#else +int qdpc_veth_tx(struct sk_buff *skb, struct net_device *ndev) +#endif +{ + return qdpc_send_packet(skb, ndev); +} + +struct net_device_stats *qdpc_veth_stats(struct net_device *ndev) +{ + struct qdpc_priv *priv = netdev_priv(ndev); + + return &priv->stats; +} + +int qdpc_veth_change_mtu(struct net_device *ndev, int new_mtu) +{ + struct qdpc_priv *priv = netdev_priv(ndev); + spinlock_t *lock = &priv->lock; + unsigned long flags; + + /* check ranges */ + if ((new_mtu < QDPC_MIN_MTU) || (new_mtu > QDPC_MAX_MTU)) + return -EINVAL; + + /* + * Do anything you need, and the accept the value + */ + spin_lock_irqsave(lock, flags); + ndev->mtu = new_mtu; + spin_unlock_irqrestore(lock, flags); + + return SUCCESS; /* success */ +} + +int qdpc_veth_set_mac_addr(struct net_device *ndev, void *paddr) +{ + struct sockaddr *addr = (struct sockaddr *)paddr; + + if (netif_running(ndev)) + return -EBUSY; + + /* Check the validity */ + if (!is_valid_ether_addr((const u8 *)addr->sa_data)) + return -EINVAL; + + memcpy(ndev->dev_addr, addr->sa_data, ndev->addr_len); + + return SUCCESS; +} + +int qdpc_init_netdev(struct net_device **net_dev, struct pci_dev *pdev) +{ + struct qdpc_priv *priv; + struct net_device *ndev; + int ret = 0; + + /* Allocate the devices */ + ndev = alloc_netdev(sizeof(struct qdpc_priv), "host%d", ether_setup); + if (!ndev) { + PRINT_ERROR("Error in allocating the net device \n"); + return -ENOMEM; + } + + SET_NETDEV_DEV(ndev, &pdev->dev); + priv = netdev_priv(ndev); + memset(priv, 0, sizeof(struct qdpc_priv)); + priv->pdev = pdev; + priv->ndev = ndev; + pci_set_drvdata(pdev, ndev); +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,29) + ndev->netdev_ops = &veth_ops; +#else + ndev->open = qdpc_veth_open; + ndev->stop = qdpc_veth_release; + ndev->hard_start_xmit = qdpc_veth_tx; + ndev->get_stats = qdpc_veth_stats; + ndev->change_mtu = qdpc_veth_change_mtu; + ndev->set_mac_address = qdpc_veth_set_mac_addr; +#endif + ndev->ethtool_ops = &qdpc_veth_ethtool_ops; + /* Initialize locks */ + spin_lock_init(&priv->lock); + memcpy(ndev->dev_addr, "\0HOST%", ETH_ALEN); + *net_dev = ndev; + + return ret; +} +static void qdpc_veth_get_drvinfo(struct net_device *ndev, + struct ethtool_drvinfo *info) +{ + struct qdpc_priv *priv = netdev_priv(ndev); + struct pci_dev *pci_dev = (struct pci_dev *) priv->pdev; + + strcpy(info->driver, qdpc_pcie_driver_name); + strcpy(info->version, QDPC_MODULE_VERSION); + strcpy(info->fw_version, "N/A"); + strcpy(info->bus_info, pci_name(pci_dev)); + + return; +} + +static void qdpc_get_ethtool_stats(struct net_device *netdev, + struct ethtool_stats *stats, u64 *data) +{ + struct qdpc_priv *priv = netdev_priv(netdev); + int i; + + for (i = 0; i < QDPC_NET_STATS_LEN; i++) { + data[i] = ((unsigned long *)&priv->stats)[i]; + } + + return; +} + +static void qdpc_veth_get_strings(struct net_device *netdev, + u32 stringset, u8 *data) +{ + if (ETH_SS_STATS == stringset) { + memcpy(data, *qdpc_veth_gstrings_stats, sizeof(qdpc_veth_gstrings_stats)); + } + + return; +} + +static int qdpc_veth_get_sset_count(struct net_device *netdev, int sset) +{ + switch (sset) { + case ETH_SS_STATS: + return QDPC_VETH_STATS_LEN; + default: + return -EOPNOTSUPP; + } +} diff --git a/package/firmware/quantenna/src/drivers/pcie/host/common/qdpc_pcie.c b/package/firmware/quantenna/src/drivers/pcie/host/common/qdpc_pcie.c new file mode 100644 index 000000000..97024c5d8 --- /dev/null +++ b/package/firmware/quantenna/src/drivers/pcie/host/common/qdpc_pcie.c @@ -0,0 +1,496 @@ +/** + * Copyright (c) 2011-2013 Quantenna Communications, Inc. + * All rights reserved. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + **/ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "qdpc_config.h" +#include "qdpc_debug.h" +#include "qdpc_init.h" +#include "qdpc_regs.h" +#include "qdpc_ruby.h" +#include + +static irqreturn_t qdpc_isr(int irq, void *dev_id); +static void qdpc_rx_tasklet(void *dev); +static void qdpc_txd_tasklet(void *dev); +static int qdpc_pcie_init_intr(struct net_device *pdev); +static int qdpc_pcie_init_mem(struct net_device *ndev); + +#define MSI_64_EN (1 << 7) + +static void qdpc_tx_runout_func(unsigned long data) +{ + struct qdpc_priv *priv = (struct qdpc_priv*)data; + qdpc_pdring_t *txq = &priv->pktq.pkt_dsq; + int32_t budget = qdpc_pci_readl(priv->host_ep2h_txd_budget); + + tasklet_schedule(&priv->txd_tasklet); + + DBGPRINTF(DBG_LL_WARNING, QDRV_LF_WARN, "Restarting tx queue\n"); + DBGPRINTF(DBG_LL_WARNING, QDRV_LF_WARN, "budget %d, free %d, pending %d\n", + budget, txq->pd_nfree, txq->pd_npending); +} + +int32_t qdpc_pcie_init_intr_and_mem(struct net_device *ndev) +{ + struct qdpc_priv *priv = netdev_priv(ndev); + struct pci_dev *pdev = priv->pdev; + int result = 0; + + /* Initialize interrupts */ + if (( result = qdpc_pcie_init_intr(ndev)) < 0) { + PRINT_ERROR("PCIe Interrupt Initialization failed \n"); + return result; + } + + /* Memory Initialization */ + if (( result = qdpc_pcie_init_mem(ndev)) < 0) { + PRINT_ERROR("PCIe Memory Initialization failed \n"); + qdpc_free_interrupt(pdev); + } + + return result; +} + +static int32_t qdpc_pcie_init_intr(struct net_device *ndev) +{ + struct qdpc_priv *priv = netdev_priv(ndev); + struct pci_dev *pdev = priv->pdev; + int ret = 0, pos = 0; + u16 msi_ctl = 0 ; + + /* Check if the device has MSI capability */ + pos = pci_find_capability(pdev, PCI_CAP_ID_MSI); + if (!pos) { + PRINT_ERROR("Device doesn't have MSI capability INTx will be instead\n"); + } else { + pci_read_config_word(pdev, pos + PCI_MSI_FLAGS, &msi_ctl); + /* Check if the device has enabled MSI */ + if (msi_ctl & PCI_MSI_FLAGS_ENABLE) { + /* Enable MSI support */ + if (!pci_enable_msi(pdev)) { + priv->msi_enabled = 1; + printk("Host using MSI interrupt\n"); + } else { + PRINT_ERROR("Enable MSI fail\n"); + return -1; + } + } else { + PRINT_ERROR("Device doesn't enable MSI capability, INTx will be instead\n"); + } + } + + tasklet_init(&priv->rx_tasklet, (void *)qdpc_rx_tasklet, (unsigned long)ndev); + tasklet_disable(&priv->rx_tasklet); + tasklet_init(&priv->txd_tasklet, (void *)qdpc_txd_tasklet, (unsigned long)ndev); + tasklet_disable(&priv->txd_tasklet); + + priv->txq_enable_timer.function = qdpc_tx_runout_func; + priv->txq_enable_timer.data = (unsigned long)priv; + init_timer(&priv->txq_enable_timer); + + /* Request the interrupt line with HSM device driver name */ +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,22)) + ret = request_irq(pdev->irq, qdpc_isr, + SA_SHIRQ, QDPC_DEV_NAME, ndev); +#else + ret = request_irq(pdev->irq, qdpc_isr, + IRQF_SHARED | IRQF_DISABLED, QDPC_DEV_NAME, ndev); +#endif + + if (ret) { + PRINT_ERROR("Failed to allocate interrupt line %d\n", pdev->irq); + goto out; + } + + return ret; + +out: + if (1 == priv->msi_enabled) { + pci_disable_msi(pdev); + } + + return ret; +} + +static void qdpc_deassert_intx(struct qdpc_priv *priv) +{ + unsigned long pcie_cfg0 = 0x0; + void *basereg = QDPC_BAR_VADDR(priv->sysctl_bar, QDPC_SYSCFG_REG); + + pcie_cfg0 = qdpc_pci_readl(basereg); + if (pcie_cfg0 & BIT(9)) { + pcie_cfg0 &= ~(BIT(9)); + qdpc_pcie_posted_write(pcie_cfg0, basereg); + } +} + +static irqreturn_t qdpc_isr(int irq, void *dev) +{ + struct net_device *ndev = (struct net_device *)dev; + struct qdpc_priv *priv = netdev_priv(ndev); + + uint32_t isrstatus = qdpc_pci_readl(priv->ep2host_irqstatus); + qdpc_pcie_posted_write(0, priv->ep2host_irqstatus); + + if (isrstatus & QDPC_EP_RXDONE) { + tasklet_schedule(&priv->rx_tasklet); + } + + if (isrstatus & QDPC_EP_TXDONE) { + tasklet_schedule(&priv->txd_tasklet); + } + + /* This still needs to be investigated further as this alters the + * contention timing if removed between PCIe and + * the other parts of the BBIC register file + */ + //if (priv->msi_enabled) { + qdpc_deassert_intx(priv); + //} + + return IRQ_HANDLED; +} + +void qdpc_free_interrupt(struct pci_dev *pdev) +{ + struct net_device *ndev = pci_get_drvdata(pdev); + struct qdpc_priv *priv = netdev_priv(ndev); + + free_irq(pdev->irq, ndev); + + if (1 == priv->msi_enabled) { + pci_disable_msi(pdev); + } + + tasklet_kill(&priv->rx_tasklet); + tasklet_kill(&priv->txd_tasklet); + + del_timer(&priv->txq_enable_timer); + + return; +} + +static void qdpc_rx_tasklet(void *dev) +{ + qdpc_veth_rx((struct net_device *)dev); +} + +static void qdpc_txd_tasklet(void *dev) +{ + qdpc_veth_txdone((struct net_device *)dev); +} + +void qdpc_interrupt_target(struct qdpc_priv *priv, uint32_t intr) +{ + unsigned long flags; + void *basereg = QDPC_BAR_VADDR(priv->sysctl_bar, QDPC_H2EP_INTERRUPT); + __iomem uint32_t *irqstatus = priv->host2ep_irqstatus; + + spin_lock_irqsave(&priv->lock, flags); + qdpc_pcie_posted_write((intr)|qdpc_pci_readl(irqstatus), irqstatus); + qdpc_pcie_posted_write(QDPC_H2EP_INTERRUPT_BIT, basereg); + spin_unlock_irqrestore(&priv->lock, flags); +} + +static bool qdpc_bar_check(struct qdpc_priv *priv, qdpc_bar_t *bar) +{ + uint32_t offset = bar->b_offset; + size_t len = bar->b_len; + dma_addr_t busaddr = bar->b_busaddr; + uint8_t index = bar->b_index; + + if (index > 5) { + printk("Invalid BAR index:%u. Must be between 0 and 5\n", index); + return 0; + } + + if (!len) { + /* NOTE: + * Do not use an implicit length such as the BAR length + * if the map length is too large say > 16Mb this leaves + * the implementation vulnerable to + * Linux and the attack of the Silent "S" (one between the n and u) + */ + printk("Zero length BAR\n"); + return 0; + } + + if (busaddr) { /*initialized BAR */ + unsigned long bar_start = pci_resource_start(priv->pdev , index); + unsigned long bar_end = pci_resource_end(priv->pdev , index); + + if (!bar_start) { + printk("Invalid BAR address: 0x%p.\n", (void *)busaddr); + return 0; + } + + if ((busaddr - offset) != bar_start) { + printk("Invalid BAR offset:0x%p. BAR starts at 0x%p\n", + (void *)(busaddr -offset), (void *)bar_start); + return 0; + } + /* Check the span of the BAR including the offset + length, bar_end points to the last byte of BAR */ + if ((busaddr + len - 1) > bar_end) { + printk("Invalid BAR end address:0x%p. BAR ends at 0x%p\n", + (void *)(busaddr + len), (void *)bar_end); + return 0; + } + } else { /* Unitialized bar */ + unsigned long bar_end = pci_resource_end(priv->pdev , index); + busaddr = pci_resource_start(priv->pdev , index); + + if (!busaddr) { + printk("Invalid BAR address: 0x%p.\n", (void *)busaddr); + return 0; + } + + /* Checks that offset area is within bar */ + if ( (busaddr + offset) > bar_end) { + printk("Invalid BAR offset 0x%p, extends beyond end of BAR(0x%p).\n", + (void *)(busaddr + offset), (void *)bar_end); + return 0; + } + + /* Checks that mapped area is within bar */ + if ((busaddr + len + offset - 1) > bar_end) { + printk("Mapped area 0x%p, extends beyond end of BAR(0x%p).\n", + (void *)(busaddr + len + offset - 1), (void *)bar_end); + return 0; + } + } + + return 1; +} + +static qdpc_bar_t *qdpc_map_bar(struct qdpc_priv *priv, qdpc_bar_t *bar, + uint8_t index, size_t len, uint32_t offset) +{ + void *vaddr = NULL; + dma_addr_t busaddr = 0; + qdpc_bar_t temp_bar; + + memset(&temp_bar, 0 ,sizeof(qdpc_bar_t)); + + temp_bar.b_len = len; + temp_bar.b_offset = offset; + temp_bar.b_index = index; + + if (!qdpc_bar_check(priv, &temp_bar)) { + printk("Failed bar mapping sanity check in %s\n", __FUNCTION__); + return NULL; + } + + /* Reserve PCIe memory region*/ + busaddr = pci_resource_start(priv->pdev , index) + offset; + if (!request_mem_region(busaddr, len , QDPC_DEV_NAME)) { + printk("Failed to reserve %u bytes of PCIe memory " + "region starting at 0x%p\n", (uint32_t)len, (void *)busaddr); + return NULL; + } + + vaddr = ioremap_nocache(busaddr, len); + if (!vaddr) { + printk("Failed to map %u bytes at BAR%u at bus address 0x%p.\n", + (uint32_t)len, index, (void *)busaddr); + release_mem_region(busaddr, len); + return NULL; + } + + memset(&temp_bar, 0 ,sizeof(qdpc_bar_t)); + + bar->b_vaddr = vaddr; + bar->b_busaddr = busaddr; + bar->b_len = len; + bar->b_index = index; + bar->b_offset = offset; + + printk("BAR:%u vaddr=0x%p busaddr=%p offset=%u len=%u\n", + bar->b_index, bar->b_vaddr, (void *)bar->b_busaddr, + bar->b_offset, (uint32_t)bar->b_len); + return bar; +} + +static bool qdpc_unmap_bar(struct qdpc_priv *priv, qdpc_bar_t *bar) +{ + if (!qdpc_bar_check(priv, bar)) { + PRINT_ERROR("Failed bar mapping sanity check in %s\n", __FUNCTION__); + return 0; + } + + iounmap(bar->b_vaddr); + release_mem_region(bar->b_busaddr - bar->b_offset, bar->b_len); + memset(bar, 0 , sizeof(qdpc_bar_t)); + + return 1; + +} +static void qdpc_map_epmem(struct qdpc_priv *priv) +{ + printk("%s() Mapping epmem\n", __FUNCTION__); + qdpc_map_bar(priv, &priv->epmem_bar, QDPC_SHMEM_BAR, + pci_resource_len(priv->pdev, QDPC_SHMEM_BAR) , 0); + + priv->bda =(qdpc_pcie_bda_t *)QDPC_BAR_VADDR(priv->epmem_bar, 0); + + /* Init IRQ status pointers */ + priv->host2ep_irqstatus = &priv->bda->bda_h2ep_irqstatus; + priv->ep2host_irqstatus = &priv->bda->bda_ep2h_irqstatus; + + priv->host_ep2h_txd_budget = &priv->bda->bda_ep2h_txd_budget; + priv->host_h2ep_txd_budget = &priv->bda->bda_h2ep_txd_budget; +} + +static void qdpc_map_sysctl_regs(struct qdpc_priv *priv) +{ + printk("%s() Mapping sysctl\n", __FUNCTION__); + qdpc_map_bar(priv, &priv->sysctl_bar, QDPC_SYSCTL_BAR, pci_resource_len(priv->pdev, QDPC_SYSCTL_BAR) , 0); +} + +static void qdpc_unmap_epmem(struct qdpc_priv *priv) +{ + printk("%s() Unmapping sysctl\n", __FUNCTION__); + priv->bda = NULL; + qdpc_unmap_bar(priv, &priv->epmem_bar); +} + +static void qdpc_unmap_sysctl_regs(struct qdpc_priv *priv) +{ + printk("%s() Unmapping sysctl\n", __FUNCTION__); + + qdpc_unmap_bar(priv, &priv->sysctl_bar); +} + +int32_t qdpc_set_dma_mask(struct qdpc_priv *priv) { + int result = 0; + uint64_t dma_mask = qdpc_pci_readl(&priv->bda->bda_dma_mask); + + printk("Requested DMA mask:0x%llx\n", dma_mask); + + result = pci_set_dma_mask(priv->pdev, dma_mask); + if (!result) { + result = pci_set_consistent_dma_mask(priv->pdev, dma_mask); + if (result) { + printk(" pci_set_consistent_dma_mask() error %d. Mask:0x%llx\n", result, dma_mask); + return 1; + } + } else { + printk(" pci_set_dma_mask() error %d. Mask:0x%llx\n", result, dma_mask); + return 1; + } + + return 0; +} +static int32_t qdpc_pcie_init_mem(struct net_device *ndev) +{ + struct qdpc_priv *priv = netdev_priv(ndev); + int ret = 0; + + /* Map SynControl registers and Host to Endpoint interrupt registers to BAR-2 */ + qdpc_map_sysctl_regs(priv); + qdpc_map_epmem(priv); + + /* Initialize Tx and Rx buffers*/ + qdpc_datapath_init(priv); + + return ret; +} + +int qdpc_unmap_iomem(struct qdpc_priv *priv) +{ + qdpc_unmap_epmem(priv); + qdpc_unmap_sysctl_regs(priv); + + return SUCCESS; +} + +int qdpc_dma_setup(struct qdpc_priv *priv) +{ + qdpc_epshmem_hdr_t *shm; + + shm = (qdpc_epshmem_hdr_t *)QDPC_BAR_VADDR(priv->epmem_bar, sizeof(qdpc_pcie_bda_t)); + + priv->epmem.eps_mapsize = qdpc_pci_readl(&shm->eps_mapsize); + priv->epmem.eps_ver = qdpc_pci_readl(&shm->eps_ver); + priv->epmem.eps_size = qdpc_pci_readl(&shm->eps_size); + priv->epmem.eps_dma_offset = qdpc_pci_readl(&shm->eps_dma_offset); + + priv->epmem.eps_dsdma_desc = qdpc_pci_readl(&shm->eps_dsdma_desc); + priv->epmem.eps_usdma_desc = qdpc_pci_readl(&shm->eps_usdma_desc); + + priv->epmem.eps_dsdma_ndesc = qdpc_pci_readl(&shm->eps_dsdma_ndesc); + priv->epmem.eps_usdma_ndesc = qdpc_pci_readl(&shm->eps_usdma_ndesc); + + priv->epmem.eps_maxbuf = qdpc_pci_readl(&shm->eps_maxbuf); + priv->epmem.eps_minbuf = qdpc_pci_readl(&shm->eps_minbuf); + priv->epmem.eps_align = qdpc_pci_readl(&shm->eps_align); + + printk("Remaddr: 0x%p Size:%u\n", (void *)shm, priv->epmem.eps_mapsize); + + printk("Shmem: Len:%u Maplen:%u Ver0x%x\nUSDesc %u@0x%x DSDesc %u@0x%x DMA:%u/%u/%u\n", + priv->epmem.eps_size, priv->epmem.eps_mapsize, priv->epmem.eps_ver, + priv->epmem.eps_usdma_ndesc, priv->epmem.eps_usdma_desc, + priv->epmem.eps_dsdma_ndesc, priv->epmem.eps_dsdma_desc, + priv->epmem.eps_maxbuf, priv->epmem.eps_minbuf, priv->epmem.eps_align); + + if (qdpc_dmainit_rxq(priv) < 0) { + printk("RX Queue DMA fail to initialize.\n"); + return FAILURE; + } + + if (qdpc_dmainit_txq(priv) < 0) { + printk("TX Queue DMA fail to initialize.\n"); + return FAILURE; + } + + return SUCCESS; +} + +void qdpc_pcie_free_mem(struct pci_dev *pdev) +{ + return; +} + +void *qdpc_map_pciemem(unsigned long busaddr, size_t len) +{ + /* Reserve PCIe memory region*/ + if (!request_mem_region(busaddr, len, QDPC_DEV_NAME)) { + PRINT_ERROR(KERN_ERR "Failed to reserve %u bytes of " + "PCIe memory region starting at 0x%lx\n", (uint32_t)len, busaddr); + return NULL; + } + return ioremap_nocache(busaddr, len); +} + +void qdpc_unmap_pciemem(unsigned long busaddr, void *vaddr, size_t len) +{ + if (!vaddr || !busaddr) + return; + iounmap(vaddr); + release_mem_region(busaddr, len); +} diff --git a/package/firmware/quantenna/src/drivers/pcie/host/common/qdpc_regs.h b/package/firmware/quantenna/src/drivers/pcie/host/common/qdpc_regs.h new file mode 100644 index 000000000..02bc9dca7 --- /dev/null +++ b/package/firmware/quantenna/src/drivers/pcie/host/common/qdpc_regs.h @@ -0,0 +1,29 @@ +/** + * Copyright (c) 2011-2013 Quantenna Communications, Inc. + * All rights reserved. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + **/ +#ifndef __QDPC_REGS_H__ +#define __QDPC_REGS_H__ + +#define QDPC_SYSCTL_BAR 0 +#define QDPC_SHMEM_BAR 2 + +#define QDPC_H2EP_INTERRUPT 0x3c +#define QDPC_SYSCFG_REG 0x6c + +#endif //__QDPC_REGS_H__ + diff --git a/package/firmware/quantenna/src/drivers/pcie/host/common/qdpc_ring.c b/package/firmware/quantenna/src/drivers/pcie/host/common/qdpc_ring.c new file mode 100644 index 000000000..a5813ef4c --- /dev/null +++ b/package/firmware/quantenna/src/drivers/pcie/host/common/qdpc_ring.c @@ -0,0 +1,207 @@ +/** + * Copyright (c) 2011-2013 Quantenna Communications, Inc. + * All rights reserved. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + **/ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "qdpc_config.h" +#include "qdpc_debug.h" +#include "qdpc_init.h" +#include "qdpc_regs.h" +#include "qdpc_ruby.h" + +int qdpc_dmainit_txq(struct qdpc_priv *priv) +{ + uint32_t i; + qdpc_pdring_t *txq; + uint32_t ringsize = priv->epmem.eps_dsdma_ndesc; + + /* Downstream TX queue */ + txq = &priv->pktq.pkt_dsq; + txq->pd_hwdesc = (qdpc_dmadesc_t *)QDPC_BAR_VADDR(priv->epmem_bar, priv->epmem.eps_dsdma_desc); + +#ifdef QTN_PCIE_USE_LOCAL_BUFFER + /* Downstream TX data . Temporary buffer used for bringup on X86*/ + priv->dsdata = kmalloc(ringsize * sizeof(qdpc_dmadata_t), GFP_KERNEL | GFP_DMA); + if (!(priv->dsdata)) { + printk("ERROR: TX DMA allocation fails.\n"); + return -1; + } + printk("TX DMA bounce buffers: 0x%p\n", priv->dsdata); +#endif + + /* Initialize Downstream TX queue */ + spin_lock_init(&txq->pd_lock); + STAILQ_INIT(&txq->pd_pending); + txq->pd_ringsize = ringsize; + txq->pd_nfree = txq->pd_ringsize; + txq->pd_npending = 0; + + memset(txq->pd_desc, 0, sizeof(txq->pd_desc)); + memset(txq->pd_hwdesc, 0, (ringsize*sizeof(qdpc_dmadesc_t))); + for (i = 0 ; i < txq->pd_ringsize ; i++) + { + /* Buffer contains entire packet */ + txq->pd_desc[i].dd_hwdesc = &txq->pd_hwdesc[i]; + txq->pd_desc[i].dd_paddr = 0; + qdpc_pci_writel((QDPC_DMA_SINGLE_TXBUFFER | QDPC_DMA_TX_NOCRC), + &txq->pd_hwdesc[i].dma_control); + qdpc_pci_writel(0, &txq->pd_hwdesc[i].dma_status); + mmiowb(); /* Flush out writes */ + +#ifdef QTN_PCIE_USE_LOCAL_BUFFER + /* X86 only attach local buffer */ + txq->pd_desc[i].dd_metadata = &priv->dsdata[i]; +#endif + } + /* Mark end of buffer */ + qdpc_pci_writel((QDPC_DMA_LAST_DESC) | qdpc_pci_readl(&txq->pd_hwdesc[i-1].dma_control), + &txq->pd_hwdesc[i-1].dma_control); + txq->pd_lastdesc = &txq->pd_desc[i-1]; + txq->pd_firstdesc = &txq->pd_desc[0]; + txq->pd_nextdesc = txq->pd_firstdesc; + + printk("ringsize = %d txq->pd_hwdesc = 0x%p\n", ringsize, &txq->pd_hwdesc[0]); + for (i = 0; i < (ringsize < 16 ? ringsize : 16); i++) + printk("0x%p:td0=0x%x t1=0x%x t2=0x%x\n", &txq->pd_hwdesc[i], + qdpc_pci_readl(&(txq->pd_hwdesc[i].dma_status)), + qdpc_pci_readl(&(txq->pd_hwdesc[i].dma_control)), + qdpc_pci_readl(&(txq->pd_hwdesc[i].dma_data))); + + return 0; + +} + +int qdpc_dmainit_rxq(struct qdpc_priv *priv) +{ + uint32_t i; + qdpc_dmadesc_t *rx_hwdesc = NULL; + uint32_t buffer_size = QDPC_DMA_MAXBUF; + + qdpc_pdring_t *rxq = &priv->pktq.pkt_usq; + uint32_t ringsize = priv->epmem.eps_usdma_ndesc; +#if !defined(QTN_PCIE_USE_LOCAL_BUFFER) + struct sk_buff *skb; +#endif + + spin_lock_init(&rxq->pd_lock); + rxq->pd_ringsize = ringsize; + +/* X86 workaround to use local buffer */ +#ifdef QTN_PCIE_USE_LOCAL_BUFFER + priv->usdata = kmalloc(ringsize * sizeof(qdpc_dmadata_t), GFP_KERNEL | GFP_DMA); + if (!(priv->usdata)) { + printk("ERROR: RX DMA allocation fails.\n"); + return -1; + } + printk("RX DMA bounce buffers: 0x%p\n", priv->usdata); +#endif + rxq->pd_hwdesc = (qdpc_dmadesc_t *)QDPC_BAR_VADDR(priv->epmem_bar, priv->epmem.eps_usdma_desc); + for (i = 0 ; i < ringsize; i++) { + rx_hwdesc = &rxq->pd_hwdesc[i]; + rxq->pd_desc[i].dd_hwdesc = &rxq->pd_hwdesc[i]; + +/* X86 workaround to use local buffer */ +#ifdef QTN_PCIE_USE_LOCAL_BUFFER + rxq->pd_desc[i].dd_metadata = &priv->usdata[i]; + rxq->pd_desc[i].dd_vaddr = rxq->pd_desc[i].dd_metadata; +#else + skb = qdpc_get_skb(priv, buffer_size); + skb->len = 0; + rxq->pd_desc[i].dd_metadata = (void*)skb; + rxq->pd_desc[i].dd_vaddr = skb->data; + memset(skb->data, 0, buffer_size); +#endif + + rxq->pd_desc[i].dd_size = buffer_size; + rxq->pd_desc[i].dd_paddr = pci_map_single(priv->pdev, rxq->pd_desc[i].dd_vaddr, + rxq->pd_desc[i].dd_size, PCI_DMA_FROMDEVICE); + +#if !defined(CONFIG_ARCH_ARC) + if (pci_dma_mapping_error(priv->pdev, rxq->pd_desc[i].dd_paddr)) { + printk("%s(), ERROR: pci_map_single fails.\n", __func__); + return -1; + } +#endif + + qdpc_pci_writel(rxq->pd_desc[i].dd_paddr + priv->epmem.eps_dma_offset, + &rx_hwdesc->dma_data); + qdpc_pci_writel((buffer_size & QDPC_DMA_LEN_MASK), &rx_hwdesc->dma_control); + qdpc_pci_writel(0, &rx_hwdesc->dma_ptr); + qdpc_pci_writel(QDPC_DMA_OWN, &rx_hwdesc->dma_status); + mmiowb(); /* Flush out writes */ + + } + + /* Mark end of buffer */ + qdpc_pci_writel((QDPC_DMA_LAST_DESC) | qdpc_pci_readl(&rx_hwdesc->dma_control), + &rx_hwdesc->dma_control); + rxq->pd_desc[rxq->pd_ringsize - 1].dd_flags |= QDPC_DMA_LAST_DESC; + rxq->pd_lastdesc = &rxq->pd_desc[rxq->pd_ringsize - 1]; + rxq->pd_firstdesc = &rxq->pd_desc[0]; + rxq->pd_nextdesc = rxq->pd_firstdesc; + + printk("ringsize = %d rxq->pd_hwdesc = 0x%p\n", ringsize, &rxq->pd_hwdesc[0]); + for (i = 0; i < (ringsize < 16 ? ringsize : 16); i++) { + printk("0x%p:rd0=0x%x r1=0x%x r2=0x%x\n", &rxq->pd_hwdesc[i], + qdpc_pci_readl(&(rxq->pd_hwdesc[i].dma_status)), + qdpc_pci_readl(&(rxq->pd_hwdesc[i].dma_control)), + qdpc_pci_readl(&(rxq->pd_hwdesc[i].dma_data))); + } + return 0; +} + +int qdpc_dmauninit_txq(struct qdpc_priv *priv) +{ +#ifdef QTN_PCIE_USE_LOCAL_BUFFER + kfree(priv->dsdata); +#endif + return 0; +} + +int qdpc_dmauninit_rxq(struct qdpc_priv *priv) +{ +#ifdef QTN_PCIE_USE_LOCAL_BUFFER + kfree(priv->usdata); +#endif + return 0; +} + +void qdpc_datapath_init(struct qdpc_priv *priv) +{ + /* Init DMA ring buffers */ + priv->pktq.pkt_usq.pd_nextdesc = NULL; + priv->pktq.pkt_dsq.pd_nextdesc = NULL; + + return; +} + +void qdpc_datapath_uninit(struct qdpc_priv *priv) +{ + qdpc_dmauninit_txq(priv); + qdpc_dmauninit_rxq(priv); +} diff --git a/package/firmware/quantenna/src/drivers/pcie/host/intel/Makefile b/package/firmware/quantenna/src/drivers/pcie/host/intel/Makefile new file mode 100644 index 000000000..6d347aff6 --- /dev/null +++ b/package/firmware/quantenna/src/drivers/pcie/host/intel/Makefile @@ -0,0 +1,34 @@ +# +# Makefile for Intel platform +# + +COMMON_DIR := ../common +MAIN_INCLUDES := $(PWD)/../../include +INCLUDES := -I$(COMMON_DIR) -I$(PWD) -I$(MAIN_INCLUDES) + +EXTRA_CFLAGS += -Winline -Wall -O2 $(INCLUDES) +EXTRA_CFLAGS += -DQTN_PCIE_USE_LOCAL_BUFFER +#EXTRA_CFLAGS += -DDEBUG + +KVERSION = $(shell uname -r) + +default: all + +qdpc-host-objs := $(COMMON_DIR)/qdpc_ring.o \ + $(COMMON_DIR)/qdpc_net.o \ + $(COMMON_DIR)/qdpc_pcie.o \ + $(COMMON_DIR)/qdpc_init.o + +obj-m := qdpc-host.o + +qdpc_host.o: $(qdpc-host-objs) + ld -r $^ -o $@ + +all: + make -C /lib/modules/$(KVERSION)/build M=$(PWD) modules + +clean: + make -C /lib/modules/$(KVERSION)/build M=$(PWD) clean + rm -rf $(COMMON_DIR)/.*.cmd $(COMMON_DIR)/.tmp_versions + rm -rf Module.markers modules.order *~ $(qdpc-host-objs) + diff --git a/package/firmware/quantenna/src/drivers/pcie/host/intel/qdpc_platform.h b/package/firmware/quantenna/src/drivers/pcie/host/intel/qdpc_platform.h new file mode 100644 index 000000000..e2155ebf4 --- /dev/null +++ b/package/firmware/quantenna/src/drivers/pcie/host/intel/qdpc_platform.h @@ -0,0 +1,39 @@ +/** + * Copyright (c) 2011-2013 Quantenna Communications, Inc. + * All rights reserved. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + **/ +#ifndef __QDPC_PFDEP_H__ +#define __QDPC_PFDEP_H__ + +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,27) +#define IOREMAP ioremap_wc +#else /* LINUX_VERSION_CODE < KERNEL_VERSION(2,6,27) */ +#define IOREMAP ioremap +#endif + +#define qdpc_platform_init() 0 +#define qdpc_platform_exit() do { } while(0) +#define qdpc_platform_xfer(dst, src, len) memcpy_toio(dst, src, len) + +#define SRAM_TEXT +#define SRAM_DATA + +#endif /* __QDPC_PFDEP_H__ */ + + + + diff --git a/package/firmware/quantenna/src/drivers/pcie/host/lantiq/Makefile b/package/firmware/quantenna/src/drivers/pcie/host/lantiq/Makefile new file mode 100755 index 000000000..ed9a57570 --- /dev/null +++ b/package/firmware/quantenna/src/drivers/pcie/host/lantiq/Makefile @@ -0,0 +1,24 @@ +# +# Makefile for Lantiq platform +# + +COMMON_DIR := ../common + +EXTRA_CFLAGS += -DOUTBOUND_HW_SWAP + +default: all +qdpc-host-objs := $(COMMON_DIR)/qdpc_ring.o \ + $(COMMON_DIR)/qdpc_net.o \ + $(COMMON_DIR)/qdpc_pcie.o \ + $(COMMON_DIR)/qdpc_init.o + +obj-m := qdpc-host.o + +all: + $(MAKE) -C $(kernel_source) SUBDIRS=`pwd` modules; + +clean: + rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions Module.symvers + rm -rf $(COMMON_DIR)/.*.cmd $(COMMON_DIR)/.tmp_versions + rm -rf Module.markers modules.order $(qdpc-host-objs) + diff --git a/package/firmware/quantenna/src/drivers/pcie/host/lantiq/qdpc_platform.h b/package/firmware/quantenna/src/drivers/pcie/host/lantiq/qdpc_platform.h new file mode 100755 index 000000000..57281ec8f --- /dev/null +++ b/package/firmware/quantenna/src/drivers/pcie/host/lantiq/qdpc_platform.h @@ -0,0 +1,39 @@ +/** + * Copyright (c) 2011-2013 Quantenna Communications, Inc. + * All rights reserved. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + **/ +#ifndef __QDPC_PFDEP_H__ +#define __QDPC_PFDEP_H__ + +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,27) +#define IOREMAP ioremap_wc +#else /* LINUX_VERSION_CODE < KERNEL_VERSION(2,6,27) */ +#define IOREMAP ioremap +#endif + +#define qdpc_platform_init() 0 +#define qdpc_platform_exit() do { } while(0) +#define qdpc_platform_xfer(dst, src, len) memcpy_toio(dst, src, len) + +#define SRAM_TEXT +#define SRAM_DATA + +#endif /* __QDPC_PFDEP_H__ */ + + + + diff --git a/package/firmware/quantenna/src/drivers/pcie/host/quantenna/Makefile b/package/firmware/quantenna/src/drivers/pcie/host/quantenna/Makefile new file mode 100644 index 000000000..ca4ba9d59 --- /dev/null +++ b/package/firmware/quantenna/src/drivers/pcie/host/quantenna/Makefile @@ -0,0 +1,57 @@ +# +# Makefile for Quantenna RC paltform +# +# + +PCIE_HOST_BASE = ../drivers/pcie/host/ + +EXTRA_CFLAGS += -Wall \ + -I../include \ + -I$(src)/../../../drivers \ + -I$(src)/../../../include \ + -I$(src)/../../include \ + -I$(src)/../common \ + -I$(src)/../quantenna + +EXTRA_CFLAGS += -mlong-calls + +ifeq (${PCIE_HOST_CRUMBS},1) +EXTRA_CFLAGS += -finstrument-functions +endif + +#EXTRA_CFLAGS += -DDEBUG + +ifneq ($(KERNELRELEASE),) +COMMON_DIR := ../common +qdpc-host-objs := $(COMMON_DIR)/qdpc_ring.o \ + $(COMMON_DIR)/qdpc_net.o \ + $(COMMON_DIR)/qdpc_pcie.o \ + $(COMMON_DIR)/qdpc_init.o + +obj-m := qdpc-host.o + +else + +KERNELDIR ?= ../../../../linux +INSTALL = INSTALL_MOD_PATH=../linux/modules +CROSS = ARCH=arc CROSS_COMPILE=/usr/local/ARC/gcc/bin/arc-linux-uclibc- +PWD := $(shell pwd) + +default: + $(MAKE) -C $(KERNELDIR) $(CROSS) M=$(PWD) modules + +install: + $(MAKE) -C $(KERNELDIR) $(CROSS) $(INSTALL) M=$(PWD) modules_install + +endif + +clean: + rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions Module.symvers modules.order + rm -rf $(COMMON_DIR)/.*.cmd $(COMMON_DIR)/.tmp_versions $(COMMON_DIR)/*.o + +depend .depend dep: + $(CC) $(CFLAGS) -M *.c > .depend + +ifeq (.depend,$(wildcard .depend)) +include .depend +endif diff --git a/package/firmware/quantenna/src/drivers/pcie/host/quantenna/qdpc_platform.h b/package/firmware/quantenna/src/drivers/pcie/host/quantenna/qdpc_platform.h new file mode 100644 index 000000000..25d9ad8f8 --- /dev/null +++ b/package/firmware/quantenna/src/drivers/pcie/host/quantenna/qdpc_platform.h @@ -0,0 +1,39 @@ +/** + * Copyright (c) 2011-2013 Quantenna Communications, Inc. + * All rights reserved. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + **/ +#ifndef __QDPC_PFDEP_H__ +#define __QDPC_PFDEP_H__ + +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,27) +#define IOREMAP ioremap_nocache +#else /* LINUX_VERSION_CODE < KERNEL_VERSION(2,6,27) */ +#define IOREMAP ioremap +#endif + +#define qdpc_platform_init() 0 +#define qdpc_platform_exit() do { } while(0) +#define qdpc_platform_xfer(dst, src, len) memcpy_toio(dst, src, len) + +#define SRAM_TEXT __sram_text +#define SRAM_DATA __sram_data + +#endif /* __QDPC_PFDEP_H__ */ + + + + diff --git a/package/firmware/quantenna/src/drivers/pcie/include/qdpc_config.h b/package/firmware/quantenna/src/drivers/pcie/include/qdpc_config.h new file mode 100644 index 000000000..d9f146505 --- /dev/null +++ b/package/firmware/quantenna/src/drivers/pcie/include/qdpc_config.h @@ -0,0 +1,373 @@ +/** + * Copyright (c) 2011-2013 Quantenna Communications, Inc. + * All rights reserved. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + **/ +#ifndef __QDPC_CONFIG_H__ +#define __QDPC_CONFIG_H__ + +/* Global debug log messsage function mask definition of the moudle pcie */ +#define QDRV_LF_TRACE 0x00000001 +#define QDRV_LF_WARN 0x00000002 +#define QDRV_LF_ERROR 0x00000004 +#define QDRV_LF_PKT_RX 0x00000008 +#define QDRV_LF_PKT_TX 0x00000010 +#define QDRV_LF_ALL 0x0000001F +#define DBG_LM DBG_LM_QPCIE +#define DBGFMT "%s-%d: " +#define DBGARG __func__, __LINE__ + +#define DBGPRINTF(ll, lf, fmt, ...) \ + do { \ + if(printk_ratelimit()) { \ + printk(DBGFMT fmt, DBGARG, ##__VA_ARGS__); \ + } \ + } while(0) + + +/* Configuration parameters for desc ring */ + +#define QDPC_PCIE_AGGRESSIVE_LEVEL 0 + +#define QDPC_DESC_RING_SIZE 256 /* Max. number of descriptors in a ring */ +#define QDPC_STOP_QUEUE_TIMER_DELAY (20) + +#if (QDPC_PCIE_AGGRESSIVE_LEVEL==1) +#define QDPC_USE_SKB_RECYCLE 1 + +#define QDPC_DESC_USRING_SIZE (QDPC_DESC_RING_SIZE >> 1) +#define QDPC_DESC_DSRING_SIZE (QDPC_DESC_RING_SIZE >> 1) + +#define QDPC_VETH_TX_LOW_WATERMARK ((QDPC_DESC_RING_SIZE >> 3) + 8) +#define QDPC_VETH_RX_LOW_WATERMARK ((QDPC_DESC_RING_SIZE >> 1) - (QDPC_VETH_TX_LOW_WATERMARK) + 16) + +#else + +#define QDPC_DESC_USRING_SIZE (QDPC_DESC_RING_SIZE >> 1) +#define QDPC_DESC_DSRING_SIZE (QDPC_DESC_RING_SIZE >> 1) + +#define QDPC_VETH_TX_LOW_WATERMARK ((QDPC_DESC_RING_SIZE >> 2) + 8) +#define QDPC_VETH_RX_LOW_WATERMARK (QDPC_DESC_RING_SIZE >> 1) +#endif + +#define QDPC_SHARED_MEM_SIZE (sizeof(qdpc_epbuf_t)) + +#define QDPC_DMA_ALIGN 8 +#define QDPC_MIN_MTU 60 +#define QDPC_MAX_MTU 1518 +#define QDPC_MIN_FRAMESZ 64 +#define QDPC_DMA_MAXBUF 1600 +#define QDPC_DMA_MINBUF 64 +#define QDPC_MAX_FRAMESZ QDPC_DMA_MAXBUF +#define QDPC_MAX_JABBER ((QDPC_MAX_FRAMESZ) + 128) + +#define QDPC_MAC_ADDR_SIZE 6 + +#define QDPC_PKT_DATA_OFFSET 40 /* NET_IP_ALIGN+NET_SKB_PAD */ +#define QDPC_PKT_DATA_INTF_GAP 64 /* Inter-Frame Gap */ +#define QDPC_PKT_HEADROOM (NET_IP_ALIGN + NET_SKB_PAD) + +#define QDPC_H2EP_INTERRUPT_BIT BIT(31) +#define QDPC_H2EP_INTERRUPT_MASK BIT(31) + +#define QDPC_EP_TXDONE BIT(1) +#define QDPC_EP_RXDONE BIT(2) +#define QDPC_EP_STOPQ BIT(3) + +#define QDPC_HOST_TXREADY BIT(1) +#define QDPC_HOST_ENABLEDMA BIT(2) +#define QDPC_HOST_TXDONE BIT(3) +#define QDPC_HOST_START_RX BIT(4) + +#define QDPC_DMA_OWN BIT(31) +#define QDPC_DMA_LAST_DESC BIT(26) +#define QDPC_DMA_TX_LASTSEG BIT(30) +#define QDPC_DMA_TX_FIRSTSEG BIT(29) +#define QDPC_DMA_TX_NOCRC BIT(28) + +#define QDPC_DMA_RX_LASTSEG BIT(29) +#define QDPC_DMA_RX_FIRSTSEG BIT(30) +#define QDPC_DMA_MASK_BITS(nbits) ((nbits) ? (BIT(nbits) - 1) : 0) +#define QDPC_DMA_LEN_MASK (QDPC_DMA_MASK_BITS(12)) + +#define QDPC_DMA_RXLEN(x) ((x) & QDPC_DMA_LEN_MASK) + +#define QDPC_DMA_OWNED(x) ((x) & QDPC_DMA_OWN) + +#define QDPC_DMA_SINGLE_TXBUFFER (QDPC_DMA_TX_LASTSEG | QDPC_DMA_TX_FIRSTSEG) +#define QDPC_DMA_SINGLE_RXBUFFER (QDPC_DMA_RX_LASTSEG | QDPC_DMA_RX_FIRSTSEG) +#define QDPC_DMA_SINGLE_BUFFER(x) (((x) & QDPC_DMA_SINGLE_RXBUFFER) == QDPC_DMA_SINGLE_RXBUFFER) + +#define QDPC_DMA_TX_DONE BIT(31) + +/* + * Using Type/Length field for checking if data packet or + * netlink packet(call_qcsapi remote interface). + * Using 0x0601 as netlink packet type and MAC magic number(Quantenna OUI) + * to distinguish netlink packet + */ +#define QDPC_APP_NETLINK_TYPE 0x0601 +#define QDPC_NETLINK_DST_MAGIC "\x00\x26\x86\x00\x00\x00" +#define QDPC_NETLINK_SRC_MAGIC "\x00\x26\x86\x00\x00\x00" +typedef struct qdpc_cmd_hdr { + uint8_t dst_magic[ETH_ALEN]; + uint8_t src_magic[ETH_ALEN]; + __be16 type; + __be16 len; +}qdpc_cmd_hdr_t; + +/* State of the driver. This is used to syncronize with target during init. */ +enum qdpc_drv_state +{ + QDPC_NO_INIT, /* Uninitialized */ + QDPC_INIT, /* Init */ + QDPC_CONN_EST, /* In sync state */ + QDPC_EXIT +}; + +struct qdpc_init_info { + uint32_t handshake; + uint32_t remote_mem; + uint32_t remote_memsz; + uint8_t mac_addr[QDPC_MAC_ADDR_SIZE]; /* MAC of Ruby board */ +}; + +typedef struct qdpc_init_info qdpc_init_info_t; + +/* + * Use this as the start to specify the structure ofthe shared memory area with the EP. + * + * The area is mapped as both inbound and outbound + * On the EP is starts at 0xC200 0000 as before + * + * + * The EMAC0 DMA will read from the descriptor block below across the PCIe bus + * The 4Mb shared memory buffer on the EP is no longer necessary + * + * Ignore the work OC has done + * + * For RX: The RX DMA descriptors map to the top of the buffer as shown + * and continues to use the OC buffer scheme for now. + * Once the TX buffer descriptor work is completed, this will be removed and + * a similar DMA buffer scheme like the TX one will be used as its replacement + * For TX: On X86 memcpy the skb data to the TX data area and update the descriptor + */ + + +/* Hardware DMA descriptor + * This is the hardware format used by the Arasan EMAC + */ +typedef struct qdpc_dmadesc { + uint32_t dma_status; + uint32_t dma_control; + uint32_t dma_data; + uint32_t dma_ptr; +} __attribute__ ((packed)) qdpc_dmadesc_t; + +/* DMA data area */ +typedef struct qdpc_dmadata { + uint8_t dma_data[QDPC_DMA_MAXBUF]; +} __attribute__ ((packed)) qdpc_dmadata_t; + + +#include "queue.h" +/* + * TX software descriptor + * Must be aligned on a 32bit boundary + */ +struct qdpc_desc { + /* hardware DMA descriptor */ + qdpc_dmadesc_t *dd_hwdesc; + + /* Metadata pointer used for things like the skb associated with the buffer */ + void *dd_metadata; + void *dd_vaddr; + uint32_t dd_paddr; + size_t dd_size; + + uint32_t dd_flags; + uint64_t dd_qtime; + + /* Linked list entry */ + STAILQ_ENTRY(qdpc_desc) dd_entry; +} __attribute__ ((aligned (8))); + +typedef struct qdpc_desc qdpc_desc_t; + +/* Packet DMA ring */ +typedef struct qdpc_pdring { + /* Size of ring */ + uint32_t pd_ringsize; + + /* + * Number of free descriptors + */ + uint32_t pd_nfree; + uint32_t pd_npending; + uint32_t pd_tx_basereg; + uint32_t pd_rx_basereg; + uint32_t pd_highwatermark; + uint32_t pd_lowatermark; + + /* Location of the next free descriptor + * Initialize to the first descriptor in the ring. + * It must increase in one direction only and wrap around when the end of the ring is reached. + * Increase by 1 each time a pkt is queued + */ + + qdpc_desc_t *pd_nextdesc; + qdpc_desc_t *pd_lastdesc; + qdpc_desc_t *pd_firstdesc; + + + /* Start of HW descriptor block */ + qdpc_dmadesc_t *pd_hwdesc; + + /* Bus Address of HW descriptor block */ + uint32_t pd_src_busaddr; + uint32_t pd_dst_busaddr; + void * pd_handle; + + /* txq spinlock */ + spinlock_t pd_lock; /* Packet enqueue/dequeue lock */ + + /* Status flags */ + uint32_t pd_f_dma_active:1; /* DMA fetch in progress */ + + /* Pending list of buffers owned by DMA hardware */ + STAILQ_HEAD(qdpc_pdpend, qdpc_desc) pd_pending; + + /* Descriptor pool */ + qdpc_desc_t pd_desc[QDPC_DESC_RING_SIZE]; + uint8_t *src_macaddr; + +} qdpc_pdring_t; + + +typedef struct qdpc_pktring { + qdpc_pdring_t pkt_usq; + qdpc_pdring_t pkt_dsq; +} qdpc_pktring_t; + +#define QDPC_PCIE_BDA_VERSION 0x1000 + +#define QDPC_BDA_PCIE_INIT 0x01 +#define QDPC_BDA_PCIE_RDY 0x02 +#define QDPC_BDA_FW_LOAD_RDY 0x03 +#define QDPC_BDA_FW_LOAD_DONE 0x04 +#define QDPC_BDA_FW_START 0x05 +#define QDPC_BDA_FW_RUN 0x06 +#define QDPC_BDA_FW_HOST_RDY 0x07 +#define QDPC_BDA_FW_TARGET_RDY 0x11 +#define QDPC_BDA_FW_TARGET_BOOT 0x12 +#define QDPC_BDA_FW_FLASH_BOOT 0x13 +#define QDPC_BDA_FW_HOST_LOAD 0x08 +#define QDPC_BDA_FW_BLOCK_DONE 0x09 +#define QDPC_BDA_FW_BLOCK_RDY 0x0A +#define QDPC_BDA_FW_EP_RDY 0x0B +#define QDPC_BDA_FW_BLOCK_END 0x0C +#define QDPC_BDA_FW_CONFIG 0x0D +#define QDPC_BDA_FW_RUNNING 0x0E + + +#define QDPC_BDA_PCIE_FAIL 0x82 +#define QDPC_BDA_FW_LOAD_FAIL 0x85 + + +#define PCIE_BDA_RCMODE BIT(1) +#define PCIE_BDA_MSI BIT(2) +#define PCIE_BDA_BAR64 BIT(3) +#define PCIE_BDA_FLASH_PRESENT BIT(4) /* Tell the Host if EP have flash contain firmware */ +#define PCIE_BDA_FLASH_BOOT BIT(5) /* Tell TARGET to boot from flash */ +#define PCIE_BDA_TARGET_FBOOT_ERR BIT(8) /* TARGET flash boot failed */ +#define PCIE_BDA_TARGET_FWLOAD_ERR BIT(9) /* TARGET firmware load failed */ +#define PCIE_BDA_HOST_NOFW_ERR BIT(12) /* Host not find any firmware */ +#define PCIE_BDA_HOST_MEMALLOC_ERR BIT(13) /* Host malloc firmware download memory block failed */ +#define PCIE_BDA_HOST_MEMMAP_ERR BIT(14) /* Host pci map download memory block failed */ +#define PCIE_BDA_VER(x) (((x) >> 4) & 0xFF) +#define PCIE_BDA_ERROR_MASK 0xFF00 /* take the second 8 bits as error flag */ + + +#define PCIE_BDA_NAMELEN 32 + +#define QDPC_PCI_ENDIAN_DETECT_DATA 0x12345678 +#define QDPC_PCI_ENDIAN_REVERSE_DATA 0x78563412 + +#define QDPC_PCI_ENDIAN_VALID_STATUS 0x3c3c3c3c +#define QDPC_PCI_ENDIAN_INVALID_STATUS 0 + +#define QDPC_PCI_LITTLE_ENDIAN 0 +#define QDPC_PCI_BIG_ENDIAN 0xffffffff + +#define QDPC_SCHED_TIMEOUT (HZ / 20) + + +typedef struct qdpc_pcie_board_cfg { + int bc_board_id; + char *bc_name; /* optional name of cfg */ + int bc_ddr_type; /* ID */ + int bc_ddr_speed; /* speed in MHz */ + int bc_ddr_size; /* in bytes */ + int bc_emac0; /* in use? */ + int bc_emac1; /* in use? */ + int bc_phy0_addr; /* address */ + int bc_phy1_addr; /* address */ + int bc_spi1; /* in use? */ + int bc_wifi_hw; /* WiFi hardware type */ + int bc_uart1; /* in use? */ + int bc_pcie; /* in use? */ + int bc_rgmii_timing; /* special timing value for RGMII */ +} __attribute__ ((packed)) qdpc_pcie_board_cfg_t; + +/* There is a copy named ruby_pcie_bda_t in ruby_pcie_bda.h they must be the same */ +typedef struct qdpc_pcie_bda { + uint16_t bda_len; /* Size of BDA block */ + uint16_t bda_version; /* BDA version */ + uint32_t bda_bootstate; /* Boot state of device */ + uint32_t bda_dma_mask; /* Number of addressable DMA bits */ + uint32_t bda_dma_offset; /* HW specific offset for DMA engine */ + uint32_t bda_flags; + uint32_t bda_img; /* Current load image block */ + uint32_t bda_img_size; /* Current load image block size */ + uint32_t bda_ep2h_irqstatus; /* Added here to allow boot loader to use irqs if desired */ + uint32_t bda_h2ep_irqstatus; /* Added here to allow boot loader to use irqs if desired */ + uint32_t bda_msi_addr; + qdpc_pcie_board_cfg_t bda_boardcfg; + uint32_t bda_flashsz; + char bda_boardname[PCIE_BDA_NAMELEN]; + /* Warning: these two fields are re-used at run time to store the host MAC address. */ + uint32_t bda_pci_pre_status; /* PCI endian check previous status */ + uint32_t bda_pci_endian; /* Check pci memory endian format */ + uint32_t bda_pci_post_status; /* PCI endian check post status */ + int32_t bda_h2ep_txd_budget; /* txdone replenish budget for ep */ + int32_t bda_ep2h_txd_budget; /* txdone replenish budget for host */ +} __attribute__ ((packed)) qdpc_pcie_bda_t; + +typedef struct qdpc_epshmem_hdr { + uint32_t eps_mapsize; /* Iomap size for PCIe hardware */ + uint32_t eps_ver; /* Header version */ + uint32_t eps_size; /* Size of shared memory area */ + uint32_t eps_dma_offset; /* HW dependent DMA offset */ + uint32_t eps_dsdma_desc; /* Downstream Descriptor offset */ + uint32_t eps_usdma_desc; /* Upstream Descriptor offset */ + uint32_t eps_dsdma_ndesc; /* Number of downstream descriptros */ + uint32_t eps_usdma_ndesc; /* Number of upstream descriptros */ + uint32_t eps_align; + uint32_t eps_maxbuf; + uint32_t eps_minbuf; +} __attribute__ ((packed)) qdpc_epshmem_hdr_t; + +#endif /* __QDPC_CONFIG_H__ */ diff --git a/package/firmware/quantenna/src/drivers/pcie/include/qdpc_debug.h b/package/firmware/quantenna/src/drivers/pcie/include/qdpc_debug.h new file mode 100644 index 000000000..b6769ced5 --- /dev/null +++ b/package/firmware/quantenna/src/drivers/pcie/include/qdpc_debug.h @@ -0,0 +1,54 @@ +/** + * Copyright (c) 2011-2013 Quantenna Communications, Inc. + * All rights reserved. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + **/ +#ifndef __QDPC_DEBUG_H__ +#define __QDPC_DEBUG_H__ + +/* Debug macros */ + +#define SUCCESS 0 +#define FAILURE -1 + +#ifdef DEBUG +#define PRINT_DBG(format, ...) printk(KERN_DEBUG format, ##__VA_ARGS__) +#else +#define PRINT_DBG(format, ...) do { } while(0); +#endif + +#define PRINT_ERROR(format, ...) printk(KERN_ERR format, ##__VA_ARGS__) +#define PRINT_INFO(format, ...) printk(KERN_INFO format, ##__VA_ARGS__) + +#ifdef DEBUG +#define qdpc_print_dump(str_, buf_, len_) \ +{ \ + u32 i = 0; \ + printk("%s\n", str_); \ + printk("0x%04X : ", i*8); \ + for (i=0; i < (u32)(len_); i++) { \ + if (i && ((i%8) == 0)) { \ + printk( "%s", "\n"); \ + printk("0x%04X : ", (i));\ + } \ + printk("%02x ", (buf_)[i]); \ + } \ + printk("\n%s\n", str_); \ +} +#else +#define qdpc_print_dump(str_, buf_, len_) +#endif +#endif diff --git a/package/firmware/quantenna/src/drivers/pcie/include/qdpc_ruby.h b/package/firmware/quantenna/src/drivers/pcie/include/qdpc_ruby.h new file mode 100644 index 000000000..c7950e567 --- /dev/null +++ b/package/firmware/quantenna/src/drivers/pcie/include/qdpc_ruby.h @@ -0,0 +1,68 @@ +/** + * Copyright (c) 2011-2013 Quantenna Communications, Inc. + * All rights reserved. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + **/ +#ifndef __QDPC_RUBY_H__ +#define __QDPC_RUBY_H__ + +#define QDPC_SYSCTL_INTREG 0x2c +#define QDPC_SYSCTL_INTMASK 0x30 + +/* DMA Base Address */ +#define QDPC_DMA_BASE_ADDR 0xEA000000 + +/* SRAM/DDR2 Base Address */ +#define QDPC_SRAM_BASE_ADDR 0x80000000 +#define QDPC_DDR2_BASE_ADDR 0x88000000 + +#define QDPC_PCIE_BASE_ADDR 0xc2000000 + +#define QDPC_SYSCTL_REG_BASE 0xe0000000 +#define QDPC_SYSCTL_REG_INTSTS 0x2c +#define QDPC_SYSCTL_REG_INTMSK 0x30 + +/* ATU register offsets in the configuration space */ + +/* View port register */ +#define QDPC_ATU_VIEWPORT_REG 0x900 + +/* CTRL1 register */ +#define QDPC_ATU_CTRL1_REG 0x904 + +/* CTRL2 register */ +#define QDPC_ATU_CTRL2_REG 0x908 + +/* LBAR register */ +#define QDPC_ATU_LBAR_REG 0x90c + +/* UBAR register */ +#define QDPC_ATU_UBAR_REG 0x910 + +/* LAR register */ +#define QDPC_ATU_LAR_REG 0x914 + +/* LTAR register */ +#define QDPC_ATU_LTAR_REG 0x918 + +/* UTAR register */ +#define QDPC_ATU_UTAR_REG 0x91c + +#define QDPC_ATU_OB_REGION 0x00000000 +#define QDPC_ATU_IB_REGION 0x80000001 +#define QDPC_ATU_EN_OB_REGION 0x80000000 + +#endif diff --git a/package/firmware/quantenna/src/drivers/pcie/include/queue.h b/package/firmware/quantenna/src/drivers/pcie/include/queue.h new file mode 100755 index 000000000..6edbd5ac9 --- /dev/null +++ b/package/firmware/quantenna/src/drivers/pcie/include/queue.h @@ -0,0 +1,561 @@ +/* + * Copyright (c) 1991, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $Id: queue.h 1441 2006-02-06 16:03:21Z mrenzmann $ + */ + +#ifndef _SYS_QUEUE_H_ +#define _SYS_QUEUE_H_ + +/* + * This file defines four types of data structures: singly-linked lists, + * singly-linked tail queues, lists and tail queues. + * + * A singly-linked list is headed by a single forward pointer. The elements + * are singly linked for minimum space and pointer manipulation overhead at + * the expense of O(n) removal for arbitrary elements. New elements can be + * added to the list after an existing element or at the head of the list. + * Elements being removed from the head of the list should use the explicit + * macro for this purpose for optimum efficiency. A singly-linked list may + * only be traversed in the forward direction. Singly-linked lists are ideal + * for applications with large datasets and few or no removals or for + * implementing a LIFO queue. + * + * A singly-linked tail queue is headed by a pair of pointers, one to the + * head of the list and the other to the tail of the list. The elements are + * singly linked for minimum space and pointer manipulation overhead at the + * expense of O(n) removal for arbitrary elements. New elements can be added + * to the list after an existing element, at the head of the list, or at the + * end of the list. Elements being removed from the head of the tail queue + * should use the explicit macro for this purpose for optimum efficiency. + * A singly-linked tail queue may only be traversed in the forward direction. + * Singly-linked tail queues are ideal for applications with large datasets + * and few or no removals or for implementing a FIFO queue. + * + * A list is headed by a single forward pointer (or an array of forward + * pointers for a hash table header). The elements are doubly linked + * so that an arbitrary element can be removed without a need to + * traverse the list. New elements can be added to the list before + * or after an existing element or at the head of the list. A list + * may only be traversed in the forward direction. + * + * A tail queue is headed by a pair of pointers, one to the head of the + * list and the other to the tail of the list. The elements are doubly + * linked so that an arbitrary element can be removed without a need to + * traverse the list. New elements can be added to the list before or + * after an existing element, at the head of the list, or at the end of + * the list. A tail queue may be traversed in either direction. + * + * For details on the use of these macros, see the queue(3) manual page. + * + * + * SLIST LIST STAILQ TAILQ + * _HEAD + + + + + * _HEAD_INITIALIZER + + + + + * _ENTRY + + + + + * _INIT + + + + + * _EMPTY + + + + + * _FIRST + + + + + * _NEXT + + + + + * _PREV - - - + + * _LAST - - + + + * _FOREACH + + + + + * _FOREACH_SAFE + + + + + * _FOREACH_REVERSE - - - + + * _FOREACH_REVERSE_SAFE - - - + + * _INSERT_HEAD + + + + + * _INSERT_BEFORE - + - + + * _INSERT_AFTER + + + + + * _INSERT_TAIL - - + + + * _CONCAT - - + + + * _REMOVE_HEAD + - + - + * _REMOVE + + + + + * + */ +#define QUEUE_MACRO_DEBUG 0 +#if QUEUE_MACRO_DEBUG +/* Store the last 2 places the queue element or head was altered */ +struct qm_trace { + char *lastfile; + int lastline; + char *prevfile; + int prevline; +}; + +#define TRACEBUF struct qm_trace trace; +#define TRASHIT(x) do {(x) = (void *)-1;} while (0) + +#define QMD_TRACE_HEAD(head) do { \ + (head)->trace.prevline = (head)->trace.lastline; \ + (head)->trace.prevfile = (head)->trace.lastfile; \ + (head)->trace.lastline = __LINE__; \ + (head)->trace.lastfile = __FILE__; \ +} while (0) + +#define QMD_TRACE_ELEM(elem) do { \ + (elem)->trace.prevline = (elem)->trace.lastline; \ + (elem)->trace.prevfile = (elem)->trace.lastfile; \ + (elem)->trace.lastline = __LINE__; \ + (elem)->trace.lastfile = __FILE__; \ +} while (0) + +#else +#define QMD_TRACE_ELEM(elem) +#define QMD_TRACE_HEAD(head) +#define TRACEBUF +#define TRASHIT(x) +#endif /* QUEUE_MACRO_DEBUG */ + +/* + * Singly-linked List declarations. + */ +#define SLIST_HEAD(name, type) \ +struct name { \ + struct type *slh_first; /* first element */ \ +} + +#define SLIST_HEAD_INITIALIZER(head) \ + { NULL } + +#define SLIST_ENTRY(type) \ +struct { \ + struct type *sle_next; /* next element */ \ +} + +/* + * Singly-linked List functions. + */ +#define SLIST_EMPTY(head) ((head)->slh_first == NULL) + +#define SLIST_FIRST(head) ((head)->slh_first) + +#define SLIST_FOREACH(var, head, field) \ + for ((var) = SLIST_FIRST((head)); \ + (var); \ + (var) = SLIST_NEXT((var), field)) + +#define SLIST_FOREACH_SAFE(var, head, field, tvar) \ + for ((var) = SLIST_FIRST((head)); \ + (var) && ((tvar) = SLIST_NEXT((var), field), 1); \ + (var) = (tvar)) + +#define SLIST_FOREACH_PREVPTR(var, varp, head, field) \ + for ((varp) = &SLIST_FIRST((head)); \ + ((var) = *(varp)) != NULL; \ + (varp) = &SLIST_NEXT((var), field)) + +#define SLIST_INIT(head) do { \ + SLIST_FIRST((head)) = NULL; \ +} while (0) + +#define SLIST_INSERT_AFTER(slistelm, elm, field) do { \ + SLIST_NEXT((elm), field) = SLIST_NEXT((slistelm), field); \ + SLIST_NEXT((slistelm), field) = (elm); \ +} while (0) + +#define SLIST_INSERT_HEAD(head, elm, field) do { \ + SLIST_NEXT((elm), field) = SLIST_FIRST((head)); \ + SLIST_FIRST((head)) = (elm); \ +} while (0) + +#define SLIST_NEXT(elm, field) ((elm)->field.sle_next) + +#define SLIST_REMOVE(head, elm, type, field) do { \ + if (SLIST_FIRST((head)) == (elm)) { \ + SLIST_REMOVE_HEAD((head), field); \ + } \ + else { \ + struct type *curelm = SLIST_FIRST((head)); \ + while (SLIST_NEXT(curelm, field) != (elm)) \ + curelm = SLIST_NEXT(curelm, field); \ + SLIST_NEXT(curelm, field) = \ + SLIST_NEXT(SLIST_NEXT(curelm, field), field); \ + } \ +} while (0) + +#define SLIST_REMOVE_HEAD(head, field) do { \ + SLIST_FIRST((head)) = SLIST_NEXT(SLIST_FIRST((head)), field); \ +} while (0) + +/* + * Singly-linked Tail queue declarations. + */ +#define STAILQ_HEAD(name, type) \ +struct name { \ + struct type *stqh_first;/* first element */ \ + struct type **stqh_last;/* addr of last next element */ \ +} + +#define STAILQ_HEAD_INITIALIZER(head) \ + { NULL, &(head).stqh_first } + +#define STAILQ_ENTRY(type) \ +struct { \ + struct type *stqe_next; /* next element */ \ +} + +/* + * Singly-linked Tail queue functions. + */ +#define STAILQ_CONCAT(head1, head2) do { \ + if (!STAILQ_EMPTY((head2))) { \ + *(head1)->stqh_last = (head2)->stqh_first; \ + (head1)->stqh_last = (head2)->stqh_last; \ + STAILQ_INIT((head2)); \ + } \ +} while (0) + +#define STAILQ_EMPTY(head) ((head)->stqh_first == NULL) + +#define STAILQ_FIRST(head) ((head)->stqh_first) + +#define STAILQ_FOREACH(var, head, field) \ + for((var) = STAILQ_FIRST((head)); \ + (var); \ + (var) = STAILQ_NEXT((var), field)) + + +#define STAILQ_FOREACH_SAFE(var, head, field, tvar) \ + for ((var) = STAILQ_FIRST((head)); \ + (var) && ((tvar) = STAILQ_NEXT((var), field), 1); \ + (var) = (tvar)) + +#define STAILQ_INIT(head) do { \ + STAILQ_FIRST((head)) = NULL; \ + (head)->stqh_last = &STAILQ_FIRST((head)); \ +} while (0) + +#define STAILQ_INSERT_AFTER(head, tqelm, elm, field) do { \ + if ((STAILQ_NEXT((elm), field) = STAILQ_NEXT((tqelm), field)) == NULL)\ + (head)->stqh_last = &STAILQ_NEXT((elm), field); \ + STAILQ_NEXT((tqelm), field) = (elm); \ +} while (0) + +#define STAILQ_INSERT_HEAD(head, elm, field) do { \ + if ((STAILQ_NEXT((elm), field) = STAILQ_FIRST((head))) == NULL) \ + (head)->stqh_last = &STAILQ_NEXT((elm), field); \ + STAILQ_FIRST((head)) = (elm); \ +} while (0) + +#define STAILQ_INSERT_TAIL(head, elm, field) do { \ + STAILQ_NEXT((elm), field) = NULL; \ + *(head)->stqh_last = (elm); \ + (head)->stqh_last = &STAILQ_NEXT((elm), field); \ +} while (0) + +#define STAILQ_LAST(head, type, field) \ + (STAILQ_EMPTY((head)) ? \ + NULL : \ + ((struct type *) \ + ((char *)((head)->stqh_last) - __offsetof(struct type, field)))) + +#define STAILQ_NEXT(elm, field) ((elm)->field.stqe_next) + +#define STAILQ_REMOVE(head, elm, type, field) do { \ + if (STAILQ_FIRST((head)) == (elm)) { \ + STAILQ_REMOVE_HEAD((head), field); \ + } \ + else { \ + struct type *curelm = STAILQ_FIRST((head)); \ + while (STAILQ_NEXT(curelm, field) != (elm)) \ + curelm = STAILQ_NEXT(curelm, field); \ + if ((STAILQ_NEXT(curelm, field) = \ + STAILQ_NEXT(STAILQ_NEXT(curelm, field), field)) == NULL)\ + (head)->stqh_last = &STAILQ_NEXT((curelm), field);\ + } \ +} while (0) + + +#define STAILQ_REMOVE_AFTER(head, elm, field) do { \ + if (STAILQ_NEXT(elm, field)) { \ + if ((STAILQ_NEXT(elm, field) = \ + STAILQ_NEXT(STAILQ_NEXT(elm, field), field)) == NULL)\ + (head)->stqh_last = &STAILQ_NEXT((elm), field); \ + } \ +} while (0) + + +#define STAILQ_REMOVE_HEAD(head, field) do { \ + if ((STAILQ_FIRST((head)) = \ + STAILQ_NEXT(STAILQ_FIRST((head)), field)) == NULL) \ + (head)->stqh_last = &STAILQ_FIRST((head)); \ +} while (0) + +#define STAILQ_REMOVE_HEAD_UNTIL(head, elm, field) do { \ + if ((STAILQ_FIRST((head)) = STAILQ_NEXT((elm), field)) == NULL) \ + (head)->stqh_last = &STAILQ_FIRST((head)); \ +} while (0) + +/* + * List declarations. + */ +#define ATH_LIST_HEAD(name, type) \ +struct name { \ + struct type *lh_first; /* first element */ \ +} + +#define LIST_HEAD_INITIALIZER(head) \ + { NULL } + +#define LIST_ENTRY(type) \ +struct { \ + struct type *le_next; /* next element */ \ + struct type **le_prev; /* address of previous next element */ \ +} + +/* + * List functions. + */ + +#define LIST_EMPTY(head) ((head)->lh_first == NULL) + +#define LIST_FIRST(head) ((head)->lh_first) + +#define LIST_FOREACH(var, head, field) \ + for ((var) = LIST_FIRST((head)); \ + (var); \ + (var) = LIST_NEXT((var), field)) + +#define LIST_FOREACH_SAFE(var, head, field, tvar) \ + for ((var) = LIST_FIRST((head)); \ + (var) && ((tvar) = LIST_NEXT((var), field), 1); \ + (var) = (tvar)) + +#define LIST_INIT(head) do { \ + LIST_FIRST((head)) = NULL; \ +} while (0) + +#define LIST_INSERT_AFTER(listelm, elm, field) do { \ + if ((LIST_NEXT((elm), field) = LIST_NEXT((listelm), field)) != NULL)\ + LIST_NEXT((listelm), field)->field.le_prev = \ + &LIST_NEXT((elm), field); \ + LIST_NEXT((listelm), field) = (elm); \ + (elm)->field.le_prev = &LIST_NEXT((listelm), field); \ +} while (0) + +#define LIST_INSERT_BEFORE(listelm, elm, field) do { \ + (elm)->field.le_prev = (listelm)->field.le_prev; \ + LIST_NEXT((elm), field) = (listelm); \ + *(listelm)->field.le_prev = (elm); \ + (listelm)->field.le_prev = &LIST_NEXT((elm), field); \ +} while (0) + +#define LIST_INSERT_HEAD(head, elm, field) do { \ + if ((LIST_NEXT((elm), field) = LIST_FIRST((head))) != NULL) \ + LIST_FIRST((head))->field.le_prev = &LIST_NEXT((elm), field);\ + LIST_FIRST((head)) = (elm); \ + (elm)->field.le_prev = &LIST_FIRST((head)); \ +} while (0) + +#define LIST_NEXT(elm, field) ((elm)->field.le_next) + +#define LIST_REMOVE(elm, field) do { \ + if (LIST_NEXT((elm), field) != NULL) \ + LIST_NEXT((elm), field)->field.le_prev = \ + (elm)->field.le_prev; \ + *(elm)->field.le_prev = LIST_NEXT((elm), field); \ +} while (0) + +/* + * Tail queue declarations. + */ +#define TAILQ_HEAD(name, type) \ +struct name { \ + struct type *tqh_first; /* first element */ \ + struct type **tqh_last; /* addr of last next element */ \ + TRACEBUF \ +} + +#define TAILQ_HEAD_INITIALIZER(head) \ + { NULL, &(head).tqh_first } +#if (!defined(TAILQ_ENTRY)) +#define TAILQ_ENTRY(type) \ +struct { \ + struct type *tqe_next; /* next element */ \ + struct type **tqe_prev; /* address of previous next element */ \ + TRACEBUF \ +} +#endif + +/* + * Tail queue functions. + */ +#define TAILQ_CONCAT(head1, head2, field) do { \ + if (!TAILQ_EMPTY(head2)) { \ + *(head1)->tqh_last = (head2)->tqh_first; \ + (head2)->tqh_first->field.tqe_prev = (head1)->tqh_last; \ + (head1)->tqh_last = (head2)->tqh_last; \ + TAILQ_INIT((head2)); \ + QMD_TRACE_HEAD(head); \ + QMD_TRACE_HEAD(head2); \ + } \ +} while (0) + +#define TAILQ_EMPTY(head) ((head)->tqh_first == NULL) + +#define TAILQ_FIRST(head) ((head)->tqh_first) + +#define TAILQ_FOREACH(var, head, field) \ + for ((var) = TAILQ_FIRST((head)); \ + (var); \ + (var) = TAILQ_NEXT((var), field)) + +#define TAILQ_FOREACH_SAFE(var, head, field, tvar) \ + for ((var) = TAILQ_FIRST((head)); \ + (var) && ((tvar) = TAILQ_NEXT((var), field), 1); \ + (var) = (tvar)) + +#define TAILQ_FOREACH_REVERSE(var, head, headname, field) \ + for ((var) = TAILQ_LAST((head), headname); \ + (var); \ + (var) = TAILQ_PREV((var), headname, field)) + +#define TAILQ_FOREACH_REVERSE_SAFE(var, head, headname, field, tvar) \ + for ((var) = TAILQ_LAST((head), headname); \ + (var) && ((tvar) = TAILQ_PREV((var), headname, field), 1); \ + (var) = (tvar)) + +#define TAILQ_INIT(head) do { \ + TAILQ_FIRST((head)) = NULL; \ + (head)->tqh_last = &TAILQ_FIRST((head)); \ + QMD_TRACE_HEAD(head); \ +} while (0) + +#define TAILQ_INSERT_AFTER(head, listelm, elm, field) do { \ + if ((TAILQ_NEXT((elm), field) = TAILQ_NEXT((listelm), field)) != NULL)\ + TAILQ_NEXT((elm), field)->field.tqe_prev = \ + &TAILQ_NEXT((elm), field); \ + else { \ + (head)->tqh_last = &TAILQ_NEXT((elm), field); \ + QMD_TRACE_HEAD(head); \ + } \ + TAILQ_NEXT((listelm), field) = (elm); \ + (elm)->field.tqe_prev = &TAILQ_NEXT((listelm), field); \ + QMD_TRACE_ELEM(&(elm)->field); \ + QMD_TRACE_ELEM(&listelm->field); \ +} while (0) + +#define TAILQ_INSERT_BEFORE(listelm, elm, field) do { \ + (elm)->field.tqe_prev = (listelm)->field.tqe_prev; \ + TAILQ_NEXT((elm), field) = (listelm); \ + *(listelm)->field.tqe_prev = (elm); \ + (listelm)->field.tqe_prev = &TAILQ_NEXT((elm), field); \ + QMD_TRACE_ELEM(&(elm)->field); \ + QMD_TRACE_ELEM(&listelm->field); \ +} while (0) + +#define TAILQ_INSERT_HEAD(head, elm, field) do { \ + if ((TAILQ_NEXT((elm), field) = TAILQ_FIRST((head))) != NULL) \ + TAILQ_FIRST((head))->field.tqe_prev = \ + &TAILQ_NEXT((elm), field); \ + else \ + (head)->tqh_last = &TAILQ_NEXT((elm), field); \ + TAILQ_FIRST((head)) = (elm); \ + (elm)->field.tqe_prev = &TAILQ_FIRST((head)); \ + QMD_TRACE_HEAD(head); \ + QMD_TRACE_ELEM(&(elm)->field); \ +} while (0) + +#define TAILQ_INSERT_TAIL(head, elm, field) do { \ + TAILQ_NEXT((elm), field) = NULL; \ + (elm)->field.tqe_prev = (head)->tqh_last; \ + *(head)->tqh_last = (elm); \ + (head)->tqh_last = &TAILQ_NEXT((elm), field); \ + QMD_TRACE_HEAD(head); \ + QMD_TRACE_ELEM(&(elm)->field); \ +} while (0) + +#define TAILQ_LAST(head, headname) \ + (*(((struct headname *)((head)->tqh_last))->tqh_last)) + +#define TAILQ_NEXT(elm, field) ((elm)->field.tqe_next) + +#define TAILQ_PREV(elm, headname, field) \ + (*(((struct headname *)((elm)->field.tqe_prev))->tqh_last)) + +#define TAILQ_REMOVE(head, elm, field) do { \ + if ((TAILQ_NEXT((elm), field)) != NULL) \ + TAILQ_NEXT((elm), field)->field.tqe_prev = \ + (elm)->field.tqe_prev; \ + else { \ + (head)->tqh_last = (elm)->field.tqe_prev; \ + QMD_TRACE_HEAD(head); \ + } \ + *(elm)->field.tqe_prev = TAILQ_NEXT((elm), field); \ + TRASHIT((elm)->field.tqe_next); \ + TRASHIT((elm)->field.tqe_prev); \ + QMD_TRACE_ELEM(&(elm)->field); \ +} while (0) + + +#ifdef _KERNEL + +/* + * XXX insque() and remque() are an old way of handling certain queues. + * They bogusly assumes that all queue heads look alike. + */ + +struct quehead { + struct quehead *qh_link; + struct quehead *qh_rlink; +}; + +#if defined(__GNUC__) || defined(__INTEL_COMPILER) + +static __inline void +insque(void *a, void *b) +{ + struct quehead *element = (struct quehead *)a, + *head = (struct quehead *)b; + + element->qh_link = head->qh_link; + element->qh_rlink = head; + head->qh_link = element; + element->qh_link->qh_rlink = element; +} + +static __inline void +remque(void *a) +{ + struct quehead *element = (struct quehead *)a; + + element->qh_link->qh_rlink = element->qh_rlink; + element->qh_rlink->qh_link = element->qh_link; + element->qh_rlink = 0; +} + +#else /* !(__GNUC__ || __INTEL_COMPILER) */ + +void insque(void *a, void *b); +void remque(void *a); + +#endif /* __GNUC__ || __INTEL_COMPILER */ + +#endif /* _KERNEL */ + +#endif /* !_SYS_QUEUE_H_ */ diff --git a/package/firmware/quantenna/src/drivers/pcie/target/Makefile b/package/firmware/quantenna/src/drivers/pcie/target/Makefile new file mode 100644 index 000000000..4ebcbfc83 --- /dev/null +++ b/package/firmware/quantenna/src/drivers/pcie/target/Makefile @@ -0,0 +1,57 @@ +# +# Quantenna Communications Inc. Driver Makefile +# +# Author: +# +EXTRA_CFLAGS += -Wall \ + -I../include \ + -I../common \ + -I../drivers/include/shared \ + -I../drivers/include/kernel + +EXTRA_CFLAGS += -I$(M)/pcie/include +EXTRA_CFLAGS += -mlong-calls + +EXTRA_CFLAGS += -DUSE_EMAC_DMA +EXTRA_CFLAGS += -DQDPC_USE_DMA_RX_DONE_INTR +EXTRA_CFLAGS += -DQDPC_DSPIO +EXTRA_CFLAGS += -DQDPC_PHY_CROSS_MODE +#EXTRA_CFLAGS += -DCVM_HOST +#EXTRA_CFLAGS += -DDEBUG + +ifeq (${PCIE_TARGET_CRUMBS},1) +EXTRA_CFLAGS += -finstrument-functions +endif + +ifneq ($(KERNELRELEASE),) +qdpc-pcie-objs := qdpc_ring.o \ + qdpc_emac.o \ + qdpc_net.o \ + qdpc_pcie.o \ + qdpc_init.o + +obj-m := qdpc-pcie.o +else + +KERNELDIR ?= ../../../linux +INSTALL = INSTALL_MOD_PATH=../linux/modules +CROSS = ARCH=arc CROSS_COMPILE=/usr/local/ARC/gcc/bin/arc-linux-uclibc- +PWD := $(shell pwd) + +default: + $(MAKE) -C $(KERNELDIR) $(CROSS) M=$(PWD) modules + +install: + $(MAKE) -C $(KERNELDIR) $(CROSS) $(INSTALL) M=$(PWD) modules_install + +endif + +clean: + rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions Module.symvers modules.order + +depend .depend dep: + $(CC) $(CFLAGS) -M *.c > .depend + +ifeq (.depend,$(wildcard .depend)) +include .depend +endif diff --git a/package/firmware/quantenna/src/drivers/pcie/target/qdpc_emac.c b/package/firmware/quantenna/src/drivers/pcie/target/qdpc_emac.c new file mode 100644 index 000000000..67bd4051b --- /dev/null +++ b/package/firmware/quantenna/src/drivers/pcie/target/qdpc_emac.c @@ -0,0 +1,405 @@ +/** + * Copyright (c) 2011-2013 Quantenna Communications, Inc. + * All rights reserved. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + **/ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "qdpc_config.h" +#include "qdpc_debug.h" +#include "qdpc_init.h" +#include "qdpc_emac.h" +#include "qdpc_ruby.h" + +#define REG_WRITE(x,y) (writel((y),(x))) +#define REG_READ(x) (readl(x)) +#define QDPC_PHY1_ADDRESS (31) +#define QDPC_PHY0_ADDRESS (24) + +#define QDPC_NUM_DESC QDPC_DESC_RING_SIZE +#define QDPC_WRITE_INDEX_LEN (32 << 12) + +/* + * Gather EMAC DMA rx lost statistics for netdebug function. + * Any module used for netdebug backhaul must define this function. + */ +uint32_t qtn_eth_rx_lost_get(struct net_device *dev) +{ + struct qdpc_priv *priv = netdev_priv(dev); + uint32_t dsbase = priv->pktq.pkt_dsq.pd_rx_basereg; + uint32_t usbase = priv->pktq.pkt_usq.pd_rx_basereg; + + uint32_t ds_lost = REG_READ(dsbase + EMAC_DMAMFC) & 0x7fffffff; + uint32_t us_lost = REG_READ(usbase + EMAC_DMAMFC) & 0x7fffffff; + + return (ds_lost + us_lost); +} +EXPORT_SYMBOL(qtn_eth_rx_lost_get); + +void qdpc_flush_and_inv_dcache_range(unsigned long start, unsigned long end) +{ + unsigned long flags, dc_ctrl; + + start &= DCACHE_LINE_MASK; + local_irq_save(flags); + /* Set the Invalidate mode to FLUSH BEFORE INV */ + dc_ctrl = read_new_aux_reg(ARC_REG_DC_CTRL); + write_new_aux_reg(ARC_REG_DC_CTRL, dc_ctrl | INV_MODE_FLUSH); + /* Invoke Cache INV CMD */ + while (end > start) { + write_new_aux_reg(ARC_REG_DC_IVDL, start); + start = start + ARC_DCACHE_LINE_LEN; + } + /* wait for the flush to complete, poll on the FS Bit */ + while (read_new_aux_reg(ARC_REG_DC_CTRL) & DC_FLUSH_STATUS_BIT) ; + /* Switch back the DISCARD ONLY Invalidate mode */ + write_new_aux_reg(ARC_REG_DC_CTRL, dc_ctrl & ~INV_MODE_FLUSH); + local_irq_restore(flags); +} + +void phy_write(u32 phyaddr, u32 regn, u16 data) +{ + u32 timeout = 0x10000; + /* write data */ + REG_WRITE(PHY_MDIODATA, data); + /* issue write */ + REG_WRITE(PHY_MDIOCTRL, + (phyaddr << 0) | (regn << 5) | (0 << 10) | (1 << 15)); + /* wait for write completion */ + while (REG_READ(PHY_MDIOCTRL) & (1 << 15)) { + if (timeout-- == 0) { + PRINT_ERROR("MDIO timeout\n"); + break; + } + } +} + +int32_t qdpc_emac_getconfig(struct qdpc_priv *priv) +{ + int pcie_config = 0; + + /* EMAC DMA engine assignment */ + priv->pktq.pkt_dsq.pd_tx_basereg = EMAC0_ADDR; +#ifdef QDPC_PHY_CROSS_MODE + priv->pktq.pkt_dsq.pd_rx_basereg = EMAC1_ADDR; +#else + priv->pktq.pkt_dsq.pd_rx_basereg = EMAC0_ADDR; +#endif + priv->pktq.pkt_usq.pd_tx_basereg = EMAC1_ADDR; +#ifdef QDPC_PHY_CROSS_MODE + priv->pktq.pkt_usq.pd_rx_basereg = EMAC0_ADDR; +#else + priv->pktq.pkt_usq.pd_rx_basereg = EMAC1_ADDR; +#endif + priv->pktq.pkt_dsq.pd_src_busaddr = + priv->shmem_busaddr + priv->shmem->eps_dsdma_desc; + priv->pktq.pkt_usq.pd_dst_busaddr = + priv->shmem_busaddr + priv->shmem->eps_usdma_desc; + + /* check for Use PHY Loopback configuration */ + get_board_config(BOARD_CFG_PCIE, &pcie_config); + if ((pcie_config & PCIE_USE_PHY_LOOPBK) == PCIE_USE_PHY_LOOPBK) + { + priv->mii_pllclk = 0x8f8f8f8f; + } else { +#ifdef CVM_HOST + priv->mii_pllclk = 0x8f808f8f; +#else + priv->mii_pllclk = 0x8f808f80; +#endif + } + + return 0; +} + +void qdpc_emac_startdma(qdpc_pdring_t *pktq) +{ + REG_WRITE(pktq->pd_rx_basereg + EMAC_DMARPD, 1); + REG_WRITE(pktq->pd_tx_basereg + EMAC_DMATPD, 1); + +} + +void qdpc_emac_disable(struct qdpc_priv *priv) +{ + /* Disable EMAC1 TX poll demand */ + REG_WRITE(priv->pktq.pkt_usq.pd_tx_basereg + EMAC_DMATAPC, 0x0); + + /* Disable Interrupts */ + REG_WRITE(priv->pktq.pkt_dsq.pd_rx_basereg + EMAC_DMAINTEN, ~DmaAllInts); + REG_WRITE(priv->pktq.pkt_usq.pd_rx_basereg + EMAC_DMAINTEN, ~DmaAllInts); +} + +void qdpc_emac_enable(struct qdpc_priv *priv) +{ + uint32_t tmp; + uint32_t dsdma_base = priv->pktq.pkt_dsq.pd_tx_basereg; + uint32_t usdma_base = priv->pktq.pkt_usq.pd_tx_basereg; + + /* EMAC0 Interrupts: + * DmaRxDone + * EMAC0_ERROR (DmaRxMissedFrame | DmaNoTxDesc | DmaNoRxDesc) + * DmaMacInterrupt + * MAC Interupts : + * MacUnderrun + */ + + REG_WRITE(dsdma_base + EMAC_MACINTEN, QDPC_MAC_DS_INTR); + REG_WRITE(dsdma_base + EMAC_DMAINTEN, QDPC_DMA_DS_INTR); + + /* EMAC1 Interrupts: + * DmaRxDone + */ + REG_WRITE(usdma_base + EMAC_DMAINTEN, QDPC_DMA_US_INTR); + REG_WRITE(dsdma_base + EMAC_MACINTEN, QDPC_MAC_US_INTR); + + REG_WRITE(dsdma_base + EMAC_DMACTRL, DmaStartTx | DmaStartRx); + REG_WRITE(usdma_base + EMAC_DMACTRL, DmaStartTx | DmaStartRx); + + /* EMAC1 TX poll demand */ + REG_WRITE(usdma_base + EMAC_DMATAPC, QDPC_DMA_AUTO_POLLING_CNT); + + /* clear missed frames and stopped flush */ + tmp = REG_READ(dsdma_base + EMAC_DMAMFC); + tmp = REG_READ(dsdma_base + EMAC_DMASFC); + + tmp = REG_READ(usdma_base + EMAC_DMAMFC); + tmp = REG_READ(usdma_base + EMAC_DMASFC); + +} + +void qdpc_emac_phyinit(struct qdpc_priv *priv) +{ + int rgmii_timing = priv->mii_pllclk; +#if defined(CONFIG_RUBY_PCIE_HAVE_PHY) + int phy_setting_mask = 0; +#endif + + REG_WRITE(RUBY_SYS_CTL_MASK, RUBY_SYS_CTL_MASK_MII); + REG_WRITE(RUBY_SYS_CTL_CTRL, 0); + REG_WRITE(RUBY_SYS_CTL_MASK, RUBY_SYS_CTL_MASK_GMII0_TXCLK); + /* 2 is 1000MB */ + REG_WRITE(RUBY_SYS_CTL_CTRL, RUBY_SYS_CTL_MASK_GMII0_1000M); + REG_WRITE(RUBY_SYS_CTL_GMII_CLKDLL, rgmii_timing); + REG_WRITE(RUBY_SYS_CTL_MASK, RUBY_SYS_CTL_MASK_GMII1_TXCLK); + /* 2 is 1000MB */ + REG_WRITE(RUBY_SYS_CTL_CTRL,RUBY_SYS_CTL_MASK_GMII1_1000M); + REG_WRITE(RUBY_SYS_CTL_GMII_CLKDLL, rgmii_timing); + + REG_WRITE(RUBY_SYS_CTL_CPU_VEC_MASK, RUBY_SYS_CTL_RESET_ENET0 | RUBY_SYS_CTL_RESET_ENET1); + REG_WRITE(RUBY_SYS_CTL_CPU_VEC, 0); + REG_WRITE(RUBY_SYS_CTL_CPU_VEC, RUBY_SYS_CTL_RESET_ENET0 | RUBY_SYS_CTL_RESET_ENET1); + +#if defined(CONFIG_RUBY_PCIE_HAVE_PHY) + /* EMAC0 RGMII PLL Setup 1GB FDX loopback */ + phy_write(QDPC_PHY0_ADDRESS, PHY_MODE_CTL, PHY_MODE_CTL_RESET); + udelay(140); + + phy_setting_mask |= PHY_MODE_CTL_100MB | + PHY_MODE_CTL_FULL_DUPLEX | PHY_MODE_CTL_LOOPBACK; + phy_write(QDPC_PHY0_ADDRESS, PHY_MODE_CTL, phy_setting_mask); + + /* EMAC1 RGMII Setup Setup 1GB FDX loopback*/ + phy_write(QDPC_PHY1_ADDRESS, PHY_MODE_CTL, PHY_MODE_CTL_RESET); + udelay(140); + phy_write(QDPC_PHY1_ADDRESS, PHY_MODE_CTL, phy_setting_mask); +#endif +} + +void qdpc_emac_reset(struct qdpc_priv *priv) +{ + uint32_t dsbase = priv->pktq.pkt_dsq.pd_tx_basereg; + uint32_t usbase = priv->pktq.pkt_usq.pd_tx_basereg; + + /* Reset EMACs */ + REG_WRITE(dsbase + EMAC_DMACONFIG, DmaSoftReset); + REG_WRITE(usbase + EMAC_DMACONFIG, DmaSoftReset); + REG_WRITE(dsbase + EMAC_DMACONFIG, 0); + REG_WRITE(usbase + EMAC_DMACONFIG, 0); + + /* Disable DMA */ + REG_WRITE(dsbase + EMAC_DMACTRL, 0); + REG_WRITE(usbase + EMAC_DMACTRL, 0); + + /* Disable Interrupts */ + REG_WRITE(dsbase + EMAC_DMAINTEN, ~DmaAllInts); + REG_WRITE(usbase + EMAC_DMAINTEN, ~DmaAllInts); +} + +int32_t qdpc_usdma_init(struct qdpc_priv *priv, size_t ringsize) +{ + qdpc_pdring_t *usq= &priv->pktq.pkt_usq; + uint32_t regbase = usq->pd_tx_basereg; + uint32_t rx_regbase = usq->pd_rx_basereg; + + /* Setup Downstream DMA - EMAC1 */ + qdpc_init_txq(priv, ringsize); + + /* Write start of RX ring to EMAC1 */ + REG_WRITE(rx_regbase + EMAC_DMARBA, usq->pd_dst_busaddr); + + /* Write start of TX ring (on host ) to EMAC1 */ + REG_WRITE(regbase + EMAC_DMATBA, usq->pd_src_busaddr); + + /* Setup DMA config, bring DMA controller out of reset */ + REG_WRITE(regbase + EMAC_DMACONFIG, Dma64BitMode | DmaWait4Done | Dma16WordBurst); + + printk("Upstream DMA: s:0x%x d:0x%x\n", usq->pd_src_busaddr, usq->pd_dst_busaddr); + + return 0; +} + +int32_t qdpc_dsdma_init(struct qdpc_priv *priv, size_t ringsize) +{ + qdpc_pdring_t *dsq= &priv->pktq.pkt_dsq; + uint32_t regbase = dsq->pd_tx_basereg; + uint32_t rx_regbase = dsq->pd_rx_basereg; + + /* Setup Downstream DMA - EMAC0 */ + qdpc_init_rxq(priv, ringsize); + + /* Write start of RX ring to EMAC0 */ + REG_WRITE(rx_regbase + EMAC_DMARBA, dsq->pd_dst_busaddr); + + /* Write start of TX ring (on host ) to EMAC0 */ + REG_WRITE(regbase + EMAC_DMATBA, dsq->pd_src_busaddr); + + /* Setup DMA config, bring DMA controller out of reset */ + REG_WRITE(regbase + EMAC_DMACONFIG, Dma64BitMode | DmaWait4Done | Dma16WordBurst); + + printk("downstream DMA: s:0x%x d:0x%x\n", dsq->pd_src_busaddr, dsq->pd_dst_busaddr); + + return 0; +} + +void qdpc_emac_initcommon(uint32_t regbase) +{ + /* PHY mode */ + REG_WRITE(regbase + EMAC_MACGCTRL, EMAC_100MBPS | EMAC_FD); + + /* Max Frame Length */ + REG_WRITE(regbase + EMAC_MACMFS, QDPC_MAX_FRAMESZ); + REG_WRITE(regbase + EMAC_MACTJS, QDPC_MAX_JABBER); + REG_WRITE(regbase + EMAC_MACRJS, QDPC_MAX_JABBER); + + /* Flow Control Decode and Generation Disabled */ + //REG_WRITE(regbase + EMAC_MACFCPTV, 0); + REG_WRITE(regbase + EMAC_MACFCCTRL, MacFlowDecodeEnable | + MacFlowGenerationEnable | MacAutoFlowGenerationEnable | + MacFlowMulticastMode | MacBlockPauseFrames); + + /* !!! FIXME - whether or not we need this depends on whether + * the auto-pause generation uses it. The auto function may just + * use 0xffff val to stop sending & then 0 to restart it. + */ + REG_WRITE(regbase + EMAC_MACFCPTV, 100); + REG_WRITE(regbase + EMAC_MACFCPTVH, 200); + REG_WRITE(regbase + EMAC_MACFCPTVL, 0); + + /* source mac: 00:26:86:00:00:26 */ + REG_WRITE(regbase + EMAC_MACFCSAH, 0x0026); + REG_WRITE(regbase + EMAC_MACFCSAM, 0x8600); + REG_WRITE(regbase + EMAC_MACFCSAL, 0x0026); + + REG_WRITE(regbase + EMAC_DMAFCT, MacFCHighThreshold | MacFCLowThreshold); + + REG_WRITE(regbase + EMAC_DMATAPC, 0x00); + REG_WRITE(regbase + EMAC_MACACTRL, MacPromiscuous); + REG_WRITE(regbase + EMAC_MACTCTRL, MacTxEnable | MacTxIFG256 | MacTxDisableFCSInsertion); +} + +void qdpc_emac_dsinit(struct qdpc_priv *priv) +{ + uint32_t dsbase = priv->pktq.pkt_dsq.pd_tx_basereg; + /* Init Downstream DMA ring */ + qdpc_dsdma_init(priv, QDPC_DESC_RING_SIZE); + /* Specific flow, buffering and timing inits */ + REG_WRITE(dsbase + EMAC_MACTFIFOAF, 512 - 8); + REG_WRITE(dsbase + EMAC_MACTPST, 1518); + REG_WRITE(dsbase + EMAC_MACRPST, 0); + + /* Enable DMA Rx Transfer Done interrupt mitigation control */ + REG_WRITE(dsbase + EMAC_DMARDIMC, (QDPC_DMA_TX_IMC_EN | + QDPC_DMA_TX_IMC_DELAY | QDPC_DMA_TX_IMC_NFRAMES(QDPC_DMA_INT_MITIGATION_NUM))); + REG_WRITE(dsbase + EMAC_MACRCTRL, MacRxEnable | MacRxDisableFcs | MacRxStoreAndForward); + + /* Flow Control Decode and Generation Disabled */ + REG_WRITE(dsbase + EMAC_MACFCPTV, 0); + + /* Common init */ + qdpc_emac_initcommon(dsbase); +} + + +void qdpc_emac_usinit(struct qdpc_priv *priv) +{ + uint32_t usbase = priv->pktq.pkt_usq.pd_tx_basereg; + /* Init UPstream DMA ring */ + qdpc_usdma_init(priv, QDPC_DESC_USRING_SIZE); + /* Specific flow, buffering and timing inits */ + REG_WRITE(usbase + EMAC_MACTFIFOAF, 512 - 8); + REG_WRITE(usbase + EMAC_MACTPST, 1518); + REG_WRITE(usbase + EMAC_MACRPST, 0); + + /* Enable DMA Rx Transfer Done interrupt mitigation control */ + REG_WRITE(usbase + EMAC_DMARDIMC,(QDPC_DMA_TX_IMC_EN | + QDPC_DMA_TX_IMC_DELAY | QDPC_DMA_TX_IMC_NFRAMES(QDPC_DMA_INT_MITIGATION_NUM))); + REG_WRITE(usbase + EMAC_MACRCTRL, MacRxEnable | MacRxDisableFcs | MacRxStoreAndForward); + + /* Enable Flow Control Decode and Generation */ + REG_WRITE(usbase + EMAC_MACFCPTV, 0); + + /* Common init */ + qdpc_emac_initcommon(usbase); +} + +int32_t qdpc_emac_init(struct qdpc_priv *priv) +{ + + /* Get configration for upstream and downstream DMA engines */ + qdpc_emac_getconfig(priv); + + /* Setup PHYs */ + qdpc_emac_phyinit(priv); + + /* Reset the EMACs */ + qdpc_emac_reset(priv); + + /* Initialize the downstream and upstream DMA engines */ + qdpc_emac_dsinit(priv); + qdpc_emac_usinit(priv); + + return SUCCESS; +} + /* USE_EMAC_DMA */ diff --git a/package/firmware/quantenna/src/drivers/pcie/target/qdpc_emac.h b/package/firmware/quantenna/src/drivers/pcie/target/qdpc_emac.h new file mode 100644 index 000000000..373f9fc9a --- /dev/null +++ b/package/firmware/quantenna/src/drivers/pcie/target/qdpc_emac.h @@ -0,0 +1,316 @@ +/** + * Copyright (c) 2011-2013 Quantenna Communications, Inc. + * All rights reserved. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + **/ +#ifndef __QDPC_EMAC_H__ +#define __QDPC_EMAC_H__ + +#include + +/* Register definitions */ + +/* Some Bit values */ +#define DC_FLUSH_STATUS_BIT 0x100 +#define INV_MODE_FLUSH 0x40 +#define CACHE_DISABLE_BIT 0x01 + +#define EMAC0_ADDR (0xed000000) +#define EMAC1_ADDR (0xe8000000) +#define EMAC_DMACONFIG (0x0000) +#define EMAC_DMACTRL (0x0004) +#define EMAC_DMASTATUS (0x0008) +#define EMAC_DMAINTEN (0x000c) +#define EMAC_DMATAPC (0x0010) +#define EMAC_DMATPD (0x0014) +#define EMAC_DMARPD (0x0018) +#define EMAC_DMATBA (0x001c) +#define EMAC_DMARBA (0x0020) +#define EMAC_DMAMFC (0x0024) +#define EMAC_DMASFC (0x0028) +#define EMAC_DMARDIMC (0x002c) +#define EMAC_DMACTDP (0x0030) +#define EMAC_DMACTBP (0x0034) +#define EMAC_DMARDP (0x0038) +#define EMAC_DMACRBP (0x003c) +#define EMAC_DMAFCT (0x0044) +#define EMAC_MACGCTRL (0x0100) /* Global Control Register */ +#define EMAC_MACTCTRL (0x0104) /* Transmit Control Register */ +#define EMAC_MACRCTRL (0x0108) /* Receive Control Register */ +#define EMAC_MACMFS (0x010C) /* Maximum Frame Size Register */ +#define EMAC_MACTJS (0x0110) /* Transmit Jabber Size Register */ +#define EMAC_MACRJS (0x0114) /* Receive Jabber Size Register */ +#define EMAC_MACACTRL (0x0118) /* Address Control Register. */ +#define EMAC_MACAH1 (0x0120) /* Address#1 High Register */ +#define EMAC_MACAM1 (0x0124) /* Address#1 Med Register */ +#define EMAC_MACAL1 (0x0128) /* Address#1 Low Register */ +#define EMAC_MACAH2 (0x012C) /* Address#2 High Register */ +#define EMAC_MACAM2 (0x0130) /* Address#2 Med Register */ +#define EMAC_MACAL2 (0x0134) /* Address#2 Low Register */ +#define EMAC_MACAH3 (0x0138) /* Address#3 High Register */ +#define EMAC_MACAM3 (0x013C) /* Address#3 Med Register */ +#define EMAC_MACAL3 (0x0140) /* Address#3 Low Register */ +#define EMAC_MACAH4 (0x0144) /* Address#4 High Register */ +#define EMAC_MACAM4 (0x0148) /* Address#4 Med Register */ +#define EMAC_MACAL4 (0x014C) /* Address#4 Low Register */ +#define EMAC_MACHT1 (0x0150) /* Hash Table#1 Register */ +#define EMAC_MACHT2 (0x0154) /* Hash Table#2 Register */ +#define EMAC_MACHT3 (0x0158) /* Hash Table#3 Register */ +#define EMAC_MACHT4 (0x015C) /* Hash Table#4 Register */ +#define EMAC_MACFCCTRL (0x0160) /* Flow-Control Control Register */ +#define EMAC_MACFCPFG (0x0164) /* Flow-Control Pause Frame Generate Register */ +#define EMAC_MACFCSAH (0x0168) /* Flow-Control Source Address High Register */ +#define EMAC_MACFCSAM (0x016C) /* Flow-Control Source Address Med Register */ +#define EMAC_MACFCSAL (0x0170) /* Flow-Control Source Address Low Register */ +#define EMAC_MACFCDAH (0x0174) /* Flow-Control Destination Address High Register */ +#define EMAC_MACFCDAM (0x0178) /* Flow-Control Destination Address Med Register */ +#define EMAC_MACFCDAL (0x017C) /* Flow-Control Destination Address Low Register */ +#define EMAC_MACFCPTV (0x0180) /* Flow-Control Pause Time Value Register */ +#define EMAC_MACFCPTVH (0x0184) /* Flow-Control High Pause Time Value Register */ +#define EMAC_MACFCPTVL (0x0188) /* Flow-Control Low Pause Time Value Register */ +#define EMAC_MACMDIOCTRL (0x01A0) /* MDIO Control Register */ +#define EMAC_MACMDIODAT (0x01A4) /* MDIO Data Register */ +#define EMAC_MACRXSCCTRL (0x01A8) /* Rx. Stat Ctr Control Register */ +#define EMAC_MACRXSCDH (0x01AC) /* Rx. Stat Ctr Data High Register */ +#define EMAC_MACRXSCDL (0x01B0) /* Rx. Stat Ctr Data Low Register */ +#define EMAC_MACTXSCCTRL (0x01B4) /* Tx. Stat Ctr Control Register */ +#define EMAC_MACTXSCDH (0x01B8) /* Tx. Stat Ctr Data High Register */ +#define EMAC_MACTXSCDL (0x01BC) /* Tx. Stat Ctr Data Low Register */ +#define EMAC_MACTFIFOAF (0x01C0) /* Transmit FIFO Almost Full Register */ +#define EMAC_MACTPST (0x01C4) /* Transmit Packet Start Threshold Register */ +#define EMAC_MACRPST (0x01C8) /* Receive Packet Start Threshold Register */ +#define EMAC_MACINTR (0x01E0) /* Interrupt Register */ +#define EMAC_MACINTEN (0x01E4) /* Interrupt Enable Register */ + +#define PHY_MDIOCTRL (EMAC0_ADDR + 0x01A0) /* MDIO Control Register */ +#define PHY_MDIODATA (EMAC0_ADDR + 0x01A4) /* MDIO Data Register */ + +/* mac global control register 0x0100 */ +#define EMAC_10MBPS 0 +#define EMAC_100MBPS 1 +#define EMAC_1000MBPS 2 +#define EMAC_HD 0 +#define EMAC_FD (1<<2) +#define MAC_RX_STAT_RESET 0x08 +#define MAX_TX_STAT_RESET 0x10 + +#define EMAC_STATS_TXDMA_STOPPED (0) /* stopped */ +#define EMAC_STATS_TXDMA_FETCH0 (1) /* fetch descriptor */ +#define EMAC_STATS_TXDMA_FETCH1 (3) /* fetch data buffer */ +#define EMAC_STATS_TXDMA_CLOSE (4) /* close descriptor */ +#define EMAC_STATS_TXDMA_SUSPEND (5) /* suspended */ + +#define EMAC_STATS_RXDMA_STOPPED (0) /* stopped */ +#define EMAC_STATS_RXDMA_FETCH (1) /* fetch descriptor */ +#define EMAC_STATS_RXDMA_WAIT0 (2) /* wait for end of receive */ +#define EMAC_STATS_RXDMA_WAIT1 (3) /* wait for rx frame */ +#define EMAC_STATS_RXDMA_SUSPEND (4) /* suspended */ +#define EMAC_STATS_RXDMA_CLOSE (5) /* close descriptor */ +#define EMAC_STATS_RXDMA_FLUSH (6) /* flush buffer */ +#define EMAC_STATS_RXDMA_PUT (7) /* put buffer */ +#define EMAC_STATS_RXDMA_WAIT2 (8) /* wait for status */ + +#define EMAC_TXENABL 1 +#define EMAC_RXENABLE 1 +#define EMAC_STANDFMODE (1<<3) +#define EMAC_AUTORETRY (1<<3) + +#define EMAC_DMA_TXSTART 1 +#define EMAC_DMA_RXSTART (1<<1) +#define EMAC_DMA_BL4 (4<<1) +#define EMAC_DMA_ARBRR (1<<15) +#define EMAC_DMA_TXWFD (1<<16) +#define EMAC_DMA_SBL (1<<17) +#define EMAC_DMA_64BDAT (1<<18) + +#define MAX_TX_COUNTER (12) +#define MAX_RX_COUNTER (24) +#define TX_STAT_READ (BIT(15)) +#define RX_STAT_READ (BIT(15)) + +#define TXDESC_INTONCOMP (BIT(31)) +#define TXDESC_LASTSEG (BIT(30)) +#define TXDESC_FIRSTSEG (BIT(29)) +#define TXDESC_ADDCRCDIS (BIT(28)) +#define TXDESC_DISPADDING (BIT(27)) +#define TXDESC_ENDOFRING (BIT(26)) +#define TXDESC_SECONDCHAIN (BIT(25)) +#define TXDESC_FORCEEOPERR (BIT(24)) +#define TXDESC_OWN (BIT(31)) + +#define RXDESC_OWN (BIT(31)) +#define RXDESC_ENDOFRING (BIT(26)) + +#define PHY_MODE_CTL (0) +#define PHY_MODE_CTL_RESET BIT(15) +#define PHY_MODE_CTL_1000MB BIT(6) +#define PHY_MODE_CTL_100MB BIT(13) +#define PHY_MODE_CTL_10MB (0) +#define PHY_MODE_CTL_LOOPBACK BIT(14) +#define PHY_MODE_CTL_AUTONEG BIT(12) +#define PHY_MODE_CTL_POWERDOWN BIT(11) +#define PHY_MODE_CTL_ISOLATE BIT(10) +#define PHY_MODE_CTL_RESTART_AUTONEG BIT(9) +#define PHY_MODE_CTL_FULL_DUPLEX BIT(8) +#define PHY_MODE_CTL_COL_TEST BIT(7) + +#define PHY_ID1 (2) +#define PHY_ID2 (3) + +#define PHY_SPEED_AUTO (0) +#define PHY_SPEED_1000MB (1) +#define PHY_SPEED_100MB (2) +#define PHY_SPEED_10MB (3) + +enum AraMacRegVals { + /* DMA config register */ + DmaSoftReset = 1, + Dma1WordBurst = (0x01 << 1), + Dma4WordBurst = (0x04 << 1), + Dma16WordBurst = (0x10 << 1), + DmaRoundRobin = (1 << 15), + DmaWait4Done = (1 << 16), + DmaStrictBurst = (1 << 17), + Dma64BitMode = (1 << 18), + /* DMA control register */ + DmaStartTx = (1 << 0), + DmaStartRx = (1 << 1), + /* DMA status/interrupt & interrupt mask registers */ + DmaTxDone = (1 << 0), + DmaNoTxDesc = (1 << 1), + DmaTxStopped = (1 << 2), + DmaRxDone = (1 << 4), + DmaNoRxDesc = (1 << 5), + DmaRxStopped = (1 << 6), + DmaRxMissedFrame = (1 << 7), + DmaMacInterrupt = (1 << 8), + DmaAllInts = DmaTxDone | DmaNoTxDesc | DmaTxStopped | DmaRxDone | + DmaNoRxDesc | DmaRxStopped | DmaRxMissedFrame | DmaMacInterrupt, + DmaTxStateMask = (7 << 16), + DmaTxStateStopped = (0 << 16), + DmaTxStateFetchDesc = (1 << 16), + DmaTxStateFetchData = (2 << 16), + DmaTxStateWaitEOT = (3 << 16), + DmaTxStateCloseDesc = (4 << 16), + DmaTxStateSuspended = (5 << 16), + DmaRxStateMask = (15 << 21), + DmaRxStateStopped = (0 << 21), + DmaRxStateFetchDesc = (1 << 21), + DmaRxStateWaitEOR = (2 << 21), + DmaRxStateWaitFrame = (3 << 21), + DmaRxStateSuspended = (4 << 21), + DmaRxStateCloseDesc = (5 << 21), + DmaRxStateFlushBuf = (6 << 21), + DmaRxStatePutBuf = (7 << 21), + DmaRxStateWaitStatus = (8 << 21), + /* MAC global control register */ + MacSpeed10M = (0 << 0), + MacSpeed100M = (1 << 0), + MacSpeed1G = (2 << 0), + MacSpeedMask = (3 << 0), + MacFullDuplex = (1 << 2), + MacResetRxStats = (1 << 3), + MacResetTxStats = (1 << 4), + /* MAC TX control */ + MacTxEnable = (1 << 0), + MacTxInvertFCS = (1 << 1), + MacTxDisableFCSInsertion = (1 << 2), + MacTxAutoRetry = (1 << 3), + MacTxIFG96 = (0 << 4), + MacTxIFG64 = (1 << 4), + MacTxIFG128 = (2 << 4), + MacTxIFG256 = (3 << 4), + MacTxPreamble7 = (0 << 6), + MacTxPreamble3 = (2 << 6), + MacTxPreamble5 = (3 << 6), + /* MAC RX control */ + MacRxEnable = (1 << 0), + MacRxDisableFcs = (1 << 1), + MacRxStripFCS = (1 << 2), + MacRxStoreAndForward = (1 << 3), + MacRxPassBadFrames = (1 << 5), + MacAccountVLANs = (1 << 6), + /* MAC address control */ + MacAddr1Enable = (1 << 0), + MacAddr2Enable = (1 << 1), + MacAddr3Enable = (1 << 2), + MacAddr4Enable = (1 << 3), + MacInverseAddr1Enable = (1 << 4), + MacInverseAddr2Enable = (1 << 5), + MacInverseAddr3Enable = (1 << 6), + MacInverseAddr4Enable = (1 << 7), + MacPromiscuous = (1 << 8), + /* MAC flow control */ + MacFlowDecodeEnable = (1 << 0), + MacFlowGenerationEnable = (1 << 1), + MacAutoFlowGenerationEnable = (1 << 2), + MacFlowMulticastMode = (1 << 3), + MacBlockPauseFrames = (1 << 4), + + /* MDIO control register values */ + MacMdioCtrlPhyMask = 0x1f, + MacMdioCtrlPhyShift = 0, + MacMdioCtrlRegMask = 0x1f, + MacMdioCtrlRegShift = 5, + MacMdioCtrlRead = (1 << 10), + MacMdioCtrlWrite = 0, + MacMdioCtrlStart = (1 << 15), + /* MDIO data register values */ + MacMdioDataMask = 0xffff, + /* MAC interrupt & interrupt mask values */ + MacUnderrun = (1 << 0), + MacJabber = (1 << 0), + /* RX statistics counter control */ + RxStatReadBusy = (1 << 15), + /* TX statistics counter control */ + TxStatReadBusy = (1 << 15), + + /* Flow Control */ + MacFCHighThreshold = (((QDPC_DESC_RING_SIZE - (QDPC_DESC_RING_SIZE >> 3)) & 0xffff) << 16), + MacFCLowThreshold = (8 << 0), +}; + +#define QDPC_DMA_DS_ERROR (DmaRxMissedFrame | DmaNoRxDesc) +#define QDPC_DMA_DS_INTR (DmaRxDone | DmaMacInterrupt | QDPC_DMA_DS_ERROR) +#define QDPC_MAC_DS_INTR (MacUnderrun | MacJabber) + +#define QDPC_DMA_US_MISC (DmaNoRxDesc | DmaRxStopped | DmaTxStopped | DmaRxMissedFrame ) +#define QDPC_DMA_US_INTR (DmaRxDone | DmaMacInterrupt | QDPC_DMA_US_MISC) +#define QDPC_MAC_US_INTR (MacUnderrun | MacJabber) + +#define QDPC_DMA_TX_IMC_EN BIT(31) +#define QDPC_DMA_TX_IMC_NFRAMES(x) ((x)&0xF) +#define QDPC_DMA_TX_IMC_TICKS(ahb_ticks) (((ahb_ticks) & 0xFFFFF) << 8) +#define QDPC_DMA_TX_IMC_NTICKS 0x07FFF +#define QDPC_DMA_TX_IMC_DELAY (QDPC_DMA_TX_IMC_TICKS(QDPC_DMA_TX_IMC_NTICKS)) + +#define QDPC_DMA_TX_STATUS(x) (((x) >> 16) & 0x7) +#define QDPC_DMA_RX_STATUS(x) (((x) >> 20) & 0xf) + +#define QDPC_DMA_INT_MITIGATION_NUM (8) +#define QDPC_DMA_AUTO_POLLING_CNT (0x1FFF) + +int qdpc_emac_init(struct qdpc_priv *priv); +int qdpc_emac_dma(void *dst, void *src, u32 len); +void qdpc_flush_and_inv_dcache_range(unsigned long start, unsigned long end); +void qdpc_emac_ack(void); + +void qdpc_emac_enable(struct qdpc_priv *priv); +void qdpc_emac_disable(struct qdpc_priv *priv); +void qdpc_emac_startdma(qdpc_pdring_t *pktqpktq); + + +#endif /* __QDPC_EMAC_H__ */ diff --git a/package/firmware/quantenna/src/drivers/pcie/target/qdpc_init.c b/package/firmware/quantenna/src/drivers/pcie/target/qdpc_init.c new file mode 100644 index 000000000..52368fe34 --- /dev/null +++ b/package/firmware/quantenna/src/drivers/pcie/target/qdpc_init.c @@ -0,0 +1,237 @@ +/** + * Copyright (c) 2011-2013 Quantenna Communications, Inc. + * All rights reserved. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + **/ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "qdpc_config.h" +#include "qdpc_debug.h" +#include "qdpc_init.h" + +MODULE_AUTHOR("Quantenna"); +MODULE_LICENSE("GPL"); +MODULE_DESCRIPTION("Virtual ethernet driver for Quantenna Ruby device"); +MODULE_VERSION(QDPC_MODULE_VERSION); + +char *qdpc_mac0addr = NULL; +module_param(qdpc_mac0addr, charp, 0); +uint8_t qdpc_basemac[ETH_ALEN] = {'\0', 'R', 'U', 'B', 'Y', '%'}; + +static int qdpc_parse_mac(const char *mac_str, uint8_t *mac) +{ + unsigned int tmparray[ETH_ALEN]; + + if (mac_str == NULL) + return -1; + + if (sscanf(mac_str, "%02x:%02x:%02x:%02x:%02x:%02x", + &tmparray[0], + &tmparray[1], + &tmparray[2], + &tmparray[3], + &tmparray[4], + &tmparray[5]) != ETH_ALEN) { + return -1; + } + + mac[0] = tmparray[0]; + mac[1] = tmparray[1]; + mac[2] = tmparray[2]; + mac[3] = tmparray[3]; + mac[4] = tmparray[4]; + mac[5] = tmparray[5]; + + return 0; +} + +static void qdpc_nl_recv_msg(struct sk_buff *skb); +int qdpc_init_netdev(struct net_device **net_dev); + +static void qdpc_get_config(struct qdpc_priv *priv) +{ + int cfg_var = 0; + qdpc_config_t *ep_config = &priv->ep_config; + memset (ep_config, 0, sizeof(qdpc_config_t)); + ep_config->cf_usdma = 1; + ep_config->cf_dsdma = 0; + ep_config->cf_msi = 1; + ep_config->cf_64bit = 0; + ep_config->cf_usdma_ndesc = QDPC_DESC_RING_SIZE; + ep_config->cf_dsdma_ndesc = QDPC_DESC_DSRING_SIZE; + + get_board_config(BOARD_CFG_PCIE, &cfg_var); + if ((cfg_var & PCIE_USE_PHY_LOOPBK) == PCIE_USE_PHY_LOOPBK) + { + ep_config->cf_miipllclk = 0x8f8f8f8f; + } else { +#ifdef CVM_HOST + ep_config->cf_miipllclk = 0x8f808f8f; +#else + ep_config->cf_miipllclk = 0x8f808f80; +#endif + } + +} +/* Global net device pointer */ +struct net_device *qdpc_ndev = NULL; + +int __init qdpc_init_module(void) +{ + struct qdpc_priv *priv; + struct net_device *ndev = NULL; + int ret = SUCCESS; + + if (qdpc_mac0addr != NULL) { + qdpc_parse_mac(qdpc_mac0addr, qdpc_basemac); + } + + /* Creating net device */ + ret = qdpc_init_netdev(&ndev); + if (ret) { + return ret; + } + + qdpc_ndev = ndev; + priv = netdev_priv(ndev); + + /* ep2h isr lock */ + spin_lock_init(&priv->lock); + + /* Get board configuration */ + qdpc_get_config(priv); + + /* Initialize INIT WORK */ + INIT_WORK(&priv->init_work, qdpc_init_work); + + /* Create netlink */ + priv->netlink_socket = netlink_kernel_create(&init_net, QDPC_NETLINK_RPC_PCI, 0, qdpc_nl_recv_msg, + NULL, THIS_MODULE); + if (!priv->netlink_socket) { + PRINT_ERROR(KERN_ALERT "Error creating netlink socket.\n"); + ret = FAILURE; + goto error; + } + + /* Initialize Interrupts */ + ret = qdpc_pcie_init_intr(ndev); + if (ret < 0) { + PRINT_ERROR("Interrupt Initialization failed \n"); + goto out; + } + + schedule_work(&priv->init_work); + + return ret; + +out: + /* Release netlink */ + netlink_kernel_release(priv->netlink_socket); + +error: + /* Free netdevice */ + unregister_netdev(ndev); + free_netdev(ndev); + + return ret; +} + +static void __exit qdpc_exit_module(void) +{ + struct qdpc_priv *priv = NULL; + + if (qdpc_ndev) { + priv = netdev_priv(qdpc_ndev); + + /* release netlink socket */ + netlink_kernel_release(priv->netlink_socket); + + /* release scheduled work */ + cancel_work_sync(&priv->init_work); + + /* Free intettupt line */ + qdpc_free_interrupt(qdpc_ndev); + + /* Free net device */ + unregister_netdev(qdpc_ndev); + free_netdev(qdpc_ndev); + + qdpc_ndev = NULL; + } + + return; +} + +static void qdpc_nl_recv_msg(struct sk_buff *skb) +{ + struct qdpc_priv *priv = netdev_priv(qdpc_ndev); + struct nlmsghdr *nlh = (struct nlmsghdr*)skb->data; + struct sk_buff *skb2; + /* Parsing the netlink message */ + + PRINT_DBG(KERN_INFO "%s line %d Netlink received pid:%d, size:%d, type:%d\n", + __FUNCTION__, __LINE__, nlh->nlmsg_pid, nlh->nlmsg_len, nlh->nlmsg_type); + + switch (nlh->nlmsg_type) { + case QDPC_NETLINK_TYPE_SVC_REGISTER: + priv->netlink_pid = nlh->nlmsg_pid;/*pid of sending process */ + return; + + case QDPC_NETLINK_TYPE_SVC_RESPONSE: + break; + + default: + PRINT_DBG(KERN_INFO "%s line %d Netlink Invalid type %d\n", + __FUNCTION__, __LINE__, nlh->nlmsg_type); + return; + } + + /* + * make a new skb. The old skb will freed in netlink_unicast_kernel, + * but we must hold the skb before DMA transfer done + */ + skb2 = alloc_skb(nlh->nlmsg_len+sizeof(qdpc_cmd_hdr_t), GFP_ATOMIC); + if (skb2) { + qdpc_cmd_hdr_t *cmd_hdr; + cmd_hdr = (qdpc_cmd_hdr_t *)skb2->data; + memcpy(cmd_hdr->dst_magic, QDPC_NETLINK_DST_MAGIC, ETH_ALEN); + memcpy(cmd_hdr->src_magic, QDPC_NETLINK_SRC_MAGIC, ETH_ALEN); + cmd_hdr->type = htons(QDPC_APP_NETLINK_TYPE); + cmd_hdr->len = htons(nlh->nlmsg_len); + memcpy(skb2->data+sizeof(qdpc_cmd_hdr_t), skb->data+sizeof(struct nlmsghdr), nlh->nlmsg_len); + + skb_put(skb2, nlh->nlmsg_len+sizeof(qdpc_cmd_hdr_t)); + qdpc_send_packet(skb2, qdpc_ndev); + } +} + +module_init(qdpc_init_module); +module_exit(qdpc_exit_module); diff --git a/package/firmware/quantenna/src/drivers/pcie/target/qdpc_init.h b/package/firmware/quantenna/src/drivers/pcie/target/qdpc_init.h new file mode 100644 index 000000000..978211562 --- /dev/null +++ b/package/firmware/quantenna/src/drivers/pcie/target/qdpc_init.h @@ -0,0 +1,123 @@ +/** + * Copyright (c) 2011-2013 Quantenna Communications, Inc. + * All rights reserved. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + **/ +#ifndef __QDPC_INIT_H_ +#define __QDPC_INIT_H_ + +#include + +#define QDPC_MODULE_NAME "qdpc_ruby" +#define QDPC_DEV_NAME "qdpc_ruby" +#define QDPC_MODULE_VERSION "1.0" + +#define SRAM_TEXT __sram_text +#define SRAM_DATA __sram_data + +/* + * Netlink Message types. + */ +#define QDPC_NETLINK_RPC_PCI 31 +#define QDPC_NETLINK_TYPE_SVC_REGISTER 10 +#define QDPC_NETLINK_TYPE_SVC_RESPONSE 11 + +#define qdpc_phys_addr(x) ((u32)(x) & 0x0fffffff) + +extern struct net_device *qdpc_ndev; +extern uint8_t qdpc_basemac[ETH_ALEN]; + +typedef struct qdpc_config { + uint32_t cf_usdma:1, + cf_dsdma:1, + cf_msi:1, + cf_64bit:1; + + uint32_t cf_usdma_ndesc; + uint32_t cf_dsdma_ndesc; + uint32_t cf_miipllclk; +} qdpc_config_t; + +/* This stores an anchor to packet buffers. */ + +struct qdpc_priv { + struct net_device *ndev; /* points net device */ + struct net_device_stats stats; /* Network statistics */ + struct tasklet_struct rx_tasklet; /* Tasklet scheduled in interrupt handler */ + struct tasklet_struct txd_tasklet; /* Tasklet scheduled in interrupt handler */ + struct tasklet_struct dmastatus_tasklet; + struct timer_list txq_enable_timer; /* timer for enable tx */ + uint32_t dsisr_status; + uint32_t usisr_status; + uint32_t dsdma_status; + uint32_t usdma_status; + uint32_t dsdma_desc; + uint32_t usdma_desc; + uint16_t host_msi_data; /* MSI data */ + struct work_struct init_work; /* INIT handshake work */ + void (*ep2host_irq)(struct qdpc_priv*); + qdpc_pktring_t pktq; + uint32_t mii_pllclk; + uint32_t *ep2host_irqstatus; + uint32_t *host2ep_irqstatus; + int32_t *host_ep2h_txd_budget; + int32_t *host_h2ep_txd_budget; + qdpc_epshmem_hdr_t *shmem; + dma_addr_t shmem_busaddr; + struct sock *netlink_socket; + uint32_t netlink_pid; + qdpc_config_t ep_config; + spinlock_t lock; /* Private structure lock */ + qdpc_pcie_bda_t *bda; + uint32_t msiaddr; +}; + +#define le32_readl(x) le32_to_cpu(readl((x))) +#define le32_writel(x, addr) writel(cpu_to_le32((x)), addr) + +static inline void qdpc_pcie_posted_write(uint32_t val, void *basereg) +{ + writel(val, basereg); + /* flush posted write */ + readl(basereg); +} + +static inline int qdpc_isbootstate(struct qdpc_priv *p, uint32_t state) { + __iomem uint32_t *status = &p->bda->bda_bootstate; + uint32_t s = le32_readl(status); + return ( s == state); +} + +/* Function prototypes */ +void qdpc_veth_rx(struct net_device *ndev); +void qdpc_pcie_irqsetup(struct net_device *ndev); +void qdpc_disable_irqs(struct qdpc_priv *priv); +void qdpc_enable_irqs(struct qdpc_priv *priv); +void qdpc_init_work(struct work_struct *task); +void qdpc_free_interrupt(struct net_device *ndev); +int qdpc_pcie_init_intr(struct net_device *ndev); +void qdpc_disable_irqs(struct qdpc_priv *priv); +void qdpc_enable_irqs(struct qdpc_priv *priv); +int qdpc_pcie_init_mem(struct net_device *ndev); +struct sk_buff *qdpc_get_skb(size_t len); +int qdpc_init_rxq(struct qdpc_priv *priv, size_t ringsize); +int qdpc_init_txq(struct qdpc_priv *priv, size_t ringsize); +void qdpc_veth_txdone(struct net_device *ndev); +void qdpc_netlink_rx(struct net_device *ndev, void *buf, size_t len); +void qdpc_intr_ep2host(struct qdpc_priv *priv, uint32_t intr); +int32_t qdpc_send_packet(struct sk_buff *skb, struct net_device *ndev); + +#endif /*__QDPC_INIT_H_ */ diff --git a/package/firmware/quantenna/src/drivers/pcie/target/qdpc_net.c b/package/firmware/quantenna/src/drivers/pcie/target/qdpc_net.c new file mode 100644 index 000000000..584719ea0 --- /dev/null +++ b/package/firmware/quantenna/src/drivers/pcie/target/qdpc_net.c @@ -0,0 +1,668 @@ +/** + * Copyright (c) 2011-2013 Quantenna Communications, Inc. + * All rights reserved. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + **/ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include "qdpc_config.h" +#include "qdpc_debug.h" +#include "qdpc_init.h" +#include "qdpc_emac.h" + +#ifdef CONFIG_QVSP +#include +#include "qtn/qdrv_sch.h" +#include "qtn/qvsp.h" + +static struct qvsp_wrapper qdpc_qvsp = {NULL, NULL}; +#endif + +#define MAX(X,Y) ((X) > (Y) ? X : Y) + +/* Net device function prototypes */ +int32_t qdpc_veth_open(struct net_device *ndev); +int32_t qdpc_veth_release(struct net_device *ndev); +struct net_device_stats *qdpc_veth_stats(struct net_device *ndev); +int32_t qdpc_veth_change_mtu(struct net_device *ndev, int new_mtu); +int32_t qdpc_veth_set_mac_addr(struct net_device *ndev, void *paddr); +int32_t qdpc_veth_tx(struct sk_buff *skb, struct net_device *ndev); + +/* Alignment helper functions */ +inline static unsigned long qdpc_align_val_up(unsigned long val, unsigned long step) +{ + return ((val + step - 1) & (~(step - 1))); +} +inline static unsigned long qdpc_align_val_down(unsigned long val, unsigned long step) +{ + return (val & (~(step - 1))); +} +inline static void* qdpc_align_buf_dma(void *addr) +{ + return (void*)qdpc_align_val_up((unsigned long)addr, dma_get_cache_alignment()); +} +inline static unsigned long qdpc_align_buf_dma_offset(void *addr) +{ + return (qdpc_align_buf_dma(addr) - addr); +} +inline static void* qdpc_align_buf_cache(void *addr) +{ + return (void*)qdpc_align_val_down((unsigned long)addr, dma_get_cache_alignment()); +} +inline static unsigned long qdpc_align_buf_cache_offset(void *addr) +{ + return (addr - qdpc_align_buf_cache(addr)); +} +inline static unsigned long qdpc_align_buf_cache_size(void *addr, unsigned long size) +{ + return qdpc_align_val_up(size + qdpc_align_buf_cache_offset(addr), + dma_get_cache_alignment()); +} + +/* Net device operations structure */ +static struct net_device_ops veth_ops = { + .ndo_open = qdpc_veth_open, + .ndo_stop = qdpc_veth_release, + .ndo_get_stats = qdpc_veth_stats, + .ndo_set_mac_address = qdpc_veth_set_mac_addr, + .ndo_change_mtu = qdpc_veth_change_mtu, + .ndo_start_xmit = qdpc_veth_tx, +}; + +static inline bool check_netlink_magic(qdpc_cmd_hdr_t *cmd_hdr) +{ + return ((memcmp(cmd_hdr->dst_magic, QDPC_NETLINK_DST_MAGIC, ETH_ALEN) == 0) + && (memcmp(cmd_hdr->src_magic, QDPC_NETLINK_SRC_MAGIC, ETH_ALEN) == 0)); +} + +int32_t qdpc_veth_open(struct net_device *ndev) +{ + struct qdpc_priv *priv = netdev_priv(ndev); + + + if (!qdpc_isbootstate(priv, QDPC_BDA_FW_RUNNING)) { + netif_stop_queue(ndev); /* can't transmit any more */ + return SUCCESS; + } + + flush_scheduled_work(); + netif_start_queue(ndev); + + return SUCCESS; +} + +int32_t qdpc_veth_release(struct net_device *ndev) +{ + struct qdpc_priv *priv = netdev_priv(ndev); + + netif_stop_queue(ndev); /* can't transmit any more */ + qdpc_emac_disable(priv); + + return SUCCESS; +} + +#ifdef CONFIG_QVSP +void qvsp_wrapper_init(struct qvsp_ext_s *qvsp, QVSP_CHECK_FUNC_PROTOTYPE(*check_func)) +{ + qdpc_qvsp.qvsp = qvsp; + qdpc_qvsp.qvsp_check_func = check_func; +} +EXPORT_SYMBOL(qvsp_wrapper_init); + +void qvsp_wrapper_exit(void) +{ + qdpc_qvsp.qvsp_check_func = NULL; + qdpc_qvsp.qvsp = NULL; +} +EXPORT_SYMBOL(qvsp_wrapper_exit); + +static __sram_text int qdpc_rx_vsp_should_drop(struct sk_buff *skb, struct ethhdr *eh) +{ + u8 *data_start; + u16 ether_type = 0; + + if (qvsp_is_active(qdpc_qvsp.qvsp) && qdpc_qvsp.qvsp_check_func) { + data_start = qdrv_sch_find_data_start(skb, (struct ether_header *)eh, ðer_type); + qdrv_sch_classify(skb, ether_type, data_start); + if (qdpc_qvsp.qvsp_check_func(qdpc_qvsp.qvsp, QVSP_IF_PCIE_RX, skb, + data_start, skb->len - (data_start - skb->data), + skb->priority)) { + trace_ippkt_dropped(TRACE_IPPKT_DROP_RSN_VSP, 1, 0); + return 1; + } + } + + return 0; +} +#else +#define qdpc_rx_vsp_should_drop(_skb, _data_start) (0) +#endif /* CONFIG_QVSP */ + +static inline SRAM_TEXT void qdpc_tx_skb_recycle(struct sk_buff *skb) +{ +#if defined(QDPC_USE_SKB_RECYCLE) + struct qtn_skb_recycle_list *recycle_list = qtn_get_shared_recycle_list(); + + if (!qtn_skb_recycle_list_push(recycle_list, + &recycle_list->stats_pcie, skb)) { + dev_kfree_skb_any(skb); + } +#else + dev_kfree_skb_any(skb); +#endif +} + +/* function runs in tasklet/softirq priority */ +void qdpc_netlink_rx(struct net_device *ndev, void *buf, size_t len) +{ + struct qdpc_priv *priv = netdev_priv(ndev); + struct sk_buff *skb = nlmsg_new(len, 0); + struct nlmsghdr *nlh; + int ret; + + if (skb == NULL) { + DBGPRINTF(DBG_LL_WARNING, QDRV_LF_WARN, "WARNING: out of netlink SKBs\n"); + return ; + } + + nlh = nlmsg_put(skb, 0, 0, NLMSG_DONE, len, 0); ; + memcpy(nlmsg_data(nlh), buf, len); + NETLINK_CB(skb).dst_group = 0; + + /* Send the netlink message to user application */ + ret = nlmsg_unicast(priv->netlink_socket, skb, priv->netlink_pid); + if (ret < 0) { + DBGPRINTF(DBG_LL_NOTICE, QDRV_LF_TRACE, + "pid %d socket 0x%p ret %d\n", + priv->netlink_pid, priv->netlink_socket, ret); + } +} + +static SRAM_TEXT size_t qdpc_rx_process_frame(struct net_device *ndev, + qdpc_desc_t *rx_desc, uint32_t dma_status, bool lastdesc) +{ + qdpc_dmadesc_t *rx_hwdesc = rx_desc->dd_hwdesc; + const uint32_t buffer_size = QDPC_DMA_MAXBUF; + uint32_t dma_control = 0; + uint32_t dma_data = 0; + struct sk_buff *skb; + struct ethhdr *eth; + qdpc_cmd_hdr_t *cmd_hdr; + size_t dmalen; + + skb = (struct sk_buff *)rx_desc->dd_metadata; + dmalen = QDPC_DMA_RXLEN(dma_status); + + /* Check for runt packets */ + if (skb && (dmalen >= QDPC_DMA_MINBUF) && (dmalen <= QDPC_DMA_MAXBUF) + && (QDPC_DMA_SINGLE_BUFFER(dma_status))){ + dma_unmap_single((struct device *)ndev, rx_hwdesc->dma_data, + buffer_size, DMA_FROM_DEVICE); + eth = (struct ethhdr *)skb->data; + + switch (ntohs(eth->h_proto)) { + case QDPC_APP_NETLINK_TYPE: + /* Double Check if it's netlink packet*/ + cmd_hdr = (qdpc_cmd_hdr_t *)skb->data; + if (check_netlink_magic(cmd_hdr)) { + qdpc_netlink_rx(ndev, skb->data + sizeof(qdpc_cmd_hdr_t), ntohs(cmd_hdr->len)); + } + break; + default: + skb->dev = ndev; + skb->len = 0; + skb_reset_tail_pointer(skb); + skb_put(skb, dmalen); + skb->ip_summed = CHECKSUM_UNNECESSARY; + skb->protocol = eth_type_trans(skb, ndev); + + if (!is_multicast_ether_addr((uint8_t *)eth) && + qdpc_rx_vsp_should_drop(skb, eth)) { + dev_kfree_skb_any(skb); + } else { + netif_rx(skb); + } + skb = NULL; + break; + } + } else { + DBGPRINTF(DBG_LL_WARNING, QDRV_LF_WARN, + "RX: Drop packet. Skb: 0x%p Status:0x%x Len:%u\n", skb, dma_status, dmalen); + } + + if (skb) + dev_kfree_skb_any(skb); + + skb = qdpc_get_skb(buffer_size); + if (skb == NULL) { + dma_data = 0; + dma_control = (lastdesc ? QDPC_DMA_LAST_DESC : 0); + } else { + /* + * skb->data has already cache line alignment when returned from qdpc_get_skb, + * no need to do cache line alignment again. + */ + dma_data = dma_map_single((struct device *)ndev, (void*)skb->data, + buffer_size, DMA_FROM_DEVICE); + dma_control = (buffer_size & QDPC_DMA_LEN_MASK) | (lastdesc ? QDPC_DMA_LAST_DESC : 0); + } + dma_status = (QDPC_DMA_OWN); + rx_desc->dd_metadata = (void *)skb; + + arc_write_uncached_32(&rx_hwdesc->dma_control, dma_control); + arc_write_uncached_32(&rx_hwdesc->dma_data, dma_data); + arc_write_uncached_32(&rx_hwdesc->dma_status, dma_status); + + return dmalen; +} + +static SRAM_TEXT void qdpc_indicate_peer_rx_nfree(struct qdpc_priv *priv, + qdpc_pdring_t *rxq, qdpc_desc_t *rx_desc, uint32_t dma_status) +{ + uint32_t nfree = rxq->pd_ringsize; + qdpc_desc_t *rx_last_desc; + unsigned long flags; + + local_irq_save(flags); + if (unlikely(QDPC_DMA_OWNED(dma_status) == 0)) { + rx_last_desc = rx_desc; + for (rx_desc = rxq->pd_nextdesc; (rx_desc != rx_last_desc) && (nfree > 0);) { + dma_status = arc_read_uncached_32(&rx_desc->dd_hwdesc->dma_status); + if (QDPC_DMA_OWNED(dma_status) == 0) { + nfree--; + } else { + break; + } + + if (rx_desc == rxq->pd_lastdesc) { + rx_desc = rxq->pd_firstdesc; + } else { + rx_desc++; + } + } + if (nfree <= QDPC_VETH_RX_LOW_WATERMARK) + nfree = 0; + } + + arc_write_uncached_32(priv->host_ep2h_txd_budget, nfree); + local_irq_restore(flags); +} + +SRAM_TEXT void qdpc_veth_rx(struct net_device *ndev) +{ + struct qdpc_priv *priv = netdev_priv(ndev); + qdpc_pdring_t *rxq = &priv->pktq.pkt_dsq; + uint32_t budget = QDPC_DESC_RING_SIZE << 1; + uint32_t dma_status = 0; + qdpc_desc_t *rx_desc; + qdpc_dmadesc_t *rx_hwdesc; + bool lastdesc; + uint32_t pktlen; + + if (rxq->pd_nextdesc == NULL) + return; + + rx_desc = rxq->pd_nextdesc; + rx_hwdesc = rx_desc->dd_hwdesc; + dma_status = arc_read_uncached_32(&rx_hwdesc->dma_status); + + while (budget-- > 0 && (QDPC_DMA_OWNED(dma_status) == 0)) { + rx_desc = rxq->pd_nextdesc; + lastdesc = (rxq->pd_nextdesc == rxq->pd_lastdesc); + rx_hwdesc = rx_desc->dd_hwdesc; + + pktlen = qdpc_rx_process_frame(ndev, rx_desc, dma_status, lastdesc); + + /* Check for end of ring, and loop around */ + if (lastdesc) { + rxq->pd_nextdesc = rxq->pd_firstdesc; + } else { + rxq->pd_nextdesc++; + } + + /* Update the statistics */ + priv->stats.rx_packets++; + priv->stats.rx_bytes += pktlen; + + dma_status = arc_read_uncached_32(&rxq->pd_nextdesc->dd_hwdesc->dma_status); + } + + qdpc_indicate_peer_rx_nfree(priv, rxq, rx_desc, dma_status); + qdpc_intr_ep2host(priv, QDPC_EP_TXDONE); +} + +SRAM_TEXT uint32_t qdpc_dma_state(qdpc_pdring_t *q) +{ + return readl(q->pd_rx_basereg + EMAC_DMASTATUS); + +} +static inline SRAM_TEXT void qdpc_start_txdma(struct qdpc_priv *priv) +{ + qdpc_pdring_t *txq = &priv->pktq.pkt_usq; + + /* Must hold TXQ lock before running */ + //ASSERT(spin_is_locked(&txq->pd_lock)); + if (txq->pd_npending) { + qdpc_emac_startdma(txq); + } +} + +static SRAM_TEXT uint32_t qdpc_veth_txprocessq(struct net_device *ndev, uint32_t maxpkts) +{ + struct qdpc_priv *priv = netdev_priv(ndev); + qdpc_pdring_t *txq = &priv->pktq.pkt_usq; + qdpc_desc_t *tx_desc; + uint32_t nprocessed = 0; + uint32_t dma_data = 0; + uint32_t dma_len = 0; + struct sk_buff * skb; + + /* Must hold TXQ lock before running */ + //ASSERT(spin_is_locked(&txq->pd_lock)); + + for(nprocessed = 0; nprocessed < maxpkts; nprocessed++) { + tx_desc = STAILQ_FIRST(&txq->pd_pending); + if (!tx_desc || !((arc_read_uncached_32(&tx_desc->dd_hwdesc->dma_status) & QDPC_DMA_OWN) == 0)) { + break; + } + STAILQ_REMOVE_HEAD(&txq->pd_pending, dd_entry); + + skb = (struct sk_buff *)tx_desc->dd_metadata; + dma_data = tx_desc->dd_hwdesc->dma_data; + if (skb->len <= QDPC_DMA_MINBUF) { + dma_len = QDPC_DMA_MINBUF; + } else { + dma_len = skb->len & QDPC_DMA_LEN_MASK; + } + + dma_unmap_single((struct device *)ndev, qdpc_align_buf_cache(dma_data), + qdpc_align_buf_cache_size(dma_data, dma_len), DMA_TO_DEVICE); + qdpc_tx_skb_recycle(skb); + tx_desc->dd_metadata = NULL; + tx_desc->dd_qtime = 0; + } + + txq->pd_nfree += nprocessed; + txq->pd_npending -= nprocessed; + return nprocessed; + +} + +inline static SRAM_TEXT void qdpc_send_rxdone(struct qdpc_priv *priv) +{ + qdpc_intr_ep2host(priv, QDPC_EP_RXDONE); +} + + +SRAM_DATA static int peer_rx_nfree = QDPC_DESC_RING_SIZE; + +static SRAM_TEXT int32_t qdpc_update_peer_nfree(struct qdpc_priv *priv) +{ + int32_t budget; + + budget = arc_read_uncached_32(priv->host_h2ep_txd_budget); + if (budget < 0) { + budget = peer_rx_nfree; + } else { + peer_rx_nfree = budget; + arc_write_uncached_32(priv->host_h2ep_txd_budget, -1); + } + + return budget; +} + +/* TX completion routine, Runs as tasklet/softirq priority */ +SRAM_TEXT void qdpc_veth_txdone(struct net_device *ndev) +{ + struct qdpc_priv *priv = netdev_priv(ndev); + qdpc_pdring_t *txq = &priv->pktq.pkt_usq; + int32_t npending = (int32_t)txq->pd_npending; + + spin_lock_bh(&txq->pd_lock); + + qdpc_veth_txprocessq(ndev, npending >> 1); + if (netif_queue_stopped(ndev)) { + del_timer(&priv->txq_enable_timer); + qdpc_send_rxdone(priv); + netif_wake_queue(ndev); + } + + spin_unlock_bh(&txq->pd_lock); +} + +static SRAM_TEXT int qdpc_send_desc_check(struct qdpc_priv *priv, + qdpc_pdring_t *txq) +{ + int32_t budget; + int32_t ret = 1; + unsigned long flags; + + local_irq_save(flags); + if (txq->pd_nfree > QDPC_VETH_TX_LOW_WATERMARK) { + budget = qdpc_update_peer_nfree(priv); + if (budget > (txq->pd_npending + QDPC_VETH_RX_LOW_WATERMARK)) { + peer_rx_nfree--; + ret = 0; + } + } else { + qdpc_start_txdma(priv); + } + local_irq_restore(flags); + + return ret; +} + +SRAM_TEXT int32_t qdpc_send_packet(struct sk_buff *skb, struct net_device *ndev) +{ + struct qdpc_priv *priv = netdev_priv(ndev); + qdpc_pdring_t *txq = &priv->pktq.pkt_usq; + qdpc_dmadesc_t *tx_hwdesc; + qdpc_desc_t *tx_desc; + struct sk_buff *skb_cpy = NULL; + bool lastdesc; + uint32_t dma_control = 0 ; + uint32_t dma_status = 0; + uint32_t dma_data = 0; + uint32_t dma_len = 0; + + if (unlikely((skb->len == 0) || (skb->len > QDPC_MAX_MTU))) { + DBGPRINTF(DBG_LL_WARNING, QDRV_LF_WARN, + "Xmit packet invalid: len %d\n", skb->len); + dev_kfree_skb_any(skb); + priv->stats.tx_dropped++; + return NETDEV_TX_OK; + } + + spin_lock_bh(&txq->pd_lock); + + if (qdpc_send_desc_check(priv, txq)) { + netif_stop_queue(ndev); + mod_timer(&priv->txq_enable_timer, jiffies + msecs_to_jiffies(QDPC_STOP_QUEUE_TIMER_DELAY)); + spin_unlock_bh(&txq->pd_lock); + + priv->stats.tx_errors++; + return NETDEV_TX_BUSY; + } + + /* Map data buffer. */ + if (skb->len <= QDPC_DMA_MINBUF) { + dma_len = QDPC_DMA_MINBUF; + } else { + dma_len = skb->len & QDPC_DMA_LEN_MASK; + } + if (unlikely(dma_len >= QDPC_DMA_MAXBUF)) { + spin_unlock_bh(&txq->pd_lock); + DBGPRINTF(DBG_LL_WARNING, QDRV_LF_WARN, + "Xmit packet too big: len %d dmalen %d\n", skb->len, dma_len); + dev_kfree_skb_any(skb); + priv->stats.tx_dropped++; + return NETDEV_TX_OK; + } + + + if (unlikely(skb_linearize(skb) != 0)) { + DBGPRINTF(DBG_LL_WARNING, QDRV_LF_WARN, + "WARNING:%u Linearize failed\n", __LINE__); + dev_kfree_skb_any(skb); + priv->stats.tx_dropped++; + return NETDEV_TX_OK; + } + + tx_desc = txq->pd_nextdesc; + tx_hwdesc = tx_desc->dd_hwdesc; + lastdesc = (tx_desc == txq->pd_lastdesc); + + /* Hold onto skb. Release when we get a txdone */ + tx_desc->dd_metadata = (void *)skb; + + if (lastdesc) { + txq->pd_nextdesc = txq->pd_firstdesc; + } else { + txq->pd_nextdesc++; + } + + dma_data = dma_map_single((struct device *)ndev, qdpc_align_buf_cache(skb->data), + qdpc_align_buf_cache_size(skb->data, dma_len), DMA_TO_DEVICE) + + qdpc_align_buf_cache_offset(skb->data); + dma_control = (QDPC_DMA_SINGLE_TXBUFFER | QDPC_DMA_TX_NOCRC + |(lastdesc ? QDPC_DMA_LAST_DESC : 0) | (QDPC_DMA_LEN_MASK & dma_len)); + dma_status = QDPC_DMA_OWN; + arc_write_uncached_32(&tx_hwdesc->dma_control, dma_control); + arc_write_uncached_32(&tx_hwdesc->dma_data, dma_data); + arc_write_uncached_32(&tx_hwdesc->dma_status, dma_status); + + tx_desc->dd_qtime = jiffies; + STAILQ_INSERT_TAIL(&txq->pd_pending, tx_desc, dd_entry); + txq->pd_nfree--; + txq->pd_npending++; + + /* DMA engine setup for auto poll so no doorbell push needed */ + + spin_unlock_bh(&txq->pd_lock); + + priv->stats.tx_packets++; + priv->stats.tx_bytes += skb->len; + + return NETDEV_TX_OK; +} + +SRAM_TEXT int32_t qdpc_veth_tx(struct sk_buff *skb, struct net_device *ndev) +{ + return qdpc_send_packet(skb, ndev); +} + +struct net_device_stats *qdpc_veth_stats(struct net_device *ndev) +{ + struct qdpc_priv *priv = netdev_priv(ndev); + + return &priv->stats; +} + +int32_t qdpc_veth_change_mtu(struct net_device *ndev, + int new_mtu) +{ + struct qdpc_priv *priv = netdev_priv(ndev); + spinlock_t *lock = &priv->lock; + unsigned long flags; + + /* check ranges */ + if ((new_mtu < QDPC_MIN_MTU) || (new_mtu > QDPC_MAX_MTU)) + return -EINVAL; + /* + * Do anything you need, and the accept the value + */ + spin_lock_irqsave(lock, flags); + ndev->mtu = new_mtu; + spin_unlock_irqrestore(lock, flags); + + return SUCCESS; /* success */ +} + +int32_t qdpc_veth_set_mac_addr(struct net_device *ndev, + void *paddr) +{ + struct sockaddr *addr = (struct sockaddr *)paddr; + + if (netif_running(ndev)) + return -EBUSY; + + if (!is_valid_ether_addr((u8 *)addr->sa_data)) + return -EINVAL; + + memcpy(ndev->dev_addr, addr->sa_data, ndev->addr_len); + + return SUCCESS; +} + +int32_t qdpc_init_netdev(struct net_device **net_dev) +{ + struct qdpc_priv *priv; + struct net_device *ndev; + unsigned char macaddr[ETH_ALEN]; + int ret = 0; + + /* Net device initialization */ + /* Allocate the devices */ + ndev = alloc_netdev(sizeof(struct qdpc_priv), "pcie%d", + ether_setup); + if (!ndev) { + PRINT_ERROR("Error in allocating the net device \n"); + return -ENOMEM; + } + + /* No interesting netdevice features in this card... */ + priv = netdev_priv(ndev); + priv->ndev = ndev; + + memcpy(macaddr, qdpc_basemac, ETH_ALEN); + macaddr[0] = (macaddr[0] & 0x1F) | (((macaddr[0] & 0xE0) + 0x20) & 0xE0) | 0x02; + memcpy(ndev->dev_addr, macaddr, ETH_ALEN); + + *net_dev = ndev; /* Storing ndev in global dev */ + + /* Assign net device operations structure */ + + ndev->netdev_ops = &veth_ops; + + /* Register net device */ + ret = register_netdev(ndev); + if (ret) { + PRINT_ERROR("veth: error %i registering net device \"%s\"\n", + ret, ndev->name); + } + + if (ret) { + free_netdev(ndev); + } + + return ret; +} diff --git a/package/firmware/quantenna/src/drivers/pcie/target/qdpc_pcie.c b/package/firmware/quantenna/src/drivers/pcie/target/qdpc_pcie.c new file mode 100644 index 000000000..a177354f8 --- /dev/null +++ b/package/firmware/quantenna/src/drivers/pcie/target/qdpc_pcie.c @@ -0,0 +1,460 @@ +/** + * Copyright (c) 2011-2013 Quantenna Communications, Inc. + * All rights reserved. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + **/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#include "qdpc_config.h" +#include "qdpc_debug.h" +#include "qdpc_init.h" +#include "qdpc_regs.h" +#include "qdpc_ruby.h" +#include "qdpc_emac.h" + + +/* Utility macros. Move ? */ +#ifndef MAX +#define MAX(X,Y) ((X) > (Y) ? X : Y) +#endif +#ifndef MIN +#define MIN(X,Y) ((X) < (Y) ? X : Y) +#endif + +#define REG_WRITE(x,y) (writel((y),(x))) +#define REG_READ(x) (readl(x)) + +static void qdpc_tx_runout_func(unsigned long data) +{ + struct qdpc_priv *priv = (struct qdpc_priv*)data; + qdpc_pdring_t *txq = &priv->pktq.pkt_usq; + int32_t budget = arc_read_uncached_32(priv->host_h2ep_txd_budget); + + tasklet_schedule(&priv->txd_tasklet); + + DBGPRINTF(DBG_LL_WARNING, QDRV_LF_WARN, "Restarting tx queue\n"); + DBGPRINTF(DBG_LL_WARNING, QDRV_LF_WARN, "budget %d, free %d, pending %d\n", + budget, txq->pd_nfree, txq->pd_npending); +} + +static SRAM_TEXT inline void qdpc_intr_ep2host_unlocked(struct qdpc_priv *priv, uint32_t intr) +{ + intr |= arc_read_uncached_32(priv->ep2host_irqstatus); + arc_write_uncached_32(priv->ep2host_irqstatus, intr); + priv->ep2host_irq(priv); +} + +SRAM_TEXT void qdpc_intr_ep2host(struct qdpc_priv *priv, uint32_t intr) +{ + unsigned long flags; + + spin_lock_irqsave(&priv->lock, flags); + qdpc_intr_ep2host_unlocked(priv, intr); + spin_unlock_irqrestore(&priv->lock, flags); +} + +static SRAM_TEXT void qdpc_irq_msi(struct qdpc_priv *priv) +{ + writel(priv->host_msi_data, priv->msiaddr); +} + +static SRAM_TEXT void qdpc_irq_legacy(struct qdpc_priv *priv) +{ + /* Enable legacy interrupt mechanism */ + unsigned long pcie_cfg0 = readl(RUBY_SYS_CTL_PCIE_CFG0); + if (!(pcie_cfg0 & BIT(9))) { + pcie_cfg0 |= BIT(9); + writel(pcie_cfg0, RUBY_SYS_CTL_PCIE_CFG0); + } +} + +void qdpc_pcie_irqsetup(struct net_device *ndev) +{ + struct qdpc_priv *priv = netdev_priv(ndev); + + if ((arc_read_uncached_32(&priv->bda->bda_flags))& PCIE_BDA_MSI){ + priv->msiaddr = arc_read_uncached_32(&priv->bda->bda_msi_addr); + priv->ep2host_irq = qdpc_irq_msi; + PRINT_INFO("MSI Enabled@0x%x\n", priv->msiaddr); + } else { + priv->msiaddr = 0; + priv->ep2host_irq = qdpc_irq_legacy; + PRINT_INFO("MSI disabled using INTA\n"); + } + priv->host_msi_data = readl(RUBY_PCIE_REG_BASE + MSI_CTL_OFFSET + 0xc) & 0xffff; + + return ; +} + +static SRAM_TEXT irqreturn_t qdpc_dsdma_isr(int irq, void *dev) +{ + struct net_device *ndev = (struct net_device *)dev; + struct qdpc_priv *priv = netdev_priv(ndev); + uint32_t dsdma_rx_base = priv->pktq.pkt_dsq.pd_rx_basereg; + uint32_t dma_status = REG_READ(dsdma_rx_base + EMAC_DMASTATUS); + uint32_t isr_status = dma_status & DmaAllInts; + + if (isr_status & DmaRxDone) { + tasklet_schedule(&priv->rx_tasklet); + } + + /* Check for out of descriptor condition. Issue RX demand poll if desc avail */ + if (isr_status & (DmaNoRxDesc | DmaRxMissedFrame)) { + priv->dsdma_desc = REG_READ(dsdma_rx_base + EMAC_DMARDP); + priv->dsdma_status = REG_READ(0x80000000 + priv->dsdma_desc ); + if (QDPC_DMA_OWNED(priv->dsdma_status)) { + REG_WRITE(dsdma_rx_base + EMAC_DMARPD, 1); + } + } + + /* Restart RX if stopped */ + if ((isr_status & DmaRxStopped) && (QDPC_DMA_RX_STATUS(isr_status) == 0)) { + REG_WRITE(dsdma_rx_base + EMAC_DMACTRL, DmaStartRx); + } + + if (isr_status & (QDPC_DMA_DS_ERROR)) { + if (isr_status & DmaMacInterrupt) { + uint32_t macintr_status = REG_READ(dsdma_rx_base + EMAC_MACINTR); + + if (macintr_status & QDPC_MAC_DS_INTR) { + priv->dsisr_status |= (QDPC_MAC_DS_INTR << 9); + REG_WRITE(dsdma_rx_base + EMAC_MACINTR, QDPC_MAC_DS_INTR); + } + } + priv->dsisr_status = dma_status; + tasklet_schedule(&priv->dmastatus_tasklet); + printk(KERN_EMERG "%d:%s: out of rx descriptors\n", __LINE__, __FUNCTION__); + } + + REG_WRITE(dsdma_rx_base + EMAC_DMASTATUS , isr_status); + return IRQ_HANDLED; +} + +static SRAM_TEXT irqreturn_t qdpc_usdma_isr(int irq, void *dev) +{ + struct net_device *ndev = (struct net_device *)dev; + struct qdpc_priv *priv = netdev_priv(ndev); + uint32_t usdma_rx_base = priv->pktq.pkt_usq.pd_rx_basereg; + uint32_t isr_status = (REG_READ(usdma_rx_base + EMAC_DMASTATUS)) & DmaAllInts; + + if (isr_status & (DmaRxDone | DmaNoRxDesc | DmaRxMissedFrame)) { + qdpc_intr_ep2host_unlocked(priv, QDPC_EP_RXDONE); + + /* Issue demand poll if RX is stuck because of no descriptors */ + if (isr_status & (DmaNoRxDesc | DmaRxMissedFrame)) { + REG_WRITE(usdma_rx_base + EMAC_DMARPD, 1); + } + + /* Schedule the tx done anyway to clear up tx descriptors and let flow control run */ + tasklet_schedule(&priv->txd_tasklet); + } + + /* Restart RX if stopped */ + if ((isr_status & DmaRxStopped) && (QDPC_DMA_RX_STATUS(isr_status) == 0)) { + REG_WRITE(usdma_rx_base + EMAC_DMACTRL, DmaStartRx); + } + + /* Clear DMA Rx Transfer Done IRQ */ + if (isr_status & (QDPC_DMA_US_MISC)) { + + if (isr_status & DmaMacInterrupt) { + uint32_t macintr_status = (REG_READ(usdma_rx_base + EMAC_MACINTR) & QDPC_MAC_US_INTR); + + if (macintr_status) { + priv->usisr_status |= (macintr_status << 9); + REG_WRITE(usdma_rx_base + EMAC_MACINTR, macintr_status); + } + } + priv->usisr_status |= (isr_status & QDPC_DMA_US_INTR); + tasklet_schedule(&priv->dmastatus_tasklet); + printk(KERN_EMERG "%d:%s: out of rx descriptors\n", __LINE__, __FUNCTION__); + } + + REG_WRITE(usdma_rx_base + EMAC_DMASTATUS, isr_status); + return IRQ_HANDLED; +} +static SRAM_TEXT irqreturn_t qdpc_dma_isr(int irq, void *dev) +{ + qdpc_usdma_isr(irq, dev); + qdpc_dsdma_isr(irq, dev); + return IRQ_HANDLED; +} + +static SRAM_TEXT irqreturn_t qdpc_host_isr(int irq, void *dev) +{ + struct net_device *ndev = (struct net_device *)dev; + struct qdpc_priv *priv = netdev_priv(ndev); + qdpc_pdring_t *dsq = &priv->pktq.pkt_dsq; + uint32_t irqstatus = arc_read_uncached_32(priv->host2ep_irqstatus); + + arc_write_uncached_32(priv->host2ep_irqstatus, 0); + qtn_mproc_sync_irq_ack(RUBY_SYS_CTL_D2L_INT, QDPC_H2EP_INTERRUPT_BIT); + + if (irqstatus & QDPC_HOST_TXREADY) { + REG_WRITE(dsq->pd_rx_basereg + EMAC_DMARPD, 1); + udelay(1); + REG_WRITE(dsq->pd_tx_basereg + EMAC_DMATPD, 1); + } + + if (irqstatus & QDPC_HOST_TXDONE) { + tasklet_schedule(&priv->txd_tasklet); + } + + if (irqstatus & QDPC_HOST_START_RX) { + tasklet_schedule(&priv->rx_tasklet); + } + + return IRQ_HANDLED; +} + +static SRAM_TEXT void qdpc_dmastatus_tasklet(void *dev) +{ + struct net_device *ndev = (struct net_device *)dev; + struct qdpc_priv *priv = netdev_priv(ndev); + static uint32_t count=0; + + printk ("EDMA(%u) DS:0x%x/0x%x/0x%x US:0x%x\n",++count, priv->dsdma_desc, priv->dsdma_status, + priv->dsisr_status, priv->usisr_status); + priv->dsisr_status = 0; + priv->usisr_status = 0; + priv->dsdma_status = 0; + priv->usdma_status = 0; + priv->dsdma_desc = 0; + priv->usdma_desc = 0; +} + +static SRAM_TEXT void qdpc_txd_tasklet(void *dev) +{ + struct net_device *ndev = (struct net_device *)dev; + + qdpc_veth_txdone(ndev); + + return; +} + +static SRAM_TEXT void qdpc_rx_tasklet(void *dev) +{ + /* Data Rx function */ + qdpc_veth_rx((struct net_device *)dev); +} + +inline static __sram_text unsigned long qdpc_align_val_up(unsigned long val, unsigned long step) +{ + return ((val + step - 1) & (~(step - 1))); +} + +int qdpc_pcie_init_mem(struct net_device *ndev) +{ + struct qdpc_priv *priv = netdev_priv(ndev); + const uint32_t align = MAX(dma_get_cache_alignment(), QDPC_DMA_ALIGN); + uint32_t offset; + uint32_t usdma_offset; + uint32_t dsdma_offset; + + /* setup boot data area mapping */ + priv->bda = (void *)(RUBY_PCIE_BDA_ADDR + 0x80000000); + + /* ISR status area */ + priv->host2ep_irqstatus = &priv->bda->bda_h2ep_irqstatus; + priv->ep2host_irqstatus = &priv->bda->bda_ep2h_irqstatus; + priv->host_ep2h_txd_budget = &priv->bda->bda_ep2h_txd_budget; + priv->host_h2ep_txd_budget = &priv->bda->bda_h2ep_txd_budget; + + /* Setup descriptor shared memory area */ + priv->shmem = (qdpc_epshmem_hdr_t *)&priv->bda[1]; + priv->shmem_busaddr= (dma_addr_t)RUBY_PCIE_BDA_ADDR ; + printk("Shmem: VA:0x%p PA:0x%p\n", (void *)priv->shmem, (void *)priv->shmem_busaddr); + + /* Initial offset past shared memory header aligned on a cache line size boundary */ + offset = qdpc_align_val_up(sizeof(qdpc_pcie_bda_t) + sizeof(qdpc_epshmem_hdr_t), align); + + /* Assign to upstream DMA host descriptors */ + usdma_offset = offset; + + /* Recalculate and align offset past upstream descriptors */ + offset += (sizeof(qdpc_dmadesc_t) * priv->ep_config.cf_usdma_ndesc); + offset = qdpc_align_val_up(offset, align); + + /* Assign to downstream descriptors */ + dsdma_offset = offset; + + /* Recalculate and align offset past downstream descriptors */ + offset += (sizeof(qdpc_dmadesc_t) * priv->ep_config.cf_dsdma_ndesc); + offset = qdpc_align_val_up(offset, align); + + arc_write_uncached_32(&priv->shmem->eps_dsdma_desc, dsdma_offset); + arc_write_uncached_32(&priv->shmem->eps_usdma_desc, usdma_offset); + + arc_write_uncached_32(&priv->shmem->eps_dsdma_ndesc, priv->ep_config.cf_dsdma_ndesc); + arc_write_uncached_32(&priv->shmem->eps_usdma_ndesc,priv->ep_config.cf_usdma_ndesc); + + arc_write_uncached_32(&priv->shmem->eps_size, offset); + arc_write_uncached_32(&priv->shmem->eps_dma_offset, arc_read_uncached_32(&priv->bda->bda_dma_offset)); + + arc_write_uncached_32(&priv->shmem->eps_ver, 1); + arc_write_uncached_32(&priv->shmem->eps_maxbuf, QDPC_DMA_MAXBUF); + arc_write_uncached_32(&priv->shmem->eps_minbuf, QDPC_DMA_MINBUF); + arc_write_uncached_32(&priv->shmem->eps_align, align); + + printk("%s() Sz:%u US_offset:%u DS_offset:%u\n", + __func__, offset, usdma_offset, dsdma_offset); + + return SUCCESS; +} + +static void qdpc_pcie_enable_tasklets(struct qdpc_priv *priv) +{ + tasklet_enable(&priv->rx_tasklet); + tasklet_enable(&priv->txd_tasklet); + tasklet_enable(&priv->dmastatus_tasklet); +} + +static void qdpc_pcie_disable_tasklets(struct qdpc_priv *priv) +{ + tasklet_disable(&priv->rx_tasklet); + tasklet_disable(&priv->txd_tasklet); + tasklet_disable(&priv->dmastatus_tasklet); +} + +int qdpc_pcie_init_intr(struct net_device *ndev) +{ + struct qdpc_priv *priv = netdev_priv(ndev); + int ret = 0; + + ret = request_irq(RUBY_IRQ_DSP, qdpc_host_isr, IRQF_DISABLED, "PCIe(host)", ndev); + if (ret) { + PRINT_ERROR(KERN_ERR " Host Interrupt initialization failed\n"); + return FAILURE; + } + + ret = request_irq(RUBY_IRQ_ENET0, qdpc_dma_isr, IRQF_DISABLED, "PCIe(dsdma)", ndev); + if (ret) { + PRINT_ERROR(KERN_ERR " PCIe(dsdma) Interrupt initialization failed\n"); + return FAILURE; + } + ret = request_irq(RUBY_IRQ_ENET1, qdpc_dma_isr, IRQF_DISABLED, "PCIe(usdma)", ndev); + if (ret) { + PRINT_ERROR(KERN_ERR " PCIe(usdma) Interrupt initialization failed\n"); + return FAILURE; + } + + /* Initialize tasklets */ + tasklet_init(&priv->rx_tasklet, (void *)qdpc_rx_tasklet, (unsigned long)ndev); + tasklet_init(&priv->txd_tasklet, (void *)qdpc_txd_tasklet, (unsigned long)ndev); + tasklet_init(&priv->dmastatus_tasklet, (void *)qdpc_dmastatus_tasklet, (unsigned long)ndev); + + priv->txq_enable_timer.function = qdpc_tx_runout_func; + priv->txq_enable_timer.data = (unsigned long)priv; + init_timer(&priv->txq_enable_timer); + + qdpc_pcie_disable_tasklets(priv); + + ret = qdpc_pcie_init_mem(priv->ndev); + if (ret == FAILURE) { + qdpc_free_interrupt(ndev); + return FAILURE; + } + + ret = qdpc_emac_init(priv); + if (ret == FAILURE) { + qdpc_free_interrupt(ndev); + return FAILURE; + } + + return SUCCESS; +} + +void qdpc_free_interrupt(struct net_device *ndev) +{ + struct qdpc_priv *priv = netdev_priv(ndev); + + free_irq(RUBY_IRQ_ENET0, ndev); + free_irq(RUBY_IRQ_ENET1, ndev); + free_irq(RUBY_IRQ_DSP, ndev); + + qdpc_pcie_disable_tasklets(priv); + + tasklet_kill(&priv->rx_tasklet); + tasklet_kill(&priv->dmastatus_tasklet); + tasklet_kill(&priv->txd_tasklet); + + del_timer(&priv->txq_enable_timer); +} + +static inline void qdpc_setbootstate(struct qdpc_priv *p, uint32_t state) { + __iomem qdpc_pcie_bda_t *bda = p->bda; + + qdpc_pcie_posted_write(state, &bda->bda_bootstate); +} + +static int qdpc_bootpoll(struct qdpc_priv *p, uint32_t state) { + while (!kthread_should_stop() && (qdpc_isbootstate(p,state) == 0)) { + set_current_state(TASK_UNINTERRUPTIBLE); + schedule_timeout(HZ/20); + } + return 0; +} + +void qdpc_init_work(struct work_struct *task) +{ + struct qdpc_priv *priv; + unsigned char macaddr[ETH_ALEN]; + priv = container_of(task, struct qdpc_priv, init_work); + + PRINT_INFO("Waiting for host start signal\n"); + qdpc_bootpoll(priv, QDPC_BDA_FW_START); + + qdpc_pcie_irqsetup(priv->ndev); + + qdpc_setbootstate(priv, QDPC_BDA_FW_CONFIG); + + PRINT_INFO("Enable DMA engines\n"); + qdpc_bootpoll(priv, QDPC_BDA_FW_RUN); + qdpc_pcie_enable_tasklets(priv); + qdpc_emac_enable(priv); + netif_start_queue(priv->ndev); + + /* Set MAC address used by host side */ + memcpy(macaddr, qdpc_basemac, ETH_ALEN); + macaddr[0] = (macaddr[0] & 0x1F) | (((macaddr[0] & 0xE0) + 0x40) & 0xE0) | 0x02; + /* + * The bda_pci_pre_status and bda_pci_endian fields are not used at runtime, so the + * MAC address is stored here in order to avoid updating the bootloader. + */ + memcpy(&priv->bda->bda_pci_pre_status, macaddr, ETH_ALEN); + + /* Enable IRQ */ + writel(QDPC_H2EP_INTERRUPT_MASK, RUBY_SYS_CTL_D2L_INT_MASK); + + qdpc_setbootstate(priv, QDPC_BDA_FW_RUNNING); + PRINT_INFO("Connection established with Host\n"); + +} diff --git a/package/firmware/quantenna/src/drivers/pcie/target/qdpc_regs.h b/package/firmware/quantenna/src/drivers/pcie/target/qdpc_regs.h new file mode 100644 index 000000000..b7138cccf --- /dev/null +++ b/package/firmware/quantenna/src/drivers/pcie/target/qdpc_regs.h @@ -0,0 +1,28 @@ +/** + * Copyright (c) 2011-2013 Quantenna Communications, Inc. + * All rights reserved. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + **/ +#ifndef __QDPC_REGS_H__ +#define __QDPC_REGS_H__ + +#define QDPC_PCIE_REG_BASE 0xe9000000 +#define QDPC_D2L_REG_BASE 0xe000003c +#define QDPC_D2L_REG_INTMASK 0xe0000040 + + +#endif /*__QDPC_REGS_H__ */ + diff --git a/package/firmware/quantenna/src/drivers/pcie/target/qdpc_ring.c b/package/firmware/quantenna/src/drivers/pcie/target/qdpc_ring.c new file mode 100644 index 000000000..ed9567eab --- /dev/null +++ b/package/firmware/quantenna/src/drivers/pcie/target/qdpc_ring.c @@ -0,0 +1,160 @@ +/** + * Copyright (c) 2011-2013 Quantenna Communications, Inc. + * All rights reserved. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + **/ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include "qdpc_config.h" +#include "qdpc_debug.h" +#include "qdpc_init.h" +#include "qdpc_emac.h" + +SRAM_TEXT struct sk_buff *qdpc_get_skb(size_t len) +{ + const uint32_t align = dma_get_cache_alignment(); + struct sk_buff *skb = NULL; + uint32_t off; +#if defined(QDPC_USE_SKB_RECYCLE) + struct qtn_skb_recycle_list *recycle_list = qtn_get_shared_recycle_list(); + uint32_t size; + if (recycle_list) { + skb = qtn_skb_recycle_list_pop(recycle_list, &recycle_list->stats_pcie); + } + if (!skb) { + size = qtn_rx_buf_size(); + if (len > size) + size = len; + + skb = dev_alloc_skb(size + align); + } +#else + skb = dev_alloc_skb(len + align); +#endif + if (skb) { + off = ((uint32_t)((unsigned long)skb->data)) & (align - 1); + if (off) { + skb_reserve(skb, align - off); + } + } + + return skb; + +} + +int qdpc_init_rxq(struct qdpc_priv *priv, size_t ringsize) +{ + uint32_t i; + uint32_t dma_control = 0 ; + uint32_t dma_status = 0; + uint32_t dma_data = 0; + qdpc_dmadesc_t *rx_hwdesc = NULL; + uint32_t skb_bufsize = QDPC_DMA_MAXBUF; + uint32_t buffer_size = QDPC_DMA_MAXBUF; + qdpc_pdring_t *rxq = &priv->pktq.pkt_dsq; + + spin_lock_init(&rxq->pd_lock); + rxq->pd_ringsize = ringsize; + + rxq->pd_hwdesc = (qdpc_dmadesc_t*)dma_alloc_coherent(NULL, + (rxq->pd_ringsize * sizeof(qdpc_dmadesc_t)), + &rxq->pd_dst_busaddr, GFP_KERNEL | GFP_DMA); + + memset(rxq->pd_desc, 0, sizeof(rxq->pd_desc)); + for (i = 0 ; i < rxq->pd_ringsize ; i++ ) { + struct sk_buff *skb = qdpc_get_skb(skb_bufsize); + + if (!skb) + break; + skb->len=0; + rx_hwdesc = &rxq->pd_hwdesc[i]; + rxq->pd_desc[i].dd_hwdesc = &rxq->pd_hwdesc[i]; + rxq->pd_desc[i].dd_metadata = (void*)skb; + memset(skb->data, 0, buffer_size); + + dma_status = (QDPC_DMA_OWN); + dma_control = (buffer_size & QDPC_DMA_LEN_MASK); + dma_data = dma_map_single((struct device *)priv->ndev, (void*)skb->data, buffer_size, DMA_FROM_DEVICE); + + arc_write_uncached_32(&rx_hwdesc->dma_control, dma_control); + arc_write_uncached_32(&rx_hwdesc->dma_data, dma_data); + arc_write_uncached_32(&rx_hwdesc->dma_ptr, 0); + arc_write_uncached_32(&rx_hwdesc->dma_status, dma_status); + } + /* Mark end of buffer */ + arc_write_uncached_32(&rx_hwdesc->dma_control,(dma_control |QDPC_DMA_LAST_DESC)); + rxq->pd_desc[rxq->pd_ringsize - 1].dd_flags |= QDPC_DMA_LAST_DESC; + rxq->pd_lastdesc = &rxq->pd_desc[rxq->pd_ringsize - 1]; + rxq->pd_firstdesc = &rxq->pd_desc[0]; + rxq->pd_nextdesc = rxq->pd_firstdesc; + + return 0; +} + + +int qdpc_init_txq(struct qdpc_priv *priv, size_t ringsize) +{ + uint32_t i; + qdpc_dmadesc_t *tx_hwdesc = NULL; + qdpc_pdring_t *txq = &priv->pktq.pkt_usq; + + spin_lock_init(&txq->pd_lock); + STAILQ_INIT(&txq->pd_pending); + txq->pd_ringsize = ringsize; + txq->pd_nfree = txq->pd_ringsize; + txq->pd_npending = 0; + txq->pd_hwdesc = (qdpc_dmadesc_t*)dma_alloc_coherent(NULL, + (txq->pd_ringsize * sizeof(qdpc_dmadesc_t)), + &txq->pd_src_busaddr, GFP_KERNEL | GFP_DMA); + + memset(txq->pd_desc, 0, sizeof(txq->pd_desc)); + + for (i = 0 ; i < txq->pd_ringsize ; i++ ) { + + tx_hwdesc = &txq->pd_hwdesc[i]; + txq->pd_desc[i].dd_hwdesc = &txq->pd_hwdesc[i]; + txq->pd_desc[i].dd_metadata = NULL; + + arc_write_uncached_32(&tx_hwdesc->dma_control, (QDPC_DMA_SINGLE_TXBUFFER)); + arc_write_uncached_32(&tx_hwdesc->dma_data, 0); + arc_write_uncached_32(&tx_hwdesc->dma_ptr, 0); + arc_write_uncached_32(&tx_hwdesc->dma_status, 0); + + } + /* Mark end of buffer */ + arc_write_uncached_32(&tx_hwdesc->dma_control, QDPC_DMA_LAST_DESC); + txq->pd_desc[txq->pd_ringsize - 1].dd_flags |= QDPC_DMA_LAST_DESC; + txq->pd_lastdesc = &txq->pd_desc[txq->pd_ringsize - 1]; + txq->pd_firstdesc = &txq->pd_desc[0]; + txq->pd_nextdesc = txq->pd_firstdesc; + + return 0; +} + diff --git a/package/firmware/quantenna/src/drivers/pcie2/host/arm/Makefile b/package/firmware/quantenna/src/drivers/pcie2/host/arm/Makefile new file mode 100644 index 000000000..fdac3f22a --- /dev/null +++ b/package/firmware/quantenna/src/drivers/pcie2/host/arm/Makefile @@ -0,0 +1,30 @@ +# +# Makefile for arm platform +# + +EXTRA_CFLAGS += -Wall -Wno-deprecated-declarations \ + -I$(src) \ + -I$(src)/../../include \ + -I$(src)/../common $(DNI_KMOD_CFLAGS) + +EXTRA_CFLAGS += -DQTN_TX_SKBQ_SUPPORT -DQTN_WAKEQ_SUPPORT + +PWD := $(shell pwd) + +default: all + +COMMON_DIR := ../common +qdpc-host-objs := $(COMMON_DIR)/qdpc_init.o $(COMMON_DIR)/qdpc_pcie.o $(COMMON_DIR)/topaz_vnet.o qdpc_platform.o +obj-m := qdpc-host.o + +qdpc_host.o: $(qdpc-host-objs) + ld -r $^ -o $@ + +all: + make -C $(KERNELDIR) $(CROSS) M=$(PWD) modules + + +clean: + rm -rf $(COMMON_DIR)/.*.cmd $(COMMON_DIR)/.tmp_versions + rm -rf Module.markers Module.symvers modules.order *~ $(qdpc-host-objs) *.o *.ko *.mod.o *.mod.c + diff --git a/package/firmware/quantenna/src/drivers/pcie2/host/arm/qdpc_platform.c b/package/firmware/quantenna/src/drivers/pcie2/host/arm/qdpc_platform.c new file mode 100644 index 000000000..d26114a77 --- /dev/null +++ b/package/firmware/quantenna/src/drivers/pcie2/host/arm/qdpc_platform.c @@ -0,0 +1,75 @@ +/** + * Copyright (c) 2012-2012 Quantenna Communications, Inc. + * All rights reserved. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + **/ + +/* + * Platform dependant implement. Customer needs to modify this file. + */ + +#include + +#include +#include +#include +#include +#include + +/* + * Enable MSI interrupt of PCIe. + */ +void enable_vmac_ints(struct vmac_priv *vmp) +{ + volatile uint32_t *dma_wrd_imwr = QDPC_BAR_VADDR(vmp->dmareg_bar, TOPAZ_IMWR_DONE_ADDRLO_OFFSET); + + writel(vmp->dma_msi_imwr, dma_wrd_imwr); +} + +/* + * Disable MSI interrupt of PCIe. + */ +void disable_vmac_ints(struct vmac_priv *vmp) +{ + volatile uint32_t *dma_wrd_imwr = QDPC_BAR_VADDR(vmp->dmareg_bar, TOPAZ_IMWR_DONE_ADDRLO_OFFSET); + + writel(vmp->dma_msi_dummy, dma_wrd_imwr); +} + + +/* + * Enable interrupt for detecting EP reset. + */ +void enable_ep_rst_detection(struct net_device *ndev) +{ +} + +/* + * Disable interrupt for detecting EP reset. + */ +void disable_ep_rst_detection(struct net_device *ndev) +{ +} + +/* + * Interrupt context for detecting EP reset. + * This function should do: + * 1. check interrupt status to see if EP reset. + * 2. if EP reset, handle it. + */ +void handle_ep_rst_int(struct net_device *ndev) +{ +} diff --git a/package/firmware/quantenna/src/drivers/pcie2/host/arm/qdpc_platform.h b/package/firmware/quantenna/src/drivers/pcie2/host/arm/qdpc_platform.h new file mode 100644 index 000000000..b3f678b3b --- /dev/null +++ b/package/firmware/quantenna/src/drivers/pcie2/host/arm/qdpc_platform.h @@ -0,0 +1,101 @@ +/** + * Copyright (c) 2012-2012 Quantenna Communications, Inc. + * All rights reserved. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + **/ + +/* + * Platform dependant implement. Customer needs to modify this file. + */ +#ifndef __QDPC_PFDEP_H__ +#define __QDPC_PFDEP_H__ + +#include + +#include + +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,27) +#define IOREMAP ioremap_wc +#else /* LINUX_VERSION_CODE < KERNEL_VERSION(2,6,27) */ +#define IOREMAP ioremap +#endif + +/* IO functions */ +#ifndef readb +#define readb(addr) (*(volatile unsigned char *) (addr)) +#endif + +#ifndef readw +#define readw(addr) (*(volatile unsigned short *) (addr)) +#endif + +#ifndef readl +#define readl(addr) (*(volatile unsigned int *) (addr)) +#endif + +#ifndef writeb +#define writeb(b,addr) (*(volatile unsigned char *) (addr) = (b)) +#endif + +#ifndef writew +#define writew(b,addr) (*(volatile unsigned short *) (addr) = (b)) +#endif + +#ifndef writel +#define writel(b,addr) (*(volatile unsigned int *) (addr) = (b)) +#endif + +#ifndef virt_to_bus +#define virt_to_bus virt_to_phys +#endif + +/* Bit number and mask of MSI in the interrupt mask and status register */ +#define QDPC_INTR_MSI_BIT 0 +#define QDPC_INTR_MSI_MASK (1 << QDPC_INTR_MSI_BIT) + +/* Enable MSI interrupt of PCIe */ +extern void enable_vmac_ints(struct vmac_priv *vmp); +/* Disable MSI interrupt of PCIe */ +extern void disable_vmac_ints(struct vmac_priv *vmp); + +/* Enable interrupt for detecting EP reset */ +extern void enable_ep_rst_detection(struct net_device *ndev); +/* Disable interrupt for detecting EP reset */ +extern void disable_ep_rst_detection(struct net_device *ndev); +/* Interrupt context for detecting EP reset */ +extern void handle_ep_rst_int(struct net_device *ndev); + +/* Allocated buffer size for a packet */ +#define SKB_BUF_SIZE 2048 + +/* Transmit Queue Length */ +#define QDPC_TX_QUEUE_SIZE 180 + +/* Receive Queue Length */ +#define QDPC_RX_QUEUE_SIZE 384 + +/* Customer defined function */ +#define qdpc_platform_init() 0 +#define qdpc_platform_exit() do { } while(0) + +/* PCIe driver update resource in PCI configure space after EP reset */ +#define qdpc_update_hw_bar(pdev, index) do { } while(0) + +/* TODO: If MSI IRQ-loss issue can be fixed, remove macro below */ +/*#define QDPC_PLATFORM_IRQ_FIXUP*/ + +#endif /* __QDPC_PFDEP_H__ */ + diff --git a/package/firmware/quantenna/src/drivers/pcie2/host/common/qdpc_init.c b/package/firmware/quantenna/src/drivers/pcie2/host/common/qdpc_init.c new file mode 100644 index 000000000..ece226927 --- /dev/null +++ b/package/firmware/quantenna/src/drivers/pcie2/host/common/qdpc_init.c @@ -0,0 +1,887 @@ +/** + * Copyright (c) 2012-2012 Quantenna Communications, Inc. + * All rights reserved. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + **/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "qdpc_config.h" +#include "qdpc_debug.h" +#include "qdpc_init.h" +#include "qdpc_regs.h" +#include "qdpc_platform.h" +#include "topaz_vnet.h" +#define QDPC_TOPAZ_IMG "topaz-linux.lzma.img" +#define QDPC_TOPAZ_UBOOT "u-boot.bin" +#define MAX_IMG_NUM 2 + +#define EP_BOOT_FROM_FLASH 1 + +#ifndef MEMORY_START_ADDRESS +#define MEMORY_START_ADDRESS virt_to_bus((void *)PAGE_OFFSET) +#endif + +static unsigned int tlp_mps = 256; +module_param(tlp_mps, uint, 0644); +MODULE_PARM_DESC(tlp_mps, "Default PCIe Max_Payload_Size"); + +/* Quantenna PCIE vendor and device identifiers */ +static struct pci_device_id qdpc_pcie_ids[] = { + {PCI_DEVICE(QDPC_VENDOR_ID, QDPC_DEVICE_ID),}, + {0,} +}; + +MODULE_DEVICE_TABLE(pci, qdpc_pcie_ids); + +static int qdpc_pcie_probe(struct pci_dev *pdev, const struct pci_device_id *id); +static void qdpc_pcie_remove(struct pci_dev *pdev); +static int qdpc_boot_thread(void *data); +static void qdpc_nl_recv_msg(struct sk_buff *skb); +int qdpc_init_netdev(struct net_device **net_dev, struct pci_dev *pdev); + +static bool is_ep_reset = false; +#ifndef PCIE_HOTPLUG_SUPPORTED +static int link_monitor(void *data); +static struct task_struct *link_monitor_thread = NULL; +#endif + +char qdpc_pcie_driver_name[] = "qdpc_host"; + +static struct pci_driver qdpc_pcie_driver = { + .name = qdpc_pcie_driver_name, + .id_table = qdpc_pcie_ids, + .probe = qdpc_pcie_probe, + .remove = qdpc_pcie_remove, +#ifdef CONFIG_QTN_PM + .suspend = qdpc_pcie_suspend, + .resume = qdpc_pcie_resume, +#endif +}; + +#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,6,0) +struct netlink_kernel_cfg qdpc_netlink_cfg = { + .groups = 0, +#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,7,0) + .flags = 0, +#endif + .input = qdpc_nl_recv_msg, + .cb_mutex = NULL, + .bind = NULL, +}; +#endif + +struct sock *qdpc_nl_sk = NULL; +int qdpc_clntPid = 0; + +unsigned int (*qdpc_pci_readl)(void *addr) = qdpc_readl; +void (*qdpc_pci_writel)(unsigned int val, void *addr) = qdpc_writel; + +static int qdpc_bootpoll(struct vmac_priv *p, uint32_t state) +{ + while (!kthread_should_stop() && (qdpc_isbootstate(p,state) == 0)) { + if (qdpc_booterror(p)) + return -1; + set_current_state(TASK_UNINTERRUPTIBLE); + schedule_timeout(QDPC_SCHED_TIMEOUT); + } + return 0; +} +static void booterror(qdpc_pcie_bda_t *bda) +{ + if (PCIE_BDA_TARGET_FWLOAD_ERR & qdpc_pci_readl(&bda->bda_flags)) + printk("EP boot from download firmware failed!\n"); + else if (PCIE_BDA_TARGET_FBOOT_ERR & qdpc_pci_readl(&bda->bda_flags)) + printk("EP boot from flash failed! Please check if there is usable image in Target flash.\n"); + else + printk("EP boot get in error, dba flag: 0x%x\n", qdpc_pci_readl(&bda->bda_flags)); +} + +static void qdpc_pci_endian_detect(struct vmac_priv *priv) +{ + __iomem qdpc_pcie_bda_t *bda = priv->bda; + volatile uint32_t pci_endian; + + writel(QDPC_PCI_ENDIAN_DETECT_DATA, &bda->bda_pci_endian); + mmiowb(); + writel(QDPC_PCI_ENDIAN_VALID_STATUS, &bda->bda_pci_pre_status); + + while (readl(&bda->bda_pci_post_status) != QDPC_PCI_ENDIAN_VALID_STATUS) { + if (kthread_should_stop()) + break; + + set_current_state(TASK_UNINTERRUPTIBLE); + schedule_timeout(QDPC_SCHED_TIMEOUT); + } + + pci_endian = readl(&bda->bda_pci_endian); + if (pci_endian == QDPC_PCI_LITTLE_ENDIAN) { + qdpc_pci_readl = qdpc_readl; + qdpc_pci_writel = qdpc_writel; + printk("PCI memory is little endian\n"); + } else if (pci_endian == QDPC_PCI_BIG_ENDIAN) { + qdpc_pci_readl = qdpc_le32_readl; + qdpc_pci_writel = qdpc_le32_writel; + printk("PCI memory is big endian\n"); + } else { + qdpc_pci_readl = qdpc_readl; + qdpc_pci_writel = qdpc_writel; + printk("PCI memory endian value:%08x is invalid - using little endian\n", pci_endian); + } + + /* Clear endian flags */ + writel(0, &bda->bda_pci_pre_status); + writel(0, &bda->bda_pci_post_status); + writel(0, &bda->bda_pci_endian); +} + +static void qdpc_pci_dma_offset_reset(struct vmac_priv *priv) +{ + __iomem qdpc_pcie_bda_t *bda = priv->bda; + uint32_t dma_offset; + + /* Get EP Mapping address */ + dma_offset = readl(&bda->bda_dma_offset); + if ((dma_offset & PCIE_DMA_OFFSET_ERROR_MASK) != PCIE_DMA_OFFSET_ERROR) { + printk("DMA offset : 0x%08x, no need to reset the value.\n", dma_offset); + return; + } + dma_offset &= ~PCIE_DMA_OFFSET_ERROR_MASK; + + printk("EP map start addr : 0x%08x, Host memory start : 0x%08x\n", + dma_offset, (unsigned int)MEMORY_START_ADDRESS); + + /* Reset DMA offset in bda */ + dma_offset -= MEMORY_START_ADDRESS; + writel(dma_offset, &bda->bda_dma_offset); +} + +static int qdpc_firmware_load(struct pci_dev *pdev, struct vmac_priv *priv, const char *name) +{ +#define DMABLOCKSIZE (1 * 1024 * 1024) +#define NBLOCKS(size) ((size)/(DMABLOCKSIZE) + (((size)%(DMABLOCKSIZE) > 0) ? 1 : 0)) + + int result = SUCCESS; + const struct firmware *fw; + __iomem qdpc_pcie_bda_t *bda = priv->bda; + + /* Request compressed firmware from user space */ + if ((result = request_firmware(&fw, name, &pdev->dev)) == -ENOENT) { + /* + * No firmware found in the firmware directory, skip firmware downloading process + * boot from flash directly on target + */ + printk( "no firmware found skip fw downloading\n"); + qdpc_pcie_posted_write((PCIE_BDA_HOST_NOFW_ERR | + qdpc_pci_readl(&bda->bda_flags)), &bda->bda_flags); + return FAILURE; + } else if (result == SUCCESS) { + uint32_t nblocks = NBLOCKS(fw->size); + uint32_t remaining = fw->size; + uint32_t count; + uint32_t dma_offset = qdpc_pci_readl(&bda->bda_dma_offset); + void *data =(void *) __get_free_pages(GFP_KERNEL | GFP_DMA, + get_order(DMABLOCKSIZE)); + const uint8_t *curdata = fw->data; + dma_addr_t handle = 0; + + if (!data) { + printk(KERN_ERR "Allocation failed for memory size[%u] Download firmware failed!\n", DMABLOCKSIZE); + release_firmware(fw); + qdpc_pcie_posted_write((PCIE_BDA_HOST_MEMALLOC_ERR | + qdpc_pci_readl(&bda->bda_flags)), &bda->bda_flags); + return FAILURE; + } + + handle = pci_map_single(priv->pdev, data ,DMABLOCKSIZE, PCI_DMA_TODEVICE); + if (!handle) { + printk("Pci map for memory data block 0x%p error, Download firmware failed!\n", data); + free_pages((unsigned long)data, get_order(DMABLOCKSIZE)); + release_firmware(fw); + qdpc_pcie_posted_write((PCIE_BDA_HOST_MEMMAP_ERR | + qdpc_pci_readl(&bda->bda_flags)), &bda->bda_flags); + return FAILURE; + } + + qdpc_setbootstate(priv, QDPC_BDA_FW_HOST_LOAD); + qdpc_bootpoll(priv, QDPC_BDA_FW_EP_RDY); + + /* Start loading firmware */ + for (count = 0 ; count < nblocks; count++) + { + uint32_t size = (remaining > DMABLOCKSIZE) ? DMABLOCKSIZE : remaining; + + memcpy(data, curdata, size); + /* flush dcache */ + pci_dma_sync_single_for_device(priv->pdev, handle ,size, PCI_DMA_TODEVICE); + + qdpc_pcie_posted_write(handle + dma_offset, &bda->bda_img); + qdpc_pcie_posted_write(size, &bda->bda_img_size); + printk("FW Data[%u]: VA:0x%p PA:0x%p Sz=%u..\n", count, (void *)curdata, (void *)handle, size); + + qdpc_setbootstate(priv, QDPC_BDA_FW_BLOCK_RDY); + qdpc_bootpoll(priv, QDPC_BDA_FW_BLOCK_DONE); + + remaining = (remaining < size) ? remaining : (remaining - size); + curdata += size; + printk("done!\n"); + } + + pci_unmap_single(priv->pdev,handle, DMABLOCKSIZE, PCI_DMA_TODEVICE); + /* Mark end of block */ + qdpc_pcie_posted_write(0, &bda->bda_img); + qdpc_pcie_posted_write(0, &bda->bda_img_size); + qdpc_setbootstate(priv, QDPC_BDA_FW_BLOCK_RDY); + qdpc_bootpoll(priv, QDPC_BDA_FW_BLOCK_DONE); + + qdpc_setbootstate(priv, QDPC_BDA_FW_BLOCK_END); + + PRINT_INFO("Image. Sz:%u State:0x%x\n", (uint32_t)fw->size, qdpc_pci_readl(&bda->bda_bootstate)); + qdpc_bootpoll(priv, QDPC_BDA_FW_LOAD_DONE); + + free_pages((unsigned long)data, get_order(DMABLOCKSIZE)); + release_firmware(fw); + PRINT_INFO("Image downloaded....!\n"); + } else { + PRINT_ERROR("Failed to load firmware:%d\n", result); + return result; + } + return result; +} + +static void qdpc_pcie_dev_init(struct vmac_priv *priv, struct pci_dev *pdev, struct net_device *ndev) +{ + SET_NETDEV_DEV(ndev, &pdev->dev); + + priv->pdev = pdev; + priv->ndev = ndev; + pci_set_drvdata(pdev, ndev); +} + +static void qdpc_tune_pcie_mps(struct pci_dev *pdev, int pos) +{ + struct pci_dev *parent = NULL; + int ppos = 0; + uint32_t dev_cap, pcap; + uint16_t dev_ctl, pctl; + unsigned int mps = tlp_mps; +#define BIT_TO_MPS(m) (1 << ((m) + 7)) + + if (pdev->bus && pdev->bus->self) { + parent = pdev->bus->self; + if (likely(parent)) { + ppos = pci_find_capability(parent, PCI_CAP_ID_EXP); + if (ppos) { + pci_read_config_dword(parent, ppos + PCI_EXP_DEVCAP, &pcap); + pci_read_config_dword(pdev, pos + PCI_EXP_DEVCAP, &dev_cap); + printk(KERN_INFO "parent cap:%u, dev cap:%u\n",\ + BIT_TO_MPS(pcap & PCI_EXP_DEVCAP_PAYLOAD), BIT_TO_MPS(dev_cap & PCI_EXP_DEVCAP_PAYLOAD)); + mps = min(BIT_TO_MPS(dev_cap & PCI_EXP_DEVCAP_PAYLOAD), BIT_TO_MPS(pcap & PCI_EXP_DEVCAP_PAYLOAD)); + } + } + } + printk(KERN_INFO"Setting MPS to %u\n", mps); + + /* + * Set Max_Payload_Size + * Max_Payload_Size_in_effect = 1 << ( ( (dev_ctl >> 5) & 0x07) + 7); + */ + mps = (((mps >> 7) - 1) << 5); + pci_read_config_word(pdev, pos + PCI_EXP_DEVCTL, &dev_ctl); + dev_ctl = ((dev_ctl & ~PCI_EXP_DEVCTL_PAYLOAD) | mps); + pci_write_config_word(pdev, pos + PCI_EXP_DEVCTL, dev_ctl); + + if (parent && ppos) { + pci_read_config_word(parent, pos + PCI_EXP_DEVCTL, &pctl); + pctl = ((pctl & ~PCI_EXP_DEVCTL_PAYLOAD) | mps); + pci_write_config_word(parent, pos + PCI_EXP_DEVCTL, pctl); + } +} + +static struct net_device *g_ndev = NULL; +static int qdpc_pcie_probe(struct pci_dev *pdev, const struct pci_device_id *id) +{ + struct vmac_priv *priv = NULL; + struct net_device *ndev = NULL; + int result = SUCCESS; + int pos; + + /* Allocate device structure */ + if (!(ndev = vmac_alloc_ndev())) + return -ENOMEM; + + g_ndev = ndev; + priv = netdev_priv(ndev); + qdpc_pcie_dev_init(priv, pdev, ndev); + + /* allocate netlink data buffer */ + priv->nl_buf = kmalloc(VMAC_NL_BUF_SIZE, GFP_KERNEL); + if (!priv->nl_buf) { + result = -ENOMEM; + goto out; + } + + /* Check if the device has PCI express capability */ + pos = pci_find_capability(pdev, PCI_CAP_ID_EXP); + if (!pos) { + PRINT_ERROR(KERN_ERR "The device %x does not have PCI Express capability\n", + pdev->device); + result = -ENOSYS; + goto out; + } else { + PRINT_DBG(KERN_INFO "The device %x has PCI Express capability\n", pdev->device); + } + + qdpc_tune_pcie_mps(pdev, pos); + + /* Wake up the device if it is in suspended state and allocate IO, + * memory regions and IRQ if not + */ + if (pci_enable_device(pdev)) { + PRINT_ERROR(KERN_ERR "Failed to initialize PCI device with device ID %x\n", + pdev->device); + + result = -EIO; + goto out; + } else { + PRINT_DBG(KERN_INFO "Initialized PCI device with device ID %x\n", pdev->device); + } + + /* + * Check if the PCI device can support DMA addressing properly. + * The mask gives the bits that the device can address + */ + pci_set_master(pdev); + + /* Initialize PCIE layer */ + if (( result = qdpc_pcie_init_intr_and_mem(priv)) < 0) { + PRINT_DBG("Interrupt & Memory Initialization failed \n"); + goto release_memory; + } + + if (!!(result = vmac_net_init(pdev))) { + PRINT_DBG("Vmac netdev init fail\n"); + goto free_mem_interrupt; + } + + /* Create and start the thread to initiate the INIT Handshake*/ + priv->init_thread = kthread_run(qdpc_boot_thread, priv, "qdpc_init_thread"); + if (priv->init_thread == NULL) { + PRINT_ERROR("Init thread creation failed \n"); + goto free_mem_interrupt; + } + + + /* Create netlink & register with kernel */ +#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,7,0) + priv->nl_socket = netlink_kernel_create(&init_net, + QDPC_NETLINK_RPC_PCI_CLNT, &qdpc_netlink_cfg); +#elif LINUX_VERSION_CODE >= KERNEL_VERSION(3,6,0) + priv->nl_socket = netlink_kernel_create(&init_net, + QDPC_NETLINK_RPC_PCI_CLNT, THIS_MODULE, &qdpc_netlink_cfg); +#else + priv->nl_socket = netlink_kernel_create(&init_net, + QDPC_NETLINK_RPC_PCI_CLNT, 0, qdpc_nl_recv_msg, + NULL, THIS_MODULE); +#endif + if (priv->nl_socket) { + return SUCCESS; + } + + PRINT_ERROR(KERN_ALERT "Error creating netlink socket.\n"); + result = FAILURE; + +free_mem_interrupt: + qdpc_pcie_free_mem(pdev); + qdpc_free_interrupt(pdev); + +release_memory: +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,28) + /* Releasing the memory region if any error occured */ + pci_clear_master(pdev); +#endif + + pci_disable_device(pdev); + +out: + kfree(priv->nl_buf); + free_netdev(ndev); + /* Any failure in probe, so it can directly return in remove */ + pci_set_drvdata(pdev, NULL); + + return result; +} + +static void qdpc_pcie_remove(struct pci_dev *pdev) +{ + struct net_device *ndev = pci_get_drvdata(pdev); + struct vmac_priv *vmp; + + if (ndev == NULL) + return; + + vmp = netdev_priv(ndev); + + if (vmp->init_thread) + kthread_stop(vmp->init_thread); + if (vmp->nl_socket) + netlink_kernel_release(vmp->nl_socket); + + kfree(vmp->nl_buf); + + vmac_clean(ndev); + + qdpc_free_interrupt(pdev); + qdpc_pcie_free_mem(pdev); + +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,28) + pci_clear_master(pdev); +#endif + pci_disable_device(pdev); + + writel(TOPAZ_SET_INT(IPC_RESET_EP), vmp->ep_ipc_reg); + qdpc_unmap_iomem(vmp); + + free_netdev(ndev); + g_ndev = NULL; + + return; +} + +static inline int qdpc_pcie_set_power_state(struct pci_dev *pdev, pci_power_t state) +{ + uint16_t pmcsr; + + pci_read_config_word(pdev, TOPAZ_PCI_PM_CTRL_OFFSET, &pmcsr); + + switch (state) { + case PCI_D0: + pci_write_config_word(pdev, TOPAZ_PCI_PM_CTRL_OFFSET,(pmcsr & ~PCI_PM_CTRL_STATE_MASK) | PCI_D0); + break; + + case PCI_D3hot: + pci_write_config_word(pdev, TOPAZ_PCI_PM_CTRL_OFFSET,(pmcsr & ~PCI_PM_CTRL_STATE_MASK) | (PCI_D3hot | PCI_PM_CTRL_PME_ENABLE)); + break; + + default: + return -EINVAL; + } + + return 0; +} + +int qdpc_pcie_suspend(struct pci_dev *pdev, pm_message_t state) +{ + struct net_device *ndev = pci_get_drvdata(pdev); + struct vmac_priv *priv; + + if (ndev == NULL) + return -EINVAL; + + priv = netdev_priv(ndev); + if (le32_to_cpu(*priv->ep_pmstate) == PCI_D3hot) { + return 0; + } + + printk("%s start power management suspend\n", qdpc_pcie_driver_name); + + /* Set ep not ready to drop packets in low power mode */ + priv->ep_ready = 0; + + ndev->flags &= ~IFF_RUNNING; + *priv->ep_pmstate = cpu_to_le32(PCI_D3hot); + barrier(); + writel(TOPAZ_SET_INT(IPC_EP_PM_CTRL), priv->ep_ipc_reg); + + msleep(100); + pci_save_state(pdev); + pci_disable_device(pdev); + qdpc_pcie_set_power_state(pdev, PCI_D3hot); + + return 0; +} + +int qdpc_pcie_resume(struct pci_dev *pdev) +{ + struct net_device *ndev = pci_get_drvdata(pdev); + struct vmac_priv *priv; + int ret; + + if (ndev == NULL) + return -EINVAL; + + priv = netdev_priv(ndev); + if (le32_to_cpu(*priv->ep_pmstate) == PCI_D0) { + return 0; + } + + printk("%s start power management resume\n", qdpc_pcie_driver_name); + + ret = pci_enable_device(pdev); + if (ret) { + PRINT_ERROR("%s: pci_enable_device failed on resume\n", __func__); + return ret; + } + + pci_restore_state(pdev); + qdpc_pcie_set_power_state(pdev, PCI_D0); + + { + *priv->ep_pmstate = cpu_to_le32(PCI_D0); + barrier(); + writel(TOPAZ_SET_INT(IPC_EP_PM_CTRL), priv->ep_ipc_reg); + + msleep(5000); + } + + /* Set ep_ready to resume tx traffic */ + priv->ep_ready = 1; + ndev->flags |= IFF_RUNNING; + + return 0; +} + +static int __init qdpc_init_module(void) +{ + int ret; + + PRINT_DBG(KERN_INFO "Quantenna pcie driver initialization\n"); + + if (qdpc_platform_init()) { + PRINT_ERROR("Platform initilization failed \n"); + ret = FAILURE; + return ret; + } + + /* Register the pci driver with device*/ + if ((ret = pci_register_driver(&qdpc_pcie_driver)) < 0 ) { + PRINT_ERROR("Could not register the driver to pci : %d\n", ret); + ret = -ENODEV; + return ret; + } + +#ifndef PCIE_HOTPLUG_SUPPORTED + link_monitor_thread = kthread_run(link_monitor, NULL, "link_monitor"); +#endif + + return ret; +} + +static void __exit qdpc_exit_module(void) +{ + /* Release netlink */ + qdpc_platform_exit(); + +#ifndef PCIE_HOTPLUG_SUPPORTED + kthread_stop(link_monitor_thread); + link_monitor_thread = NULL; +#endif + + /* Unregister the pci driver with the device */ + pci_unregister_driver(&qdpc_pcie_driver); + + + return; +} + +static inline bool is_pcie_linkup(struct pci_dev *pdev) +{ + uint32_t cs = 0; + + pci_read_config_dword(pdev, QDPC_VENDOR_ID_OFFSET, &cs); + if (cs == QDPC_LINK_UP) { + msleep(10000); + printk("%s: PCIe link up!\n", __func__); + return true; + } + + return false; +} + +static inline void qdpc_pcie_print_config_space(struct pci_dev *pdev) +{ + int i = 0; + uint32_t cs = 0; + + /* Read PCIe configuration space header */ + for (i = QDPC_VENDOR_ID_OFFSET; i <= QDPC_INT_LINE_OFFSET; i += QDPC_ROW_INCR_OFFSET) { + pci_read_config_dword(pdev, i, &cs); + printk("%s: pdev:0x%p config_space offset:0x%02x value:0x%08x\n", __func__, pdev, i, cs); + } + printk("\n"); +} + +static inline void qdpc_pcie_check_link(struct pci_dev *pdev, struct vmac_priv *priv) +{ + __iomem qdpc_pcie_bda_t *bda = priv->bda; + uint32_t cs = 0; + + pci_read_config_dword(pdev, QDPC_VENDOR_ID_OFFSET, &cs); + /* Endian value will be all 1s if link went down */ + if (readl(&bda->bda_pci_endian) == QDPC_LINK_DOWN) { + is_ep_reset = true; + printk("Reset detected\n"); + } +} + +#ifndef PCIE_HOTPLUG_SUPPORTED +static int link_monitor(void *data) +{ + struct net_device *ndev = NULL; + struct vmac_priv *priv = NULL; + __iomem qdpc_pcie_bda_t *bda = NULL; + struct pci_dev *pdev = NULL; + uint32_t cs = 0; + + set_current_state(TASK_RUNNING); + while (!kthread_should_stop()) { + __set_current_state(TASK_INTERRUPTIBLE); + schedule(); + set_current_state(TASK_RUNNING); + + ndev = g_ndev; + priv = netdev_priv(ndev); + bda = priv->bda; + pdev = priv->pdev; + +#ifdef QDPC_CS_DEBUG + qdpc_pcie_print_config_space(pdev); + msleep(5000); +#endif + + /* Check if reset to EP occurred */ + while (!pci_read_config_dword(pdev, QDPC_VENDOR_ID_OFFSET, &cs)) { + + if (kthread_should_stop()) + do_exit(0); + + qdpc_pcie_check_link(pdev, priv); + if (is_ep_reset) { + is_ep_reset = false; + + /* add code to reboot the while QCA system here*/ + printk("%s: Attempting to reboot QCA system.\n", __func__); + machine_restart(NULL); + break; + } + msleep(500); + } + + while(!is_pcie_linkup(pdev)) { + } + +#ifdef QDPC_CS_DEBUG + qdpc_pcie_print_config_space(pdev); +#endif + + qdpc_pcie_probe(pdev, NULL); + } + do_exit(0); +} +#endif + +static int qdpc_bringup_fw(struct vmac_priv *priv) +{ + __iomem qdpc_pcie_bda_t *bda = priv->bda; + uint32_t bdaflg; + char *fwname; + + qdpc_pci_endian_detect(priv); + qdpc_pci_dma_offset_reset(priv); + + printk("Setting HOST ready...\n"); + qdpc_setbootstate(priv, QDPC_BDA_FW_HOST_RDY); + qdpc_bootpoll(priv, QDPC_BDA_FW_TARGET_RDY); + +#ifndef SKIP_PCI_DMA_MASK + if (qdpc_set_dma_mask(priv)){ + printk("Failed to map DMA mask.\n"); + priv->init_thread = NULL; + do_exit(-1); + } +#endif + + bdaflg = qdpc_pci_readl(&bda->bda_flags); + if ((PCIE_BDA_FLASH_PRESENT & bdaflg) && EP_BOOT_FROM_FLASH) { + printk("EP have fw in flash, boot from flash\n"); + qdpc_pcie_posted_write((PCIE_BDA_FLASH_BOOT | + qdpc_pci_readl(&bda->bda_flags)), &bda->bda_flags); + qdpc_setbootstate(priv, QDPC_BDA_FW_TARGET_BOOT); + qdpc_bootpoll(priv, QDPC_BDA_FW_FLASH_BOOT); + goto fw_start; + } + bdaflg &= PCIE_BDA_XMIT_UBOOT; + fwname = bdaflg ? QDPC_TOPAZ_UBOOT : QDPC_TOPAZ_IMG; + + qdpc_setbootstate(priv, QDPC_BDA_FW_TARGET_BOOT); + printk("EP FW load request...\n"); + qdpc_bootpoll(priv, QDPC_BDA_FW_LOAD_RDY); + + printk("Start download Firmware %s...\n", fwname); + if (qdpc_firmware_load(priv->pdev, priv, fwname)){ + printk("Failed to download firmware.\n"); + priv->init_thread = NULL; + do_exit(-1); + } + +fw_start: + qdpc_setbootstate(priv, QDPC_BDA_FW_START); + printk("Start booting EP...\n"); + if (bdaflg != PCIE_BDA_XMIT_UBOOT) { + if (qdpc_bootpoll(priv,QDPC_BDA_FW_CONFIG)) { + booterror(bda); + priv->init_thread = NULL; + do_exit(-1); + } + printk("EP boot successful, starting config...\n"); + + /* Save target-side MSI address for later enable/disable irq*/ + priv->dma_msi_imwr = readl(QDPC_BAR_VADDR(priv->dmareg_bar, TOPAZ_IMWR_DONE_ADDRLO_OFFSET)); + priv->dma_msi_dummy = virt_to_bus(&priv->dma_msi_data) + qdpc_pci_readl(&bda->bda_dma_offset); + priv->ep_pciecfg0_val = readl(QDPC_BAR_VADDR(priv->sysctl_bar, TOPAZ_PCIE_CFG0_OFFSET)); + + qdpc_setbootstate(priv, QDPC_BDA_FW_RUN); + qdpc_bootpoll(priv,QDPC_BDA_FW_RUNNING); + priv->ep_ready = 1; + } + + return (int)bdaflg; +} + +static int qdpc_boot_done(struct vmac_priv *priv) +{ + struct net_device *ndev; + ndev = priv->ndev; + + PRINT_INFO("Connection established with Target BBIC4 board\n"); + +#ifndef PCIE_HOTPLUG_SUPPORTED + if (link_monitor_thread) + wake_up_process(link_monitor_thread); +#endif + + priv->init_thread = NULL; + do_exit(0); +} + +static int qdpc_boot_thread(void *data) +{ + struct vmac_priv *priv = (struct vmac_priv *)data; + int i; + + for (i = 0; i < MAX_IMG_NUM; i++) { + if (qdpc_bringup_fw(priv) <= 0) + break; + } + + qdpc_boot_done(priv); + + return 0; +} + +static void qdpc_nl_recv_msg(struct sk_buff *skb) +{ + struct vmac_priv *priv = netdev_priv(g_ndev); + struct nlmsghdr *nlh = (struct nlmsghdr*)skb->data; + struct sk_buff *skb2; + unsigned int data_len; + unsigned int offset; + qdpc_cmd_hdr_t *cmd_hdr; + uint16_t rpc_type; + + /* Parsing the netlink message */ + + PRINT_DBG(KERN_INFO "%s line %d Netlink received pid:%d, size:%d, type:%d\n", + __FUNCTION__, __LINE__, nlh->nlmsg_pid, nlh->nlmsg_len, nlh->nlmsg_type); + + switch (nlh->nlmsg_type) { + case QDPC_NL_TYPE_CLNT_STR_REG: + case QDPC_NL_TYPE_CLNT_LIB_REG: + if (nlh->nlmsg_type == QDPC_NL_TYPE_CLNT_STR_REG) + priv->str_call_nl_pid = nlh->nlmsg_pid; + else + priv->lib_call_nl_pid = nlh->nlmsg_pid; + return; + case QDPC_NL_TYPE_CLNT_STR_REQ: + case QDPC_NL_TYPE_CLNT_LIB_REQ: + break; + default: + PRINT_DBG(KERN_INFO "%s line %d Netlink Invalid type %d\n", + __FUNCTION__, __LINE__, nlh->nlmsg_type); + return; + } + + /* + * make new skbs; Fragment if necessary. + * The original skb will be freed in netlink_unicast_kernel, + * we hold the new skbs until DMA transfer is done + */ + offset = sizeof(struct nlmsghdr); + data_len = nlh->nlmsg_len; + + while (data_len > 0) { + unsigned int len = min_t(unsigned int, data_len, priv->ndev->mtu); + unsigned int skb2_len = len + sizeof(qdpc_cmd_hdr_t); + + skb2 = alloc_skb(skb2_len, GFP_ATOMIC); + if (!skb2) { + printk(KERN_INFO "%s: skb alloc failed\n", __func__); + return; + } + + data_len -= len; + + rpc_type = nlh->nlmsg_type & QDPC_RPC_TYPE_MASK; + rpc_type |= (data_len > 0 ? QDPC_RPC_TYPE_FRAG : 0); + + cmd_hdr = (qdpc_cmd_hdr_t *)skb2->data; + memcpy(cmd_hdr->dst_magic, QDPC_NETLINK_DST_MAGIC, ETH_ALEN); + memcpy(cmd_hdr->src_magic, QDPC_NETLINK_SRC_MAGIC, ETH_ALEN); + cmd_hdr->type = __constant_htons(QDPC_APP_NETLINK_TYPE); + cmd_hdr->len = htons((uint16_t)len); + cmd_hdr->rpc_type = htons(rpc_type); + cmd_hdr->total_len = htons((uint16_t)(nlh->nlmsg_len)); + + memcpy((uint8_t *)(cmd_hdr + 1), skb->data + offset, len); + + offset += len; + + skb_put(skb2, skb2_len); + skb2->dev = priv->ndev; + + dev_queue_xmit(skb2); + } +} + +module_init(qdpc_init_module); +module_exit(qdpc_exit_module); diff --git a/package/firmware/quantenna/src/drivers/pcie2/host/common/qdpc_init.h b/package/firmware/quantenna/src/drivers/pcie2/host/common/qdpc_init.h new file mode 100644 index 000000000..6d3c825ed --- /dev/null +++ b/package/firmware/quantenna/src/drivers/pcie2/host/common/qdpc_init.h @@ -0,0 +1,119 @@ +/** + * Copyright (c) 2012-2012 Quantenna Communications, Inc. + * All rights reserved. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + **/ + +#ifndef __QDPC_INIT_H_ +#define __QDPC_INIT_H_ + +#include +#include +#include +#include "topaz_vnet.h" + +#define QDPC_MODULE_NAME "qdpc_ruby" +#define QDPC_DEV_NAME "qdpc_ruby" +#define QDPC_MODULE_VERSION "1.0" + +/* PCIe device information declarations */ +#define QDPC_VENDOR_ID 0x1bb5 +#define QDPC_DEVICE_ID 0x0008 +#define QDPC_PCIE_NUM_BARS 6 + +/* PCIe Configuration Space Defines */ +#define QDPC_LINK_UP ((QDPC_DEVICE_ID << 16) | QDPC_VENDOR_ID) /* Used to indicate CS is valid and link is up */ +#define QDPC_LINK_DOWN 0xffffffff /* Used to indicate link went down */ +#define QDPC_VENDOR_ID_OFFSET 0x00 +#define QDPC_INT_LINE_OFFSET 0x3C +#define QDPC_ROW_INCR_OFFSET 0x04 +#undef QDPC_CS_DEBUG + +extern unsigned int (*qdpc_pci_readl)(void *addr); +extern void (*qdpc_pci_writel)(unsigned int val, void *addr); + +/* + * End-point(EP) is little-Endian. + * These two macros are used for host side outbound window memory access. + * Outbound here is host side view-point. So memory accessed by these two macros + * should be on EP side. + * NOTE: On some platforms, outbound hardware swap(byte order swap) should be + * enabled for outbound memory access correctly. If enabled, Endian translation + * will be done by hardware, and software Endian translation should be disabled. + * */ +#ifdef OUTBOUND_HW_SWAP + #define le32_readl(x) readl(x) + #define le32_writel(x, addr) writel(x, addr) +#else + #define le32_readl(x) le32_to_cpu(readl((x))) + #define le32_writel(x, addr) writel(cpu_to_le32((x)), addr) +#endif + +static inline unsigned int qdpc_readl(void *addr) +{ + return readl(addr); +} +static inline void qdpc_writel(unsigned int val, void *addr) +{ + writel(val, addr); +} +static inline unsigned int qdpc_le32_readl(void *addr) +{ + return le32_to_cpu(readl((addr))); +} +static inline void qdpc_le32_writel(unsigned int val, void *addr) +{ + writel(cpu_to_le32((val)), addr); +} + +static inline void qdpc_pcie_posted_write(uint32_t val, __iomem void *basereg) +{ + qdpc_pci_writel(val,basereg); + /* flush posted write */ + qdpc_pci_readl(basereg); +} + +static inline int qdpc_isbootstate(struct vmac_priv *p, uint32_t state) { + __iomem uint32_t *status = &p->bda->bda_bootstate; + uint32_t s = qdpc_pci_readl(status); + return (s == state); +} +static inline int qdpc_booterror(struct vmac_priv *p) { + __iomem uint32_t *status = &p->bda->bda_flags; + uint32_t s = qdpc_pci_readl(status); + return (s & PCIE_BDA_ERROR_MASK); +} +static inline void qdpc_setbootstate(struct vmac_priv *p, uint32_t state) { + __iomem qdpc_pcie_bda_t *bda = p->bda; + + qdpc_pcie_posted_write(state, &bda->bda_bootstate); +} + +/* Function prototypes */ +int qdpc_pcie_init_intr_and_mem(struct vmac_priv *priv); +void qdpc_interrupt_target(struct vmac_priv *priv, uint32_t intr); +void qdpc_disable_irqs(struct vmac_priv *priv); +void qdpc_enable_irqs(struct vmac_priv *priv); +void qdpc_free_interrupt(struct pci_dev *pdev); +void qdpc_pcie_free_mem(struct pci_dev *pdev); +void qdpc_init_target_buffers(void *data); +int qdpc_send_packet(struct sk_buff *skb, struct net_device *ndev); +void *qdpc_map_pciemem(unsigned long busaddr, size_t len); +void qdpc_unmap_pciemem(unsigned long busaddr, void *vaddr, size_t len); +int qdpc_unmap_iomem(struct vmac_priv *priv); +int32_t qdpc_set_dma_mask(struct vmac_priv *priv); + +#endif diff --git a/package/firmware/quantenna/src/drivers/pcie2/host/common/qdpc_pcie.c b/package/firmware/quantenna/src/drivers/pcie2/host/common/qdpc_pcie.c new file mode 100644 index 000000000..6c83aaa9f --- /dev/null +++ b/package/firmware/quantenna/src/drivers/pcie2/host/common/qdpc_pcie.c @@ -0,0 +1,356 @@ +/** + * Copyright (c) 2012-2012 Quantenna Communications, Inc. + * All rights reserved. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + **/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "qdpc_config.h" +#include "qdpc_debug.h" +#include "qdpc_init.h" +#include "qdpc_regs.h" +#include + +static int use_msi = 1; +module_param(use_msi, int, 0644); +MODULE_PARM_DESC(use_msi, "Set 0 to use Legacy interrupt"); + +static int qdpc_pcie_init_intr(struct vmac_priv *priv); +static int qdpc_pcie_init_mem(struct vmac_priv *priv); +static int g_msi = 1; +int32_t qdpc_pcie_init_intr_and_mem(struct vmac_priv *priv) +{ + struct pci_dev *pdev = priv->pdev; + int result = 0; + + /* Initialize interrupts */ + if (( result = qdpc_pcie_init_intr(priv)) < 0) { + PRINT_ERROR("PCIe Interrupt Initialization failed \n"); + return result; + } + + /* Memory Initialization */ + if (( result = qdpc_pcie_init_mem(priv)) < 0) { + PRINT_ERROR("PCIe Memory Initialization failed \n"); + qdpc_free_interrupt(pdev); + } + + return result; +} + +static int32_t qdpc_pcie_init_intr(struct vmac_priv *priv) +{ + struct pci_dev *pdev = priv->pdev; + + priv->msi_enabled = 0; /* Set default to use Legacy INTx interrupt */ + + /* Check if the device has MSI capability */ + if (use_msi) { + if (!pci_enable_msi(pdev)) { + PRINT_INFO("PCIe MSI Interrupt Enabled\n"); + priv->msi_enabled = 1; + } else { + PRINT_ERROR("PCIe MSI Interrupt enabling failed. Fall back to Legacy IRQ\n"); + } + } + + if(!priv->msi_enabled) { + PRINT_INFO("PCIe Legacy Interrupt Enabled\n"); + pci_intx(pdev, 1); + } + + return 0; +} + +static bool qdpc_bar_check(struct vmac_priv *priv, qdpc_bar_t *bar) +{ + uint32_t offset = bar->b_offset; + size_t len = bar->b_len; + dma_addr_t busaddr = bar->b_busaddr; + uint8_t index = bar->b_index; + + if (index > 5) { + printk("Invalid BAR index:%u. Must be between 0 and 5\n", index); + return 0; + } + + if (!len) { + /* NOTE: + * Do not use an implicit length such as the BAR length + * if the map length is too large say > 16Mb this leaves + * the implementation vulnerable to + * Linux and the attack of the Silent "S" (one between the n and u) + */ + printk("Zero length BAR\n"); + return 0; + } + + if (busaddr) { /*initialized BAR */ + unsigned long bar_start = pci_resource_start(priv->pdev , index); + unsigned long bar_end = pci_resource_end(priv->pdev , index); + + if (!bar_start) { + printk("Invalid BAR address: 0x%p.\n", (void *)busaddr); + return 0; + } + + if ((busaddr - offset) != bar_start) { + printk("Invalid BAR offset:0x%p. BAR starts at 0x%p\n", + (void *)(busaddr -offset), (void *)bar_start); + return 0; + } + /* Check the span of the BAR including the offset + length, bar_end points to the last byte of BAR */ + if ((busaddr + len - 1) > bar_end) { + printk("Invalid BAR end address:0x%p. BAR ends at 0x%p\n", + (void *)(busaddr + len), (void *)bar_end); + return 0; + } + } else { /* Unitialized bar */ + unsigned long bar_end = pci_resource_end(priv->pdev , index); + busaddr = pci_resource_start(priv->pdev , index); + + if (!busaddr) { + printk("Invalid BAR address: 0x%p.\n", (void *)busaddr); + return 0; + } + + /* Checks that offset area is within bar */ + if ( (busaddr + offset) > bar_end) { + printk("Invalid BAR offset 0x%p, extends beyond end of BAR(0x%p).\n", + (void *)(busaddr + offset), (void *)bar_end); + return 0; + } + + /* Checks that mapped area is within bar */ + if ((busaddr + len + offset - 1) > bar_end) { + printk("Mapped area 0x%p, extends beyond end of BAR(0x%p).\n", + (void *)(busaddr + len + offset - 1), (void *)bar_end); + return 0; + } + } + + return 1; +} + +static qdpc_bar_t *qdpc_map_bar(struct vmac_priv *priv, qdpc_bar_t *bar, + uint8_t index, size_t len, uint32_t offset) +{ + void *vaddr = NULL; + dma_addr_t busaddr = 0; + qdpc_bar_t temp_bar; + + memset(&temp_bar, 0 ,sizeof(qdpc_bar_t)); + + temp_bar.b_len = len; + temp_bar.b_offset = offset; + temp_bar.b_index = index; + + if (!qdpc_bar_check(priv, &temp_bar)) { + printk("Failed bar mapping sanity check in %s\n", __FUNCTION__); + return NULL; + } + + /* Reserve PCIe memory region*/ + busaddr = pci_resource_start(priv->pdev , index) + offset; + if (!request_mem_region(busaddr, len , QDPC_DEV_NAME)) { + printk("Failed to reserve %u bytes of PCIe memory " + "region starting at 0x%p\n", (uint32_t)len, (void *)busaddr); + return NULL; + } + +#ifndef DISABLE_PCIE_UPDATA_HW_BAR + qdpc_update_hw_bar(priv->pdev, index); +#endif + + vaddr = ioremap_nocache(busaddr, len); + if (!vaddr) { + printk("Failed to map %u bytes at BAR%u at bus address 0x%p.\n", + (uint32_t)len, index, (void *)busaddr); + release_mem_region(busaddr, len); + return NULL; + } + + memset(&temp_bar, 0 ,sizeof(qdpc_bar_t)); + + bar->b_vaddr = vaddr; + bar->b_busaddr = busaddr; + bar->b_len = len; + bar->b_index = index; + bar->b_offset = offset; + + printk("BAR:%u vaddr=0x%p busaddr=%p offset=%u len=%u\n", + bar->b_index, bar->b_vaddr, (void *)bar->b_busaddr, + bar->b_offset, (uint32_t)bar->b_len); + return bar; +} + +static bool qdpc_unmap_bar(struct vmac_priv *priv, qdpc_bar_t *bar) +{ + if (!qdpc_bar_check(priv, bar)) { + PRINT_ERROR("Failed bar mapping sanity check in %s\n", __FUNCTION__); + return 0; + } + + iounmap(bar->b_vaddr); + release_mem_region(bar->b_busaddr - bar->b_offset, bar->b_len); + memset(bar, 0 , sizeof(qdpc_bar_t)); + + return 1; + +} +static void qdpc_map_epmem(struct vmac_priv *priv) +{ + printk("%s() Mapping epmem\n", __FUNCTION__); + qdpc_map_bar(priv, &priv->epmem_bar, QDPC_SHMEM_BAR, + pci_resource_len(priv->pdev, QDPC_SHMEM_BAR) , 0); + + priv->bda =(qdpc_pcie_bda_t *)QDPC_BAR_VADDR(priv->epmem_bar, 0); + priv->bda->bda_rc_msi_enabled = g_msi; +} + +static void qdpc_map_sysctl_regs(struct vmac_priv *priv) +{ + printk("%s() Mapping sysctl\n", __FUNCTION__); + qdpc_map_bar(priv, &priv->sysctl_bar, QDPC_SYSCTL_BAR, pci_resource_len(priv->pdev, QDPC_SYSCTL_BAR) , 0); +} + +static void qdpc_map_dma_regs(struct vmac_priv *priv) +{ + printk("%s() Mapping dma registers\n", __FUNCTION__); + qdpc_map_bar(priv, &priv->dmareg_bar, QDPC_DMA_BAR, pci_resource_len(priv->pdev, QDPC_DMA_BAR), 0); +} + +static void qdpc_unmap_epmem(struct vmac_priv *priv) +{ + printk("%s() Unmapping sysctl\n", __FUNCTION__); + priv->bda = NULL; + qdpc_unmap_bar(priv, &priv->epmem_bar); +} + +static void qdpc_unmap_sysctl_regs(struct vmac_priv *priv) +{ + printk("%s() Unmapping sysctl\n", __FUNCTION__); + + qdpc_unmap_bar(priv, &priv->sysctl_bar); +} + +static void qdpc_unmap_dma_regs(struct vmac_priv *priv) +{ + printk("%s() Unmapping dma regs\n", __FUNCTION__); + qdpc_unmap_bar(priv, &priv->dmareg_bar); +} + +int32_t qdpc_set_dma_mask(struct vmac_priv *priv) { + int result = 0; + uint64_t dma_mask = qdpc_pci_readl(&priv->bda->bda_dma_mask); + + printk("Requested DMA mask:0x%llx\n", dma_mask); + + result = pci_set_dma_mask(priv->pdev, dma_mask); + if (!result) { + result = pci_set_consistent_dma_mask(priv->pdev, dma_mask); + if (result) { + printk(" pci_set_consistent_dma_mask() error %d. Mask:0x%llx\n", result, dma_mask); + return 1; + } + } else { + printk(" pci_set_dma_mask() error %d. Mask:0x%llx\n", result, dma_mask); + return 1; + } + + return 0; +} +static int32_t qdpc_pcie_init_mem(struct vmac_priv *priv) +{ + int ret = 0; + + /* Map SynControl registers and Host to Endpoint interrupt registers to BAR-2 */ + qdpc_map_sysctl_regs(priv); + qdpc_map_epmem(priv); + qdpc_map_dma_regs(priv); + + return ret; +} + +int qdpc_unmap_iomem(struct vmac_priv *priv) +{ + qdpc_unmap_dma_regs(priv); + qdpc_unmap_epmem(priv); + qdpc_unmap_sysctl_regs(priv); + + return SUCCESS; +} + +void qdpc_free_interrupt(struct pci_dev *pdev) +{ + struct net_device *ndev = pci_get_drvdata(pdev); + struct vmac_priv *priv; + + if (ndev == NULL) + return; + + priv = netdev_priv(ndev); + if(priv->msi_enabled) + pci_disable_msi(pdev); + else + pci_intx(pdev, 0); +} + +void qdpc_pcie_free_mem(struct pci_dev *pdev) +{ + return; +} + +void *qdpc_map_pciemem(unsigned long busaddr, size_t len) +{ + /* Reserve PCIe memory region*/ + if (!request_mem_region(busaddr, len, QDPC_DEV_NAME)) { + PRINT_ERROR(KERN_ERR "Failed to reserve %u bytes of " + "PCIe memory region starting at 0x%lx\n", (uint32_t)len, busaddr); + return NULL; + } + return ioremap_nocache(busaddr, len); +} + +void qdpc_unmap_pciemem(unsigned long busaddr, void *vaddr, size_t len) +{ + if (!vaddr || !busaddr) + return; + iounmap(vaddr); + release_mem_region(busaddr, len); +} + +void qdpc_deassert_intx(struct vmac_priv *priv) +{ + void *basereg = QDPC_BAR_VADDR(priv->sysctl_bar, TOPAZ_PCIE_CFG0_OFFSET); + + qdpc_pcie_posted_write(priv->ep_pciecfg0_val & ~TOPAZ_ASSERT_INTX, basereg); +} + diff --git a/package/firmware/quantenna/src/drivers/pcie2/host/common/qdpc_regs.h b/package/firmware/quantenna/src/drivers/pcie2/host/common/qdpc_regs.h new file mode 100644 index 000000000..5325d418d --- /dev/null +++ b/package/firmware/quantenna/src/drivers/pcie2/host/common/qdpc_regs.h @@ -0,0 +1,56 @@ +/** + * Copyright (c) 2012-2012 Quantenna Communications, Inc. + * All rights reserved. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + **/ + +#ifndef __QDPC_REGS_H__ +#define __QDPC_REGS_H__ + +#include +#include + +#define QDPC_SYSCTL_BAR 0 +#define QDPC_SHMEM_BAR 2 +#define QDPC_DMA_BAR 3 + +/* + * NOTE: Below registers are at EP but accessed and written by RC + * Make sure EP codes do not write them, otherwise we have race conditions +*/ + +/* + * The register is one of registers of Endpoint. Root Complex uses it + * to interrupt Endpoint to transmit packets. + */ +#define TOPAZ_IPC_OFFSET (0x13C) + +/* Used to deassert Legacy INTx */ +#define TOPAZ_PCIE_CFG0_OFFSET (0x6C) +#define TOPAZ_ASSERT_INTX BIT(9) + +/* This macro is used to set interrupt bit of register QDPC_EP_SYS_CTL_IPC4_INT */ +#define TOPAZ_SET_INT(x) ((x) | ((x) << 16)) + +/* "DMA Write Done IMWr Address Low" register at EP side*/ +#define TOPAZ_IMWR_DONE_ADDRLO_OFFSET (0x700 + 0x2D0) +#define TOPAZ_IMWR_ABORT_ADDRLO_OFFSET (0x700 + 0x2D8) + +/* Power management control status register */ +#define TOPAZ_PCI_PM_CTRL_OFFSET (0x44) + +#endif //__QDPC_REGS_H__ + diff --git a/package/firmware/quantenna/src/drivers/pcie2/host/common/topaz_vnet.c b/package/firmware/quantenna/src/drivers/pcie2/host/common/topaz_vnet.c new file mode 100644 index 000000000..b1bb23c76 --- /dev/null +++ b/package/firmware/quantenna/src/drivers/pcie2/host/common/topaz_vnet.c @@ -0,0 +1,1633 @@ +/** + * Copyright (c) 2012-2012 Quantenna Communications, Inc. + * All rights reserved. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + **/ + +#ifndef EXPORT_SYMTAB +#define EXPORT_SYMTAB +#endif + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + + +#include + +#include /* For cache line size definitions */ +#include /* For cache flushing functions */ + +#include + +#include "topaz_vnet.h" +#include "qdpc_config.h" +#include "qdpc_init.h" +#include "qdpc_debug.h" +#include "qdpc_regs.h" +#include "nss_api_if.h" +#include "qdpc_version.h" + +#define DRV_NAME "qdpc-host" + +#ifndef DRV_VERSION +#define DRV_VERSION "1.0" +#endif + +#define DRV_AUTHOR "Quantenna Communications Inc." +#define DRV_DESC "PCIe virtual Ethernet port driver" + +MODULE_AUTHOR(DRV_AUTHOR); +MODULE_DESCRIPTION(DRV_DESC); +MODULE_LICENSE("GPL"); + +#undef __sram_text +#define __sram_text + +static int __sram_text vmac_rx_poll (struct napi_struct *napi, int budget); +static int __sram_text skb2rbd_attach(struct net_device *ndev, uint16_t i, uint32_t wrap); +static irqreturn_t vmac_interrupt(int irq, void *dev_id); +static void vmac_tx_timeout(struct net_device *ndev); +static int vmac_get_settings(struct net_device *ndev, struct ethtool_cmd *cmd); +static int vmac_set_settings(struct net_device *ndev, struct ethtool_cmd *cmd); +static void vmac_get_drvinfo(struct net_device *ndev, struct ethtool_drvinfo *info); +static void free_tx_skbs(struct vmac_priv *vmp); +static void init_tx_bd(struct vmac_priv *vmp); +static void free_rx_skbs(struct vmac_priv *vmp); +static int alloc_and_init_rxbuffers(struct net_device *ndev); +static void bring_up_interface(struct net_device *ndev); +static void shut_down_interface(struct net_device *ndev); +static int vmac_open(struct net_device *ndev); +static int vmac_close(struct net_device *ndev); +static int vmac_ioctl(struct net_device *ndev, struct ifreq *rq, int cmd); +#ifdef QTN_WAKEQ_SUPPORT +static inline void vmac_try_wake_queue(struct net_device *ndev); +static inline void vmac_try_stop_queue(struct net_device *ndev); +#endif +#ifdef RX_IP_HDR_REALIGN +static uint32_t align_cnt = 0, unalign_cnt = 0; +#endif + +#ifdef DNI_EXTRA_FUNCTIONS +#ifdef DNI_5G_LED +extern void detect_wifi_5g_data(void); +#define BLINK_5G_LED(_vmp) do { \ + if (_vmp->led_enable) \ + detect_wifi_5g_data(); \ + } while(0) +#else +#define BLINK_5G_LED(_vmp) do { } while (0) +#endif +#else +#define BLINK_5G_LED(_vmp) do { } while (0) +#endif + +#define RX_DONE_INTR_MSK ((0x1 << 6) -1) +#define VMAC_BD_LEN (sizeof(struct vmac_bd)) + +#define QTN_GLOBAL_INIT_EMAC_TX_QUEUE_LEN 256 +#define VMAC_DEBUG_MODE +/* Tx dump flag */ +#define DMP_FLG_TX_BD (0x1 << ( 0)) /* vmac s 32 */ +#define DMP_FLG_TX_SKB (0x1 << ( 1)) /* vmac s 33 */ +/* Rx dump flag */ +#define DMP_FLG_RX_BD (0x1 << (16)) /* vmac s 48 */ +#define DMP_FLG_RX_SKB (0x1 << (17)) /* vmac s 49 */ +#define DMP_FLG_RX_INT (0x1 << (18)) /* vmac s 50 */ + +#define SHOW_TX_BD (16) +#define SHOW_RX_BD (17) +#define SHOW_VMAC_STATS (18) + +#ifndef QDPC_PLATFORM_IFPORT +#define QDPC_PLATFORM_IFPORT 0 +#endif + +#define VMAC_TX_TIMEOUT (180 * HZ) + +#ifdef VMAC_DEBUG_MODE + +#define dump_tx_bd(vmp) do { \ + if (unlikely((vmp)->dbg_flg & DMP_FLG_TX_BD)) { \ + txbd2str(vmp); \ + } \ + } while (0) + +#define dump_tx_pkt(vmp, data, len) do { \ + if (unlikely(((vmp)->dbg_flg & DMP_FLG_TX_SKB))) \ + dump_pkt(data, len, "Tx"); \ + } while(0) + +#define dump_rx_bd(vmp) do { \ + if (unlikely((vmp)->dbg_flg & DMP_FLG_RX_BD)) { \ + rxbd2str(vmp); \ + } \ + } while (0) + +#define dump_rx_pkt(vmp, data, len) do { \ + if (unlikely((vmp)->dbg_flg & DMP_FLG_RX_SKB)) \ + dump_pkt(data, len, "Rx"); \ + } while(0) + +#define dump_rx_int(vmp) do { \ + if (unlikely((vmp)->dbg_flg & DMP_FLG_RX_INT)) \ + dump_rx_interrupt(vmp); \ + } while (0) + +#else +#define dump_tx_bd(vmp) +#define dump_tx_pkt(vmp, skb, len) +#define dump_rx_bd(vmp) +#define dump_rx_pkt(vmp, skb, len) +#define dump_rx_int(vmp) +#endif + +struct vmac_cfg vmaccfg = { + QDPC_RX_QUEUE_SIZE, QDPC_TX_QUEUE_SIZE, "host%d", NULL +}; + +static char *ethaddr = NULL; +module_param(ethaddr, charp, S_IRUGO); +MODULE_PARM_DESC(store, "ethaddr"); + +#ifdef RX_IP_HDR_REALIGN +static uint32_t rx_pkt_align = 0; +module_param(rx_pkt_align, uint, 0644); +MODULE_PARM_DESC(rx_pkt_align, "RX Pakcet IP header realign to 4byte boundary"); +#endif + +/* Alignment helper functions */ +__always_inline static unsigned long align_up_off(unsigned long val, unsigned long step) +{ + return (((val + (step - 1)) & (~(step - 1))) - val); +} + +__always_inline static unsigned long align_down_off(unsigned long val, unsigned long step) +{ + return ((val) & ((step) - 1)); +} + +__always_inline static unsigned long align_val_up(unsigned long val, unsigned long step) +{ + return ((val + step - 1) & (~(step - 1))); +} + +__always_inline static unsigned long align_val_down(unsigned long val, unsigned long step) +{ + return (val & (~(step - 1))); +} + +__always_inline static void* align_buf_dma(void *addr) +{ + return (void*)align_val_up((unsigned long)addr, dma_get_cache_alignment()); +} + +__always_inline static unsigned long align_buf_dma_offset(void *addr) +{ + return (align_buf_dma(addr) - addr); +} + +__always_inline static void* align_buf_cache(void *addr) +{ + return (void*)align_val_down((unsigned long)addr, dma_get_cache_alignment()); +} + +__always_inline static unsigned long align_buf_cache_offset(void *addr) +{ + return (addr - align_buf_cache(addr)); +} + +__always_inline static unsigned long align_buf_cache_size(void *addr, unsigned long size) +{ + return align_val_up(size + align_buf_cache_offset(addr), dma_get_cache_alignment()); +} + +/* Print the Tx Request Queue */ +static int txbd2str_range(struct vmac_priv *vmp, uint16_t s, int num) +{ + qdpc_pcie_bda_t *bda = vmp->bda; + int i; + + printk("RC insert start index\t: %d\n", vmp->tx_bd_index); + printk("RC reclaim start index\t: %d\n", vmp->tx_reclaim_start); + printk("valid entries\t\t: %d\n", vmp->vmac_tx_queue_len); + printk("Pkt index EP handled\t: %d\n", le32_to_cpu(VMAC_REG_READ(vmp->ep_next_rx_pkt))); + + printk("\t\t%8s\t%8s\t%8s\t%10s\n", "Address", "Valid", "Length", "Pkt Addr"); + + for (i = 0; i < num; i++) { + printk("\t%d\t0x%08x\t%8s\t\t%d\t0x%p\n", s, bda->request[s].addr, \ + (bda->request[s].info & PCIE_TX_VALID_PKT) ? "Valid" : "Invalid", \ + bda->request[s].info & 0xffff, vmp->tx_skb[s]); + VMAC_INDX_INC(s, vmp->tx_bd_num); + } + + return 0; +} + +static int txbd2str(struct vmac_priv *vmp) +{ + uint16_t s; + + s = VMAC_INDX_MINUS(vmp->tx_bd_index, 4, vmp->tx_bd_num); + return txbd2str_range(vmp, s, 8); +} + +static int txbd2str_all(struct vmac_priv *vmp) +{ + return txbd2str_range(vmp, 0, vmp->tx_bd_num); +} + +static int rxbd2str_range(struct vmac_priv *vmp, uint16_t s, int num) +{ + int i; + char *idxflg; + + printk("rxindx\trbdaddr\t\tbuff\t\tinfo\t\trx_skb\n"); + for (i = 0; i < num; i++) { + if(s == vmp->rx_bd_index) + idxflg = ">rbd"; + else + idxflg = ""; + printk("%2d%s\t@%p\t%08x\t%08x\t%p\n", s, idxflg, + &vmp->rx_bd_base[s], vmp->rx_bd_base[s].buff_addr, + vmp->rx_bd_base[s].buff_info, vmp->rx_skb[s]); + + VMAC_INDX_INC(s, vmp->rx_bd_num); + } + return 0; +} + +static int rxbd2str(struct vmac_priv *vmp) +{ + uint16_t s; + s = VMAC_INDX_MINUS(vmp->rx_bd_index, 4, vmp->rx_bd_num); + return rxbd2str_range(vmp, s, 8); +} + +static int rxbd2str_all(struct vmac_priv *vmp) +{ + return rxbd2str_range(vmp, 0, vmp->rx_bd_num); +} + +static int vmaccnt2str(struct vmac_priv *vmp, char *buff) +{ + int count; + count = sprintf(buff, "tx_bd_busy_cnt:\t%08x\n", vmp->tx_bd_busy_cnt); + count += sprintf(buff + count, "tx_stop_queue_cnt:\t%08x\n", vmp->tx_stop_queue_cnt); + count += sprintf(buff + count, "rx_skb_alloc_failures:\t%08x\n", vmp->rx_skb_alloc_failures); + count += sprintf(buff + count, "intr_cnt:\t%08x\n", vmp->intr_cnt); + count += sprintf(buff + count, "vmac_xmit_cnt:\t%08x\n", vmp->vmac_xmit_cnt); + count += sprintf(buff + count, "vmac_skb_free:\t%08x\n", vmp->vmac_skb_free); +#ifdef QTN_SKB_RECYCLE_SUPPORT + count += sprintf(buff + count, "skb_recycle_cnt:\t%08x\n", vmp->skb_recycle_cnt); + count += sprintf(buff + count, "skb_recycle_failures:\t%08x\n", vmp->skb_recycle_failures); +#endif + count += sprintf(buff + count, "vmp->txqueue_stopped=%x\n", vmp->txqueue_stopped); + count += sprintf(buff + count, "*vmp->txqueue_wake=%x\n", *vmp->txqueue_wake); +#ifdef RX_IP_HDR_REALIGN + if(rx_pkt_align) + count += sprintf(buff + count, "rx iphdr aligned:%d,unalign:%d\n", align_cnt, unalign_cnt); +#endif + return count; +} + +static ssize_t vmac_dbg_show(struct device *dev, struct device_attribute *attr, + char *buff) +{ + struct net_device *ndev = container_of(dev, struct net_device, dev); + struct vmac_priv *vmp = netdev_priv(ndev); + int count = 0; + switch (vmp->show_item) { + case SHOW_TX_BD: /* Print Tx Rquest Queue */ + count = (ssize_t)txbd2str_all(vmp); + break; + case SHOW_RX_BD:/* show Rx BD */ + count = (ssize_t)rxbd2str_all(vmp); + break; + case SHOW_VMAC_STATS:/* show vmac interrupt statistic info */ + count = vmaccnt2str(vmp, buff); + default: + break; + } + return count; +} + +static ssize_t vmac_dbg_set(struct device *dev, + struct device_attribute *attr, const char *buf, size_t count) +{ + struct net_device *ndev = container_of(dev, struct net_device, dev); + struct vmac_priv *vmp = netdev_priv(ndev); + uint8_t cmd; + + cmd = (uint8_t)simple_strtoul(buf, NULL, 10); + if (cmd < 16) { + switch(cmd) { + case 0: + vmp->dbg_flg = 0; /* disable all of runtime dump */ + break; + case 1: + napi_schedule(&vmp->napi); + break; + case 2: + vmp->tx_bd_busy_cnt = 0; + vmp->intr_cnt = 0; + vmp->rx_skb_alloc_failures = 0; + default: + break; + } + } + else if (cmd < 32) /* used for vmac_dbg_show */ + vmp->show_item = cmd; + else if (cmd < 64) /* used for runtime dump */ + vmp->dbg_flg |= (0x1 << (cmd - 32)); + else if (cmd == 64) /* enable all of runtime dump */ + vmp->dbg_flg = -1; + + return count; +} +static DEVICE_ATTR(dbg, S_IWUSR | S_IRUSR, vmac_dbg_show, vmac_dbg_set); /* dev_attr_dbg */ + +static ssize_t vmac_pm_show(struct device *dev, struct device_attribute *attr, + char *buff) +{ + struct net_device *ndev = container_of(dev, struct net_device, dev); + struct vmac_priv *vmp = netdev_priv(ndev); + int count = 0; + + count += sprintf(buff + count, "PCIE Device Power State : %s\n", + le32_to_cpu(*vmp->ep_pmstate) == PCI_D3hot ? "D3" : "D0"); + + return count; +} + +static ssize_t vmac_pm_set(struct device *dev, + struct device_attribute *attr, const char *buf, size_t count) +{ + struct net_device *ndev = container_of(dev, struct net_device, dev); + struct vmac_priv *vmp = netdev_priv(ndev); + uint8_t cmd; + + cmd = (uint8_t)simple_strtoul(buf, NULL, 10); + + if (cmd == 0) { + qdpc_pcie_resume(vmp->pdev); + } else if (cmd == 1) { + pm_message_t state; + state.event = 0; + qdpc_pcie_suspend(vmp->pdev, state); + } + + return count; +} +static DEVICE_ATTR(pmctrl, S_IWUSR | S_IRUSR, vmac_pm_show, vmac_pm_set); /* dev_attr_pmctrl */ + +static struct attribute *vmac_device_attrs[] = { + &dev_attr_dbg.attr, + &dev_attr_pmctrl.attr, + NULL, +}; + +static const struct attribute_group vmac_attr_group = { + .attrs = vmac_device_attrs, +}; + +#ifdef VMAC_DEBUG_MODE +static void dump_pkt(char *data, int len, char *s) +{ + int i; + + if (len > 128) + len = 128; + printk("%spkt start%p>\n", s, data); + for (i = 0; i < len;) { + printk("%02x ", data[i]); + if ((++i % 16) == 0) + printk("\n"); + } + printk("<%spkt end\n", s); +} + +static void dump_rx_interrupt(struct vmac_priv *vmp) +{ + printk("intr_cnt:\t%08x\n", vmp->intr_cnt); +} +#endif + +#define VMAC_BD_INT32_VAR 3 + +static int alloc_bd_tbl(struct net_device *ndev) +{ + struct vmac_priv *vmp = netdev_priv(ndev); + uint32_t ucaddr; + uint32_t paddr; + int len; /* Length of allocated Transmitted & Received descriptor array */ + + /* uint32_t is used to be updated by ep */ + len = (vmp->tx_bd_num + vmp->rx_bd_num) * VMAC_BD_LEN + VMAC_BD_INT32_VAR * sizeof(uint32_t); + ucaddr = (uint32_t)pci_alloc_consistent(vmp->pdev, len, (dma_addr_t *)&paddr); + if (!ucaddr) + return -1; + + memset((void *)ucaddr, 0, len); + + vmp->addr_uncache = ucaddr; + vmp->uncache_len = len; + + /* Update pointers related with Tx descriptor table */ + vmp->tx_bd_base = (struct vmac_bd *)ucaddr; + qdpc_pcie_posted_write(paddr, &vmp->bda->bda_rc_tx_bd_base); + init_tx_bd(vmp); + printk("Tx Descriptor table: uncache virtual addr: 0x%08x paddr: 0x%08x\n", + (uint32_t)vmp->tx_bd_base, paddr); + + /* Update pointers related with Rx descriptor table */ + ucaddr += vmp->tx_bd_num * VMAC_BD_LEN; + paddr += vmp->tx_bd_num * VMAC_BD_LEN; + + vmp->rx_bd_base = (struct vmac_bd *)ucaddr; + qdpc_pcie_posted_write(paddr, &vmp->bda->bda_rc_rx_bd_base); + printk("Rx Descriptor table: uncache virtual addr: 0x%08x paddr: 0x%08x\n", + (uint32_t)vmp->rx_bd_base, paddr); + + /* Update pointers used by EP's updating consumed packet index */ + ucaddr += vmp->rx_bd_num * VMAC_BD_LEN; + paddr += vmp->rx_bd_num * VMAC_BD_LEN; + + vmp->ep_next_rx_pkt = (uint32_t *)ucaddr; + qdpc_pcie_posted_write(paddr, &vmp->bda->bda_ep_next_pkt); + printk("EP_handled_idx: uncache virtual addr: 0x%08x paddr: 0x%08x\n", + (uint32_t)vmp->ep_next_rx_pkt, paddr); + + ucaddr += sizeof(uint32_t); + paddr += sizeof(uint32_t); + + vmp->txqueue_wake = (uint32_t *)ucaddr; + + ucaddr += sizeof(uint32_t); + paddr += sizeof(uint32_t); + vmp->ep_pmstate = (uint32_t *)ucaddr; + + return 0; +} + +static void free_bd_tbl(struct vmac_priv *vmp) +{ + pci_free_consistent(vmp->pdev, vmp->uncache_len, (void *)vmp->addr_uncache, + qdpc_pci_readl(&vmp->bda->bda_rc_tx_bd_base)); +} + +static int alloc_skb_desc_array(struct net_device *ndev) +{ + struct vmac_priv *vmp = netdev_priv(ndev); + uint32_t addr; + int len; + + len = (vmp->tx_bd_num + vmp->rx_bd_num) * (sizeof(struct sk_buff *)); + addr = (uint32_t)kzalloc(len, GFP_KERNEL); + if (!addr) + return -1; + vmp->tx_skb = (struct sk_buff **)addr; + + addr += vmp->tx_bd_num * sizeof(struct sk_buff *); + vmp->rx_skb = (struct sk_buff **)addr; + + return 0; +} + +static void free_skb_desc_array(struct net_device *ndev) +{ + struct vmac_priv *vmp = netdev_priv(ndev); + + kfree(vmp->tx_skb); +} + +#ifdef QTN_SKB_RECYCLE_SUPPORT +static inline struct sk_buff *__vmac_rx_skb_freelist_pop(struct vmac_priv *vmp) +{ + struct sk_buff *skb = __skb_dequeue(&vmp->rx_skb_freelist); + + return skb; +} + +static inline int vmac_rx_skb_freelist_push(struct vmac_priv *vmp, dma_addr_t buff_addr, struct sk_buff *skb) +{ + unsigned long flag; + + if (skb_queue_len(&vmp->rx_skb_freelist) > QTN_RX_SKB_FREELIST_MAX_SIZE) { + pci_unmap_single(vmp->pdev, buff_addr, skb->len, (int)DMA_BIDIRECTIONAL); + dev_kfree_skb(skb); + vmp->vmac_skb_free++; + return 0; + } + + /* check for undersize skb; this should never happen, and indicates problems elsewhere */ + if (unlikely((skb_end_pointer(skb) - skb->head) < QTN_RX_BUF_MIN_SIZE)) { + pci_unmap_single(vmp->pdev, buff_addr, skb->len, (int)DMA_BIDIRECTIONAL); + dev_kfree_skb(skb); + vmp->vmac_skb_free++; + vmp->skb_recycle_failures++; + return -EINVAL; + } + + skb->len = 0; + skb->tail = skb->data = skb->head; + skb_reserve(skb, NET_SKB_PAD); + skb_reserve(skb, align_buf_dma_offset(skb->data)); + + qtn_spin_lock_bh_save(&vmp->rx_skb_freelist_lock, &flag); + __skb_queue_tail(&vmp->rx_skb_freelist, skb); + qtn_spin_unlock_bh_restore(&vmp->rx_skb_freelist_lock, &flag); + + vmp->skb_recycle_cnt++; + + return 0; +} + +static inline void __vmac_rx_skb_freelist_refill(struct vmac_priv *vmp) +{ + struct sk_buff *skb = NULL; + int num = vmp->rx_skb_freelist_fill_level - skb_queue_len(&vmp->rx_skb_freelist); + + while (num > 0) { + if (!(skb = dev_alloc_skb(SKB_BUF_SIZE))) { + vmp->rx_skb_alloc_failures++; + break; + } + /* Move skb->data to a cache line boundary */ + skb_reserve(skb, align_buf_dma_offset(skb->data)); + pci_map_single(vmp->pdev, skb->data, skb_end_pointer(skb) - skb->data, (int)DMA_FROM_DEVICE); + __skb_queue_tail(&vmp->rx_skb_freelist, skb); + + num--; + } +} + +static void vmac_rx_skb_freelist_purge(struct vmac_priv *vmp) +{ + unsigned long flag; + + qtn_spin_lock_bh_save(&vmp->rx_skb_freelist_lock, &flag); + __skb_queue_purge(&vmp->rx_skb_freelist); + qtn_spin_unlock_bh_restore(&vmp->rx_skb_freelist_lock, &flag); +} +#endif /* QTN_SKB_RECYCLE_SUPPORT */ + +static inline bool check_netlink_magic(qdpc_cmd_hdr_t *cmd_hdr) +{ + return ((memcmp(cmd_hdr->dst_magic, QDPC_NETLINK_DST_MAGIC, ETH_ALEN) == 0) + && (memcmp(cmd_hdr->src_magic, QDPC_NETLINK_SRC_MAGIC, ETH_ALEN) == 0)); +} + +static void vmac_netlink_rx(struct net_device *ndev, void *buf, size_t len, uint16_t rpc_type, uint32_t total_len) +{ + struct vmac_priv *priv = netdev_priv(ndev); + struct sk_buff *skb; + struct nlmsghdr *nlh; + int pid = 0; + int frag = (rpc_type & QDPC_RPC_TYPE_FRAG_MASK); + + rpc_type &= QDPC_RPC_TYPE_MASK; + + if (unlikely(total_len > VMAC_NL_BUF_SIZE)) { + printk(KERN_INFO"%s: total length %u exceeds buffer length %u\n", __func__, + total_len, VMAC_NL_BUF_SIZE); + goto reset_nlbuf; + } + + if (unlikely(priv->nl_len + len > total_len)) { + printk(KERN_INFO"%s: frag length %u exceeds total length %u\n", __func__, + priv->nl_len + len, total_len); + goto reset_nlbuf; + } + + memcpy(priv->nl_buf + priv->nl_len, buf, len); + priv->nl_len += len; + + if (frag) + return; + + /* last fragment -- hand it to upper layer */ + buf = priv->nl_buf; + len = priv->nl_len; + + skb = nlmsg_new(len, GFP_ATOMIC); + if (skb == NULL) { + DBGPRINTF("WARNING: out of netlink SKBs\n"); + goto reset_nlbuf; + } + + nlh = nlmsg_put(skb, 0, 0, NLMSG_DONE, len, 0); ; + memcpy(nlmsg_data(nlh), buf, len); + NETLINK_CB(skb).dst_group = 0; + + if (rpc_type == QDPC_RPC_TYPE_STRCALL) + pid = priv->str_call_nl_pid; + else if (rpc_type == QDPC_RPC_TYPE_LIBCALL) + pid = priv->lib_call_nl_pid; + + if (unlikely(pid == 0)) { + kfree_skb(skb); + goto reset_nlbuf; + } + + nlmsg_unicast(priv->nl_socket, skb, pid); + +reset_nlbuf: + priv->nl_len = 0; +} + +static inline void vmac_napi_schedule(struct vmac_priv *vmp) +{ + if (napi_schedule_prep(&vmp->napi)) { + disable_vmac_ints(vmp); + __napi_schedule(&vmp->napi); + } +} + +#ifdef QDPC_PLATFORM_IRQ_FIXUP +static inline int vmac_has_more_rx(struct vmac_priv *vmp) +{ + uint16_t i = vmp->rx_bd_index; + volatile struct vmac_bd *rbdp = &vmp->rx_bd_base[i]; + + return !(le32_to_cpu(rbdp->buff_info) & VMAC_BD_EMPTY); +} +static inline void vmac_irq_open_fixup(struct vmac_priv *vmp) +{ + vmac_napi_schedule(vmp); +} +/* + * TODO: vmac_irq_napi_fixup needs to undergo stability and + * especially performance test to justify its value +*/ +static inline void vmac_irq_napi_fixup(struct vmac_priv *vmp) +{ + if (unlikely(vmac_has_more_rx(vmp))) + vmac_napi_schedule(vmp); +} +#else +#define vmac_irq_open_fixup(v) do{}while(0) +#define vmac_irq_napi_fixup(v) do{}while(0) +#endif + + +#ifdef QCA_NSS_PLATFORM +/* + * send_to_nss + * Send packets to the nss driver + */ +static void send_to_nss(struct vmac_priv *vmp, struct sk_buff *skb){ + + if (!vmp->nss_enable) + goto out; + + if(!vmp->nssctx){ + goto out; + } + + skb->next = NULL; + if (skb_shared(skb)){ + goto out; + } + + if(nss_tx_virt_if_rxbuf(vmp->nssctx, skb)){ + goto out; + } + return ; +out: + netif_receive_skb(skb); +} +#endif +#ifdef RX_IP_HDR_REALIGN +/* + * skb buffer have a pading, so skb data move less than pading is safe + * + */ +static void vmac_rx_ip_align_ahead(struct sk_buff *skb, uint32_t move_bytes) +{ + uint8_t *pkt_src, *pkt_dst; + uint8_t bytes_boundary = ((uint32_t)(skb->data)) % 4; + BUG_ON(bytes_boundary & 1); + + /*bytes_boundary == 0 means etherheader is 4 byte aligned, + *so IP header is 2(+14 ether header) byte aligned, + *move whole packet 2 byte ahead for QCA NSS preference + */ + + if(bytes_boundary == 0){ + if(skb_headroom(skb) >= move_bytes){ + pkt_src = skb->data; + pkt_dst = skb->data - move_bytes; + + memmove(pkt_dst, pkt_src, skb->len); + + skb->data -= move_bytes; + skb->tail -= move_bytes; + } + unalign_cnt++; + } + else if(bytes_boundary == 2){ + align_cnt++; + } +} +#endif + +static int __sram_text vmac_rx_poll(struct napi_struct *napi, int budget) +{ + struct vmac_priv *vmp = container_of(napi, struct vmac_priv, napi); + struct net_device *ndev = vmp->ndev; + struct ethhdr *eth; + qdpc_cmd_hdr_t *cmd_hdr; + int processed = 0; + uint16_t i = vmp->rx_bd_index; + volatile struct vmac_bd *rbdp = &vmp->rx_bd_base[i]; + uint32_t descw1; + + while (!((descw1 = le32_to_cpu(VMAC_REG_READ(&rbdp->buff_info))) & VMAC_BD_EMPTY) && (processed < budget)) { + struct sk_buff *skb; + skb = vmp->rx_skb[i]; + if (skb) { + skb_reserve(skb, VMAC_GET_OFFSET(descw1)); + skb_put(skb, VMAC_GET_LEN(descw1)); + + eth = (struct ethhdr *)(skb->data); + if (unlikely(ntohs(eth->h_proto) == QDPC_APP_NETLINK_TYPE)) { + /* Double Check if it's netlink packet*/ + cmd_hdr = (qdpc_cmd_hdr_t *)skb->data; + if (check_netlink_magic(cmd_hdr)) { + vmac_netlink_rx(ndev, + skb->data + sizeof(qdpc_cmd_hdr_t), + ntohs(cmd_hdr->len), + ntohs(cmd_hdr->rpc_type), + ntohs(cmd_hdr->total_len)); + } + dev_kfree_skb(skb); + } else { +#ifdef QTN_SKB_RECYCLE_SUPPORT + pci_unmap_single(vmp->pdev, rbdp->buff_addr, + skb_end_pointer(skb) - skb->data, (int)DMA_BIDIRECTIONAL); +#else + pci_unmap_single(vmp->pdev, rbdp->buff_addr, + skb_end_pointer(skb) - skb->data, (int)DMA_FROM_DEVICE); +#endif /* QTN_SKB_RECYCLE_SUPPORT */ + +#ifdef RX_IP_HDR_REALIGN + if (rx_pkt_align) + vmac_rx_ip_align_ahead(skb, 2); +#endif + dump_rx_pkt(vmp, (char *)skb->data, (int)skb->len); + + skb->protocol = eth_type_trans(skb, ndev); + processed++; + + +#ifdef QCA_NSS_PLATFORM + send_to_nss(vmp, skb); +#else + netif_receive_skb(skb); +#endif + + BLINK_5G_LED(vmp); + + ndev->stats.rx_packets++; + ndev->stats.rx_bytes += VMAC_GET_LEN(descw1); + } + } + if ((ndev->stats.rx_packets & RX_DONE_INTR_MSK) == 0) + writel(TOPAZ_SET_INT(IPC_RC_RX_DONE), vmp->ep_ipc_reg); + + dump_rx_bd(vmp); + + ndev->last_rx = jiffies; + + /* + * We are done with the current buffer attached to this descriptor, so attach a new + * one. + */ + if (skb2rbd_attach(ndev, i, descw1 & VMAC_BD_WRAP) == 0) { + if (++i >= vmp->rx_bd_num) + i = 0; + vmp->rx_bd_index = i; + rbdp = &vmp->rx_bd_base[i]; + } else { + break; + } + } +#ifdef QTN_WAKEQ_SUPPORT + vmac_try_wake_queue(ndev); +#endif + if (processed < budget) { + napi_complete(napi); + enable_vmac_ints(vmp); + vmac_irq_napi_fixup(vmp); + } + +#ifdef QTN_SKB_RECYCLE_SUPPORT + spin_lock(&vmp->rx_skb_freelist_lock); + __vmac_rx_skb_freelist_refill(vmp); + spin_unlock(&vmp->rx_skb_freelist_lock); +#endif + + return processed; +} + +static int __sram_text skb2rbd_attach(struct net_device *ndev, uint16_t rx_bd_index, uint32_t wrap) +{ + struct vmac_priv *vmp = netdev_priv(ndev); + volatile struct vmac_bd * rbdp; + uint32_t buff_addr; + struct sk_buff *skb = NULL; +#ifdef QTN_SKB_RECYCLE_SUPPORT + spin_lock(&vmp->rx_skb_freelist_lock); + if (unlikely(!(skb = __vmac_rx_skb_freelist_pop(vmp)))) { + spin_unlock(&vmp->rx_skb_freelist_lock); + vmp->rx_skb[rx_bd_index] = NULL;/* prevent old packet from passing the packet up */ + return -1; + } + spin_unlock(&vmp->rx_skb_freelist_lock); +#else + if (!(skb = dev_alloc_skb(SKB_BUF_SIZE))) { + vmp->rx_skb_alloc_failures++; + vmp->rx_skb[rx_bd_index] = NULL;/* prevent old packet from passing the packet up */ + return -1; + } +#endif /* QTN_SKB_RECYCLE_SUPPORT */ + skb->dev = ndev; + + vmp->rx_skb[rx_bd_index] = skb; +#ifndef QTN_SKB_RECYCLE_SUPPORT + /* Move skb->data to a cache line boundary */ + skb_reserve(skb, align_buf_dma_offset(skb->data)); +#endif /* QTN_SKB_RECYCLE_SUPPORT */ + + /* Invalidate cache and map virtual address to bus address. */ + rbdp = &vmp->rx_bd_base[rx_bd_index]; + +#ifdef QTN_SKB_RECYCLE_SUPPORT + buff_addr = virt_to_bus(skb->data); +#else + buff_addr = (uint32_t)pci_map_single(vmp->pdev, skb->data, + skb_end_pointer(skb) - skb->data, (int)DMA_FROM_DEVICE); +#endif + rbdp->buff_addr = cpu_to_le32(buff_addr); + + /* TODO: packet length, currently don't check the length */ + rbdp->buff_info = cpu_to_le32(VMAC_BD_EMPTY | wrap); + + return 0; +} + + +static __attribute__((section(".sram.text"))) void +vmac_tx_teardown(struct net_device *ndev, qdpc_pcie_bda_t *bda) +{ + struct vmac_priv *vmp = netdev_priv(ndev); + volatile struct vmac_bd *tbdp; + uint16_t i; + uint32_t end_idx = le32_to_cpu(VMAC_REG_READ(vmp->ep_next_rx_pkt)); + + i = vmp->tx_reclaim_start; + + while (i != end_idx) { + struct sk_buff *skb; + tbdp = &vmp->tx_bd_base[i]; + skb = vmp->tx_skb[i]; + if (!skb) + break; + + ndev->stats.tx_packets++; + + ndev->stats.tx_bytes += skb->len; +#ifdef QTN_SKB_RECYCLE_SUPPORT + vmac_rx_skb_freelist_push(vmp, (dma_addr_t)tbdp->buff_addr, skb); +#else + pci_unmap_single(vmp->pdev, (dma_addr_t)tbdp->buff_addr, + skb->len, (int)DMA_TO_DEVICE); + dev_kfree_skb(skb); +#endif /* QTN_SKB_RECYCLE_SUPPORT */ + vmp->tx_skb[i] = NULL; + + vmp->vmac_skb_free++; + + vmp->vmac_tx_queue_len--; + + if (++i >= vmp->tx_bd_num) + i = 0; + } + + vmp->tx_reclaim_start = i; +} + +#ifdef QTN_TX_SKBQ_SUPPORT +static inline int __vmac_process_tx_skbq(struct net_device *ndev, uint32_t budget) +{ + struct vmac_priv *vmp = netdev_priv(ndev); + struct sk_buff *skb; + + while(!vmp->txqueue_stopped && (skb = __skb_dequeue(&vmp->tx_skb_queue)) != NULL) { + if (vmac_tx((void *)skb, ndev) != NETDEV_TX_OK) { + __skb_queue_head(&vmp->tx_skb_queue, skb); + break; + } + + if (--budget == 0) { + break; + } + } + + if (skb_queue_len(&vmp->tx_skb_queue) && !vmp->txqueue_stopped) { + tasklet_schedule(&vmp->tx_skbq_tasklet); + } + + return NETDEV_TX_OK; +} + +static int vmac_process_tx_skbq(struct net_device *ndev, uint32_t budget) +{ + int ret; + struct vmac_priv *vmp = netdev_priv(ndev); + + spin_lock(&vmp->tx_skbq_lock); + ret = __vmac_process_tx_skbq(ndev, budget); + spin_unlock(&vmp->tx_skbq_lock); + + return ret; +} + +static void __attribute__((section(".sram.text"))) vmac_tx_skbq_tasklet(unsigned long data) +{ + struct net_device *ndev = (struct net_device *)data; + struct vmac_priv *vmp = netdev_priv(ndev); + + vmac_process_tx_skbq(ndev, vmp->tx_skbq_tasklet_budget); +} + +static int vmac_xmit(struct sk_buff *skb, struct net_device *ndev) +{ + struct vmac_priv *vmp = netdev_priv(ndev); + int ret; + unsigned long flag; + + if (unlikely(skb_queue_len(&vmp->tx_skb_queue) >= vmp->tx_skbq_max_size)) { + dev_kfree_skb((void *)skb); + return NETDEV_TX_OK; + } + + qtn_spin_lock_bh_save(&vmp->tx_skbq_lock, &flag); + __skb_queue_tail(&vmp->tx_skb_queue, skb); + ret = __vmac_process_tx_skbq(ndev, vmp->tx_skbq_budget); + qtn_spin_unlock_bh_restore(&vmp->tx_skbq_lock, &flag); + + return ret; +} +#else +static int vmac_xmit(struct sk_buff *skb, struct net_device *ndev) +{ + return vmac_tx((void *)skb, ndev); +} +#endif + +void vmac_tx_drop(void *pkt_handle, struct net_device *ndev) +{ + struct sk_buff *skb; + + { + skb = (struct sk_buff *)pkt_handle; + dev_kfree_skb((void *)skb); + } +} + +#ifdef QTN_WAKEQ_SUPPORT +static inline void vmac_try_stop_queue(struct net_device *ndev) +{ + unsigned long flags; + struct vmac_priv *vmp = netdev_priv(ndev); + + spin_lock_irqsave(&vmp->txqueue_op_lock, flags); + + if (!vmp->txqueue_stopped) { + vmp->txqueue_stopped = 1; + *vmp->txqueue_wake = 0; + barrier(); + writel(TOPAZ_SET_INT(IPC_RC_STOP_TX), vmp->ep_ipc_reg); + vmp->tx_stop_queue_cnt++; + netif_stop_queue(ndev); + } + spin_unlock_irqrestore(&vmp->txqueue_op_lock, flags); +} + +static inline void vmac_try_wake_queue(struct net_device *ndev) +{ + struct vmac_priv *vmp = netdev_priv(ndev); + unsigned long flags; + + spin_lock_irqsave(&vmp->txqueue_op_lock, flags); + if (vmp->txqueue_stopped && *vmp->txqueue_wake) { + + vmp->txqueue_stopped = 0; + + netif_wake_queue(ndev); +#ifdef QTN_TX_SKBQ_SUPPORT + tasklet_schedule(&vmp->tx_skbq_tasklet); +#endif + } + spin_unlock_irqrestore(&vmp->txqueue_op_lock, flags); +} +#endif + +int __attribute__((section(".sram.text"))) +vmac_tx(void *pkt_handle, struct net_device *ndev) +{ + struct vmac_priv *vmp = netdev_priv(ndev); + uint16_t i; /* tbd index */ + volatile struct vmac_bd *tbdp; /* Tx BD pointer */ + int len; + struct sk_buff *skb; + uint32_t baddr; + qdpc_pcie_bda_t *bda = vmp->bda; + + /* TODO: Under current architect, register_netdev() is called + before EP is ready. So an variable ep_ready is added to achieve + defensive programming. We need to change the code segment later */ + if (unlikely(vmp->ep_ready == 0)) { + vmac_tx_drop(pkt_handle, ndev); + return NETDEV_TX_OK; + } + + vmp->vmac_xmit_cnt++; +#ifdef RC_TXDONE_TIMER + spin_lock(&vmp->tx_lock); +#endif + /* Tear down the previous skb transmitted by DMA */ + vmac_tx_teardown(ndev, bda); + + /* Reserve one entry space to differentiate full and empty case */ + if (vmp->vmac_tx_queue_len >= vmp->tx_bd_num - 2) { +#ifdef QTN_WAKEQ_SUPPORT + vmac_try_stop_queue(ndev); +#endif + if (vmp->vmac_tx_queue_len >= vmp->tx_bd_num - 1) { +#ifdef RC_TXDONE_TIMER + spin_unlock(&vmp->tx_lock); +#endif + vmp->tx_bd_busy_cnt++; + printk(KERN_ERR "%s fail to get BD\n", ndev->name); + return NETDEV_TX_BUSY; + } + } + + i = vmp->tx_bd_index; + + skb = (struct sk_buff *)pkt_handle; + vmp->tx_skb[i] = (struct sk_buff *)pkt_handle; +#ifdef QTN_SKB_RECYCLE_SUPPORT + baddr = (uint32_t)pci_map_single(vmp->pdev, skb->data, skb->len, (int)DMA_BIDIRECTIONAL); +#else + baddr = (uint32_t)pci_map_single(vmp->pdev, skb->data, skb->len, (int)DMA_TO_DEVICE); +#endif + len = skb->len; + wmb(); + + BLINK_5G_LED(vmp); + + /* Update local descriptor array */ + tbdp = &vmp->tx_bd_base[i]; + tbdp->buff_addr = baddr; + + /* Update remote Request Queue */ + VMAC_REG_WRITE(&bda->request[i].addr, (baddr)); + VMAC_REG_WRITE(&bda->request[i].info, (len | PCIE_TX_VALID_PKT)); + + vmp->vmac_tx_queue_len++; + +#ifdef CONFIG_ARM + dump_tx_pkt(vmp, (void *)__bus_to_virt(baddr), len); +#else + dump_tx_pkt(vmp, bus_to_virt(baddr), len); +#endif + + if (++i >= vmp->tx_bd_num) + i = 0; + + vmp->tx_bd_index = i; + + dump_tx_bd(vmp); + + writel(TOPAZ_SET_INT(IPC_EP_RX_PKT), vmp->ep_ipc_reg); + +#ifdef RC_TXDONE_TIMER + vmac_tx_teardown(ndev, bda); + mod_timer(&vmp->tx_timer, jiffies + 1); + spin_unlock(&vmp->tx_lock); +#endif + return NETDEV_TX_OK; +} + +static irqreturn_t vmac_interrupt(int irq, void *dev_id) +{ + struct net_device *ndev = (struct net_device *)dev_id; + struct vmac_priv *vmp = netdev_priv(ndev); + +#if 0 + handle_ep_rst_int(ndev); +#endif + if(!vmp->msi_enabled) { + /* Deassert remote INTx message */ + qdpc_deassert_intx(vmp); + } + + vmp->intr_cnt++; + + vmac_napi_schedule(vmp); +#ifdef QTN_WAKEQ_SUPPORT + vmac_try_wake_queue(ndev); +#endif + dump_rx_int(vmp); + + return IRQ_HANDLED; +} + +/* + * The Tx ring has been full longer than the watchdog timeout + * value. The transmitter must be hung? + */ +inline static void vmac_tx_timeout(struct net_device *ndev) +{ + printk(KERN_ERR "%s: vmac_tx_timeout: ndev=%p\n", ndev->name, ndev); + ndev->trans_start = jiffies; +} + +#ifdef RC_TXDONE_TIMER +static void vmac_tx_buff_cleaner(struct net_device *ndev) +{ + struct vmac_priv *vmp = netdev_priv(ndev); + qdpc_pcie_bda_t *bda = vmp->bda; + + spin_lock(&vmp->tx_lock); + vmac_tx_teardown(ndev, bda); + + if (vmp->tx_skb[vmp->tx_reclaim_start] == NULL) { + del_timer(&vmp->tx_timer); + } else { + writel(TOPAZ_SET_INT(IPC_EP_RX_PKT), vmp->ep_ipc_reg); + mod_timer(&vmp->tx_timer, jiffies + 1); + } + spin_unlock(&vmp->tx_lock); +} +#endif + +/* ethtools support */ +static int vmac_get_settings(struct net_device *ndev, struct ethtool_cmd *cmd) +{ + return -EINVAL; +} + +static int vmac_set_settings(struct net_device *ndev, struct ethtool_cmd *cmd) +{ + + if (!capable(CAP_NET_ADMIN)) + return -EPERM; + + return -EINVAL; +} + +static int vmac_ioctl(struct net_device *ndev, struct ifreq *rq, int cmd) +{ + return -EINVAL; +} + +static void vmac_get_drvinfo(struct net_device *ndev, struct ethtool_drvinfo *info) +{ + struct vmac_priv *vmp = netdev_priv(ndev); + + strcpy(info->driver, DRV_NAME); + strcpy(info->version, DRV_VERSION); + info->fw_version[0] = '\0'; + sprintf(info->bus_info, "%s %d", DRV_NAME, vmp->mac_id); + info->regdump_len = 0; +} + +static const struct ethtool_ops vmac_ethtool_ops = { + .get_settings = vmac_get_settings, + .set_settings = vmac_set_settings, + .get_drvinfo = vmac_get_drvinfo, + .get_link = ethtool_op_get_link, +}; + +static const struct net_device_ops vmac_device_ops = { + .ndo_open = vmac_open, + .ndo_stop = vmac_close, + .ndo_start_xmit = vmac_xmit, + .ndo_do_ioctl = vmac_ioctl, + .ndo_tx_timeout = vmac_tx_timeout, + .ndo_set_mac_address = eth_mac_addr, +}; + +struct net_device *vmac_alloc_ndev(void) +{ + struct net_device * ndev; + + /* Allocate device structure */ + ndev = alloc_netdev(sizeof(struct vmac_priv), vmaccfg.ifname, ether_setup); + if(!ndev) + printk(KERN_ERR "%s: alloc_etherdev failed\n", vmaccfg.ifname); + + return ndev; +} +EXPORT_SYMBOL(vmac_alloc_ndev); + +static void eth_parse_enetaddr(const char *addr, uint8_t *enetaddr) +{ + char *end; + int i; + + for (i = 0; i < 6; ++i) { + enetaddr[i] = addr ? simple_strtoul(addr, &end, 16) : 0; + if (addr) + addr = (*end) ? end + 1 : end; + } +} + + +int vmac_net_init(struct pci_dev *pdev) +{ + struct vmac_priv *vmp = NULL; + struct net_device *ndev = NULL; + int err = -ENOMEM; + __iomem qdpc_pcie_bda_t *bda; + + printk(KERN_INFO"%s version %s %s\n", DRV_NAME, DRV_VERSION, DRV_AUTHOR); + + ndev = (struct net_device *)pci_get_drvdata(pdev); + if (!ndev) + goto vnet_init_err_0; + + + if (ethaddr) + eth_parse_enetaddr(ethaddr, ndev->dev_addr); + + if (!is_valid_ether_addr(ndev->dev_addr)) + random_ether_addr(ndev->dev_addr); + + ndev->netdev_ops = &vmac_device_ops; + ndev->tx_queue_len = QTN_GLOBAL_INIT_EMAC_TX_QUEUE_LEN; + SET_ETHTOOL_OPS(ndev, &vmac_ethtool_ops); + + /* Initialize private data */ + vmp = netdev_priv(ndev); + vmp->pdev = pdev; + vmp->ndev = ndev; + + vmp->pcfg = &vmaccfg; + vmp->tx_bd_num = vmp->pcfg->tx_bd_num; + vmp->rx_bd_num = vmp->pcfg->rx_bd_num; + +#ifdef QTN_SKB_RECYCLE_SUPPORT + spin_lock_init(&vmp->rx_skb_freelist_lock); + skb_queue_head_init(&vmp->rx_skb_freelist); + vmp->rx_skb_freelist_fill_level = QTN_RX_SKB_FREELIST_FILL_SIZE; + vmp->skb_recycle_cnt = 0; + vmp->skb_recycle_failures = 0; +#endif + + if (vmp->tx_bd_num > PCIE_RC_TX_QUEUE_LEN) { + printk("Error: The length of TX BD array should be no more than %d\n", + PCIE_RC_TX_QUEUE_LEN); + goto vnet_init_err_0; + } + + vmp->ep_ipc_reg = (unsigned long) + QDPC_BAR_VADDR(vmp->sysctl_bar, TOPAZ_IPC_OFFSET); + ndev->irq = pdev->irq; + + ndev->if_port = QDPC_PLATFORM_IFPORT; + + ndev->watchdog_timeo = VMAC_TX_TIMEOUT; + + bda = vmp->bda; + + qdpc_pcie_posted_write(vmp->tx_bd_num, &bda->bda_rc_tx_bd_num); + qdpc_pcie_posted_write(vmp->rx_bd_num, &bda->bda_rc_rx_bd_num); + + /* Allocate Tx & Rx SKB descriptor array */ + if (alloc_skb_desc_array(ndev)) + goto vnet_init_err_0; + + /* Allocate and initialise Tx & Rx descriptor array */ + if (alloc_bd_tbl(ndev)) + goto vnet_init_err_1; + +#ifdef QTN_SKB_RECYCLE_SUPPORT + __vmac_rx_skb_freelist_refill(vmp); +#endif + + if (alloc_and_init_rxbuffers(ndev)) + goto vnet_init_err_2; + + /* Initialize NAPI */ + netif_napi_add(ndev, &vmp->napi, vmac_rx_poll, 10); + + /* Register device */ + if ((err = register_netdev(ndev)) != 0) { + printk(KERN_ERR "%s: Cannot register net device, error %d\n", DRV_NAME, err); + goto vnet_init_err_3; + } + printk(KERN_INFO"%s: Vmac Ethernet found\n", ndev->name); + +#ifdef QCA_NSS_PLATFORM + vmp->nssctx = nss_create_virt_if(ndev); +#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,31)) +# define set_ctl_name(a, b) /* nothing */ +#else +# define set_ctl_name(a, b) vmp->nss_sysctls[a].ctl_name = b +#endif + + memset(vmp->nss_sysctls, 0, sizeof(vmp->nss_sysctls)); + set_ctl_name(0, CTL_AUTO); + vmp->nss_sysctls[0].procname = "quantenna"; + vmp->nss_sysctls[0].mode = 0555; + vmp->nss_sysctls[0].child = &vmp->nss_sysctls[2]; + /* [1] is NULL terminator */ + set_ctl_name(2, CTL_AUTO); + vmp->nss_sysctls[2].procname = "nss"; + vmp->nss_sysctls[2].mode = 0555; + vmp->nss_sysctls[2].child = &vmp->nss_sysctls[4]; + /* [3] is NULL terminator */ + set_ctl_name(4, CTL_AUTO); + vmp->nss_sysctls[4].procname = "enable"; + vmp->nss_sysctls[4].mode = 0644; + vmp->nss_sysctls[4].proc_handler = proc_dointvec; + vmp->nss_sysctls[4].data = &vmp->nss_enable; + vmp->nss_sysctls[4].maxlen = sizeof(vmp->nss_enable); + +#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,20)) + vmp->nss_sysctl_header = register_sysctl_table(vmp->nss_sysctls); +#else + vmp->nss_sysctl_header = register_sysctl_table(vmp->nss_sysctls, 1); +#endif + + vmp->nss_enable=1; /* NSS enabled by default */ +#endif + +#ifdef DNI_EXTRA_FUNCTIONS +#ifdef DNI_5G_LED +#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,31)) +# define set_dni_ctl_name(a, b) /* nothing */ +#else +# define set_dni_ctl_name(a, b) vmp->dni_sysctls[a].ctl_name = b +#endif + + memset(vmp->dni_sysctls, 0, sizeof(vmp->dni_sysctls)); + set_dni_ctl_name(2, CTL_AUTO); + vmp->dni_sysctls[0].procname = "qtn_dni"; + vmp->dni_sysctls[0].mode = 0555; + vmp->dni_sysctls[0].child = &vmp->dni_sysctls[2]; + /* [1] is NULL terminator */ + set_dni_ctl_name(2, CTL_AUTO); + vmp->dni_sysctls[2].procname = "blink_5g_led"; + vmp->dni_sysctls[2].mode = 0644; + vmp->dni_sysctls[2].proc_handler = proc_dointvec; + vmp->dni_sysctls[2].data = &vmp->led_enable; + vmp->dni_sysctls[2].maxlen = sizeof(vmp->led_enable); + +#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,20)) + vmp->dni_sysctl_header = register_sysctl_table(vmp->dni_sysctls); +#else + vmp->dni_sysctl_header = register_sysctl_table(vmp->dni_sysctls, 1); +#endif + + vmp->led_enable=1; /* led enabled by default */ +#endif +#endif + + /* Add the device attributes */ + err = sysfs_create_group(&ndev->dev.kobj, &vmac_attr_group); + if (err) { + printk(KERN_ERR "Error creating sysfs files\n"); + } + + enable_ep_rst_detection(ndev); + + vmp->show_item = SHOW_VMAC_STATS; + +#ifdef RC_TXDONE_TIMER + spin_lock_init(&vmp->tx_lock); + init_timer(&vmp->tx_timer); + vmp->tx_timer.data = (unsigned long)ndev; + vmp->tx_timer.function = (void (*)(unsigned long))&vmac_tx_buff_cleaner; +#endif + spin_lock_init(&vmp->txqueue_op_lock); + +#ifdef QTN_TX_SKBQ_SUPPORT + vmp->tx_skbq_budget = QTN_RC_TX_BUDGET; + vmp->tx_skbq_max_size = vmp->tx_bd_num << 4; + vmp->tx_skbq_tasklet_budget = QTN_RC_TX_TASKLET_BUDGET; + spin_lock_init(&vmp->tx_skbq_lock); + skb_queue_head_init(&vmp->tx_skb_queue); + tasklet_init(&vmp->tx_skbq_tasklet, vmac_tx_skbq_tasklet, (unsigned long)ndev); +#endif + +#ifdef QTN_SKB_RECYCLE_SUPPORT + __vmac_rx_skb_freelist_refill(vmp); +#endif + + return 0; + +vnet_init_err_3: + free_rx_skbs(vmp); +vnet_init_err_2: +#ifdef QTN_SKB_RECYCLE_SUPPORT + vmac_rx_skb_freelist_purge(vmp); +#endif + free_bd_tbl(vmp); +vnet_init_err_1: + free_skb_desc_array(ndev); +vnet_init_err_0: + return err; +} +EXPORT_SYMBOL(vmac_net_init); + +static void free_rx_skbs(struct vmac_priv *vmp) +{ + /* All Ethernet activity should have ceased before calling + * this function + */ + uint16_t i; + for (i = 0; i < vmp->rx_bd_num; i++) { + if (vmp->rx_skb[i]) { + dev_kfree_skb(vmp->rx_skb[i]); + vmp->rx_skb[i] = 0; + } + } +} + +static void free_tx_skbs(struct vmac_priv *vmp) +{ + /* All Ethernet activity should have ceased before calling + * this function + */ + uint16_t i; + for (i = 0; i < vmp->tx_bd_num; i++) { + if (vmp->tx_skb[i]) { + dev_kfree_skb(vmp->tx_skb[i]); + vmp->tx_skb[i] = 0; + } + } +} + +static void init_tx_bd(struct vmac_priv *vmp) +{ + uint16_t i; + for (i = 0; i< vmp->tx_bd_num; i++) + vmp->tx_bd_base[i].buff_info |= cpu_to_le32(VMAC_BD_EMPTY); +} + +static int alloc_and_init_rxbuffers(struct net_device *ndev) +{ + uint16_t i; + struct vmac_priv *vmp = netdev_priv(ndev); + + memset((void *)vmp->rx_bd_base, 0, vmp->rx_bd_num * VMAC_BD_LEN); + + /* Allocate rx buffers */ + for (i = 0; i < vmp->rx_bd_num; i++) { + if (skb2rbd_attach(ndev, i, 0)) { + return -1; + } + } + + vmp->rx_bd_base[vmp->rx_bd_num - 1].buff_info |= cpu_to_le32(VMAC_BD_WRAP); + return 0; +} + +extern int qdpc_unmap_iomem(struct vmac_priv *priv); +void vmac_clean(struct net_device *ndev) +{ + struct vmac_priv *vmp; + + if (!ndev) + return; + + vmp = netdev_priv(ndev); + +#ifdef QCA_NSS_PLATFORM + if(vmp->nssctx){ + nss_destroy_virt_if(vmp->nssctx); + } + if (vmp->nss_sysctl_header) { + unregister_sysctl_table(vmp->nss_sysctl_header); + vmp->nss_sysctl_header = NULL; + } +#endif + +#ifdef DNI_EXTRA_FUNCTIONS +#ifdef DNI_5G_LED + if (vmp->dni_sysctl_header) { + unregister_sysctl_table(vmp->dni_sysctl_header); + vmp->dni_sysctl_header = NULL; + } +#endif +#endif + device_remove_file(&ndev->dev, &dev_attr_dbg); + + unregister_netdev(ndev); + + free_rx_skbs(vmp); + free_tx_skbs(vmp); + free_skb_desc_array(ndev); +#ifdef QTN_SKB_RECYCLE_SUPPORT + vmac_rx_skb_freelist_purge(vmp); +#endif + + disable_ep_rst_detection(ndev); + + netif_napi_del(&vmp->napi); + + free_bd_tbl(vmp); +} + +static void bring_up_interface(struct net_device *ndev) +{ + /* Interface will be ready to send/receive data, but will need hooking + * up to the interrupts before anything will happen. + */ + struct vmac_priv *vmp = netdev_priv(ndev); + enable_vmac_ints(vmp); +} + +static void shut_down_interface(struct net_device *ndev) +{ + struct vmac_priv *vmp = netdev_priv(ndev); + /* Close down MAC and DMA activity and clear all data. */ + disable_vmac_ints(vmp); +} + + +static int vmac_open(struct net_device *ndev) +{ + int retval = 0; + struct vmac_priv *vmp = netdev_priv(ndev); + + bring_up_interface(ndev); + + napi_enable(&vmp->napi); + + /* Todo: request_irq here */ + retval = request_irq(ndev->irq, &vmac_interrupt, 0, ndev->name, ndev); + if (retval) { + printk(KERN_ERR "%s: unable to get IRQ %d\n", + ndev->name, ndev->irq); + goto err_out; + } + + netif_start_queue(ndev); + + vmac_irq_open_fixup(vmp); + + return 0; +err_out: + napi_disable(&vmp->napi); + return retval; +} + +static int vmac_close(struct net_device *ndev) +{ + struct vmac_priv *const vmp = netdev_priv(ndev); + + napi_disable(&vmp->napi); + + shut_down_interface(ndev); + + netif_stop_queue(ndev); + + free_irq(ndev->irq, ndev); + + return 0; +} + diff --git a/package/firmware/quantenna/src/drivers/pcie2/host/common/topaz_vnet.h b/package/firmware/quantenna/src/drivers/pcie2/host/common/topaz_vnet.h new file mode 100644 index 000000000..dccb2b104 --- /dev/null +++ b/package/firmware/quantenna/src/drivers/pcie2/host/common/topaz_vnet.h @@ -0,0 +1,242 @@ +/** + * Copyright (c) 2012-2012 Quantenna Communications, Inc. + * All rights reserved. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + **/ + +#ifndef __DRIVERS_NET_TOPAZ_VNET_H +#define __DRIVERS_NET_TOPAZ_VNET_H 1 + +#define ETH_TX_TIMEOUT (100*HZ) +#define MULTICAST_FILTER_LIMIT 64 + +#include +#include +#include + +#include +#include + +#define PROC_NAME_SIZE (32) +#define VMAC_BD_EMPTY ((uint32_t)0x00000001) +#define VMAC_BD_WRAP ((uint32_t)0x00000002) +#define VMAC_BD_MASK_LEN ((uint32_t)0xFFFF0000) +#define VMAC_BD_MASK_OFFSET ((uint32_t)0x0000FF00) + +#define VMAC_GET_LEN(x) (((x) >> 16) & 0xFFFF) +#define VMAC_GET_OFFSET(x) (((x) >> 8) & 0xFF) +#define VMAC_SET_LEN(len) (((len) & 0xFFFF) << 16) +#define VMAC_SET_OFFSET(of) (((of) & 0xFF) << 8) + +#define VMAC_INDX_MINUS(x, y, m) (((x) + (m) - (y)) % (m)) +#define VMAC_INDX_INC(index, m) do { \ + if (++(index) >= (m)) \ + (index) = 0; \ + } while(0) + +/* + * Helper macros handling memory mapped area access + */ +#define VMAC_REG_TST(reg, val) ( *((volatile unsigned int *)(reg)) & (val) ) +#define VMAC_REG_SET(reg, val) { volatile unsigned int *r = (unsigned int *)(reg); *r = (*r | (val)); } +#define VMAC_REG_CLR(reg, val) { volatile unsigned int *r = (unsigned int *)(reg); *r = (*r & ~(val)); } +#define VMAC_REG_WRITE(reg, val) { *(volatile unsigned int *)reg = (val); } +#define VMAC_REG_READ(reg) {*(volatile unsigned int *)(reg); } + +#define QTN_RC_TX_BUDGET (16) +#define QTN_RC_TX_TASKLET_BUDGET (32) + +#define QTN_RX_SKB_FREELIST_FILL_SIZE (1024) +#define QTN_RX_SKB_FREELIST_MAX_SIZE (8192) +#define QTN_RX_BUF_MIN_SIZE (1536) + +#define VMAC_NL_BUF_SIZE USHRT_MAX + +typedef struct qdpc_bar { + void *b_vaddr; /* PCIe bar virtual address */ + dma_addr_t b_busaddr; /* PCIe bar physical address */ + size_t b_len; /* Bar resource length */ + uint32_t b_offset; /* Offset from start of map */ + uint8_t b_index; /* Bar Index */ +} qdpc_bar_t; + +#define QDPC_BAR_VADDR(bar, off) ((bar).b_vaddr +(off)) + +struct vmac_cfg { + uint16_t rx_bd_num; + uint16_t tx_bd_num; + char ifname[PROC_NAME_SIZE]; + struct net_device *dev; +}; + +#if defined(QTN_RC_ENABLE_HDP) +enum pkt_type { + PKT_SKB = 0, + PKT_TQE +}; +#endif + +struct vmac_tx_buf { + uint32_t handle; + uint16_t len; +#if defined(QTN_RC_ENABLE_HDP) + uint8_t type; /* 1 payload only, 0 skb */ + uint8_t rsv; +#else + uint16_t rsv; +#endif +}; + +struct vmac_priv { + struct sk_buff **tx_skb;/* skb having post to PCIe DMA */ + volatile struct vmac_bd *tx_bd_base; /* Tx buffer descriptor */ + volatile uint32_t *ep_next_rx_pkt; + uint16_t tx_bd_index; + uint16_t tx_reclaim_start; + uint16_t tx_bd_num; + uint8_t txqueue_stopped; + volatile uint32_t *txqueue_wake; /* shared variable with EP */ + spinlock_t txqueue_op_lock; + unsigned long ep_ipc_reg; + uint32_t tx_bd_busy_cnt; /* tx BD unavailable */ + uint32_t tx_stop_queue_cnt; +#ifdef RC_TXDONE_TIMER + struct timer_list tx_timer; + spinlock_t tx_lock; +#endif + uint32_t vmac_tx_queue_len; + + struct sk_buff **rx_skb; + volatile struct vmac_bd *rx_bd_base; /* Rx buffer descriptor */ + uint16_t rx_bd_index; + uint16_t rx_bd_num; + + uint32_t rx_skb_alloc_failures; + uint32_t intr_cnt; /* msi/legacy interrupt counter */ + uint32_t vmac_xmit_cnt; + uint32_t vmac_skb_free; + + struct sock *nl_socket; + uint32_t str_call_nl_pid; + uint32_t lib_call_nl_pid; + struct napi_struct napi; + + uint32_t dbg_flg; + + struct net_device *ndev; + struct pci_dev *pdev; + + int mac_id; + + uint32_t dma_msi_imwr; + uint32_t dma_msi_data; + uint32_t dma_msi_dummy; + uint32_t ep_pciecfg0_val; /* used to deassert Legacy irq from RC */ + + /* The following members aren't related to datapath */ + struct vmac_cfg *pcfg; + uint8_t show_item; + + uint32_t addr_uncache; + uint32_t uncache_len; + + struct task_struct *init_thread; /* Initialization thread */ + uint8_t msi_enabled; /* PCIe MSI: 1 - Enabled, 0 - Disabled */ + + qdpc_bar_t sysctl_bar; + qdpc_bar_t epmem_bar; + qdpc_bar_t dmareg_bar; + + uint32_t dma_imwr; + + /* io memory pointers */ + __iomem qdpc_pcie_bda_t *bda; + uint32_t ep_ready; + +#ifdef QCA_NSS_PLATFORM + void *nssctx; /* QCA NSS platform specific handler*/ + uint32_t nss_enable; + struct ctl_table nss_sysctls[14]; /* Some system control for control and statistic */ + struct ctl_table_header *nss_sysctl_header; +#endif +#ifdef DNI_EXTRA_FUNCTIONS +#ifdef DNI_5G_LED + uint32_t led_enable; + struct ctl_table dni_sysctls[14]; + struct ctl_table_header *dni_sysctl_header; +#endif +#endif + +#ifdef QTN_TX_SKBQ_SUPPORT + struct sk_buff_head tx_skb_queue; + spinlock_t tx_skbq_lock; + struct tasklet_struct tx_skbq_tasklet; + uint32_t tx_skbq_budget; + uint32_t tx_skbq_tasklet_budget; + uint32_t tx_skbq_max_size; +#endif + +#ifdef QTN_SKB_RECYCLE_SUPPORT + struct sk_buff_head rx_skb_freelist; + spinlock_t rx_skb_freelist_lock; + uint32_t rx_skb_freelist_fill_level; + uint32_t skb_recycle_cnt; + uint32_t skb_recycle_failures; +#endif + + volatile uint32_t *ep_pmstate; + uint8_t *nl_buf; + size_t nl_len; +}; + +#define QTN_DISABLE_SOFTIRQ (0xABCD) + +static inline void qtn_spin_lock_bh_save(spinlock_t *lock, unsigned long *flag) +{ + if (likely(irqs_disabled() || in_softirq())) { + spin_lock(lock); + *flag = 0; + } else { + spin_lock_bh(lock); + *flag = QTN_DISABLE_SOFTIRQ; + } +} + +static inline void qtn_spin_unlock_bh_restore(spinlock_t *lock, unsigned long *flag) +{ + if (unlikely(*flag == QTN_DISABLE_SOFTIRQ)) { + *flag = 0; + spin_unlock_bh(lock); + } else { + spin_unlock(lock); + } +} + +extern struct net_device *vmac_alloc_ndev(void); +extern int vmac_net_init(struct pci_dev *pdev); +extern void vmac_clean(struct net_device *ndev); +extern int vmac_tx(void *pkt_handle, struct net_device *ndev); + +#define PCIE_REG_CFG_BASE 0x0 +#define PCIE_LOGIC_PORT_CFG_BASE (PCIE_REG_CFG_BASE + 0x700) +#define PCIE_DMA_WR_INTR_MASK 0x2c4 + +void vmac_pcie_edma_enable(struct vmac_priv *priv); +void qdpc_deassert_intx(struct vmac_priv *priv); +void qdpc_pcie_edma_enable(struct vmac_priv *priv); +int qdpc_pcie_suspend(struct pci_dev *pdev, pm_message_t state); +int qdpc_pcie_resume(struct pci_dev *pdev); +#endif diff --git a/package/firmware/quantenna/src/drivers/pcie2/host/intel/Makefile b/package/firmware/quantenna/src/drivers/pcie2/host/intel/Makefile new file mode 100644 index 000000000..22be6ff84 --- /dev/null +++ b/package/firmware/quantenna/src/drivers/pcie2/host/intel/Makefile @@ -0,0 +1,33 @@ +# +# Makefile for Intel platform +# + +EXTRA_CFLAGS += -Wall \ + -I$(src) \ + -I$(src)/../../include \ + -I$(src)/../common + +EXTRA_CFLAGS += -DRC_TXDONE_TIMER -DQTN_WAKEQ_SUPPORT +ifneq ($(CONFIG_HOTPLUG_PCI_PCIE),) +EXTRA_CFLAGS += -DPCIE_HOTPLUG_SUPPORTED +endif + +KVERSION = $(shell uname -r) + +default: all + +COMMON_DIR := ../common +qdpc-host-objs := $(COMMON_DIR)/qdpc_init.o $(COMMON_DIR)/qdpc_pcie.o $(COMMON_DIR)/topaz_vnet.o qdpc_platform.o +obj-m := qdpc-host.o + +qdpc_host.o: $(qdpc-host-objs) + ld -r $^ -o $@ + +all: + make -C /lib/modules/$(KVERSION)/build M=$(PWD) modules + +clean: + make -C /lib/modules/$(KVERSION)/build M=$(PWD) clean + rm -rf $(COMMON_DIR)/.*.cmd $(COMMON_DIR)/.tmp_versions + rm -rf Module.markers modules.order *~ $(qdpc-host-objs) + diff --git a/package/firmware/quantenna/src/drivers/pcie2/host/intel/qdpc_platform.c b/package/firmware/quantenna/src/drivers/pcie2/host/intel/qdpc_platform.c new file mode 100644 index 000000000..1dde009b3 --- /dev/null +++ b/package/firmware/quantenna/src/drivers/pcie2/host/intel/qdpc_platform.c @@ -0,0 +1,102 @@ +/** + * Copyright (c) 2012-2012 Quantenna Communications, Inc. + * All rights reserved. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + **/ + +/* + * Platform dependant implement. Customer needs to modify this file. + */ +#include +#include +#include +#include +#include + +/* + * Enable MSI interrupt of PCIe. + */ +void enable_vmac_ints(struct vmac_priv *vmp) +{ + enable_irq(vmp->pdev->irq); +} + +/* + * Disable MSI interrupt of PCIe. + */ +void disable_vmac_ints(struct vmac_priv *vmp) +{ + disable_irq_nosync(vmp->pdev->irq); +} + + +/* + * Enable interrupt for detecting EP reset. + */ +void enable_ep_rst_detection(struct net_device *ndev) +{ +} + +/* + * Disable interrupt for detecting EP reset. + */ +void disable_ep_rst_detection(struct net_device *ndev) +{ +} + +/* + * Interrupt context for detecting EP reset. + * This function should do: + * 1. check interrupt status to see if EP reset. + * 2. if EP reset, handle it. + */ +void handle_ep_rst_int(struct net_device *ndev) +{ +} + +/* + * PCIe driver update resource in PCI configure space after EP reset. + * This function should be called in such case: + * 1. The PCI configure space can be accessed after EP reset; + * 2. Kernel does not support PCIe hot-plug. + */ +void qdpc_update_hw_bar(struct pci_dev *pdev, uint8_t index) +{ + struct pci_bus_region region; + uint32_t addr, new; + int offset = PCI_BASE_ADDRESS_0 + 4 * index; + struct resource *res = pdev->resource + index; + + if (!res->flags) + return; + + pcibios_resource_to_bus(pdev, ®ion, res); + new = region.start | (res->flags & PCI_REGION_FLAG_MASK); + pci_read_config_dword(pdev, offset, &addr); + + if (addr != new) { + printk("PCI region %d: reset to PCI address %#llx", index, (unsigned long long)region.start); + pci_write_config_dword(pdev, offset, new); + if ((new & (PCI_BASE_ADDRESS_SPACE|PCI_BASE_ADDRESS_MEM_TYPE_MASK)) == + (PCI_BASE_ADDRESS_SPACE_MEMORY|PCI_BASE_ADDRESS_MEM_TYPE_64)) { + printk(" (64bit address)"); + new = region.start >> 16 >> 16; + pci_write_config_dword(pdev, offset + 4, new); + } + printk("\n"); + } +} + diff --git a/package/firmware/quantenna/src/drivers/pcie2/host/intel/qdpc_platform.h b/package/firmware/quantenna/src/drivers/pcie2/host/intel/qdpc_platform.h new file mode 100644 index 000000000..4176b40b2 --- /dev/null +++ b/package/firmware/quantenna/src/drivers/pcie2/host/intel/qdpc_platform.h @@ -0,0 +1,91 @@ +/** + * Copyright (c) 2012-2012 Quantenna Communications, Inc. + * All rights reserved. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + **/ + +#ifndef __QDPC_PFDEP_H__ +#define __QDPC_PFDEP_H__ + +#include + +#include + +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,27) +#define IOREMAP ioremap_wc +#else /* LINUX_VERSION_CODE < KERNEL_VERSION(2,6,27) */ +#define IOREMAP ioremap +#endif + +/* IO functions */ +#ifndef readb +#define readb(addr) (*(volatile unsigned char *) (addr)) +#endif + +#ifndef readw +#define readw(addr) (*(volatile unsigned short *) (addr)) +#endif + +#ifndef readl +#define readl(addr) (*(volatile unsigned int *) (addr)) +#endif + +#ifndef writeb +#define writeb(b,addr) (*(volatile unsigned char *) (addr) = (b)) +#endif + +#ifndef writew +#define writew(b,addr) (*(volatile unsigned short *) (addr) = (b)) +#endif + +#ifndef writel +#define writel(b,addr) (*(volatile unsigned int *) (addr) = (b)) +#endif + +/* Bit number and mask of MSI in the interrupt mask and status register */ +#define QDPC_INTR_MSI_BIT 0 +#define QDPC_INTR_MSI_MASK (1 << QDPC_INTR_MSI_BIT) + +/* Enable MSI interrupt of PCIe */ +extern void enable_vmac_ints(struct vmac_priv *vmp); +/* Disable MSI interrupt of PCIe */ +extern void disable_vmac_ints(struct vmac_priv *vmp); + +/* Enable interrupt for detecting EP reset */ +extern void enable_ep_rst_detection(struct net_device *ndev); +/* Disable interrupt for detecting EP reset */ +extern void disable_ep_rst_detection(struct net_device *ndev); +/* Interrupt context for detecting EP reset */ +extern void handle_ep_rst_int(struct net_device *ndev); + +/* PCIe driver update resource in PCI configure space after EP reset */ +extern void qdpc_update_hw_bar(struct pci_dev *pdev, uint8_t index); + +/* Allocated buffer size for a packet */ +#define SKB_BUF_SIZE 2048 + +/* Transmit Queue Length */ +#define QDPC_TX_QUEUE_SIZE 180 + +/* Receive Queue Length */ +#define QDPC_RX_QUEUE_SIZE 384 + +/* Customer defined function */ +#define qdpc_platform_init() 0 +#define qdpc_platform_exit() do { } while(0) + +#endif /* __QDPC_PFDEP_H__ */ + diff --git a/package/firmware/quantenna/src/drivers/pcie2/host/mipsr2/Makefile b/package/firmware/quantenna/src/drivers/pcie2/host/mipsr2/Makefile new file mode 100644 index 000000000..b6aa1f82d --- /dev/null +++ b/package/firmware/quantenna/src/drivers/pcie2/host/mipsr2/Makefile @@ -0,0 +1,30 @@ +# +# Makefile for mipsr2 platform +# + +EXTRA_CFLAGS += -Wall \ + -I$(src) \ + -I$(src)/../../include \ + -I$(src)/../common \ + -D__BIG_ENDIAN + +EXTRA_CFLAGS += -DQTN_TX_SKBQ_SUPPORT -DQTN_WAKEQ_SUPPORT +PWD := $(shell pwd) + +default: all + +COMMON_DIR := ../common +qdpc-host-objs := $(COMMON_DIR)/qdpc_init.o $(COMMON_DIR)/qdpc_pcie.o $(COMMON_DIR)/topaz_vnet.o qdpc_platform.o +obj-m := qdpc-host.o + +qdpc_host.o: $(qdpc-host-objs) + ld -r $^ -o $@ + +all: + make -C $(KERNELDIR) $(CROSS) M=$(PWD) modules + + +clean: + rm -rf $(COMMON_DIR)/.*.cmd $(COMMON_DIR)/.tmp_versions + rm -rf Module.markers Module.symvers modules.order *~ $(qdpc-host-objs) *.o *.ko *.mod.o *.mod.c + diff --git a/package/firmware/quantenna/src/drivers/pcie2/host/mipsr2/qdpc_platform.c b/package/firmware/quantenna/src/drivers/pcie2/host/mipsr2/qdpc_platform.c new file mode 100644 index 000000000..2d791fefb --- /dev/null +++ b/package/firmware/quantenna/src/drivers/pcie2/host/mipsr2/qdpc_platform.c @@ -0,0 +1,74 @@ +/** + * Copyright (c) 2012-2012 Quantenna Communications, Inc. + * All rights reserved. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + **/ + +/* + * Platform dependant implement. Customer needs to modify this file. + */ + +#include + +#include +#include +#include +#include +#include + +/* + * Enable MSI interrupt of PCIe. + */ +void enable_vmac_ints(struct vmac_priv *vmp) +{ + volatile uint32_t *dma_wrd_imwr = QDPC_BAR_VADDR(vmp->dmareg_bar, TOPAZ_IMWR_DONE_ADDRLO_OFFSET); + + writel(vmp->dma_msi_imwr, dma_wrd_imwr); +} + +/* + * Disable MSI interrupt of PCIe. + */ +void disable_vmac_ints(struct vmac_priv *vmp) +{ + volatile uint32_t *dma_wrd_imwr = QDPC_BAR_VADDR(vmp->dmareg_bar, TOPAZ_IMWR_DONE_ADDRLO_OFFSET); + writel(vmp->dma_msi_dummy, dma_wrd_imwr); +} + + +/* + * Enable interrupt for detecting EP reset. + */ +void enable_ep_rst_detection(struct net_device *ndev) +{ +} + +/* + * Disable interrupt for detecting EP reset. + */ +void disable_ep_rst_detection(struct net_device *ndev) +{ +} + +/* + * Interrupt context for detecting EP reset. + * This function should do: + * 1. check interrupt status to see if EP reset. + * 2. if EP reset, handle it. + */ +void handle_ep_rst_int(struct net_device *ndev) +{ +} diff --git a/package/firmware/quantenna/src/drivers/pcie2/host/mipsr2/qdpc_platform.h b/package/firmware/quantenna/src/drivers/pcie2/host/mipsr2/qdpc_platform.h new file mode 100644 index 000000000..b3f678b3b --- /dev/null +++ b/package/firmware/quantenna/src/drivers/pcie2/host/mipsr2/qdpc_platform.h @@ -0,0 +1,101 @@ +/** + * Copyright (c) 2012-2012 Quantenna Communications, Inc. + * All rights reserved. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + **/ + +/* + * Platform dependant implement. Customer needs to modify this file. + */ +#ifndef __QDPC_PFDEP_H__ +#define __QDPC_PFDEP_H__ + +#include + +#include + +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,27) +#define IOREMAP ioremap_wc +#else /* LINUX_VERSION_CODE < KERNEL_VERSION(2,6,27) */ +#define IOREMAP ioremap +#endif + +/* IO functions */ +#ifndef readb +#define readb(addr) (*(volatile unsigned char *) (addr)) +#endif + +#ifndef readw +#define readw(addr) (*(volatile unsigned short *) (addr)) +#endif + +#ifndef readl +#define readl(addr) (*(volatile unsigned int *) (addr)) +#endif + +#ifndef writeb +#define writeb(b,addr) (*(volatile unsigned char *) (addr) = (b)) +#endif + +#ifndef writew +#define writew(b,addr) (*(volatile unsigned short *) (addr) = (b)) +#endif + +#ifndef writel +#define writel(b,addr) (*(volatile unsigned int *) (addr) = (b)) +#endif + +#ifndef virt_to_bus +#define virt_to_bus virt_to_phys +#endif + +/* Bit number and mask of MSI in the interrupt mask and status register */ +#define QDPC_INTR_MSI_BIT 0 +#define QDPC_INTR_MSI_MASK (1 << QDPC_INTR_MSI_BIT) + +/* Enable MSI interrupt of PCIe */ +extern void enable_vmac_ints(struct vmac_priv *vmp); +/* Disable MSI interrupt of PCIe */ +extern void disable_vmac_ints(struct vmac_priv *vmp); + +/* Enable interrupt for detecting EP reset */ +extern void enable_ep_rst_detection(struct net_device *ndev); +/* Disable interrupt for detecting EP reset */ +extern void disable_ep_rst_detection(struct net_device *ndev); +/* Interrupt context for detecting EP reset */ +extern void handle_ep_rst_int(struct net_device *ndev); + +/* Allocated buffer size for a packet */ +#define SKB_BUF_SIZE 2048 + +/* Transmit Queue Length */ +#define QDPC_TX_QUEUE_SIZE 180 + +/* Receive Queue Length */ +#define QDPC_RX_QUEUE_SIZE 384 + +/* Customer defined function */ +#define qdpc_platform_init() 0 +#define qdpc_platform_exit() do { } while(0) + +/* PCIe driver update resource in PCI configure space after EP reset */ +#define qdpc_update_hw_bar(pdev, index) do { } while(0) + +/* TODO: If MSI IRQ-loss issue can be fixed, remove macro below */ +/*#define QDPC_PLATFORM_IRQ_FIXUP*/ + +#endif /* __QDPC_PFDEP_H__ */ + diff --git a/package/firmware/quantenna/src/drivers/pcie2/host/quantenna/Makefile b/package/firmware/quantenna/src/drivers/pcie2/host/quantenna/Makefile new file mode 100644 index 000000000..e39e8ded3 --- /dev/null +++ b/package/firmware/quantenna/src/drivers/pcie2/host/quantenna/Makefile @@ -0,0 +1,67 @@ +# +# Makefile for Quantenna RC paltform +# +# + +EXTRA_CFLAGS += -Wall -Werror -Wno-unknown-pragmas \ + -I$(src) \ + -I$(src)/../../include \ + -I../drivers/include/shared \ + -I../drivers/include/kernel \ + -I$(src)/../common + +EXTRA_CFLAGS += -mlong-calls -DQTN_WAKEQ_SUPPORT + +ifeq ($(board_config),topaz_host_realign_config) +EXTRA_CFLAGS += -DQTN_BYTEALIGN +endif + + ifneq ($(CONFIG_HOTPLUG_PCI_PCIE),) + EXTRA_CFLAGS += -DPCIE_HOTPLUG_SUPPORTED + endif + +ifeq (${PCIE_HOST_CRUMBS},1) +EXTRA_CFLAGS += -finstrument-functions +endif + +#EXTRA_CFLAGS += -DDEBUG + +ifneq ($(KERNELRELEASE),) +COMMON_DIR := ../common +TQE_DIR_TO_WORK := ../../tqe +TQE_DIR_TO_LINUX:= ../drivers/pcie2/tqe +EXTRA_CFLAGS += -I. +qdpc-host-objs := $(COMMON_DIR)/topaz_vnet.o $(COMMON_DIR)/qdpc_init.o \ + $(COMMON_DIR)/qdpc_pcie.o qdpc_platform.o + +qdpc-host-objs += $(if $(wildcard $(TQE_DIR_TO_LINUX)), $(TQE_DIR_TO_WORK)/topaz_pcie_tqe.o) +qdpc-host-objs += qdpc_dspload.o + +obj-m := qdpc-host.o + +else + +KERNELDIR ?= ../../../../linux +INSTALL = INSTALL_MOD_PATH=../linux/modules +CROSS = ARCH=arc CROSS_COMPILE=/usr/local/ARC/gcc/bin/arc-linux-uclibc- +PWD := $(shell pwd) + +default: + $(MAKE) -C $(KERNELDIR) $(CROSS) M=$(PWD) modules + +install: + $(MAKE) -C $(KERNELDIR) $(CROSS) $(INSTALL) M=$(PWD) modules_install + +endif + +clean: + rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions Module.symvers modules.order + rm -rf $(COMMON_DIR)/.*.cmd $(COMMON_DIR)/.tmp_versions $(COMMON_DIR)/*.o + +depend .depend dep: + $(CC) $(CFLAGS) -M *.c > .depend + +ifeq (.depend,$(wildcard .depend)) +include .depend +endif + diff --git a/package/firmware/quantenna/src/drivers/pcie2/host/quantenna/qdpc_dspload.c b/package/firmware/quantenna/src/drivers/pcie2/host/quantenna/qdpc_dspload.c new file mode 100644 index 000000000..7c089101e --- /dev/null +++ b/package/firmware/quantenna/src/drivers/pcie2/host/quantenna/qdpc_dspload.c @@ -0,0 +1,169 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "qdpc_dspload.h" + +static inline unsigned long +qdpc_dsp_to_host_addr(unsigned long dsp_addr) +{ + void *ret = bus_to_virt(dsp_addr); + if (RUBY_BAD_VIRT_ADDR == ret) { + panic("Converting out of range DSP address 0x%lx to host address\n", dsp_addr); + } + return virt_to_phys(ret); +} + +static char* qdpc_dsp_read(struct file *file, int buflen) +{ + char *p = NULL; + + if (!file) + return NULL; + + p = kmalloc(buflen*sizeof(unsigned char), GFP_ATOMIC); + if (p) + file->f_op->read(file, p, buflen, &file->f_pos); + + return p; +} + +static int qdpc_dsp_install_firmware(struct file *file, u32 *dsp_start_addr) +{ + Elf32_Ehdr *ehdr; + Elf32_Phdr *phdr, *phdr_o; + u8* vaddr; + int i, buflen; + char *pdata = NULL; + int e_phnum = 0; + + buflen = sizeof(Elf32_Ehdr); + pdata = qdpc_dsp_read(file, buflen); + if (!pdata) { + return -1; + } + ehdr = (Elf32_Ehdr *)pdata; + e_phnum = ehdr->e_phnum; + kfree(pdata); + + buflen = e_phnum * sizeof(Elf32_Phdr); + pdata = qdpc_dsp_read(file, buflen); + if (!pdata) { + return -1; + } + phdr = (Elf32_Phdr *)pdata; + phdr_o = (Elf32_Phdr *)pdata; + + for(i = 0; i < e_phnum; i++, phdr++) + { + pdata = qdpc_dsp_read(file, phdr->p_filesz); + if (!pdata) { + return -1; + } + + /* Skip blocks for DSP X/Y memory */ + if ((phdr->p_vaddr >= RUBY_DSP_XYMEM_BEGIN) && (phdr->p_vaddr <= RUBY_DSP_XYMEM_END)) { + if (pdata) + kfree(pdata); + continue; + } + unsigned long p_muc = qdpc_dsp_to_host_addr(phdr->p_vaddr); + printk("p_vaddr in ELF header is %p, " + "remapping to 0x%lx\n", (void *)phdr->p_vaddr, p_muc); + /* Copy segment to right location */ + vaddr = ioremap_nocache(p_muc, phdr->p_memsz); + + /* Copy data */ + memcpy(vaddr, pdata, phdr->p_filesz); + /* Clear BSS */ + memset(vaddr + phdr->p_filesz, 0, phdr->p_memsz - phdr->p_filesz); + + iounmap(vaddr); + if (pdata) + kfree(pdata); + } + + if (phdr_o) + kfree(phdr_o); + + *dsp_start_addr = ehdr->e_entry; + + return(0); +} + +static void hal_dsp_start(u32 dsp_start_addr) +{ +#ifdef CONFIG_ARCH_ARC + /* Check that we can start this address */ + if (dsp_start_addr & ((1 << RUBY_SYS_CTL_DSP_REMAP_SHIFT) - 1)) { + panic("DSP address 0x%x cannot be used as entry point\n", (unsigned)dsp_start_addr); + } + /* Tells DSP from which address start execution */ + writel(RUBY_SYS_CTL_DSP_REMAP_VAL(dsp_start_addr), RUBY_SYS_CTL_DSP_REMAP); +#else + /* Swap upper and lower half words for DSP instruction */ + dsp_start_addr = ((dsp_start_addr >> 16) & 0xFFFF) | (dsp_start_addr << 16); + + /* Push the jump instr and location into the mbx */ + *(volatile u32*)IO_ADDRESS(UMS_REGS_MB + UMS_MBX_DSP_PUSH) + = DSP_JUMP_INSTR_SWAP; + *(volatile u32*)IO_ADDRESS(UMS_REGS_MB + UMS_MBX_DSP_PUSH) + = dsp_start_addr; +#endif +} + +void hal_enable_dsp(void) +{ +#ifdef CONFIG_ARCH_ARC + const unsigned long reset = RUBY_SYS_CTL_RESET_DSP_ALL; + + qtn_txbf_lhost_init(); + + writel(reset, RUBY_SYS_CTL_CPU_VEC_MASK); + writel(reset, RUBY_SYS_CTL_CPU_VEC); + writel(0, RUBY_SYS_CTL_CPU_VEC_MASK); +#else + /* Bring the DSP out of reset */ + *(volatile u32 *)IO_ADDRESS(SYS_RESET_VECTOR_MASK) = DSP_RESET; + *(volatile u32 *)IO_ADDRESS(SYS_RESET_VECTOR) = DSP_RESET; +#endif +} + +int qdpc_dsp_open(void) +{ + struct file *file = NULL; + mm_segment_t fs; + u32 dsp_start_addr = 0; + + file = filp_open(QDCP_DSP_FILE_NAME, O_RDONLY, 0); + if(IS_ERR(file)) { + printk("error occured while opening file %s, exiting...\n", QDCP_DSP_FILE_NAME); + return -1; + } + + fs = get_fs(); + set_fs(KERNEL_DS); + qdpc_dsp_install_firmware(file, &dsp_start_addr); + + hal_dsp_start(dsp_start_addr); + hal_enable_dsp(); + + filp_close(file, NULL); + set_fs(fs); + + return 0; +} diff --git a/package/firmware/quantenna/src/drivers/pcie2/host/quantenna/qdpc_dspload.h b/package/firmware/quantenna/src/drivers/pcie2/host/quantenna/qdpc_dspload.h new file mode 100644 index 000000000..883fb8cb3 --- /dev/null +++ b/package/firmware/quantenna/src/drivers/pcie2/host/quantenna/qdpc_dspload.h @@ -0,0 +1,62 @@ +/** + * Copyright (c) 2012-2012 Quantenna Communications, Inc. + * All rights reserved. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + **/ + +#ifndef __QDPC_DSP_H__ +#define __QDPC_DSP_H__ + +#include + +#include + +#include + +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,27) +#define IOREMAP ioremap_nocache +#else /* LINUX_VERSION_CODE < KERNEL_VERSION(2,6,27) */ +#define IOREMAP ioremap +#endif + +#define QTN_TXBF_MUC_TO_DSP_MBOX_INT (0) +#define QTN_TXBF_DSP_TO_HOST_MBOX_INT (0) + +#define QDCP_DSP_FILE_NAME "/etc/firmware/rdsp_driver.0.bin" + +RUBY_INLINE void +qtn_txbf_lhost_init(void) +{ +#if CONFIG_USE_SPI1_FOR_IPC + /* Initialize SPI controller, keep IRQ disabled */ + qtn_mproc_sync_mem_write(RUBY_SPI1_SPCR, + RUBY_SPI1_SPCR_SPE | RUBY_SPI1_SPCR_MSTR | + RUBY_SPI1_SPCR_SPR(0)); + qtn_mproc_sync_mem_write(RUBY_SPI1_SPER, + RUBY_SPI1_SPER_ESPR(0)); +#else + /* Ack, and keep IRQ disabled */ + qtn_mproc_sync_mem_write(RUBY_SYS_CTL_D2L_INT, + qtn_mproc_sync_mem_read(RUBY_SYS_CTL_D2L_INT)); + qtn_mproc_sync_mem_write(RUBY_SYS_CTL_D2L_INT_MASK, + ~(1 << QTN_TXBF_DSP_TO_HOST_MBOX_INT)); +#endif +} + +extern int qdpc_dsp_open(void); + +#endif /* __QDPC_PFDEP_H__ */ + diff --git a/package/firmware/quantenna/src/drivers/pcie2/host/quantenna/qdpc_platform.c b/package/firmware/quantenna/src/drivers/pcie2/host/quantenna/qdpc_platform.c new file mode 100644 index 000000000..25aff26b9 --- /dev/null +++ b/package/firmware/quantenna/src/drivers/pcie2/host/quantenna/qdpc_platform.c @@ -0,0 +1,360 @@ +/** + * Copyright (c) 2012-2013 Quantenna Communications, Inc. + * All rights reserved. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + **/ + +/* + * Platform dependant implement. Customer needs to modify this file. + */ +#include +#include +#include +#include +#include +#include +#include +#include <../drivers/pcie2/host/common/qdpc_regs.h> + +/* WPS button event reported to user space process */ +typedef enum { + MODE_LED_INIT = 0, + MODE_LED_EXIT, + MODE_LED_FLASH, +} MODE_LED_OPS; +#define MODE_LED_GPIO 6 + +typedef enum { + WPS_BUTTON_NONE_EVENT = 0, + WPS_BUTTON_WIRELESS_EVENT, + WPS_BUTTON_DBGDUMP_EVENT, + WPS_BUTTON_INVALIDE_EVENT +} WPS_Button_Event; +#define WPS_BUTTON_VALID(e) (WPS_BUTTON_NONE_EVENT < (e) && (e) < WPS_BUTTON_INVALIDE_EVENT) + +#define WPS_BUTTON_GPIO 4 +#define QDPC_WPS_BUTTON_ACTIVE_LEVEL 0 +#define WPS_BUTTON_TIMER_INTERVAL ((3 * HZ) / 10) /* timer interval */ + +/* +* Queue of processes who access wps_button file +*/ +DECLARE_WAIT_QUEUE_HEAD(WPS_Button_WaitQ); + +static WPS_Button_Event wps_button_event = WPS_BUTTON_NONE_EVENT; +struct timer_list qdpc_wps_button_timer; +static u32 qdpc_wps_button_last_level = ~QDPC_WPS_BUTTON_ACTIVE_LEVEL; +static u32 qdpc_wps_button_down_jiffies = 0; /* records the jiffies when button down, back to 0 after button released */ + +static int vmac_rst_rc_en = 1; +struct work_struct detect_ep_rst_work; + +void enable_vmac_ints(struct vmac_priv *vmp) +{ + uint32_t temp = readl(QDPC_RC_SYS_CTL_PCIE_INT_MASK); + + if(vmp->msi_enabled) { + temp |= BIT(10); /* MSI */ + } else { + temp |= BIT(11); /* Legacy INTx */ + } + writel(temp, QDPC_RC_SYS_CTL_PCIE_INT_MASK); +} + +void disable_vmac_ints(struct vmac_priv *vmp) +{ + uint32_t temp = readl(QDPC_RC_SYS_CTL_PCIE_INT_MASK); + + if(vmp->msi_enabled) { + temp &= ~BIT(10); /* MSI */ + } else { + temp &= ~BIT(11); /* Legacy INTx */ + } + writel(temp, QDPC_RC_SYS_CTL_PCIE_INT_MASK); +} + +static ssize_t vmac_reset_get(struct device *dev, struct device_attribute *attr, char *buf) +{ + return sprintf(buf, "%u\n", vmac_rst_rc_en); +} + +static ssize_t vmac_reset_set(struct device *dev, + struct device_attribute *attr, const char *buf, size_t count) +{ + uint8_t cmd; + + cmd = (uint8_t)simple_strtoul(buf, NULL, 10); + if (cmd == 0) + vmac_rst_rc_en = 0; + else + vmac_rst_rc_en = 1; + + return count; +} +DEVICE_ATTR(enable_reset, S_IWUSR | S_IRUSR, vmac_reset_get, vmac_reset_set); + +static void detect_ep_rst(struct work_struct *data) +{ + kernel_restart(NULL); +} + +void enable_ep_rst_detection(struct net_device *ndev) +{ + uint32_t temp = readl(QDPC_RC_SYS_CTL_PCIE_INT_MASK); + + temp |= QDPC_INTR_EP_RST_MASK; + writel(temp, QDPC_RC_SYS_CTL_PCIE_INT_MASK); + + device_create_file(&ndev->dev, &dev_attr_enable_reset); + INIT_WORK(&detect_ep_rst_work, detect_ep_rst); +} + +void disable_ep_rst_detection(struct net_device *ndev) +{ + uint32_t temp = readl(QDPC_RC_SYS_CTL_PCIE_INT_MASK); + + temp &= ~QDPC_INTR_EP_RST_MASK; + writel(temp, QDPC_RC_SYS_CTL_PCIE_INT_MASK); + + device_remove_file(&ndev->dev, &dev_attr_enable_reset); +} + +void handle_ep_rst_int(struct net_device *ndev) +{ + uint32_t status = readl(QDPC_RC_SYS_CTL_PCIE_INT_STAT); + + if ((status & QDPC_INTR_EP_RST_MASK) == 0) + return; + + /* Clear pending interrupt */ + writel(QDPC_INTR_EP_RST_MASK, QDPC_RC_SYS_CTL_PCIE_INT_STAT); + + printk("Detected reset of Endpoint\n"); + + if (vmac_rst_rc_en == 1) { + netif_stop_queue(ndev); + schedule_work(&detect_ep_rst_work); + } +} + +static void qdpc_mode_led(struct net_device *ndev, MODE_LED_OPS op) +{ + static int inited = 0; + static u32 led_bk = 0; + + switch(op) { + case MODE_LED_INIT: + if (gpio_request(MODE_LED_GPIO, ndev->name) < 0) + printk(KERN_INFO "%s: Failed to request GPIO%d for GPIO reset\n", + ndev->name, MODE_LED_GPIO); + + led_bk = gpio_get_value(MODE_LED_GPIO); + gpio_direction_output(MODE_LED_GPIO, led_bk); + inited = 1; + + break; + + case MODE_LED_EXIT: + if (inited) { + gpio_set_value(MODE_LED_GPIO, led_bk); + gpio_free(MODE_LED_GPIO); + inited = 0; + } + + break; + + case MODE_LED_FLASH: + if (inited) + gpio_set_value(MODE_LED_GPIO, ~gpio_get_value(MODE_LED_GPIO) & 0x01); + + break; + } +} + + +static void qdpc_wps_button_event_wakeup(struct net_device *ndev, WPS_Button_Event event) +{ + struct vmac_priv *priv = netdev_priv(ndev); + + if (!WPS_BUTTON_VALID(event)) + return; + + /* notify local watcher */ + wps_button_event = event; + wake_up_all(&WPS_Button_WaitQ); + + /* notify ep the offline dbg info, if ep is ready*/ + if (priv->ep_ready && event == WPS_BUTTON_DBGDUMP_EVENT) + writel(TOPAZ_SET_INT(IPC_OFFLINE_DBG), priv->ep_ipc_reg); +} + +static ssize_t qdpc_wps_button_read(struct device *dev, + struct device_attribute *attr, + char *buff) +{ + int i = 0; + + /* As usual, this read is always blocked untill wps button is pressed + * so increase the module reference to prevent it being unload during + * blocking read + */ + if (!try_module_get(THIS_MODULE)) + return 0; + + /* wait for valid WPS button event */ + wait_event_interruptible(WPS_Button_WaitQ, WPS_BUTTON_VALID(wps_button_event)); + + /* read back empty string in signal wakeup case */ + for (i = 0; i < _NSIG_WORDS; i++) { + if (current->pending.signal.sig[i] & ~current->blocked.sig[i]) { + module_put(THIS_MODULE); + return 0; + } + } + + sprintf(buff, "%d\n", wps_button_event); + + /* after new event been handled, reset to none event */ + wps_button_event = WPS_BUTTON_NONE_EVENT; + + module_put(THIS_MODULE); + + return strlen(buff); +} + +static ssize_t qdpc_wps_button_write(struct device *dev, + struct device_attribute *attr, + const char *buf, + size_t count) +{ + int input = 0; + struct net_device *ndev; + + input = simple_strtoul(buf, NULL, 10); + + ndev = (struct net_device*)dev_get_drvdata(dev); + + switch (input) { + case 1: + qdpc_mode_led(ndev, MODE_LED_INIT); + + qdpc_mode_led(ndev, MODE_LED_FLASH); + msleep(300); + qdpc_mode_led(ndev, MODE_LED_FLASH); + msleep(300); + qdpc_mode_led(ndev, MODE_LED_FLASH); + msleep(300); + + qdpc_mode_led(ndev, MODE_LED_EXIT); + + break; + default: + printk(KERN_INFO "WPS button: unknow cmd (%d)\n", input); + } + + return count; +} + +DEVICE_ATTR(wps_button, S_IWUSR | S_IRUSR, qdpc_wps_button_read, qdpc_wps_button_write); /* dev_attr_wps_button */ + +static void qdpc_wps_button_device_file_create(struct net_device *ndev) +{ + device_create_file(&(ndev->dev), &dev_attr_wps_button); +} + + +static void qdpc_wps_polling_button_notifier(unsigned long data) +{ + struct net_device *dev = (struct net_device *)data; + u32 current_level; + + current_level = gpio_get_value(WPS_BUTTON_GPIO); + + /* records the falling edge jiffies */ + if ((current_level == QDPC_WPS_BUTTON_ACTIVE_LEVEL) + && (qdpc_wps_button_last_level != QDPC_WPS_BUTTON_ACTIVE_LEVEL)) { + + qdpc_mode_led(dev, MODE_LED_INIT); + qdpc_wps_button_down_jiffies = jiffies; + } + + /* at rising edge */ + if ((current_level != QDPC_WPS_BUTTON_ACTIVE_LEVEL) + && (qdpc_wps_button_last_level == QDPC_WPS_BUTTON_ACTIVE_LEVEL)) { + + /* WPS button event is rising triggered -- when button + * being changed from active to inactive level. + * + * Different press time trigger different event + */ + if ((jiffies - qdpc_wps_button_down_jiffies) >= 10 * HZ) { + + /* wakeup the event waiting processes */ + qdpc_wps_button_event_wakeup(dev, WPS_BUTTON_DBGDUMP_EVENT); + + printk(KERN_INFO "WPS: button long press polling at %u\n", (unsigned int) jiffies); + } else { + /* wakeup the event waiting processes */ + qdpc_wps_button_event_wakeup(dev, WPS_BUTTON_WIRELESS_EVENT); + + printk(KERN_INFO "WPS: button short press polling at %u\n", (unsigned int) jiffies); + } + + /* back to 0 after rising edge */ + qdpc_wps_button_down_jiffies = 0; + qdpc_mode_led(dev, MODE_LED_EXIT); + } + + /* after button down more than 10s, begin change the mode led's state to notify user to release button */ + if (qdpc_wps_button_down_jiffies != 0 && ((jiffies - qdpc_wps_button_down_jiffies) >= 10 * HZ)) { + qdpc_mode_led(dev, MODE_LED_FLASH); + } + + /* Restart the timer */ + mod_timer(&qdpc_wps_button_timer, jiffies + WPS_BUTTON_TIMER_INTERVAL); + + qdpc_wps_button_last_level = current_level; + + return; +} + +int qdpc_wps_button_init(struct net_device *dev) +{ + /* + * Set up timer to poll the button. + * Request the GPIO resource and export it for userspace + */ + if (gpio_request(WPS_BUTTON_GPIO, dev->name) < 0) + printk(KERN_INFO "%s: Failed to request GPIO%d for GPIO reset\n", + dev->name, WPS_BUTTON_GPIO); + + init_timer(&qdpc_wps_button_timer); + qdpc_wps_button_timer.function = qdpc_wps_polling_button_notifier; + qdpc_wps_button_timer.data = (unsigned long)dev; + qdpc_wps_button_timer.expires = jiffies + WPS_BUTTON_TIMER_INTERVAL; + add_timer(&qdpc_wps_button_timer); + + /* creeate the device file for user space use */ + qdpc_wps_button_device_file_create(dev); + + return 0; +} + +void qdpc_wps_button_exit(void) +{ + del_timer(&qdpc_wps_button_timer); +} + diff --git a/package/firmware/quantenna/src/drivers/pcie2/host/quantenna/qdpc_platform.h b/package/firmware/quantenna/src/drivers/pcie2/host/quantenna/qdpc_platform.h new file mode 100644 index 000000000..0598b58f6 --- /dev/null +++ b/package/firmware/quantenna/src/drivers/pcie2/host/quantenna/qdpc_platform.h @@ -0,0 +1,110 @@ +/** + * Copyright (c) 2012-2012 Quantenna Communications, Inc. + * All rights reserved. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + **/ + +#ifndef __QDPC_PFDEP_H__ +#define __QDPC_PFDEP_H__ + +#include + +#include + +#include + +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,27) +#define IOREMAP ioremap_nocache +#else /* LINUX_VERSION_CODE < KERNEL_VERSION(2,6,27) */ +#define IOREMAP ioremap +#endif + +/* IO functions */ +#ifndef readb +#define readb(addr) (*(volatile unsigned char *) (addr)) +#endif + +#ifndef readw +#define readw(addr) (*(volatile unsigned short *) (addr)) +#endif + +#ifndef readl +#define readl(addr) (*(volatile unsigned int *) (addr)) +#endif + +#ifndef writeb +#define writeb(b,addr) (*(volatile unsigned char *) (addr) = (b)) +#endif + +#ifndef writew +#define writew(b,addr) (*(volatile unsigned short *) (addr) = (b)) +#endif + +#ifndef writel +#define writel(b,addr) (*(volatile unsigned int *) (addr) = (b)) +#endif + +/* + * Interrupt + */ +/* Interrupt Mask and Status Reigster */ +#define QDPC_RC_SYS_CTL_BASE 0xe0000000 +#define QDPC_RC_SYS_CTL_PCIE_INT_MASK (QDPC_RC_SYS_CTL_BASE + 0xC0) +#define QDPC_RC_SYS_CTL_PCIE_INT_STAT (QDPC_RC_SYS_CTL_BASE + 0x17C) + +/* Bit number and mask of MSI in the interrupt mask and status register */ +#define QDPC_INTR_MSI_BIT 12 +#define QDPC_INTR_MSI_MASK (1 << QDPC_INTR_MSI_BIT) + +/* Bit number and mask of EP-reset-detect Interrupt in the mask and status register */ +#define QDPC_INTR_EP_RST_BIT 3 +#define QDPC_INTR_EP_RST_MASK (1 << QDPC_INTR_EP_RST_BIT) + +extern void enable_vmac_ints(struct vmac_priv *vmp); +extern void disable_vmac_ints(struct vmac_priv *vmp); + +extern void enable_ep_rst_detection(struct net_device *ndev); +extern void disable_ep_rst_detection(struct net_device *ndev); +extern void handle_ep_rst_int(struct net_device *ndev); + +extern int qdpc_wps_button_init(struct net_device *dev); +extern void qdpc_wps_button_exit(void); + +/* Allocated buffer size for a packet */ +#define SKB_BUF_SIZE RX_BUF_SIZE + +/* Transmit Queue Length */ +#if defined(QTN_BYTEALIGN) +#define QDPC_TX_QUEUE_SIZE 180 +#else +#define QDPC_TX_QUEUE_SIZE 200 +#endif + +/* Receive Queue Length */ +#define QDPC_RX_QUEUE_SIZE 384 + +/* SDP requires packets show up at Lhost */ +#define QDPC_PLATFORM_IFPORT TOPAZ_TQE_LHOST_PORT + +/* Customer defined function */ +#define qdpc_platform_init() 0 +#define qdpc_platform_exit() do { } while(0) + +/* PCIe driver update resource in PCI configure space after EP reset */ +#define qdpc_update_hw_bar(pdev, index) do { } while(0) + +#endif /* __QDPC_PFDEP_H__ */ + diff --git a/package/firmware/quantenna/src/drivers/pcie2/host/st/Makefile b/package/firmware/quantenna/src/drivers/pcie2/host/st/Makefile new file mode 100644 index 000000000..f035017fb --- /dev/null +++ b/package/firmware/quantenna/src/drivers/pcie2/host/st/Makefile @@ -0,0 +1,28 @@ +# +# Makefile for ST platform +# + +EXTRA_CFLAGS += -Wall \ + -I$(src) \ + -I$(src)/../../include \ + -I$(src)/../common $(DNI_KMOD_CFLAGS) + +EXTRA_CFLAGS += -DRC_TXDONE_TIMER -DQTN_WAKEQ_SUPPORT + +default: all + +COMMON_DIR := ../common +qdpc-host-objs := $(COMMON_DIR)/qdpc_init.o $(COMMON_DIR)/qdpc_pcie.o $(COMMON_DIR)/topaz_vnet.o qdpc_platform.o +obj-m := qdpc-host.o + +qdpc_host.o: $(qdpc-host-objs) + ld -r $^ -o $@ + +all: + make -C /lib/modules/$(KVERSION)/build M=$(PWD) modules + +clean: + make -C /lib/modules/$(KVERSION)/build M=$(PWD) clean + rm -rf $(COMMON_DIR)/.*.cmd $(COMMON_DIR)/.tmp_versions + rm -rf Module.markers modules.order *~ $(qdpc-host-objs) + diff --git a/package/firmware/quantenna/src/drivers/pcie2/host/st/qdpc_platform.c b/package/firmware/quantenna/src/drivers/pcie2/host/st/qdpc_platform.c new file mode 100644 index 000000000..85fd1b3b3 --- /dev/null +++ b/package/firmware/quantenna/src/drivers/pcie2/host/st/qdpc_platform.c @@ -0,0 +1,72 @@ +/** + * Copyright (c) 2012-2012 Quantenna Communications, Inc. + * All rights reserved. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + **/ + +/* + * Platform dependant implement. Customer needs to modify this file. + */ + +#include + +#include +#include +#include +#include +#include + +/* + * Enable MSI interrupt of PCIe. + */ +void enable_vmac_ints(struct vmac_priv *vmp) +{ + volatile uint32_t *dma_wrd_imwr = QDPC_BAR_VADDR(vmp->dmareg_bar, TOPAZ_IMWR_DONE_ADDRLO_OFFSET); + writel(vmp->dma_msi_imwr, dma_wrd_imwr); +} + +/* + * Disable MSI interrupt of PCIe. + */ +void disable_vmac_ints(struct vmac_priv *vmp) +{ + volatile uint32_t *dma_wrd_imwr = QDPC_BAR_VADDR(vmp->dmareg_bar, TOPAZ_IMWR_DONE_ADDRLO_OFFSET); + writel(vmp->dma_msi_dummy, dma_wrd_imwr); +} + +/* + * Enable interrupt for detecting EP reset. + */ +void enable_ep_rst_detection(struct net_device *ndev) +{ +} + +/* + * Disable interrupt for detecting EP reset. + */ +void disable_ep_rst_detection(struct net_device *ndev) +{ +} + +/* + * Interrupt context for detecting EP reset. + * This function should do: + * 1. check interrupt status to see if EP reset. + * 2. if EP reset, handle it. + */ +void handle_ep_rst_int(struct net_device *ndev) +{ +} diff --git a/package/firmware/quantenna/src/drivers/pcie2/host/st/qdpc_platform.h b/package/firmware/quantenna/src/drivers/pcie2/host/st/qdpc_platform.h new file mode 100644 index 000000000..c0cc77bba --- /dev/null +++ b/package/firmware/quantenna/src/drivers/pcie2/host/st/qdpc_platform.h @@ -0,0 +1,101 @@ +/** + * Copyright (c) 2012-2012 Quantenna Communications, Inc. + * All rights reserved. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + **/ + +/* + * Platform dependant implement. Customer needs to modify this file. + */ +#ifndef __QDPC_PFDEP_H__ +#define __QDPC_PFDEP_H__ + +#include + +#include + +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,27) +#define IOREMAP ioremap_wc +#else /* LINUX_VERSION_CODE < KERNEL_VERSION(2,6,27) */ +#define IOREMAP ioremap +#endif + +/* IO functions */ +#ifndef readb +#define readb(addr) (*(volatile unsigned char *) (addr)) +#endif + +#ifndef readw +#define readw(addr) (*(volatile unsigned short *) (addr)) +#endif + +#ifndef readl +#define readl(addr) (*(volatile unsigned int *) (addr)) +#endif + +#ifndef writeb +#define writeb(b,addr) (*(volatile unsigned char *) (addr) = (b)) +#endif + +#ifndef writew +#define writew(b,addr) (*(volatile unsigned short *) (addr) = (b)) +#endif + +#ifndef writel +#define writel(b,addr) (*(volatile unsigned int *) (addr) = (b)) +#endif + +#ifndef virt_to_bus +#define virt_to_bus virt_to_phys +#endif + +/* Bit number and mask of MSI in the interrupt mask and status register */ +#define QDPC_INTR_MSI_BIT 0 +#define QDPC_INTR_MSI_MASK (1 << QDPC_INTR_MSI_BIT) + +/* Enable MSI interrupt of PCIe */ +extern void enable_vmac_ints(struct vmac_priv *vmp); +/* Disable MSI interrupt of PCIe */ +extern void disable_vmac_ints(struct vmac_priv *vmp); + +/* Enable interrupt for detecting EP reset */ +extern void enable_ep_rst_detection(struct net_device *ndev); +/* Disable interrupt for detecting EP reset */ +extern void disable_ep_rst_detection(struct net_device *ndev); +/* Interrupt context for detecting EP reset */ +extern void handle_ep_rst_int(struct net_device *ndev); + +/* Allocated buffer size for a packet */ +#define SKB_BUF_SIZE 2048 + +/* Transmit Queue Length */ +#define QDPC_TX_QUEUE_SIZE 180 + +/* Receive Queue Length */ +#define QDPC_RX_QUEUE_SIZE 384 + +/* Customer defined function */ +#define qdpc_platform_init() 0 +#define qdpc_platform_exit() do { } while(0) + +/* PCIe driver update resource in PCI configure space after EP reset */ +#define qdpc_update_hw_bar(pdev, index) do { } while(0) + +/* TODO: If IRQ-loss issue can be fixed, remove macro below */ +#define QDPC_PLATFORM_IRQ_FIXUP + +#endif /* __QDPC_PFDEP_H__ */ + diff --git a/package/firmware/quantenna/src/drivers/pcie2/include/qdpc_config.h b/package/firmware/quantenna/src/drivers/pcie2/include/qdpc_config.h new file mode 100644 index 000000000..a9118468e --- /dev/null +++ b/package/firmware/quantenna/src/drivers/pcie2/include/qdpc_config.h @@ -0,0 +1,66 @@ +/** + * Copyright (c) 2012-2012 Quantenna Communications, Inc. + * All rights reserved. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + **/ + +#ifndef __QDPC_CONFIG_H__ +#define __QDPC_CONFIG_H__ + +#include "ruby_pcie_bda.h" +#define QDPC_MAC_ADDR_SIZE 6 + +/* + * Using Type/Length field for checking if data packet or + * netlink packet(call_qcsapi remote interface). + * Using 0x0601 as netlink packet type and MAC magic number(Quantenna OUI) + * to distinguish netlink packet + */ +#define QDPC_APP_NETLINK_TYPE 0x0601 +#define QDPC_NETLINK_DST_MAGIC "\x00\x26\x86\x00\x00\x00" +#define QDPC_NETLINK_SRC_MAGIC "\x00\x26\x86\x00\x00\x00" + +#define QDPC_RPC_TYPE_MASK 0x0f00 +#define QDPC_RPC_TYPE_STRCALL 0x0100 +#define QDPC_RPC_TYPE_LIBCALL 0x0200 +#define QDPC_RPC_TYPE_FRAG_MASK 0x8000 +#define QDPC_RPC_TYPE_FRAG 0x8000 + + /* Used on RC side */ +#define QDPC_NETLINK_RPC_PCI_CLNT 30 +#define QDPC_NL_TYPE_CLNT_STR_REG (QDPC_RPC_TYPE_STRCALL | 0x0010) +#define QDPC_NL_TYPE_CLNT_STR_REQ (QDPC_RPC_TYPE_STRCALL | 0x0011) +#define QDPC_NL_TYPE_CLNT_LIB_REG (QDPC_RPC_TYPE_LIBCALL | 0x0010) +#define QDPC_NL_TYPE_CLNT_LIB_REQ (QDPC_RPC_TYPE_LIBCALL | 0x0011) + + /* Used on EP side */ +#define QDPC_NETLINK_RPC_PCI_SVC 31 +#define QDPC_NL_TYPE_SVC_STR_REG (QDPC_RPC_TYPE_STRCALL | 0x0010) +#define QDPC_NL_TYPE_SVC_STR_REQ (QDPC_RPC_TYPE_STRCALL | 0x0011) +#define QDPC_NL_TYPE_SVC_LIB_REG (QDPC_RPC_TYPE_LIBCALL | 0x0010) +#define QDPC_NL_TYPE_SVC_LIB_REQ (QDPC_RPC_TYPE_LIBCALL | 0x0011) + +typedef struct qdpc_cmd_hdr { + uint8_t dst_magic[ETH_ALEN]; + uint8_t src_magic[ETH_ALEN]; + __be16 type; + __be16 len; + __be16 rpc_type; + __be16 total_len; +} qdpc_cmd_hdr_t; + + +#endif /* __QDPC_CONFIG_H__ */ diff --git a/package/firmware/quantenna/src/drivers/pcie2/include/qdpc_debug.h b/package/firmware/quantenna/src/drivers/pcie2/include/qdpc_debug.h new file mode 100644 index 000000000..302e8d2ec --- /dev/null +++ b/package/firmware/quantenna/src/drivers/pcie2/include/qdpc_debug.h @@ -0,0 +1,65 @@ +/** + * Copyright (c) 2012-2012 Quantenna Communications, Inc. + * All rights reserved. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + **/ + +#ifndef __QDPC_DEBUG_H__ +#define __QDPC_DEBUG_H__ + +/* Debug macros */ +#define SUCCESS 0 +#define FAILURE -1 + +#ifdef DEBUG +#define PRINT_DBG(format, ...) printk(KERN_DEBUG format, ##__VA_ARGS__) +#else +#define PRINT_DBG(format, ...) do { } while(0); +#endif + +#define PRINT_ERROR(format, ...) printk(KERN_ERR format, ##__VA_ARGS__) +#define PRINT_INFO(format, ...) printk(KERN_INFO format, ##__VA_ARGS__) + +#define DBGFMT "%s-%d: " +#define DBGARG __func__, __LINE__ + +#define DBGPRINTF(fmt, ...) \ + do { \ + if(printk_ratelimit()) { \ + printk(DBGFMT fmt, DBGARG, ##__VA_ARGS__); \ + } \ + } while(0) + + +#ifdef DEBUG +#define qdpc_print_dump(str_, buf_, len_) \ +{ \ + u32 i = 0; \ + printk("%s\n", str_); \ + printk("0x%04X : ", i*8); \ + for (i=0; i < (u32)(len_); i++) { \ + if (i && ((i%8) == 0)) { \ + printk( "%s", "\n"); \ + printk("0x%04X : ", (i));\ + } \ + printk("%02x ", (buf_)[i]); \ + } \ + printk("\n%s\n", str_); \ +} +#else +#define qdpc_print_dump(str_, buf_, len_) +#endif +#endif diff --git a/package/firmware/quantenna/src/drivers/pcie2/include/qdpc_version.h b/package/firmware/quantenna/src/drivers/pcie2/include/qdpc_version.h new file mode 100644 index 000000000..b2691b4f4 --- /dev/null +++ b/package/firmware/quantenna/src/drivers/pcie2/include/qdpc_version.h @@ -0,0 +1 @@ +#define DRV_VERSION "v37.3.2.44" diff --git a/package/firmware/quantenna/src/drivers/pcie2/include/ruby_pcie_bda.h b/package/firmware/quantenna/src/drivers/pcie2/include/ruby_pcie_bda.h new file mode 100644 index 000000000..89091ae1b --- /dev/null +++ b/package/firmware/quantenna/src/drivers/pcie2/include/ruby_pcie_bda.h @@ -0,0 +1,136 @@ +/* + * (C) Copyright 2011 Quantenna Communications Inc. + * + * See file CREDITS for list of people who contributed to this + * project. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + */ + +/* + * Header file which describes Ruby PCI Express Boot Data Area + * Has to be used by both kernel and bootloader. + */ + +#ifndef RUBY_PCIE_BDA_H +#define RUBY_PCIE_BDA_H + +/* Area mapped by via the BAR visible to the host */ +#define RUBY_PCIE_BDA_ADDR CONFIG_ARC_PCIE_BASE +#define RUBY_PCIE_BDA_SIZE CONFIG_ARC_PCIE_SIZE + +#define RUBY_BDA_VADDR (RUBY_PCIE_BDA_ADDR + 0x80000000) + + +#define QDPC_PCIE_BDA_VERSION 0x1000 + +#define QDPC_BDA_PCIE_INIT 0x01 +#define QDPC_BDA_PCIE_RDY 0x02 +#define QDPC_BDA_FW_LOAD_RDY 0x03 +#define QDPC_BDA_FW_LOAD_DONE 0x04 +#define QDPC_BDA_FW_START 0x05 +#define QDPC_BDA_FW_RUN 0x06 +#define QDPC_BDA_FW_HOST_RDY 0x07 +#define QDPC_BDA_FW_TARGET_RDY 0x11 +#define QDPC_BDA_FW_TARGET_BOOT 0x12 +#define QDPC_BDA_FW_FLASH_BOOT 0x13 +#define QDPC_BDA_FW_HOST_LOAD 0x08 +#define QDPC_BDA_FW_BLOCK_DONE 0x09 +#define QDPC_BDA_FW_BLOCK_RDY 0x0A +#define QDPC_BDA_FW_EP_RDY 0x0B +#define QDPC_BDA_FW_BLOCK_END 0x0C +#define QDPC_BDA_FW_CONFIG 0x0D +#define QDPC_BDA_FW_RUNNING 0x0E + +#define QDPC_BDA_PCIE_FAIL 0x82 +#define QDPC_BDA_FW_LOAD_FAIL 0x85 + + +#define PCIE_BDA_RCMODE BIT(1) +#define PCIE_BDA_MSI BIT(2) +#define PCIE_BDA_BAR64 BIT(3) +#define PCIE_BDA_FLASH_PRESENT BIT(4) /* Tell the Host if EP have flash contain firmware */ +#define PCIE_BDA_FLASH_BOOT BIT(5) /* Tell TARGET to boot from flash */ +#define PCIE_BDA_XMIT_UBOOT BIT(6) /* EP ask for u-boot.bin */ +#define PCIE_BDA_TARGET_FBOOT_ERR BIT(8) /* TARGET flash boot failed */ +#define PCIE_BDA_TARGET_FWLOAD_ERR BIT(9) /* TARGET firmware load failed */ +#define PCIE_BDA_HOST_NOFW_ERR BIT(12) /* Host not find any firmware */ +#define PCIE_BDA_HOST_MEMALLOC_ERR BIT(13) /* Host malloc firmware download memory block failed */ +#define PCIE_BDA_HOST_MEMMAP_ERR BIT(14) /* Host pci map download memory block failed */ +#define PCIE_BDA_VER(x) (((x) >> 4) & 0xFF) +#define PCIE_BDA_ERROR_MASK 0xFF00 /* take the second 8 bits as error flag */ + +#define PCIE_DMA_OFFSET_ERROR 0xFFFF +#define PCIE_DMA_OFFSET_ERROR_MASK 0xFFFF + +#define PCIE_BDA_NAMELEN 32 + +#define QDPC_PCI_ENDIAN_DETECT_DATA 0x12345678 +#define QDPC_PCI_ENDIAN_REVERSE_DATA 0x78563412 + +#define QDPC_PCI_ENDIAN_VALID_STATUS 0x3c3c3c3c +#define QDPC_PCI_ENDIAN_INVALID_STATUS 0 + +#define QDPC_PCI_LITTLE_ENDIAN 0 +#define QDPC_PCI_BIG_ENDIAN 0xffffffff + +#define QDPC_SCHED_TIMEOUT (HZ / 20) + +#define PCIE_DMA_ISSUE_LOG_NUM 128 + +#define PCIE_RC_TX_QUEUE_LEN 256 +#define PCIE_TX_VALID_PKT 0x80000000 +#define PCIE_PKT_LEN_MASK 0xffff + +struct vmac_pkt_info { + uint32_t addr; + uint32_t info; +}; + +typedef struct qdpc_pcie_bda { + uint16_t bda_len; /* Size of BDA block */ + uint16_t bda_version; /* BDA version */ + uint32_t bda_bootstate; /* Boot state of device */ + uint32_t bda_dma_mask; /* Number of addressable DMA bits */ + uint32_t bda_dma_offset; /* HW specific offset for DMA engine */ + uint32_t bda_flags; + uint32_t bda_img; /* Current load image block */ + uint32_t bda_img_size; /* Current load image block size */ + uint32_t bda_ep2h_irqstatus; /* Added here to allow boot loader to use irqs if desired */ + uint32_t bda_h2ep_irqstatus; /* Added here to allow boot loader to use irqs if desired */ + uint32_t bda_msi_addr; + uint8_t reserved1[56]; /* Reserve 56 bytes to make it compatible with older version */ + uint32_t bda_flashsz; + char bda_boardname[PCIE_BDA_NAMELEN]; + uint32_t bda_pci_pre_status; /* PCI endian check previous status */ + uint32_t bda_pci_endian; /* Check pci memory endian format */ + uint32_t bda_pci_post_status; /* PCI endian check post status */ + int32_t bda_h2ep_txd_budget; /* txdone replenish budget for ep */ + int32_t bda_ep2h_txd_budget; /* txdone replenish budget for host */ + uint32_t bda_rc_rx_bd_base; /* EP rx buffer descriptors base address */ + uint32_t bda_rc_rx_bd_num; + uint32_t bda_rc_tx_bd_base; /* RC rx buffer descriptors base address */ + uint32_t bda_rc_tx_bd_num; + uint8_t bda_ep_link_state; + uint8_t bda_rc_link_state; + uint8_t bda_rc_msi_enabled; + uint8_t reserved2; + uint32_t bda_ep_next_pkt; /* A pointer to RC's memory specifying next packet to be handled by EP */ + struct vmac_pkt_info request[PCIE_RC_TX_QUEUE_LEN]; +} qdpc_pcie_bda_t; + +#endif + diff --git a/package/firmware/quantenna/src/drivers/pcie2/include/topaz_netcom.h b/package/firmware/quantenna/src/drivers/pcie2/include/topaz_netcom.h new file mode 100644 index 000000000..4eb3b56a6 --- /dev/null +++ b/package/firmware/quantenna/src/drivers/pcie2/include/topaz_netcom.h @@ -0,0 +1,51 @@ +/** + * Copyright (c) 2012-2012 Quantenna Communications, Inc. + * All rights reserved. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + **/ + +#ifndef __DRIVES_NET_TOPAZ_NETCOM_H +#define __DRIVES_NET_TOPAZ_NETCOM_H + +#define IPC_BIT_EP_RX_PKT (0) +#define IPC_BIT_RESET_EP (1) +#define IPC_BIT_RC_STOP_TX (2) +#define IPC_BIT_RC_RX_DONE (3) +#define IPC_BIT_EP_PM_CTRL (4) +#define IPC_BIT_OFFLINE_DBG (5) + +#define IPC_EP_RX_PKT (BIT(IPC_BIT_EP_RX_PKT)) +#define IPC_RESET_EP (BIT(IPC_BIT_RESET_EP)) +#define IPC_RC_STOP_TX (BIT(IPC_BIT_RC_STOP_TX)) +#define IPC_RC_RX_DONE (BIT(IPC_BIT_RC_RX_DONE)) +#define IPC_EP_PM_CTRL (BIT(IPC_BIT_EP_PM_CTRL)) +#define IPC_OFFLINE_DBG (BIT(IPC_BIT_OFFLINE_DBG)) + +#define TQE_NAPI_SCHED (0x3) +#define TQE_ENABLE_INTR (0x1) + +struct vmac_bd { + uint32_t buff_addr; + uint32_t buff_info; +}; + +struct vmac_rx_buf { + uint32_t baddr; + uint16_t offset; + uint16_t len; +}; + +#endif /* __DRIVES_NET_TOPAZ_NETCOM_H */ diff --git a/package/firmware/quantenna/src/net80211/_ieee80211.h b/package/firmware/quantenna/src/net80211/_ieee80211.h new file mode 100644 index 000000000..42e841856 --- /dev/null +++ b/package/firmware/quantenna/src/net80211/_ieee80211.h @@ -0,0 +1,1385 @@ +/*- + * Copyright (c) 2001 Atsushi Onoe + * Copyright (c) 2002-2005 Sam Leffler, Errno Consulting + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * Alternatively, this software may be distributed under the terms of the + * GNU General Public License ("GPL") version 2 as published by the Free + * Software Foundation. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * $Id: _ieee80211.h 2749 2007-10-16 08:58:14Z kelmo $ + */ +#ifndef _NET80211__IEEE80211_H_ +#define _NET80211__IEEE80211_H_ + +#include +#ifdef __KERNEL__ +#include +#endif + +enum ieee80211_phytype { + IEEE80211_T_DS, /* direct sequence spread spectrum */ + IEEE80211_T_FH, /* frequency hopping */ + IEEE80211_T_OFDM, /* frequency division multiplexing */ + IEEE80211_T_TURBO, /* high rate OFDM, aka turbo mode */ + IEEE80211_T_HT, /* HT - full GI */ + IEEE80211_T_MAX +}; +#define IEEE80211_T_CCK IEEE80211_T_DS /* more common nomenclature */ + +/* + * XXX not really a mode; there are really multiple PHY's + * Please update ieee80211_chanflags when the definition of + * ieee80211_phymode changed + */ +enum ieee80211_phymode { + IEEE80211_MODE_AUTO = 0, /* autoselect */ + IEEE80211_MODE_11A = 1, /* 5GHz, OFDM */ + IEEE80211_MODE_11B = 2, /* 2GHz, CCK */ + IEEE80211_MODE_11G = 3, /* 2GHz, OFDM */ + IEEE80211_MODE_FH = 4, /* 2GHz, GFSK */ + IEEE80211_MODE_TURBO_A = 5, /* 5GHz, OFDM, 2x clock dynamic turbo */ + IEEE80211_MODE_TURBO_G = 6, /* 2GHz, OFDM, 2x clock dynamic turbo*/ + IEEE80211_MODE_11NA = 7, /* 5GHz, HT20 */ + IEEE80211_MODE_11NG = 8, /* 2GHz, HT20 */ + IEEE80211_MODE_11NG_HT40PM = 9, /* 2GHz HT40 */ + IEEE80211_MODE_11NA_HT40PM = 10, /* 5GHz HT40 */ + IEEE80211_MODE_11AC_VHT20PM = 11, /* 5GHz VHT20 */ + IEEE80211_MODE_11AC_VHT40PM = 12, /* 5GHz VHT40 */ + IEEE80211_MODE_11AC_VHT80PM = 13, /* 5GHz VHT80 */ + IEEE80211_MODE_11AC_VHT160PM = 14, /* 5GHz VHT160 */ + IEEE80211_MODE_MAX = 15, /* Always keep this last */ +}; + +/* +#define IEEE80211_BM_11A (1 << IEEE80211_MODE_11A) +#define IEEE80211_BM_11B (1 << IEEE80211_MODE_11B) +#define IEEE80211_BM_11G (1 << IEEE80211_MODE_11B) +#define IEEE80211_BM_11NA (1 << IEEE80211_MODE_11B) +#define IEEE80211_BM_11NG (1 << IEEE80211_MODE_11B) +#define IEEE80211_BM_11NG_PLUS (1 << IEEE80211_MODE_11B) +#define IEEE80211_BM_11NG_MINUS (1 << IEEE80211_MODE_11B) +#define IEEE80211_BM_11NA_PLUS (1 << IEEE80211_MODE_11B) +#define IEEE80211_BM_11NA_MINUS (1 << IEEE80211_MODE_11B) +*/ + + +#define IEEE80211_IS_VHT_20(_c) \ + ((_c)->ic_phymode == IEEE80211_MODE_11AC_VHT20PM) + +#define IEEE80211_IS_VHT_40(_c) \ + ((_c)->ic_phymode == IEEE80211_MODE_11AC_VHT40PM) + +#define IEEE80211_IS_VHT_80(_c) \ + ((_c)->ic_phymode == IEEE80211_MODE_11AC_VHT80PM) + +#define IEEE80211_IS_VHT_160(_c) \ + ((_c)->ic_phymode == IEEE80211_MODE_11AC_VHT160PM) + +#define IS_IEEE80211_VHT_ENABLED(_c) \ + (IEEE80211_IS_VHT_160(_c) || IEEE80211_IS_VHT_80(_c)\ + || IEEE80211_IS_VHT_40(_c) || IEEE80211_IS_VHT_20(_c)) + +enum ieee80211_opmode { + IEEE80211_M_STA = 1, /* infrastructure station */ + IEEE80211_M_IBSS = 0, /* IBSS (adhoc) station */ + IEEE80211_M_AHDEMO = 3, /* Old lucent compatible adhoc demo */ + IEEE80211_M_HOSTAP = 6, /* Software Access Point */ + IEEE80211_M_MONITOR = 8, /* Monitor mode */ + IEEE80211_M_WDS = 2 /* WDS link */ +}; + +/* + * True if this mode must behave like a DFS master, ie do Channel + * Check Availability and In Service Monitoring. We need to make sure + * that all modes cannot send data without being authorized. Such + * enforcement is not done in monitor mode however. + */ + +#define IEEE80211_IS_MODE_DFS_MASTER(_opmode) \ + ((_opmode == IEEE80211_M_IBSS) || \ + (_opmode == IEEE80211_M_AHDEMO) || \ + (_opmode == IEEE80211_M_HOSTAP) || \ + (_opmode == IEEE80211_M_WDS)) + +/* + * 802.11n + */ + +enum ieee80211_11n_htmode { + IEEE80211_11N_HTAUTO = 0, + IEEE80211_11N_HT20 = 1, + IEEE80211_11N_HT40PLUS = 2, + IEEE80211_11N_HT40MINUS = 3 +}; + +enum ieee80211_cwm_mode { + IEEE80211_CWM_MODE20, + IEEE80211_CWM_MODE2040, + IEEE80211_CWM_MODE40, + IEEE80211_CWM_MODEMAX + +}; + +enum ieee80211_cwm_extprotspacing { + IEEE80211_CWM_EXTPROTSPACING20, + IEEE80211_CWM_EXTPROTSPACING25, + IEEE80211_CWM_EXTPROTSPACINGMAX +}; + +enum ieee80211_cwm_width { + IEEE80211_CWM_WIDTH20, + IEEE80211_CWM_WIDTH40, + IEEE80211_CWM_WIDTH80, + IEEE80211_CWM_WIDTH160, /* or 80+80 Mhz */ +}; + +enum ieee80211_cwm_extprotmode { + IEEE80211_CWM_EXTPROTNONE, /* no protection */ + IEEE80211_CWM_EXTPROTCTSONLY, /* CTS to self */ + IEEE80211_CWM_EXTPROTRTSCTS, /* RTS-CTS */ + IEEE80211_CWM_EXTPROTMAX +}; + +/* CWM (Channel Width Management) Information */ +struct ieee80211_cwm { + + /* Configuration */ + enum ieee80211_cwm_mode cw_mode; /* CWM mode */ + int8_t cw_extoffset; /* CWM Extension Channel Offset */ + enum ieee80211_cwm_extprotmode cw_extprotmode; /* CWM Extension Channel Protection Mode */ + enum ieee80211_cwm_extprotspacing cw_extprotspacing; /* CWM Extension Channel Protection Spacing */ + + /* State */ + enum ieee80211_cwm_width cw_width; /* CWM channel width */ +}; + + +enum ieee80211_fixed_rate_status { + DISABLED = 0, + ENABLED = 1, /* ieee rate */ +}; + +/* Holds the fixed rate information for each VAP */ +#define IEEE80211_MAX_FIXED_RATES 4 +struct ieee80211_fixed_rate { + enum ieee80211_fixed_rate_status status; + u_int8_t rate[IEEE80211_MAX_FIXED_RATES]; + u_int32_t retries; + u_int32_t flag; +#define IEEE80211_FIXED_RATE_F_11AC 0x1 +}; + +/* + * 802.11g protection mode. + */ +enum ieee80211_protmode { + IEEE80211_PROT_NONE = 0, /* no protection */ + IEEE80211_PROT_CTSONLY = 1, /* CTS to self */ + IEEE80211_PROT_RTSCTS = 2, /* RTS-CTS */ +}; + +/* + * Authentication mode. + */ +enum ieee80211_authmode { + IEEE80211_AUTH_NONE = 0, + IEEE80211_AUTH_OPEN = 1, /* open */ + IEEE80211_AUTH_SHARED = 2, /* shared-key */ + IEEE80211_AUTH_8021X = 3, /* 802.1x */ + IEEE80211_AUTH_AUTO = 4, /* auto-select/accept */ + /* NB: these are used only for ioctls */ + IEEE80211_AUTH_WPA = 5, /* WPA/RSN w/ 802.1x/PSK */ +}; + +/* + * Roaming mode is effectively who controls the operation + * of the 802.11 state machine when operating as a station. + * State transitions are controlled either by the driver + * (typically when management frames are processed by the + * hardware/firmware), the host (auto/normal operation of + * the 802.11 layer), or explicitly through ioctl requests + * when applications like wpa_supplicant want control. + */ +enum ieee80211_roamingmode { + IEEE80211_ROAMING_DEVICE= 0, /* driver/hardware control */ + IEEE80211_ROAMING_AUTO = 1, /* 802.11 layer control */ + IEEE80211_ROAMING_MANUAL= 2, /* application control */ +}; + +/* + * Scanning mode controls station scanning work; this is + * used only when roaming mode permits the host to select + * the bss to join/channel to use. + */ +enum ieee80211_scanmode { + IEEE80211_SCAN_DEVICE = 0, /* driver/hardware control */ + IEEE80211_SCAN_BEST = 1, /* 802.11 layer selects best */ + IEEE80211_SCAN_FIRST = 2, /* take first suitable candidate */ +}; + +/* ba state describes the block ack state. block ack should only be sent if + * ba state is set to established + */ +enum ieee80211_ba_state { + IEEE80211_BA_NOT_ESTABLISHED = 0, + IEEE80211_BA_ESTABLISHED = 1, + IEEE80211_BA_REQUESTED = 2, + IEEE80211_BA_FAILED = 5, + IEEE80211_BA_BLOCKED = 6, +}; + +#define IEEE80211_BA_IS_COMPLETE(_state) (\ + (_state) == IEEE80211_BA_ESTABLISHED || \ + (_state) == IEEE80211_BA_BLOCKED || \ + (_state) == IEEE80211_BA_FAILED) \ + +/* ba type describes the block acknowledgement type */ +enum ieee80211_ba_type { + IEEE80211_BA_DELAYED = 0, + IEEE80211_BA_IMMEDIATE = 1, +}; + +#define IEEE80211_OPER_CLASS_MAX 256 +#define IEEE80211_OPER_CLASS_BYTES 32 +#define IEEE80211_OPER_CLASS_BYTES_24G 8 + +/* power index definition */ +enum ieee80211_power_index_beamforming { + PWR_IDX_BF_OFF = 0, + PWR_IDX_BF_ON = 1, + PWR_IDX_BF_MAX = 2 +}; + +enum ieee80211_power_index_spatial_stream { + PWR_IDX_1SS = 0, + PWR_IDX_2SS = 1, + PWR_IDX_3SS = 2, + PWR_IDX_4SS = 3, + PWR_IDX_SS_MAX = 4 +}; + +enum ieee80211_power_index_bandwidth { + PWR_IDX_20M = 0, + PWR_IDX_40M = 1, + PWR_IDX_80M = 2, + PWR_IDX_BW_MAX = 3 +}; + +/* + * Channels are specified by frequency and attributes. + */ +struct ieee80211_channel { + u_int16_t ic_freq; /* setting in Mhz */ + u_int32_t ic_flags; /* see below */ + u_int8_t ic_ieee; /* IEEE channel number */ + int8_t ic_maxregpower; /* maximum regulatory tx power in dBm */ + int8_t ic_maxpower; /* maximum tx power in dBm for the current bandwidth with beam-forming off */ + int8_t ic_minpower; /* minimum tx power in dBm */ + int8_t ic_maxpower_normal; /* backup max tx power for short-range workaround */ + int8_t ic_minpower_normal; /* backup min tx power for short-range workaround */ + int8_t ic_maxpower_table[PWR_IDX_BF_MAX][PWR_IDX_SS_MAX][PWR_IDX_BW_MAX]; /* the maximum powers for different cases */ + u_int32_t ic_radardetected; /* number that radar signal has been detected on this channel */ + u_int8_t ic_center_f_40MHz; + u_int8_t ic_center_f_80MHz; + u_int8_t ic_center_f_160MHz; + u_int32_t ic_ext_flags; +}; + +#define IEEE80211_CHAN_MAX 255 +#define IEEE80211_CHAN_BYTES 32 /* howmany(IEEE80211_CHAN_MAX, NBBY) */ +#define IEEE80211_CHAN_ANY 0xffff /* token for ``any channel'' */ +#define IEEE80211_CHAN_ANYC ((struct ieee80211_channel *) IEEE80211_CHAN_ANY) + +#define IEEE80211_RADAR_11HCOUNT 1 +#define IEEE80211_DEFAULT_CHANCHANGE_TBTT_COUNT 10 +#define IEEE80211_RADAR_TEST_MUTE_CHAN 36 /* Move to channel 36 for mute test */ + +/* bits 0-3 are for private use by drivers */ +/* channel attributes */ +#define IEEE80211_CHAN_TURBO 0x00000010 /* Turbo channel */ +#define IEEE80211_CHAN_CCK 0x00000020 /* CCK channel */ +#define IEEE80211_CHAN_OFDM 0x00000040 /* OFDM channel */ +#define IEEE80211_CHAN_2GHZ 0x00000080 /* 2 GHz spectrum channel. */ +#define IEEE80211_CHAN_5GHZ 0x00000100 /* 5 GHz spectrum channel */ +#define IEEE80211_CHAN_PASSIVE 0x00000200 /* Only passive scan allowed */ +#define IEEE80211_CHAN_DYN 0x00000400 /* Dynamic CCK-OFDM channel */ +#define IEEE80211_CHAN_GFSK 0x00000800 /* GFSK channel (FHSS PHY) */ +#define IEEE80211_CHAN_RADAR 0x00001000 /* Status: Radar found on channel */ +#define IEEE80211_CHAN_STURBO 0x00002000 /* 11a static turbo channel only */ +#define IEEE80211_CHAN_HALF 0x00004000 /* Half rate channel */ +#define IEEE80211_CHAN_QUARTER 0x00008000 /* Quarter rate channel */ +#define IEEE80211_CHAN_HT20 0x00010000 /* HT 20 channel */ +#define IEEE80211_CHAN_HT40U 0x00020000 /* HT 40 with ext channel above */ +#define IEEE80211_CHAN_HT40D 0x00040000 /* HT 40 with ext channel below */ +#define IEEE80211_CHAN_HT40 0x00080000 /* HT 40 with ext channel above/below */ +#define IEEE80211_CHAN_DFS 0x00100000 /* Configuration: DFS-required channel */ +#define IEEE80211_CHAN_DFS_CAC_DONE 0x00200000 /* Status: CAC completed */ +#define IEEE80211_CHAN_VHT80 0x00400000 /* VHT 80 */ +#define IEEE80211_CHAN_DFS_OCAC_DONE 0x00800000 /* Status: Off-channel CAC completed */ +#define IEEE80211_CHAN_DFS_CAC_IN_PROGRESS 0x01000000 /* Status: Valid CAC is in progress */ +#define IEEE80211_CHAN_WEATHER 0x02000000 /* Configuration: weather channel */ + +#define IEEE80211_DEFAULT_2_4_GHZ_CHANNEL 1 +#define IEEE80211_DEFAULT_5_GHZ_CHANNEL 36 + +#define IEEE80211_MAX_2_4_GHZ_CHANNELS 13 +#define IEEE80211_MAX_5_GHZ_CHANNELS 30 +#define IEEE80211_MAX_DUAL_CHANNELS (IEEE80211_MAX_2_4_GHZ_CHANNELS + IEEE80211_MAX_5_GHZ_CHANNELS) +#define CHIPID_2_4_GHZ 0 +#define CHIPID_5_GHZ 1 +#define CHIPID_DUAL 2 + +/*11AC - 40MHZ flags */ +#define IEEE80211_CHAN_VHT40U IEEE80211_CHAN_HT40U /* VHT 40 with ext channel above */ +#define IEEE80211_CHAN_VHT40D IEEE80211_CHAN_HT40D /* VHT 40 with ext channel below */ +#define IEEE80211_CHAN_VHT40 IEEE80211_CHAN_HT40 /* VHT 40 with ext channel above/below */ +/*11AC - 20MHZ flags */ +#define IEEE80211_CHAN_VHT20 IEEE80211_CHAN_HT20 /* VHT 20 channel */ + +/* below are channel ext attributes(ic_ext_flags) */ +/* 11AC - 80MHZ flags */ +#define IEEE80211_CHAN_VHT80_LL 0x00000001 +#define IEEE80211_CHAN_VHT80_LU 0x00000002 +#define IEEE80211_CHAN_VHT80_UL 0x00000004 +#define IEEE80211_CHAN_VHT80_UU 0x00000008 + + +/* + * Useful combinations of channel characteristics. + */ +#define IEEE80211_CHAN_FHSS \ + (IEEE80211_CHAN_2GHZ | IEEE80211_CHAN_GFSK) +#define IEEE80211_CHAN_A \ + (IEEE80211_CHAN_5GHZ | IEEE80211_CHAN_OFDM) +#define IEEE80211_CHAN_B \ + (IEEE80211_CHAN_2GHZ | IEEE80211_CHAN_CCK) +#define IEEE80211_CHAN_PUREG \ + (IEEE80211_CHAN_2GHZ | IEEE80211_CHAN_OFDM) +#define IEEE80211_CHAN_G \ + (IEEE80211_CHAN_2GHZ | IEEE80211_CHAN_DYN) +#define IEEE80211_CHAN_108A \ + (IEEE80211_CHAN_5GHZ | IEEE80211_CHAN_OFDM | IEEE80211_CHAN_TURBO) +#define IEEE80211_CHAN_108G \ + (IEEE80211_CHAN_2GHZ | IEEE80211_CHAN_OFDM | IEEE80211_CHAN_TURBO) +#define IEEE80211_CHAN_ST \ + (IEEE80211_CHAN_108A | IEEE80211_CHAN_STURBO) +#define IEEE80211_CHAN_11N \ + (IEEE80211_CHAN_HT20) +#define IEEE80211_CHAN_11NG \ + (IEEE80211_CHAN_2GHZ | IEEE80211_CHAN_OFDM | IEEE80211_CHAN_HT20) +#define IEEE80211_CHAN_11NA \ + (IEEE80211_CHAN_5GHZ | IEEE80211_CHAN_OFDM | IEEE80211_CHAN_HT20) +#define IEEE80211_CHAN_11NG_HT40U \ + (IEEE80211_CHAN_2GHZ | IEEE80211_CHAN_OFDM | IEEE80211_CHAN_HT20 | \ + IEEE80211_CHAN_HT40U) +#define IEEE80211_CHAN_11NG_HT40D \ + (IEEE80211_CHAN_2GHZ |IEEE80211_CHAN_OFDM | IEEE80211_CHAN_HT20 | \ + IEEE80211_CHAN_HT40D) +#define IEEE80211_CHAN_11NA_HT40U \ + (IEEE80211_CHAN_5GHZ |IEEE80211_CHAN_OFDM | IEEE80211_CHAN_HT20 | \ + IEEE80211_CHAN_HT40U) +#define IEEE80211_CHAN_11NA_HT40D \ + (IEEE80211_CHAN_5GHZ |IEEE80211_CHAN_OFDM | IEEE80211_CHAN_HT20 | \ + IEEE80211_CHAN_HT40D) +#define IEEE80211_CHAN_11NG_HT40 \ + (IEEE80211_CHAN_2GHZ | IEEE80211_CHAN_OFDM | IEEE80211_CHAN_HT20 | \ + IEEE80211_CHAN_HT40) +#define IEEE80211_CHAN_11NA_HT40 \ + (IEEE80211_CHAN_5GHZ |IEEE80211_CHAN_OFDM | IEEE80211_CHAN_HT20 | \ + IEEE80211_CHAN_HT40) + +#define IEEE80211_CHAN_11AC \ + (IEEE80211_CHAN_5GHZ |IEEE80211_CHAN_OFDM | IEEE80211_CHAN_VHT20 ) +#define IEEE80211_CHAN_11AC_VHT40 \ + (IEEE80211_CHAN_5GHZ |IEEE80211_CHAN_OFDM | IEEE80211_CHAN_VHT20 | \ + IEEE80211_CHAN_VHT40) +#define IEEE80211_CHAN_11AC_VHT80 \ + (IEEE80211_CHAN_5GHZ |IEEE80211_CHAN_OFDM | IEEE80211_CHAN_VHT20 | \ + IEEE80211_CHAN_VHT40 | IEEE80211_CHAN_VHT80 ) + +#define IEEE80211_CHAN_ALL \ + (IEEE80211_CHAN_2GHZ | IEEE80211_CHAN_5GHZ | IEEE80211_CHAN_HT20 | \ + IEEE80211_CHAN_HT40U | IEEE80211_CHAN_HT40D | IEEE80211_CHAN_HT40| \ + IEEE80211_CHAN_CCK | IEEE80211_CHAN_OFDM | IEEE80211_CHAN_DYN| \ + IEEE80211_CHAN_VHT20 | IEEE80211_CHAN_VHT40 | IEEE80211_CHAN_VHT80) + +#define IEEE80211_CHAN_ALLTURBO \ + (IEEE80211_CHAN_ALL | IEEE80211_CHAN_TURBO | IEEE80211_CHAN_STURBO) + +#define IEEE80211_CHAN_ANYN \ + (IEEE80211_CHAN_HT20 | IEEE80211_CHAN_HT40U | IEEE80211_CHAN_HT40D | \ + IEEE80211_CHAN_HT40 ) + +#define IEEE80211_IS_CHAN_CACDONE(_c) \ + (((_c)->ic_flags & IEEE80211_CHAN_DFS_CAC_DONE) != 0) +#define IEEE80211_IS_CHAN_CAC_IN_PROGRESS(_c) \ + (((_c)->ic_flags & IEEE80211_CHAN_DFS_CAC_IN_PROGRESS) != 0) + +#define IEEE80211_IS_CHAN_FHSS(_c) \ + (((_c)->ic_flags & IEEE80211_CHAN_FHSS) == IEEE80211_CHAN_FHSS) +#define IEEE80211_IS_CHAN_A(_c) \ + (((_c)->ic_flags & IEEE80211_CHAN_A) == IEEE80211_CHAN_A) +#define IEEE80211_IS_CHAN_B(_c) \ + (((_c)->ic_flags & IEEE80211_CHAN_B) == IEEE80211_CHAN_B) +#define IEEE80211_IS_CHAN_PUREG(_c) \ + (((_c)->ic_flags & IEEE80211_CHAN_PUREG) == IEEE80211_CHAN_PUREG) +#define IEEE80211_IS_CHAN_G(_c) \ + (((_c)->ic_flags & IEEE80211_CHAN_G) == IEEE80211_CHAN_G) +#define IEEE80211_IS_CHAN_ANYG(_c) \ + (IEEE80211_IS_CHAN_PUREG(_c) || IEEE80211_IS_CHAN_G(_c)) +#define IEEE80211_IS_CHAN_ST(_c) \ + (((_c)->ic_flags & IEEE80211_CHAN_ST) == IEEE80211_CHAN_ST) +#define IEEE80211_IS_CHAN_108A(_c) \ + (((_c)->ic_flags & IEEE80211_CHAN_108A) == IEEE80211_CHAN_108A) +#define IEEE80211_IS_CHAN_108G(_c) \ + (((_c)->ic_flags & IEEE80211_CHAN_108G) == IEEE80211_CHAN_108G) + +#define IEEE80211_IS_CHAN_2GHZ(_c) \ + (((_c)->ic_flags & IEEE80211_CHAN_2GHZ) != 0) +#define IEEE80211_IS_CHAN_5GHZ(_c) \ + (((_c)->ic_flags & IEEE80211_CHAN_5GHZ) != 0) +#define IEEE80211_IS_CHAN_OFDM(_c) \ + (((_c)->ic_flags & IEEE80211_CHAN_OFDM) != 0) +#define IEEE80211_IS_CHAN_CCK(_c) \ + (((_c)->ic_flags & IEEE80211_CHAN_CCK) != 0) +#define IEEE80211_IS_CHAN_GFSK(_c) \ + (((_c)->ic_flags & IEEE80211_CHAN_GFSK) != 0) +#define IEEE80211_IS_CHAN_TURBO(_c) \ + (((_c)->ic_flags & IEEE80211_CHAN_TURBO) != 0) +#define IEEE80211_IS_CHAN_STURBO(_c) \ + (((_c)->ic_flags & IEEE80211_CHAN_STURBO) != 0) +#define IEEE80211_IS_CHAN_DTURBO(_c) \ + (((_c)->ic_flags & \ + (IEEE80211_CHAN_TURBO | IEEE80211_CHAN_STURBO)) == IEEE80211_CHAN_TURBO) +#define IEEE80211_IS_CHAN_HALF(_c) \ + (((_c)->ic_flags & IEEE80211_CHAN_HALF) != 0) +#define IEEE80211_IS_CHAN_QUARTER(_c) \ + (((_c)->ic_flags & IEEE80211_CHAN_QUARTER) != 0) +#define IEEE80211_IS_CHAN_11N(_c) \ + (((_c)->ic_flags & IEEE80211_CHAN_11N) == IEEE80211_CHAN_11N) +#define IEEE80211_IS_CHAN_11NG(_c) \ + (((_c)->ic_flags & IEEE80211_CHAN_11NG) == IEEE80211_CHAN_11NG) +#define IEEE80211_IS_CHAN_11NA(_c) \ + (((_c)->ic_flags & IEEE80211_CHAN_11NA) == IEEE80211_CHAN_11NA) +#define IEEE80211_IS_CHAN_11AC(_c) \ + (((_c)->ic_flags & IEEE80211_CHAN_11AC) == IEEE80211_CHAN_11AC) +#define IEEE80211_IS_CHAN_HT40PLUS(_c) \ + (((_c)->ic_flags & IEEE80211_CHAN_HT40U) == IEEE80211_CHAN_HT40U) +#define IEEE80211_IS_CHAN_HT40MINUS(_c) \ + (((_c)->ic_flags & IEEE80211_CHAN_HT40D) == IEEE80211_CHAN_HT40D) +#define IEEE80211_IS_CHAN_HT40(_c) \ + (IEEE80211_IS_CHAN_HT40PLUS((_c)) || IEEE80211_IS_CHAN_HT40MINUS((_c))) +#define IEEE80211_IS_CHAN_11NG_HT40PLUS(_c) \ + (IEEE80211_IS_CHAN_11NG((_c)) && IEEE80211_IS_CHAN_HT40PLUS((_c))) +#define IEEE80211_IS_CHAN_11NG_HT40MINUS(_c) \ + (IEEE80211_IS_CHAN_11NG((_c)) && IEEE80211_IS_CHAN_HT40MINUS((_c))) +#define IEEE80211_IS_CHAN_11NA_HT40PLUS(_c) \ + (IEEE80211_IS_CHAN_11NA((_c)) && IEEE80211_IS_CHAN_HT40PLUS((_c))) +#define IEEE80211_IS_CHAN_11NA_HT40MINUS(_c) \ + (IEEE80211_IS_CHAN_11NA((_c)) && IEEE80211_IS_CHAN_HT40MINUS((_c))) +#define IEEE80211_IS_CHAN_ANYN(_c) 1 + //(((_c)->ic_flags & IEEE80211_CHAN_ANYN)) + +#define IEEE80211_IS_CHAN_VHT40PLUS(_c) \ + (((_c)->ic_flags & IEEE80211_CHAN_VHT40U) == IEEE80211_CHAN_VHT40U) +#define IEEE80211_IS_CHAN_VHT40MINUS(_c) \ + (((_c)->ic_flags & IEEE80211_CHAN_VHT40D) == IEEE80211_CHAN_VHT40D) +#define IEEE80211_IS_CHAN_VHT40(_c) \ + (IEEE80211_IS_CHAN_VHT40PLUS(_c) || IEEE80211_IS_CHAN_VHT40MINUS(_c)) +#define IEEE80211_IS_CHAN_11AC_VHT40PLUS(_c) \ + (IEEE80211_IS_CHAN_11AC(_c) && IEEE80211_IS_CHAN_VHT40PLUS(_c)) +#define IEEE80211_IS_CHAN_11AC_VHT40MINUS(_c) \ + (IEEE80211_IS_CHAN_11AC(_c) && IEEE80211_IS_CHAN_VHT40MINUS(_c)) + +#define IEEE80211_IS_CHAN_VHT80_EDGEPLUS(_c) \ + (((_c)->ic_ext_flags & IEEE80211_CHAN_VHT80_LL) == IEEE80211_CHAN_VHT80_LL) +#define IEEE80211_IS_CHAN_VHT80_CNTRPLUS(_c) \ + (((_c)->ic_ext_flags & IEEE80211_CHAN_VHT80_LU) == IEEE80211_CHAN_VHT80_LU) +#define IEEE80211_IS_CHAN_VHT80_CNTRMINUS(_c) \ + (((_c)->ic_ext_flags & IEEE80211_CHAN_VHT80_UL) == IEEE80211_CHAN_VHT80_UL) +#define IEEE80211_IS_CHAN_VHT80_EDGEMINUS(_c) \ + (((_c)->ic_ext_flags & IEEE80211_CHAN_VHT80_UU) == IEEE80211_CHAN_VHT80_UU) +#define IEEE80211_IS_CHAN_VHT80(_c) \ + (IEEE80211_IS_CHAN_VHT80_EDGEPLUS(_c) || IEEE80211_IS_CHAN_VHT80_EDGEMINUS(_c) || \ + IEEE80211_IS_CHAN_VHT80_CNTRPLUS(_c) || IEEE80211_IS_CHAN_VHT80_CNTRMINUS(_c)) +#define IEEE80211_IS_CHAN_11AC_VHT80_EDGEPLUS(_c) \ + (IEEE80211_IS_CHAN_11AC(_c) && IEEE80211_IS_CHAN_VHT80_EDGEPLUS(_c)) +#define IEEE80211_IS_CHAN_11AC_VHT80_CNTRPLUS(_c) \ + (IEEE80211_IS_CHAN_11AC(_c) && IEEE80211_IS_CHAN_VHT80_CNTRPLUS(_c)) +#define IEEE80211_IS_CHAN_11AC_VHT80_CNTRMINUS(_c) \ + (IEEE80211_IS_CHAN_11AC(_c) && IEEE80211_IS_CHAN_VHT80_CNTRMINUS(_c)) +#define IEEE80211_IS_CHAN_11AC_VHT80_EDGEMINUS(_c) \ + (IEEE80211_IS_CHAN_11AC(_c) && IEEE80211_IS_CHAN_VHT80_EDGEMINUS(_c)) + +/* mode specific macros */ + +#define IEEE80211_IS_11NG_MODE(_mode) \ + (((_mode) == IEEE80211_MODE_11NG) || \ + ((_mode) == IEEE80211_MODE_11NG_HT40PLM)) + +#define IEEE80211_IS_11NA_MODE(_mode) \ + (((_mode) == IEEE80211_MODE_11NA) || \ + ((_mode) == IEEE80211_MODE_11NA_HT40PM) ) + +#define IEEE80211_IS_11N_MODE(_mode) \ + (IEEE80211_IS_11NA_MODE((_mode)) || IEEE80211_IS_11NG_MODE((_mode))) + +/* ni_chan encoding for FH phy */ +#define IEEE80211_FH_CHANMOD 80 +#define IEEE80211_FH_CHAN(set,pat) (((set) - 1) * IEEE80211_FH_CHANMOD + (pat)) +#define IEEE80211_FH_CHANSET(chan) ((chan) / IEEE80211_FH_CHANMOD + 1) +#define IEEE80211_FH_CHANPAT(chan) ((chan) % IEEE80211_FH_CHANMOD) + +#define IEEE80211_HTCAP_TXBF_CAP_LEN 4 + +/* Peer RTS config */ +#define IEEE80211_PEER_RTS_OFF 0 +#define IEEE80211_PEER_RTS_PMP 1 +#define IEEE80211_PEER_RTS_DYN 2 +#define IEEE80211_PEER_RTS_MAX 2 +#define IEEE80211_PEER_RTS_DEFAULT IEEE80211_PEER_RTS_DYN + +/* Dynamic WMM */ +#define IEEE80211_DYN_WMM_OFF 0 +#define IEEE80211_DYN_WMM_ON 1 +#define IEEE80211_DYN_WMM_DEFAULT IEEE80211_DYN_WMM_ON + +#define IEEE80211_DYN_WMM_LOCAL_AIFS_DELTA -2 +#define IEEE80211_DYN_WMM_LOCAL_CWMIN_DELTA -2 +#define IEEE80211_DYN_WMM_LOCAL_CWMAX_DELTA -3 +#define IEEE80211_DYN_WMM_LOCAL_AIFS_MIN {3, 3, 2, 1} +#define IEEE80211_DYN_WMM_LOCAL_CWMIN_MIN {2, 4, 2, 2} +#define IEEE80211_DYN_WMM_LOCAL_CWMAX_MIN {4, 6, 3, 3} +#define IEEE80211_DYN_WMM_BSS_AIFS_DELTA 2 +#define IEEE80211_DYN_WMM_BSS_CWMIN_DELTA 2 +#define IEEE80211_DYN_WMM_BSS_CWMAX_DELTA 3 +#define IEEE80211_DYN_WMM_BSS_AIFS_MAX {4, 5, 4, 3} +#define IEEE80211_DYN_WMM_BSS_CWMIN_MAX {4, 6, 4, 3} +#define IEEE80211_DYN_WMM_BSS_CWMAX_MAX {6, 8, 6, 5} + +/* + * 802.11 rate set. + */ +#define IEEE80211_RATE_SIZE 8 /* 802.11 standard */ +#define IEEE80211_AG_RATE_MAXSIZE 12 /* Non 11n Rates */ + +#define IEEE80211_RATE_MAXSIZE 30 /* max rates we'll handle */ +#define IEEE80211_HT_RATE_MAXSIZE 77 /* Total number of 802.11n rates */ +#define IEEE80211_HT_RATE_SIZE 128 +#define IEEE80211_SANITISE_RATESIZE(_rsz) \ + ((_rsz > IEEE80211_RATE_MAXSIZE) ? IEEE80211_RATE_MAXSIZE : _rsz) + + +/* For legacy hardware - leaving it as is for now */ + +#define IEEE80211_RATE_MCS 0x8000 +#define IEEE80211_RATE_MCS_VAL 0x7FFF + +//#define IEEE80211_RATE_IDX_ENTRY(val, idx) (val&(0xff<<(8*idx))>>(idx*8)) +#define IEEE80211_RATE_IDX_ENTRY(val, idx) (((val&(0xff<<(idx*8)))>>(idx*8))) + +/* + * 11n A-MPDU & A-MSDU limits . XXX + */ +#define IEEE80211_AMPDU_LIMIT_MIN (1 * 1024) +#define IEEE80211_AMPDU_LIMIT_MAX (64 * 1024 - 1) +#define IEEE80211_AMSDU_LIMIT_MAX 4096 + + +/* + * 11ac MPDU size limit + */ +#define IEEE80211_MPDU_VHT_1K 1500 +#define IEEE80211_MPDU_VHT_4K 3895 +#define IEEE80211_MPDU_VHT_8K 7991 +#define IEEE80211_MPDU_VHT_11K 11454 +#define IEEE80211_MPDU_ENCAP_OVERHEAD_MAX 64 /* enough for mpdu header 36 + crypto 20 + fcs 4 */ + +/* + * 11n and 11ac AMSDU sizes + */ +#define IEEE80211_AMSDU_NONE 0 +#define IEEE80211_AMSDU_HT_4K 3839 +#define IEEE80211_AMSDU_HT_8K 7935 +#define IEEE80211_AMSDU_VHT_1K (IEEE80211_MPDU_VHT_1K - IEEE80211_MPDU_ENCAP_OVERHEAD_MAX) +#define IEEE80211_AMSDU_VHT_4K (IEEE80211_MPDU_VHT_4K - IEEE80211_MPDU_ENCAP_OVERHEAD_MAX) +#define IEEE80211_AMSDU_VHT_8K (IEEE80211_MPDU_VHT_8K - IEEE80211_MPDU_ENCAP_OVERHEAD_MAX) +#define IEEE80211_AMSDU_VHT_11K (IEEE80211_MPDU_VHT_11K - IEEE80211_MPDU_ENCAP_OVERHEAD_MAX) + +/* + * 11n MCS set limits + */ +#define IEEE80211_HT_MAXMCS_SET 10 +#define IEEE80211_HT_MAXMCS_SET_SUPPORTED 10 +#define IEEE80211_HT_MAXMCS_BASICSET_SUPPORTED 2 +#define IEEE80211_MCS_PER_STREAM 8 +/* + * B0-B2: MCS index, B3-B6: MCS set index, B8: BASIC RATE + */ +#define IEEE80211_HT_BASIC_RATE 0x80 +#define IEEE80211_HT_MCS_MASK 0x07 +#define IEEE80211_HT_MCS_SET_MASK 0x78 +#define IEEE80211_HT_RATE_TABLE_IDX_MASK 0x7F + +#define IEEE80211_HT_MCS_VALUE(_v) \ + ((_v) & IEEE80211_HT_MCS_MASK) + +#define IEEE80211_HT_MCS_SET_IDX(_v) \ + (((_v) & IEEE80211_HT_MCS_SET_MASK) >> 3) + +#define IEEE80211_HT_IS_BASIC_RATE(_v) \ + (((_v) & IEEE80211_HT_BASIC_RATE) == IEEE80211_HT_BASIC_RATE) + +/* index number in the set will be (_i - 1) if (_i != 0) */ +#define IEEE80211_HT_MCS_IDX(_m,_i) \ + { \ + u_int8_t temp = (_m); \ + _i = 0; \ + while (temp) \ + { \ + temp = temp >> 1; \ + _i++; \ + } \ + if(_i) \ + _i--; \ + else \ + _i = 0xFF; \ + } + +/* rate table index = (MCS set index << 3) + MCS index */ +#define IEEE80211_HT_RATE_TABLE_IDX(_s,_i) \ + (((_s) << 3) + (_i)) + +/* Supported rate label */ +#define IEEE80211_RATE_11MBPS 22 + +#if 0 +/* integer portion of HT rates */ +u_int16_t ht_rate_table_20MHz_400[] = { + 7, + 14, + 21, + 28, + 43, + 57, + 65, + 72, + 14, + 28, + 43, + 57, + 86, + 115, + 130, + 144 + }; + +u_int16_t ht_rate_table_20MHz_800[] = { + 6, + 13, + 19, + 26, + 39, + 52, + 58, + 65, + 13, + 26, + 39, + 52, + 78, + 104, + 117, + 130 + }; + +u_int16_t ht_rate_table_40MHz_400[] = { + 15, + 30, + 45, + 60, + 90, + 120, + 135, + 150, + 30, + 60, + 90, + 120, + 180, + 240, + 270, + 300 + }; + +u_int16_t ht_rate_table_40MHz_800[] = { + 13, + 27, + 40, + 54, + 81, + 108, + 121, + 135, + 27, + 54, + 81, + 108, + 162, + 216, + 243, + 270 + }; +#endif + +struct ieee80211_rateset { + u_int8_t rs_legacy_nrates; /* Number of legacy rates */ + u_int8_t rs_nrates; /* Total rates = Legacy + 11n */ + u_int8_t rs_rates[IEEE80211_RATE_MAXSIZE]; +}; + +struct ieee80211_ht_rateset { + u_int8_t rs_legacy_nrates; /* Number of legacy rates */ + u_int8_t rs_nrates; /* Total rates = Legacy + 11n */ + u_int8_t rs_rates[IEEE80211_HT_RATE_MAXSIZE]; +}; + +struct ieee80211_roam { + int8_t rssi11a; /* rssi thresh for 11a bss */ + int8_t rssi11b; /* for 11g sta in 11b bss */ + int8_t rssi11bOnly; /* for 11b sta */ + u_int8_t pad1; + u_int8_t rate11a; /* rate thresh for 11a bss */ + u_int8_t rate11b; /* for 11g sta in 11b bss */ + u_int8_t rate11bOnly; /* for 11b sta */ + u_int8_t pad2; +}; +struct ieee80211_htcap { + u_int16_t cap; /* HT capabilities */ + u_int8_t numtxspstr; /* Number of Tx spatial streams */ + u_int8_t numrxstbcstr; /* Number of Rx stbc streams */ + u_int8_t pwrsave; /* HT power save mode */ + u_int8_t mpduspacing; /* MPDU density */ + u_int16_t maxmsdu; /* Max MSDU size */ + u_int16_t maxampdu; /* maximum rx A-MPDU factor */ + u_int8_t mcsset[IEEE80211_HT_MAXMCS_SET_SUPPORTED]; /* HT MCS set */ + u_int16_t maxdatarate; /* HT max data rate */ + u_int16_t extcap; /* HT extended capability */ + u_int8_t mcsparams; /* HT MCS params */ + u_int8_t hc_txbf[IEEE80211_HTCAP_TXBF_CAP_LEN]; /* HT transmit beamforming capabilities */ +} __packed; + +struct ieee80211_htinfo { + u_int8_t ctrlchannel; /* control channel */ + u_int8_t byte1; /* ht ie byte 1 */ + u_int8_t byte2; /* ht ie byte 2 */ + u_int8_t byte3; /* ht ie byte 3 */ + u_int8_t byte4; /* ht ie byte 4 */ + u_int8_t byte5; /* ht ie byte 5 */ + u_int8_t sigranularity; /* signal granularity */ + u_int8_t choffset; /* external channel offset */ + u_int8_t opmode; /* operational mode */ + u_int8_t basicmcsset[IEEE80211_HT_MAXMCS_BASICSET_SUPPORTED]; /* basic MCS set */ +} __packed; + +/* VHT capabilities MIB */ + +/* Maximum MPDU Length B0-1 */ +enum ieee80211_vht_maxmpdu { + IEEE80211_VHTCAP_MAX_MPDU_3895 = 0, + IEEE80211_VHTCAP_MAX_MPDU_7991, + IEEE80211_VHTCAP_MAX_MPDU_11454, + IEEE80211_VHTCAP_MAX_MPDU_RESERVED, +}; + +/* Supported Channel Width Set B2-3 */ +enum ieee80211_vht_chanwidth { + IEEE80211_VHTCAP_CW_80M_ONLY = 0, + IEEE80211_VHTCAP_CW_160M, + IEEE80211_VHTCAP_CW_160_AND_80P80M, + IEEE80211_VHTCAP_CW_RESERVED, +}; + +/* RX STBC B8-10 */ +enum ieee80211_vht_rxstbc { + IEEE80211_VHTCAP_RX_STBC_NA = 0, + IEEE80211_VHTCAP_RX_STBC_UPTO_1, + IEEE80211_VHTCAP_RX_STBC_UPTO_2, + IEEE80211_VHTCAP_RX_STBC_UPTO_3, + IEEE80211_VHTCAP_RX_STBC_UPTO_4, +}; + +/* RX STS B13-15 */ +enum ieee80211_vht_rxsts { + IEEE80211_VHTCAP_RX_STS_1 = 0, + IEEE80211_VHTCAP_RX_STS_2, + IEEE80211_VHTCAP_RX_STS_3, + IEEE80211_VHTCAP_RX_STS_4, + IEEE80211_VHTCAP_RX_STS_5, + IEEE80211_VHTCAP_RX_STS_6, + IEEE80211_VHTCAP_RX_STS_7, + IEEE80211_VHTCAP_RX_STS_8 +}; + +/* SOUNDING DIM B16-18 */ +enum ieee80211_vht_numsnd { + IEEE80211_VHTCAP_SNDDIM_1 = 0, + IEEE80211_VHTCAP_SNDDIM_2, + IEEE80211_VHTCAP_SNDDIM_3, + IEEE80211_VHTCAP_SNDDIM_4, + IEEE80211_VHTCAP_SNDDIM_5, + IEEE80211_VHTCAP_SNDDIM_6, + IEEE80211_VHTCAP_SNDDIM_7, + IEEE80211_VHTCAP_SNDDIM_8 +}; + +/* Maximum A-MPDU Length exponent B23-25 */ +/* 2^(13 + Max A-MPDU) -1 */ +enum ieee80211_vht_maxampduexp { + IEEE80211_VHTCAP_MAX_A_MPDU_8191, /* (2^13) -1 */ + IEEE80211_VHTCAP_MAX_A_MPDU_16383, /* (2^14) -1 */ + IEEE80211_VHTCAP_MAX_A_MPDU_32767, /* (2^15) -1 */ + IEEE80211_VHTCAP_MAX_A_MPDU_65535, /* (2^16) -1 */ + IEEE80211_VHTCAP_MAX_A_MPDU_131071, /* (2^17) -1 */ + IEEE80211_VHTCAP_MAX_A_MPDU_262143, /* (2^18) -1 */ + IEEE80211_VHTCAP_MAX_A_MPDU_524287, /* (2^19) -1 */ + IEEE80211_VHTCAP_MAX_A_MPDU_1048575, /* (2^20) -1 */ +}; + +/* VHT link Adaptation capable B26-27 */ +enum ieee80211_vht_lnkadptcap { + IEEE80211_VHTCAP_LNKADAPTCAP_NO_FEEDBACK, + IEEE80211_VHTCAP_LNKADAPTCAP_RESERVED, + IEEE80211_VHTCAP_LNKADAPTCAP_UNSOLICITED, + IEEE80211_VHTCAP_LNKADAPTCAP_BOTH, +}; + +/* VHT MCS supported */ +enum ieee80211_vht_mcs_supported { + IEEE80211_VHT_MCS_0_7, + IEEE80211_VHT_MCS_0_8, + IEEE80211_VHT_MCS_0_9, + IEEE80211_VHT_MCS_NA, // Spatial stream not supported +}; + +/* VHT NSS */ +enum ieee80211_vht_nss { + IEEE80211_VHT_NSS1 = 1, + IEEE80211_VHT_NSS2, + IEEE80211_VHT_NSS3, + IEEE80211_VHT_NSS4, + IEEE80211_VHT_NSS5, + IEEE80211_VHT_NSS6, + IEEE80211_VHT_NSS7, + IEEE80211_VHT_NSS8, +}; + +struct ieee80211_vhtcap { + u_int32_t cap_flags; + u_int32_t maxmpdu; + u_int32_t chanwidth; + u_int32_t rxstbc; + u_int8_t bfstscap; + u_int8_t numsounding; + u_int32_t maxampduexp; + u_int32_t lnkadptcap; + u_int16_t rxmcsmap; + u_int16_t rxlgimaxrate; + u_int16_t txmcsmap; + u_int16_t txlgimaxrate; + u_int8_t bfstscap_save; +} __packed; + +/* VHT capability macros */ +#define VHT_SUPPORTS_MCS0_9_FOR_4SS_BIT 0x0080 +#define VHT_SUPPORTS_MCS0_8_FOR_4SS_BIT 0x0040 +#define VHT_SUPPORTS_MCS0_9_FOR_3SS_BIT 0x0020 +#define VHT_SUPPORTS_MCS0_8_FOR_3SS_BIT 0x0010 +#define VHT_SUPPORTS_MCS0_9_FOR_2SS_BIT 0x0008 +#define VHT_SUPPORTS_MCS0_8_FOR_2SS_BIT 0x0004 +#define VHT_SUPPORTS_MCS0_9_FOR_1SS_BIT 0x0002 +#define VHT_SUPPORTS_MCS0_8_FOR_1SS_BIT 0x0001 + +#define IEEE80211_VHT_HAS_4SS(rxmcsmap) \ + !((rxmcsmap & VHT_SUPPORTS_MCS0_9_FOR_4SS_BIT) && \ + (rxmcsmap & VHT_SUPPORTS_MCS0_8_FOR_4SS_BIT)) + +#define IEEE80211_VHT_HAS_3SS(rxmcsmap) \ + !((rxmcsmap & VHT_SUPPORTS_MCS0_9_FOR_3SS_BIT) && \ + (rxmcsmap & VHT_SUPPORTS_MCS0_8_FOR_3SS_BIT)) + +#define IEEE80211_VHT_HAS_2SS(rxmcsmap) \ + !((rxmcsmap & VHT_SUPPORTS_MCS0_9_FOR_2SS_BIT) && \ + (rxmcsmap & VHT_SUPPORTS_MCS0_8_FOR_2SS_BIT)) + +#define IEEE80211_VHT_SUPPORTS_MCS0_8_FOR_4SS(rxmcsmap) \ + ((rxmcsmap & VHT_SUPPORTS_MCS0_8_FOR_4SS_BIT) && \ + !(rxmcsmap & VHT_SUPPORTS_MCS0_9_FOR_4SS_BIT)) + +#define IEEE80211_VHT_SUPPORTS_MCS0_9_FOR_4SS(rxmcsmap) \ + ((rxmcsmap & VHT_SUPPORTS_MCS0_9_FOR_4SS_BIT) && \ + !(rxmcsmap & VHT_SUPPORTS_MCS0_8_FOR_4SS_BIT)) + +#define IEEE80211_VHT_SUPPORTS_MCS0_8_FOR_3SS(rxmcsmap) \ + ((rxmcsmap & VHT_SUPPORTS_MCS0_8_FOR_3SS_BIT) && \ + !(rxmcsmap & VHT_SUPPORTS_MCS0_9_FOR_3SS_BIT)) + +#define IEEE80211_VHT_SUPPORTS_MCS0_9_FOR_3SS(rxmcsmap) \ + ((rxmcsmap & VHT_SUPPORTS_MCS0_9_FOR_3SS_BIT) && \ + !(rxmcsmap & VHT_SUPPORTS_MCS0_8_FOR_3SS_BIT)) + +#define IEEE80211_VHT_SUPPORTS_MCS0_8_FOR_2SS(rxmcsmap) \ + ((rxmcsmap & VHT_SUPPORTS_MCS0_8_FOR_2SS_BIT) && \ + !(rxmcsmap & VHT_SUPPORTS_MCS0_9_FOR_2SS_BIT)) + +#define IEEE80211_VHT_SUPPORTS_MCS0_9_FOR_2SS(rxmcsmap) \ + ((rxmcsmap & VHT_SUPPORTS_MCS0_9_FOR_2SS_BIT) && \ + !(rxmcsmap & VHT_SUPPORTS_MCS0_8_FOR_2SS_BIT)) + +#define IEEE80211_VHT_SUPPORTS_MCS0_8_FOR_1SS(rxmcsmap) \ + ((rxmcsmap & VHT_SUPPORTS_MCS0_8_FOR_1SS_BIT) && \ + !(rxmcsmap & VHT_SUPPORTS_MCS0_9_FOR_1SS_BIT)) + +#define IEEE80211_VHT_SUPPORTS_MCS0_9_FOR_1SS(rxmcsmap) \ + ((rxmcsmap & VHT_SUPPORTS_MCS0_9_FOR_1SS_BIT) && \ + !(rxmcsmap & VHT_SUPPORTS_MCS0_8_FOR_1SS_BIT)) + +/* VHT Operation element */ +/* VHT Operation Information subfields */ +enum ieee80211_vhtop_chanwidth { + IEEE80211_VHTOP_CHAN_WIDTH_20_40MHZ, + IEEE80211_VHTOP_CHAN_WIDTH_80MHZ, + IEEE80211_VHTOP_CHAN_WIDTH_160MHZ, + IEEE80211_VHTOP_CHAN_WIDTH_80PLUS80MHZ, +}; + +#define IEEE80211_VHT_MAXMCS_SET_SUPPORTED 10 + +struct ieee80211_vhtop { + u_int32_t chanwidth; + u_int8_t centerfreq0; + u_int8_t centerfreq1; + u_int16_t basicvhtmcsnssset; +} __packed; + +/* Max number of MU groups */ +#define IEEE80211_MU_GRP_NUM_MAX 64 + +/* Max number of nodes in a MU group */ +#define IEEE80211_MU_GRP_NODES_MAX 4 + +/* VHT MU membership & user position arrays */ +struct ieee80211_vht_mu_grp { +#define IEEE80211_VHT_GRP_1ST_BIT_OFFSET 1 +#define IEEE80211_VHT_GRP_MAX_BIT_OFFSET 62 +#define IEEE80211_VHT_GRP_MEMBERSHIP_ARRAY_SIZE (IEEE80211_MU_GRP_NUM_MAX/(sizeof(u_int8_t)*8)) +#define IEEE80211_VHT_USR_POS_ARRAY_SIZE ((IEEE80211_MU_GRP_NODES_MAX >> 1)* \ + IEEE80211_MU_GRP_NUM_MAX/(sizeof(u_int8_t)*8)) + u_int8_t member[IEEE80211_VHT_GRP_MEMBERSHIP_ARRAY_SIZE]; + u_int8_t pos[IEEE80211_VHT_USR_POS_ARRAY_SIZE]; +} __packed; + +struct ieee80211_action_data { + u_int8_t cat; /* category identifier */ + u_int8_t action; /* action identifier */ + void *params; +}; + +struct ba_action_req { + u_int8_t tid; /* TID */ + u_int16_t seq; /* sequence number of first frame to be block acked */ + u_int8_t frag; /* fragment number of first frame to be block acked */ + enum ieee80211_ba_type type;/* block ack type */ + u_int16_t buff_size; /* suggested re-order buffer size */ + u_int16_t timeout; /* block ack timeout if no transfer */ +}; + +struct ba_action_resp { + u_int8_t tid; /* TID */ + u_int16_t seq; /* sequence number of first frame to be block acked */ + u_int8_t frag; /* fragment number of first frame to be block acked */ + enum ieee80211_ba_type type;/* block ack type */ + u_int16_t buff_size; /* actual re-order buffer size */ + u_int16_t reason; /* block ack negotiation status */ + u_int16_t timeout; /* negotiated block ack timeout if no transfer */ +}; + +struct ba_action_del { + u_int8_t tid; /* TID */ + u_int16_t reason; /* block ack termination reason */ + u_int8_t initiator; /* initiator/ recipient of block ack negotiation */ +}; + +struct ht_action_nc_beamforming { + u_int16_t num_sts; /* number of space time streams, Nc */ + u_int16_t num_txchains; /* number of transmit chains, Nr */ + u_int8_t snr[2]; /* SNR for received space time streams */ + u_int16_t size_matrices; /* size of beamforming matrices in bytes */ + u_int8_t *matrices; /* pointer to beamforming matrices */ + u_int8_t bw_mode; /* bwmode = 0 for 20Mhz and 1 for 40 M */ + +}; + +struct ht_action_channelswitch { + u_int8_t ch_width; /* switched channel width */ +}; + +struct ht_action_sm_powersave { + u_int8_t sm_power_mode; /* new power mode */ + u_int8_t sm_power_enabled; /* power save enabled */ +}; + +struct ht_action_antennasel { + u_int8_t antenna_sel; /* antenna selection: bit number corresponds + to antenna number */ +}; + +struct ht_action_mimo_ctrl { + u_int8_t num_columns; /* Nc in received beamforming matrices */ + u_int8_t num_rows; /* Nr in received beamforming matrices */ + u_int8_t chan_width; /* Channel Width 0=20, 1 =40 */ + u_int8_t num_grouping; /* Ng in received beamforming matrices */ + u_int8_t num_coeffsize; /* Nb in received beamforming matrices */ + u_int8_t snr[2]; /* SNR as seen by sender of action frame */ + u_int32_t matrices[1024]; /* pointer to beamforming matrices, + contents must be copied */ +}; + +#ifdef CONFIG_QVSP +/** + * The following structure definitions are for passing in data to the + * management send function to generate action frames for VSP. + */ +struct ieee80211_qvsp_act { + uint8_t oui[3]; + uint8_t type; +}; + +struct ieee80211_qvsp_strm_id { + union { + struct in6_addr ipv6; + __be32 ipv4; + } saddr; + union { + struct in6_addr ipv6; + __be32 ipv4; + } daddr; + __be16 sport; + __be16 dport; + uint8_t ip_version; + uint8_t ip_proto; + uint8_t ac; +} __packed; + +#define IEEE8021_QVSP_MAX_ACT_ITEMS 32 + +struct ieee80211_qvsp_strm_dis_attr { + uint32_t throt_policy; + uint32_t throt_rate; + uint32_t demote_rule; + uint32_t demote_state; +}; + +struct ieee80211_qvsp_act_strm_ctrl { + struct ieee80211_qvsp_act header; + uint8_t strm_state; + uint8_t count; + struct ieee80211_qvsp_strm_dis_attr dis_attr; + struct ieee80211_qvsp_strm_id strm_items[IEEE8021_QVSP_MAX_ACT_ITEMS]; +}; + +struct ieee80211_qvsp_act_cfg_item { + uint32_t index; + uint32_t value; +}; + +struct ieee80211_qvsp_act_cfg { + struct ieee80211_qvsp_act header; + uint8_t count; + struct ieee80211_qvsp_act_cfg_item cfg_items[IEEE8021_QVSP_MAX_ACT_ITEMS]; +}; +#endif + +typedef void (*ppq_callback_success)(void *ctx); +typedef void (*ppq_callback_fail)(void *ctx, int32_t reason); + +struct ieee80211_meas_request_ctrl { + u_int8_t meas_type; + unsigned long expire; + ppq_callback_success fn_success; + ppq_callback_fail fn_fail; + union { + struct _req_basic { + u_int64_t start_tsf; + u_int16_t duration_ms; + u_int8_t channel; + } basic; + struct _req_cca { + u_int64_t start_tsf; + u_int16_t duration_ms; + u_int8_t channel; + } cca; + struct _req_rpi { + u_int64_t start_tsf; + u_int16_t duration_ms; + u_int8_t channel; + } rpi; + struct _req_sta_stats { + void *sub_item; + u_int16_t duration_tu; + u_int8_t group_id; + } sta_stats; + struct _req_qtn_cca { + u_int16_t duration_tu; + } qtn_cca; + struct _req_chan_load { + u_int8_t channel; + u_int16_t duration_ms; + } chan_load; + struct _req_noise_his { + u_int8_t channel; + u_int16_t duration_ms; + } noise_his; + struct _req_beacon { + u_int8_t op_class; + u_int8_t channel; + u_int8_t duration_ms; + u_int8_t mode; + u_int8_t bssid[6]; + } beacon; + struct _req_frame { + u_int8_t op_class; + u_int8_t channel; + u_int16_t duration_ms; + u_int8_t type; + u_int8_t mac_address[6]; + } frame; + struct _req_tran_stream_cat { + u_int16_t duration_ms; + u_int8_t peer_sta[6]; + u_int8_t tid; + u_int8_t bin0; + } tran_stream_cat; + struct _req_multicast_diag { + u_int16_t duration_ms; + u_int8_t group_mac[6]; + } multicast_diag; + } u; +}; + +struct ieee80211_meas_report_ctrl { + u_int8_t meas_type; + u_int8_t report_mode; + u_int8_t token; /* dialog token */ + u_int8_t meas_token; /* measurement token */ + u_int8_t autonomous; /* 1: autonomous report */ + union { + struct _rep_basic { + u_int8_t channel; + u_int8_t basic_report; + u_int16_t duration_tu; + u_int64_t start_tsf; + } basic; + struct _rep_cca { + u_int8_t channel; + u_int8_t cca_report; + u_int16_t duration_tu; + u_int64_t start_tsf; + } cca; + struct _rep_rpi { + u_int64_t start_tsf; + u_int16_t duration_tu; + u_int8_t channel; + u_int8_t rpi_report[8]; + } rpi; + struct _rep_sta_stats { + void *sub_item; + u_int16_t duration_tu; + u_int8_t group_id; + } sta_stats; + struct _rep_qtn_cca { + u_int64_t start_tsf; + u_int16_t duration_ms; + u_int8_t channel; + u_int8_t qtn_cca_report; + u_int32_t sp_fail; + u_int32_t lp_fail; + u_int16_t others_time; + u_int8_t *extra_ie; + u_int16_t extra_ie_len; + } qtn_cca; + struct _rep_chan_load { + u_int8_t op_class; + u_int8_t channel; + u_int16_t duration_tu; + u_int8_t channel_load; + } chan_load; + struct _rep_noise_his { + u_int8_t op_class; + u_int8_t channel; + u_int16_t duration_tu; + u_int8_t antenna_id; + u_int8_t anpi; + u_int8_t ipi[11]; + } noise_his; + struct _rep_beacon { + u_int8_t op_class; + u_int8_t channel; + u_int16_t duration_tu; + u_int8_t reported_frame_info; + u_int8_t rcpi; + u_int8_t rsni; + u_int8_t bssid[6]; + u_int8_t antenna_id; + u_int8_t parent_tsf[4]; + } beacon; + struct _rep_frame { + void *sub_item; + u_int8_t op_class; + u_int8_t channel; + u_int16_t duration_tu; + } frame; + struct _rep_tran_stream_cat { + u_int16_t duration_tu; + u_int8_t peer_sta[6]; + u_int8_t tid; + u_int8_t reason; + u_int32_t tran_msdu_cnt; + u_int32_t msdu_discard_cnt; + u_int32_t msdu_fail_cnt; + u_int32_t msdu_mul_retry_cnt; + u_int32_t qos_lost_cnt; + u_int32_t avg_queue_delay; + u_int32_t avg_tran_delay; + u_int8_t bin0_range; + u_int32_t bins[6]; + } tran_stream_cat; + struct _rep_multicast_diag { + u_int16_t duration_tu; + u_int8_t group_mac[6]; + u_int8_t reason; + u_int32_t mul_rec_msdu_cnt; + u_int16_t first_seq_num; + u_int16_t last_seq_num; + u_int16_t mul_rate; + } multicast_diag; + } u; +}; + +struct stastats_subele_vendor { + u_int32_t flags; + u_int8_t sequence; +}; + +struct frame_report_subele_frame_count { + u_int8_t ta[6]; + u_int8_t bssid[6]; + u_int8_t phy_type; + u_int8_t avg_rcpi; + u_int8_t last_rsni; + u_int8_t last_rcpi; + u_int8_t antenna_id; + u_int16_t frame_count; +}; + +/* TPC actions */ +struct ieee80211_action_tpc_request { + unsigned long expire; + ppq_callback_success fn_success; + ppq_callback_fail fn_fail; +}; + +struct ieee80211_action_tpc_report { + uint8_t rx_token; + int8_t tx_power; + int8_t link_margin; +}; + +struct ppq_request_param { + unsigned long expire; + ppq_callback_success fn_success; + ppq_callback_fail fn_fail; +}; + +struct ieee80211_link_measure_request { + struct ppq_request_param ppq; +}; + +struct ieee80211_link_measure_report { + uint8_t token; + struct ieee80211_action_tpc_report tpc_report; + uint8_t recv_antenna_id; + uint8_t tran_antenna_id; + uint8_t rcpi; + uint8_t rsni; +}; + +struct ieee80211_neighbor_report_request { + struct ppq_request_param ppq; +}; + +struct ieee80211_neighbor_report_request_item { + uint8_t bssid[6]; + uint32_t bssid_info; + uint8_t operating_class; + uint8_t channel; + uint8_t phy_type; +}; + +struct ieee80211_neighbor_report_response { + uint8_t token; + uint8_t bss_num; + struct ieee80211_neighbor_report_request_item *neighbor_report_ptr[32]; +}; + +#define IEEE80211_MAXIMUM_TIMESTAMP_DIFF_NC_BF 1000000 + +#define IEEE80211_TXPOWER_MAX 100 /* .5 dBm units */ +#define IEEE80211_TXPOWER_MIN 0 /* kill radio */ + +#define IEEE80211_DTIM_MAX 15 /* max DTIM period */ +#define IEEE80211_DTIM_MIN 1 /* min DTIM period */ +#define IEEE80211_DTIM_DEFAULT 3 /* default DTIM period */ + +#define IEEE80211_BINTVAL_MAX 5000 /* max beacon interval (TU's) */ +#define IEEE80211_BINTVAL_MIN 25 /* min beacon interval (TU's) */ +#define IEEE80211_BINTVAL_DEFAULT 100 /* default beacon interval (TU's) */ +#define IEEE80211_BINTVAL_VALID(_bi) \ + ((IEEE80211_BINTVAL_MIN <= (_bi)) && \ + ((_bi) <= IEEE80211_BINTVAL_MAX)) +#define IEEE80211_BINTVAL_SANITISE(_bi) \ + (IEEE80211_BINTVAL_VALID(_bi) ? \ + (_bi) : IEEE80211_BINTVAL_DEFAULT) + +#define IEEE80211_SCAN_TBL_LEN_MAX_DFLT 2000 + +#define IEEE80211_BWSTR_20 "20" +#define IEEE80211_BWSTR_40 "40" +#define IEEE80211_BWSTR_80 "80" +#define IEEE80211_BWSTR_160 "160" +#define IEEE80211_BWSTR_80P80 "80+80" + +#endif /* _NET80211__IEEE80211_H_ */ diff --git a/package/firmware/quantenna/src/net80211/ieee80211.h b/package/firmware/quantenna/src/net80211/ieee80211.h new file mode 100644 index 000000000..30e1e5dfa --- /dev/null +++ b/package/firmware/quantenna/src/net80211/ieee80211.h @@ -0,0 +1,3709 @@ +/*- + * Copyright (c) 2001 Atsushi Onoe + * Copyright (c) 2002-2005 Sam Leffler, Errno Consulting + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * Alternatively, this software may be distributed under the terms of the + * GNU General Public License ("GPL") version 2 as published by the Free + * Software Foundation. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ +#ifndef _NET80211_IEEE80211_H_ +#define _NET80211_IEEE80211_H_ +#include +#include "net80211/_ieee80211.h" +#include "net80211/ieee80211_qos.h" +#include "net80211/ieee80211_dfs_reentry.h" +#include + +/* + * 802.11 protocol definitions. + */ + +#define IEEE80211_ADDR_LEN 6 /* size of 802.11 address */ +/* is 802.11 address multicast/broadcast? */ +#define IEEE80211_IS_MULTICAST(_a) (*(_a) & 0x01) + +/* IEEE 802.11 PLCP header */ +struct ieee80211_plcp_hdr { + uint16_t i_sfd; + uint8_t i_signal; + uint8_t i_service; + uint16_t i_length; + uint16_t i_crc; +} __packed; + +#define IEEE80211_PLCP_SFD 0xF3A0 +#define IEEE80211_PLCP_SERVICE 0x00 + +/* + * generic definitions for IEEE 802.11 frames + */ +struct ieee80211_frame { + uint8_t i_fc[2]; + uint8_t i_dur[2]; + uint8_t i_addr1[IEEE80211_ADDR_LEN]; + uint8_t i_addr2[IEEE80211_ADDR_LEN]; + uint8_t i_addr3[IEEE80211_ADDR_LEN]; + uint8_t i_seq[2]; + /* possibly followed by addr4[IEEE80211_ADDR_LEN]; */ + /* see below */ +} __packed; + +struct ieee80211_qosframe { + uint8_t i_fc[2]; + uint8_t i_dur[2]; + uint8_t i_addr1[IEEE80211_ADDR_LEN]; + uint8_t i_addr2[IEEE80211_ADDR_LEN]; + uint8_t i_addr3[IEEE80211_ADDR_LEN]; + uint8_t i_seq[2]; + uint8_t i_qos[2]; + /* possibly followed by addr4[IEEE80211_ADDR_LEN]; */ + /* see below */ +} __packed; + +struct ieee80211_htframe { + uint8_t i_fc[2]; + uint8_t i_dur[2]; + uint8_t i_addr1[IEEE80211_ADDR_LEN]; + uint8_t i_addr2[IEEE80211_ADDR_LEN]; + uint8_t i_addr3[IEEE80211_ADDR_LEN]; + uint8_t i_seq[2]; + uint8_t i_qos[2]; + uint8_t i_ht[4]; + /* possibly followed by addr4[IEEE80211_ADDR_LEN]; */ + /* see below */ +} __packed; + +struct ieee80211_qoscntl { + uint8_t i_qos[2]; +}; + +struct ieee80211_ht_qosframe { + uint8_t i_fc[2]; + uint8_t i_dur[2]; + uint8_t i_addr1[IEEE80211_ADDR_LEN]; + uint8_t i_addr2[IEEE80211_ADDR_LEN]; + uint8_t i_addr3[IEEE80211_ADDR_LEN]; + uint8_t i_seq[2]; + uint8_t i_qos[2]; + uint8_t i_ht[4]; + /* possibly followed by addr4[IEEE80211_ADDR_LEN]; */ + /* see below */ +} __packed; + +struct ieee80211_htcntl { + uint8_t i_ht[4]; +}; + +struct ieee80211_frame_addr4 { + uint8_t i_fc[2]; + uint8_t i_dur[2]; + uint8_t i_addr1[IEEE80211_ADDR_LEN]; + uint8_t i_addr2[IEEE80211_ADDR_LEN]; + uint8_t i_addr3[IEEE80211_ADDR_LEN]; + uint8_t i_seq[2]; + uint8_t i_addr4[IEEE80211_ADDR_LEN]; +} __packed; + + +struct ieee80211_qosframe_addr4 { + uint8_t i_fc[2]; + uint8_t i_dur[2]; + uint8_t i_addr1[IEEE80211_ADDR_LEN]; + uint8_t i_addr2[IEEE80211_ADDR_LEN]; + uint8_t i_addr3[IEEE80211_ADDR_LEN]; + uint8_t i_seq[2]; + uint8_t i_addr4[IEEE80211_ADDR_LEN]; + uint8_t i_qos[2]; +} __packed; + +#define IEEE80211_HT_CAPABLE 1 +#define IEEE80211_NON_HT_CAPABLE 0 + +struct ieee80211_htframe_addr4 { + uint8_t i_fc[2]; + uint8_t i_dur[2]; + uint8_t i_addr1[IEEE80211_ADDR_LEN]; + uint8_t i_addr2[IEEE80211_ADDR_LEN]; + uint8_t i_addr3[IEEE80211_ADDR_LEN]; + uint8_t i_seq[2]; + uint8_t i_addr4[IEEE80211_ADDR_LEN]; + uint8_t i_ht[4]; +} __packed; + +struct ieee80211_ht_qosframe_addr4 { + uint8_t i_fc[2]; + uint8_t i_dur[2]; + uint8_t i_addr1[IEEE80211_ADDR_LEN]; + uint8_t i_addr2[IEEE80211_ADDR_LEN]; + uint8_t i_addr3[IEEE80211_ADDR_LEN]; + uint8_t i_seq[2]; + uint8_t i_addr4[IEEE80211_ADDR_LEN]; + uint8_t i_qos[2]; + uint8_t i_ht[4]; +} __packed; + +#define IEEE80211_IS_4ADDRESS(__wh) \ + (((__wh)->i_fc[1] & IEEE80211_FC1_DIR_MASK) == IEEE80211_FC1_DIR_DSTODS) + +struct ieee80211_ctlframe_addr2 { + uint8_t i_fc[2]; + __le16 i_aidordur; /* AID or duration */ + uint8_t i_addr1[IEEE80211_ADDR_LEN]; + uint8_t i_addr2[IEEE80211_ADDR_LEN]; +} __packed; + +struct ieee80211_vht_su_ndpa { + uint8_t i_fc[2]; + uint8_t i_dur[2]; + uint8_t i_addr1[IEEE80211_ADDR_LEN]; + uint8_t i_addr2[IEEE80211_ADDR_LEN]; + uint8_t i_diagtoken; + uint8_t i_sta1_info[2]; +} __packed; + +struct ieee80211_bar_frame { + u_int8_t i_fc[2]; + u_int8_t i_dur[2]; + u_int8_t i_addr1[IEEE80211_ADDR_LEN]; + u_int8_t i_addr2[IEEE80211_ADDR_LEN]; + u_int8_t i_bar_ctl[2]; + __le16 i_back_seq; +} __packed; + +struct ieee80211_vht_mu_ndpa { + uint8_t i_fc[2]; + __le16 i_dur; + uint8_t i_addr1[IEEE80211_ADDR_LEN]; + uint8_t i_addr2[IEEE80211_ADDR_LEN]; + uint8_t i_diagtoken; + uint8_t data[0]; +} __packed; + +struct ieee80211_vht_mu_rpt_poll { + uint8_t i_fc[2]; + __le16 i_dur; + uint8_t i_addr1[IEEE80211_ADDR_LEN]; + uint8_t i_addr2[IEEE80211_ADDR_LEN]; + uint8_t i_fbseg_map; +} __packed; + +#define IEEE80211_FC0_VERSION_MASK 0x03 +#define IEEE80211_FC0_VERSION_SHIFT 0 +#define IEEE80211_FC0_VERSION_0 0x00 +#define IEEE80211_FC0_TYPE_MASK 0x0c +#define IEEE80211_FC0_TYPE_SHIFT 2 +#define IEEE80211_FC0_TYPE_MGT 0x00 +#define IEEE80211_FC0_TYPE_CTL 0x04 +#define IEEE80211_FC0_TYPE_DATA 0x08 + +#define IEEE80211_FC0_SUBTYPE_MASK 0xf0 +#define IEEE80211_FC0_SUBTYPE_SHIFT 4 +/* for TYPE_MGT */ +#define IEEE80211_FC0_SUBTYPE_ASSOC_REQ 0x00 +#define IEEE80211_FC0_SUBTYPE_ASSOC_RESP 0x10 +#define IEEE80211_FC0_SUBTYPE_REASSOC_REQ 0x20 +#define IEEE80211_FC0_SUBTYPE_REASSOC_RESP 0x30 +#define IEEE80211_FC0_SUBTYPE_PROBE_REQ 0x40 +#define IEEE80211_FC0_SUBTYPE_PROBE_RESP 0x50 +#define IEEE80211_FC0_SUBTYPE_BEACON 0x80 +#define IEEE80211_FC0_SUBTYPE_ATIM 0x90 +#define IEEE80211_FC0_SUBTYPE_DISASSOC 0xa0 +#define IEEE80211_FC0_SUBTYPE_AUTH 0xb0 +#define IEEE80211_FC0_SUBTYPE_DEAUTH 0xc0 +#define IEEE80211_FC0_SUBTYPE_ACTION 0xd0 +#define IEEE80211_FC0_SUBTYPE_ACTION_NOACK 0xe0 +/* for TYPE_CTL */ +#define IEEE80211_FC0_SUBTYPE_VHT_RPT_POLL 0x40 +#define IEEE80211_FC0_SUBTYPE_VHT_NDPA 0x50 +#define IEEE80211_FC0_SUBTYPE_BAR 0x80 +#define IEEE80211_FC0_SUBTYPE_BA 0x90 +#define IEEE80211_FC0_SUBTYPE_PS_POLL 0xa0 +#define IEEE80211_FC0_SUBTYPE_RTS 0xb0 +#define IEEE80211_FC0_SUBTYPE_CTS 0xc0 +#define IEEE80211_FC0_SUBTYPE_ACK 0xd0 +#define IEEE80211_FC0_SUBTYPE_CF_END 0xe0 +#define IEEE80211_FC0_SUBTYPE_CF_END_ACK 0xf0 +/* for TYPE_DATA (bit combination) */ +#define IEEE80211_FC0_SUBTYPE_DATA 0x00 +#define IEEE80211_FC0_SUBTYPE_CF_ACK 0x10 +#define IEEE80211_FC0_SUBTYPE_CF_POLL 0x20 +#define IEEE80211_FC0_SUBTYPE_CF_ACPL 0x30 +#define IEEE80211_FC0_SUBTYPE_NODATA 0x40 +#define IEEE80211_FC0_SUBTYPE_CFACK 0x50 +#define IEEE80211_FC0_SUBTYPE_CFPOLL 0x60 +#define IEEE80211_FC0_SUBTYPE_CF_ACK_CF_ACK 0x70 +#define IEEE80211_FC0_SUBTYPE_QOS 0x80 +#define IEEE80211_FC0_SUBTYPE_QOS_NULL 0xc0 + +#define IEEE80211_FC1_DIR_MASK 0x03 +#define IEEE80211_FC1_DIR_NODS 0x00 /* STA->STA */ +#define IEEE80211_FC1_DIR_TODS 0x01 /* STA->AP */ +#define IEEE80211_FC1_DIR_FROMDS 0x02 /* AP ->STA */ +#define IEEE80211_FC1_DIR_DSTODS 0x03 /* AP ->AP */ + +#define IEEE80211_FC1_MORE_FRAG 0x04 +#define IEEE80211_FC1_RETRY 0x08 +#define IEEE80211_FC1_PWR_MGT 0x10 +#define IEEE80211_FC1_MORE_DATA 0x20 +#define IEEE80211_FC1_PROT 0x40 +#define IEEE80211_FC1_WEP 0x40 +#define IEEE80211_FC1_ORDER 0x80 + +#define IEEE80211_SEQ_FRAG_MASK 0x000f +#define IEEE80211_SEQ_FRAG_SHIFT 0 +#define IEEE80211_SEQ_SEQ_MASK 0xfff0 +#define IEEE80211_SEQ_SEQ_SHIFT 4 +#define IEEE80211_SEQ_RANGE 4096 +#define IEEE80211_SEQ_ORDERLAG 64 + +#define IEEE80211_MU_NDPA_TOKEN_MASK 0xFC +#define IEEE80211_MU_NDPA_TOKEN_SHIFT 2 +#define IEEE80211_MU_NDPA_RSRV_MASK 0x03 +#define IEEE80211_MU_NDPA_RSRV_SHIFT 0 + +#define IEEE80211_SEQ_ADD(seq, offset) \ + (((seq) + (offset)) & (IEEE80211_SEQ_RANGE - 1)) +#define IEEE80211_SEQ_SUB(seq, offset) \ + (((seq) + IEEE80211_SEQ_RANGE - (offset)) & (IEEE80211_SEQ_RANGE - 1)) +#define IEEE80211_SEQ_DIFF(seq_front, seq_back) \ + (((seq_front) + IEEE80211_SEQ_RANGE - (seq_back)) & (IEEE80211_SEQ_RANGE - 1)) +#define IEEE80211_SEQ_INORDER_LAG(seq_front, seq_back, seq_lag) \ + (IEEE80211_SEQ_DIFF((seq_front), (seq_back)) < (seq_lag)) +#define IEEE80211_SEQ_INORDER(seq_front, seq_back) \ + IEEE80211_SEQ_INORDER_LAG((seq_front), (seq_back), IEEE80211_SEQ_ORDERLAG) + +#define IEEE80211_SEQ_LEQ(a,b) ((int)((a)-(b)) <= 0) +#define IEEE80211_SEQ_EQ(a,b) ((a) == (b)) + +#define IEEE80211_NWID_LEN 32 + +#define IEEE80211_QOS_TXOP 0x00ff +/* bit 8 is reserved */ +#define IEEE80211_QOS_ACKPOLICY 0x60 +#define IEEE80211_QOS_ACKPOLICY_S 5 +#define IEEE80211_QOS_EOSP 0x10 +#define IEEE80211_QOS_EOSP_S 4 +#define IEEE80211_QOS_TID 0x0f +#define IEEE80211_QOS_A_MSDU_PRESENT 0x80 +#define IEEE80211_QOS_BLOCK_ACK_POLICY 0x60 + +/* bit 1 is reserved */ +#define IEEE80211_HTC0_TRQ 0x02 +#define IEEE80211_HTC0_MAI_MASK 0x3C +#define IEEE80211_HTC0_MAI_SHIFT 2 +#define IEEE80211_HTC0_MFSI_LOW_MASK 0xC0 +#define IEEE80211_HTC0_MFSI_LOW_SHIFT 6 + +#define IEEE80211_HTC1_MFSI_HIGH 0x01 +#define IEEE80211_HTC1_MFB_ASEL_MASK 0xFE +#define IEEE80211_HTC1_MFB_ASEL_SHIFT 1 + +#define IEEE80211_HTC2_CALIB_POS_MASK 0x03 +#define IEEE80211_HTC2_CALIB_POS_SHIFT 0 +#define IEEE80211_HTC2_CALIB_SEQ_MASK 0x0C +#define IEEE80211_HTC2_CALIB_SEQ_SHIFT 2 +/* bits 4-5 are reserved */ +#define IEEE80211_HTC2_CSI_STEER_MASK 0xC0 +#define IEEE80211_HTC2_CSI_STEER_SHIFT 6 + +#define IEEE80211_HTC3_NDP_ANNOUNCE 0x01 +/* bits 1-5 are reserved */ +#define IEEE80211_HTC3_AC_CONSTRAINT 0x40 +#define IEEE80211_HTC3_MORE_PPDU_RDG 0x80 + + + + + + +/* + * Country/Region Codes from MS WINNLS.H + * Numbering from ISO 3166 + * XXX belongs elsewhere + * + * First 2 entries taken from ieee80211.c ... + */ +enum CountryCode { + CTRY_DEBUG = 0x1ff, /* debug, = 511 radix 10 */ + CTRY_DEFAULT = 0, /* default or not defined */ + + CTRY_AFGHANISTAN = 4, /* Afghanistan */ + CTRY_ALBANIA = 8, /* Albania */ + CTRY_ALGERIA = 12, /* Algeria */ + CTRY_AMERICAN_SAMOA = 16, /* American Samoa */ + CTRY_ANDORRA = 20, /* Andorra */ + CTRY_ANGOLA = 24, /* Angola */ + CTRY_ANGUILLA = 660, + CTRY_ANTARTICA = 10, /* Antartica */ + CTRY_ANTIGUA = 28, /* Antigua and Barbuda */ + CTRY_ARGENTINA = 32, /* Argentina */ + CTRY_ARMENIA = 51, /* Armenia */ + CTRY_ARUBA = 533, /* Aruba */ + CTRY_AUSTRALIA = 36, /* Australia */ + CTRY_AUSTRIA = 40, /* Austria */ + CTRY_AZERBAIJAN = 31, /* Azerbaijan */ + CTRY_BAHAMAS = 44, /* Bahamas */ + CTRY_BAHRAIN = 48, /* Bahrain */ + CTRY_BANGLADESH = 50, /* Bangladesh */ + CTRY_BARBADOS = 52, + CTRY_BELARUS = 112, /* Belarus */ + CTRY_BELGIUM = 56, /* Belgium */ + CTRY_BELIZE = 84, /* Belize */ + CTRY_BENIN = 204, + CTRY_BERMUDA = 60, + CTRY_BHUTAN = 64, + CTRY_BOLIVIA = 68, /* Bolivia */ + CTRY_BOSNIA_AND_HERZEGOWINA = 70, + CTRY_BOTSWANA = 72, + CTRY_BOUVET_ISLAND = 74, + CTRY_BRAZIL = 76, /* Brazil */ + CTRY_BRITISH_INDIAN_OCEAN_TERRITORY = 86, + CTRY_BRUNEI_DARUSSALAM = 96, /* Brunei Darussalam */ + CTRY_BULGARIA = 100, /* Bulgaria */ + CTRY_BURKINA_FASO = 854, + CTRY_BURUNDI = 108, + CTRY_CAMBODIA = 116, + CTRY_CAMEROON = 120, + CTRY_CANADA = 124, /* Canada */ + CTRY_CAPE_VERDE = 132, + CTRY_CAYMAN_ISLANDS = 136, + CTRY_CENTRAL_AFRICAN_REPUBLIC = 140, + CTRY_CHAD = 148, + CTRY_CHILE = 152, /* Chile */ + CTRY_CHINA = 156, /* People's Republic of China */ + CTRY_CHRISTMAS_ISLAND = 162, + CTRY_COCOS_ISLANDS = 166, + CTRY_COLOMBIA = 170, /* Colombia */ + CTRY_COMOROS = 174, + CTRY_CONGO = 178, + CTRY_COOK_ISLANDS = 184, + CTRY_COSTA_RICA = 188, /* Costa Rica */ + CTRY_COTE_DIVOIRE = 384, + CTRY_CROATIA = 191, /* Croatia */ + CTRY_CYPRUS = 196, + CTRY_CZECH = 203, /* Czech Republic */ + CTRY_DENMARK = 208, /* Denmark */ + CTRY_DJIBOUTI = 262, + CTRY_DOMINICA = 212, + CTRY_DOMINICAN_REPUBLIC = 214, /* Dominican Republic */ + CTRY_ECUADOR = 218, /* Ecuador */ + CTRY_EUROPE = 200, /* European Union */ + CTRY_EGYPT = 818, /* Egypt */ + CTRY_EL_SALVADOR = 222, /* El Salvador */ + CTRY_EQUATORIAL_GUINEA = 226, + CTRY_ERITREA = 232, + CTRY_ESTONIA = 233, /* Estonia */ + CTRY_ETHIOPIA = 210, + CTRY_FALKLAND_ISLANDS = 238, /* (Malvinas) */ + CTRY_FAEROE_ISLANDS = 234, /* Faeroe Islands */ + CTRY_FIJI = 242, + CTRY_FINLAND = 246, /* Finland */ + CTRY_FRANCE = 250, /* France */ + CTRY_FRANCE2 = 255, /* France2 */ + CTRY_FRENCH_GUIANA = 254, + CTRY_FRENCH_POLYNESIA = 258, + CTRY_FRENCH_SOUTHERN_TERRITORIES = 260, + CTRY_GABON = 266, + CTRY_GAMBIA = 270, + CTRY_GEORGIA = 268, /* Georgia */ + CTRY_GERMANY = 276, /* Germany */ + CTRY_GHANA = 288, + CTRY_GIBRALTAR = 292, + CTRY_GREECE = 300, /* Greece */ + CTRY_GREENLAND = 304, + CTRY_GRENADA = 308, + CTRY_GUADELOUPE = 312, + CTRY_GUAM = 316, + CTRY_GUATEMALA = 320, /* Guatemala */ + CTRY_GUINEA = 324, + CTRY_GUINEA_BISSAU = 624, + CTRY_GUYANA = 328, + CTRY_HAITI = 332, + CTRY_HONDURAS = 340, /* Honduras */ + CTRY_HONG_KONG = 344, /* Hong Kong S.A.R., P.R.C. */ + CTRY_HUNGARY = 348, /* Hungary */ + CTRY_ICELAND = 352, /* Iceland */ + CTRY_INDIA = 356, /* India */ + CTRY_INDONESIA = 360, /* Indonesia */ + CTRY_IRAN = 364, /* Iran */ + CTRY_IRAQ = 368, /* Iraq */ + CTRY_IRELAND = 372, /* Ireland */ + CTRY_ISRAEL = 376, /* Israel */ + CTRY_ITALY = 380, /* Italy */ + CTRY_JAMAICA = 388, /* Jamaica */ + CTRY_JAPAN = 392, /* Japan */ + CTRY_JAPAN1 = 393, /* Japan (JP1) */ + CTRY_JAPAN2 = 394, /* Japan (JP0) */ + CTRY_JAPAN3 = 395, /* Japan (JP1-1) */ + CTRY_JAPAN4 = 396, /* Japan (JE1) */ + CTRY_JAPAN5 = 397, /* Japan (JE2) */ + CTRY_JAPAN6 = 399, /* Japan (JP6) */ + CTRY_JAPAN7 = 900, /* Japan */ + CTRY_JAPAN8 = 901, /* Japan */ + CTRY_JAPAN9 = 902, /* Japan */ + CTRY_JAPAN10 = 903, /* Japan */ + CTRY_JAPAN11 = 904, /* Japan */ + CTRY_JAPAN12 = 905, /* Japan */ + CTRY_JAPAN13 = 906, /* Japan */ + CTRY_JAPAN14 = 907, /* Japan */ + CTRY_JAPAN15 = 908, /* Japan */ + CTRY_JAPAN16 = 909, /* Japan */ + CTRY_JAPAN17 = 910, /* Japan */ + CTRY_JAPAN18 = 911, /* Japan */ + CTRY_JAPAN19 = 912, /* Japan */ + CTRY_JAPAN20 = 913, /* Japan */ + CTRY_JAPAN21 = 914, /* Japan */ + CTRY_JAPAN22 = 915, /* Japan */ + CTRY_JAPAN23 = 916, /* Japan */ + CTRY_JAPAN24 = 917, /* Japan */ + CTRY_JAPAN25 = 918, /* Japan */ + CTRY_JAPAN26 = 919, /* Japan */ + CTRY_JAPAN27 = 920, /* Japan */ + CTRY_JAPAN28 = 921, /* Japan */ + CTRY_JAPAN29 = 922, /* Japan */ + CTRY_JAPAN30 = 923, /* Japan */ + CTRY_JAPAN31 = 924, /* Japan */ + CTRY_JAPAN32 = 925, /* Japan */ + CTRY_JAPAN33 = 926, /* Japan */ + CTRY_JAPAN34 = 927, /* Japan */ + CTRY_JAPAN35 = 928, /* Japan */ + CTRY_JAPAN36 = 929, /* Japan */ + CTRY_JAPAN37 = 930, /* Japan */ + CTRY_JAPAN38 = 931, /* Japan */ + CTRY_JAPAN39 = 932, /* Japan */ + CTRY_JAPAN40 = 933, /* Japan */ + CTRY_JAPAN41 = 934, /* Japan */ + CTRY_JAPAN42 = 935, /* Japan */ + CTRY_JAPAN43 = 936, /* Japan */ + CTRY_JAPAN44 = 937, /* Japan */ + CTRY_JAPAN45 = 938, /* Japan */ + CTRY_JAPAN46 = 939, /* Japan */ + CTRY_JAPAN47 = 940, /* Japan */ + CTRY_JAPAN48 = 941, /* Japan */ + CTRY_JORDAN = 400, /* Jordan */ + CTRY_KAZAKHSTAN = 398, /* Kazakhstan */ + CTRY_KENYA = 404, /* Kenya */ + CTRY_KOREA_NORTH = 408, /* North Korea */ + CTRY_KOREA_ROC = 410, /* South Korea */ + CTRY_KOREA_ROC2 = 411, /* South Korea */ + CTRY_KUWAIT = 414, /* Kuwait */ + CTRY_LATVIA = 428, /* Latvia */ + CTRY_LEBANON = 422, /* Lebanon */ + CTRY_LIBYA = 434, /* Libya */ + CTRY_LIECHTENSTEIN = 438, /* Liechtenstein */ + CTRY_LITHUANIA = 440, /* Lithuania */ + CTRY_LUXEMBOURG = 442, /* Luxembourg */ + CTRY_MACAU = 446, /* Macau */ + CTRY_MACEDONIA = 807, /* the Former Yugoslav Republic of Macedonia */ + CTRY_MALAYSIA = 458, /* Malaysia */ + CTRY_MEXICO = 484, /* Mexico */ + CTRY_MONACO = 492, /* Principality of Monaco */ + CTRY_MOROCCO = 504, /* Morocco */ + CTRY_NEPAL = 524, /* Nepal */ + CTRY_NETHERLANDS = 528, /* Netherlands */ + CTRY_NEW_ZEALAND = 554, /* New Zealand */ + CTRY_NICARAGUA = 558, /* Nicaragua */ + CTRY_NORWAY = 578, /* Norway */ + CTRY_OMAN = 512, /* Oman */ + CTRY_PAKISTAN = 586, /* Islamic Republic of Pakistan */ + CTRY_PANAMA = 591, /* Panama */ + CTRY_PARAGUAY = 600, /* Paraguay */ + CTRY_PERU = 604, /* Peru */ + CTRY_PHILIPPINES = 608, /* Republic of the Philippines */ + CTRY_POLAND = 616, /* Poland */ + CTRY_PORTUGAL = 620, /* Portugal */ + CTRY_PUERTO_RICO = 630, /* Puerto Rico */ + CTRY_QATAR = 634, /* Qatar */ + CTRY_ROMANIA = 642, /* Romania */ + CTRY_RUSSIA = 643, /* Russia */ + CTRY_SAUDI_ARABIA = 682, /* Saudi Arabia */ + CTRY_SINGAPORE = 702, /* Singapore */ + CTRY_SLOVAKIA = 703, /* Slovak Republic */ + CTRY_SLOVENIA = 705, /* Slovenia */ + CTRY_SOUTH_AFRICA = 710, /* South Africa */ + CTRY_SPAIN = 724, /* Spain */ + CTRY_SRILANKA = 144, /* Sri Lanka */ + CTRY_SWEDEN = 752, /* Sweden */ + CTRY_SWITZERLAND = 756, /* Switzerland */ + CTRY_SYRIA = 760, /* Syria */ + CTRY_TAIWAN = 158, /* Taiwan */ + CTRY_THAILAND = 764, /* Thailand */ + CTRY_TRINIDAD_Y_TOBAGO = 780, /* Trinidad y Tobago */ + CTRY_TUNISIA = 788, /* Tunisia */ + CTRY_TURKEY = 792, /* Turkey */ + CTRY_UAE = 784, /* U.A.E. */ + CTRY_UKRAINE = 804, /* Ukraine */ + CTRY_UNITED_KINGDOM = 826, /* United Kingdom */ + CTRY_UNITED_STATES = 840, /* United States */ + CTRY_UNITED_STATES_FCC49 = 842, /* United States (Public Safety)*/ + CTRY_URUGUAY = 858, /* Uruguay */ + CTRY_UZBEKISTAN = 860, /* Uzbekistan */ + CTRY_VENEZUELA = 862, /* Venezuela */ + CTRY_VIET_NAM = 704, /* Viet Nam */ + CTRY_YEMEN = 887, /* Yemen */ + CTRY_ZIMBABWE = 716 /* Zimbabwe */ +}; + +#define IEEE80211_IE_ID_LEN_SIZE 2 + +/* + * Generic information element + */ +struct ieee80211_ie { + uint8_t id; + uint8_t len; + uint8_t info[0]; +} __packed; + +/* + * Country information element. + */ +#define IEEE80211_COUNTRY_MAX_TRIPLETS (83) +struct ieee80211_ie_country { + uint8_t country_id; + uint8_t country_len; + uint8_t country_str[3]; + uint8_t country_triplet[IEEE80211_COUNTRY_MAX_TRIPLETS * 3]; +} __packed; + +/* + * Channel Switch Announcement information element. + */ +struct ieee80211_ie_csa { + uint8_t csa_id; /* IEEE80211_ELEMID_CHANSWITCHANN */ + uint8_t csa_len; /* == 3 */ + uint8_t csa_mode; /* Channel Switch Mode: 1 == stop transmission until CS */ + uint8_t csa_chan; /* New Channel Number */ + uint8_t csa_count; /* TBTTs until Channel Switch happens */ +} __packed; + +/* for Spectrum Management Actions. Table 20e in 802.11h $7.4.1 */ +#define IEEE80211_ACTION_S_MEASUREMENT_REQUEST 0 +#define IEEE80211_ACTION_S_MEASUREMENT_REPORT 1 +#define IEEE80211_ACTION_S_TPC_REQUEST 2 +#define IEEE80211_ACTION_S_TPC_REPORT 3 +#define IEEE80211_ACTION_S_CHANSWITCHANN 4 + +/* for csa_mode. It must be either 0 or 1. 1 means that the receiver shall stop + * sending until CS. 0 imposes no requirement. See 7.3.2.20 */ +#define IEEE80211_CSA_CAN_STOP_TX 0 +#define IEEE80211_CSA_MUST_STOP_TX 1 + +/* minimal Channel Switch Count in the initial announcement */ +#define IEEE80211_CSA_PROTECTION_PERIOD 3 + +/* maximum allowed deviance of measurement of intervals between CSA in Beacons */ +#define IEEE80211_CSA_SANITY_THRESHOLD 100 + +/* Quantenna CSA tsf ie, to complement an 802.11h CSA ie. More timing precision */ +struct ieee80211_ie_qtn_csa_tsf { + uint8_t id; /* IEEE80211_ELEMID_VENDOR */ + uint8_t len; /* length in bytes */ + uint8_t qtn_ie_oui[3]; /* QTN_OUI - 0x00, 0x26, 0x86*/ + uint8_t qtn_ie_type; /* IE type */ + uint64_t tsf; /* TSF at which channel change happens. */ +} __packed; + +/* Quantenna SCS IE */ +#define QTN_SCS_IE_TYPE_STA_INTF_RPT 0x1 +struct ieee80211_ie_qtn_scs { + uint8_t id; /* IEEE80211_ELEMID_VENDOR */ + uint8_t len; /* length in bytes */ + uint8_t qtn_ie_oui[3]; /* QTN_OUI - 0x00, 0x26, 0x86*/ + uint8_t qtn_ie_type; /* IE type */ + uint8_t scs_ie_type; /* for future expansion and backward compatibility */ + /* following depends on scs_ie_type */ + uint32_t sp_fail; /* short preamble failure in last second */ + uint32_t lp_fail; /* long preamble failure in last second */ + uint16_t others_time; /* rx + tx time for all nodes */ + uint16_t extra_ie_len; /* extra ie len */ + uint8_t extra_ie[0]; /* tdls stats */ +} __packed; +#define QTN_SCS_IE_LEN_MIN 7 /* till scs ie type */ +#define QTN_SCS_IE_STA_INTF_RPT_LEN_MIN (QTN_SCS_IE_LEN_MIN + 8) + +#define IEEE80211_IS_ALL_SET(__flags__, __msb__) \ + (((__flags__) & ((1 << ((__msb__)+1)) - 1)) == ((1 << ((__msb__)+1)) - 1)) + +/* does frame have QoS sequence control data */ +#define IEEE80211_QOS_HAS_SEQ(wh) \ + (((wh)->i_fc[0] & \ + (IEEE80211_FC0_TYPE_MASK | IEEE80211_FC0_SUBTYPE_QOS)) == \ + (IEEE80211_FC0_TYPE_DATA | IEEE80211_FC0_SUBTYPE_QOS)) + +#define WME_QOSINFO_COUNT 0x0f /* Mask for Param Set Count field */ +#define WMM_OUI_BYTES 0x00, 0x50, 0xf2 +/* + * WME/802.11e information element. + */ +struct ieee80211_ie_wme { + uint8_t wme_id; /* IEEE80211_ELEMID_VENDOR */ + uint8_t wme_len; /* length in bytes */ + uint8_t wme_oui[3]; /* 0x00, 0x50, 0xf2 */ + uint8_t wme_type; /* OUI type */ + uint8_t wme_subtype; /* OUI subtype */ + uint8_t wme_version; /* spec revision */ + uint8_t wme_info; /* QoS info */ +} __packed; + +/* + * WME/802.11e Tspec Element + */ +struct ieee80211_wme_tspec { + uint8_t ts_id; + uint8_t ts_len; + uint8_t ts_oui[3]; + uint8_t ts_oui_type; + uint8_t ts_oui_subtype; + uint8_t ts_version; + uint8_t ts_tsinfo[3]; + uint8_t ts_nom_msdu[2]; + uint8_t ts_max_msdu[2]; + uint8_t ts_min_svc[4]; + uint8_t ts_max_svc[4]; + uint8_t ts_inactv_intv[4]; + uint8_t ts_susp_intv[4]; + uint8_t ts_start_svc[4]; + uint8_t ts_min_rate[4]; + uint8_t ts_mean_rate[4]; + uint8_t ts_max_burst[4]; + uint8_t ts_min_phy[4]; + uint8_t ts_peak_rate[4]; + uint8_t ts_delay[4]; + uint8_t ts_surplus[2]; + uint8_t ts_medium_time[2]; +} __packed; + +/* + * WME AC parameter field + */ + +struct ieee80211_wme_acparams { + uint8_t acp_aci_aifsn; + uint8_t acp_logcwminmax; + uint16_t acp_txop; +} __packed; + +#define IEEE80211_WME_PARAM_LEN 24 +#define WME_NUM_TID 16 /* 16 tids */ +#define WME_NUM_AC 4 /* 4 AC categories */ +#define WME_TID_UNKNOWN (-1) +#define WME_TID_NONQOS (-2) +#define WME_TID_VALID(_tid) (((_tid) >= 0) && ((_tid) < WME_NUM_TID)) + +#define WME_PARAM_ACI 0x60 /* Mask for ACI field */ +#define WME_PARAM_ACI_S 5 /* Shift for ACI field */ +#define WME_PARAM_ACM 0x10 /* Mask for ACM bit */ +#define WME_PARAM_ACM_S 4 /* Shift for ACM bit */ +#define WME_PARAM_AIFSN 0x0f /* Mask for aifsn field */ +#define WME_PARAM_AIFSN_S 0 /* Shift for aifsn field */ +#define WME_PARAM_LOGCWMIN 0x0f /* Mask for CwMin field (in log) */ +#define WME_PARAM_LOGCWMIN_S 0 /* Shift for CwMin field */ +#define WME_PARAM_LOGCWMAX 0xf0 /* Mask for CwMax field (in log) */ +#define WME_PARAM_LOGCWMAX_S 4 /* Shift for CwMax field */ + +#define WME_AC_TO_TID(_ac) ( \ + ((_ac) == WME_AC_VO) ? 6 : \ + ((_ac) == WME_AC_VI) ? 5 : \ + ((_ac) == WME_AC_BK) ? 1 : \ + 0) + +#define TID_TO_WME_AC(_tid) \ + ((((_tid) == 0) || ((_tid) == 3)) ? WME_AC_BE : \ + ((_tid) < 3) ? WME_AC_BK : \ + ((_tid) < 6) ? WME_AC_VI : \ + WME_AC_VO) + +/* + * WME Parameter Element + */ +struct ieee80211_wme_param { + uint8_t param_id; + uint8_t param_len; + uint8_t param_oui[3]; + uint8_t param_oui_type; + uint8_t param_oui_sybtype; + uint8_t param_version; + uint8_t param_qosInfo; + uint8_t param_reserved; + struct ieee80211_wme_acparams params_acParams[WME_NUM_AC]; +} __packed; + +/* + * WME U-APSD qos info field defines + */ +#define WME_CAPINFO_UAPSD_EN 0x00000080 +#define WME_CAPINFO_UAPSD_VO 0x00000001 +#define WME_CAPINFO_UAPSD_VI 0x00000002 +#define WME_CAPINFO_UAPSD_BK 0x00000004 +#define WME_CAPINFO_UAPSD_BE 0x00000008 +#define WME_CAPINFO_UAPSD_ACFLAGS_SHIFT 0 +#define WME_CAPINFO_UAPSD_ACFLAGS_MASK 0xF +#define WME_CAPINFO_UAPSD_MAXSP_SHIFT 5 +#define WME_CAPINFO_UAPSD_MAXSP_MASK 0x3 +#define WME_CAPINFO_IE_OFFSET 8 +#define WME_UAPSD_MAXSP(_qosinfo) (((_qosinfo) >> WME_CAPINFO_UAPSD_MAXSP_SHIFT) & WME_CAPINFO_UAPSD_MAXSP_MASK) +#define WME_UAPSD_AC_ENABLED(_ac, _qosinfo) ( (1<<(3 - (_ac))) & \ + (((_qosinfo) >> WME_CAPINFO_UAPSD_ACFLAGS_SHIFT) & WME_CAPINFO_UAPSD_ACFLAGS_MASK) ) + +struct ieee80211_extcap_param { + u_int8_t param_id; + u_int8_t param_len; + u_int8_t ext_cap[8]; +} __packed; + +/* byte 7 */ +#define IEEE80211_EXTCAP_OPMODE_NOTIFICATION 0x40 +#define IEEE80211_EXTCAP_MAX_MSDU_IN_AMSDU 0xC0 +#define IEEE80211_EXTCAP_MAX_MSDU_IN_AMSDU_S 6 + +/* + * Atheros Advanced Capability information element. + */ +struct ieee80211_ie_athAdvCap { + uint8_t athAdvCap_id; /* IEEE80211_ELEMID_VENDOR */ + uint8_t athAdvCap_len; /* length in bytes */ + uint8_t athAdvCap_oui[3]; /* 0x00, 0x03, 0x7f */ + uint8_t athAdvCap_type; /* OUI type */ + uint8_t athAdvCap_subtype; /* OUI subtype */ + uint8_t athAdvCap_version; /* spec revision */ + uint8_t athAdvCap_capability; /* Capability info */ + uint16_t athAdvCap_defKeyIndex; +} __packed; + +/* + * Atheros XR information element. + */ +struct ieee80211_xr_param { + uint8_t param_id; + uint8_t param_len; + uint8_t param_oui[3]; + uint8_t param_oui_type; + uint8_t param_oui_sybtype; + uint8_t param_version; + uint8_t param_Info; + uint8_t param_base_bssid[IEEE80211_ADDR_LEN]; + uint8_t param_xr_bssid[IEEE80211_ADDR_LEN]; + uint16_t param_xr_beacon_interval; + uint8_t param_base_ath_capability; + uint8_t param_xr_ath_capability; +} __packed; + +/* Atheros capabilities */ +#define IEEE80211_ATHC_TURBOP 0x0001 /* Turbo Prime */ +#define IEEE80211_ATHC_COMP 0x0002 /* Compression */ +#define IEEE80211_ATHC_FF 0x0004 /* Fast Frames */ +#define IEEE80211_ATHC_XR 0x0008 /* Xtended Range support */ +#define IEEE80211_ATHC_AR 0x0010 /* Advanced Radar support */ +#define IEEE80211_ATHC_BURST 0x0020 /* Bursting - not negotiated */ +#define IEEE80211_ATHC_WME 0x0040 /* CWMin tuning */ +#define IEEE80211_ATHC_BOOST 0x0080 /* Boost */ + +/* + * Quantenna Flags information element. + * Fields up to qtn_ie_implicit_ba_tid are backwards-compatible with Envy images. + */ +struct ieee80211_ie_qtn { + uint8_t qtn_ie_id; /* IEEE80211_ELEMID_VENDOR */ + uint8_t qtn_ie_len; /* length in bytes */ + uint8_t qtn_ie_oui[3]; /* QTN_OUI - 0x00, 0x26, 0x86 */ + uint8_t qtn_ie_type; /* IE type */ + uint8_t qtn_ie_flags; /* See below */ + + /* V2 fields */ + uint8_t qtn_ie_implicit_ba_tid;/* Implicit block ACKs, set up directly after assoc */ + uint8_t qtn_ie_my_flags; /* See below */ + + /* V3 fields */ + /* Implicit block ACK with variable size - overrides v2 implicit BA field. */ + uint8_t qtn_ie_implicit_ba_tid_h; + uint8_t qtn_ie_implicit_ba_size; /* Size of implicit BA >> 2 */ + + /* V4 fields */ + uint8_t qtn_ie_vsp_version; /* VSP version */ + + /* V5 fields */ + uint32_t qtn_ie_ver_sw; + uint16_t qtn_ie_ver_hw; + uint16_t qtn_ie_ver_platform_id; + uint32_t qtn_ie_ver_timestamp; + uint32_t qtn_ie_ver_flags; + uint32_t qtn_ie_rate_train; +} __packed; + +#ifdef CONFIG_QVSP +/* + * Quantenna WME information element. + */ +struct ieee80211_ie_qtn_wme { + uint8_t qtn_ie_id; /* IEEE80211_ELEMID_VENDOR */ + uint8_t qtn_ie_len; /* length in bytes */ + uint8_t qtn_ie_oui[3]; /* QTN_OUI - 0x00, 0x26, 0x86*/ + uint8_t qtn_ie_type; /* IE type */ + uint8_t qtn_wme_ie_version; + struct ieee80211_wme_param qtn_wme_ie; +} __packed; +#endif + +#define QTN_PAIRING_TLV_HASH_LEN 32 +/* + * QTN Pairing TLV element. + * Format: + * Type(1byte) | len(2bytes) | SHA-256 hash(32bytes) + * 0x1 | 35 | SHA-256 hash material of pairing + */ +struct ieee80211_ie_qtn_pairing_tlv { + uint8_t qtn_pairing_tlv_type; + uint16_t qtn_pairing_tlv_len; + uint8_t qtn_pairing_tlv_hash[QTN_PAIRING_TLV_HASH_LEN]; +} __packed; + +/* + * QTN Pairing IE + * Format: + * IE ID(1byte) | IE len(1byte) | IE OUI(3bytes) | IE content(pairing) + * 0xdd | 38 | 00 26 86 | Pairing TLV + * + */ +struct ieee80211_ie_qtn_pairing { + uint8_t qtn_pairing_ie_id; + uint8_t qtn_pairing_ie_len; + uint8_t qtn_pairing_ie_oui[3]; + struct ieee80211_ie_qtn_pairing_tlv qtn_pairing_tlv; +} __packed; + +#define IEEE80211_QTN_IE_BA_SIZE_SH 2 + +enum ieee80211_vsp_version { + IEEE80211_QTN_VSP_V_NONE, + IEEE80211_QTN_VSP_V1, +}; + +#ifdef CONFIG_QVSP + +#ifdef TOPAZ_PLATFORM +/* Disable Station side control for QTM-Lite */ +#define IEEE80211_QTN_VSP_VERSION IEEE80211_QTN_VSP_V_NONE +#else +#define IEEE80211_QTN_VSP_VERSION IEEE80211_QTN_VSP_V1 +#endif +struct ieee80211_ie_vsp_item { + uint8_t index; + uint32_t value; +} __packed; + +struct ieee80211_ie_vsp { + uint8_t id; + uint8_t len; + uint8_t oui[3]; + uint8_t type; + uint8_t item_cnt; + struct ieee80211_ie_vsp_item item[0]; +} __packed; + +#else /* not CONFIG_QVSP */ + +#define IEEE80211_QTN_VSP_VERSION IEEE80211_QTN_VSP_V_NONE + +#endif /* CONFIG_QVSP */ + +#define IEEE80211_QTN_TYPE_ENVY_LEGACY(qtnie) \ + ((qtnie)->qtn_ie_len <= (&(qtnie)->qtn_ie_my_flags - &(qtnie)->qtn_ie_oui[0])) +#define IEEE80211_QTN_TYPE_ENVY(qtnie) \ + ((IEEE80211_QTN_TYPE_ENVY_LEGACY(qtnie)) || \ + ((qtnie)->qtn_ie_my_flags & IEEE80211_QTN_ENVY)) + +#define IEEE80211_QTN_FLAGS_ENVY (IEEE80211_QTN_BRIDGEMODE | IEEE80211_QTN_BF_VER1) +#define IEEE80211_QTN_FLAGS_ENVY_DFLT IEEE80211_QTN_BF_VER1 +#ifdef TXBF_6_STA_BF +#define IEEE80211_QTN_CAPS_DFLT IEEE80211_QTN_BF_VER2 | IEEE80211_QTN_BF_VER3 | \ + IEEE80211_QTN_BF_VER4 | IEEE80211_QTN_TX_AMSDU +#else +#define IEEE80211_QTN_CAPS_DFLT IEEE80211_QTN_BF_VER2 | IEEE80211_QTN_BF_VER3 | \ + IEEE80211_QTN_TX_AMSDU +#endif + +/* + * These flags are used in the following two fields. + * - qtn_ie_flags contains the sender's settings, except in an association response, where + * it contains confirmation of the settings received from the peer station. These flags + * must remain backwards-compatible with Envy images. + * - qtn_ie_my_flags always contains the sender's settings. It is not sent by Envy systems. + */ +#define IEEE80211_QTN_BRIDGEMODE 0x01 /* Use 4-addr headers */ +#define IEEE80211_QTN_BF_VER1 0x02 /* Envy beamforming */ +#define IEEE80211_QTN_BF_VER2 0x04 /* Ruby 2 stream beamforming */ +#define IEEE80211_QTN_LNCB 0x08 /* Multicast packets in the local network + * control block are 4 address encapsulated. + */ +#define IEEE80211_QTN_BF_VER3 0x10 /* Ruby 4 stream non-standard beamforming */ +#define IEEE80211_QTN_ENVY 0x20 /* Envy with 'my flags' field in the IE. */ +#define IEEE80211_QTN_BF_VER4 0x40 /* 4 strm standard bf with tone grouping */ +#define IEEE80211_QTN_TX_AMSDU 0x80 /* Ruby TX AMSDU */ + +#define IEEE80211_QTN_IE_GE_V2(_qtnie) ((_qtnie->qtn_ie_len + IEEE80211_IE_ID_LEN_SIZE) > \ + offsetof(struct ieee80211_ie_qtn, qtn_ie_my_flags)) +#define IEEE80211_QTN_IE_GE_V3(_qtnie) ((_qtnie->qtn_ie_len + IEEE80211_IE_ID_LEN_SIZE) > \ + offsetof(struct ieee80211_ie_qtn, qtn_ie_implicit_ba_size)) +#define IEEE80211_QTN_IE_GE_V4(_qtnie) ((_qtnie->qtn_ie_len + IEEE80211_IE_ID_LEN_SIZE) > \ + offsetof(struct ieee80211_ie_qtn, qtn_ie_vsp_version)) +#define IEEE80211_QTN_IE_GE_V5(_qtnie) ((_qtnie->qtn_ie_len + IEEE80211_IE_ID_LEN_SIZE) > \ + offsetof(struct ieee80211_ie_qtn, qtn_ie_rate_train)) + +/* Quantenna TDLS Discovery Response clients information element */ +struct ieee80211_ie_qtn_tdls_clients { + uint8_t qtn_ie_id; /* IEEE80211_ELEMID_VENDOR */ + uint8_t qtn_ie_len; + uint8_t qtn_ie_oui[3]; /* 0x00, 0x26, 0x86 */ + uint8_t qtn_ie_type; /* IEEE_QTN_IE_TYPE_TDLS_CLIENTS */ + uint8_t qtn_ie_mac_cnt; /* Number of downstream MAC addresses */ +#define IEEE80211_QTN_IE_DOWNSTREAM_MAC_MAX 16 + uint8_t qtn_ie_mac[0]; /* Start of downstream MAC addresses */ +} __packed; + +/* + * Management Notification Frame + */ +struct ieee80211_mnf { + uint8_t mnf_category; + uint8_t mnf_action; + uint8_t mnf_dialog; + uint8_t mnf_status; +} __packed; +#define MNF_SETUP_REQ 0 +#define MNF_SETUP_RESP 1 +#define MNF_TEARDOWN 2 + +/* + * Management Action Frames + */ + +/* generic frame format */ +struct ieee80211_action { + uint8_t ia_category; + uint8_t ia_action; +} __packed; + +/* categories */ +#define IEEE80211_ACTION_CAT_SPEC_MGMT 0 /* Spectrum MGMT */ +#define IEEE80211_ACTION_CAT_QOS 1 /* qos */ +#define IEEE80211_ACTION_CAT_DLS 2 /* dls */ +#define IEEE80211_ACTION_CAT_BA 3 /* block ack */ +#define IEEE80211_ACTION_CAT_PUBLIC 4 /* Public */ +#define IEEE80211_ACTION_CAT_RM 5 /* Radio measurement */ +#define IEEE80211_ACTION_CAT_FBSS 6 /* Fast BSS */ +#define IEEE80211_ACTION_CAT_HT 7 /* HT */ +#define IEEE80211_ACTION_CAT_SA_QUERY 8 /* SA Query */ +#define IEEE80211_ACTION_CAT_PROT_DUAL_PA 9 /* Protected Dual of Public Action */ +#define IEEE80211_ACTION_CAT_WNM 10 /* WNM */ +#define IEEE80211_ACTION_CAT_UNPROT_WNM 11 /* Unprotected WNM */ +#define IEEE80211_ACTION_CAT_TDLS 12 /* TDLS */ +#define IEEE80211_ACTION_CAT_MESH 13 /* Mesh */ +#define IEEE80211_ACTION_CAT_MULTIHOP 14 /* Multihop */ +#define IEEE80211_ACTION_CAT_SELF_PROT 15 /* self protected */ + +#define IEEE80211_ACTION_CAT_VHT 21 /* VHT */ +#define IEEE80211_ACTION_CAT_VEND_PROT 126 /* Protected Vendor specific Action frame */ +#define IEEE80211_ACTION_CAT_VENDOR 0x7F /* Vendor specific Action frame */ + +/* Public Action Frames (7.4.7.1) */ +#define IEEE80211_ACTION_PUB_GAS_IREQ 10 /* GAS Service Initial Request */ +#define IEEE80211_ACTION_PUB_GAS_IRESP 11 /* GAS Service Initial Response */ +#define IEEE80211_ACTION_PUB_GAS_CREQ 12 /* GAS Comeback Request */ +#define IEEE80211_ACTION_PUB_GAS_CRESP 13 /* GAS Comeback Response */ +#define IEEE80211_ACTION_PUB_TDLS_DISC_RESP 14 /* TDLS Discovery Response */ + +static __inline__ int ieee80211_action_is_a_gas(const struct ieee80211_action *ia) +{ + return (ia->ia_category == IEEE80211_ACTION_CAT_PUBLIC) && + (ia->ia_action >= IEEE80211_ACTION_PUB_GAS_IREQ) && + (ia->ia_action <= IEEE80211_ACTION_PUB_GAS_CRESP); +} + +/* TDLS Action Frame details (7.4.11) */ +#define IEEE80211_ACTION_TDLS_SETUP_REQ 0 /* Setup Request */ +#define IEEE80211_ACTION_TDLS_SETUP_RESP 1 /* Setup Response */ +#define IEEE80211_ACTION_TDLS_SETUP_CONFIRM 2 /* Setup Confirm */ +#define IEEE80211_ACTION_TDLS_TEARDOWN 3 /* Teardown */ +#define IEEE80211_ACTION_TDLS_PTI 4 /* Peer Traffic Indication */ +#define IEEE80211_ACTION_TDLS_CS_REQ 5 /* Channel Switch Request */ +#define IEEE80211_ACTION_TDLS_CS_RESP 6 /* Channel Switch Response */ +#define IEEE80211_ACTION_TDLS_PEER_PSM_REQ 7 /* Peer PSM Request */ +#define IEEE80211_ACTION_TDLS_PEER_PSM_RESP 8 /* Peer PSM Response */ +#define IEEE80211_ACTION_TDLS_PEER_TRAF_RESP 9 /* Peer Traffic Response */ +#define IEEE80211_ACTION_TDLS_DISC_REQ 10 /* Discovery Request */ + +struct ieee80211_ie_power_capability { + uint8_t id; + uint8_t len; + uint8_t min_txpwr; + uint8_t max_txpwr; +} __packed; + +struct ieee80211_ie_tpc_report { + uint8_t id; + uint8_t len; + uint8_t tran_power; + uint8_t link_margin; +} __packed; + +#define IEEE80211_CCA_REQMODE_PARALLEL (1 << 0) +#define IEEE80211_CCA_REQMODE_ENABLE (1 << 1) +#define IEEE80211_CCA_REQMODE_REQUEST (1 << 2) +#define IEEE80211_CCA_REQMODE_REPORT (1 << 3) +#define IEEE80211_CCA_REQMODE_DURA_MAN (1 << 4) + +#define IEEE80211_CCA_REPMODE_LATE (1 << 0) +#define IEEE80211_CCA_REPMODE_INCAP (1 << 1) +#define IEEE80211_CCA_REPMODE_REFUSE (1 << 2) + +/* Spectrum Management */ +#define IEEE80211_CCA_MEASTYPE_BASIC 0x00 /* Basic Request */ +#define IEEE80211_CCA_MEASTYPE_CCA 0x01 /* Clear Channel Assessment Request */ +#define IEEE80211_CCA_MEASTYPE_RPI 0x02 /* Receiver Power Indicator (RPI) histogram Request */ +/* Radio Measurement */ +#define IEEE80211_RM_MEASTYPE_CH_LOAD 0x03 /* Channel Load Request */ +#define IEEE80211_RM_MEASTYPE_NOISE 0x04 /* Noise histogram Request */ +#define IEEE80211_RM_MEASTYPE_BEACON 0x05 /* Beacon Request */ +#define IEEE80211_RM_MEASTYPE_FRAME 0x06 /* Frame Request */ +#define IEEE80211_RM_MEASTYPE_STA 0x07 /* STA statistics Request */ +#define IEEE80211_RM_MEASTYPE_LCI 0x08 /* LCI Request */ +#define IEEE80211_RM_MEASTYPE_CATEGORY 0x09 /* Transmit stream/Category Request */ +#define IEEE80211_RM_MEASTYPE_MUL_DIAG 0x0A /* Multicast diagnostics request */ +#define IEEE80211_RM_MEASTYPE_LOC_CIVIC 0x0B /* Location Civic request */ +#define IEEE80211_RM_MEASTYPE_LOC_ID 0x0C /* Location Identifier request */ +#define IEEE80211_RM_MEASTYPE_QTN_CCA 0xFE /* QTN CCA extension */ +#define IEEE80211_RM_MEASTYPE_PAUSE 0xFF /* Measurement Pause Request */ + +/* for Radio Measurement Actions. Table 7-57a in 802.11k $7.4.6 */ +#define IEEE80211_ACTION_R_MEASUREMENT_REQUEST 0 +#define IEEE80211_ACTION_R_MEASUREMENT_REPORT 1 +#define IEEE80211_ACTION_R_LINKMEASURE_REQUEST 2 +#define IEEE80211_ACTION_R_LINKMEASURE_REPORT 3 +#define IEEE80211_ACTION_R_NEIGHBOR_REQUEST 4 +#define IEEE80211_ACTION_R_NEIGHBOR_REPORT 5 + +struct ieee80211_action_sm_measurement_header { + uint8_t ia_category; + uint8_t ia_action; + uint8_t am_token; + uint8_t am_data[0]; +}__packed; + +/* RM - radio measurement request */ +struct ieee80211_action_radio_measure_request { + struct ieee80211_action am_header; + uint8_t am_token; + uint16_t am_rep_num; + uint8_t am_data[0]; +}__packed; + +/* RM - radio measurement report */ +struct ieee80211_action_radio_measure_report { + struct ieee80211_action am_header; + uint8_t am_token; + uint8_t am_data[0]; +}__packed; + +/* + * 802.11h measurement request/report element + * 802.11k measurement request/report element + * common part + */ +struct ieee80211_ie_measure_comm { + uint8_t id; /* IEEE80211_ELEMID_MEASREQ = 38 */ + uint8_t len; /* 14 for known types */ + uint8_t token; /* Non-zero number for diff. measurement reqs. */ + uint8_t mode; /* bits: 1 enable, 2 req, 3 report, 0,4-7 reserved */ + uint8_t type; /* basic = 0, cca = 1, rpi histogram = 2 */ + uint8_t data[0]; /* variable format according to meas_type */ +} __packed; + +struct ieee80211_ie_measreq { + uint8_t chan_num; /* channel number */ + uint64_t start_tsf; /* starting time in tsf */ + uint16_t duration_tu; /* measurement duration in TU */ +} __packed; + +/* + * 802.11k measurement request element of sta statistics + * for PM module collect sta statistics + * See 802.11k 2003 7.3.2.21.8 + */ +struct ieee80211_ie_measreq_sta_stat { + uint8_t peer_mac[IEEE80211_ADDR_LEN]; /* Peer Mac Address */ + uint16_t random_interval; /* randomization interval */ + uint16_t duration_tu; /* measurement duration in TU */ + uint8_t group_id; /* group identity */ + uint8_t data[0]; /* Optional sub-elements in variable length */ +} __packed; + +struct ieee80211_ie_measreq_chan_load { + uint8_t operating_class; + uint8_t channel_num; + uint16_t random_interval_tu; + uint16_t duration_tu; + uint8_t data[0]; +} __packed; + +struct ieee80211_ie_measreq_noise_his { + uint8_t operating_class; + uint8_t channel_num; + uint16_t random_interval_tu; + uint16_t duration_tu; + uint8_t data[0]; +} __packed; + +struct ieee80211_ie_measreq_beacon { + uint8_t operating_class; + uint8_t channel_num; + uint16_t random_interval_tu; + uint16_t duration_tu; + uint8_t measure_mode; + uint8_t bssid[IEEE80211_ADDR_LEN]; + uint8_t data[0]; +} __packed; + +struct ieee80211_ie_measreq_frame { + uint8_t operating_class; + uint8_t channel_num; + uint16_t random_interval_tu; + uint16_t duration_tu; + uint8_t frame_request_type; +#define FRAME_COUNT_REPORT 1 + + uint8_t mac_addr[IEEE80211_ADDR_LEN]; + uint8_t data[0]; +} __packed; + +struct ieee80211_ie_measreq_trans_stream_cat { + uint16_t random_interval_tu; + uint16_t duration_tu; + uint8_t peer_sta_addr[IEEE80211_ADDR_LEN]; + uint8_t tid; + uint8_t bin0_range; + uint8_t data[0]; +} __packed; + +struct ieee80211_ie_measreq_multicast_diag { + uint16_t random_interval_tu; + uint16_t duration_tu; + uint8_t group_mac_addr[IEEE80211_ADDR_LEN]; + uint8_t data[0]; +} __packed; + +struct ieee80211_subie_multicast_triggered_reporting { + uint8_t sub_id; + uint8_t len; + uint8_t condition; + uint8_t inactivity_timeout; + uint8_t reactivation_delay; +} __packed; + +struct ieee80211_action_rm_link_measure_request { + struct ieee80211_action at_header; + uint8_t token; + uint8_t tran_power_used; + uint8_t max_tran_power; + uint8_t data[0]; +} __packed; + +struct ieee80211_action_rm_neighbor_report_request { + struct ieee80211_action at_header; + uint8_t token; + uint8_t data[0]; +} __packed; + +/* + * 802.11h measurement report element + * see 8.4.2.24 IEEE 802.11-2012 + */ +struct ieee80211_ie_measrep_basic { + uint8_t chan_num; /* channel number */ + uint64_t start_tsf; /* starting time in tsf */ + uint16_t duration_tu; /* measurement duration in TU */ + uint8_t basic_report; /* basic report data */ +} __packed; + +struct ieee80211_ie_measrep_cca { + uint8_t chan_num; /* channel number */ + uint64_t start_tsf; /* starting time in tsf */ + uint16_t duration_tu; /* measurement duration in TU */ + uint8_t cca_report; /* cca report data */ +#define IEEE80211_MEASURE_BASIC_REPORT_BSS (1 << 0) +#define IEEE80211_MEASURE_BASIC_REPORT_OFDM_PRE (1 << 1) +#define IEEE80211_MEASURE_BASIC_REPORT_UNDEF (1 << 2) +#define IEEE80211_MEASURE_BASIC_REPORT_RADAR (1 << 3) +#define IEEE80211_MEASURE_BASIC_REPORT_UMMEASURE (1 << 4) +} __packed; + +struct ieee80211_ie_measrep_rpi { + uint8_t chan_num; /* channel number */ + uint64_t start_tsf; /* starting time in tsf */ + uint16_t duration_tu; /* measurement duration in TU */ + uint8_t rpi_report[8]; /* rpi report data */ +} __packed; + +/* + * 802.11k measurement report element of sta statistics + * for PM module collect sta statistics + * See 802.11k 2003 7.3.2.22.8 + */ +struct ieee80211_ie_measrep_sta_stat { + uint16_t duration_tu; /* measurement duration in TU */ + uint8_t group_id; /* group identity */ + uint8_t data[0]; /* Optional sub-elements in variable length */ +} __packed; + +#define IEEE80211_RM_MEAS_SUBTYPE_LEN_MIN 2 + +/* Quantenna RM group ie, to complement an 802.11k group ie. Node statistics & parameters */ +struct ieee80211_ie_qtn_rm_measure_sta { + uint8_t id; /* IEEE80211_ELEMID_VENDOR */ + uint8_t len; /* length in bytes */ + uint8_t qtn_ie_oui[3]; /* QTN_OUI - 0x00, 0x26, 0x86*/ + uint8_t seq; /* sequence */ + uint8_t type; /* Which group (special or all) contains in the data. */ + uint8_t data[0]; +} __packed; + +struct ieee80211_ie_qtn_rm_txstats { + uint64_t tx_bytes; + uint32_t tx_pkts; + uint32_t tx_discard; + uint32_t tx_err; + uint32_t tx_ucast; /* unicast */ + uint32_t tx_mcast; /* multicast */ + uint32_t tx_bcast; /* broadcast */ +} __packed; + +struct ieee80211_ie_qtn_rm_rxstats { + uint64_t rx_bytes; + uint32_t rx_pkts; + uint32_t rx_discard; + uint32_t rx_err; + uint32_t rx_ucast; /* unicast */ + uint32_t rx_mcast; /* multicast */ + uint32_t rx_bcast; /* broadcast */ +} __packed; + +struct ieee80211_ie_qtn_rm_sta_all { + struct ieee80211_ie_qtn_rm_txstats tx_stats; + struct ieee80211_ie_qtn_rm_rxstats rx_stats; + u_int32_t max_queued; + u_int32_t link_quality; + u_int32_t rssi_dbm; + u_int32_t bandwidth; + u_int32_t snr; + u_int32_t tx_phy_rate; + u_int32_t rx_phy_rate; + u_int32_t cca; /* Reserved for cca */ + u_int32_t br_ip; + u_int32_t rssi; + u_int32_t hw_noise; + u_int8_t soc_macaddr[IEEE80211_ADDR_LEN]; + u_int32_t soc_ipaddr; +} __packed; + +/* + * Statistics Group data format for STB + */ +struct ieee80211_ie_rm_sta_grp221 { + uint8_t soc_macaddr[IEEE80211_ADDR_LEN]; + uint8_t rssi; + uint8_t phy_noise; +} __packed; + +/* dot11Counters Group */ +struct ieee80211_rm_sta_stats_group0 { + uint32_t dot11TransmittedFragmentCount; + uint32_t dot11MulticastTransmittedFrameCount; + uint32_t dot11FailedCount; + uint32_t dot11ReceivedFragmentCount; + uint32_t dot11MulticastReceivedFrameCount; + uint32_t dot11FCSErrorCount; + uint32_t dot11TransmittedFrameCount; +} __packed; + +/* dot11MACStatistics Group */ +struct ieee80211_rm_sta_stats_group1 { + uint32_t dot11RetryCount; + uint32_t dot11MultipleRetryCount; + uint32_t dot11FrameDuplicateCount; + uint32_t dot11RTSSuccessCount; + uint32_t dot11RTSFailureCount; + uint32_t dot11ACKFailureCount; +} __packed; + +/* dot11QosCounters Group for UP0-UP7 */ +struct ieee80211_rm_sta_stats_group2to9 { + uint32_t dot11QosTransmittedFragmentCount; + uint32_t dot11QosFailedCount; + uint32_t dot11QosRetryCount; + uint32_t dot11QosMultipleRetryCount; + uint32_t dot11QosFrameDuplicateCount; + uint32_t dot11QosRTSSuccessCount; + uint32_t dot11QosRTSFailureCount; + uint32_t dot11QosACKFailureCount; + uint32_t dot11QosReceivedFragmentCount; + uint32_t dot11QosTransmittedFrameCount; + uint32_t dot11QosDiscardedFrameCount; + uint32_t dot11QosMPDUsReceivedCount; + uint32_t dot11QosRetriesReceivedCount; +} __packed; + +/* dot11BSSAverageAccessDelay Group (only available at an AP) */ +struct ieee80211_rm_sta_stats_group10 { + uint32_t dot11STAStatisticsAPAverageAccessDelay; + uint32_t dot11STAStatisticsAverageAccessDelayBestEffort; + uint32_t dot11STAStatisticsAverageAccessDelayBackGround; + uint32_t dot11STAStatisticsAverageAccessDelayVideo; + uint32_t dot11STAStatisticsAverageAccessDelayVoice; + uint32_t dot11STAStatisticsStationCount; + uint32_t dot11STAStatisticsChannelUtilization; +} __packed; + +struct ieee80211_rm_sta_stats_group11 { + uint32_t dot11TransmittedAMSDUCount; + uint32_t dot11FailedAMSDUCount; + uint32_t dot11RetryAMSDUCount; + uint32_t dot11MultipleRetryAMSDUCount; + uint32_t dot11TransmittedOctetsInAMSDUCount; + uint32_t dot11AMSDUAckFailureCounnt; + uint32_t dot11ReceivedAMSDUCount; + uint32_t dot11ReceivedOctetsInAMSDUCount; +} __packed; + +struct ieee80211_rm_sta_stats_group12 { + uint32_t dot11TransmittedAMPDUCount; + uint32_t dot11TransmittedMPDUsInAMPDUCount; + uint64_t dot11TransmittedOctetsInAMPDUCount; + uint32_t dot11AMPDUReceivedCount; + uint32_t dot11MPDUInReceivedAMPDUCount; + uint64_t dot11ReceivedOctetsInAMPDUCount; + uint32_t dot11AMPDUDelimiterCRCErrorCount; +} __packed; + +struct ieee80211_rm_sta_stats_group13 { + uint32_t dot11ImplicitBARFailureCount; + uint32_t dot11ExplicitBARFailureCount; + uint32_t dot11ChannelWidthSwitchCount; + uint32_t dot11TwentyMHzFrameTransmittedCount; + uint32_t dot11FortyMHzFrameTransmittedCount; + uint32_t dot11TwentyMHzFrameReceivedCount; + uint32_t dot11FortyMHzFrameReceivedCount; + uint32_t dot11PSMPUTTGrantDuration; + uint32_t dot11PSMPUTTUsedDuration; +} __packed; + +struct ieee80211_rm_sta_stats_group14 { + uint32_t dot11GrantedRDGUsedCount; + uint32_t dot11GrantedRDGUnusedCount; + uint32_t dot11TransmittedFramesInGrantedRDGCount; + uint64_t dot11TransmittedOctetsInGrantedRDGCount; + uint32_t dot11DualCTSSuccessCount; + uint32_t dot11DualCTSFailureCount; + uint32_t dot11RTSLSIGSuccessCount; + uint32_t dot11RTSLSIGFailureCount; +} __packed; + +struct ieee80211_rm_sta_stats_group15 { + uint32_t dot11BeamformingFrameCount; + uint32_t dot11STBCCTSSuccessCount; + uint32_t dot11STBCCTSFailureCount; + uint32_t dot11nonSTBCCTSSuccessCount; + uint32_t dot11nonSTBCCTSFailureCount; +} __packed; + +struct ieee80211_rm_sta_stats_group16 { + uint32_t dot11RSNAStatsCMACICVErrors; + uint32_t dot11RSNAStatsCMACReplays; + uint32_t dot11RSNAStatsRobustMgmtCCMPReplays; + uint32_t dot11RSNAStatsTKIPICVErrors; + uint32_t dot11RSNAStatsTKIPReplays; + uint32_t dot11RSNAStatsCCMPDecryptErrors; + uint32_t dot11RSNAStatsCCMPReplays; +} __packed; + +/* + * STA Statistics QTN specific + */ +enum RadioMeasureQTNElementID { + RM_QTN_TX_STATS = 0, + RM_QTN_RX_STATS = 1, + RM_QTN_MAX_QUEUED = 2, + RM_QTN_LINK_QUALITY = 3, + RM_QTN_RSSI_DBM = 4, + RM_QTN_BANDWIDTH = 5, + RM_QTN_SNR = 6, + RM_QTN_TX_PHY_RATE = 7, + RM_QTN_RX_PHY_RATE = 8, + RM_QTN_CCA = 9, + RM_QTN_BR_IP = 10, + RM_QTN_RSSI = 11, + RM_QTN_HW_NOISE = 12, + RM_QTN_SOC_MACADDR = 13, + RM_QTN_SOC_IPADDR = 14, + RM_QTN_MAX = RM_QTN_SOC_IPADDR, + RM_QTN_UNKNOWN = 15, + RM_QTN_CTRL_START = 16, + RM_QTN_RESET_CNTS = 16, + RM_QTN_RESET_QUEUED = 17, + RM_QTN_CTRL_END = 17, +}; +#define RM_QTN_MEASURE_MASK ((1 << (RM_QTN_CTRL_END + 1)) - 1) + +/* + * STA Statistic for Group221 specific + */ +enum RadioMeasureGrp221ElementID { + RM_GRP221_RSSI = (RM_QTN_CTRL_END + 1), + RM_GRP221_PHY_NOISE = (RM_QTN_CTRL_END + 2), + RM_GRP221_SOC_MAC = (RM_QTN_CTRL_END + 3), +}; + +extern const uint8_t ieee80211_meas_sta_qtn_report_subtype_len[RM_QTN_CTRL_END + 1]; + +/* Standard CCA Flag to used */ +#define RM_STANDARD_CCA 0x1009 +#define IEEE80211_11K_CCA_INTF_SCALE 255 +/* + * CCA radio measurement report field + */ +struct cca_rm_rep_data { + uint8_t ch_num; + uint8_t tm_start[8]; + uint8_t m_duration[2]; + uint8_t busy_frac; +} __packed; + +/* CCA report IE*/ +struct ieee80211_ie_rm_measure_cca_rep { + uint8_t id; + uint8_t len; + uint8_t rm_token; + uint8_t rm_rep_mode; + uint8_t rm_rep_type; + struct cca_rm_rep_data rep_data; + struct ieee80211_ie_qtn_scs scs_data; +} __packed; + +struct ieee80211_ie_measrep_chan_load { + uint8_t operating_class; + uint8_t channel_num; + uint8_t start_time[8]; + uint16_t duration_tu; + uint8_t channel_load; + uint8_t data[0]; +} __packed; + +struct ieee80211_ie_measrep_noise_his { + uint8_t operating_class; + uint8_t channel_num; + uint8_t start_time[8]; + uint16_t duration_tu; + uint8_t antenna_id; + uint8_t anpi; + uint8_t ipi[11]; + uint8_t data[0]; +} __packed; + +struct ieee80211_ie_measrep_beacon { + uint8_t operating_class; + uint8_t channel_num; + uint8_t start_time[8]; + uint16_t duration_tu; + uint8_t reported_frame_info; + uint8_t rcpi; + uint8_t rsni; + uint8_t bssid[IEEE80211_ADDR_LEN]; + uint8_t antenna_id; + uint8_t parent_tsf[4]; + uint8_t data[0]; +} __packed; + +struct ieee80211_ie_measrep_frame { + uint8_t operating_class; + uint8_t channel_num; + uint8_t start_time[8]; + uint16_t duration_tu; + uint8_t data[0]; +} __packed; + +#define IEEE80211_FRAME_REPORT_SUBELE_FRAME_COUNT_REPORT 1 + +struct ieee80211_subie_section_frame_entry { + uint8_t id; + uint8_t len; + uint8_t transmit_address[IEEE80211_ADDR_LEN]; + uint8_t bssid[IEEE80211_ADDR_LEN]; + uint8_t phy_type; + uint8_t avg_rcpi; + uint8_t last_rsni; + uint8_t last_rcpi; + uint8_t anntenna_id; + uint16_t frame_cnt; + uint8_t data[0]; +} __packed; + +struct ieee80211_ie_measrep_trans_stream_cat { + uint8_t start_time[8]; + uint16_t duration_tu; + uint8_t peer_sta_address[IEEE80211_ADDR_LEN]; + uint8_t tid; + uint8_t reason; + uint32_t tran_msdu_cnt; + uint32_t msdu_discarded_cnt; + uint32_t msdu_failed_cnt; + uint32_t msdu_mul_retry_cnt; + uint32_t qos_cf_lost_cnt; + uint32_t avg_queue_delay; + uint32_t avg_trans_delay; + uint8_t bin0_range; + uint32_t bin0; + uint32_t bin1; + uint32_t bin2; + uint32_t bin3; + uint32_t bin4; + uint32_t bin5; +} __packed; + +struct ieee80211_ie_measrep_multicast_diag { + uint8_t measure_time[8]; + uint16_t duration_tu; + uint8_t group_mac_addr[IEEE80211_ADDR_LEN]; + uint8_t reason; + uint32_t mul_rx_msdu_cnt; + uint16_t first_seq_num; + uint16_t last_seq_num; + uint16_t mul_rate; +} __packed; + +struct ieee80211_action_rm_link_measure_report { + struct ieee80211_action at_header; + uint8_t token; + struct ieee80211_ie_tpc_report tpc_report; + uint8_t recv_antenna_id; + uint8_t tran_antenna_id; + uint8_t rcpi; + uint8_t rsni; + uint8_t data[0]; +} __packed; + +struct ieee80211_action_rm_neighbor_report_response { + struct ieee80211_action at_header; + uint8_t token; + uint8_t data[0]; +} __packed; + +struct ieee80211_ie_neighbor_report { + uint8_t id; + uint8_t len; + uint8_t bssid[IEEE80211_ADDR_LEN]; + uint32_t bssid_info; +#define BSSID_INFO_AP_NOT_REACHABLE (1 << 0) +#define BSSID_INFO_AP_UNKNOWN (2 << 0) +#define BSSID_INFO_AP_REACHABLE (3 << 0) +#define BSSID_INFO_SECURITY_COPY (1 << 2) +#define BSSID_INFO_KEY_SCOPE_COPY (1 << 3) +#define BSSID_INFO_CAP_SPECTRUM_MANAGEMENT (1 << 4) +#define BSSID_INFO_CAP_QOS (1 << 5) +#define BSSID_INFO_CAP_APSD (1 << 6) +#define BSSID_INFO_CAP_RADIO_MEASUREMENT (1 << 7) +#define BSSID_INFO_CAP_DELAYED_BA (1 << 8) +#define BSSID_INFO_CAP_IMMEDIATE_BA (1 << 9) +#define BSSID_INFO_MOBILITY_DOMAIN (1 << 10) +#define BSSID_INFO_HIGH_THROUGHPUT (1 << 11) + uint8_t operating_class; + uint8_t channel; + uint8_t phy_type; + uint8_t data[0]; +} __packed; + +/* HT actions */ +#define IEEE80211_ACTION_HT_TXCHWIDTH 0 /* recommended transmission channel width */ +#define IEEE80211_ACTION_HT_MIMOPWRSAVE 1 /* MIMO power save */ +#define IEEE80211_ACTION_HT_NCBEAMFORMING 5 /* HT non compressed beamforming report */ +#define IEEE80211_ACTION_HT_CBEAMFORMING 6 /* HT compressed beamforming report */ + +/* VHT actions */ +#define IEEE80211_ACTION_VHT_CBEAMFORMING 0 /* VHT compressed beamforming report */ +#define IEEE80211_ACTION_VHT_MU_GRP_ID 1 /* VHT MU GRP ID mgmt */ +#define IEEE80211_ACTION_VHT_OPMODE_NOTIFICATION 2 /* VHT Operating mode Notification */ + +/* HT - recommended transmission channel width */ +struct ieee80211_action_ht_txchwidth { + struct ieee80211_action at_header; + u_int8_t at_chwidth; +} __packed; + +#define IEEE80211_A_HT_TXCHWIDTH_20 0 +#define IEEE80211_A_HT_TXCHWIDTH_2040 1 + + +/* HT - MIMO Power Save */ +struct ieee80211_action_ht_mimopowersave { + struct ieee80211_action am_header; + uint8_t am_enable_mode; +} __packed; + +/* HT - Non compressed beam forming */ + +struct ht_mimo_ctrl { + uint16_t am_mimoctrl; + uint32_t am_timestamp; +} __packed; + +#define IEEE80211_HT_MIMO_CTRL_NC_M 0x0003 +#define IEEE80211_HT_MIMO_CTRL_NC_S 0 +#define IEEE80211_HT_MIMO_CTRL_NR_M 0x000C +#define IEEE80211_HT_MIMO_CTRL_NR_S 2 +#define IEEE80211_HT_MIMO_CTRL_CH_WIDTH_20 0x0000 +#define IEEE80211_HT_MIMO_CTRL_CH_WIDTH_40 0x0010 +#define IEEE80211_HT_MIMO_CTRL_NG_M 0x0060 +#define IEEE80211_HT_MIMO_CTRL_NG_S 5 +#define IEEE80211_HT_MIMO_CTRL_NB_M 0x0180 +#define IEEE80211_HT_MIMO_CTRL_NB_S 7 +#define IEEE80211_HT_MIMO_CTRL_CODEBOOK_M 0x0600 +#define IEEE80211_HT_MIMO_CTRL_CODEBOOK_S 9 +#define IEEE80211_HT_MIMO_CTRL_SEG_M 0x3800 +#define IEEE80211_HT_MIMO_CTRL_SEG_S 11 + + +enum { + IEEE80211_HT_MIMO_CTRL_NC_1 = 0, + IEEE80211_HT_MIMO_CTRL_NC_2, + IEEE80211_HT_MIMO_CTRL_NC_3, + IEEE80211_HT_MIMO_CTRL_NC_4, +}; + +enum { + IEEE80211_HT_MIMO_CTRL_NR_1 = 0, + IEEE80211_HT_MIMO_CTRL_NR_2, + IEEE80211_HT_MIMO_CTRL_NR_3, + IEEE80211_HT_MIMO_CTRL_NR_4, +}; + +enum { + IEEE80211_HT_MIMO_CTRL_NG_NONE = 0, + IEEE80211_HT_MIMO_CTRL_NG_2, + IEEE80211_HT_MIMO_CTRL_NG_4, + IEEE80211_HT_MIMO_CTRL_NG_RESERVED, +}; + +enum { + IEEE80211_HT_MIMO_CTRL_NB_4 = 0, + IEEE80211_HT_MIMO_CTRL_NB_2, + IEEE80211_HT_MIMO_CTRL_NB_6, + IEEE80211_HT_MIMO_CTRL_NB_8, +}; + +struct ieee80211_action_ht_bf { + struct ieee80211_action am_header; + struct ht_mimo_ctrl am_mimo_ctrl; + uint8_t am_bf_report[0]; /* start of beamforming report */ +} __packed; + +/* VHT - Tx Beamforming */ +struct vht_mimo_ctrl { + uint8_t am_mimoctrl[3]; +} __packed; + +/* VHT - Operating mode notification */ +struct ieee80211_action_vht_opmode_notification { + struct ieee80211_action am_header; + u_int8_t am_opmode; +} __packed; + +#define IEEE80211_VHT_OPMODE_CHWIDTH 0x03 +#define IEEE80211_VHT_OPMODE_CHWIDTH_S 0 +#define IEEE80211_VHT_OPMODE_RXNSS 0x70 +#define IEEE80211_VHT_OPMODE_RXNSS_S 4 +#define IEEE80211_VHT_OPMODE_RXNSS_TYPE 0x80 +#define IEEE80211_VHT_OPMODE_RXNSS_TYPE_S 7 + +#define IEEE80211_VHT_MIMO_CTRL_NC_M 0x000007 +#define IEEE80211_VHT_MIMO_CTRL_NC_S 0 +#define IEEE80211_VHT_MIMO_CTRL_NR_M 0x000038 +#define IEEE80211_VHT_MIMO_CTRL_NR_S 3 +#define IEEE80211_VHT_MIMO_CTRL_CH_BW_M 0x0000C0 +#define IEEE80211_VHT_MIMO_CTRL_CH_BW_S 6 +#define IEEE80211_VHT_MIMO_CTRL_CH_WIDTH_20 0x000000 +#define IEEE80211_VHT_MIMO_CTRL_CH_WIDTH_40 0x000040 +#define IEEE80211_VHT_MIMO_CTRL_CH_WIDTH_80 0x000080 +#define IEEE80211_VHT_MIMO_CTRL_CH_WIDTH_160 0x0000C0 +#define IEEE80211_VHT_MIMO_CTRL_NG_M 0x000300 +#define IEEE80211_VHT_MIMO_CTRL_NG_S 8 +#define IEEE80211_VHT_MIMO_CTRL_CODEBOOK_M 0x000400 +#define IEEE80211_VHT_MIMO_CTRL_CODEBOOK_S 10 +#define IEEE80211_VHT_MIMO_CTRL_FBTYPE_M 0x000800 +#define IEEE80211_VHT_MIMO_CTRL_FBTYPE_S 11 +#define IEEE80211_VHT_MIMO_CTRL_R_FB_M 0x007000 +#define IEEE80211_VHT_MIMO_CTRL_R_FB_S 12 +#define IEEE80211_VHT_MIMO_CTRL_FIRSTFB_M 0x008000 +#define IEEE80211_VHT_MIMO_CTRL_FIRSTFB_S 15 +#define IEEE80211_VHT_MIMO_CTRL_DTOKEN_M 0xFC0000 +#define IEEE80211_VHT_MIMO_CTRL_DTOKEN_S 18 + +/* Block Ack actions */ +#define IEEE80211_ACTION_BA_ADDBA_REQ 0 /* Add block ack request */ +#define IEEE80211_ACTION_BA_ADDBA_RESP 1 /* Add block ack response */ +#define IEEE80211_ACTION_BA_DELBA 2 /* delete block ack */ + +/* BA - Add block ack request */ +struct ieee80211_action_ba_addba_req { + struct ieee80211_action am_header; + uint8_t am_dlg; + uint16_t am_ba_params; + uint16_t am_ba_to; + uint16_t am_ba_seq; +} __packed; + +#define IEEE80211_A_BA_AMSDU_SUPPORTED 0x0001 +#define IEEE80211_A_BA_IMMEDIATE 0x0002 +#define IEEE80211_A_BA_DELAYED 0x0000 +#define IEEE80211_A_BA_TID_M 0x003C +#define IEEE80211_A_BA_TID_S 2 +#define IEEE80211_A_BA_BUFF_SIZE_M 0xFFC0 +#define IEEE80211_A_BA_BUFF_SIZE_S 6 +#define IEEE80211_A_BA_FRAG_M 0x000F +#define IEEE80211_A_BA_FRAG_S 0 +#define IEEE80211_A_BA_SEQ_M 0xFFF0 +#define IEEE80211_A_BA_SEQ_S 4 +#define IEEE80211_IOT_INTEL_AGG_MAX_FRAMES_NUM 16 + +/* BA - Add block ack response */ +struct ieee80211_action_ba_addba_resp { + struct ieee80211_action am_header; + uint8_t am_dlg; + __le16 am_status; + __le16 am_ba_params; + __le16 am_ba_to; +} __packed; + +/* BA - delete block ack request */ +struct ieee80211_action_ba_delba { + struct ieee80211_action am_header; + __le16 am_delba_params; + __le16 am_reason; +}__packed; + +#define IEEE80211_A_BA_INITIATOR 0x0800 +#define IEEE80211_A_BA_INITIATOR_S 11 +#define IEEE80211_A_BA_DELBA_TID 0xF000 +#define IEEE80211_A_BA_DELBA_TID_S 12 + +/* Move to a .config file later. */ +#define CONFIG_QHOP 1 + +#ifdef CONFIG_QHOP +#define QDRV_ACTION_TYPE_QHOP 0x19 +#define QDRV_ACTION_QHOP_DFS_REPORT 0x1 +#define QDRV_ACTION_QHOP_SCS_REPORT 0x2 + +struct qdrv_vendor_action_header { + uint8_t category; + uint8_t oui[3]; + uint8_t type; + uint8_t action; +} __packed; + +struct qdrv_vendor_action_qhop_dfs_data { + uint8_t cur_chan; +} __packed; + +#endif + +#ifdef CONFIG_QVSP + +/** + * Structures for action frames used to set stream states and configure VSP. + * + * These structures are the ones that go over the medium, so must be packed. + */ +#define QVSP_ACTION_TYPE_VSP 0x1 +#define QVSP_ACTION_STRM_CTRL 0x1 +#define QVSP_ACTION_VSP_CTRL 0x2 + +/** + * Common header for all VSP action frames. + */ +struct ieee80211_qvsp_act_header_s { + uint8_t category; + uint8_t oui[3]; + uint8_t type; + uint8_t action; +} __packed; + +struct ieee80211_qvsp_act_frm_dis_attr_s { + uint32_t throt_policy; + uint32_t throt_rate; + uint32_t demote_rule; + uint32_t demote_state; +} __packed; + +/** + * Stream control action frame. + */ +struct ieee80211_qvsp_act_strm_ctrl_s { + struct ieee80211_qvsp_act_header_s header; + uint8_t strm_state; + uint8_t count; + struct ieee80211_qvsp_act_frm_dis_attr_s dis_attr; + struct ieee80211_qvsp_strm_id strm_items[0]; /* One or more of these entries */ +} __packed; + +/** + * Single VSP control item - set a parameter remotely. + */ +struct ieee80211_qvsp_act_vsp_ctrl_item_s { + uint32_t index; + uint32_t value; +} __packed; + +/** + * VSP configuration/control action frame. + */ +struct ieee80211_qvsp_act_vsp_ctrl_s { + struct ieee80211_qvsp_act_header_s header; + uint8_t count; + uint8_t pad[3]; /* Pad for 32-bit alignment */ + struct ieee80211_qvsp_act_vsp_ctrl_item_s ctrl_items[0]; /* One or more of these entries */ +} __packed; + +#endif + +/* + * 802.11w / PMF SA Query Action Frame + */ +#define IEEE80211_ACTION_W_SA_QUERY_REQ 0 +#define IEEE80211_ACTION_W_SA_QUERY_RESP 1 + +struct ieee80211_action_sa_query { + struct ieee80211_action at_header; + u_int16_t at_tid; +} __packed; + +/* + * Control frames. + */ +struct ieee80211_frame_min { + uint8_t i_fc[2]; + uint8_t i_dur[2]; + uint8_t i_addr1[IEEE80211_ADDR_LEN]; + uint8_t i_addr2[IEEE80211_ADDR_LEN]; + /* FCS */ +} __packed; + +/* + * BAR frame format + */ +#define IEEE80211_BAR_CTL_TID 0xF000 /* tid mask */ +#define IEEE80211_BAR_CTL_TID_S 12 /* tid shift */ +#define IEEE80211_BAR_CTL_NOACK 0x0001 /* no-ack policy */ +#define IEEE80211_BAR_CTL_COMBA 0x0004 /* compressed block-ack */ +#define IEEE80211_BAR_CTL_MULTIBA 0x0006 /* Multi TID Block Ack */ +#define IEEE80211_BAR_INFO_FRAG_M 0x000F /* fragment mask */ +#define IEEE80211_BAR_CTL_FRAG_S 0 /* fragment shift */ +#define IEEE80211_BAR_CTL_SEQ 0xFFF0 /* sequence number mask */ +#define IEEE80211_BAR_CTL_SEQ_S 4 /* sequence number shift */ + + +struct ieee80211_frame_bar { + uint8_t i_fc[2]; + uint8_t i_dur[2]; + uint8_t i_ra[IEEE80211_ADDR_LEN]; + uint8_t i_ta[IEEE80211_ADDR_LEN]; + uint16_t i_ctl; + uint8_t i_info[0]; /* variable length */ + /* FCS */ +} __packed; + +struct ieee80211_frame_bar_info_simple { + uint16_t i_seq; +} __packed; + +struct ieee80211_frame_bar_info_tid { + uint16_t i_tid; + uint16_t i_seq; +} __packed; + +#define IEEE80211_BAR_HDR_LEN 16 +#define IEEE80211_BAR_COMPRESSED_LEN (sizeof(struct ieee80211_frame_bar) + \ + sizeof(struct ieee80211_frame_bar_info_simple)) + +/* + * BA frame format + */ +struct ieee80211_frame_ba { + uint8_t i_fc[2]; + uint8_t i_dur[2]; + uint8_t i_ra[IEEE80211_ADDR_LEN]; + uint8_t i_ta[IEEE80211_ADDR_LEN]; + uint16_t i_ctl; + uint8_t i_info[0]; /* variable length */ + /* FCS */ +} __packed; + +struct ieee80211_frame_ba_simple { + uint16_t i_seq; + uint8_t i_bm[128]; +} __packed; + +struct ieee80211_frame_ba_comp { + uint16_t i_seq; + uint8_t i_bm[8]; +} __packed; + +struct ieee80211_frame_ba_tid { + uint16_t i_tid; + uint16_t i_seq; + uint8_t i_bm[8]; +} __packed; + +struct ieee80211_frame_rts { + uint8_t i_fc[2]; + uint8_t i_dur[2]; + uint8_t i_ra[IEEE80211_ADDR_LEN]; + uint8_t i_ta[IEEE80211_ADDR_LEN]; + /* FCS */ +} __packed; + +struct ieee80211_frame_cts { + uint8_t i_fc[2]; + uint8_t i_dur[2]; + uint8_t i_ra[IEEE80211_ADDR_LEN]; + /* FCS */ +} __packed; + +struct ieee80211_frame_ack { + uint8_t i_fc[2]; + uint8_t i_dur[2]; + uint8_t i_ra[IEEE80211_ADDR_LEN]; + /* FCS */ +} __packed; + +struct ieee80211_frame_pspoll { + uint8_t i_fc[2]; + uint8_t i_aid[2]; + uint8_t i_bssid[IEEE80211_ADDR_LEN]; + uint8_t i_ta[IEEE80211_ADDR_LEN]; + /* FCS */ +} __packed; + +struct ieee80211_frame_cfend { /* NB: also CF-End+CF-Ack */ + uint8_t i_fc[2]; + uint8_t i_dur[2]; /* should be zero */ + uint8_t i_ra[IEEE80211_ADDR_LEN]; + uint8_t i_bssid[IEEE80211_ADDR_LEN]; + /* FCS */ +} __packed; + +struct ieee80211_frame_cw { + uint8_t i_fc[2]; + uint8_t i_dur[2]; + uint8_t i_ra[IEEE80211_ADDR_LEN]; + uint8_t i_cfc[2]; /* carried frame control */ + /* variable control frame */ + /* FCS */ +} __packed; + +/* 802.11 Management over Ethernet Payload Types (Annex U.1) */ +#define IEEE80211_SNAP_TYPE_REMOTE 1 /* Remote request/response */ +#define IEEE80211_SNAP_TYPE_TDLS 2 /* TDLS */ + +#define IEEE80211_FCS_LEN 4 +#define IEEE80211_ENCR_HDR_AES_LEN 16 + +/* + * BEACON management packets + * + * octet timestamp[8] + * octet beacon interval[2] + * octet capability information[2] + * information element + * octet elemid + * octet length + * octet information[length] + */ + +typedef uint8_t *ieee80211_mgt_beacon_t; + +#define IEEE80211_BEACON_INTERVAL(beacon) \ + ((beacon)[8] | ((beacon)[9] << 8)) +#define IEEE80211_BEACON_CAPABILITY(beacon) \ + ((beacon)[10] | ((beacon)[11] << 8)) + +#define IEEE80211_CAPINFO_ESS 0x0001 +#define IEEE80211_CAPINFO_IBSS 0x0002 +#define IEEE80211_CAPINFO_CF_POLLABLE 0x0004 +#define IEEE80211_CAPINFO_CF_POLLREQ 0x0008 +#define IEEE80211_CAPINFO_PRIVACY 0x0010 +#define IEEE80211_CAPINFO_SHORT_PREAMBLE 0x0020 +#define IEEE80211_CAPINFO_PBCC 0x0040 +#define IEEE80211_CAPINFO_CHNL_AGILITY 0x0080 +/* bits 8-9 are reserved (8 now for spectrum management) */ +#define IEEE80211_CAPINFO_SPECTRUM_MGMT 0x0100 +#define IEEE80211_CAPINFO_WME 0x0200 +#define IEEE80211_CAPINFO_SHORT_SLOTTIME 0x0400 +#define IEEE80211_CAPINFO_RSN 0x0800 +/* bit 12 is reserved */ +#define IEEE80211_CAPINFO_DSSSOFDM 0x2000 +/* bits 14-15 are reserved */ + +/* Extended Capabilities element (8.4.2.29) - bits 0 to 31 */ +#define IEEE80211_EXTCAP1_TDLS_UAPSD 0x10000000UL /* TDLS peer U-APSD buf STA support */ +#define IEEE80211_EXTCAP1_TDLS_PSM 0x20000000UL /* Peer PSM Support */ +#define IEEE80211_EXTCAP1_TDLS_CS 0x40000000UL /* channel switching */ + +/* Extended Capabilities element (8.4.2.29) - bits 32 to 63 */ +#define IEEE80211_EXTCAP2_TDLS 0x00000020UL /* TDLS supported */ +#define IEEE80211_EXTCAP2_TDLS_PROHIB 0x00000040UL /* TDLS prohibited */ +#define IEEE80211_EXTCAP2_TDLS_CS_PROHIB 0x00000080UL /* TDLS channel switch prohibited */ + +#define IEEE8211_EXTCAP_LENGTH 8 /* Extended capabilities element length */ + +/* + * 802.11i/WPA information element (maximally sized). + */ +struct ieee80211_ie_wpa { + uint8_t wpa_id; /* IEEE80211_ELEMID_VENDOR */ + uint8_t wpa_len; /* length in bytes */ + uint8_t wpa_oui[3]; /* 0x00, 0x50, 0xf2 */ + uint8_t wpa_type; /* OUI type */ + uint16_t wpa_version; /* spec revision */ + uint32_t wpa_mcipher[1]; /* multicast/group key cipher */ + uint16_t wpa_uciphercnt; /* # pairwise key ciphers */ + uint32_t wpa_uciphers[8]; /* ciphers */ + uint16_t wpa_authselcnt; /* authentication selector cnt*/ + uint32_t wpa_authsels[8]; /* selectors */ + uint16_t wpa_caps; /* 802.11i capabilities */ + uint16_t wpa_pmkidcnt; /* 802.11i pmkid count */ + uint16_t wpa_pmkids[8]; /* 802.11i pmkids */ +} __packed; + +/* TDLS Link Identifier element (7.3.2.62) */ +struct ieee80211_tdls_link_id { + uint8_t id; /* IEEE80211_ELEMID_TDLS_LINK_ID */ + uint8_t len; /* 20 */ + uint8_t bssid[IEEE80211_ADDR_LEN]; /* BSSID */ + uint8_t init_sa[IEEE80211_ADDR_LEN]; /* Initiator STA MAC address */ + uint8_t resp_sa[IEEE80211_ADDR_LEN]; /* Responder STA MAC address */ +} __packed; + +/* TDLS Wakeup Schedule information element (7.3.2.63) */ +struct ieee80211_tdls_wkup_sched { + uint8_t id; /* IEEE80211_ELEMID_TDLS_WKUP_SCHED */ + uint8_t len; /* 20 */ + uint32_t offset; /* Offset from TSF 0 */ + uint32_t interval; /* Microsecs between awake windows */ + uint32_t awake_slots; /* Awake window slots */ + uint32_t awake_dur; /* Max Awake Window Duration */ + uint16_t idle_count; /* Idle Count */ +} __packed; + +/* Extender Role IE */ +struct ieee80211_ie_qtn_extender { + uint8_t id; /* IEEE80211_ELEMID_VENDOR */ + uint8_t len; /* 5 */ + uint8_t qtn_ie_oui[3]; /* QTN_OUI - 0x00, 0x26, 0x86*/ + uint8_t qtn_ie_type; /* QTN_OUI_EXTENDER_ROLE */ + uint8_t role; /* extender device role */ +} __packed; + +/* TDLS IE */ +struct ieee80211_ie_qtn_tdls_sta_info { + uint8_t id; /* IEEE80211_ELEMID_VENDOR */ + uint8_t len; /* 6 */ + uint8_t qtn_ie_oui[3]; /* QTN_OUI - 0x00, 0x26, 0x86 */ + uint8_t qtn_ie_type; /* QTN_OUI_TDLS */ + uint16_t sta_associd; /* station's AID, unique value at BSS */ +} __packed; + +/* TDLS Channel Switch Timing element (7.3.2.64) */ +struct ieee80211_tdls_cs_timing { + uint8_t id; /* IEEE80211_ELEMID_TDLS_CS_TIMING */ + uint8_t len; /* 6 */ + uint16_t switch_time; /* Microsecs to switch channels */ + uint16_t switch_timeout; /* Microsecs to timeout channel switch */ +} __packed; + +/* TDLS PTI Control element (7.3.2.65) */ +struct ieee80211_tdls_pti_ctrl { + uint8_t id; /* IEEE80211_ELEMID_TDLS_PTI_CTRL */ + uint8_t len; /* 5 */ + uint16_t tid; /* TID in last mpdu to pu sleep sta */ + uint16_t seq_ctrl; /* Seq ctrl in last mpdu to sleep sta */ +} __packed; + +/* TDLS PU Buffer Status element (7.3.2.66) */ +struct ieee80211_tdls_pu_buf_stat { + uint8_t id; /* IEEE80211_ELEMID_TDLS_PU_BUF_STAT */ + uint8_t len; /* 3 */ + uint8_t pu_buf_stat; /* PU buffer status flags */ +} __packed; + +/* Extender Role IE */ +struct ieee80211_qtn_ext_role { + uint8_t id; /* IEEE80211_ELEMID_VENDOR */ + uint8_t len; /* 5 */ + uint8_t qtn_ie_oui[3]; /* QTN_OUI - 0x00, 0x26, 0x86*/ + uint8_t qtn_ie_type; /* QTN_OUI_EXTENDER_ROLE */ + uint8_t role; /* extender device role: MBS, RBS, NONE */ +} __packed; + +#define QTN_MAX_RBS_NUM 8 +struct ieee80211_qtn_ext_bssid { + uint8_t id; /* IEEE80211_ELEMID_VENDOR */ + uint8_t len; /* 59 */ + uint8_t qtn_ie_oui[3]; /* QTN_OUI - 0x00, 0x26, 0x86*/ + uint8_t qtn_ie_type; /* QTN_OUI_EXTENDER_BSSID */ + uint8_t mbs_bssid[IEEE80211_ADDR_LEN]; /* BSSID of mbs */ + uint8_t rbs_num; + uint8_t rbs_bssid[QTN_MAX_RBS_NUM][IEEE80211_ADDR_LEN]; /* BSSID of rbs */ +} __packed; + +/* + * 802.11n AMPDU delimiters and frame structure + */ + +/* XXX - Endianness? */ +struct ieee80211_ampdu_delim { + uint8_t dl_mpdulen[2]; /* only 12 bits */ + uint8_t dl_crc; + uint8_t dl_uniquepat; +} __packed; + +#define IEEE80211_AMPDU_DLPAT 0x4E /* ASCII for char 'N' */ +#define IEEE80211_AMPDU_PADMAX 3 + +/* + * 802.11n HT Capability IE + */ +struct ieee80211_ie_htcap { + uint8_t hc_id; /* element ID */ + uint8_t hc_len; /* length in bytes */ + uint8_t hc_cap[2]; /* HT capabilities */ + uint8_t hc_ampdu; /* A-MPDU parameters */ + uint8_t hc_mcsset[16]; /* supported MCS set */ + uint8_t hc_extcap[2]; /* extended HT capabilities */ + uint8_t hc_txbf[4]; /* txbf capabilities */ + uint8_t hc_antenna; /* antenna capabilities */ +} __packed; + + +/* HT capability flags */ +#define IEEE80211_HTCAP_C_LDPCCODING 0x0001 +#define IEEE80211_HTCAP_C_CHWIDTH40 0x0002 +#define IEEE80211_HTCAP_C_GREENFIELD 0x0010 +#define IEEE80211_HTCAP_C_SHORTGI20 0x0020 +#define IEEE80211_HTCAP_C_SHORTGI40 0x0040 +#define IEEE80211_HTCAP_C_TXSTBC 0x0080 +#define IEEE80211_HTCAP_C_RXSTBC 0x0100 +#define IEEE80211_HTCAP_C_DELAYEDBLKACK 0x0400 +#define IEEE80211_HTCAP_C_MAXAMSDUSIZE_8K 0x0800 /* 1 = 8K, 0 = 3839 bytes */ +#define IEEE80211_HTCAP_C_DSSSCCK40 0x1000 +#define IEEE80211_HTCAP_C_PSMP 0x2000 +#define IEEE80211_HTCAP_C_40_INTOLERANT 0x4000 +#define IEEE80211_HTCAP_C_LSIGTXOPPROT 0x8000 + +/* STBC defines */ +#define IEEE80211_MAX_TX_STBC_SS 2 + +/* MCS set flags */ +#define IEEE80211_HTCAP_MCS_TX_SET_DEFINED 0x01 +#define IEEE80211_HTCAP_MCS_TX_RX_SET_NEQ 0x02 +#define IEEE80211_HTCAP_MCS_TX_UNEQ_MOD 0x10 + +/* Maximum MSDU sizes */ +#define IEEE80211_MSDU_SIZE_7935 7935 +#define IEEE80211_MSDU_SIZE_3839 3839 + + +#define IEEE80211_HT_MCS_SET_BPSK_CR_HALF 0x01 +#define IEEE80211_HT_MCS_SET_QPSK_CR_HALF 0x02 +#define IEEE80211_HT_MCS_SET_QPSK_CR_THREEFORTH 0x04 +#define IEEE80211_HT_MCS_SET_16QAM_CR_HALF 0x08 +#define IEEE80211_HT_MCS_SET_16QAM_CR_THREEFORTH 0x10 +#define IEEE80211_HT_MCS_SET_64QAM_CR_TWOTHIRD 0x20 +#define IEEE80211_HT_MCS_SET_64QAM_CR_THREEFORTH 0x40 +#define IEEE80211_HT_MCS_SET_64QAM_CR_FIVESIXTH 0x80 + +/* Extended capabilities flags */ +#define IEEE80211_HTCAP_E_PCO 0x0001 +#define IEEE80211_HTCAP_E_PLUS_HTC 0x0400 +#define IEEE80211_HTCAP_E_RD_RESPONSE 0x0800 + +/* Tx Beamforming flags */ +#define IEEE80211_HTCAP_B_IMP_TXBF_RX 0x00000001 +#define IEEE80211_HTCAP_B_STAG_SOUNDING_RX 0x00000002 +#define IEEE80211_HTCAP_B_STAG_SOUNDING_TX 0x00000004 +#define IEEE80211_HTCAP_B_NDP_RX 0x00000008 +#define IEEE80211_HTCAP_B_NDP_TX 0x00000010 +#define IEEE80211_HTCAP_B_IMP_TXBF_TX 0x00000020 +#define IEEE80211_HTCAP_B_EXP_CSI_TXBF 0x00000100 +#define IEEE80211_HTCAP_B_EXP_NCOMP_STEER 0x00000200 +#define IEEE80211_HTCAP_B_EXP_COMP_STEER 0x00000400 + +/* Antenna selection flags */ +#define IEEE80211_HTCAP_A_ASEL_CAPABLE 0x01 +#define IEEE80211_HTCAP_A_EXP_CSI_FB_ASEL 0x02 +#define IEEE80211_HTCAP_A_ANT_IND_FB_ASEL 0x04 +#define IEEE80211_HTCAP_A_EXP_CSI_FB 0x08 +#define IEEE80211_HTCAP_A_ANT_IND_FB 0x10 +#define IEEE80211_HTCAP_A_RX_ASEL 0x20 +#define IEEE80211_HTCAP_A_TX_SOUNDING_PPDU 0x40 + +/* 11 AC related defines */ +#define IEEE80211_11AC_MCS_VAL_ERR -1 +#define IEEE80211_HT_EQUAL_MCS_START 0 +#define IEEE80211_HT_EQUAL_MCS_2SS_MAX 15 +#define IEEE80211_EQUAL_MCS_32 32 +#define IEEE80211_UNEQUAL_MCS_START 33 +#define IEEE80211_HT_UNEQUAL_MCS_2SS_MAX 38 +#define IEEE80211_UNEQUAL_MCS_MAX 76 +#define IEEE80211_UNEQUAL_MCS_BIT 0x40 +#define IEEE80211_AC_MCS_MASK 0xFF +#define IEEE80211_AC_MCS_SHIFT 8 +#define IEEE80211_AC_MCS_VAL_MASK 0x0F +#define IEEE80211_AC_MCS_NSS_MASK 0xF0 +#define IEEE80211_11AC_MCS_NSS_SHIFT 4 +#define IEEE80211_AC_MCS_MAX 10 +#define IEEE80211_AC_MCS_NSS_MAX 4 + +/* B0-1 maximum rx A-MPDU factor 2^(13+Max Rx A-MPDU Factor) - 1 */ +enum { + IEEE80211_HTCAP_MAXRXAMPDU_8191, /* (2 ^ 13) - 1*/ + IEEE80211_HTCAP_MAXRXAMPDU_16383, /* (2 ^ 14) - 1 */ + IEEE80211_HTCAP_MAXRXAMPDU_32767, /* (2 ^ 15) - 1*/ + IEEE80211_HTCAP_MAXRXAMPDU_65535, /* (2 ^ 16) - 1*/ +}; + +/* B2-4 MPDU spacing (usec) */ +enum { + IEEE80211_HTCAP_MPDUSPACING_NA, /* No time restriction */ + IEEE80211_HTCAP_MPDUSPACING_0_25, /* 1/4 usec */ + IEEE80211_HTCAP_MPDUSPACING_0_5, /* 1/2 usec */ + IEEE80211_HTCAP_MPDUSPACING_1, /* 1 usec */ + IEEE80211_HTCAP_MPDUSPACING_2, /* 2 usec */ + IEEE80211_HTCAP_MPDUSPACING_4, /* 4 usec */ + IEEE80211_HTCAP_MPDUSPACING_8, /* 8 usec */ + IEEE80211_HTCAP_MPDUSPACING_16, /* 16 usec */ +}; + +/* + * Rx MCS set + * # Supported rates IE is a 10 octet bitmap - also see mcs_stream_map[] + * Octet: 0 1 2 3 4 UEQM1 5 UEQM2 6 UEQM3 7 UEQM4 8 UEQM5 9 UEQM6 + * NSS: 11111111 22222222 33333333 44444444 02222223 33333333 33333444 44444444 44444444 44444... + * MCS: 0 8 16 24 32 40 48 56 64 72 76 + */ +enum { + IEEE80211_HT_MCSSET_20_40_NSS1, /* CBW = 20/40 MHz, Nss = 1, Nes = 1, EQM/ No EQM */ + IEEE80211_HT_MCSSET_20_40_NSS2, /* CBW = 20/40 MHz, Nss = 2, Nes = 1, EQM */ + IEEE80211_HT_MCSSET_20_40_NSS3, /* CBW = 20/40 MHz, Nss = 3, Nes = 1, EQM */ + IEEE80211_HT_MCSSET_20_40_NSS4, /* CBW = 20/40 MHz, Nss = 4, Nes = 1, EQM */ + IEEE80211_HT_MCSSET_20_40_UEQM1, /* MCS 32 and UEQM MCSs 33 - 39 */ + IEEE80211_HT_MCSSET_20_40_UEQM2, /* UEQM MCSs 40 - 47 */ + IEEE80211_HT_MCSSET_20_40_UEQM3, /* UEQM MCSs 48 - 55 */ + IEEE80211_HT_MCSSET_20_40_UEQM4, /* UEQM MCSs 56 - 63 */ + IEEE80211_HT_MCSSET_20_40_UEQM5, /* UEQM MCSs 64 - 71 */ + IEEE80211_HT_MCSSET_20_40_UEQM6, /* UEQM MCSs 72 - 76 plus 3 reserved bits */ +}; + +#define IEEE80211_HT_MCSSET_20_40_UEQM1_2SS 0x7E + +#define IEEE80211_HT_MCSSET_20_40_UEQM1_3SS 0x80 +#define IEEE80211_HT_MCSSET_20_40_UEQM2_3SS 0xFF +#define IEEE80211_HT_MCSSET_20_40_UEQM3_3SS 0x1F + +#define IEEE80211_HT_MCSSET_20_40_UEQM3_4SS 0xE0 +#define IEEE80211_HT_MCSSET_20_40_UEQM4_4SS 0xFF +#define IEEE80211_HT_MCSSET_20_40_UEQM5_4SS 0xFF +#define IEEE80211_HT_MCSSET_20_40_UEQM6_4SS 0x1F + +#define IEEE80211_HT_HAS_2SS_UEQM_MCS(mcsset) \ + (mcsset[IEEE80211_HT_MCSSET_20_40_UEQM1] & \ + IEEE80211_HT_MCSSET_20_40_UEQM1_2SS) + +#define IEEE80211_HT_HAS_3SS_UEQM_MCS(mcsset) \ + ((mcsset[IEEE80211_HT_MCSSET_20_40_UEQM1] & \ + IEEE80211_HT_MCSSET_20_40_UEQM1_3SS) || \ + (mcsset[IEEE80211_HT_MCSSET_20_40_UEQM2] & \ + IEEE80211_HT_MCSSET_20_40_UEQM2_3SS) || \ + (mcsset[IEEE80211_HT_MCSSET_20_40_UEQM3] & \ + IEEE80211_HT_MCSSET_20_40_UEQM3_3SS)) + +#define IEEE80211_HT_HAS_4SS_UEQM_MCS(mcsset) \ + ((mcsset[IEEE80211_HT_MCSSET_20_40_UEQM3] & \ + IEEE80211_HT_MCSSET_20_40_UEQM3_4SS) || \ + (mcsset[IEEE80211_HT_MCSSET_20_40_UEQM4] & \ + IEEE80211_HT_MCSSET_20_40_UEQM4_4SS) || \ + (mcsset[IEEE80211_HT_MCSSET_20_40_UEQM5] & \ + IEEE80211_HT_MCSSET_20_40_UEQM5_4SS) || \ + (mcsset[IEEE80211_HT_MCSSET_20_40_UEQM6] & \ + IEEE80211_HT_MCSSET_20_40_UEQM6_4SS)) + +#define IEEE80211_HT_IS_1SS_NODE(mcsset) \ + ((mcsset[IEEE80211_HT_MCSSET_20_40_NSS1] != 0) && \ + (mcsset[IEEE80211_HT_MCSSET_20_40_NSS2] == 0)) + +#define IEEE80211_HT_IS_2SS_NODE(mcsset) \ + ((mcsset[IEEE80211_HT_MCSSET_20_40_NSS2] != 0) && \ + (mcsset[IEEE80211_HT_MCSSET_20_40_NSS3] == 0)) + +#define IEEE80211_HT_IS_3SS_NODE(mcsset) \ + ((mcsset[IEEE80211_HT_MCSSET_20_40_NSS3] != 0) && \ + (mcsset[IEEE80211_HT_MCSSET_20_40_NSS4] == 0)) + +#define IEEE80211_HT_IS_4SS_NODE(mcsset) \ + (mcsset[IEEE80211_HT_MCSSET_20_40_NSS4] != 0) + +/* B2-3 Maximum Tx spatial streams */ +enum { + IEEE80211_HTCAP_MCS_ONE_TX_SS, /* One spatial stream */ + IEEE80211_HTCAP_MCS_TWO_TX_SS, /* Two spatial streams */ + IEEE80211_HTCAP_MCS_THREE_TX_SS, /* Three spatial streams */ + IEEE80211_HTCAP_MCS_FOUR_TX_SS /* Four spatial streams */ +}; + +/* B2-3 power save mode */ +enum { + IEEE80211_HTCAP_C_MIMOPWRSAVE_STATIC = 0, /* No MIMO (static mode) */ + IEEE80211_HTCAP_C_MIMOPWRSAVE_DYNAMIC, /* Precede MIMO with RTS */ + IEEE80211_HTCAP_C_MIMOPWRSAVE_NA, /* Not applicable */ + IEEE80211_HTCAP_C_MIMOPWRSAVE_NONE /* No limitation on MIMO (SM power save disabled) */ +}; + +/* B8-9 Rx STBC Mode */ +enum { + IEEE80211_HTCAP_C_RXSTBC_NONE, /* No STBC SS */ + IEEE80211_HTCAP_C_RXSTBC_ONE_SS, /* One STBC SS */ + IEEE80211_HTCAP_C_RXSTBC_TWO_SS, /* Two STBC SS */ + IEEE80211_HTCAP_C_RXSTBC_THREE_SS /* Three STBC SS */ +}; + +/* B1-2 PCO transition time */ +enum { + IEEE80211_HTCAP_E_PCO_NONE, /* No transition */ + IEEE80211_HTCAP_E_PCO_FOUR_HUNDRED_US, /* 400 us */ + IEEE80211_HTCAP_E_PCO_ONE_HALF_MS, /* 1.5 ms */ + IEEE80211_HTCAP_E_PCO_FIVE_MS /* 5 ms */ +}; + +/* B8-9 MCS feedback */ +enum { + IEEE80211_HTCAP_E_MCS_FB_NONE, /* No feedback */ + IEEE80211_HTCAP_E_MCS_FB_NA, /* Reserved */ + IEEE80211_HTCAP_E_MCS_FB_UNSOLICITED, /* Unsolicited feedback only*/ + IEEE80211_HTCAP_E_MCS_FB_SOLICITED /* Solicited and unsolicited feedback */ +}; + +/* B6-7 Calibration */ +enum { + IEEE80211_HTCAP_B_CALIBRATION_NONE, /* No support */ + IEEE80211_HTCAP_B_CALIBRATION_RESP_ONLY, /* Response only */ + IEEE80211_HTCAP_B_CALIBRATION_NA, /* Reserved */ + IEEE80211_HTCAP_B_CALIBRATION_REQ_RESP /* Request and response */ +}; + +/* B11-12 explicit CSI TxBF feedback, B13-14 explicit non compressed TxBF, + * B15-16 explicit compressed TxBF + */ +enum { + IEEE80211_HTCAP_B_CAPABLE_NONE, /* No support */ + IEEE80211_HTCAP_B_CAPABLE_DELAYED, /* delayed response only */ + IEEE80211_HTCAP_B_CAPABLE_IMMEDIATE, /* immediate response only */ + IEEE80211_HTCAP_B_CAPABLE_BOTH /* both delayed and immediate response */ +}; + +/* B17-18 Grouping */ +enum { + IEEE80211_HTCAP_B_GROUPING_NONE, /* No support */ + IEEE80211_HTCAP_B_GROUPING_ONE_TWO, /* groups 1 and 2 */ + IEEE80211_HTCAP_B_GROUPING_ONE_FOUR, /* groups 1 and 4 */ + IEEE80211_HTCAP_B_GROUPING_ONE_TWO_FOUR /* groups 1, 2 and 4 */ +}; + +/* B19-20 CSI number of beamforming antennas, B21-22 non compressed number of beamforming + * antennas, B23-24 compressed number of beamforming antennas + */ +enum { + IEEE80211_HTCAP_B_ANTENNAS_ONE, /* Single antenna sounding */ + IEEE80211_HTCAP_B_ANTENNAS_TWO, /* 2 antenna sounding */ + IEEE80211_HTCAP_B_ANTENNAS_THREE, /* 3 antenna sounding */ + IEEE80211_HTCAP_B_ANTENNAS_FOUR /* 4 antenna sounding */ +}; + +/* B25-26 CSI Max number of beamformer rows */ +enum { + IEEE80211_HTCAP_B_CSI_ONE_ROW, + IEEE80211_HTCAP_B_CSI_TWO_ROWS, + IEEE80211_HTCAP_B_CSI_THREE_ROWS, + IEEE80211_HTCAP_B_CSI_FOUR_ROWS +}; + +/* B27-28 channel estimation capability */ +enum { + IEEE80211_HTCAP_B_ST_STREAM_ONE, /* one space time stream */ + IEEE80211_HTCAP_B_ST_STREAM_TWO, /* two space time streams */ + IEEE80211_HTCAP_B_ST_STREAM_THREE, /* three space time streams */ + IEEE80211_HTCAP_B_ST_STREAM_FOUR /* four space time streams */ +}; + +/* HT NSS */ +enum ieee80211_ht_nss { + IEEE80211_HT_NSS1 = 1, + IEEE80211_HT_NSS2 = 2, + IEEE80211_HT_NSS3 = 3, + IEEE80211_HT_NSS4 = 4 +}; + +/* HT capability macros */ + +/* get macros */ +/* A-MPDU spacing B2-B4 */ +#define IEEE80211_HTCAP_MIN_AMPDU_SPACING(htcap) \ + (((htcap)->hc_ampdu & 0x1c) >> 2) +/* max RX A-MPDU length B0-B1 */ +#define IEEE80211_HTCAP_MAX_AMPDU_LEN(htcap) \ + (((htcap)->hc_ampdu & 0x03)) +/* highest supported data rate, B0-B7 in set 10, B0-B1 in set 11 */ +#define IEEE80211_HTCAP_HIGHEST_DATA_RATE(htcap) \ + (((htcap)->hc_mcsset[10]) | (((htcap)->hc_mcsset[11] & 0x3) << 8)) +/* MCS parameters (all bits)*/ +#define IEEE80211_HTCAP_MCS_PARAMS(htcap) \ + ((htcap)->hc_mcsset[12] & 0x1F) +/* MCS maximum spatial streams, B2-B3 in set 12 */ +#define IEEE80211_HTCAP_MCS_STREAMS(htcap) \ + (((htcap)->hc_mcsset[12] & 0xC) >> 2) +/* MCS set value (all bits) */ +#define IEEE80211_HTCAP_MCS_VALUE(htcap,_set) \ + ((htcap)->hc_mcsset[_set]) +/* HT capabilities (all bits) */ +#define IEEE80211_HTCAP_CAPABILITIES(htcap) \ + (((htcap)->hc_cap[0]) | ((htcap)->hc_cap[1] << 8)) +/* B3-4 power save mode */ +#define IEEE80211_HTCAP_PWRSAVE_MODE(htcap) \ + (((htcap)->hc_cap[0] & 0x0C) >> 2) +/* B8-9 Rx STBC MODE */ +#define IEEE80211_HTCAP_RX_STBC_MODE(htcap) \ + ((htcap)->hc_cap[1] & 0x3) +/* HT extended capabilities (all bits) */ +#define IEEE80211_HTCAP_EXT_CAPABILITIES(htcap) \ + ((htcap)->hc_extcap) +/* B1-2 PCO transition time */ +#define IEEE80211_HTCAP_PCO_TRANSITION(htcap) \ + (((htcap)->hc_extcap & 0x6) >> 1) +/* B8-9 MCS feedback type */ +#define IEEE80211_HTCAP_MCS_FEEDBACK_TYPE(htcap) \ + (((htcap)->hc_extcap & 0x300) >> 8) +/* HT TxBeamForming (bits 0-13) */ +#define IEEE80211_HTCAP_TXBF_CAPABILITIES(htcap) \ + ((htcap)->hc_txbf[0] | ((htcap)->hc_txbf[1] << 8)) +/* HT TxBeamForming (bits 14-31) */ +#define IEEE80211_HTCAP_TXBF_CAPABILITIES_EXTN(htcap) \ + ((htcap)->hc_txbf[2] | ((htcap)->hc_txbf[3] << 8)) +/* B6-7 Calibration */ +#define IEEE80211_HTCAP_CALIBRATION(htcap) \ + (((htcap)->hc_txbf[0] & 0xC0) >> 6) +/* B11-12 explicit CSI TxBF feedback*/ +#define IEEE80211_HTCAP_EXP_CSI_TXBF(htcap) \ + (((htcap)->hc_txbf[1] & 0x18) >> 3) +/* B13-14 explicit non compressed TxBF */ +#define IEEE80211_HTCAP_EXP_NCOMP_TXBF(htcap) \ + (((htcap)->hc_txbf[1] & 0x60) >> 5) +/* B15-16 explicit compressed TxBF */ +#define IEEE80211_HTCAP_EXP_COMP_TXBF(htcap) \ + ((((htcap)->hc_txbf[1] & 0x80) >> 7) | (((htcap)->hc_txbf[2] & 0x01) << 1)) +/* B17-18 Grouping */ +#define IEEE80211_HTCAP_GROUPING(htcap) \ + (((htcap)->hc_txbf[2] & 0x6) >> 1) +/* B19-20 CSI number of beamforming antennas */ +#define IEEE80211_HTCAP_CSI_NUM_BF(htcap) \ + (((htcap)->hc_txbf[2] & 0x18) >> 3) +/* B21-22 non compressed number of beamforming antennas */ +#define IEEE80211_HTCAP_NCOM_NUM_BF(htcap) \ + (((htcap)->hc_txbf[2] & 0x60) >> 5) +/* B23-24 compressed number of beamforming antennas */ +#define IEEE80211_HTCAP_COMP_NUM_BF(htcap) \ + ((((htcap)->hc_txbf[2] & 0x80) >> 7) | (((htcap)->hc_txbf[3] & 0x01) << 1)) +/* B25-26 CSI Max number of beamformer rows */ +#define IEEE80211_HTCAP_CSI_BF_ROWS(htcap) \ + (((htcap)->hc_txbf[3] & 0x6) >> 1) +/* B27-28 channel estimation capability */ +#define IEEE80211_HTCAP_CHAN_EST(htcap) \ + (((htcap)->hc_txbf[3] & 0x18) >> 3) + +/* set macros */ +/* A-MPDU spacing B2-B4 */ +#define IEEE80211_HTCAP_SET_AMPDU_SPACING(htcap,_d) \ + ((htcap)->hc_ampdu = (((htcap)->hc_ampdu & ~0x1c) | ((_d) << 2))) +/* max RX A-MPDU length B0-B1 */ +#define IEEE80211_HTCAP_SET_AMPDU_LEN(htcap,_f) \ + ((htcap)->hc_ampdu = (((htcap)->hc_ampdu & ~0x03) | (_f))) +/* highest supported data rate, B0-B7 in set 10, B0-B1 in set 11) */ +#define IEEE80211_HTCAP_SET_HIGHEST_DATA_RATE(htcap,_r) \ + ((htcap)->hc_mcsset[10] = ((_r) & 0xFF)); \ + ((htcap)->hc_mcsset[11] = ((_r) & 0x3FF) >> 8) +/* MCS set parameters (all bits) */ +#define IEEE80211_HTCAP_SET_MCS_PARAMS(htcap,_p) \ + ((htcap)->hc_mcsset[12] = (_p & 0x1F)) +/* MCS maximum spatial streams, B2-B3 in set 12 */ +#define IEEE80211_HTCAP_SET_MCS_STREAMS(htcap,_s) \ + ((htcap)->hc_mcsset[12] = ((htcap)->hc_mcsset[12] & ~0xC)| (_s << 2)) +/* MCS set value (all bits) */ +#define IEEE80211_HTCAP_SET_MCS_VALUE(htcap,_set,_value) \ + ((htcap)->hc_mcsset[_set] = (_value & 0xFF)) +/* HT capabilities (all bits) */ +#define IEEE80211_HTCAP_SET_CAPABILITIES(htcap,_cap) \ + (htcap)->hc_cap[0] = (_cap & 0x00FF); \ + (htcap)->hc_cap[1] = ((_cap & 0xFF00) >> 8) +/* B2-B3 power save mode */ +#define IEEE80211_HTCAP_SET_PWRSAVE_MODE(htcap,_m) \ + ((htcap)->hc_cap[0] = (((htcap)->hc_cap[0] & ~0xC) | ((_m) << 2))) +/* B8-9 Rx STBC MODE */ +#define IEEE80211_HTCAP_SET_RX_STBC_MODE(htcap,_m) \ + ((htcap)->hc_cap[1] = (((htcap)->hc_cap[1] & ~0x3) | (_m) )) +/* HT extended capabilities (all bits) */ +#define IEEE80211_HTCAP_SET_EXT_CAPABILITIES(htcap,_cap) \ + ((htcap)->hc_extcap = (_cap & 0xFFFF)) +/* B1-2 PCO transition time */ +#define IEEE80211_HTCAP_SET_PCO_TRANSITION(htcap,_t) \ + ((htcap)->hc_extcap = (((htcap)->hc_extcap & ~0x6) | ((_t) << 1))) +/* B8-9 MCS feedback type */ +#define IEEE80211_HTCAP_SET_MCS_FEEDBACK_TYPE(htcap,_t) \ + ((htcap)->hc_extcap = (((htcap)->hc_extcap & ~0x300) | ((_t) << 8))) +/* HT TxBeamForming (all bits ) */ +#define IEEE80211_HTCAP_SET_TXBF_CAPABILITIES(htcap,_cap) \ + (htcap)->hc_txbf[0] = ((_cap) & 0x00FF); \ + (htcap)->hc_txbf[1] = (((_cap) & 0xFF00) >> 8) +/* B6-7 Calibration */ +#define IEEE80211_HTCAP_SET_CALIBRATION(htcap,_t) \ + ((htcap)->hc_txbf[0] = (((htcap)->hc_txbf[0] & ~0xC0) | ((_t) << 6))) +/* B11-12 explicit CSI TxBF feedback*/ +#define IEEE80211_HTCAP_SET_EXP_CSI_TXBF(htcap,_t) \ + ((htcap)->hc_txbf[1] = (((htcap)->hc_txbf[1] & ~0x18) | ((_t) << 3))) +/* B13-14 explicit non compressed TxBF */ +#define IEEE80211_HTCAP_SET_EXP_NCOMP_TXBF(htcap,_t) \ + ((htcap)->hc_txbf[1] = (((htcap)->hc_txbf[1] & ~0x60) | ((_t) << 5))) +/* B15-16 explicit compressed TxBF */ +#define IEEE80211_HTCAP_SET_EXP_COMP_TXBF(htcap,_t) \ + (htcap)->hc_txbf[1] = (((htcap)->hc_txbf[1] & ~0x80) | ((((_t) & 0x01) << 7))); \ + (htcap)->hc_txbf[2] = (((htcap)->hc_txbf[2] & ~0x01) | ((_t) >> 1)) +/* B17-18 Grouping */ +#define IEEE80211_HTCAP_SET_GROUPING(htcap,_t) \ + ((htcap)->hc_txbf[2] = (((htcap)->hc_txbf[2] & ~0x6) | ((_t) << 1))) +/* B19-20 CSI number of beamforming antennas */ +#define IEEE80211_HTCAP_SET_CSI_NUM_BF(htcap,_t) \ + ((htcap)->hc_txbf[2] = (((htcap)->hc_txbf[2] & ~0x18) | ((_t) << 3))) +/* B21-22 non compressed number of beamforming antennas */ +#define IEEE80211_HTCAP_SET_NCOMP_NUM_BF(htcap,_t) \ + ((htcap)->hc_txbf[2] = (((htcap)->hc_txbf[2] & ~0x60) | ((_t) << 5))) +/* B23-24 compressed number of beamforming antennas */ +#define IEEE80211_HTCAP_SET_COMP_NUM_BF(htcap,_t) \ + (htcap)->hc_txbf[2] = (((htcap)->hc_txbf[2] & ~0x80) | (((_t) & 0x01) << 7)); \ + (htcap)->hc_txbf[3] = (((htcap)->hc_txbf[3] & ~0x01) | ((_t) >> 1)) +/* B25-26 CSI Max number of beamformer rows */ +#define IEEE80211_HTCAP_SET_CSI_BF_ROWS(htcap,_t) \ + ((htcap)->hc_txbf[3] = (((htcap)->hc_txbf[3] & ~0x6) | ((_t) << 1))) +/* B27-28 channel estimation capability */ +#define IEEE80211_HTCAP_SET_CHAN_EST(htcap,_t) \ + ((htcap)->hc_txbf[3] = (((htcap)->hc_txbf[3] & ~0x18) | ((_t) << 3))) + +/* + * 802.11n HT Information IE + */ +struct ieee80211_ie_htinfo { + uint8_t hi_id; /* element ID */ + uint8_t hi_len; /* length in bytes */ + uint8_t hi_ctrlchannel; /* control channel */ + uint8_t hi_byte1; /* ht ie byte 1 */ + uint8_t hi_byte2; /* ht ie byte 2 */ + uint8_t hi_byte3; /* ht ie byte 3 */ + uint8_t hi_byte4; /* ht ie byte 4 */ + uint8_t hi_byte5; /* ht ie byte 5 */ + uint8_t hi_basicmcsset[16]; /* basic MCS set */ +} __packed; + +#define IEEE80211_HTINFO_B1_REC_TXCHWIDTH_40 0x04 +#define IEEE80211_HTINFO_B1_RIFS_MODE 0x08 +#define IEEE80211_HTINFO_B1_CONTROLLED_ACCESS 0x10 +#define IEEE80211_HTINFO_B2_NON_GF_PRESENT 0x04 +#define IEEE80211_HTINFO_B2_OBSS_PROT 0x10 +#define IEEE80211_HTINFO_B4_DUAL_BEACON 0x40 +#define IEEE80211_HTINFO_B4_DUAL_CTS 0x80 +#define IEEE80211_HTINFO_B5_STBC_BEACON 0x01 +#define IEEE80211_HTINFO_B5_LSIGTXOPPROT 0x02 +#define IEEE80211_HTINFO_B5_PCO_ACTIVE 0x04 +#define IEEE80211_HTINFO_B5_40MHZPHASE 0x08 + + +/* get macros */ +/* control channel (all bits) */ +#define IEEE80211_HTINFO_PRIMARY_CHANNEL(htie) \ + (htie->hi_ctrlchannel) +/* byte 1 (all bits) */ +#define IEEE80211_HTINFO_BYTE_ONE(htie) \ + (htie->hi_byte1) +/* byte 2 (all bits) */ +#define IEEE80211_HTINFO_BYTE_TWO(htie) \ + (htie->hi_byte2) +/* byte 3 (all bits) */ +#define IEEE80211_HTINFO_BYTE_THREE(htie) \ + (htie->hi_byte3) +/* byte 4 (all bits) */ +#define IEEE80211_HTINFO_BYTE_FOUR(htie) \ + (htie->hi_byte4) +/* byte 5 (all bits) */ +#define IEEE80211_HTINFO_BYTE_FIVE(htie) \ + (htie->hi_byte5) +/* B5-B7, byte 1 */ +#define IEEE80211_HTINFO_B1_SIGRANULARITY(htie) \ + (((htie)->hi_byte1 & 0xe0) >> 5) +/* B0-B1, byte 1 */ +#define IEEE80211_HTINFO_B1_EXT_CHOFFSET(htie) \ + (((htie)->hi_byte1 & 0x3)) +/* B0-B1, byte 2 */ +#define IEEE80211_HTINFO_B2_OP_MODE(htie) \ + (((htie)->hi_byte2 & 0x3)) +/* MCS set value (all bits) */ +#define IEEE80211_HTINFO_BASIC_MCS_VALUE(htie,_set) \ + ((htie)->hi_basicmcsset[_set]) + +/* set macros */ +/* control channel (all bits) */ +#define IEEE80211_HTINFO_SET_PRIMARY_CHANNEL(htie,_c) \ + (htie->hi_ctrlchannel = _c) +/* byte 1 (all bits) */ +#define IEEE80211_HTINFO_SET_BYTE_ONE(htie,_b) \ + (htie->hi_byte1 = _b) +/* byte 2 (all bits) */ +#define IEEE80211_HTINFO_SET_BYTE_TWO(htie,_b) \ + (htie->hi_byte2 = _b) +/* byte 3 (all bits) */ +#define IEEE80211_HTINFO_SET_BYTE_THREE(htie,_b) \ + (htie->hi_byte3 = _b) +/* byte 4 (all bits) */ +#define IEEE80211_HTINFO_SET_BYTE_FOUR(htie,_b) \ + (htie->hi_byte4 = _b) +/* byte 5 (all bits) */ +#define IEEE80211_HTINFO_SET_BYTE_FIVE(htie,_b) \ + (htie->hi_byte5 = _b) +/* B5-B7, byte 1 */ +#define IEEE80211_HTINFO_B1_SET_SIGRANULARITY(htie,_g) \ + ((htie)->hi_byte1 = (((htie)->hi_byte1 & ~0xe0) |((_g) << 5) )) +/* B0-B1, byte 1 */ +#define IEEE80211_HTINFO_B1_SET_EXT_CHOFFSET(htie,_off) \ + ((htie)->hi_byte1 = (((htie)->hi_byte1 & ~0x03) |(_off))) +/* B0-B1, byte 2 */ +#define IEEE80211_HTINFO_B2_SET_OP_MODE(htie,_m) \ + ((htie)->hi_byte2 = (((htie)->hi_byte2 & ~0x3) | ((_m) ))) +/* Basic MCS set value (all bits) */ +#define IEEE80211_HTINFO_SET_BASIC_MCS_VALUE(htie,_set,_value) \ + ((htie)->hi_basicmcsset[_set] = (_value & 0xFF)) + + +/* extension channel offset (2 bit signed number) */ +enum { + IEEE80211_HTINFO_EXTOFFSET_NA = 0, /* 0 no extension channel is present */ + IEEE80211_HTINFO_EXTOFFSET_ABOVE = 1, /* +1 extension channel above control channel */ + IEEE80211_HTINFO_EXTOFFSET_UNDEF = 2, /* -2 undefined */ + IEEE80211_HTINFO_EXTOFFSET_BELOW = 3 /* -1 extension channel below control channel*/ +}; + +/* operating mode */ +enum { + IEEE80211_HTINFO_OPMODE_NO_PROT, /* no protection */ + IEEE80211_HTINFO_OPMODE_HT_PROT_NON_MEM, /* protection required (Legacy device present in other BSS) */ + IEEE80211_HTINFO_OPMODE_HT_PROT_20_ONLY, /* protection required ( One 20 MHZ only HT device is present in 20/40 BSS) */ + IEEE80211_HTINFO_OPMODE_HT_PROT_MIXED, /* protection required (Legacy device is present in this BSS) */ +}; + +/* signal granularity */ +enum { + IEEE80211_HTINFO_SIGRANULARITY_5, /* 5 ms */ + IEEE80211_HTINFO_SIGRANULARITY_10, /* 10 ms */ + IEEE80211_HTINFO_SIGRANULARITY_15, /* 15 ms */ + IEEE80211_HTINFO_SIGRANULARITY_20, /* 20 ms */ + IEEE80211_HTINFO_SIGRANULARITY_25, /* 25 ms */ + IEEE80211_HTINFO_SIGRANULARITY_30, /* 30 ms */ + IEEE80211_HTINFO_SIGRANULARITY_35, /* 35 ms */ + IEEE80211_HTINFO_SIGRANULARITY_40, /* 40 ms */ +}; + +/* + * Management information element payloads. + */ + +enum { + IEEE80211_ELEMID_SSID = 0, + IEEE80211_ELEMID_RATES = 1, + IEEE80211_ELEMID_FHPARMS = 2, + IEEE80211_ELEMID_DSPARMS = 3, + IEEE80211_ELEMID_CFPARMS = 4, + IEEE80211_ELEMID_TIM = 5, + IEEE80211_ELEMID_IBSSPARMS = 6, + IEEE80211_ELEMID_COUNTRY = 7, + IEEE80211_ELEMID_REQINFO = 10, + IEEE80211_ELEMID_BSS_LOAD = 11, + IEEE80211_ELEMID_EDCA = 12, + IEEE80211_ELEMID_CHALLENGE = 16, + /* 17-31 reserved for challenge text extension */ + IEEE80211_ELEMID_PWRCNSTR = 32, + IEEE80211_ELEMID_PWRCAP = 33, + IEEE80211_ELEMID_TPCREQ = 34, + IEEE80211_ELEMID_TPCREP = 35, + IEEE80211_ELEMID_SUPPCHAN = 36, + IEEE80211_ELEMID_CHANSWITCHANN = 37, + IEEE80211_ELEMID_MEASREQ = 38, + IEEE80211_ELEMID_MEASREP = 39, + IEEE80211_ELEMID_QUIET = 40, + IEEE80211_ELEMID_IBSSDFS = 41, + IEEE80211_ELEMID_ERP = 42, + IEEE80211_ELEMID_HTCAP = 45, + IEEE80211_ELEMID_QOSCAP = 46, + IEEE80211_ELEMID_RSN = 48, + IEEE80211_ELEMID_XRATES = 50, + IEEE80211_ELEMID_NEIGHBOR_REP = 52, + IEEE80211_ELEMID_FTIE = 55, + IEEE80211_ELEMID_TIMEOUT_INT = 56, + IEEE80211_ELEMID_REG_CLASSES = 59, + IEEE80211_ELEMID_HTINFO = 61, + IEEE80211_ELEMID_SEC_CHAN_OFF = 62, /* Secondary Channel Offset */ + IEEE80211_ELEMID_20_40_BSS_COEX = 72, /* 20/40 BSS Coexistence */ + IEEE80211_ELEMID_TDLS_LINK_ID = 101, /* TDLS Link Identifier */ + IEEE80211_ELEMID_TDLS_WKUP_SCHED = 102, /* TDLS Wakeup Schedule */ + IEEE80211_ELEMID_TDLS_CS_TIMING = 104, /* TDLS Channel Switch Timing */ + IEEE80211_ELEMID_TDLS_PTI_CTRL = 105, /* TDLS PTI Control */ + IEEE80211_ELEMID_TDLS_PU_BUF_STAT = 106, /* TDLS PU Buffer Status */ + IEEE80211_ELEMID_INTERWORKING = 107, + IEEE80211_ELEMID_EXTCAP = 127, + /* 128-129 proprietary elements used by Agere chipsets */ + IEEE80211_ELEMID_AGERE1 = 128, + IEEE80211_ELEMID_AGERE2 = 129, + IEEE80211_ELEMID_TPC = 150, + IEEE80211_ELEMID_CCKM = 156, + /* 191-199 Table 8-54-Element IDs in Std 802.11ac-2013 */ + IEEE80211_ELEMID_VHTCAP = 191, + IEEE80211_ELEMID_VHTOP = 192, + IEEE80211_ELEMID_EXTBSSLOAD = 193, + IEEE80211_ELEMID_WBWCHANSWITCH = 194, + IEEE80211_ELEMID_VHTXMTPWRENVLP = 195, + IEEE80211_ELEMID_CHANSWITCHWRP = 196, + IEEE80211_ELEMID_AID = 197, + IEEE80211_ELEMID_QUIETCHAN = 198, + IEEE80211_ELEMID_OPMOD_NOTIF = 199, + /* Vendor Specific */ + IEEE80211_ELEMID_VENDOR = 221, /* vendor private */ +}; + +#define IEEE80211_2040BSSCOEX_INFO_REQ 0x01 +#define IEEE80211_2040BSSCOEX_40_intol 0x02 +#define IEEE80211_2040BSSCOEX_20_REQ 0x04 +#define IEEE80211_2040BSSCOEX_SCAN_EXEP_REQ 0x08 +#define IEEE80211_2040BSSCOEX_SCAN_EXEP_GRA 0x10 + +#define IEEE80211_CHANSWITCHANN_BYTES 5 +#define QTN_CHANSWITCHANN_TSF_BYTES 10 +#define IEEE80211_CSA_LEN 7 +#define IEEE80211_CSA_TSF_LEN (IEEE80211_CSA_LEN + 10) +#define IEEE80211_SEC_CHAN_OFF_IE_LEN 3 +#define IEEE80211_WBAND_CHANSWITCH_IE_LEN 5 +#define IEEE80211_NCW_ACT_LEN 3 /* Notify Channel Width Action size */ +#define IEEE80211_MU_GRP_ID_ACT_LEN 26 /* MU grp id mgmt action size */ + +#define IEEE80211_NODE_IDX_UNMAP(x) (BR_SUBPORT_UNMAP(x)) +#define IEEE80211_NODE_IDX_MAP(x) (BR_SUBPORT_MAP(x)) +#define IEEE80211_NODE_IDX_VALID(x) ((x) & 0x8000) +#define IEEE80211_NODE_IDX_INVALID(x) (!IEEE80211_NODE_IDX_VALID(x)) + +/* + * The 802.11 spec says at most 2007 stations may be + * associated at once. For most AP's this is way more + * than is feasible so we use a default of 128. This + * number may be overridden by the driver and/or by + * user configuration. + */ +#define IEEE80211_AID_MAX 2007 +#define IEEE80211_AID_DEF 128 + +#define IEEE80211_AID(b) ((b) &~ 0xc000) + +struct ieee80211_tim_ie { + uint8_t tim_ie; /* IEEE80211_ELEMID_TIM */ + uint8_t tim_len; + uint8_t tim_count; /* DTIM count */ + uint8_t tim_period; /* DTIM period */ + uint8_t tim_bitctl; /* bitmap control */ + uint8_t tim_bitmap[IEEE80211_AID_DEF / NBBY]; /* variable-length bitmap */ +} __packed; + +struct ieee80211_ie_sec_chan_off { + uint8_t sco_id; /* IEEE80211_ELEMID_SEC_CHAN_OFF */ + uint8_t sco_len; + uint8_t sco_off; /* offset */ +} __packed; + +struct ieee80211_country_ie { + uint8_t ie; /* IEEE80211_ELEMID_COUNTRY */ + uint8_t len; + uint8_t cc[3]; /* ISO CC+(I)ndoor/(O)utdoor */ + struct { + uint8_t schan; /* starting channel */ + uint8_t nchan; /* number channels */ + uint8_t maxtxpwr; /* tx power cap */ + } __packed band[4]; /* up to 4 sub bands */ +} __packed; + +#define IEEE80211_CHALLENGE_LEN 128 + +#define IEEE80211_SUPPCHAN_LEN 26 + +#define IEEE80211_RATE_BASIC 0x80 +#define IEEE80211_RATE_VAL 0x7f +#define IEEE80211_BSS_MEMBERSHIP_SELECTOR 0x7F + +/* EPR information element flags */ +#define IEEE80211_ERP_NON_ERP_PRESENT 0x01 +#define IEEE80211_ERP_USE_PROTECTION 0x02 +#define IEEE80211_ERP_LONG_PREAMBLE 0x04 + +/* Atheros private advanced capabilities info */ +#define ATHEROS_CAP_TURBO_PRIME 0x01 +#define ATHEROS_CAP_COMPRESSION 0x02 +#define ATHEROS_CAP_FAST_FRAME 0x04 +/* bits 3-6 reserved */ +#define ATHEROS_CAP_BOOST 0x80 + +#define IEEE80211_OUI_LEN 3 + +#define ATH_OUI 0x7f0300 /* Atheros OUI */ +#define ATH_OUI_TYPE 0x01 +#define ATH_OUI_SUBTYPE 0x01 +#define ATH_OUI_VERSION 0x00 +#define ATH_OUI_TYPE_XR 0x03 +#define ATH_OUI_VER_XR 0x01 + +#define QTN_OUI 0x862600 /* Quantenna OUI */ +#define QTN_OUI_CFG 0x01 +#define QTN_OUI_PAIRING 0x02 /* Pairing Protection */ +#define QTN_OUI_VSP_CTRL 0x03 /* VSP configuration */ +#define QTN_OUI_TDLS_BRMACS 0x04 /* TDLS */ +#define QTN_OUI_TDLS 0x05 /* TDLS Information */ +#define QTN_OUI_RM_SPCIAL 0x10 /* Radio measurement special group */ +#define QTN_OUI_RM_ALL 0x11 /* Radio measurement all group */ +#define QTN_OUI_SCS 0x12 /* SCS status report and control */ +#define QTN_OUI_QWME 0x13 /* WME IE between QSTA */ +#define QTN_OUI_EXTENDER_ROLE 0x14 /* WDS Extender Role */ + +#define QTN_OUI_EXTENDER_BSSID 0x15 /* Extender BSSID */ + +#define QTN_OUI_EXTENDER_ROLE_NONE 0x00 /* NONE Role */ +#define QTN_OUI_EXTENDER_ROLE_MBS 0x01 /* MBS Role */ +#define QTN_OUI_EXTENDER_ROLE_RBS 0x02 /* RBS Role */ + +#define QTN_QWME_IE_VERSION 1 + +#define WPA_OUI 0xf25000 +#define WPA_OUI_TYPE 0x01 +#define WSC_OUI_TYPE 0x04 +#define WPA_VERSION 1 /* current supported version */ + +#define WPA_CSE_NULL 0x00 +#define WPA_CSE_WEP40 0x01 +#define WPA_CSE_TKIP 0x02 +#define WPA_CSE_CCMP 0x04 +#define WPA_CSE_WEP104 0x05 +#define RSN_CSE_GROUP_NOT_ALLOW 0x07 /* Group addressed traffic not allowed */ + +#define WPA_ASE_NONE 0x00 +#define WPA_ASE_8021X_UNSPEC 0x01 +#define WPA_ASE_8021X_PSK 0x02 +#define IEEE80211_RSN_ASE_TPK 0x07 /* TDLS TPK Handshake */ + +#define RSN_OUI 0xac0f00 +#define RSN_VERSION 1 /* current supported version */ + +#define BCM_OUI 0x4C9000 /* Apple Products */ +#define BCM_OUI_TYPE 0x01 + +#define BCM_OUI_2 0x181000 /* iPad */ +#define BCM_OUI_2_TYPE 0x02 + + +#define RSN_CSE_NULL 0x00 +#define RSN_CSE_WEP40 0x01 +#define RSN_CSE_TKIP 0x02 +#define RSN_CSE_WRAP 0x03 +#define RSN_CSE_CCMP 0x04 +#define RSN_CSE_WEP104 0x05 +#define RSN_CSE_BIP 0x06 + +#define RSN_ASE_NONE 0x00 +#define RSN_ASE_8021X_UNSPEC 0x01 +#define RSN_ASE_8021X_PSK 0x02 +#define RSN_ASE_8021X_SHA256 0x05 +#define RSN_ASE_8021X_PSK_SHA256 0x06 + +#define RSN_CAP_PREAUTH 0x01 +#define RSN_CAP_MFP_REQ 0x0040 +#define RSN_CAP_MFP_CAP 0x0080 +#define RSN_CAP_SPP_CAP 0x0400 +#define RSN_CAP_SPP_REQ 0x0800 + +#define RSN_IS_MFP(_rsn_caps) (((_rsn_caps) & RSN_CAP_MFP_REQ) || ((_rsn_caps) & RSN_CAP_MFP_CAP)) + +#define WME_OUI 0xf25000 +#define WME_OUI_TYPE 0x02 +#define WME_INFO_OUI_SUBTYPE 0x00 +#define WME_PARAM_OUI_SUBTYPE 0x01 +#define WME_VERSION 1 +#define WME_UAPSD_MASK 0x0f + +#define RLNK_OUI 0x430C00 /* Ralink OUI */ + +#define RTK_OUI 0x4ce000 /* Realtek OUI */ +#define EDIMAX_OUI 0x021f80 /* Edimax OUI */ + +#define PEER_VENDOR_NONE 0x00 +#define PEER_VENDOR_QTN 0x01 +#define PEER_VENDOR_BRCM 0x02 +#define PEER_VENDOR_ATH 0x04 +#define PEER_VENDOR_RLNK 0x08 +#define PEER_VENDOR_RTK 0x10 +#define PEER_VENDOR_INTEL 0x20 + +/* + * 802.11ac VHT Capabilities element + */ +struct ieee80211_ie_vhtcap { + u_int8_t vht_id; /* element ID */ + u_int8_t vht_len; /* length in bytes */ + u_int8_t vht_cap[4]; /* VHT capabilities info */ + u_int8_t vht_mcs_nss_set[8]; /* supported MSC and NSS set */ +} __packed; + +/* VHT capabilities flags */ +#define IEEE80211_VHTCAP_C_RX_LDPC 0x00000010 +#define IEEE80211_VHTCAP_C_SHORT_GI_80 0x00000020 +#define IEEE80211_VHTCAP_C_SHORT_GI_160 0x00000040 +#define IEEE80211_VHTCAP_C_TX_STBC 0x00000080 +#define IEEE80211_VHTCAP_C_SU_BEAM_FORMER_CAP 0x00000800 +#define IEEE80211_VHTCAP_C_SU_BEAM_FORMEE_CAP 0x00001000 +#define IEEE80211_VHTCAP_C_MU_BEAM_FORMER_CAP 0x00080000 +#define IEEE80211_VHTCAP_C_MU_BEAM_FORMEE_CAP 0x00100000 +#define IEEE80211_VHTCAP_C_VHT_TXOP_PS 0x00200000 +#define IEEE80211_VHTCAP_C_PLUS_HTC_MINUS_VHT_CAP 0x00400000 +#define IEEE80211_VHTCAP_C_RX_ATN_PATTERN_CONSISTNCY 0x10000000 +#define IEEE80211_VHTCAP_C_TX_ATN_PATTERN_CONSISTNCY 0x20000000 + +#define IEEE80211_VHTCAP_C_MU_BEAM_FORMXX_CAP_MASK (IEEE80211_VHTCAP_C_MU_BEAM_FORMER_CAP | \ + IEEE80211_VHTCAP_C_MU_BEAM_FORMEE_CAP) + +/* VHT mcs info extras */ +#define IEEE80211_VHTCAP_MCS_MAX 8 +#define IEEE80211_VHTCAP_MCS_DISABLED 0x03 + +/* VHT capability macro */ +/* get macros */ +/* VHT capabilities (all bits) */ +#define IEEE80211_VHTCAP_GET_CAPFLAGS(vhtcap) \ + (u_int32_t)((vhtcap)->vht_cap[0] | \ + ((vhtcap)->vht_cap[1] << 8) | \ + ((vhtcap)->vht_cap[2] << 16) | \ + ((vhtcap)->vht_cap[3] << 24)) + +/* B0-1 Max. MPDU Length */ +#define IEEE80211_VHTCAP_GET_MAXMPDU(vhtcap) \ + (enum ieee80211_vht_maxmpdu)((vhtcap)->vht_cap[0] & 0x03) + +/* B2-3 Supported channel width */ +#define IEEE80211_VHTCAP_GET_CHANWIDTH(vhtcap) \ + (enum ieee80211_vht_chanwidth)(((vhtcap)->vht_cap[0] & 0x0C) >> 2) + +/* B4 RX LDPC support */ +#define IEEE80211_VHTCAP_GET_RXLDPC(vhtcap) \ + (((vhtcap)->vht_cap[0] & 0x10) >> 4) + +/* B5 Short GI for 80MHz support */ +#define IEEE80211_VHTCAP_GET_SGI_80MHZ(vhtcap) \ + (((vhtcap)->vht_cap[0] & 0x20) >> 5) + +/* B7 TX STBC */ +#define IEEE80211_VHTCAP_GET_TXSTBC(vhtcap) \ + (((vhtcap)->vht_cap[0] & 0x80) >> 7) + +/* B8-10 RX STBC */ +#define IEEE80211_VHTCAP_GET_RXSTBC(vhtcap) \ + (enum ieee80211_vht_rxstbc)((vhtcap)->vht_cap[1] & 0x07) + +/* B11 SU Beam-former */ +#define IEEE80211_VHTCAP_GET_SU_BEAMFORMER(vhtcap) \ + (((vhtcap)->vht_cap[1] & 0x08) >> 3) + +/* B12 SU Beam-formee */ +#define IEEE80211_VHTCAP_GET_SU_BEAMFORMEE(vhtcap) \ + (((vhtcap)->vht_cap[1] & 0x10) >> 4) + +/* B13-15 Beamformee STS capability */ +#define IEEE80211_VHTCAP_GET_BFSTSCAP(vhtcap) \ + (u_int8_t)(((vhtcap)->vht_cap[1] & 0xE0) >> 5) + +/* B16-18 Number of sounding Dimensions */ +#define IEEE80211_VHTCAP_GET_NUMSOUND(vhtcap) \ + (u_int8_t)((vhtcap)->vht_cap[2] & 0x07) + +/* B19 MU Beam-formee VHT capability */ +#define IEEE80211_VHTCAP_GET_MU_BEAMFORMER(vhtcap) \ + (((vhtcap)->vht_cap[2] & 0x08) >> 3) + +/* B20 MU Beam-former VHT capability */ +#define IEEE80211_VHTCAP_GET_MU_BEAMFORMEE(vhtcap) \ + (((vhtcap)->vht_cap[2] & 0x10) >> 4) + +/* B22 VHT variant HT control field */ +#define IEEE80211_VHTCAP_GET_HTC_VHT(vhtcap) \ + (((vhtcap)->vht_cap[2] & 0x40) >> 6) + +/* B23-25 Max. A-MPDU Length Exponent */ +#define IEEE80211_VHTCAP_GET_MAXAMPDUEXP(vhtcap) \ + (enum ieee80211_vht_maxampduexp)((((vhtcap)->vht_cap[2] & 0x80) >> 7) | \ + (((vhtcap)->vht_cap[3] & 0x03) << 1)) + +/* B26-27 VHT Link Adaptation capable */ +#define IEEE80211_VHTCAP_GET_LNKADPTCAP(vhtcap) \ + (enum ieee80211_vht_lnkadptcap)(((vhtcap)->vht_cap[3] & 0x0C) >> 2) + +/* B28 Rx Antenna pattern consistency */ +#define IEEE80211_VHTCAP_GET_RXANTPAT(vhtcap) \ + (((vhtcap)->vht_cap[3] & 0x10) >> 4) + +/* B29 Tx Antenna pattern consistency */ +#define IEEE80211_VHTCAP_GET_TXANTPAT(vhtcap) \ + (((vhtcap)->vht_cap[3] & 0x20) >> 5) + +/* B0-B15 RX VHT-MCS MAP for Spatial streams 1-8 */ +#define IEEE80211_VHTCAP_GET_RX_MCS_NSS(vhtcap) \ + (((vhtcap)->vht_mcs_nss_set[1] << 8) | \ + ((vhtcap)->vht_mcs_nss_set[0])) + +/* B32-B47 TX VHT-MCS MAP for Spatial streams 1-8 */ +#define IEEE80211_VHTCAP_GET_TX_MCS_NSS(vhtcap) \ + (((vhtcap)->vht_mcs_nss_set[5] << 8) | \ + ((vhtcap)->vht_mcs_nss_set[4])) + +/* VHT-MCS MAP entry for RX or TX MAP */ +#define IEEE80211_VHTCAP_GET_MCS_MAP_ENTRY(mcsmap, idx) \ + ((mcsmap >> (idx * 2)) & 0x3) + +/* B16-B28 RX Highest supported Long GI data rates */ +#define IEEE80211_VHTCAP_GET_RX_LGIMAXRATE(vhtcap) \ + (u_int16_t)(((vhtcap)->vht_mcs_nss_set[2]) | \ + ((vhtcap)->vht_mcs_nss_set[3] << 8)) + +/* B48-B60 TX Highest supported Long GI data rates */ +#define IEEE80211_VHTCAP_GET_TX_LGIMAXRATE(vhtcap) \ + (u_int16_t)(((vhtcap)->vht_mcs_nss_set[6]) | \ + ((vhtcap)->vht_mcs_nss_set[7] << 8)) + +/* set macros */ +/* VHT capabilities (all bits) */ +#define IEEE80211_VHTCAP_SET_CAPFLAGS(vhtcap, _cap) \ + (vhtcap)->vht_cap[0] = ((_cap) & 0x000000FF); \ + (vhtcap)->vht_cap[1] = (((_cap) & 0x0000FF00) >> 8); \ + (vhtcap)->vht_cap[2] = (((_cap) & 0x00FF0000) >> 16); \ + (vhtcap)->vht_cap[3] = (((_cap) & 0xFF000000) >> 24) + +/* B0-1 Max. MPDU Length */ +#define IEEE80211_VHTCAP_SET_MAXMPDU(vhtcap, _m) \ + (vhtcap)->vht_cap[0] = (((vhtcap)->vht_cap[0] & ~0x03) | ((_m) & 0x03)) + +/* B2-3 Supported channel width */ +#define IEEE80211_VHTCAP_SET_CHANWIDTH(vhtcap, _m) \ + (vhtcap)->vht_cap[0] = (((vhtcap)->vht_cap[0] & ~0x0C) | ((_m) & 0x03) << 2) + +/* B8-10 RX STBC */ +#define IEEE80211_VHTCAP_SET_RXSTBC(vhtcap, _m) \ + (vhtcap)->vht_cap[1] = (((vhtcap)->vht_cap[1] & ~0x07) | ((_m) & 0x07)) + +/* B13-15 Beamformee STS capability */ +#define IEEE80211_VHTCAP_SET_BFSTSCAP(vhtcap, _m) \ + (vhtcap)->vht_cap[1] = (((vhtcap)->vht_cap[1] & ~0xE0) | ((_m) & 0x07) << 5) + +/* B16-18 Number of sounding Dimensions */ +#define IEEE80211_VHTCAP_SET_NUMSOUND(vhtcap, _m) \ + (vhtcap)->vht_cap[2] = (((vhtcap)->vht_cap[2] & ~0x07) | ((_m) & 0x07)) + +/* B23-25 Max. A-MPDU Length Exponent */ +#define IEEE80211_VHTCAP_SET_MAXAMPDUEXP(vhtcap, _m) \ + (vhtcap)->vht_cap[2] = (((vhtcap)->vht_cap[2] & ~0x80) | ((_m) & 0x01) << 7); \ + (vhtcap)->vht_cap[3] = (((vhtcap)->vht_cap[3] & ~0x03) | ((_m) & 0x06) >> 1) + +/* B26-27 VHT Link Adaptation capable */ +#define IEEE80211_VHTCAP_SET_LNKADPTCAP(vhtcap, _m) \ + (vhtcap)->vht_cap[3] = (((vhtcap)->vht_cap[3] & ~0x0C) | ((_m) & 0x03) << 2) + +/* B0-B15 RX VHT-MCS MAP for Spatial streams 1-8 */ +#define IEEE80211_VHTCAP_SET_RX_MCS_NSS(vhtcap, _m) \ + (vhtcap)->vht_mcs_nss_set[1] = (((_m) & 0xFF00) >> 8); \ + (vhtcap)->vht_mcs_nss_set[0] = ((_m) & 0x00FF) + +/* B16-B28 RX Highest supported Long GI data rates */ +#define IEEE80211_VHTCAP_SET_RX_LGIMAXRATE(vhtcap, _m) \ + (vhtcap)->vht_mcs_nss_set[2] = ((_m) & 0x00FF); \ + (vhtcap)->vht_mcs_nss_set[3] = (((_m) & 0x1F00) >> 8) + +/* B32-B47 TX VHT-MCS MAP for Spatial streams 1-8 */ +#define IEEE80211_VHTCAP_SET_TX_MCS_NSS(vhtcap, _m) \ + (vhtcap)->vht_mcs_nss_set[5] = (((_m) & 0xFF00) >> 8); \ + (vhtcap)->vht_mcs_nss_set[4] = ((_m) & 0x00FF) + +/* B48-B60 TX Highest supported Long GI data rates */ +#define IEEE80211_VHTCAP_SET_TX_LGIMAXRATE(vhtcap, _m) \ + (vhtcap)->vht_mcs_nss_set[6] = ((_m) & 0x00FF); \ + (vhtcap)->vht_mcs_nss_set[7] = (((_m) & 0x1F00) >> 8) + +/* VHT MCS MAP */ +#define IEEE80211_VHTMCS_ALL_DISABLE (0xFFFF) + +/* VHT capabilities options */ +/* Defined in _ieee80211.h file */ +/* + * 802.11ac VHT Operation element + */ +struct ieee80211_ie_vhtop { + u_int8_t vhtop_id; /* element ID */ + u_int8_t vhtop_len; /* length in bytes */ + u_int8_t vhtop_info[3]; /* VHT Operation info */ + u_int8_t vhtop_bvhtmcs[2]; /* basic VHT MSC and NSS set */ +} __packed; + +/* VHT Operation Information */ +/* Channel width Octet 1 */ +#define IEEE80211_VHTOP_SET_CHANWIDTH(vhtop, _m) \ + (vhtop)->vhtop_info[0] = (_m) + +/* Channel Center Frequency Segment 0 */ +#define IEEE80211_VHTOP_SET_CENTERFREQ0(vhtop, _m) \ + (vhtop)->vhtop_info[1] = (_m) + +/* Channel Center Frequency Segment 1 */ +#define IEEE80211_VHTOP_SET_CENTERFREQ1(vhtop, _m) \ + (vhtop)->vhtop_info[2] = (_m) + +/* Basic VHT-MCS and NSS Set */ +#define IEEE80211_VHTOP_SET_BASIC_MCS_NSS(vhtop, _m) \ + (vhtop)->vhtop_bvhtmcs[0] = ((_m) & 0xFF00) >> 8; \ + (vhtop)->vhtop_bvhtmcs[1] = ((_m) & 0x00FF) + +/* Get macros */ +/* Channel width Octet 1 */ +#define IEEE80211_VHTOP_GET_CHANWIDTH(vhtop) \ + (vhtop)->vhtop_info[0] + +/* Channel Center Frequency Segment 0 */ +#define IEEE80211_VHTOP_GET_CENTERFREQ0(vhtop) \ + (vhtop)->vhtop_info[1] + +/* Channel Center Frequency Segment 1 */ +#define IEEE80211_VHTOP_GET_CENTERFREQ1(vhtop) \ + (vhtop)->vhtop_info[2] + +/* Basic VHT-MCS and NSS Set */ +#define IEEE80211_VHTOP_GET_BASIC_MCS_NSS(vhtop) \ + (((vhtop)->vhtop_bvhtmcs[0] << 8) | \ + ((vhtop)->vhtop_bvhtmcs[1])) + +/* + * 802.11ac VHT Operating mode notification element + */ +struct ieee80211_ie_vhtop_notif { + uint8_t id; + uint8_t len; + uint8_t vhtop_notif_mode; +} __packed; + +/* + * 802.11ac Extended BSS Load element + */ +struct ieee80211_ie_ebssload { + u_int8_t ebl_id; /* element ID */ + u_int8_t ebl_len; /* length in bytes */ + u_int8_t ebl_mumimo_cnt[2]; /* MU-MIMO Capable station count */ + u_int8_t ebl_ss_underuse; /* Spatial Stream Underutilization */ + u_int8_t ebl_20mhz_use; /* Observable Secondary 20Mhz use */ + u_int8_t ebl_40mhz_use; /* Observable Secondary 40Mhz use */ + u_int8_t ebl_80mhz_use; /* Observable Secondary 80Mhz use */ +} __packed; + + +/* + * 802.11ac Wide Bandwidth Channel Switch element + */ +struct ieee80211_ie_wbchansw { + u_int8_t wbcs_id; /* element ID */ + u_int8_t wbcs_len; /* length in bytes */ + u_int8_t wbcs_newchanw; /* New Channel Width */ + u_int8_t wbcs_newchancf0; /* New Channel Center Freq 0 */ + u_int8_t wbcs_newchancf1; /* New Channel Center Freq 1 */ +} __packed; + + +/* + * 802.11ac VHT Transmit Power Envelope element + */ +enum { + IEEE80211_TX_POW_FOR_20MHZ, + IEEE80211_TX_POW_FOR_40MHZ, + IEEE80211_TX_POW_FOR_80MHZ, + IEEE80211_TX_POW_FOR_160MHZ +}; + +struct ieee80211_ie_vtxpwren { + u_int8_t vtxpwren_id; /* element ID */ + u_int8_t vtxpwren_len; /* length in byte */ + u_int8_t vtxpwren_txpwr_info; /* tx power info */ + u_int8_t vtxpwren_tp20; /* local max tx power for 20Mhz */ + u_int8_t vtxpwren_tp40; /* local max tx power for 40Mhz */ + u_int8_t vtxpwren_tp80; /* local max tx power for 80Mhz */ + u_int8_t vtxpwren_tp160; /* local max tx power for 160Mhz */ +} __packed; + +/* + * 802.11ac Channel Switch Wrapper element + */ +struct ieee80211_ie_chsw_wrapper { + u_int8_t chsw_id; /* element ID */ + u_int8_t chsw_len; /* length in byte */ +} __packed; + +/* + * 802.11ac AID element + */ +struct ieee80211_ie_aid { + u_int8_t aid_id; /* element ID */ + u_int8_t aid_len; /* length in byte */ + u_int16_t aid; /* aid */ +} __packed; + +/* + * 802.11ac Quiet Channel element + */ +struct ieee80211_ie_quietchan { + u_int8_t qc_id; /* element ID */ + u_int8_t qc_len; /* length in byte */ + u_int8_t qc_qmode; /* AP Quite Mode */ + u_int8_t qc_qcnt; /* AP Quite Count */ + u_int8_t qc_qperiod; /* AP Quite Period */ + u_int8_t qc_qduration; /* AP Quite Duration */ + u_int8_t qc_qoffset; /* AP Quite Offset */ +} __packed; + + +/* + * 802.11ac Operating Mode Notification element + */ +struct ieee80211_ie_opmodenotice { + u_int8_t omn_id; /* element ID */ + u_int8_t omn_len; /* length in byte */ + u_int8_t opn_opmode; /* Op Mode */ +} __packed; + +enum { + IEEE80211_TIMEOUT_REASSOC_DEADLINE = 1, + IEEE80211_TIMEOUT_KEY_LIFETIME = 2, + IEEE80211_TIMEOUT_ASSOC_COMEBACK = 3, +}; + +#define IEEE80211_W_ASSOC_COMEBACK_TO 1000 + +/* + * 802.11w timeout information IE + */ +struct ieee80211_timout_int_ie { + u_int8_t timout_int_ie; /* IEEE80211_ELEMID_TIMEOUT_INT */ + u_int8_t timout_int_len; + u_int8_t timout_int_type; /* Timeout Interval Type */ + u_int32_t timout_int_value; /* in tus */ +} __packed; + +/* + * Add the Quantenna OUI to a frame + */ +uint8_t ieee80211_oui_add_qtn(uint8_t *oui); + +/* + * AUTH management packets + * + * octet algo[2] + * octet seq[2] + * octet status[2] + * octet chal.id + * octet chal.length + * octet chal.text[253] + */ + +typedef uint8_t *ieee80211_mgt_auth_t; + +#define IEEE80211_AUTH_ALGORITHM(auth) \ + ((auth)[0] | ((auth)[1] << 8)) +#define IEEE80211_AUTH_TRANSACTION(auth) \ + ((auth)[2] | ((auth)[3] << 8)) +#define IEEE80211_AUTH_STATUS(auth) \ + ((auth)[4] | ((auth)[5] << 8)) + +#define IEEE80211_AUTH_ALG_OPEN 0x0000 +#define IEEE80211_AUTH_ALG_SHARED 0x0001 +#define IEEE80211_AUTH_ALG_LEAP 0x0080 + +enum { + IEEE80211_AUTH_OPEN_REQUEST = 1, + IEEE80211_AUTH_OPEN_RESPONSE = 2, +}; + +enum { + IEEE80211_AUTH_SHARED_REQUEST = 1, + IEEE80211_AUTH_SHARED_CHALLENGE = 2, + IEEE80211_AUTH_SHARED_RESPONSE = 3, + IEEE80211_AUTH_SHARED_PASS = 4, +}; + +/* + * Reason codes + * + * Unlisted codes are reserved + */ + +enum { + IEEE80211_REASON_UNSPECIFIED = 1, + IEEE80211_REASON_AUTH_EXPIRE = 2, + IEEE80211_REASON_AUTH_LEAVE = 3, + IEEE80211_REASON_ASSOC_EXPIRE = 4, + IEEE80211_REASON_ASSOC_TOOMANY = 5, + IEEE80211_REASON_NOT_AUTHED = 6, + IEEE80211_REASON_NOT_ASSOCED = 7, + IEEE80211_REASON_ASSOC_LEAVE = 8, + IEEE80211_REASON_ASSOC_NOT_AUTHED = 9, + IEEE80211_REASON_DISASSOC_BAD_POWER = 10, + IEEE80211_REASON_DISASSOC_BAD_SUPP_CHAN = 11, + IEEE80211_REASON_IE_INVALID = 13, + IEEE80211_REASON_MIC_FAILURE = 14, + IEEE80211_REASON_4WAY_HANDSHAKE_TIMEOUT = 15, + IEEE80211_REASON_GROUP_KEY_HANDSHAKE_TIMEOUT = 16, + IEEE80211_REASON_IE_DIFFERENT = 17, + IEEE80211_REASON_INVALID_GROUP_CIPHER = 18, + IEEE80211_REASON_INVALID_PAIRWISE_CIPHER = 19, + IEEE80211_REASON_INVALID_AKMP = 20, + IEEE80211_REASON_UNSUPP_RSN_VERSION = 21, + IEEE80211_REASON_INVALID_RSN_IE_CAP = 22, + IEEE80211_REASON_IEEE8021X_FAILED = 23, + IEEE80211_REASON_CIPHER_SUITE_REJECTED = 24, + IEEE80211_REASON_TDLS_UNREACH = 25, /* TDLS teardown due to peer unreachable */ + IEEE80211_REASON_TDLS_UNSPEC = 26, /* TDLS teardown for unspecified reason */ + IEEE80211_REASON_DISASSOC_UNSPECIFIED_QOS = 32, + IEEE80211_REASON_DISASSOC_QOS_AP_NO_BANDWIDTH = 33, + IEEE80211_REASON_DISASSOC_LOW_ACK = 34, + IEEE80211_REASON_DISASSOC_STA_EXCEED_TXOP = 35, + IEEE80211_REASON_STA_LEAVE_BSS = 36, + IEEE80211_REASON_STA_NOT_USE = 37, + IEEE80211_REASON_STA_REQUIRE_SETUP = 38, + IEEE80211_REASON_STA_TIMEOUT = 39, + IEEE80211_REASON_STA_CIPHER_NOT_SUPP = 45, + + + IEEE80211_STATUS_SUCCESS = 0, + IEEE80211_STATUS_UNSPECIFIED = 1, + IEEE80211_STATUS_TDLS_WKUP_REJ_ALT = 2, /* Wakeup sched rejected/alternative */ + IEEE80211_STATUS_TDLS_WKUP_REJ = 3, /* Wakeup sched rejected */ + IEEE80211_STATUS_SEC_DIS = 5, /* Security disabled */ + IEEE80211_STATUS_LIFETIME_NOTOK = 6, /* Unacceptable lifetime */ + IEEE80211_STATUS_BSS_INVALID = 7, /* Not in same BSS */ + IEEE80211_STATUS_CAPINFO = 10, + IEEE80211_STATUS_NOT_ASSOCED = 11, + IEEE80211_STATUS_OTHER = 12, + IEEE80211_STATUS_ALG = 13, + IEEE80211_STATUS_SEQUENCE = 14, + IEEE80211_STATUS_CHALLENGE = 15, + IEEE80211_STATUS_TIMEOUT = 16, + IEEE80211_STATUS_TOOMANY = 17, + IEEE80211_STATUS_BASIC_RATE = 18, + IEEE80211_STATUS_SP_REQUIRED = 19, + IEEE80211_STATUS_PBCC_REQUIRED = 20, + IEEE80211_STATUS_CA_REQUIRED = 21, + IEEE80211_STATUS_TOO_MANY_STATIONS = 22, + IEEE80211_STATUS_RATES = 23, + IEEE80211_STATUS_SHORTSLOT_REQUIRED = 25, + IEEE80211_STATUS_DSSSOFDM_REQUIRED = 26, + IEEE80211_STATUS_HT_FEATURE = 27, + IEEE80211_STATUS_PMF_REJECT_RETRY = 30, + IEEE80211_STATUS_PMF_VIOLATION = 31, + IEEE80211_STATUS_PEER_MECHANISM_REJECT = 37, + IEEE80211_STATUS_TDLS_RSNIE_INVALID = 72, /* Invalid contents of RSNIE */ + + /* Quantenna */ + IEEE80211_STATUS_DENIED = 100, +}; + +#define IEEE80211_WEP_KEYLEN 5 /* 40bit */ +#define IEEE80211_WEP_IVLEN 3 /* 24bit */ +#define IEEE80211_WEP_KIDLEN 1 /* 1 octet */ +#define IEEE80211_WEP_CRCLEN 4 /* CRC-32 */ +#define IEEE80211_WEP_NKID 4 /* number of key ids */ + +/* + * 802.11i defines an extended IV for use with non-WEP ciphers. + * When the EXTIV bit is set in the key id byte an additional + * 4 bytes immediately follow the IV for TKIP. For CCMP the + * EXTIV bit is likewise set but the 8 bytes represent the + * CCMP header rather than IV+extended-IV. + */ +#define IEEE80211_WEP_EXTIV 0x20 +#define IEEE80211_WEP_EXTIVLEN 4 /* extended IV length */ +#define IEEE80211_WEP_CCMPLEN 8 /* CCMP header */ +#define IEEE80211_WEP_MICLEN 8 /* trailing MIC */ +#define IEEE80211_WEP_ICVLEN 4 /* ICV */ + +#define IEEE80211_CRC_LEN 4 +#define IEEE80211_MAX_IE_LEN 257 + +/* + * Maximum acceptable MTU is: + * IEEE80211_MAX_LEN - WEP overhead - CRC - + * QoS overhead - RSN/WPA overhead + * Min is arbitrarily chosen > IEEE80211_MIN_LEN. The default + * mtu is Ethernet-compatible; it's set by ether_ifattach. + */ +#define IEEE80211_MTU_MAX 3500 +#define IEEE80211_MTU_MIN 32 + +#define IEEE80211_MAX_LEN (2300 + IEEE80211_CRC_LEN + \ + (IEEE80211_WEP_IVLEN + IEEE80211_WEP_KIDLEN + IEEE80211_WEP_CRCLEN)) +#define IEEE80211_ACK_LEN \ + (sizeof(struct ieee80211_frame_ack) + IEEE80211_CRC_LEN) +#define IEEE80211_MIN_LEN \ + (sizeof(struct ieee80211_frame_min) + IEEE80211_CRC_LEN) + +/* + * RTS frame length parameters. The default is specified in + * the 802.11 spec. The max may be wrong for jumbo frames. + */ +#define IEEE80211_RTS_DEFAULT 512 +#define IEEE80211_RTS_MIN 0 +#define IEEE80211_RTS_MAX 65536 +#define IEEE80211_RTS_THRESH_OFF (IEEE80211_RTS_MAX + 1) + +/* + * Regulatory extension identifier for country IE. + */ +#define IEEE80211_REG_EXT_ID 201 + +/* + * IEEE 802.11 timer synchronization function (TSF) timestamp length + */ +#define IEEE80211_TSF_LEN 8 +/* + * 802.11n defines + */ +#define IEEE80211_11N_BAWLEN 64 +#define IEEE80211_11N_QLENLIM (64*1024) + +#define IEEE80211_11N_SEQINORDER_BAW(seq_front, seq_back) \ + IEEE80211_SEQ_INORDER_LAG((seq_front), (seq_back), IEEE80211_11N_BAWLEN) + +struct wmm_params { + uint8_t wmm_acm; /* ACM parameter */ + uint8_t wmm_aifsn; /* AIFSN parameters */ + uint8_t wmm_logcwmin; /* cwmin in exponential form */ + uint8_t wmm_logcwmax; /* cwmax in exponential form */ + uint16_t wmm_txopLimit; /* txopLimit */ + uint8_t wmm_noackPolicy; /* No-Ack Policy: 0=ack, 1=no-ack */ +}; + +#define IEEE80211_DEFAULT_BA_WINSIZE 64 /* use for explicit BA establishing, size and throughput is moderate */ +#define IEEE80211_DEFAULT_BA_WINSIZE_H 256 /* use for implicit BA, large size to support large aggregates and high throughput */ +#define IEEE80211_MAX_BA_WINSIZE 0x3FF + +/*value assignment for the little-endian*/ +#define ADDINT16LE(frm, v) do { \ + frm[0] = (v) & 0xff; \ + frm[1] = ((v) >> 8) & 0xff; \ + frm += 2; \ +} while (0) +/* 32 bits to 32 bits */ +#define ADDINT32LE(frm, v) do { \ + frm[0] = (v) & 0xff; \ + frm[1] = ((v) >> 8) & 0xff; \ + frm[2] = ((v) >> 16) & 0xff; \ + frm[3] = ((v) >> 24) & 0xff; \ + frm += 4; \ +} while (0) + + +/* value assignment */ +/* 16 bits to 16 bits */ +#define ADDINT16(frm, v) do { \ + frm[1] = (v) & 0xff; \ + frm[0] = ((v) >> 8) & 0xff; \ + frm += 2; \ +} while (0) +/* 32 bits to 32 bits */ +#define ADDINT32(frm, v) do { \ + frm[3] = (v) & 0xff; \ + frm[2] = ((v) >> 8) & 0xff; \ + frm[1] = ((v) >> 16) & 0xff; \ + frm[0] = ((v) >> 24) & 0xff; \ + frm += 4; \ +} while (0) +/* 8 bits to 32 bits */ +#define ADDINT8TO32(frm, v) do { \ + frm[3] = (v) & 0xff; \ + frm[2] = 0; \ + frm[1] = 0; \ + frm[0] = 0; \ + frm += 4; \ +} while (0) +/* 16 bits to 32 bits */ +#define ADDINT16TO32(frm, v) do { \ + frm[3] = (v) & 0xff; \ + frm[2] = ((v) >> 8) & 0xff; \ + frm[1] = 0; \ + frm[0] = 0; \ + frm += 4; \ +} while (0) +/* 32 bits to 64 bits */ +#define ADDINT32TO64(frm, v) do { \ + frm[7] = (v) & 0xff; \ + frm[6] = ((v) >> 8) & 0xff; \ + frm[5] = ((v) >> 16) & 0xff; \ + frm[4] = ((v) >> 24) & 0xff; \ + frm[3] = 0; \ + frm[2] = 0; \ + frm[1] = 0; \ + frm[0] = 0; \ + frm += 8; \ +} while (0) + +#define IEEE80211_IE_LEADER_STR_VHTCAP "vhtcap_ie=" +#define IEEE80211_IE_LEADER_STR_HTCAP "htcap_ie=" +#define IEEE80211_IE_LEADER_STR_RSN "rsn_ie=" +#define IEEE80211_IE_LEADER_STR_WPA "wpa_ie=" +#define IEEE80211_IE_LEADER_STR_WME "wme_ie=" +#define IEEE80211_IE_LEADER_STR_ATH "ath_ie=" +#define IEEE80211_IE_LEADER_STR_EXT_ROLE "qtn_extender_role=" + +#ifndef DSP_BUILD +static __inline__ int ieee80211_is_bcst(const void *p) +{ + const uint16_t *p16 = p; + + return (p16[0] == 0xFFFF) && (p16[1] == 0xFFFF) && (p16[2] == 0xFFFF); +} + +#ifdef TOPAZ_PLATFORM +/* + * IEEE802.11w spec - Table 8-38 and section 11.1.7 + */ +static __inline__ int ieee80211_mgmt_is_robust(const struct ieee80211_frame *wh) { + + int is_robust_mgmt = 0; + const uint8_t subtype = wh->i_fc[0] & IEEE80211_FC0_SUBTYPE_MASK; + + switch (subtype){ + case IEEE80211_FC0_SUBTYPE_DEAUTH: + case IEEE80211_FC0_SUBTYPE_DISASSOC: + is_robust_mgmt = 1; + break; + case IEEE80211_FC0_SUBTYPE_ACTION: + { + struct ieee80211_action *ia; + ia = (struct ieee80211_action *) (void*)&wh[1]; + + switch (ia->ia_category) { + case IEEE80211_ACTION_CAT_SPEC_MGMT: + case IEEE80211_ACTION_CAT_QOS: + case IEEE80211_ACTION_CAT_DLS: + case IEEE80211_ACTION_CAT_BA: + case IEEE80211_ACTION_CAT_RM: + case IEEE80211_ACTION_CAT_FBSS: + case IEEE80211_ACTION_CAT_SA_QUERY: + case IEEE80211_ACTION_CAT_PROT_DUAL_PA: + case IEEE80211_ACTION_CAT_WNM: + case IEEE80211_ACTION_CAT_MESH: + case IEEE80211_ACTION_CAT_MULTIHOP: + case IEEE80211_ACTION_CAT_VEND_PROT: + is_robust_mgmt = 1; + break; + default: + is_robust_mgmt = 0; + break; + } + break; + } + default: + break; + + } + + return is_robust_mgmt; +} +#endif +#endif + +#define IEEE80211_N_RATE_PREFIX 0x7F000000 +#define IEEE80211_AC_RATE_PREFIX 0x7E000000 +#define IEEE80211_RATE_PREFIX_MASK 0xFF000000 + +#define IEEE80211U_PARAM_IPV4ADDRTYPE_MIN 0 +#define IEEE80211U_PARAM_IPV4ADDRTYPE_MAX 7 +#define IEEE80211U_PARAM_IPV6ADDRTYPE_MIN 0 +#define IEEE80211U_PARAM_IPV6ADDRTYPE_MAX 2 +#define IEEE80211U_PARAM_IP_STATUS_MAX 2 +/* MU MIMO */ +#define IEEE80211_MU_GRP_VALID(_grp) \ + (((_grp) > 0) && ((_grp) < (IEEE80211_VHT_GRP_MAX_BIT_OFFSET+1))) + +#define IEEE80211_MU_POS_VALID(_pos) ((_pos) < 4) + +#define IEEE80211_MU_DEL_GRP(mu_grp, _grp) do { \ + (mu_grp).member[(_grp) >> 3] &= ~(1 << ((_grp) & 0x7)); \ +} while (0) + +#define IEEE80211_MU_ADD_GRP(mu_grp, _grp, _pos) do { \ + (mu_grp).member[(_grp) >> 3] |= (1 << ((_grp) & 0x7)); \ + (mu_grp).pos[(_grp) >> 2] &= ~((0x03 << (((_grp) & 0x3) << 1))); \ + (mu_grp).pos[(_grp) >> 2] |= (((_pos) << (((_grp) & 0x3) << 1))); \ +} while (0) + +#define IEEE80211_MU_IS_GRP_MBR(mu_grp, _grp) \ + ((mu_grp).member[(_grp) >> 3] & (1 << ((_grp) & 0x7))) + +#define IEEE80211_MU_GRP_POS(mu_grp, _grp) \ + (((mu_grp).pos[(_grp) >> 2] >> (((_grp) & 0x3) << 1)) & 0x3) + +#endif /* _NET80211_IEEE80211_H_ */ + diff --git a/package/firmware/quantenna/src/net80211/ieee80211_crypto.h b/package/firmware/quantenna/src/net80211/ieee80211_crypto.h new file mode 100644 index 000000000..1adb065a4 --- /dev/null +++ b/package/firmware/quantenna/src/net80211/ieee80211_crypto.h @@ -0,0 +1,211 @@ +/*- + * Copyright (c) 2001 Atsushi Onoe + * Copyright (c) 2002-2005 Sam Leffler, Errno Consulting + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * Alternatively, this software may be distributed under the terms of the + * GNU General Public License ("GPL") version 2 as published by the Free + * Software Foundation. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * $Id: ieee80211_crypto.h 1441 2006-02-06 16:03:21Z mrenzmann $ + */ +#ifndef _NET80211_IEEE80211_CRYPTO_H_ +#define _NET80211_IEEE80211_CRYPTO_H_ + +/* + * 802.11 protocol crypto-related definitions. + */ +#define IEEE80211_KEYBUF_SIZE 16 +#define IEEE80211_MICBUF_SIZE (8 + 8) /* space for both tx+rx keys */ + +#define IEEE80211_QOS_TID_MAX 16 +#define IEEE80211_RSC_NON_QOS (IEEE80211_QOS_TID_MAX) +#define IEEE80211_RSC_ROBUST_MGMT (IEEE80211_QOS_TID_MAX + 1) +#define IEEE80211_RSC_MAX (IEEE80211_QOS_TID_MAX + 2) + +/* + * Old WEP-style key. Deprecated. + */ +struct ieee80211_wepkey { + u_int wk_len; /* key length in bytes */ + u_int8_t wk_key[IEEE80211_KEYBUF_SIZE]; +}; + +struct ieee80211_cipher; + +/* + * Crypto key state. There is sufficient room for all supported + * ciphers (see below). The underlying ciphers are handled + * separately through loadable cipher modules that register with + * the generic crypto support. A key has a reference to an instance + * of the cipher; any per-key state is hung off wk_private by the + * cipher when it is attached. Ciphers are automatically called + * to detach and cleanup any such state when the key is deleted. + * + * The generic crypto support handles encap/decap of cipher-related + * frame contents for both hardware- and software-based implementations. + * A key requiring software crypto support is automatically flagged and + * the cipher is expected to honor this and do the necessary work. + * Ciphers such as TKIP may also support mixed hardware/software + * encrypt/decrypt and MIC processing. + * + * Note: This definition must be the same as qtn_key. + */ +struct ieee80211_key { + u_int8_t wk_keylen; /* key length in bytes */ + u_int8_t wk_flags; +#define IEEE80211_KEY_XMIT 0x01 /* key used for xmit */ +#define IEEE80211_KEY_RECV 0x02 /* key used for recv */ +#define IEEE80211_KEY_GROUP 0x04 /* key used for WPA group operation */ +#define IEEE80211_KEY_SWCRYPT 0x10 /* host-based encrypt/decrypt */ +#define IEEE80211_KEY_SWMIC 0x20 /* host-based enmic/demic */ +#define IEEE80211_KEY_VLANGROUP 0x40 /* VLAN group key */ + u_int16_t wk_keyix; /* key index */ + u_int8_t wk_key[IEEE80211_KEYBUF_SIZE+IEEE80211_MICBUF_SIZE]; +#define wk_txmic wk_key + IEEE80211_KEYBUF_SIZE + 0 +#define wk_rxmic wk_key + IEEE80211_KEYBUF_SIZE + 8 + u_int64_t wk_keyrsc[IEEE80211_RSC_MAX]; /* key receive sequence counter */ + u_int64_t wk_keytsc; /* key transmit sequence counter */ + u_int32_t wk_ciphertype; + const struct ieee80211_cipher *wk_cipher; + void *wk_private; /* private cipher state */ +}; +#define IEEE80211_KEY_COMMON /* common flags passed in by apps */\ + (IEEE80211_KEY_XMIT | IEEE80211_KEY_RECV | IEEE80211_KEY_GROUP) + +/* + * NB: these values are ordered carefully; there are lots of + * of implications in any reordering. In particular beware + * that 4 is not used to avoid conflicting with IEEE80211_F_PRIVACY. + */ +#define IEEE80211_CIPHER_WEP 0 +#define IEEE80211_CIPHER_TKIP 1 +#define IEEE80211_CIPHER_AES_OCB 2 +#define IEEE80211_CIPHER_AES_CCM 3 +#define IEEE80211_CIPHER_AES_CMAC 4 +#define IEEE80211_CIPHER_CKIP 5 +#define IEEE80211_CIPHER_NONE 6 /* pseudo value */ + +#define IEEE80211_CIPHER_MAX (IEEE80211_CIPHER_NONE+1) + +#define IEEE80211_KEYIX_NONE ((u_int8_t) - 1) + +#if defined(__KERNEL__) || defined(_KERNEL) + +struct ieee80211com; +struct ieee80211vap; +struct ieee80211_node; +struct sk_buff; + +void ieee80211_crypto_attach(struct ieee80211com *); +void ieee80211_crypto_detach(struct ieee80211com *); +void ieee80211_crypto_vattach(struct ieee80211vap *); +void ieee80211_crypto_vdetach(struct ieee80211vap *); +int ieee80211_crypto_newkey(struct ieee80211vap *, int, int, + struct ieee80211_key *); +int ieee80211_crypto_delkey(struct ieee80211vap *, struct ieee80211_key *, + struct ieee80211_node *); +int ieee80211_crypto_setkey(struct ieee80211vap *, struct ieee80211_key *, + const u_int8_t macaddr[IEEE80211_ADDR_LEN], struct ieee80211_node *); +void ieee80211_crypto_delglobalkeys(struct ieee80211vap *); + +/* + * Template for a supported cipher. Ciphers register with the + * crypto code and are typically loaded as separate modules + * (the null cipher is always present). + * XXX may need refcnts + */ +struct ieee80211_cipher { + const char *ic_name; /* printable name */ + u_int ic_cipher; /* IEEE80211_CIPHER_* */ + u_int ic_header; /* size of privacy header (bytes) */ + u_int ic_trailer; /* size of privacy trailer (bytes) */ + u_int ic_miclen; /* size of mic trailer (bytes) */ + void *(*ic_attach)(struct ieee80211vap *, struct ieee80211_key *); + void (*ic_detach)(struct ieee80211_key *); + int (*ic_setkey)(struct ieee80211_key *); + int (*ic_encap)(struct ieee80211_key *, struct sk_buff *, u_int8_t); + int (*ic_decap)(struct ieee80211_key *, struct sk_buff *, int); + int (*ic_enmic)(struct ieee80211_key *, struct sk_buff *, int); + int (*ic_demic)(struct ieee80211_key *, struct sk_buff *, int); +}; +extern const struct ieee80211_cipher ieee80211_cipher_none; + +void ieee80211_crypto_register(const struct ieee80211_cipher *); +void ieee80211_crypto_unregister(const struct ieee80211_cipher *); +int ieee80211_crypto_available(u_int); + +struct ieee80211_key *ieee80211_crypto_encap(struct ieee80211_node *, + struct sk_buff *); +struct ieee80211_key *ieee80211_crypto_decap(struct ieee80211_node *, + struct sk_buff *, int); + +/* + * Check and remove any MIC. + */ +static __inline int +ieee80211_crypto_demic(struct ieee80211vap *vap, struct ieee80211_key *k, + struct sk_buff *skb, int hdrlen) +{ + const struct ieee80211_cipher *cip = k->wk_cipher; + return (cip->ic_miclen > 0 ? cip->ic_demic(k, skb, hdrlen) : 1); +} + +/* + * Add any MIC. + */ +static __inline int +ieee80211_crypto_enmic(struct ieee80211vap *vap, struct ieee80211_key *k, + struct sk_buff *skb, int force) +{ + const struct ieee80211_cipher *cip = k->wk_cipher; + return (cip->ic_miclen > 0 ? cip->ic_enmic(k, skb, force) : 1); +} + +/* + * Reset key state to an unused state. The crypto + * key allocation mechanism ensures other state (e.g. + * key data) is properly setup before a key is used. + */ +static __inline void +ieee80211_crypto_resetkey(struct ieee80211vap *vap, struct ieee80211_key *k, + u_int16_t ix) +{ + k->wk_cipher = &ieee80211_cipher_none;; + k->wk_private = k->wk_cipher->ic_attach(vap, k); + k->wk_keyix = ix; + k->wk_flags = IEEE80211_KEY_XMIT | IEEE80211_KEY_RECV; +} + +/* + * Crypto-related notification methods. + */ +void ieee80211_notify_replay_failure(struct ieee80211vap *, + const struct ieee80211_frame *, const struct ieee80211_key *, + u_int64_t rsc); +void ieee80211_notify_michael_failure(struct ieee80211vap *, + const struct ieee80211_frame *, u_int keyix); +#endif /* defined(__KERNEL__) || defined(_KERNEL) */ +#endif /* _NET80211_IEEE80211_CRYPTO_H_ */ diff --git a/package/firmware/quantenna/src/net80211/ieee80211_dfs_reentry.h b/package/firmware/quantenna/src/net80211/ieee80211_dfs_reentry.h new file mode 100644 index 000000000..fc5c37ca8 --- /dev/null +++ b/package/firmware/quantenna/src/net80211/ieee80211_dfs_reentry.h @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2012 Quantenna Communications, Inc. + * All rights reserved. + * + * Common DFS re-entry definitions. + */ +#ifndef _IEEE80211_DFS_REENTRY_H +#define _IEEE80211_DFS_REENTRY_H + +/* + * DFS-reentry + */ +#define IEEE80211_PICK_DOMIAN_MASK 0x0007 +#define IEEE80211_PICK_ALL 0x0001 /* pick channel from all available channels */ +#define IEEE80211_PICK_DFS 0x0002 /* pick channel from available DFS channel */ +#define IEEE80211_PICK_NONDFS 0x0004 /* pick channel from available non-DFS channel */ + +#define IEEE80211_PICK_CONTROL_MASK 0x00F8 +#define IEEE80211_PICK_SCAN_FLUSH 0x0008 +#define IEEE80211_PICK_BG_ACTIVE 0x0010 +#define IEEE80211_PICK_BG_PASSIVE_FAST 0x0020 +#define IEEE80211_PICK_BG_PASSIVE_NORMAL 0x0040 +#define IEEE80211_PICK_BG_PASSIVE_SLOW 0x0080 +#define IEEE80211_PICK_BG_MODE_MASK 0x00F0 + +#define IEEE80211_PICK_ALGORITHM_MASK 0xFF00 +#define IEEE80211_PICK_CLEAREST 0x0100 /* pick clearest channel */ +#define IEEE80211_PICK_REENTRY 0x0200 /* pick channel again after DFS process */ +#define IEEE80211_PICK_NOPICK 0x0400 /* do not pick channel */ +#define IEEE80211_PICK_NOPICK_BG 0x0800 /* scan background and do not pick channel */ +#define IEEE80211_PICK_DEFAULT (IEEE80211_PICK_ALL | IEEE80211_PICK_CLEAREST) + +#endif diff --git a/package/firmware/quantenna/src/net80211/ieee80211_ioctl.h b/package/firmware/quantenna/src/net80211/ieee80211_ioctl.h new file mode 100644 index 000000000..5123c7aeb --- /dev/null +++ b/package/firmware/quantenna/src/net80211/ieee80211_ioctl.h @@ -0,0 +1,1756 @@ +/*- + * Copyright (c) 2001 Atsushi Onoe + * Copyright (c) 2002-2005 Sam Leffler, Errno Consulting + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * Alternatively, this software may be distributed under the terms of the + * GNU General Public License ("GPL") version 2 as published by the Free + * Software Foundation. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * $Id: ieee80211_ioctl.h 1856 2006-12-14 01:38:00Z scottr $ + */ +#ifndef _NET80211_IEEE80211_IOCTL_H_ +#define _NET80211_IEEE80211_IOCTL_H_ + +/* + * IEEE 802.11 ioctls. + */ +#include "net80211/_ieee80211.h" +#include "net80211/ieee80211.h" +#include "net80211/ieee80211_qos.h" +#include "net80211/ieee80211_crypto.h" + +/* + * Per-channel flags to differentiate chan_pri_inactive configuration + * between regulatory db and user configuration. + * By default, system uses static regulatory db configs. + * However driver shall always honour dynamic user coniguration. + * In this way, user configuration will override regulatory db configs. + */ +enum { + CHAN_PRI_INACTIVE_CFG_DATABASE = 0x1, + CHAN_PRI_INACTIVE_CFG_USER_OVERRIDE = 0x2 +}; + +/* + * Per/node (station) statistics available when operating as an AP. + */ +struct ieee80211_nodestats { + uint32_t ns_rx_data; /* rx data frames */ + uint32_t ns_rx_mgmt; /* rx management frames */ + uint32_t ns_rx_ctrl; /* rx control frames */ + uint32_t ns_rx_ucast; /* rx unicast frames */ + uint32_t ns_rx_mcast; /* rx multicast frames */ + uint32_t ns_rx_bcast; /* rx broadcast frames */ + uint64_t ns_rx_bytes; /* rx data count (bytes) */ + uint64_t ns_rx_beacons; /* rx beacon frames */ + uint32_t ns_rx_proberesp; /* rx probe response frames */ + + uint32_t ns_rx_dup; /* rx discard because it's a dup */ + uint32_t ns_rx_noprivacy; /* rx w/ wep but privacy off */ + uint32_t ns_rx_wepfail; /* rx wep processing failed */ + uint32_t ns_rx_demicfail; /* rx demic failed */ + uint32_t ns_rx_decap; /* rx decapsulation failed */ + uint32_t ns_rx_defrag; /* rx defragmentation failed */ + uint32_t ns_rx_disassoc; /* rx disassociation */ + uint32_t ns_rx_deauth; /* rx deauthentication */ + uint32_t ns_rx_decryptcrc; /* rx decrypt failed on crc */ + uint32_t ns_rx_unauth; /* rx on unauthorized port */ + uint32_t ns_rx_unencrypted; /* rx unecrypted w/ privacy */ + + uint32_t ns_tx_data; /* tx data frames */ + uint32_t ns_tx_mgmt; /* tx management frames */ + uint32_t ns_tx_ucast; /* tx unicast frames */ + uint32_t ns_tx_mcast; /* tx multicast frames */ + uint32_t ns_tx_bcast; /* tx broadcast frames */ + uint64_t ns_tx_bytes; /* tx data count (bytes) */ + uint32_t ns_tx_probereq; /* tx probe request frames */ + uint32_t ns_tx_uapsd; /* tx on uapsd queue */ + + uint32_t ns_tx_novlantag; /* tx discard due to no tag */ + uint32_t ns_tx_vlanmismatch; /* tx discard due to of bad tag */ + uint32_t ns_tx_unauth; /* rx on unauthorized port */ + + uint32_t ns_tx_eosplost; /* uapsd EOSP retried out */ + + uint32_t ns_ps_discard; /* ps discard due to of age */ + + uint32_t ns_uapsd_triggers; /* uapsd triggers */ + + /* MIB-related state */ + uint32_t ns_tx_assoc; /* [re]associations */ + uint32_t ns_tx_assoc_fail; /* [re]association failures */ + uint32_t ns_tx_auth; /* [re]authentications */ + uint32_t ns_tx_auth_fail; /* [re]authentication failures*/ + uint32_t ns_tx_deauth; /* deauthentications */ + uint32_t ns_tx_deauth_code; /* last deauth reason */ + uint32_t ns_tx_disassoc; /* disassociations */ + uint32_t ns_tx_disassoc_code; /* last disassociation reason */ + uint32_t ns_psq_drops; /* power save queue drops */ + uint32_t ns_rx_action; /* rx action */ + uint32_t ns_tx_action; + /* + * Next few fields track the corresponding entry in struct net_device_stats, + * but here for each associated node + */ + uint32_t ns_rx_errors; + uint32_t ns_tx_errors; + uint32_t ns_rx_dropped; + uint32_t ns_tx_dropped; + + uint32_t ns_ap_isolation_dropped; + uint32_t ns_rx_fragment_pkts; + uint32_t ns_rx_vlan_pkts; + + uint32_t ns_rx_tdls_action; + uint32_t ns_tx_tdls_action; +}; + +/* + * Summary statistics. + */ +struct ieee80211_stats { + uint32_t is_rx_badversion; /* rx frame with bad version */ + uint32_t is_rx_tooshort; /* rx frame too short */ + uint32_t is_rx_wrongbss; /* rx from wrong bssid */ + uint32_t is_rx_dup; /* rx discard due to it's a dup */ + uint32_t is_rx_wrongdir; /* rx w/ wrong direction */ + uint32_t is_rx_mcastecho; /* rx discard due to of mcast echo */ + uint32_t is_rx_notassoc; /* rx discard due to sta !assoc */ + uint32_t is_rx_noprivacy; /* rx w/ wep but privacy off */ + uint32_t is_rx_unencrypted; /* rx w/o wep and privacy on */ + uint32_t is_rx_wepfail; /* rx wep processing failed */ + uint32_t is_rx_decap; /* rx decapsulation failed */ + uint32_t is_rx_mgtdiscard; /* rx discard mgt frames */ + uint32_t is_rx_ctl; /* rx discard ctrl frames */ + uint32_t is_rx_beacon; /* rx beacon frames */ + uint32_t is_rx_rstoobig; /* rx rate set truncated */ + uint32_t is_rx_elem_missing; /* rx required element missing*/ + uint32_t is_rx_elem_toobig; /* rx element too big */ + uint32_t is_rx_elem_toosmall; /* rx element too small */ + uint32_t is_rx_elem_unknown; /* rx element unknown */ + uint32_t is_rx_badchan; /* rx frame w/ invalid chan */ + uint32_t is_rx_chanmismatch; /* rx frame chan mismatch */ + uint32_t is_rx_nodealloc; /* rx frame dropped */ + uint32_t is_rx_ssidmismatch; /* rx frame ssid mismatch */ + uint32_t is_rx_auth_unsupported;/* rx w/ unsupported auth alg */ + uint32_t is_rx_auth_fail; /* rx sta auth failure */ + uint32_t is_rx_auth_countermeasures;/* rx auth discard due to CM */ + uint32_t is_rx_assoc_bss; /* rx assoc from wrong bssid */ + uint32_t is_rx_assoc_notauth; /* rx assoc w/o auth */ + uint32_t is_rx_assoc_capmismatch;/* rx assoc w/ cap mismatch */ + uint32_t is_rx_assoc_norate; /* rx assoc w/ no rate match */ + uint32_t is_rx_assoc_badwpaie; /* rx assoc w/ bad WPA IE */ + uint32_t is_rx_deauth; /* rx deauthentication */ + uint32_t is_rx_disassoc; /* rx disassociation */ + uint32_t is_rx_action; /* rx action mgt */ + uint32_t is_rx_badsubtype; /* rx frame w/ unknown subtype*/ + uint32_t is_rx_nobuf; /* rx failed for lack of buf */ + uint32_t is_rx_decryptcrc; /* rx decrypt failed on crc */ + uint32_t is_rx_ahdemo_mgt; /* rx discard ahdemo mgt frame*/ + uint32_t is_rx_bad_auth; /* rx bad auth request */ + uint32_t is_rx_unauth; /* rx on unauthorized port */ + uint32_t is_rx_badkeyid; /* rx w/ incorrect keyid */ + uint32_t is_rx_ccmpreplay; /* rx seq# violation (CCMP) */ + uint32_t is_rx_ccmpformat; /* rx format bad (CCMP) */ + uint32_t is_rx_ccmpmic; /* rx MIC check failed (CCMP) */ + uint32_t is_rx_tkipreplay; /* rx seq# violation (TKIP) */ + uint32_t is_rx_tkipformat; /* rx format bad (TKIP) */ + uint32_t is_rx_tkipmic; /* rx MIC check failed (TKIP) */ + uint32_t is_rx_tkipicv; /* rx ICV check failed (TKIP) */ + uint32_t is_rx_badcipher; /* rx failed due to of key type */ + uint32_t is_rx_nocipherctx; /* rx failed due to key !setup */ + uint32_t is_rx_acl; /* rx discard due to of acl policy */ + uint32_t is_rx_ffcnt; /* rx fast frames */ + uint32_t is_rx_badathtnl; /* driver key alloc failed */ + uint32_t is_tx_nobuf; /* tx failed for lack of buf */ + uint32_t is_tx_nonode; /* tx failed for no node */ + uint32_t is_tx_unknownmgt; /* tx of unknown mgt frame */ + uint32_t is_tx_badcipher; /* tx failed due to of key type */ + uint32_t is_tx_nodefkey; /* tx failed due to no defkey */ + uint32_t is_tx_noheadroom; /* tx failed due to no space */ + uint32_t is_tx_ffokcnt; /* tx fast frames sent success */ + uint32_t is_tx_fferrcnt; /* tx fast frames sent success */ + uint32_t is_tx_unauth; /* tx on unauthorized port */ + uint32_t is_scan_active; /* active scans started */ + uint32_t is_scan_passive; /* passive scans started */ + uint32_t is_node_timeout; /* nodes timed out inactivity */ + uint32_t is_crypto_nomem; /* no memory for crypto ctx */ + uint32_t is_crypto_tkip; /* tkip crypto done in s/w */ + uint32_t is_crypto_tkipenmic; /* tkip en-MIC done in s/w */ + uint32_t is_crypto_tkipdemic; /* tkip de-MIC done in s/w */ + uint32_t is_crypto_tkipcm; /* tkip counter measures */ + uint32_t is_crypto_ccmp; /* ccmp crypto done in s/w */ + uint32_t is_crypto_wep; /* wep crypto done in s/w */ + uint32_t is_crypto_setkey_cipher;/* cipher rejected key */ + uint32_t is_crypto_setkey_nokey;/* no key index for setkey */ + uint32_t is_crypto_delkey; /* driver key delete failed */ + uint32_t is_crypto_badcipher; /* unknown cipher */ + uint32_t is_crypto_nocipher; /* cipher not available */ + uint32_t is_crypto_attachfail; /* cipher attach failed */ + uint32_t is_crypto_swfallback; /* cipher fallback to s/w */ + uint32_t is_crypto_keyfail; /* driver key alloc failed */ + uint32_t is_crypto_enmicfail; /* en-MIC failed */ + uint32_t is_ibss_capmismatch; /* merge failed-cap mismatch */ + uint32_t is_ibss_norate; /* merge failed-rate mismatch */ + uint32_t is_ps_unassoc; /* ps-poll for unassoc. sta */ + uint32_t is_ps_badaid; /* ps-poll w/ incorrect aid */ + uint32_t is_ps_qempty; /* ps-poll w/ nothing to send */ + uint32_t is_rx_assoc_nohtcap; /* HT capabilities mismatch */ + uint32_t is_rx_assoc_tkiphtreject; /* rx assoc requesting TKIP and HT capabilities */ + uint32_t is_rx_assoc_toomany; /* reach assoc limit */ + uint32_t is_rx_ps_unauth; /* ps-poll for un-authenticated STA */ + uint32_t is_rx_tdls_stsmismatch;/* tdls status mismatch */ + uint32_t is_rx_tdls; /* tdls action frame */ + uint32_t is_tx_tdls; /* tdls action frame */ +}; + +/* + * Max size of optional information elements. We artificially + * constrain this; it's limited only by the max frame size (and + * the max parameter size of the wireless extensions). + */ +#define IEEE80211_MAX_OPT_IE 256 + +/* + * WPA/RSN get/set key request. Specify the key/cipher + * type and whether the key is to be used for sending and/or + * receiving. The key index should be set only when working + * with global keys (use IEEE80211_KEYIX_NONE for ``no index''). + * Otherwise a unicast/pairwise key is specified by the bssid + * (on a station) or mac address (on an ap). They key length + * must include any MIC key data; otherwise it should be no + more than IEEE80211_KEYBUF_SIZE. + */ +struct ieee80211req_key { + uint8_t ik_type; /* key/cipher type */ + uint8_t ik_pad; + uint8_t ik_keyix; /* key index */ + uint8_t ik_keylen; /* key length in bytes */ + uint8_t ik_flags; +/* NB: IEEE80211_KEY_XMIT and IEEE80211_KEY_RECV defined elsewhere */ +#define IEEE80211_KEY_DEFAULT 0x80 /* default xmit key */ + uint8_t ik_macaddr[IEEE80211_ADDR_LEN]; + uint16_t ik_vlan; + uint64_t ik_keyrsc; /* key receive sequence counter */ + uint64_t ik_keytsc; /* key transmit sequence counter */ + uint8_t ik_keydata[IEEE80211_KEYBUF_SIZE+IEEE80211_MICBUF_SIZE]; +}; + +/* + * Delete a key either by index or address. Set the index + * to IEEE80211_KEYIX_NONE when deleting a unicast key. + */ +struct ieee80211req_del_key { + uint8_t idk_keyix; /* key index */ + uint8_t idk_macaddr[IEEE80211_ADDR_LEN]; +}; + +/* + * MLME state manipulation request. IEEE80211_MLME_ASSOC + * only makes sense when operating as a station. The other + * requests can be used when operating as a station or an + * ap (to effect a station). + */ +struct ieee80211req_mlme { + uint8_t im_op; /* operation to perform */ +#define IEEE80211_MLME_ASSOC 1 /* associate station */ +#define IEEE80211_MLME_DISASSOC 2 /* disassociate station */ +#define IEEE80211_MLME_DEAUTH 3 /* deauthenticate station */ +#define IEEE80211_MLME_AUTHORIZE 4 /* authorize station */ +#define IEEE80211_MLME_UNAUTHORIZE 5 /* unauthorize station */ +#define IEEE80211_MLME_CLEAR_STATS 6 /* clear station statistic */ +#define IEEE80211_MLME_DEBUG_CLEAR 7 /* remove the STA without deauthing (DEBUG ONLY) */ + uint8_t im_ssid_len; /* length of optional ssid */ + uint16_t im_reason; /* 802.11 reason code */ + uint8_t im_macaddr[IEEE80211_ADDR_LEN]; + uint8_t im_ssid[IEEE80211_NWID_LEN]; +}; + +struct ieee80211req_brcm { + uint8_t ib_op; /* operation to perform */ +#define IEEE80211REQ_BRCM_INFO 0 /* BRCM client information */ +#define IEEE80211REQ_BRCM_PKT 1 /* BRCM pkt from ap to client */ + uint8_t ib_macaddr[IEEE80211_ADDR_LEN]; + int ib_rssi; + uint32_t ib_rxglitch; + uint8_t *ib_pkt; + int32_t ib_pkt_len; +}; + +#define IEEE80211REQ_SCS_REPORT_CHAN_NUM 32 +struct ieee80211req_scs_currchan_rpt { + uint8_t iscr_curchan; + uint16_t iscr_cca_try; + uint16_t iscr_cca_idle; + uint16_t iscr_cca_busy; + uint16_t iscr_cca_intf; + uint16_t iscr_cca_tx; + uint16_t iscr_tx_ms; + uint16_t iscr_rx_ms; + uint32_t iscr_pmbl; +}; +struct ieee80211req_scs_ranking_rpt_chan { + uint8_t isrc_chan; + uint8_t isrc_dfs; + uint8_t isrc_txpwr; + int32_t isrc_metric; + uint32_t isrc_metric_age; + /* scs part */ + uint16_t isrc_cca_intf; + uint32_t isrc_pmbl_ap; + uint32_t isrc_pmbl_sta; + /* initial channel selection part */ + unsigned int isrc_numbeacons; + int isrc_cci; + int isrc_aci; + /* channel usage */ + uint32_t isrc_duration; + uint32_t isrc_times; +}; +struct ieee80211req_scs_ranking_rpt { + uint8_t isr_num; + struct ieee80211req_scs_ranking_rpt_chan isr_chans[IEEE80211REQ_SCS_REPORT_CHAN_NUM]; +}; + +struct ieee80211req_scs_score_rpt_chan { + uint8_t isrc_chan; + uint8_t isrc_score; +}; +struct ieee80211req_scs_score_rpt { + uint8_t isr_num; + struct ieee80211req_scs_score_rpt_chan isr_chans[IEEE80211REQ_SCS_REPORT_CHAN_NUM]; +}; + +#define SCS_MAX_TXTIME_COMP_INDEX 8 +#define SCS_MAX_RXTIME_COMP_INDEX 8 +#define SCS_MAX_TDLSTIME_COMP_INDEX 8 +/* + * Restrictions: + * this structure must be kept in sync with ieee80211_scs + */ +enum qscs_cfg_param_e { + SCS_SMPL_DWELL_TIME = 0, + SCS_SAMPLE_INTV, + SCS_THRSHLD_SMPL_PKTNUM, + SCS_THRSHLD_SMPL_AIRTIME, + SCS_THRSHLD_ATTEN_INC, + SCS_THRSHLD_DFS_REENTRY, + SCS_THRSHLD_DFS_REENTRY_MINRATE, + SCS_THRSHLD_DFS_REENTRY_INTF, + SCS_THRSHLD_LOADED, + SCS_THRSHLD_AGING_NOR, + SCS_THRSHLD_AGING_DFSREENT, + SCS_ENABLE, + SCS_DEBUG_ENABLE, + SCS_SMPL_ENABLE, + SCS_REPORT_ONLY, + SCS_CCA_IDLE_THRSHLD, + SCS_CCA_INTF_HI_THRSHLD, + SCS_CCA_INTF_LO_THRSHLD, + SCS_CCA_INTF_RATIO, + SCS_CCA_INTF_DFS_MARGIN, + SCS_PMBL_ERR_THRSHLD, + SCS_CCA_SAMPLE_DUR, + SCS_CCA_INTF_SMTH_NOXP, + SCS_CCA_INTF_SMTH_XPED, + SCS_RSSI_SMTH_UP, + SCS_RSSI_SMTH_DOWN, + SCS_CHAN_MTRC_MRGN, + SCS_ATTEN_ADJUST, + SCS_PMBL_ERR_SMTH_FCTR, + SCS_PMBL_ERR_RANGE, + SCS_PMBL_ERR_MAPPED_INTF_RANGE, + SCS_SP_WF, + SCS_LP_WF, + SCS_PMP_RPT_CCA_SMTH_FCTR, + SCS_PMP_RX_TIME_SMTH_FCTR, + SCS_PMP_TX_TIME_SMTH_FCTR, + SCS_PMP_STATS_STABLE_PERCENT, + SCS_PMP_STATS_STABLE_RANGE, + SCS_PMP_STATS_CLEAR_INTERVAL, + SCS_AS_RX_TIME_SMTH_FCTR, + SCS_AS_TX_TIME_SMTH_FCTR, + SCS_CCA_IDLE_SMTH_FCTR, + SCS_TX_TIME_COMPENSTATION_START, + SCS_TX_TIME_COMPENSTATION_END = SCS_TX_TIME_COMPENSTATION_START+SCS_MAX_TXTIME_COMP_INDEX-1, + SCS_RX_TIME_COMPENSTATION_START, + SCS_RX_TIME_COMPENSTATION_END = SCS_RX_TIME_COMPENSTATION_START+SCS_MAX_RXTIME_COMP_INDEX-1, + SCS_TDLS_TIME_COMPENSTATION_START, + SCS_TDLS_TIME_COMPENSTATION_END = SCS_TDLS_TIME_COMPENSTATION_START+SCS_MAX_TDLSTIME_COMP_INDEX-1, + SCS_PARAM_MAX, +}; + +struct ieee80211req_scs_param_rpt { + uint32_t cfg_param; + uint32_t signed_param_flag; +}; + +struct ieee80211req_scs { + uint32_t is_op; +#define IEEE80211REQ_SCS_ID_UNKNOWN 0 +#define IEEE80211REQ_SCS_FLAG_GET 0x80000000 +#define IEEE80211REQ_SCS_GET_CURRCHAN_RPT (IEEE80211REQ_SCS_FLAG_GET | 1) +#define IEEE80211REQ_SCS_GET_INIT_RANKING_RPT (IEEE80211REQ_SCS_FLAG_GET | 2) +#define IEEE80211REQ_SCS_GET_RANKING_RPT (IEEE80211REQ_SCS_FLAG_GET | 3) +#define IEEE80211REQ_SCS_GET_PARAM_RPT (IEEE80211REQ_SCS_FLAG_GET | 4) +#define IEEE80211REQ_SCS_GET_SCORE_RPT (IEEE80211REQ_SCS_FLAG_GET | 5) + uint32_t *is_status; /* SCS specific reason for ioctl failure */ +#define IEEE80211REQ_SCS_RESULT_OK 0 +#define IEEE80211REQ_SCS_RESULT_SYSCALL_ERR 1 +#define IEEE80211REQ_SCS_RESULT_SCS_DISABLED 2 +#define IEEE80211REQ_SCS_RESULT_NO_VAP_RUNNING 3 +#define IEEE80211REQ_SCS_RESULT_NOT_EVALUATED 4 /* channel ranking not evaluated */ +#define IEEE80211REQ_SCS_RESULT_TMP_UNAVAILABLE 5 /* when channel switch or param change */ +#define IEEE80211REQ_SCS_RESULT_APMODE_ONLY 6 +#define IEEE80211REQ_SCS_RESULT_AUTOCHAN_DISABLED 7 + uint8_t *is_data; + int32_t is_data_len; +}; + +struct ieee80211_chan_power_table { + uint8_t chan_ieee; + int8_t maxpower_table[PWR_IDX_BF_MAX][PWR_IDX_SS_MAX][PWR_IDX_BW_MAX]; +}; + +struct ieeee80211_dscp2ac { +#define IP_DSCP_NUM 64 + uint8_t dscp[IP_DSCP_NUM]; + uint8_t list_len; + uint8_t ac; +}; +/* + * MAC ACL operations. + */ +enum { + IEEE80211_MACCMD_POLICY_OPEN = 0, /* set policy: no ACL's */ + IEEE80211_MACCMD_POLICY_ALLOW = 1, /* set policy: allow traffic */ + IEEE80211_MACCMD_POLICY_DENY = 2, /* set policy: deny traffic */ + IEEE80211_MACCMD_FLUSH = 3, /* flush ACL database */ + IEEE80211_MACCMD_DETACH = 4, /* detach ACL policy */ +}; + +/* + * Set the active channel list. Note this list is + * intersected with the available channel list in + * calculating the set of channels actually used in + * scanning. + */ +struct ieee80211req_chanlist { + uint8_t ic_channels[IEEE80211_CHAN_BYTES]; +}; + +/* + * Get the active channel list info. + */ +struct ieee80211req_chaninfo { + uint32_t ic_nchans; + struct ieee80211_channel ic_chans[IEEE80211_CHAN_MAX]; +}; + +/* + * Set the active channel list for 20Mhz, 40Mhz and 80Mhz + */ +struct ieee80211_active_chanlist { + u_int8_t bw; + u_int8_t channels[IEEE80211_CHAN_BYTES]; +}; + +/* + * Set or get the disabled channel list + */ +struct ieeee80211_disabled_chanlist { + uint8_t chan[IEEE80211_CHAN_MAX]; + uint32_t list_len; + uint8_t flag; /*0: disable 1: enable*/ + uint8_t dir; /*0: set 1: get*/ +}; + +enum ieee80211_chan_control_dir +{ + SET_CHAN_DISABLED = 0, + GET_CHAN_DISABLED = 1, +}; +/* + * Retrieve the WPA/RSN information element for an associated station. + */ +struct ieee80211req_wpaie { + uint8_t wpa_macaddr[IEEE80211_ADDR_LEN]; + uint8_t wpa_ie[IEEE80211_MAX_OPT_IE]; + uint8_t rsn_ie[IEEE80211_MAX_OPT_IE]; + uint8_t wps_ie[IEEE80211_MAX_OPT_IE]; + uint8_t qtn_pairing_ie[IEEE80211_MAX_OPT_IE]; +#define QTN_PAIRING_IE_EXIST 1 +#define QTN_PAIRING_IE_ABSENT 0 + uint8_t has_pairing_ie; /* Indicates whether Pairing IE exists in assoc req/resp */ +}; + +/* + * Retrieve per-node statistics. + */ +struct ieee80211req_sta_stats { + union { + /* NB: explicitly force 64-bit alignment */ + uint8_t macaddr[IEEE80211_ADDR_LEN]; + uint64_t pad; + } is_u; + struct ieee80211_nodestats is_stats; +}; +/* + * Retrieve STA Statistics(Radio measurement) information element for an associated station. + */ +struct ieee80211req_qtn_rmt_sta_stats { + int status; + struct ieee80211_ie_qtn_rm_sta_all rmt_sta_stats; + struct ieee80211_ie_rm_sta_grp221 rmt_sta_stats_grp221; +}; + +struct ieee80211req_qtn_rmt_sta_stats_setpara { + uint32_t flags; + uint8_t macaddr[IEEE80211_ADDR_LEN]; +}; + +struct ieee80211req_node_meas { + uint8_t mac_addr[6]; + + uint8_t type; +#define IOCTL_MEAS_TYPE_BASIC 0x0 +#define IOCTL_MEAS_TYPE_CCA 0x1 +#define IOCTL_MEAS_TYPE_RPI 0x2 +#define IOCTL_MEAS_TYPE_CHAN_LOAD 0x3 +#define IOCTL_MEAS_TYPE_NOISE_HIS 0x4 +#define IOCTL_MEAS_TYPE_BEACON 0x5 +#define IOCTL_MEAS_TYPE_FRAME 0x6 +#define IOCTL_MEAS_TYPE_CAT 0x7 +#define IOCTL_MEAS_TYPE_MUL_DIAG 0x8 +#define IOCTL_MEAS_TYPE_LINK 0x9 +#define IOCTL_MEAS_TYPE_NEIGHBOR 0xA + + struct _ioctl_basic { + uint16_t start_offset_ms; + uint16_t duration_ms; + uint8_t channel; + } ioctl_basic; + struct _ioctl_cca { + uint16_t start_offset_ms; + uint16_t duration_ms; + uint8_t channel; + } ioctl_cca; + struct _ioctl_rpi { + uint16_t start_offset_ms; + uint16_t duration_ms; + uint8_t channel; + } ioctl_rpi; + struct _ioctl_chan_load { + uint16_t duration_ms; + uint8_t channel; + } ioctl_chan_load; + struct _ioctl_noise_his { + uint16_t duration_ms; + uint8_t channel; + } ioctl_noise_his; + struct _ioctl_beacon { + uint8_t op_class; + uint8_t channel; + uint16_t duration_ms; + uint8_t mode; + uint8_t bssid[IEEE80211_ADDR_LEN]; + } ioctl_beacon; + struct _ioctl_frame { + uint8_t op_class; + uint8_t channel; + uint16_t duration_ms; + uint8_t type; + uint8_t mac_address[IEEE80211_ADDR_LEN]; + } ioctl_frame; + struct _ioctl_tran_stream_cat { + uint16_t duration_ms; + uint8_t peer_sta[IEEE80211_ADDR_LEN]; + uint8_t tid; + uint8_t bin0; + } ioctl_tran_stream_cat; + struct _ioctl_multicast_diag { + uint16_t duration_ms; + uint8_t group_mac[IEEE80211_ADDR_LEN]; + } ioctl_multicast_diag; +}; + +struct ieee80211req_node_tpc { + uint8_t mac_addr[6]; +}; + +struct ieee80211req_node_info { + uint8_t req_type; +#define IOCTL_REQ_MEASUREMENT 0x0 +#define IOCTL_REQ_TPC 0x1 + union { + struct ieee80211req_node_meas req_node_meas; + struct ieee80211req_node_tpc req_node_tpc; + } u_req_info; +}; + +struct ieee80211_ioctl_neighbor_report_item { + uint8_t bssid[IEEE80211_ADDR_LEN]; + uint32_t bssid_info; + uint8_t operating_class; + uint8_t channel; + uint8_t phy_type; +}; +#define IEEE80211_MAX_NEIGHBOR_REPORT_ITEM 3 + +struct ieee80211rep_node_meas_result { + uint8_t status; +#define IOCTL_MEAS_STATUS_SUCC 0 +#define IOCTL_MEAS_STATUS_TIMEOUT 1 +#define IOCTL_MEAS_STATUS_NODELEAVE 2 +#define IOCTL_MEAS_STATUS_STOP 3 + + uint8_t report_mode; +#define IOCTL_MEAS_REP_OK (0) +#define IOCTL_MEAS_REP_LATE (1 << 0) +#define IOCTL_MEAS_REP_INCAP (1 << 1) +#define IOCTL_MEAS_REP_REFUSE (1 << 2) +#define IOCTL_MEAS_REP_MASK (0x07) + + union { + uint8_t basic; + uint8_t cca; + uint8_t rpi[8]; + uint8_t chan_load; + struct { + uint8_t antenna_id; + uint8_t anpi; + uint8_t ipi[11]; + } noise_his; + struct { + uint8_t reported_frame_info; + uint8_t rcpi; + uint8_t rsni; + uint8_t bssid[IEEE80211_ADDR_LEN]; + uint8_t antenna_id; + uint32_t parent_tsf; + } beacon; + struct { + uint32_t sub_ele_report; + uint8_t ta[IEEE80211_ADDR_LEN]; + uint8_t bssid[IEEE80211_ADDR_LEN]; + uint8_t phy_type; + uint8_t avg_rcpi; + uint8_t last_rsni; + uint8_t last_rcpi; + uint8_t antenna_id; + uint16_t frame_count; + } frame; + struct { + uint8_t reason; + uint32_t tran_msdu_cnt; + uint32_t msdu_discard_cnt; + uint32_t msdu_fail_cnt; + uint32_t msdu_mul_retry_cnt; + uint32_t qos_lost_cnt; + uint32_t avg_queue_delay; + uint32_t avg_tran_delay; + uint8_t bin0_range; + uint32_t bins[6]; + } tran_stream_cat; + struct { + uint8_t reason; + uint32_t mul_rec_msdu_cnt; + uint16_t first_seq_num; + uint16_t last_seq_num; + uint16_t mul_rate; + } multicast_diag; + struct { + struct { + int8_t tx_power; + int8_t link_margin; + } tpc_report; + uint8_t recv_antenna_id; + uint8_t tran_antenna_id; + uint8_t rcpi; + uint8_t rsni; + } link_measure; + struct { + uint8_t item_num; + struct ieee80211_ioctl_neighbor_report_item item[IEEE80211_MAX_NEIGHBOR_REPORT_ITEM]; + } neighbor_report; + } u_data; +}; + +struct ieee80211rep_node_tpc_result { + uint8_t status; + int8_t tx_power; + int8_t link_margin; +}; + +union ieee80211rep_node_info { + struct ieee80211rep_node_meas_result meas_result; + struct ieee80211rep_node_tpc_result tpc_result; +}; + +/* + * Station information block; the mac address is used + * to retrieve other data like stats, unicast key, etc. + */ +struct ieee80211req_sta_info { + uint16_t isi_len; /* length (mult of 4) */ + uint16_t isi_freq; /* MHz */ + uint16_t isi_flags; /* channel flags */ + uint16_t isi_state; /* state flags */ + uint8_t isi_authmode; /* authentication algorithm */ + uint8_t isi_rssi; + uint16_t isi_capinfo; /* capabilities */ + uint8_t isi_athflags; /* Atheros capabilities */ + uint8_t isi_erp; /* ERP element */ + uint8_t isi_macaddr[IEEE80211_ADDR_LEN]; + uint8_t isi_nrates; /* negotiated rates */ + uint8_t isi_rates[IEEE80211_RATE_MAXSIZE]; + uint8_t isi_txrate; /* index to isi_rates[] */ + uint16_t isi_ie_len; /* IE length */ + uint16_t isi_associd; /* assoc response */ + uint16_t isi_txpower; /* current tx power */ + uint16_t isi_vlan; /* vlan tag */ + uint16_t isi_txseqs[17]; /* seq to be transmitted */ + uint16_t isi_rxseqs[17]; /* seq previous for qos frames*/ + uint16_t isi_inact; /* inactivity timer */ + uint8_t isi_uapsd; /* UAPSD queues */ + uint8_t isi_opmode; /* sta operating mode */ + uint16_t isi_htcap; /* HT capabilities */ + + /* XXX frag state? */ + /* variable length IE data */ +}; + +enum { + IEEE80211_STA_OPMODE_NORMAL, + IEEE80211_STA_OPMODE_XR +}; + +/* + * Retrieve per-station information; to retrieve all + * specify a mac address of ff:ff:ff:ff:ff:ff. + */ +struct ieee80211req_sta_req { + union { + /* NB: explicitly force 64-bit alignment */ + uint8_t macaddr[IEEE80211_ADDR_LEN]; + uint64_t pad; + } is_u; + struct ieee80211req_sta_info info[1]; /* variable length */ +}; + +/* + * Get/set per-station tx power cap. + */ +struct ieee80211req_sta_txpow { + uint8_t it_macaddr[IEEE80211_ADDR_LEN]; + uint8_t it_txpow; +}; + +/* + * WME parameters are set and return using i_val and i_len. + * i_val holds the value itself. i_len specifies the AC + * and, as appropriate, then high bit specifies whether the + * operation is to be applied to the BSS or ourself. + */ +#define IEEE80211_WMEPARAM_SELF 0x0000 /* parameter applies to self */ +#define IEEE80211_WMEPARAM_BSS 0x8000 /* parameter applies to BSS */ +#define IEEE80211_WMEPARAM_VAL 0x7fff /* parameter value */ + +/* + * Scan result data returned for IEEE80211_IOC_SCAN_RESULTS. + */ +struct ieee80211req_scan_result { + uint16_t isr_len; /* length (mult of 4) */ + uint16_t isr_freq; /* MHz */ + uint16_t isr_flags; /* channel flags */ + uint8_t isr_noise; + uint8_t isr_rssi; + uint8_t isr_intval; /* beacon interval */ + uint16_t isr_capinfo; /* capabilities */ + uint8_t isr_erp; /* ERP element */ + uint8_t isr_bssid[IEEE80211_ADDR_LEN]; + uint8_t isr_nrates; + uint8_t isr_rates[IEEE80211_RATE_MAXSIZE]; + uint8_t isr_ssid_len; /* SSID length */ + uint8_t isr_ie_len; /* IE length */ + uint8_t isr_pad[5]; + /* variable length SSID followed by IE data */ +}; + +#define IEEE80211_MAX_ASSOC_HISTORY 32 + +struct ieee80211_assoc_history { + uint8_t ah_macaddr_table[IEEE80211_MAX_ASSOC_HISTORY][IEEE80211_ADDR_LEN]; + uint32_t ah_timestamp[IEEE80211_MAX_ASSOC_HISTORY]; +}; + +/* + * Channel switch history record. + */ +#define CSW_MAX_RECORDS_MAX 32 +struct ieee80211req_csw_record { + uint32_t cnt; + int32_t index; + uint32_t channel[CSW_MAX_RECORDS_MAX]; + uint32_t timestamp[CSW_MAX_RECORDS_MAX]; + uint32_t reason[CSW_MAX_RECORDS_MAX]; +}; + +struct ieee80211req_radar_status { + uint32_t channel; + uint32_t flags; + uint32_t ic_radardetected; +}; + +struct ieee80211req_disconn_info { + uint32_t asso_sta_count; + uint32_t disconn_count; + uint32_t sequence; + uint32_t up_time; + uint32_t resetflag; +}; + +#define AP_SCAN_MAX_NUM_RATES 32 +/* for qcsapi_get_results_AP_scan */ +struct ieee80211_general_ap_scan_result { + int32_t num_bitrates; + int32_t bitrates[AP_SCAN_MAX_NUM_RATES]; + int32_t num_ap_results; +}; + +struct ieee80211_per_ap_scan_result { + int8_t ap_addr_mac[IEEE80211_ADDR_LEN]; + int8_t ap_name_ssid[32 + 1]; + int32_t ap_channel_ieee; + int32_t ap_rssi; + int32_t ap_flags; + int32_t ap_htcap; + int32_t ap_vhtcap; + int8_t ap_qhop_role; + int32_t ap_num_genies; + int8_t ap_ie_buf[0]; /* just to remind there might be WPA/RSN/WSC IEs right behind*/ +}; + +#ifdef __FreeBSD__ +/* + * FreeBSD-style ioctls. + */ +/* the first member must be matched with struct ifreq */ +struct ieee80211req { + char i_name[IFNAMSIZ]; /* if_name, e.g. "wi0" */ + uint16_t i_type; /* req type */ + int16_t i_val; /* Index or simple value */ + int16_t i_len; /* Index or simple value */ + void *i_data; /* Extra data */ +}; +#define SIOCS80211 _IOW('i', 234, struct ieee80211req) +#define SIOCG80211 _IOWR('i', 235, struct ieee80211req) +#define SIOCG80211STATS _IOWR('i', 236, struct ifreq) +#define SIOC80211IFCREATE _IOWR('i', 237, struct ifreq) +#define SIOC80211IFDESTROY _IOW('i', 238, struct ifreq) + +#define IEEE80211_IOC_SSID 1 +#define IEEE80211_IOC_NUMSSIDS 2 +#define IEEE80211_IOC_WEP 3 +#define IEEE80211_WEP_NOSUP -1 +#define IEEE80211_WEP_OFF 0 +#define IEEE80211_WEP_ON 1 +#define IEEE80211_WEP_MIXED 2 +#define IEEE80211_IOC_WEPKEY 4 +#define IEEE80211_IOC_NUMWEPKEYS 5 +#define IEEE80211_IOC_WEPTXKEY 6 +#define IEEE80211_IOC_AUTHMODE 7 +#define IEEE80211_IOC_STATIONNAME 8 +#define IEEE80211_IOC_CHANNEL 9 +#define IEEE80211_IOC_POWERSAVE 10 +#define IEEE80211_POWERSAVE_NOSUP -1 +#define IEEE80211_POWERSAVE_OFF 0 +#define IEEE80211_POWERSAVE_CAM 1 +#define IEEE80211_POWERSAVE_PSP 2 +#define IEEE80211_POWERSAVE_PSP_CAM 3 +#define IEEE80211_POWERSAVE_ON IEEE80211_POWERSAVE_CAM +#define IEEE80211_IOC_POWERSAVESLEEP 11 +#define IEEE80211_IOC_RTSTHRESHOLD 12 +#define IEEE80211_IOC_PROTMODE 13 +#define IEEE80211_PROTMODE_OFF 0 +#define IEEE80211_PROTMODE_CTS 1 +#define IEEE80211_PROTMODE_RTSCTS 2 +#define IEEE80211_IOC_TXPOWER 14 /* global tx power limit */ +#define IEEE80211_IOC_BSSID 15 +#define IEEE80211_IOC_ROAMING 16 /* roaming mode */ +#define IEEE80211_IOC_PRIVACY 17 /* privacy invoked */ +#define IEEE80211_IOC_DROPUNENCRYPTED 18 /* discard unencrypted frames */ +#define IEEE80211_IOC_WPAKEY 19 +#define IEEE80211_IOC_DELKEY 20 +#define IEEE80211_IOC_MLME 21 +#define IEEE80211_IOC_OPTIE 22 /* optional info. element */ +#define IEEE80211_IOC_SCAN_REQ 23 +#define IEEE80211_IOC_SCAN_RESULTS 24 +#define IEEE80211_IOC_COUNTERMEASURES 25 /* WPA/TKIP countermeasures */ +#define IEEE80211_IOC_WPA 26 /* WPA mode (0,1,2) */ +#define IEEE80211_IOC_CHANLIST 27 /* channel list */ +#define IEEE80211_IOC_WME 28 /* WME mode (on, off) */ +#define IEEE80211_IOC_HIDESSID 29 /* hide SSID mode (on, off) */ +#define IEEE80211_IOC_APBRIDGE 30 /* AP inter-sta bridging */ +#define IEEE80211_IOC_MCASTCIPHER 31 /* multicast/default cipher */ +#define IEEE80211_IOC_MCASTKEYLEN 32 /* multicast key length */ +#define IEEE80211_IOC_UCASTCIPHERS 33 /* unicast cipher suites */ +#define IEEE80211_IOC_UCASTCIPHER 34 /* unicast cipher */ +#define IEEE80211_IOC_UCASTKEYLEN 35 /* unicast key length */ +#define IEEE80211_IOC_DRIVER_CAPS 36 /* driver capabilities */ +#define IEEE80211_IOC_KEYMGTALGS 37 /* key management algorithms */ +#define IEEE80211_IOC_RSNCAPS 38 /* RSN capabilities */ +#define IEEE80211_IOC_WPAIE 39 /* WPA information element */ +#define IEEE80211_IOC_STA_STATS 40 /* per-station statistics */ +#define IEEE80211_IOC_MACCMD 41 /* MAC ACL operation */ +#define IEEE80211_IOC_TXPOWMAX 43 /* max tx power for channel */ +#define IEEE80211_IOC_STA_TXPOW 44 /* per-station tx power limit */ +#define IEEE80211_IOC_STA_INFO 45 /* station/neighbor info */ +#define IEEE80211_IOC_WME_CWMIN 46 /* WME: ECWmin */ +#define IEEE80211_IOC_WME_CWMAX 47 /* WME: ECWmax */ +#define IEEE80211_IOC_WME_AIFS 48 /* WME: AIFSN */ +#define IEEE80211_IOC_WME_TXOPLIMIT 49 /* WME: txops limit */ +#define IEEE80211_IOC_WME_ACM 50 /* WME: ACM (bss only) */ +#define IEEE80211_IOC_WME_ACKPOLICY 51 /* WME: ACK policy (!bss only)*/ +#define IEEE80211_IOC_DTIM_PERIOD 52 /* DTIM period (beacons) */ +#define IEEE80211_IOC_BEACON_INTERVAL 53 /* beacon interval (ms) */ +#define IEEE80211_IOC_ADDMAC 54 /* add sta to MAC ACL table */ +#define IEEE80211_IOC_DELMAC 55 /* del sta from MAC ACL table */ +#define IEEE80211_IOC_FF 56 /* ATH fast frames (on, off) */ +#define IEEE80211_IOC_TURBOP 57 /* ATH turbo' (on, off) */ +#define IEEE80211_IOC_APPIEBUF 58 /* IE in the management frame */ +#define IEEE80211_IOC_FILTERFRAME 59 /* management frame filter */ + +/* + * Scan result data returned for IEEE80211_IOC_SCAN_RESULTS. + */ +struct ieee80211req_scan_result { + uint16_t isr_len; /* length (mult of 4) */ + uint16_t isr_freq; /* MHz */ + uint16_t isr_flags; /* channel flags */ + uint8_t isr_noise; + uint8_t isr_rssi; + uint8_t isr_intval; /* beacon interval */ + uint16_t isr_capinfo; /* capabilities */ + uint8_t isr_erp; /* ERP element */ + uint8_t isr_bssid[IEEE80211_ADDR_LEN]; + uint8_t isr_nrates; + uint8_t isr_rates[IEEE80211_RATE_MAXSIZE]; + uint8_t isr_ssid_len; /* SSID length */ + uint8_t isr_ie_len; /* IE length */ + uint8_t isr_pad[5]; + /* variable length SSID followed by IE data */ +}; + +#endif /* __FreeBSD__ */ + +#if defined(__linux__) || defined(MUC_BUILD) || defined(DSP_BUILD) +/* + * Wireless Extensions API, private ioctl interfaces. + * + * NB: Even-numbered ioctl numbers have set semantics and are privileged! + * (regardless of the incorrect comment in wireless.h!) + */ +#ifdef __KERNEL__ +#include +#endif +#define IEEE80211_IOCTL_SETPARAM (SIOCIWFIRSTPRIV+0) +#define IEEE80211_IOCTL_GETPARAM (SIOCIWFIRSTPRIV+1) +#define IEEE80211_IOCTL_SETMODE (SIOCIWFIRSTPRIV+2) +#define IEEE80211_IOCTL_GETMODE (SIOCIWFIRSTPRIV+3) +#define IEEE80211_IOCTL_SETWMMPARAMS (SIOCIWFIRSTPRIV+4) +#define IEEE80211_IOCTL_GETWMMPARAMS (SIOCIWFIRSTPRIV+5) +#define IEEE80211_IOCTL_SETCHANLIST (SIOCIWFIRSTPRIV+6) +#define IEEE80211_IOCTL_GETCHANLIST (SIOCIWFIRSTPRIV+7) +#define IEEE80211_IOCTL_CHANSWITCH (SIOCIWFIRSTPRIV+8) +#define IEEE80211_IOCTL_GET_APPIEBUF (SIOCIWFIRSTPRIV+9) +#define IEEE80211_IOCTL_SET_APPIEBUF (SIOCIWFIRSTPRIV+10) +#define IEEE80211_IOCTL_FILTERFRAME (SIOCIWFIRSTPRIV+12) +#define IEEE80211_IOCTL_GETCHANINFO (SIOCIWFIRSTPRIV+13) +#define IEEE80211_IOCTL_SETOPTIE (SIOCIWFIRSTPRIV+14) +#define IEEE80211_IOCTL_GETOPTIE (SIOCIWFIRSTPRIV+15) +#define IEEE80211_IOCTL_SETMLME (SIOCIWFIRSTPRIV+16) +#define IEEE80211_IOCTL_RADAR (SIOCIWFIRSTPRIV+17) +#define IEEE80211_IOCTL_SETKEY (SIOCIWFIRSTPRIV+18) +#define IEEE80211_IOCTL_POSTEVENT (SIOCIWFIRSTPRIV+19) +#define IEEE80211_IOCTL_DELKEY (SIOCIWFIRSTPRIV+20) +#define IEEE80211_IOCTL_TXEAPOL (SIOCIWFIRSTPRIV+21) +#define IEEE80211_IOCTL_ADDMAC (SIOCIWFIRSTPRIV+22) +#define IEEE80211_IOCTL_STARTCCA (SIOCIWFIRSTPRIV+23) +#define IEEE80211_IOCTL_DELMAC (SIOCIWFIRSTPRIV+24) +#define IEEE80211_IOCTL_GETSTASTATISTIC (SIOCIWFIRSTPRIV+25) +#define IEEE80211_IOCTL_WDSADDMAC (SIOCIWFIRSTPRIV+26) +#define IEEE80211_IOCTL_WDSDELMAC (SIOCIWFIRSTPRIV+28) +#define IEEE80211_IOCTL_GETBLOCK (SIOCIWFIRSTPRIV+29) +#define IEEE80211_IOCTL_KICKMAC (SIOCIWFIRSTPRIV+30) +#define IEEE80211_IOCTL_DFSACTSCAN (SIOCIWFIRSTPRIV+31) + +#define IEEE80211_AMPDU_MIN_DENSITY 0 +#define IEEE80211_AMPDU_MAX_DENSITY 7 + +#define IEEE80211_CCE_PREV_CHAN_SHIFT 8 + +enum { + IEEE80211_PARAM_TURBO = 1, /* turbo mode */ + IEEE80211_PARAM_MODE = 2, /* phy mode (11a, 11b, etc.) */ + IEEE80211_PARAM_AUTHMODE = 3, /* authentication mode */ + IEEE80211_PARAM_PROTMODE = 4, /* 802.11g protection */ + IEEE80211_PARAM_MCASTCIPHER = 5, /* multicast/default cipher */ + IEEE80211_PARAM_MCASTKEYLEN = 6, /* multicast key length */ + IEEE80211_PARAM_UCASTCIPHERS = 7, /* unicast cipher suites */ + IEEE80211_PARAM_UCASTCIPHER = 8, /* unicast cipher */ + IEEE80211_PARAM_UCASTKEYLEN = 9, /* unicast key length */ + IEEE80211_PARAM_WPA = 10, /* WPA mode (0,1,2) */ + IEEE80211_PARAM_ROAMING = 12, /* roaming mode */ + IEEE80211_PARAM_PRIVACY = 13, /* privacy invoked */ + IEEE80211_PARAM_COUNTERMEASURES = 14, /* WPA/TKIP countermeasures */ + IEEE80211_PARAM_DROPUNENCRYPTED = 15, /* discard unencrypted frames */ + IEEE80211_PARAM_DRIVER_CAPS = 16, /* driver capabilities */ + IEEE80211_PARAM_MACCMD = 17, /* MAC ACL operation */ + IEEE80211_PARAM_WMM = 18, /* WMM mode (on, off) */ + IEEE80211_PARAM_HIDESSID = 19, /* hide SSID mode (on, off) */ + IEEE80211_PARAM_APBRIDGE = 20, /* AP inter-sta bridging */ + IEEE80211_PARAM_KEYMGTALGS = 21, /* key management algorithms */ + IEEE80211_PARAM_RSNCAPS = 22, /* RSN capabilities */ + IEEE80211_PARAM_INACT = 23, /* station inactivity timeout */ + IEEE80211_PARAM_INACT_AUTH = 24, /* station auth inact timeout */ + IEEE80211_PARAM_INACT_INIT = 25, /* station init inact timeout */ + IEEE80211_PARAM_ABOLT = 26, /* Atheros Adv. Capabilities */ + IEEE80211_PARAM_DTIM_PERIOD = 28, /* DTIM period (beacons) */ + IEEE80211_PARAM_BEACON_INTERVAL = 29, /* beacon interval (ms) */ + IEEE80211_PARAM_DOTH = 30, /* 11.h is on/off */ + IEEE80211_PARAM_PWRCONSTRAINT = 31, /* Current Channel Pwr Constraint */ + IEEE80211_PARAM_GENREASSOC = 32, /* Generate a reassociation request */ + IEEE80211_PARAM_COMPRESSION = 33, /* compression */ + IEEE80211_PARAM_FF = 34, /* fast frames support */ + IEEE80211_PARAM_XR = 35, /* XR support */ + IEEE80211_PARAM_BURST = 36, /* burst mode */ + IEEE80211_PARAM_PUREG = 37, /* pure 11g (no 11b stations) */ + IEEE80211_PARAM_REPEATER = 38, /* simultaneous AP and STA mode */ + IEEE80211_PARAM_WDS = 39, /* Enable 4 address processing */ + IEEE80211_PARAM_BGSCAN = 40, /* bg scanning (on, off) */ + IEEE80211_PARAM_BGSCAN_IDLE = 41, /* bg scan idle threshold */ + IEEE80211_PARAM_BGSCAN_INTERVAL = 42, /* bg scan interval */ + IEEE80211_PARAM_MCAST_RATE = 43, /* Multicast Tx Rate */ + IEEE80211_PARAM_COVERAGE_CLASS = 44, /* coverage class */ + IEEE80211_PARAM_COUNTRY_IE = 45, /* enable country IE */ + IEEE80211_PARAM_SCANVALID = 46, /* scan cache valid threshold */ + IEEE80211_PARAM_ROAM_RSSI_11A = 47, /* rssi threshold in 11a */ + IEEE80211_PARAM_ROAM_RSSI_11B = 48, /* rssi threshold in 11b */ + IEEE80211_PARAM_ROAM_RSSI_11G = 49, /* rssi threshold in 11g */ + IEEE80211_PARAM_ROAM_RATE_11A = 50, /* tx rate threshold in 11a */ + IEEE80211_PARAM_ROAM_RATE_11B = 51, /* tx rate threshold in 11b */ + IEEE80211_PARAM_ROAM_RATE_11G = 52, /* tx rate threshold in 11g */ + IEEE80211_PARAM_UAPSDINFO = 53, /* value for qos info field */ + IEEE80211_PARAM_SLEEP = 54, /* force sleep/wake */ + IEEE80211_PARAM_QOSNULL = 55, /* force sleep/wake */ + IEEE80211_PARAM_PSPOLL = 56, /* force ps-poll generation (sta only) */ + IEEE80211_PARAM_EOSPDROP = 57, /* force uapsd EOSP drop (ap only) */ + IEEE80211_PARAM_MARKDFS = 58, /* mark a dfs interference channel when found */ + IEEE80211_PARAM_REGCLASS = 59, /* enable regclass ids in country IE */ + IEEE80211_PARAM_DROPUNENC_EAPOL = 60, /* drop unencrypted eapol frames */ + IEEE80211_PARAM_SHPREAMBLE = 61, /* Short Preamble */ + IEEE80211_PARAM_FIXED_TX_RATE = 62, /* Set fixed TX rate */ + IEEE80211_PARAM_MIMOMODE = 63, /* Select antenna to use */ + IEEE80211_PARAM_AGGREGATION = 64, /* Enable/disable aggregation */ + IEEE80211_PARAM_RETRY_COUNT = 65, /* Set retry count */ + IEEE80211_PARAM_VAP_DBG = 66, /* Set the VAP debug verbosity . */ + IEEE80211_PARAM_VCO_CALIB = 67, /* Set VCO calibration */ + IEEE80211_PARAM_EXP_MAT_SEL = 68, /* Select different exp mat */ + IEEE80211_PARAM_BW_SEL = 69, /* Select BW */ + IEEE80211_PARAM_RG = 70, /* Let software fill in the duration update*/ + IEEE80211_PARAM_BW_SEL_MUC = 71, /* Let software fill in the duration update*/ + IEEE80211_PARAM_ACK_POLICY = 72, /* 1 for ACK, zero for no ACK */ + IEEE80211_PARAM_LEGACY_MODE = 73, /* 1 for legacy, zero for HT*/ + IEEE80211_PARAM_MAX_AGG_SUBFRM = 74, /* Maximum number if subframes to allow for aggregation */ + IEEE80211_PARAM_ADD_WDS_MAC = 75, /* Add MAC address for WDS peer */ + IEEE80211_PARAM_DEL_WDS_MAC = 76, /* Delete MAC address for WDS peer */ + IEEE80211_PARAM_TXBF_CTRL = 77, /* Control TX beamforming */ + IEEE80211_PARAM_TXBF_PERIOD = 78, /* Set TX beamforming period */ + IEEE80211_PARAM_BSSID = 79, /* Set BSSID */ + IEEE80211_PARAM_HTBA_SEQ_CTRL = 80, /* Control HT Block ACK */ + IEEE80211_PARAM_HTBA_SIZE_CTRL = 81, /* Control HT Block ACK */ + IEEE80211_PARAM_HTBA_TIME_CTRL = 82, /* Control HT Block ACK */ + IEEE80211_PARAM_HT_ADDBA = 83, /* ADDBA control */ + IEEE80211_PARAM_HT_DELBA = 84, /* DELBA control */ + IEEE80211_PARAM_CHANNEL_NOSCAN = 85, /* Disable the scanning for fixed channels */ + IEEE80211_PARAM_MUC_PROFILE = 86, /* Control MuC profiling */ + IEEE80211_PARAM_MUC_PHY_STATS = 87, /* Control MuC phy stats */ + IEEE80211_PARAM_MUC_SET_PARTNUM = 88, /* set muc part num for cal */ + IEEE80211_PARAM_ENABLE_GAIN_ADAPT = 89, /* turn on the anlg gain tuning */ + IEEE80211_PARAM_GET_RFCHIP_ID = 90, /* Get RF chip frequency id */ + IEEE80211_PARAM_GET_RFCHIP_VERID = 91, /* Get RF chip version id */ + IEEE80211_PARAM_ADD_WDS_MAC_DOWN = 92, /* Add MAC address for WDS downlink peer */ + IEEE80211_PARAM_SHORT_GI = 93, /* Set to 1 for turning on SGI */ + IEEE80211_PARAM_LINK_LOSS = 94, /* Set to 1 for turning on Link Loss feature */ + IEEE80211_PARAM_BCN_MISS_THR = 95, /* Set to 0 for default value (50 Beacons). */ + IEEE80211_PARAM_FORCE_SMPS = 96, /* Force the SMPS mode to transition the mode (STA) - includes + * sending out the ACTION frame to the AP. */ + IEEE80211_PARAM_FORCEMICERROR = 97, /* Force a MIC error - does loopback through the MUC back up to QDRV thence + * through the normal TKIP MIC error path. */ + IEEE80211_PARAM_ENABLECOUNTERMEASURES = 98, /* Enable/disable countermeasures */ + IEEE80211_PARAM_IMPLICITBA = 99, /* Set the implicit BA flags in the QIE */ + IEEE80211_PARAM_CLIENT_REMOVE = 100, /* Remove clients but DON'T deauth them */ + IEEE80211_PARAM_SHOWMEM = 101, /* If debug build for MALLOC/FREE, show the summary view */ + IEEE80211_PARAM_SCANSTATUS = 102, /* Get scanning state */ + IEEE80211_PARAM_GLOBAL_BA_CONTROL = 103, /* Set the global BA flags */ + IEEE80211_PARAM_NO_SSID_ASSOC = 104, /* Enable/disable associations without SSIDs */ + IEEE80211_PARAM_FIXED_SGI = 105, /* Choose between node based SGI or fixed SGI */ + IEEE80211_PARAM_CONFIG_TXPOWER = 106, /* configure TX power for a band (start chan to stop chan) */ + IEEE80211_PARAM_SKB_LIST_MAX = 107, /* Configure the max len of the skb list shared b/n drivers */ + IEEE80211_PARAM_VAP_STATS = 108, /* Show VAP stats */ + IEEE80211_PARAM_RATE_CTRL_FLAGS = 109, /* Configure flags to tweak rate control algorithm */ + IEEE80211_PARAM_LDPC = 110, /* Enabling/disabling LDPC */ + IEEE80211_PARAM_DFS_FAST_SWITCH = 111, /* On detection of radar, select a non-DFS channel and switch immediately */ + IEEE80211_PARAM_11N_40_ONLY_MODE = 112, /* Support for 11n 40MHZ only mode */ + IEEE80211_PARAM_AMPDU_DENSITY = 113, /* AMPDU DENSITY CONTROL */ + IEEE80211_PARAM_SCAN_NO_DFS = 114, /* On detection of radar, avoid DFS channels; AP only */ + IEEE80211_PARAM_REGULATORY_REGION = 115, /* set the regulatory region */ + IEEE80211_PARAM_CONFIG_BB_INTR_DO_SRESET = 116, /* enable or disable sw reset for BB interrupt */ + IEEE80211_PARAM_CONFIG_MAC_INTR_DO_SRESET = 117, /* enable or disable sw reset for MAC interrupt */ + IEEE80211_PARAM_CONFIG_WDG_DO_SRESET = 118, /* enable or disable sw reset triggered by watchdog */ + IEEE80211_PARAM_TRIGGER_RESET = 119, /* trigger reset for MAC/BB */ + IEEE80211_PARAM_INJECT_INVALID_FCS = 120, /* inject bad FCS to induce tx hang */ + IEEE80211_PARAM_CONFIG_WDG_SENSITIVITY = 121, /* higher value means less sensitive */ + IEEE80211_PARAM_SAMPLE_RATE = 122, /* Set data sampling rate */ + IEEE80211_PARAM_MCS_CAP = 123, /* Configure an MCS cap rate - for debugging */ + IEEE80211_PARAM_MAX_MGMT_FRAMES = 124, /* Max number of mgmt frames not complete */ + IEEE80211_PARAM_MCS_ODD_EVEN = 125, /* Configure the rate adapt algorithm to only use odd or even MCSs */ + IEEE80211_PARAM_BLACKLIST_GET = 126, /* List blacklisted stations. */ + IEEE80211_PARAM_BA_MAX_WIN_SIZE = 128, /* Maximum BA window size allowed on TX and RX */ + IEEE80211_PARAM_RESTRICTED_MODE = 129, /* Enable or disable restricted mode */ + IEEE80211_PARAM_BB_MAC_RESET_MSGS = 130, /* Enable / disable display of BB amd MAC reset messages */ + IEEE80211_PARAM_PHY_STATS_MODE = 131, /* Mode for get_phy_stats */ + IEEE80211_PARAM_BB_MAC_RESET_DONE_WAIT = 132, /* Set max wait for tx or rx before reset (secs) */ + IEEE80211_PARAM_MIN_DWELL_TIME_ACTIVE = 133, /* min dwell time for an active channel */ + IEEE80211_PARAM_MIN_DWELL_TIME_PASSIVE = 134, /* min dwell time for a passive channel */ + IEEE80211_PARAM_MAX_DWELL_TIME_ACTIVE = 135, /* max dwell time for an active channel */ + IEEE80211_PARAM_MAX_DWELL_TIME_PASSIVE = 136, /* max dwell time for a passive channel */ + IEEE80211_PARAM_TX_AGG_TIMEOUT = 137, /* Configure timeout for TX aggregation */ + IEEE80211_PARAM_LEGACY_RETRY_LIMIT = 138, /* Times to retry sending non-AMPDU packets (0-16) per rate */ + IEEE80211_PARAM_TRAINING_COUNT = 139, /* Training count for rate retry algorithm (QoS NULL to STAs after assoc) */ + IEEE80211_PARAM_DYNAMIC_AC = 140, /* Enable / disable dynamic 1 bit auto correlation algo */ + IEEE80211_PARAM_DUMP_TRIGGER = 141, /* Request immediate dump */ + IEEE80211_PARAM_DUMP_TCM_FD = 142, /* Dump TCM frame descriptors */ + IEEE80211_PARAM_RXCSR_ERR_ALLOW = 143, /* allow or disallow errors packets passed to MuC */ + IEEE80211_PARAM_STOP_FLAGS = 144, /* Alter flags where a debug halt would be performed on error conditions */ + IEEE80211_PARAM_CHECK_FLAGS = 145, /* Alter flags for additional runtime checks */ + IEEE80211_PARAM_RX_CTRL_FILTER = 146, /* Set the control packet filter on hal. */ + IEEE80211_PARAM_SCS = 147, /* ACI/CCI Detection and Mitigation*/ + IEEE80211_PARAM_ALT_CHAN = 148, /* set the chan to jump to if radar is detected */ + IEEE80211_PARAM_QTN_BCM_WAR = 149, /* Workaround for BCM receiver not accepting last aggr */ + IEEE80211_PARAM_GI_SELECT = 150, /* Enable or disable dynamic GI selection */ + IEEE80211_PARAM_RADAR_NONOCCUPY_PERIOD = 151, /* Specify non-occupancy period for radar */ + IEEE80211_PARAM_RADAR_NONOCCUPY_ACT_SCAN = 152, /* non-occupancy expire scan/no-action */ + IEEE80211_PARAM_MC_LEGACY_RATE = 153, /* Legacy multicast rate table */ + IEEE80211_PARAM_LDPC_ALLOW_NON_QTN = 154, /* Allow non QTN nodes to use LDPC */ + IEEE80211_PARAM_IGMP_HYBRID = 155, /* Do the IGMP hybrid mode as suggested by Swisscom */ + IEEE80211_PARAM_BCST_4 = 156, /* Reliable (4 addr encapsulated) broadcast to all clients */ + IEEE80211_PARAM_AP_FWD_LNCB = 157, /* AP forward LNCB packets from the STA to other STAs */ + IEEE80211_PARAM_PPPC_SELECT = 158, /* Per packet power control */ + IEEE80211_PARAM_TEST_LNCB = 159, /* Test LNCB code - leaks, drops etc. */ + IEEE80211_PARAM_STBC = 160, /* Enabling/disabling STBC */ + IEEE80211_PARAM_RTS_CTS = 161, /* Enabling/disabling RTS-CTS */ + IEEE80211_PARAM_GET_DFS_CCE = 162, /* Get most recent DFS Channel Change Event */ + IEEE80211_PARAM_GET_SCS_CCE = 163, /* Get most recent SCS (ACI/CCI) Channel Change Event */ + IEEE80211_PARAM_GET_CH_INUSE = 164, /* Enable printing of channels in Use at end of scan */ + IEEE80211_PARAM_RX_AGG_TIMEOUT = 165, /* RX aggregation timeout value (ms) */ + IEEE80211_PARAM_FORCE_MUC_HALT = 166, /* Force MUC halt debug code. */ + IEEE80211_PARAM_FORCE_ENABLE_TRIGGERS= 167, /* Enable trace triggers */ + IEEE80211_PARAM_FORCE_MUC_TRACE = 168, /* MuC trace force without halt */ + IEEE80211_PARAM_BK_BITMAP_MODE = 169, /* back bit map mode set */ + IEEE80211_PARAM_PROBE_RES_RETRIES = 170,/* Controls probe response retries */ + IEEE80211_PARAM_MUC_FLAGS = 171, /* MuC flags */ + IEEE80211_PARAM_HT_NSS_CAP = 172, /* Set max spatial streams for HT mode */ + IEEE80211_PARAM_ASSOC_LIMIT = 173, /* STA assoc limit */ + IEEE80211_PARAM_PWR_ADJUST_SCANCNT = 174, /* Enable power Adjust if nearby stations don't associate */ + IEEE80211_PARAM_PWR_ADJUST = 175, /* ioctl to adjust rx gain */ + IEEE80211_PARAM_PWR_ADJUST_AUTO = 176, /* Enable auto RX gain adjust when associated */ + IEEE80211_PARAM_UNKNOWN_DEST_ARP = 177, /* Send ARP requests for unknown destinations */ + IEEE80211_PARAM_UNKNOWN_DEST_FWD = 178, /* Send unknown dest pkt to all bridge STAs */ + IEEE80211_PARAM_DBG_MODE_FLAGS = 179, /* set/clear debug mode flags */ + IEEE80211_PARAM_ASSOC_HISTORY = 180, /* record of remote nodes that have associated by MAC address */ + IEEE80211_PARAM_CSW_RECORD = 181, /* get channel switch record data */ + IEEE80211_PARAM_RESTRICT_RTS = 182, /* HW xretry failures before switching to RTS mode */ + IEEE80211_PARAM_RESTRICT_LIMIT = 183, /* RTS xretry failures before starting restricted mode */ + IEEE80211_PARAM_AP_ISOLATE = 184, /* set ap isolation mode */ + IEEE80211_PARAM_IOT_TWEAKS = 185, /* mask to switch on / off IOT tweaks */ + IEEE80211_PARAM_SWRETRY_AGG_MAX = 186, /* max sw retries for ampdus */ + IEEE80211_PARAM_SWRETRY_NOAGG_MAX = 187,/* max sw retries for non-agg mpdus */ + IEEE80211_PARAM_BSS_ASSOC_LIMIT = 188, /* STA assoc limit for a VAP */ + + IEEE80211_PARAM_VSP_NOD_DEBUG = 190, /* turn on/off NOD debugs for VSP */ + IEEE80211_PARAM_CCA_PRI = 191, /* Primary CCA threshold */ + IEEE80211_PARAM_CCA_SEC = 192, /* Secondary CCA threshold */ + IEEE80211_PARAM_DYN_AGG_TIMEOUT = 193, /* Enable feature which try to prevent unnecessary waiting of aggregate before sending */ + IEEE80211_PARAM_HW_BONDING = 194, /* HW bonding option */ + IEEE80211_PARAM_PS_CMD = 195, /* Command to enable, disable, etc probe select for matrices */ + IEEE80211_PARAM_PWR_SAVE = 196, /* Power save parameter ctrl */ + IEEE80211_PARAM_DBG_FD = 197, /* Debug FD alloc/free */ + IEEE80211_PARAM_DISCONN_CNT = 198, /* get count of disconnection event */ + IEEE80211_PARAM_FAST_REASSOC = 199, /* Do a fast reassociation */ + IEEE80211_PARAM_SIFS_TIMING = 200, /* SIFS timing */ + IEEE80211_PARAM_TEST_TRAFFIC = 201, /* Test Traffic start|stop control */ + IEEE80211_PARAM_TX_AMSDU = 202, /* Disable/enable AMSDU and/or Adaptive AMSDU for transmission to Quantenna clients */ + IEEE80211_PARAM_SCS_DFS_REENTRY_REQUEST = 203, /* DFS re-entry request from SCS */ + IEEE80211_PARAM_QCAT_STATE = 204, /* QCAT state information */ + IEEE80211_PARAM_RALG_DBG = 205, /* Rate adaptation debugging */ + IEEE80211_PARAM_PPPC_STEP = 206, /* PPPC step size control */ + IEEE80211_PARAM_QTN_BGSCAN_DWELL_TIME_ACTIVE = 207, /* Quantenna bgscan dwell time for an active channel */ + IEEE80211_PARAM_QTN_BGSCAN_DWELL_TIME_PASSIVE = 208, /* Quantenna bgscan dwell time for a passive channel */ + IEEE80211_PARAM_QTN_BGSCAN_DEBUG = 209, /* Quantenna background scan debugging */ + IEEE80211_PARAM_CONFIG_REGULATORY_TXPOWER = 210, /* configure regulatory TX power for a band (start chan to stop chan) */ + IEEE80211_PARAM_SINGLE_AGG_QUEUING = 211, /* Queue only AMPDU fd at a time on a given tid till all sw retries are done */ + IEEE80211_PARAM_CSA_FLAG = 212, /* Channel switch announcement flag */ + IEEE80211_PARAM_BR_IP_ADDR = 213, + IEEE80211_PARAM_REMAP_QOS = 214, /* Command to enable, disable, qos remap feature, asked by customer */ + IEEE80211_PARAM_DEF_MATRIX = 215, /* Use default expansion matrices */ + IEEE80211_PARAM_SCS_CCA_INTF = 216, /* CCA interference for a channel */ + IEEE80211_PARAM_CONFIG_TPC_INTERVAL = 217, /* periodical tpc request interval */ + IEEE80211_PARAM_TPC_QUERY = 218, /* enable or disable tpc request periodically */ + IEEE80211_PARAM_TPC = 219, /* tpc feature enable/disable flag */ + IEEE80211_PARAM_CACSTATUS = 220, /* Get CAC status */ + IEEE80211_PARAM_RTSTHRESHOLD = 221, /* Get/Set RTS Threshold */ + IEEE80211_PARAM_BA_THROT = 222, /* Manual BA throttling */ + IEEE80211_PARAM_TX_QUEUING_ALG = 223, /* MuC TX queuing algorithm */ + IEEE80211_PARAM_BEACON_ALLOW = 224, /* To en/disable beacon rx when associated as STA*/ + IEEE80211_PARAM_1BIT_PKT_DETECT = 225, /* enable/disable 1bit pkt detection */ + IEEE80211_PARAM_WME_THROT = 226, /* Manual WME throttling */ +#ifdef TOPAZ_PLATFORM + IEEE80211_PARAM_ENABLE_11AC = 227, /* Enable-disable 11AC feature in Topaz */ + IEEE80211_PARAM_FIXED_11AC_TX_RATE = 228, /* Set 11AC mcs */ +#endif + IEEE80211_PARAM_GENPCAP = 229, /* WMAC tx/rx pcap ring buffer */ + IEEE80211_PARAM_CCA_DEBUG = 230, /* Debug of CCA */ + IEEE80211_PARAM_STA_DFS = 231, /* Enable or disable station DFS */ + IEEE80211_PARAM_OCAC = 232, /* Off-channel CAC */ + IEEE80211_PARAM_CCA_STATS_PERIOD = 233, /* the period for updating CCA stats in MuC */ + IEEE80211_PARAM_AUC_TX = 234, /* Control HW datapath transmission */ + IEEE80211_PARAM_RADAR_BW = 235, /* Set radar filter mode */ + IEEE80211_PARAM_TDLS_DISC_INT = 236, /* Set TDLS discovery interval */ + IEEE80211_PARAM_TDLS_PATH_SEL_WEIGHT = 237, /* The weight of path selection algorithm, 0 means always to use TDLS link */ + IEEE80211_PARAM_DAC_DBG = 238, /* dynamic ac debug */ + IEEE80211_PARAM_CARRIER_ID = 239, /* Get/Set carrier ID */ + IEEE80211_PARAM_SWRETRY_SUSPEND_XMIT = 240, /* Max sw retries when sending frames is suspended */ + IEEE80211_PARAM_DEACTIVE_CHAN_PRI = 241,/* Deactive channel as being used as primary channel */ + IEEE80211_PARAM_RESTRICT_RATE = 242, /* Packets per second sent when in Tx restrict mode */ + IEEE80211_PARAM_AUC_RX_DBG = 243, /* AuC rx debug command */ + IEEE80211_PARAM_RX_ACCELERATE = 244, /* Enable/Disable Topaz MuC rx accelerate */ + IEEE80211_PARAM_RX_ACCEL_LOOKUP_SA = 245, /* Enable/Disable lookup SA in FWT for rx accelerate */ + IEEE80211_PARAM_TX_MAXMPDU = 246, /* Set Max MPDU size to be supported */ + /* FIXME 247 is available for reuse */ + IEEE80211_PARAM_SPECIFIC_SCAN = 249, /* Just perform specific SSID scan */ + IEEE80211_PARAM_VLAN_CONFIG = 250, /* Configure VAP into MBSS or Passthrough mode */ + IEEE80211_PARAM_TRAINING_START = 251, /* restart rate training to a particular node */ + IEEE80211_PARAM_AUC_TX_DBG = 252, /* AuC tx debug command */ + IEEE80211_PARAM_AC_INHERITANCE = 253, /* promote AC_BE to use aggresive medium contention */ + IEEE80211_PARAM_NODE_OPMODE = 254, /* Set bandwidth and NSS used for a particular node */ + IEEE80211_PARAM_TACMAP = 255, /* Config TID AC and priority at TAC_MAP, debug only */ + IEEE80211_PARAM_VAP_PRI = 256, /* Config priority for VAP, used for TID priority at TAC_MAP */ + IEEE80211_PARAM_AUC_QOS_SCH = 257, /* Tune QoS scheduling in AuC */ + IEEE80211_PARAM_TXBF_IOT = 258, /* turn on/off TxBF IOT to non QTN node */ + IEEE80211_PARAM_CONGEST_IDX = 259, /* Current channel congestion index */ + IEEE80211_PARAM_SPEC_COUNTRY_CODE = 260, /* Set courntry code for EU region */ + IEEE80211_PARAM_AC_Q2Q_INHERITANCE = 261, /* promote AC_BE to use aggresive medium contention - Q2Q case */ + IEEE80211_PARAM_1SS_AMSDU_SUPPORT = 262, /* Enable-Disable AMSDU support for 1SS devies - phone and tablets */ + IEEE80211_PARAM_VAP_PRI_WME = 263, /* Automatic adjusting WME bss param based on VAP priority */ + IEEE80211_PARAM_MICHAEL_ERR_CNT = 264, /* total number of TKIP MIC errors */ + IEEE80211_PARAM_DUMP_CONFIG_TXPOWER = 265, /* Dump configured txpower for all channels */ + IEEE80211_PARAM_EMI_POWER_SWITCHING = 266, /* Enable/Disable EMI power switching */ + IEEE80211_PARAM_CONFIG_BW_TXPOWER = 267, /* Configure the TX powers different bandwidths */ + IEEE80211_PARAM_SCAN_CANCEL = 268, /* Cancel any ongoing scanning */ + IEEE80211_PARAM_VHT_NSS_CAP = 269, /* Set max spatial streams for VHT mode */ + IEEE80211_PARAM_FIXED_BW = 270, /* Configure fixed tx bandwidth without changing BSS bandwidth */ + IEEE80211_PARAM_SFS = 271, /* Smart Feature Select commands */ + IEEE80211_PARAM_TUNEPD = 272, /* Specify number of tunning packets to send for power detector tuning */ + IEEE80211_PARAM_TUNEPD_DONE = 273, /* Specify number of tunning packets to send for power detector tuning */ + IEEE80211_PARAM_CONFIG_PMF = 274, /* Enable/Disable 802.11w / PMF */ + + IEEE80211_PARAM_AUTO_CCA_ENABLE = 275, /* Enable/disable auto-cca-threshold feature */ + IEEE80211_PARAM_AUTO_CCA_PARAMS = 276, /* Configure the threshold parameter */ + IEEE80211_PARAM_AUTO_CCA_DEBUG = 277, /* Configure the auto-cca debug flag */ + IEEE80211_PARAM_INTRA_BSS_ISOLATE = 278,/* Intra BSS isolation */ + IEEE80211_PARAM_BSS_ISOLATE = 279, /* BSS isolation */ + IEEE80211_PARAM_BF_RX_STS = 280, /* Set max BF sounding receive STS */ + IEEE80211_PARAM_WOWLAN = 281, + IEEE80211_PARAM_WDS_MODE = 282, /* WDS mode */ + IEEE80211_PARAM_EXTENDER_ROLE = 283, /* EXTENDER Device role */ + IEEE80211_PARAM_EXTENDER_MBS_BEST_RSSI = 284, /* MBS best rssi threshold */ + IEEE80211_PARAM_EXTENDER_RBS_BEST_RSSI = 285, /* RBS best rssi threshold */ + IEEE80211_PARAM_EXTENDER_MBS_WGT = 286, /* MBS RSSI weight */ + IEEE80211_PARAM_EXTENDER_RBS_WGT = 287, /* RBS RSSI weight */ + IEEE80211_PARAM_AIRFAIR = 288, /* Set airtime fairness configuration */ + IEEE80211_PARAM_SET_STA_VLAN = 289, /* Place a STA into a VLAN */ + IEEE80211_PARAM_RX_AMSDU_ENABLE = 290, /* RX AMSDU: 0 - disable, 1 - enable, 2 - enable dynamically */ + IEEE80211_PARAM_DISASSOC_REASON = 291, /* Get Disassoc reason */ + IEEE80211_PARAM_TX_QOS_SCHED = 292, /* TX QoS hold-time table */ + IEEE80211_PARAM_RX_AMSDU_THRESHOLD_CCA = 293, /* The threshold of cca intf for dynamic RX AMSDU */ + IEEE80211_PARAM_RX_AMSDU_THRESHOLD_PMBL = 294, /* The threshold of pmbl error for dynamic RX AMSDU */ + IEEE80211_PARAM_RX_AMSDU_PMBL_WF_SP = 295, /* The weight factor of short preamble error for calculating the pmbl error */ + IEEE80211_PARAM_RX_AMSDU_PMBL_WF_LP = 296, /* The weight factor of long preamble error for calculating the pmbl error */ + IEEE80211_PARAM_PEER_RTS_MODE = 297, /* Mode setting for peer RTS */ + IEEE80211_PARAM_DYN_WMM = 298, /* Dynamic WMM enable */ + IEEE80211_PARAM_BA_SETUP_ENABLE = 299, /* enable the BA according the rssi threshold, 0 - disable, 1 - enable */ + IEEE80211_PARAM_AGGRESSIVE_AGG = 300, /* Compound aggressive agg params */ + IEEE80211_PARAM_BB_PARAM = 301, /* Baseband param */ + IEEE80211_PARAM_VAP_TX_AMSDU = 302, /* Enable/disable A-MSDU for VAP */ + IEEE80211_PARAM_PC_OVERRIDE = 303, /* RSSI based Power-contraint override */ + IEEE80211_PARAM_NDPA_DUR = 304, /* set vht NDPA duration field */ + IEEE80211_PARAM_TXBF_PKT_CNT = 305, /* set the pkt cnt per txbf interval to fire sounding to a node */ + IEEE80211_PARAM_MAX_AGG_SIZE = 306, /* Maximum AMPDU size in bytes */ + IEEE80211_PARAM_TQEW_DESCR_LIMIT = 307, /* Set/Get tqew descriptors limit */ + IEEE80211_PARAM_SCAN_TBL_LEN_MAX = 308, + IEEE80211_PARAM_CS_THRESHOLD = 309, /* Carrier Sense threshold */ + IEEE80211_PARAM_TDLS_PROHIBIT_PATH_SEL = 310, /* Enable/Disable TDLS path selection */ + IEEE80211_PARAM_TDLS_MODE = 311, /* TDLS path select mode */ + IEEE80211_PARAM_TDLS_STATUS = 312, /* TDLS status, 0 disable, 1 enable */ + IEEE80211_PARAM_TDLS_TIMEOUT_TIME = 313, + IEEE80211_PARAM_TDLS_TRAINING_PKT_CNT = 314, /* TDLS training packet count */ + IEEE80211_PARAM_TDLS_PATH_SEL_PPS_THRSHLD = 315, /* TDLS path select packet per second threshold */ + IEEE80211_PARAM_TDLS_PATH_SEL_RATE_THRSHLD = 316, /* TDLS path select rate threshold */ + IEEE80211_PARAM_TDLS_VERBOSE = 317, /* TDLS debug info level */ + IEEE80211_PARAM_TDLS_MIN_RSSI = 318, /* TDLS mininum valid RSSI */ + IEEE80211_PARAM_TDLS_SWITCH_INTS = 319, /* TDLS switch intervals */ + IEEE80211_PARAM_TDLS_RATE_WEIGHT = 320, /* TDLS accumulated rate weight */ + IEEE80211_PARAM_TDLS_UAPSD_INDICAT_WND = 321, /* TDLS path select rate threshold */ + IEEE80211_PARAM_TDLS_CS_PROHIBIT = 322, /* Prohibit TDLS channel switch */ + IEEE80211_PARAM_TDLS_CS_MODE = 323, /* Set TDLS channel switch mode */ + IEEE80211_PARAM_TDLS_OFF_CHAN = 324, /* TDLS off channel */ + IEEE80211_PARAM_TDLS_OFF_CHAN_BW = 325, /* TDLS off channel bandwidth */ + IEEE80211_PARAM_TDLS_NODE_LIFE_CYCLE = 326, /* TDLS node life cycle */ + IEEE80211_PARAM_NODEREF_DBG = 327, /* show history of node reference debug info */ + IEEE80211_PARAM_SWFEAT_DISABLE = 329, /* disable an optional software feature */ + IEEE80211_PARAM_11N_AMSDU_CTRL = 330, /* ctrl TX AMSDU of IP ctrl packets for 11N STAs */ + IEEE80211_PARAM_CCA_FIXED = 331, + IEEE80211_PARAM_CCA_SEC40 = 332, + IEEE80211_PARAM_CS_THRESHOLD_DBM = 333, + IEEE80211_PARAM_EXTENDER_VERBOSE = 334, /* EXTENDER Debug Level */ + IEEE80211_PARAM_FLUSH_SCAN_ENTRY = 335, /* Flush scan entry */ + IEEE80211_PARAM_SCAN_OPCHAN = 336, /* Scan operating channel periodically in STA mode */ + IEEE80211_PARAM_DUMP_PPPC_TX_SCALE_BASES = 337, /* Dump the current PPPC tx scale bases */ + IEEE80211_PARAM_VHT_OPMODE_BW = 338, /* Controls peer transmitter's BW */ + IEEE80211_PARAM_HS2 = 339, /* Enable/Disable HS2.0 */ + IEEE80211_PARAM_DGAF_CONTROL = 340, /* Downstream Group-Addressed Forwarding (DGAF) */ + IEEE80211_PARAM_PROXY_ARP = 341, /* Proxy ARP */ + IEEE80211_PARAM_GLOBAL_FIXED_TX_SCALE_INDEX = 342, /* Set global fixed tx scale index, regardless pppc probe index and tx scale bases */ + IEEE80211_PARAM_RATE_TRAIN_DBG = 343, /* Rate training */ + IEEE80211_PARAM_NDPA_LEGACY_FORMAT = 344, /* Configure PHY format for NDPA frame */ + IEEE80211_PARAM_QTN_HAL_PM_CORRUPT_DEBUG = 345, /* flag to enable debug qtn packet memory corruption */ + + IEEE80211_PARAM_UPDATE_MU_GRP = 346, /* Update MU group/position */ + IEEE80211_PARAM_FIXED_11AC_MU_TX_RATE = 347, /* Set 11AC MU fixed mcs */ + IEEE80211_PARAM_MU_DEBUG_LEVEL = 348, /* Set 11AC MU debug level */ + IEEE80211_PARAM_MU_ENABLE = 349, /* Enable/disable MU transmission */ + IEEE80211_PARAM_INST_MU_GRP_QMAT = 350, /* Install qmat for mu group */ + IEEE80211_PARAM_DELE_MU_GRP_QMAT = 351, /* Delete/disable qmat in mu group */ + IEEE80211_PARAM_GET_MU_GRP = 352, /* Retrieve MU group and Q matrix info */ + IEEE80211_PARAM_EN_MU_GRP_QMAT = 353, /* Enable qmat in mu group */ + IEEE80211_PARAM_MU_DEBUG_FLAG = 354, /* Set or clear MU debug flag */ + IEEE80211_PARAM_DSP_DEBUG_LEVEL = 355, /* DSP debug verbocity level */ + IEEE80211_PARAM_DSP_DEBUG_FLAG = 356, /* Set DSP debug flag */ + IEEE80211_PARAM_SET_CRC_ERR = 357, /* Enables/disables CRC error to be passed to packet memory*/ + IEEE80211_PARAM_MU_SWITCH_USR_POS = 358, /* Switch MU user_pos for debugging MU interference */ + IEEE80211_PARAM_SET_GRP_SND_PERIOD = 359, /* Sets group select sounding period */ + IEEE80211_PARAM_SET_PREC_SND_PERIOD = 360, /* Sets precoding sounding period */ + IEEE80211_PARAM_INST_1SS_DEF_MAT_ENABLE = 361, /* Enable install 1ss default matrix feature */ + IEEE80211_PARAM_INST_1SS_DEF_MAT_THRESHOLD = 362, /* Configure the threshold for install 1ss default matrix */ + IEEE80211_PARAM_SCAN_RESULTS_CHECK_INV = 363, /* interval to check scan results */ + IEEE80211_PARAM_TDLS_OVER_QHOP_ENABLE = 364, /* Enable TDLS over qhop */ + IEEE80211_PARAM_DSP_PRECODING_ALGORITHM = 365, /*select precoding algorithm, projection(1) or BD(2)*/ + IEEE80211_PARAM_DSP_RANKING_ALGORITHM = 366, /*select ranking algorithm, projection(1) or BD(2)*/ + IEEE80211_PARAM_DIS_MU_GRP_QMAT = 367, /* Disable QMat for MU group */ + IEEE80211_PARAM_GET_MU_GRP_QMAT = 368, /* Get QMat status */ + IEEE80211_PARAM_MU_USE_EQ = 369, /* Equalizer status */ + IEEE80211_PARAM_INITIATE_TXPOWER_TABLE = 370, /* Initiate TX power table for a band with one single value */ + IEEE80211_PARAM_L2_EXT_FILTER = 371, /* External L2 Filter */ + IEEE80211_PARAM_L2_EXT_FILTER_PORT = 372, /* External L2 Filter port */ + IEEE80211_PARAM_MU_AIRTIME_PADDING = 373, /* Airtime padding for MU/SU Tx decision */ + IEEE80211_PARAM_MU_AMSDU_SIZE = 374, /* Set Fixed MU AMSDU size */ + IEEE80211_PARAM_SDFS = 375, /* Seamless DFS, same as PARAM_OCAC */ + IEEE80211_PARAM_SET_VERIWAVE_POWER = 376, /* Set Fixed tx power against veriwave clients */ + IEEE80211_PARAM_ENABLE_RX_OPTIM_STATS = 377, /* Enable RX optim stats */ + IEEE80211_PARAM_DSP_MU_RANK_CRITERIA = 378, /* select mu ranking criteria */ + IEEE80211_PARAM_SET_UNICAST_QUEUE_NUM = 379, /* Set Max congest queue num for unicast */ + IEEE80211_PARAM_QTN_BGSCAN_DURATION_ACTIVE = 389, /* Quantenna bgscan duration for an active channel */ + IEEE80211_PARAM_QTN_BGSCAN_DURATION_PASSIVE_FAST = 390, /* Quantenna bgscan duration for a passive channel */ + IEEE80211_PARAM_QTN_BGSCAN_DURATION_PASSIVE_NORMAL = 391, /* Quantenna bgscan duration for a passive channel */ + IEEE80211_PARAM_QTN_BGSCAN_DURATION_PASSIVE_SLOW = 392, /* Quantenna bgscan duration for a passive channel */ + IEEE80211_PARAM_QTN_BGSCAN_THRSHLD_PASSIVE_FAST = 393, /* Quantenna bgscan fat threshold for passive fast mode */ + IEEE80211_PARAM_QTN_BGSCAN_THRSHLD_PASSIVE_NORMAL = 394, /* Quantenna bgscan fat threshold for passive normal mode */ + IEEE80211_PARAM_QTN_BLOCK_BSS = 395, /* Block any association request for specified BSS */ + IEEE80211_PARAM_BEACONING_SCHEME = 398, /* the mapping between 8 VAPs and 4 HW event queues for beacon */ + IEEE80211_PARAM_PN_VALIDATION = 541, /* Enable/disable PN validation */ +}; + +#define SIOCG80211STATS (SIOCDEVPRIVATE+2) +/* NB: require in+out parameters so cannot use wireless extensions, yech */ +#define IEEE80211_IOCTL_GETKEY (SIOCDEVPRIVATE+3) +#define IEEE80211_IOCTL_GETWPAIE (SIOCDEVPRIVATE+4) +#define IEEE80211_IOCTL_STA_STATS (SIOCDEVPRIVATE+5) +#define IEEE80211_IOCTL_STA_INFO (SIOCDEVPRIVATE+6) +#define SIOC80211IFCREATE (SIOCDEVPRIVATE+7) +#define SIOC80211IFDESTROY (SIOCDEVPRIVATE+8) +#define IEEE80211_IOCTL_SCAN_RESULTS (SIOCDEVPRIVATE+9) +#define SIOCR80211STATS (SIOCDEVPRIVATE+0xA) /* This define always has to sync up with SIOCRDEVSTATS in /linux/sockios.h */ +#define IEEE80211_IOCTL_GET_ASSOC_TBL (SIOCDEVPRIVATE+0xB) +#define IEEE80211_IOCTL_GET_RATES (SIOCDEVPRIVATE+0xC) +#define IEEE80211_IOCTL_SET_RATES (SIOCDEVPRIVATE+0xD) +#define IEEE80211_IOCTL_EXT (SIOCDEVPRIVATE+0xF) /* This command is used to support sub-ioctls */ + +/* + * ioctl command IEEE80211_IOCTL_EXT is used to support sub-ioctls. + * The following lists the sub-ioctl numbers + * + */ +#define SIOCDEV_SUBIO_BASE (0) +#define SIOCDEV_SUBIO_RST_QUEUE (SIOCDEV_SUBIO_BASE + 1) +#define SIOCDEV_SUBIO_RADAR_STATUS (SIOCDEV_SUBIO_BASE + 2) +#define SIOCDEV_SUBIO_GET_PHY_STATS (SIOCDEV_SUBIO_BASE + 3) +#define SIOCDEV_SUBIO_DISCONN_INFO (SIOCDEV_SUBIO_BASE + 4) +#define SIOCDEV_SUBIO_SET_BRCM_IOCTL (SIOCDEV_SUBIO_BASE + 5) +#define SIOCDEV_SUBIO_SCS (SIOCDEV_SUBIO_BASE + 6) +#define SIOCDEV_SUBIO_SET_SOC_ADDR_IOCTL (SIOCDEV_SUBIO_BASE + 7) /* Command to set the SOC addr of the STB to VAP for recording */ +#define SIOCDEV_SUBIO_SET_TDLS_OPER (SIOCDEV_SUBIO_BASE + 8) /* Set TDLS Operation */ +#define SIOCDEV_SUBIO_WAIT_SCAN_TIMEOUT (SIOCDEV_SUBIO_BASE + 9) +#define SIOCDEV_SUBIO_AP_SCAN_RESULTS (SIOCDEV_SUBIO_BASE + 10) +#define SIOCDEV_SUBIO_GET_11H_11K_NODE_INFO (SIOCDEV_SUBIO_BASE + 11) +#define SIOCDEV_SUBIO_GET_DSCP2AC_MAP (SIOCDEV_SUBIO_BASE + 12) +#define SIOCDEV_SUBIO_SET_DSCP2AC_MAP (SIOCDEV_SUBIO_BASE + 13) +#define SIOCDEV_SUBIO_SET_MARK_DFS_CHAN (SIOCDEV_SUBIO_BASE + 14) +#define SIOCDEV_SUBIO_WOWLAN (SIOCDEV_SUBIO_BASE + 15) +#define SIOCDEV_SUBIO_GET_STA_AUTH (SIOCDEV_SUBIO_BASE + 16) +#define SIOCDEV_SUBIO_GET_STA_VENDOR (SIOCDEV_SUBIO_BASE + 17) +#define SIOCDEV_SUBIO_GET_STA_TPUT_CAPS (SIOCDEV_SUBIO_BASE + 18) +#define SIOCDEV_SUBIO_GET_SWFEAT_MAP (SIOCDEV_SUBIO_BASE + 19) +#define SIOCDEV_SUBIO_DI_DFS_CHANNELS (SIOCDEV_SUBIO_BASE + 20) /* Deactive DFS channels */ +#define SIOCDEV_SUBIO_SET_ACTIVE_CHANNEL_LIST (SIOCDEV_SUBIO_BASE + 21) +#define SIOCDEV_SUBIO_PRINT_SWFEAT_MAP (SIOCDEV_SUBIO_BASE + 22) +#define SIOCDEV_SUBIO_SEND_ACTION_FRAME (SIOCDEV_SUBIO_BASE + 23) +#define SIOCDEV_SUBIO_GET_DRIVER_CAPABILITY (SIOCDEV_SUBIO_BASE + 24) +#define SIOCDEV_SUBIO_SET_AP_INFO (SIOCDEV_SUBIO_BASE + 25) +#define SIOCDEV_SUBIO_GET_LINK_QUALITY_MAX (SIOCDEV_SUBIO_BASE + 26) +#define SIOCDEV_SUBIO_SET_CHANNEL_POWER_TABLE (SIOCDEV_SUBIO_BASE + 27) +#define SIOCDEV_SUBIO_SET_WEATHER_CHAN (SIOCDEV_SUBIO_BASE + 28) +#define SIOCDEV_SUBIO_GET_CHANNEL_POWER_TABLE (SIOCDEV_SUBIO_BASE + 29) +#define SIOCDEV_SUBIO_SETGET_CHAN_DISABLED (SIOCDEV_SUBIO_BASE + 30) + +enum L2_EXT_FILTER_PORT { + L2_EXT_FILTER_EMAC_0_PORT = 0, + L2_EXT_FILTER_EMAC_1_PORT = 1 +}; + +struct ieee80211_clone_params { + char icp_name[IFNAMSIZ]; /* device name */ + uint16_t icp_opmode; /* operating mode */ + uint16_t icp_flags; /* see below */ +#define IEEE80211_CLONE_BSSID 0x0001 /* allocate unique mac/bssid */ +#define IEEE80211_NO_STABEACONS 0x0002 /* Do not setup the station beacon timers */ +}; + +enum power_table_sel { + PWR_TABLE_SEL_BOOTCFG_ONLY = 0, /* Search for power table in bootcfg only */ + PWR_TABLE_SEL_BOOTCFG_PRIOR, /* Search for power table in bootcfg at first, if not find, then search /etc/ */ + PWR_TABLE_SEL_IMAGE_PRIOR, /* Search for power table in /etc/ at first, if not find, then search bootcfg */ + PWR_TABLE_SEL_IMAGE_ONLY, /* Search for power table in /etc/ only */ + PWR_TABLE_SEL_MAX = PWR_TABLE_SEL_IMAGE_ONLY, +}; + +/* APPIEBUF related definitions */ +/* Management frame type to which application IE is added */ +enum { + IEEE80211_APPIE_FRAME_BEACON = 0, + IEEE80211_APPIE_FRAME_PROBE_REQ = 1, + IEEE80211_APPIE_FRAME_PROBE_RESP = 2, + IEEE80211_APPIE_FRAME_ASSOC_REQ = 3, + IEEE80211_APPIE_FRAME_ASSOC_RESP = 4, + IEEE80211_APPIE_FRAME_TDLS_ACT = 5, + IEEE80211_APPIE_NUM_OF_FRAME = 6 +}; + +/* the beaconing schemes - the mapping between 8 VAPs and 4 HW TX queues for beacon */ +enum { + /* + * Scheme 0 - default + * VAP0/VAP4 - HW queue0 + * VAP1/VAP5 - HW queue1 + * VAP2/VAP6 - HW queue2 + * VAP3/VAP7 - HW queue3 + */ + QTN_BEACONING_SCHEME_0 = 0, + /* + * Scheme 1: + * VAP0/VAP1 - HW queue0 + * VAP2/VAP3 - HW queue1 + * VAP4/VAP5 - HW queue2 + * VAP6/VAP7 - HW queue3 + */ + QTN_BEACONING_SCHEME_1 = 1 +}; + +/* + * This enum must be kept in sync with tdls_operation_string. + * enum ieee80211_tdls_operation - values for tdls_oper callbacks + * @IEEE80211_TDLS_DISCOVERY_REQ: Send a TDLS discovery request + * @IEEE80211_TDLS_SETUP: Setup TDLS link + * @IEEE80211_TDLS_TEARDOWN: Teardown a TDLS link which is already established + * @IEEE80211_TDLS_ENABLE_LINK: Enable TDLS link + * @IEEE80211_TDLS_DISABLE_LINK: Disable TDLS link + * @IEEE80211_TDLS_ENABLE: Enable TDLS function + * @IEEE80211_TDLS_DISABLE: Disable TDLS function + * @IEEE80211_TDLS_PTI_REQ: Send a TDLS Peer Traffic Indication Frame + */ +enum ieee80211_tdls_operation { + IEEE80211_TDLS_DISCOVERY_REQ = 0, + IEEE80211_TDLS_SETUP = 1, + IEEE80211_TDLS_TEARDOWN = 2, + IEEE80211_TDLS_ENABLE_LINK = 3, + IEEE80211_TDLS_DISABLE_LINK = 4, + IEEE80211_TDLS_ENABLE = 5, + IEEE80211_TDLS_DISABLE = 6, + IEEE80211_TDLS_PTI_REQ = 7, + IEEE80211_TDLS_SWITCH_CHAN = 8, +}; + +enum ieee80211_tdls_event { + IEEE80211_EVENT_TDLS, + IEEE80211_EVENT_STATION_LOW_ACK +}; + +struct ieee80211_tdls_event_data { + char name[32]; + uint8_t index; + uint8_t sub_index; + uint8_t peer_mac[IEEE80211_ADDR_LEN]; + uint8_t value[0]; +} __packed; + +struct ieee80211_tdls_oper_data { + uint8_t dest_mac[IEEE80211_ADDR_LEN]; + uint8_t oper; +} __packed; + +struct ieee80211_tdls_action_data { + uint8_t dest_mac[IEEE80211_ADDR_LEN]; /* Destination address of tdls action */ + uint8_t action; /* TDLS action frame type */ + uint16_t status; /* Statu code */ + uint8_t dtoken; /* Dialog token */ + uint32_t ie_buflen; /* Subsequent IEs length*/ + uint8_t ie_buf[0]; /* Subsequent IEs */ +} __packed; + +struct ieee80211req_getset_appiebuf { + uint32_t app_frmtype; /* management frame type for which buffer is added */ + uint32_t app_buflen; /* application-supplied buffer length */ +#define F_QTN_IEEE80211_PAIRING_IE 0x1 + uint8_t flags; /* flags here is used to check whether QTN pairing IE exists */ + uint8_t app_buf[0]; /* application-supplied IE(s) */ +}; + +/* Action frame payload */ +struct action_frame_payload { + u_int16_t length; /* action frame payload length */ + u_int8_t data[0]; /* action frame payload data */ +}__packed; + +/* Structre used to send action frame from hostapd */ +struct app_action_frame_buf { + u_int8_t cat; /* action frame category */ + u_int8_t action; /* action frame action */ + u_int8_t dst_mac_addr[IEEE80211_ADDR_LEN]; + struct action_frame_payload frm_payload; +}__packed; + +struct app_ie { + u_int8_t id; + u_int16_t len; + union { + struct { + u_int8_t interworking; + u_int8_t an_type; + u_int8_t hessid[IEEE80211_ADDR_LEN]; + }__packed interw; + }u; +}__packed; + +struct qtn_cca_args +{ + uint32_t cca_channel; + uint32_t duration; +}; + +/* Flags ORed by application to set filter for receiving management frames */ +enum { + IEEE80211_FILTER_TYPE_BEACON = 1<<0, + IEEE80211_FILTER_TYPE_PROBE_REQ = 1<<1, + IEEE80211_FILTER_TYPE_PROBE_RESP = 1<<2, + IEEE80211_FILTER_TYPE_ASSOC_REQ = 1<<3, + IEEE80211_FILTER_TYPE_ASSOC_RESP = 1<<4, + IEEE80211_FILTER_TYPE_AUTH = 1<<5, + IEEE80211_FILTER_TYPE_DEAUTH = 1<<6, + IEEE80211_FILTER_TYPE_DISASSOC = 1<<7, + IEEE80211_FILTER_TYPE_ACTION = 1<<8, + IEEE80211_FILTER_TYPE_ALL = 0x1FF /* used to check the valid filter bits */ +}; + +struct ieee80211req_set_filter { + uint32_t app_filterype; /* management frame filter type */ +}; + +/* Tx Restrict */ +#define IEEE80211_TX_RESTRICT_RTS_MIN 2 +#define IEEE80211_TX_RESTRICT_RTS_DEF 6 +#define IEEE80211_TX_RESTRICT_LIMIT_MIN 2 +#define IEEE80211_TX_RESTRICT_LIMIT_DEF 12 +#define IEEE80211_TX_RESTRICT_RATE 5 + +/* Compatibility fix bitmap for various vendor peer */ +#define VENDOR_FIX_BRCM_DHCP 0x01 +#define VENDOR_FIX_BRCM_REPLACE_IGMP_SRCMAC 0x02 +#define VENDOR_FIX_BRCM_REPLACE_IP_SRCMAC 0x04 +#define VENDOR_FIX_BRCM_DROP_STA_IGMPQUERY 0x08 +#define VENDOR_FIX_BRCM_AP_GEN_IGMPQUERY 0x10 + +enum vendor_fix_idx { + VENDOR_FIX_IDX_BRCM_DHCP = 1, + VENDOR_FIX_IDX_BRCM_IGMP = 2, + VENDOR_FIX_IDX_MAX = VENDOR_FIX_IDX_BRCM_IGMP, +}; + +#define IEEE80211_TDLS_OVER_QHOP_ENABLE_MIN 0 +#define IEEE80211_TDLS_OVER_QHOP_ENABLE_MAX 1 +#define IEEE80211_TDLS_TIMEOUT_TIME_MIN 5 +#define IEEE80211_TDLS_TIMEOUT_TIME_MAX 3600 +#define IEEE80211_TDLS_LINK_WEIGHT_MIN 0 +#define IEEE80211_TDLS_LINK_WEIGHT_MAX 10 +#define IEEE80211_TDLS_TRAINING_PKT_CNT_MIN 10 +#define IEEE80211_TDLS_TRAINING_PKT_CNT_MAX 1000 +#define IEEE80211_TDLS_DISC_INTERVAL_MIN 60 +#define IEEE80211_TDLS_DISC_INTERVAL_MAX 3600 +#define IEEE80211_TDLS_PATH_SEL_PPS_THRSHLD_MIN 8 +#define IEEE80211_TDLS_PATH_SEL_PPS_THRSHLD_MAX 64 +#define IEEE80211_TDLS_PATH_SEL_RATE_THRSHLD_MIN 0 +#define IEEE80211_TDLS_PATH_SEL_RATE_THRSHLD_MAX 1000 +#define IEEE80211_TDLS_VERBOSE_MIN 0 +#define IEEE80211_TDLS_VERBOSE_MAX 2 +#define IEEE80211_TDLS_VALID_RSSI_MIN (-1200) +#define IEEE80211_TDLS_VALID_RSSI_MAX 0 +#define IEEE80211_TDLS_SWITCH_INTS_MIN 2 +#define IEEE80211_TDLS_SWITCH_INTS_MAX 10 +#define IEEE80211_TDLS_RATE_WEIGHT_MIN 0 +#define IEEE80211_TDLS_RATE_WEIGHT_MAX 10 + +#define IEEE80211_TDLS_MODE_MIN 0 +#define IEEE80211_TDLS_MODE_MAX 1 +#define IEEE80211_TDLS_INDICATION_WINDOWS_MIN 1 +#define IEEE80211_TDLS_INDICATION_WINDOWS_MAX 20 +#define IEEE80211_TDLS_CS_PROHIBIT_MIN 0 +#define IEEE80211_TDLS_CS_PROHIBIT_MAX 2 +#define IEEE80211_TDLS_CS_OFFCHAN_MIN 0 +#define IEEE80211_TDLS_CS_OFFCHAN_MAX 255 +#define IEEE80211_TDLS_CS_OFFCHAN_BW_MIN 0 +#define IEEE80211_TDLS_CS_OFFCHAN_BW_MAX 160 +#define IEEE80211_TDLS_NODE_LIFE_CYCLE_MIN 5 +#define IEEE80211_TDLS_NODE_LIFE_CYCLE_MAX 1000 +#define IEEE80211_TDLS_CHAN_SWITCH_INTV_MIN 100 +struct ieee80211req_wowlan { + uint32_t is_op; + uint8_t *is_data; + int32_t is_data_len; +}; + +#define IEEE80211_AUTHDESCR_KEYMGMT_NONE 0x00 +#define IEEE80211_AUTHDESCR_KEYMGMT_EAP 0x01 +#define IEEE80211_AUTHDESCR_KEYMGMT_PSK 0x02 +#define IEEE80211_AUTHDESCR_KEYMGMT_WEP 0x03 + +#define IEEE80211_AUTHDESCR_KEYPROTO_NONE 0x00 +#define IEEE80211_AUTHDESCR_KEYPROTO_WPA 0x01 +#define IEEE80211_AUTHDESCR_KEYPROTO_RSN 0x02 + +#define IEEE80211_AUTHDESCR_ALGO_POS 0x00 +#define IEEE80211_AUTHDESCR_KEYMGMT_POS 0x01 +#define IEEE80211_AUTHDESCR_KEYPROTO_POS 0x02 +#define IEEE80211_AUTHDESCR_CIPHER_POS 0x03 + + +struct ieee80211req_auth_description { + uint8_t macaddr[IEEE80211_ADDR_LEN]; + uint32_t description; +}; + +enum ieee80211_extender_role { + IEEE80211_EXTENDER_ROLE_NONE = 0x00, + IEEE80211_EXTENDER_ROLE_MBS = 0x01, + IEEE80211_EXTENDER_ROLE_RBS = 0x02 +}; + +#define WDS_EXT_RECEIVED_MBS_IE 0 +#define WDS_EXT_RECEIVED_RBS_IE 1 +#define WDS_EXT_LINK_STATUS_UPDATE 2 +#define WDS_EXT_RBS_OUT_OF_BRR 3 +#define WDS_EXT_RBS_SET_CHANNEL 4 +#define WDS_EXT_CLEANUP_WDS_LINK 5 +#define WDS_EXT_STA_UPDATE_EXT_INFO 6 + +#define IEEE80211_MAX_EXT_EVENT_DATA_LEN 256 + +#define IEEE80211_EXTENDER_ROLE_MIN 0 +#define IEEE80211_EXTENDER_ROLE_MAX 2 +#define IEEE80211_EXTENDER_MIN_RSSI 0 +#define IEEE80211_EXTENDER_MAX_RSSI 70 +#define IEEE80211_EXTENDER_MIN_WGT 0 +#define IEEE80211_EXTENDER_MAX_WGT 10 +#define IEEE80211_EXTENDER_MIN_VERBOSE 0 +#define IEEE80211_EXTENDER_MAX_VERBOSE 2 +#define IEEE80211_EXTENDER_MIN_INTERVAL 30 +#define IEEE80211_EXTENDER_MAX_INTERVAL 300 +#define IEEE80211_EXTENDER_MIN_ROAMING 0 +#define IEEE80211_EXTENDER_MAX_ROAMING 1 + +/** + * Structure contains data of wds extender event. + * @name will always be "QTN-WDS-EXT" + * @cmd message type. + * @mac specify wds peer mac address + * @link_status specify the wds link state. + * @ie_len when the message contains an wds extender IE, ie_len is larger than 0. + */ +struct qtn_wds_ext_event_data { + char name[12]; + uint8_t cmd; + uint8_t mac[IEEE80211_ADDR_LEN]; + uint8_t extender_role; + uint8_t link_status; + uint8_t channel; + uint8_t bandwidth; + uint8_t ssid[IEEE80211_NWID_LEN + 1]; + uint8_t ie_len; + uint8_t wds_extender_ie[0]; +}__packed; + +#endif /* __linux__ */ + +#endif /* _NET80211_IEEE80211_IOCTL_H_ */ diff --git a/package/firmware/quantenna/src/net80211/ieee80211_qos.h b/package/firmware/quantenna/src/net80211/ieee80211_qos.h new file mode 100644 index 000000000..ba94cc677 --- /dev/null +++ b/package/firmware/quantenna/src/net80211/ieee80211_qos.h @@ -0,0 +1,25 @@ +/* + * Copyright (c) 2012 Quantenna Communications, Inc. + * All rights reserved. + * + * Common QOS definitions. + */ +#ifndef _IEEE80211_QOS_H +#define _IEEE80211_QOS_H + +/* WME stream classes */ +#define WME_AC_BE 0 /* best effort */ +#define WME_AC_BK 1 /* background */ +#define WME_AC_VI 2 /* video */ +#define WME_AC_VO 3 /* voice */ + +enum { + IEEE80211_WMMPARAMS_CWMIN = 1, + IEEE80211_WMMPARAMS_CWMAX = 2, + IEEE80211_WMMPARAMS_AIFS = 3, + IEEE80211_WMMPARAMS_TXOPLIMIT = 4, + IEEE80211_WMMPARAMS_ACM = 5, + IEEE80211_WMMPARAMS_NOACKPOLICY = 6, +}; + +#endif diff --git a/package/firmware/quantenna/src/qcsapi.h b/package/firmware/quantenna/src/qcsapi.h new file mode 100644 index 000000000..3037c459f --- /dev/null +++ b/package/firmware/quantenna/src/qcsapi.h @@ -0,0 +1,15595 @@ +/*SH1 +******************************************************************************* +** ** +** Copyright (c) 2009 - 2014 Quantenna Communications Inc ** +** ** +** File : qcsapi.h ** +** Description : ** +** ** +******************************************************************************* +** ** +** Redistribution and use in source and binary forms, with or without ** +** modification, are permitted provided that the following conditions ** +** are met: ** +** 1. Redistributions of source code must retain the above copyright ** +** notice, this list of conditions and the following disclaimer. ** +** 2. Redistributions in binary form must reproduce the above copyright ** +** notice, this list of conditions and the following disclaimer in the ** +** documentation and/or other materials provided with the distribution. ** +** 3. The name of the author may not be used to endorse or promote products ** +** derived from this software without specific prior written permission. ** +** ** +** Alternatively, this software may be distributed under the terms of the ** +** GNU General Public License ("GPL") version 2, or (at your option) any ** +** later version as published by the Free Software Foundation. ** +** ** +** In the case this software is distributed under the GPL license, ** +** you should have received a copy of the GNU General Public License ** +** along with this software; if not, write to the Free Software ** +** Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ** +** ** +** THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR ** +** IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES** +** OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. ** +** IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, ** +** INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT ** +** NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,** +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ** +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ** +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF ** +** THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ** +** ** +******************************************************************************* +EH1*/ + +/** + * \file qcsapi.h + * + * The main QCSAPI header file containing function prototypes, data types etc. + */ + +#ifndef _QCSAPI_H +#define _QCSAPI_H + +#include +#include +#include +#include + +#include +#include +#include + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * Following #defines come from the TR-098 standard. + * They are conditional in case another include file has already defined them. + */ + +#ifndef IEEE80211_CHAN_MAX +#define IEEE80211_CHAN_MAX 255 +#endif + +#ifndef IW_ESSID_MAX_SIZE +#define IW_ESSID_MAX_SIZE 32 +#endif + +/* Begin QCSAPI definitions */ + +#define QCSAPI_WPS_SHORT_PIN_LEN 4 +#define QCSAPI_WPS_MAX_PIN_LEN 8 + +#define QCSAPI_MAX_PARAMETER_NAME_LEN 24 +#define QCSAPI_MAX_PARAMETER_VALUE_LEN 200 + +#define QCSAPI_MIN_LENGTH_REGULATORY_REGION 10 +#define QCSAPI_MAX_BITRATE_STR_MIN_LEN 4 + +#define QCSAPI_QDRV_NUM_RF_STREAMS 4 + +#ifndef ARRAY_SIZE +#define ARRAY_SIZE(a) (sizeof (a) / sizeof ((a)[0])) +#endif + +#define REGULATORY_DB_BIN_NOT_SUPPORT -255 + +#define GET_PAIRING_ID 0 +#define SET_PAIRING_ID 1 + +#define QCSAPI_SCRIPT_LOG "/tmp/run_script.log" +#define QCSAPI_CMD_BUFSIZE 128 +#define QCSAPI_MSG_BUFSIZE 1024 + +#define QCSAPI_SYSTEM_STATUS_FILE "/tmp/qtn_sys_status" + +#define QCSAPI_PRIMARY_WIFI_IFNAME "wifi0" + +#define QCSAPI_CUSTOM_DIR "/etc/custom/" +#define QCSAPI_FILESYSTEM_SP ".." +#define QCSAPI_CUSTOM_VALUE_MAX_LEN 128 + +#define QCSAPI_RESTORE_FG_IP 0x00000001 +#define QCSAPI_RESTORE_FG_NOREBOOT 0x00000002 +#define QCSAPI_RESTORE_FG_AP 0x00000004 +#define QCSAPI_RESTORE_FG_STA 0x00000008 + +#define LOCAL_GET_CONFIG_SCRIPT "/scripts/get_wifi_config" +#define LOCAL_GET_PER_SSID_CONFIG_SCRIPT "/scripts/get_per_ssid_config" +#define LOCAL_UPDATE_PER_SSID_CONFIG_SCRIPT "/scripts/update_per_ssid_config" + +/* 3GPP Cellular Network */ +#define IEEE80211U_MCC_LEN 3 /* MCC - Mobile Country Code */ +#define IEEE80211U_MNC_LEN_MAX 3 /* MNC - Mobile Network Code */ +#define IEEE80211U_MNC_LEN_MIN 2 +#define IEEE80211U_3GPP_CELL_NET_MAX 40 + +#define HS20_MAX_NAI_REALM_LEN 255 +#define HS20_MAX_ROAMING_CONSORTIUM_LEN 30 /* 30 characters or 15 octet hexadecimal */ +#define HS20_MIN_ROAMING_CONSORTIUM_LEN 6 /* 6 characters or 3 octet hexadecimal */ +#define ISO639_LANG_CODE_LEN_MAX 3 +#define IEEE80211U_VENUE_NAME_LEN_MAX 252 +#define HS20_OPER_FRIENDLY_NAME_LEN_MAX 252 +#define QCSAPI_QTM_CFG_INVALID (-1) + +#define QCSAPI_RSSI_OR_SNR_FACTOR 10 +#define QCSAPI_RSSI_OR_SNR_NZERO_CORRECT_VALUE 5 + +/** + * @defgroup APIOverview Overview and conventions + * + * \brief This chapter gives an overview of how the data structures and APIs + * are documented. An example function prototype is shown directly below. + * + * This chapter details the data structures (structs, enums, types etc.) used + * by the QCSAPI, as well as the detailed information on the APIs. + * + * APIs are documented fully with details of what the functional call does, + * the parameters accepted (input/outputs) and the return values. + * + * Each API also has a brief detail of if and how the function can be called + * using the call_qcsapi command line utility. Some APIs are not able + * to be called using call_qcsapi through the nature of the API. + * + * This chapter is divided into the data structure detailed documentation, + * followed by subsections detailing rough functional API areas. + * + * The following section gives an example of how an API call is documented. + */ + +int local_wifi_get_rf_chipid(int *chipid); + +int local_get_parameter(const char *ifname, + const char *param_name, + char *param_value, + const size_t max_param_len, + const char *script_path); +/** + * \ingroup APIOverview + */ +/** @{ */ +/** + * \fn int call_qcsapi_example(const char *ifname, int example_input, + * int *example_output); + * + * \brief A brief description of the function call is provided inline with + * the function listing for each section. + * + * In the Function Documentation section, for each API call, there is a + * detailed definition of the function call, with extra information, side + * effects, pre-requisites etc. This appears in the section which documents + * the individual API call. + * + * After the detailed documentation the list of input/output parameters is + * given. + * + * \param ifname Details of the parameter 'ifname' + * \param example_input Details of the input parameter 'example_input' + * \param example_output Details of the output parameter 'example_output'. + * Output parameters are generally seen as pointers to variables. + * + * After the parameter list, the return values are documented. + * + * \return Details of the return value (generally >= 0 indicates, success, + * < 0 indicates failure). See the section @ref mysection4_1_4 "QCSAPI return values" + * for details of the different return values. + * + * In addition to this, there may be extra documentation and references to + * other function calls. + * + * \note Something noteworthy about the API may be documented in one of these + * blocks. + * + * \warning Something that the reader must read and take into account + * may be documented in one of these blocks. + * + * \callqcsapi + * + * This is where the command line call_qcsapi interface is detailed. + * Input parameters, and expected output will be given. + * + * \note Not all QCSAPI C API calls have equivalent call_qcsapi command + * line calls. + */ + +/* NOTE: present to show up example documentation for QCSAPI doco. */ +extern int call_qcsapi_example(const char *ifname, int example_input, + int *example_output); +/**@}*/ + +/** + * @defgroup DetailedDataTypes Detailed data type and enumeration documentation + * + * \brief This section contains detailed documentation on the data types and enumerations + * used in the QCSAPI. + */ +/** + * \ingroup DetailedDataTypes + */ +/** @{ */ +/** + * \anchor QCSAPI_ERRNO + * + * \brief This enumeration represents the internal QCSAPI error return values that + * may be returned by various QCSAPIs. + * + * This enumeration represents the internal QCSAPI error return values that + * may be returned by various QCSAPIs. Some errors may be returned from many different + * APIs, whereas other errors are for only one API call. + * + * Each error code indicates the area of the QCSAPI the code is relevant to. + * + * To get an error string associated with the error message, use the API call + * qcsapi_errno_get_message. + * + * In addition to the error codes listed in the following sections (which start at + * error number 1000 - qcsapi_errno_base), the following POSIX defined errors + * are used in the QCSAPI: + * + * + * + * + * + * + * + * + * + * + * + * + * + *
ERRNO valueQCSAPI ErrorDescription
-EFAULTQCS API error 14: Bad addressThe QCSAPI found a problem with an argument passed by reference; + * most likely the address was the NULL address.
-EINVALQCS API error 22: Invalid argumentThe QCSAPI found the value of an argument is not valid. Examples are + * numeric value out of range (eg, WiFi channel larger than 255), or a parameter + * value not allowed by the WiFi standard.
-ENODEVQCS API error 19: No such deviceNo such device. An operation was attempted using a device that does not + * exist.
-EOPNOTSUPPQCS API error 95: Operation not supportedOperation not supported. For example, an operation limited to a WiFi device + * such as get 802.11 standard or get beacon type was attempted using an interface + * that is not a WiFi device.
-ERANGEQCS API error 34: Parameter value out of rangeThis error occurs when the API accesses an element in an array using an index + * parameter, and the index is too large or out of range. An example is the per-association + * APIs.
+ * + * \sa qcsapi_errno_get_message + */ +enum qcsapi_errno +{ + qcsapi_errno_base = 1000, + /** + * This error code is returned when attempts are made to apply changes when + * the wireless system is not started. The most typical situation this error + * message is returned is when the Quantenna kernel modules have not been loaded. + * + * Many different QCSAPI function calls attempt to apply changes, and the + * majority of QCSAPI calls dealing with the wireless driver may return this + * value. + * + * call_qcsapi printed error message: + * + * QCS API error 1000: System not started + */ + qcsapi_system_not_started = qcsapi_errno_base, + /** + * This error code is returned when an attempt to read in an unknown parameter + * via the qcsapi_config_get_parameter. + * + * \sa qcsapi_config_get_parameter + * + * call_qcsapi printed error message: + * + * QCS API error 1001: Parameter not found + */ + qcsapi_parameter_not_found = qcsapi_errno_base + 1, + /** + * This error code is returned when an SSID API call is made, but the SSID referred + * to does not exist. + * + * The SSID may not exist due to the config file being missing, or due to the config + * file not containing the passed in SSID. See \ref SSIDAPIs "SSID APIs". + * + * call_qcsapi printed error message: + * + * QCS API error 1002: SSID not found + */ + qcsapi_SSID_not_found = qcsapi_errno_base + 2, + /** + * This error code is returned when a QCSAPI call is attempted on an STA device, but + * the call only applies to the AP. + * + * This return value is used in many different QCSAPIs, across all functional areas. + * + * call_qcsapi printed error message: + * + * QCS API error 1003: Operation only available on an AP + */ + qcsapi_only_on_AP = qcsapi_errno_base + 3, + /** + * This error code is returned when a QCSAPI call is attempted on an AP device, but + * the call only applies to the STA. + * + * This return value is used in many different QCSAPIs, across all functional areas. + * + * call_qcsapi printed error message: + * + * QCS API error 1004: Operation only available on a STA + */ + qcsapi_only_on_STA = qcsapi_errno_base + 4, + /** + * This error code is returned when the action implied by the API conflicts with the + * current configuration. + * + * An example is getting a list of authorized MAC addresses when MAC address filtering + * is not enabled. + * + * call_qcsapi printed error message: + * + * QCS API error 1005: Configuration error + */ + qcsapi_configuration_error = qcsapi_errno_base + 5, + /** + * This error code is returned when a variable length input buffer is too small for + * the QCSAPI result. For example, when retrieving error messages. + * + * call_qcsapi printed error message: + * + * QCS API error 1006: Insufficient space in the string to receive results + */ + qcsapi_buffer_overflow = qcsapi_errno_base + 6, + /** + * This error code is returned when an internal error is detected when parsing config + * files or other data sets. + * + * call_qcsapi printed error message: + * + * QCS API error 1007: Internal formatting error + */ + qcsapi_internal_format_error = qcsapi_errno_base + 7, + /** + * This error code is returned when a system call is made in the code and it fails for + * some reason. + * + * call_qcsapi printed error message: + * + * QCS API error 1008: Internal API programming error + */ + qcsapi_programming_error = qcsapi_errno_base + 8, + /** + * This error code is returned when a QCSAPI call is made that is only supported in + * bringup mode. + * + * See @ref mysection4_1_5 "Production Mode vs Bringup Mode" + * + * call_qcsapi printed error message: + * + * QCS API error 1009: Operation only available in bringup mode + */ + qcsapi_bringup_mode_only = qcsapi_errno_base + 9, + /** + * This error code is returned when a socket connection to the security daemon (opened + * to send a command to the running daemon) fails for whatever reason. + * + * If this error is returned, one or more of the sequence of events in the QCSAPI call + * has failed, and the system may be in an inconsistent state. + * + * call_qcsapi printed error message: + * + * QCS API error 1010: Cannot contact security manager + */ + qcsapi_daemon_socket_error = qcsapi_errno_base + 10, + /** + * This error code is deprecated and not returned by any current API. + */ + qcsapi_conflicting_options = qcsapi_errno_base + 11, + /** + * This error code is returned when the SSID cannot be found (when searching to see if + * an SSID is present). + * + * call_qcsapi printed error message: + * + * QCS API error 1012: Required parameter not found in the SSID configuration block + */ + qcsapi_SSID_parameter_not_found = qcsapi_errno_base + 12, + /** + * This error code is returned when qcsapi_init has not been called prior to invoking + * certain APIs (that require qcsapi_init to be called). + * + * call_qcsapi printed error message: + * + * QCS API error 1013: Initialization API qcsapi_init has not been called + */ + qcsapi_not_initialized = qcsapi_errno_base + 13, + /** + * This error code is returned when the flash upgrade image is not a regular file on + * the filesystem (eg, is a directory or device special file). + * + * call_qcsapi printed error message: + * + * QCS API error 1014: Invalid file type for a flash image update file + */ + qcsapi_invalid_type_image_file = qcsapi_errno_base + 14, + /** + * This error code is returned when the flash upgrade image fails verification checks. + * + * call_qcsapi printed error message: + * + * QCS API error 1015: chkimage utility failed for the flash image update file + */ + qcsapi_image_file_failed_chkimage = qcsapi_errno_base + 15, + /** + * This error code is returned when the flash upgrade partition is not found or is + * invalid. + * + * call_qcsapi printed error message: + * + * QCS API error 1016: flash partition not found + */ + qcsapi_flash_partition_not_found = qcsapi_errno_base + 16, + /** + * This error code is returned when the command to erase the flash partition failed. + * + * call_qcsapi printed error message: + * + * QCS API error 1017: failed to erase the flash memory partition + */ + qcsapi_erase_flash_failed = qcsapi_errno_base + 17, + /** + * This error code is returned when the copy of the flash image into the flag part + * failed. + * + * call_qcsapi printed error message: + * + * QCS API error 1018: failed to copy the new image to the flash memory partition + */ + qcsapi_copy_image_flash_failed = qcsapi_errno_base + 18, + /** + * This error code is returned when a call is made into an API where the operational + * state of the system is not known. This is an internal error, and should never be + * seen in ordinary circumstances. + * + * call_qcsapi printed error message: + * + * QCS API error 1019: invalid WiFi mode + */ + qcsapi_invalid_wifi_mode = qcsapi_errno_base + 19, + /** + * This error code is returned when the call to qcsapi_console_disconnect fails due + * to not enough system resources. + * + * call_qcsapi printed error message: + * QCS API error 1020: Process table is full + */ + qcsapi_process_table_full = qcsapi_errno_base + 20, + /** + * This error code is deprecated and not returned by any current API. + */ + qcsapi_measurement_not_available = qcsapi_errno_base + 21, + /** + * This error code is returned when trying to create a new BSS, but the maximum number of + * BSSes are already created. + * + * call_qcsapi printed error message: + * + * QCS API error 1022: Maximum number of BSSIDs / VAPs exceeded + */ + qcsapi_too_many_bssids = qcsapi_errno_base + 22, + /** + * This error code is returned when an operation is attempted on a non-primary interface + * (wifi0). This can happen for certain security settings and when performing WDS functions. + * + * call_qcsapi printed error message: + * + * QCS API error 1023: Operation only available on the primary WiFi interface + */ + qcsapi_only_on_primary_interface = qcsapi_errno_base + 23, + /** + * This error code is returned when trying to create a new WDS link, but the maximum + * number of WDS links are already created. + * + * call_qcsapi printed error message: + * + * QCS API error 1024: Maximum number of WDS links exceeded + */ + qcsapi_too_many_wds_links = qcsapi_errno_base + 24, + /** + * This error code is returned when an attempt to update a config file (persistent file) + * fails. + * + * call_qcsapi printed error message: + * + * QCS API error 1025: Failed to update persistent configuration + */ + qcsapi_config_update_failed = qcsapi_errno_base + 25, + /** + * This error code is returned when the /proc/net/dev or /proc/net/packets device files + * are not present on the filesystem. + * + * call_qcsapi printed error message: + * + * QCS API error 1026: Cannot access network counters + */ + qcsapi_no_network_counters = qcsapi_errno_base + 26, + /** + * This error code is returned when the PM interval passed in is invalid. + * That is, it is not one of the supported interval device files. + * + * call_qcsapi printed error message: + * + * QCS API error 1027: Invalid performance monitoring interval + */ + qcsapi_invalid_pm_interval = qcsapi_errno_base + 27, + /** + * This error code is returned when an operation relevant only to WDS mode is attempted on + * a non-WDS operational mode device. + * + * call_qcsapi printed error message: + * + * QCS API error 1028: Operation only available on a WDS device + */ + qcsapi_only_on_wds = qcsapi_errno_base + 28, + /** + * This error code is returned when an multicast or broadcast MAC + * is used where only unicast MAC is allowed. + * + * call_qcsapi printed error message: + * + * QCS API error 1029: Only unicast MAC address is allowed + */ + qcsapi_only_unicast_mac = qcsapi_errno_base + 29, + /** + * This error code is returned when performing an invalid operation. + * + * call_qcsapi printed error message: + * + * QCS API error 1030: Operation is not available on the primary interface + */ + qcsapi_primary_iface_forbidden = qcsapi_errno_base + 30, + /** + * This error code is returned when a BSS is created, but the interface name is incorrect.The BSS prefix name must be the string 'wifi'. + * + * call_qcsapi printed error message: + * + * QCS API error 1031: Invalid BSS name + */ + qcsapi_invalid_ifname = qcsapi_errno_base + 31, + /** + * This error code is returned when an error happens on interface. + * + * call_qcsapi printed error message: + * + * QCS API error 1032: An error happened on interface + */ + qcsapi_iface_error = qcsapi_errno_base + 32, + /** + * This error code is returned when a semaphore takes too long to initialize. + * + * call_qcsapi printed error message: + * + * QCS API error 1033: Semaphore initialization error + */ + qcsapi_sem_error = qcsapi_errno_base + 33, + /** + * This error code is returned when a command is issued for a feature that is not + * supported in this image. + * + * call_qcsapi printed error message: + * + * QCS API error 1034: Feature is not supported + */ + qcsapi_not_supported = qcsapi_errno_base + 34, + /** + * This error code is returned when a channel as input is not a dfs channel + * + * call_qcsapi printed error message: + * + * QCS API error 1035: API requires a dfs channel + */ + qcsapi_invalid_dfs_channel = qcsapi_errno_base + 35, + /** + * This error code is returned when a file can not be found. + * + * call_qcsapi printed error message: + * + * QCS API error 1036: Script failed + */ + qcsapi_script_error = qcsapi_errno_base + 36, + /** + * This error code is returned when set mac address of wds peer is local address. + * + * call_qcsapi printed error message: + * + * QCS API error 1037: Local Mac address can't be used as wds peer address + */ + qcsapi_invalid_wds_peer_addr = qcsapi_errno_base + 37, + /** + * This error code is returned when band is not supported. + * + * call_qcsapi printed error message: + * + * QCS API error 1038: Band is not supported + */ + qcsapi_band_not_supported = qcsapi_errno_base + 38, + /** + * This error code is returned when region is not supported. + * + * call_qcsapi printed error message: + * + * QCS API error 1039: Region is not supported + */ + qcsapi_region_not_supported = qcsapi_errno_base + 39, + /** + * This error code is returned when region database is not found. + * + * call_qcsapi printed error message: + * + * QCS API error 1040: Region database is not found + */ + qcsapi_region_database_not_found = qcsapi_errno_base + 40, + /** + * This error code is returned when a parameter name is not supported + * by wireless_conf.txt. + * + * call_qcsapi printed error message: + * + * QCS API error 1041: Parameter name is not supported + */ + qcsapi_param_name_not_supported = qcsapi_errno_base + 41, + /** + * This error code is returned when parameter value is invalid + * in wireless_conf.txt. + * + * call_qcsapi printed error message: + * + * QCS API error 1042: Parameter value is invalid + */ + qcsapi_param_value_invalid = qcsapi_errno_base + 42, + /** + * This error code is returned when an input MAC address is invalid + * + * call_qcsapi printed error message: + * + * QCS API error 1043: Invalid MAC address + */ + qcsapi_invalid_mac_addr = qcsapi_errno_base + 43, + /** + * This error code is returned when an option is not supported. + * + * call_qcsapi printed error message: + * + * + */ + qcsapi_option_not_supported = qcsapi_errno_base + 44, + /** + * This error code is returned when a wps overlap detected + * + * call_qcsapi printed error message: + * + * + */ + qcsapi_wps_overlap_detected = qcsapi_errno_base + 45, + /** + * This error code is returned when a statistics module is not supported + * + * call_qcsapi printed error message: + * + * + */ + qcsapi_mlme_stats_not_supported = qcsapi_errno_base + 46, + /** + * This error code is returned when a board parameter requested for is not supported. + * + * call_qcsapi printed error message: + * + * + */ + qcsapi_board_parameter_not_supported = qcsapi_errno_base + 47, + /* + * This error code is returned when a WDS peer cannot be added + * because the peer is currently associated as a station. + * + * call_qcsapi printed error message: + * + * QCS API error 1048: WDS peer is associated + */ + qcsapi_peer_in_assoc_table = qcsapi_errno_base + 48, + /* + * This error code is returned when an operation is attempted on a mac address + * that is not in the association table, for example, because the station has + * disassociated. + * + * call_qcsapi printed error message: + * + * QCS API error 1049: MAC address is not in association list + */ + qcsapi_mac_not_in_assoc_list = qcsapi_errno_base + 49, + /* + * This error code is returned when a parameter is specified too many times + * + * call_qcsapi printed error message: + * + * QCS API error 1050: param exceeds the limit + */ + qcsapi_param_count_exceeded = qcsapi_errno_base + 50, + /* + * This error code is returned when attempting to add a parameter + * that is already defined + * call_qcsapi printed error message: + * + * QCS API error 1049: duplicate param found + */ + qcsapi_duplicate_param = qcsapi_errno_base + 51, + /** + * This error code is returned when a QCSAPI call is attempted on an interface, but + * the call is not permitted. + * + * This return value is used in many different QCSAPIs, across all functional areas. + * + * call_qcsapi printed error message: + * + * QCS API error 1052: Operation is not supported on this interface + */ + qcsapi_iface_invalid = qcsapi_errno_base + 52, +}; + +/* + * GPIO / LED PIN numbers + * + * LEDs are a subset of GPIO PINs + */ + +/** + * \brief This enumeration represents an abstract LED value. + * + * This enumeration represents an abstract LED value. + */ +enum qcsapi_led +{ + qcsapi_AGPIO1_LED = 1, + qcsapi_AGPIO2_LED = 2, + qcsapi_AGPIO3_LED = 3, + qcsapi_AGPIO4_LED = 4, + qcsapi_AGPIO5_LED = 5, + qcsapi_AGPIO7_LED = 7, + qcsapi_AGPIO11_LED = 11, + qcsapi_AGPIO12_LED = 12, + qcsapi_AGPIO27_LED = 27, + qcsapi_nosuch_GPIO = 255, + + QCSAPI_MAX_LED = 31 +}; + +/** + * \brief This enumeration represents a set of security and authentication + * modes. + * + * This enumeration represents a set of security and authentication modes. + * + * The security mode consists of an authentication method (eg, WPA, WPA2, + * EAP, etc.) and an encryption method (eg, WEP, TKIP, CCMP). These are + * represented in this enumeration. + * + * See @ref APSTADualFunctions "Authentication protocols and encrypyion" for + * details of the difference between authentication and encryption. + */ +enum qcsapi_auth_crypto +{ + /** + * This value represents WPA v1 authentication mode. + */ + qcsapi_protocol_WPA_mask = 1, + /** + * This value represents WPA v2 authentication mode. + */ + qcsapi_protocol_11i_mask = 2, + + /** + * This value represents preshared key authentication. + */ + qcsapi_ap_PSK_authentication = 1, + /** + * This value represents EAP authentication. + */ + qcsapi_ap_EAP_authentication = 2, + + /** + * Thie value represents use of the TKIP cipher for encryption. + */ + qcsapi_ap_TKIP_encryption_mask = 0x01, + /** + * Thie value represents use of the CCMP cipher for encryption. + */ + qcsapi_ap_CCMP_encryption_mask = 0x02, + + /** + * This value represents security is enabled on the interface. + */ + qcsapi_ap_security_enabled = 0x01, +}; + +/** + * \brief This enumeration is used to represent GPIO state. + * + * This enumeration is used to represent GPIO state. + */ +typedef enum +{ + /** + * This value indicates that the GPIO isn't available for some reason. + */ + qcsapi_gpio_not_available = 0, + /** + * Thie value indicates that the GPIO is set to input only mode. + */ + qcsapi_gpio_input_only, + /** + * Thie value indicates that the GPIO is set to output only. + */ + qcsapi_gpio_output, + /** + * This is the invalid value - representing that a GPIO is not present + * on the platform. + */ + qcsapi_nosuch_gpio_config = -1 +} qcsapi_gpio_config; + +/** + * \brief This enumeration is used to abstract configuration file paths. + * + * This enumeration is used to abstract configuration file paths. + */ +typedef enum +{ + /** + * This value is used to represent the security config file path. + */ + qcsapi_security_configuration_path = 0, + /** + * Placeholder - invalid value. + */ + qcsapi_nosuch_file_path = -1 +} qcsapi_file_path_config; + +/** + * \brief This enumeration represents the operational mode of the device. + * + * This enumeration represents the operational mode of the device. + */ +typedef enum { + /** + * This value is a valid, and indicates that programs have not configured the + * WiFi mode. + */ + qcsapi_mode_not_defined = 1, + /** + * The device is operating as an AP. + */ + qcsapi_access_point, + /** + * The device is operating as a STA. + */ + qcsapi_station, + /** + * The device is operating in WDS mode - wireless distribution mode, or bridged + * mode. + */ + qcsapi_wds, + /** + * The device is operating in repeater mode - primary interface works as a STA + * other interfaces work as AP + */ + qcsapi_repeater, + /** + * Invalid mode. Placeholder. + */ + qcsapi_nosuch_mode = 0 +} qcsapi_wifi_mode; + +/** + * \brief Enumeration to represent rate sets. + * + * Enumeration to represent different rate sets as used in the system. + */ +typedef enum { + /** + * The set of basic rates which must be supported by all clients. + */ + qcsapi_basic_rates = 1, + /** + * The set of actual rates in use. + */ + qcsapi_operational_rates, + /** + * The set of all supported rates on the device. + */ + qcsapi_possible_rates, + /** + * Placeholder - invalid. + */ + qcsapi_nosuch_rate = 0 +} qcsapi_rate_type; + +/** + * \brief Enumeration to represent 802.11 standards + */ +typedef enum { + /** + * 11n + */ + qcsapi_mimo_ht = 1, + /** + * 11ac + */ + qcsapi_mimo_vht, + /** + * Placeholder - invalid. + */ + qcsapi_nosuch_standard = 0 +} qcsapi_mimo_type; + +/** + * \brief Enumeration used to represent different interface counters. + * + * \sa qcsapi_interface_get_counter + * \sa qcsapi_interface_get_counter64 + * \sa qcsapi_pm_get_counter + * \sa qcsapi_wifi_get_node_counter + */ +typedef enum { + qcsapi_nosuch_counter = 0, + QCSAPI_NOSUCH_COUNTER = qcsapi_nosuch_counter, + qcsapi_total_bytes_sent = 1, + QCSAPI_TOTAL_BYTES_SENT = qcsapi_total_bytes_sent, + qcsapi_total_bytes_received, + QCSAPI_TOTAL_BYTES_RECEIVED = qcsapi_total_bytes_received, + qcsapi_total_packets_sent, + QCSAPI_TOTAL_PACKETS_SENT = qcsapi_total_packets_sent, + qcsapi_total_packets_received, + QCSAPI_TOTAL_PACKETS_RECEIVED = qcsapi_total_packets_received, + qcsapi_discard_packets_sent, + QCSAPI_DISCARD_PACKETS_SENT = qcsapi_discard_packets_sent, + qcsapi_discard_packets_received, + QCSAPI_DISCARD_PACKETS_RECEIVED = qcsapi_discard_packets_received, + qcsapi_error_packets_sent, + QCSAPI_ERROR_PACKETS_SENT = qcsapi_error_packets_sent, + qcsapi_error_packets_received, + QCSAPI_ERROR_PACKETS_RECEIVED = qcsapi_error_packets_received, + qcsapi_fragment_frames_received, + QCSAPI_FRAGMENT_FRAMES_RECEIVED = qcsapi_fragment_frames_received, + qcsapi_vlan_frames_received, + QCSAPI_VLAN_FRAMES_RECEIVED = qcsapi_vlan_frames_received, +} qcsapi_counter_type; + +/** + * \brief Enumeration for parameters as read in via qcsapi_wifi_get_node_param. + * + * \sa qcsapi_wifi_get_node_param + */ +typedef enum { + QCSAPI_NO_SUCH_PER_ASSOC_PARAM = 0, + QCSAPI_LINK_QUALITY = 1, + QCSAPI_RSSI_DBM, + QCSAPI_BANDWIDTH, + QCSAPI_SNR, + QCSAPI_TX_PHY_RATE, + QCSAPI_RX_PHY_RATE, + QCSAPI_STAD_CCA, + QCSAPI_HW_NOISE, + QCSAPI_STA_IP, + QCSAPI_RSSI, + QCSAPI_PHY_NOISE, + QCSAPI_SOC_MAC_ADDR, + QCSAPI_SOC_IP_ADDR, + QCSAPI_NODE_MEAS_BASIC, + QCSAPI_NODE_MEAS_CCA, + QCSAPI_NODE_MEAS_RPI, + QCSAPI_NODE_MEAS_CHAN_LOAD, + QCSAPI_NODE_MEAS_NOISE_HIS, + QCSAPI_NODE_MEAS_BEACON, + QCSAPI_NODE_MEAS_FRAME, + QCSAPI_NODE_MEAS_TRAN_STREAM_CAT, + QCSAPI_NODE_MEAS_MULTICAST_DIAG, + QCSAPI_NODE_TPC_REP, + QCSAPI_NODE_LINK_MEASURE, + QCSAPI_NODE_NEIGHBOR_REP, +} qcsapi_per_assoc_param; + +#define QCSAPI_LOCAL_NODE 0 +#define QCSAPI_REMOTE_NODE 1 + +/* This enum lists booleans (yes / no ) */ + +#define QCSAPI_TRUE 1 +#define QCSAPI_FALSE 0 + +/** + * \brief Enumeration used in the option set/get API. + * + * \sa qcsapi_wifi_get_option + * \sa qcsapi_wifi_set_option + */ +typedef enum { + qcsapi_channel_refresh = 1, /* 2.4 GHz only */ + qcsapi_DFS, /* 5 GHz only */ + qcsapi_wmm, /* wireless multimedia extensions */ + qcsapi_mac_address_control, + qcsapi_beacon_advertise, + qcsapi_wifi_radio, + qcsapi_autorate_fallback, + qcsapi_security, + qcsapi_SSID_broadcast, + qcsapi_802_11d, + qcsapi_wireless_isolation, + qcsapi_short_GI, + qcsapi_802_11h, + qcsapi_dfs_fast_channel_switch, + qcsapi_dfs_avoid_dfs_scan, + qcsapi_uapsd, + qcsapi_tpc_query, + qcsapi_sta_dfs, + qcsapi_specific_scan, + qcsapi_GI_probing, + qcsapi_GI_fixed, + qcsapi_stbc, + qcsapi_beamforming, + qcsapi_nosuch_option = 0 +} qcsapi_option_type; + +/** + * \brief Enumeration used in the board parameter get API. + * + * \sa qcsapi_get_board_parameter + */ +typedef enum { + qcsapi_hw_revision = 1, + qcsapi_hw_id, + qcsapi_hw_desc, + qcsapi_rf_chipid, + qcsapi_bond_opt, + qcsapi_vht, + qcsapi_bandwidth, + qcsapi_spatial_stream, + qcsapi_interface_types, + qcsapi_nosuch_parameter = 0 +} qcsapi_board_parameter_type; + +/** + * \brief Enumeration used to find the service index + * + * \sa qcsapi_service_name + */ +typedef enum { + QCSAPI_SERVICE_MAUI = 0, + QCSAPI_SERVICE_TELNET = 1, + QCSAPI_SERVICE_DHCP_CLIENT = 2, + QCSAPI_SERVICE_HTTPD = 3, + QCSAPI_SERVICE_MONITOR_TEMPERATURE = 4, + QCSAPI_NOSUCH_SERVICE = -1, +} qcsapi_service_name; + +/** + * \brief Enumeration used to map start_index in /etc/init.d/ + * + * \sa qcsapi_service_start_index + */ +typedef enum { + qcsapi_service_maui_start_index = 90, + qcsapi_service_inetd_start_index = 42, + qcsapi_service_dhclient_start_index = 91, + qcsapi_service_httpd_start_index = 92, + qcsapi_service_monitor_temp_start_index = 70, + qcsapi_service_no_such_index = -1, +} qcsapi_service_start_index; + +/** + * \brief Enumeration used to find the service action + * + * \sa qcsapi_service_action + */ +typedef enum { + QCSAPI_SERVICE_START = 0, + QCSAPI_SERVICE_STOP = 1, + QCSAPI_SERVICE_ENABLE = 2, + QCSAPI_SERVICE_DISABLE = 3, + QCSAPI_NOSUCH_ACTION = -1, +} qcsapi_service_action; + +/** + * Maximum number of bandwidths + 1 + */ +#define MAX_NUM_OF_BANDWIDTHS 5 + +/** + * \brief This enumeration represents the bandwidth in use on the device. + * + * This enumeration represents the bandwidth in use on the device. + */ +typedef enum +{ + /** + * The device is operating in 20MHz mode. + */ + qcsapi_bw_20MHz = 20, + /** + * The device is operating in 40MHz mode. + */ + qcsapi_bw_40MHz = 40, + /** + * The device is operating in 80MHz mode. + */ + qcsapi_bw_80MHz = 80, + /** + * The device is operating in 160MHz mode. + */ + qcsapi_bw_160MHz = 160, + /** + * Placeholder - unknown bandwidth (indicates error). + */ + + /** + * Placeholder - unknown bandwidth (indicates error). + */ + qcsapi_nosuch_bw +} qcsapi_bw; + + +#define QCSAPI_POWER_TOTAL 8 /* the total power indices in a channel power table */ + +/** + * \brief This enumeration represents the indices for different spatial streams (1-4) and BF cases (on/off). + * + * This enumeration represents the indices for different spatial streams (1-4) and BF cases (on/off). + * + * \sa qcsapi_wifi_get_chan_power_table + * \sa qcsapi_wifi_set_chan_power_table + * + */ +typedef enum +{ + /** + * The power index for beamforming off and 1 spatial stream. + */ + QCSAPI_POWER_INDEX_BFOFF_1SS = 0, + /** + * The power index for beamforming off and 2 spatial streams. + */ + QCSAPI_POWER_INDEX_BFOFF_2SS, + /** + * The power index for beamforming off and 3 spatial streams. + */ + QCSAPI_POWER_INDEX_BFOFF_3SS, + /** + * The power index for beamforming off and 4 spatial streams. + */ + QCSAPI_POWER_INDEX_BFOFF_4SS, + /** + * The power index for beamforming on and 1 spatial stream. + */ + QCSAPI_POWER_INDEX_BFON_1SS, + /** + * The power index for beamforming on and 2 spatial streams. + */ + QCSAPI_POWER_INDEX_BFON_2SS, + /** + * The power index for beamforming on and 3 spatial streams. + */ + QCSAPI_POWER_INDEX_BFON_3SS, + /** + * The power index for beamforming on and 4 spatial streams. + */ + QCSAPI_POWER_INDEX_BFON_4SS, +} qcsapi_power_indices; + +/** + * \brief This enumeration represents the 802.11w / PMF capability of the VAP. + * + * This enumeration represents the 802.11w / PMF capability of the VAP. + */ +typedef enum +{ + /** + * The PMF capability is disbled. + */ + qcsapi_pmf_disabled = 0, + /** + * The PMF capability is optional. + */ + qcsapi_pmf_optional = 1, + /** + * The PMF capability is required. + */ + qcsapi_pmf_required = 2 + +} qcsapi_pmf; + +/** + * \brief This enumeration represents the mode in use on the device. + * + * This enumeration represents the bandwidth in use on the device. + * + * This enumeration is used to set the correct bandwidth. + */ + +typedef enum +{ + qcsapi_11nac_disable = 0, + qcsapi_11nac_enable = 1 +}qcsapi_11nac_stat; + +/** + * \brief This enumeration represents the state of the MAC address filtering. + * + * This enumeration represents the state of the MAC address filtering. + * + * MAC address filtering can be inclusive, exclusive or disabled. + */ +typedef enum +{ + /** + * MAC address filtering is fully disabled. + */ + qcsapi_disable_mac_address_filtering = 0, + /** + * MAC address inclusive filtering - allow all packets unless explicitly + * denied in the filter list. + */ + qcsapi_accept_mac_address_unless_denied, + /** + * MAC address exclusive filtering - deny all packets unless explicitly + * allowed in the filter list. + */ + qcsapi_deny_mac_address_unless_authorized, + /** + * Placeholder - indicates an error. + */ + qcsapi_nosuch_mac_address_filtering = -1 +} qcsapi_mac_address_filtering; + +/** + * \brief Enumeration to represent AP isolation status. + * + */ +typedef enum +{ + /** + * AP isolation is disabled. + * Frames between associated stations in the BSS are passed. + */ + qcsapi_ap_isolate_disabled = 0, + /** + * AP isolation is enabled. + * Frames between associated stations in the BSS are blocked. + */ + qcsapi_ap_isolate_enabled = 1, + /** + * Placeholder - unused. + */ + qcsapi_ap_isolation_end +} qcsapi_ap_isolate_type; + +/** + * \brief This enumeration represents the partitions supported for firmware upgrade. + * + * This enumeration represents the partitions supported for firmware upgrade. + * + * The two partitions used for firmware are the live and safety images. Ideally, the + * safety image is never touched, and is always present to allow the system to recover + * to a known good (factory) setting. + */ +typedef enum +{ + /** + * This represents the live image partition - the partition that should be + * upgraded. + */ + qcsapi_live_image = 0, + /** + * This represents the safety image partition - this should not be touched. + */ + qcsapi_safety_image, + /** + * Placeholder - indicates an error. + */ + qcsapi_nosuch_partition = -1 +} qcsapi_flash_partiton_type; + +/** + * \brief Enumeration to represent WPS parameters as used by the qcsapi_wps_get_param API. + * + * \sa qcsapi_wps_get_param + */ +typedef enum +{ + /** + * The WPS device UUID. + */ + qcsapi_wps_uuid = 0, + /** + * The OS version the WPS device is running. + */ + qcsapi_wps_os_version, + /** + * The device name of the WPS device. + */ + qcsapi_wps_device_name, + /** + * The supported configuration methods (eg, PBC, PIN) of the WPS device. + */ + qcsapi_wps_config_methods, + /** + * Whether the AP setup is locked or able to be reconfigured by an external + * registrar. + */ + qcsapi_wps_ap_setup_locked, + /** + * wps vendor for specific action in WPS process + */ + qcsapi_wps_vendor_spec, + /** + * The label pin of the ap which is configured in the hostapd.conf + */ + qcsapi_wps_ap_pin, + /** + * flag to force broadcast uuid + */ + qcsapi_wps_force_broadcast_uuid, + /** + * decide the action after ap pin failure occur + */ + qcsapi_wps_ap_pin_fail_method, + /** + * max retry count of ap pin fail in auto_lockdown mode + */ + qcsapi_wps_auto_lockdown_max_retry, + /** + * last successful WPS client + */ + qcsapi_wps_last_successful_client, + /** + * last successful WPS client device name + */ + qcsapi_wps_last_successful_client_devname, + /** + * current ap pin fail number + */ + qcsapi_wps_auto_lockdown_fail_num, + /** + * current wps serial number + */ + qcsapi_wps_serial_number, + /** + * current wps manufacturer name + */ + qcsapi_wps_manufacturer, + /** + * current wps model name + */ + qcsapi_wps_model_name, + /** + * current wps model number + */ + qcsapi_wps_model_number, + /** + * current wps "pbc in m1" setting (0 or 1) + */ + qcsapi_wps_pbc_in_m1, + /** + * Last configuration error of WPS registrar + */ + qcsapi_wps_last_config_error, + /** + * Number of entries for WPS registrar + */ + qcsapi_wps_registrar_number, + /** + * Number of estabalished WPS registrar + */ + qcsapi_wps_registrar_established, + /** + * Placeholder - unused. + */ + qcsapi_wps_param_end +} qcsapi_wps_param_type; + +/** + * \brief Enumeration to represent VLAN configuration command as used by the qcsapi_wifi_vlan_config API. + * + * \sa qcsapi_wifi_vlan_config + */ +typedef enum { + /** + * Command to bind VLAN to a wireless interface. + */ + e_qcsapi_vlan_bind, + /** + * Command to unbind VLAN from a wireless interface. + */ + e_qcsapi_vlan_unbind, + /** + * Enable passthrough for packets with a specified VLAN tag. + */ + e_qcsapi_vlan_passthru, + /** + * Disable passthrough for packets with a specified VLAN tag. + */ + e_qcsapi_vlan_unpassthru, + /** + * Enable 802.1X dynamic VLAN + */ + e_qcsapi_vlan_dynamic, + /** + * Disable 802.1X dynamic VLAN + */ + e_qcsapi_vlan_undynamic, + /** + * Enable VLAN functionality + */ + e_qcsapi_vlan_enable, + /** + * Disable VLAN functionality + */ + e_qcsapi_vlan_disable +} qcsapi_vlan_cmd; + +/** + * \anchor QCSAPI_GET_SYSTEM_STATUS + * \brief Bit number to represent system status value + * + * \sa qcsapi_get_system_status + */ +typedef enum { + /** + * 1 means ethernet interface is up. + * 0 means ethernet interface is down. + */ + qcsapi_sys_status_ethernet = 0, + /** + * 1 means pcie module for EP is loaded correctly. + * 0 means pcie module for EP is failed to load. + */ + qcsapi_sys_status_pcie_ep = 1, + /** + * 1 means pcie module for RC is loaded correctly. + * 0 means pcie module for RC is failed to load. + */ + qcsapi_sys_status_pcie_rc = 2, + /** + * 1 means wifi module is loaded correctly. + * 0 means wifi module is failed to load. + */ + qcsapi_sys_status_wifi = 3, + /** + * 1 means Rpcd is ready. + * 0 Rpcd is failed to start. + */ + qcsapi_sys_status_rpcd = 4, + /** + * 1 means device works in calstate=3 mode. + * 0 means device works in calstate=0 mode. + */ + qcsapi_sys_status_cal_mode = 30, + /** + * 1 means system boot up completely. + * This bit DOES NOT means system can work correctly. + * It only indicates that system gets into a stage. + */ + qcsapi_sys_status_completed = 31, +} qcsapi_system_status; + +/** + * \brief Enumeration to represent ehternet DSCP operation command + * as used by the qcsapi_eth_dscp_map API. + * + * \sa qcsapi_eth_dscp_map + */ +typedef enum { + /** + * Setting DSCP Priority for all levels in EMAC + */ + qcsapi_eth_dscp_fill = 1, + + /** + * Setting DSCP Priority for particulat levels in EMAC + */ + qcsapi_eth_dscp_poke = 2, + + /** + * Getting DSCP Priority for all levels in EMAC + */ + qcsapi_eth_dscp_dump = 3, + +} qcsapi_eth_dscp_oper; + +/** + * \brief Enumeration to represent EMAC switch connectivity + * + * \sa qcsapi_set_emac_switch + */ +typedef enum { + /** + * switch functionality is enabled + */ + qcsapi_emac_switch_enable = 0, + + /** + * switch functionality is disabled + */ + qcsapi_emac_switch_disable = 1, + +} qcsapi_emac_switch; + +/** + * Basic signed int array definition for internal consistency. + */ +typedef int qcsapi_int_a32[32]; +/** + * Basic unsigned int definition for internal consistency. + */ +typedef uint32_t qcsapi_unsigned_int; +/** + * Basic unsigned 64-bit int definition for internal consistency. + */ +typedef uint64_t qcsapi_unsigned_int64; + +#define MACFILTERINGMACFMT "%02x:%02x:%02x:%02x:%02x:%02x" +#define MAC_ADDR_SIZE ETHER_ADDR_LEN +#define MAC_ADDR_STRING_LENGTH 18 + +/** + * \brief Convenience definition to represent a 6 byte MAC address. + * + * Convenience definition to represent a 6 byte MAC address. + * + * \note This type should not be considered a string as embedded NULL bytes + * are allowed as part of a MAC address. + */ +typedef uint8_t qcsapi_mac_addr[ MAC_ADDR_SIZE ]; + +#define QCSAPI_SSID_MAXLEN (IW_ESSID_MAX_SIZE + 1) +#define QCSAPI_SSID_MAXNUM 32 +#define QCSAPI_STATUS_MAXLEN 12 +#define QCSAPI_SSID_MAX_RECORDS (6) + +/** + * \brief Convenience definition to represent a 64 byte array. + * + * Convenience definition to represent a 64 byte array. + * + * \note This type should not be considered a string as embedded NULL bytes + * are allowed as part of a 64 byte array. + */ +struct qcsapi_data_64bytes { + uint8_t data[64]; +}; + +/** + * \brief Convenience definition to represent a 128 unsigned byte array. + * + * Convenience definition to represent a 128 byte array. + * + * \note This type should not be considered a string as embedded NULL bytes + * are allowed as part of a 128 byte array. + */ +struct qcsapi_data_128bytes { + uint8_t data[128]; +}; + +/** + * \brief Convenience definition to represent a 256 unsigned byte array. + * + * Convenience definition to represent a 256 byte array. + * + * \note This type should not be considered a string as embedded NULL bytes + * are allowed as part of a 256 byte array. + */ +struct qcsapi_data_256bytes { + uint8_t data[256]; +}; + +/** + * \brief Convenience definition to represent a 512 unsigned byte array. + * + * Convenience definition to represent a 512 byte array. + * + * \note This type should not be considered a string as embedded NULL bytes + * are allowed as part of a 512 byte array. + */ +struct qcsapi_data_512bytes { + uint8_t data[512]; +}; + +/** + * \brief Convenience definition to represent a 1024 unsigned byte array. + * + * Convenience definition to represent a 1024 byte array. + * + * \note This type should not be considered a string as embedded NULL bytes + * are allowed as part of a 1024 byte array. + */ +struct qcsapi_data_1Kbytes { + uint8_t data[1024]; +}; + +/** + * \brief Convenience definition to represent a 2048 unsigned byte array. + * + * Convenience definition to represent a 2048 byte array. + * + * \note This type should not be considered a string as embedded NULL bytes + * are allowed as part of a 2048 byte array. + */ +struct qcsapi_data_2Kbytes { + uint8_t data[2048]; +}; + +/** + * \brief Convenience definition to represent a 3072 unsigned byte array. + * + * Convenience definition to represent a 3072 byte array. + * + * \note This type should not be considered a string as embedded NULL bytes + * are allowed as part of a 3072 byte array. + */ +struct qcsapi_data_3Kbytes { + uint8_t data[3072]; +}; + +/** + * \brief Convenience definition to represent a 4096 unsigned byte array. + * + * Convenience definition to represent a 4096 byte array. + * + * \note This type should not be considered a string as embedded NULL bytes + * are allowed as part of a 4096 byte array. + */ +struct qcsapi_data_4Kbytes { + uint8_t data[4096]; +}; + +/** + * \anchor SSID_RULES + * \brief Convenience definition for a string large enough for a single SSID. + * + * Convenience definition for a string large enough for a single SSID. + * + * This typedef has enough room for a single SSID plus the NULL terminating + * character. + * + * The content within the SSID must be a string with between 1 and 32 characters. + * Control characters (^C, ^M, etc.) are not permitted in API calls using this type. + */ +typedef char qcsapi_SSID[ QCSAPI_SSID_MAXLEN ]; + +#define QCSAPI_MCS_RATE_MAXLEN 8 + + +/** + * \brief Type used to contain an MCS definition. + * + * QCSAPI MCS rate maximum length is distinct from MaxBitRate in TR-98. + * TR-98 provides for 4 characters to represent the bit rate in MBPS. + * QCSAPI MCS rate stores MCS rate specs - e.g. MCS0, MCS6, MCS76, etc. + * Provide a bit more space for future expansion. + * As with all QCSAPI maximum length definitions, space for the NUL ('\\0') is included. + * So only QCSAPI_MCS_RATE_MAXLEN - 1 (7) non-NUL chars are available. + */ +typedef char qcsapi_mcs_rate[ QCSAPI_MCS_RATE_MAXLEN ]; + +/* + * Leave extra char in these string-with-maximum-length data types for NUL termination. + * The standard suggests that a string(64) can hold upto 64 non-NUL chars + * + * Also, the standard includes string(63); this is represented as string_64, + * with the corresponding QCSAPI enforcing the limit of 63 chars. + * + * Finally, all QCSAPIs that work with strings of defined maximum length are + * required to enforce string length limits, and cannot rely on the special + * string-with-maximum-length data type to enforce the corresponding limit. + */ + +/** + * \brief Convenience definition for a string of size 16. + * + * Convenience definition for a string of size 16. + * + * This type can contain a string of maximum size 16 bytes, plus the + * NULL terminating character. + */ +typedef char string_16[ 17 ]; +/** + * \brief Convenience definition for a string of size 32. + * + * Convenience definition for a string of size 32. + * + * This type can contain a string of maximum size 32 bytes, plus the + * NULL terminating character. + */ +typedef char string_32[ 33 ]; +/** + * \brief Convenience definition for a string of size 64. + * + * Convenience definition for a string of size 64. + * + * This type can contain a string of maximum size 64 bytes, plus the + * NULL terminating character. + */ +typedef char string_64[ 65 ]; +/** + * \brief Convenience definition for a string of size 128. + * + * Convenience definition for a string of size 128. + * + * This type can contain a string of maximum size 128 bytes, plus the + * NULL terminating character. + */ +typedef char string_128[ 129 ]; +/** + * \brief Convenience definition for a string of size 256. + * + * Convenience definition for a string of size 256. + * + * This type can contain a string of maximum size 256 bytes, plus the + * NULL terminating character. + */ +typedef char string_256[ 257 ]; +/** + * \brief Convenience definition for a string of size 512. + * + * Convenience definition for a string of size 512. + * + * This type can contain a string of maximum size 512 bytes, plus the + * NULL terminating character. + */ +typedef char string_512[ 513 ]; +/** + * \brief Convenience definition for a string of size 1024. + * + * Convenience definition for a string of size 1024. + * + * This type can contain a string of maximum size 1024 bytes, plus the + * NULL terminating character. + */ +typedef char string_1024[ 1025 ]; + +typedef char string_4096[ 4097 ]; + +#define IEEE80211_PROTO_11B 0x00000001 +#define IEEE80211_PROTO_11G 0x00000002 +#define IEEE80211_PROTO_11A 0x00000004 +#define IEEE80211_PROTO_11N 0x00000008 +#define IEEE80211_PROTO_11AC 0x00000010 + +#define IEEE80211_WMM_AC_BE 0 /* best effort */ +#define IEEE80211_WMM_AC_BK 1 /* background */ +#define IEEE80211_WMM_AC_VI 2 /* video */ +#define IEEE80211_WMM_AC_VO 3 /* voice */ + +#define IEEE8021P_PRIORITY_ID0 0 +#define IEEE8021P_PRIORITY_ID1 1 +#define IEEE8021P_PRIORITY_ID2 2 +#define IEEE8021P_PRIORITY_ID3 3 +#define IEEE8021P_PRIORITY_ID4 4 +#define IEEE8021P_PRIORITY_ID5 5 +#define IEEE8021P_PRIORITY_ID6 6 +#define IEEE8021P_PRIORITY_ID7 7 + +#define IEEE8021P_PRIORITY_NUM 8 + +#define QCSAPI_WIFI_AC_MAP_SIZE (64) + +#define IP_DSCP_NUM 64 + +/** + * \struct qcsapi_channel_power_table + * + * \brief Structure to contain the power table for a single channel. + * + * This structure is used as an input or return parameter in the channel power table APIs. + * It is filled in as as a power level (in dBm) for each combination of channel bandwidth + * (20, 40, 80MHz), spatial stream (1, 2, 3, 4) and beamforming on vs. off. A total of + * 24 power levels must be configured. + * + * For example, the following code snippet shows an initialisation of the structure and + * the corresponding channel/bandwidth/SS power levels. + * + * qcsapi_channel_power_table channel_36; + * memset(&channel_36, 0, sizeof(channel_36)); + * channel_36.channel = 36; + * channel_36.power_20M[QCSAPI_POWER_INDEX_BFOFF_1SS] = 19; + * channel_36.power_20M[QCSAPI_POWER_INDEX_BFOFF_2SS] = 19; + * ... + * channel_36.power_40M[QCSAPI_POWER_INDEX_BFON_3SS] = 17; + * channel_36.power_40M[QCSAPI_POWER_INDEX_BFON_4SS] = 17; + * ... + * channel_36.power_80M[QCSAPI_POWER_INDEX_BFON_3SS] = 15; + * channel_36.power_80M[QCSAPI_POWER_INDEX_BFON_4SS] = 15; + * + * \sa qcsapi_wifi_get_chan_power_table + * \sa qcsapi_wifi_set_chan_power_table + * \sa qcsapi_power_indices + */ +typedef struct qcsapi_channel_power_table +{ + /** + * The channel number. + */ + uint8_t channel; + /** + * The power for 20Mhz bandwidth. For the index, please see the definition for "QCSAPI_POWER_INDEX..." + */ + int power_20M[QCSAPI_POWER_TOTAL]; + /** + * The power for 40Mhz bandwidth. For the index, please see the definition for "QCSAPI_POWER_INDEX..." + */ + int power_40M[QCSAPI_POWER_TOTAL]; + /** + * The power for 80Mhz bandwidth. For the index, please see the definition for "QCSAPI_POWER_INDEX..." + */ + int power_80M[QCSAPI_POWER_TOTAL]; +} qcsapi_channel_power_table; + +/** + * \brief This structure represents a set of properties for a single AP. + * + * This structure represents a set of properties for a single AP. + * + * The contents of this structure can be obtained using the function + * qcsapi_wifi_get_properties_AP. + * + * This structure is used to return AP scan results. + * + * \sa qcsapi_wifi_get_properties_AP + */ +typedef struct qcsapi_ap_properties +{ + /** + * The SSID that this AP is using. + */ + qcsapi_SSID ap_name_SSID; + /** + * The MAC address of the wireless interface of the AP. + */ + qcsapi_mac_addr ap_mac_addr; + /** + * Flags relevant to the AP. 0 = security disabled, 1 = security enabled + */ + qcsapi_unsigned_int ap_flags; + /** + * The operating channel of the AP. + */ + int ap_channel; + /** + * The RSSI of the AP, in the range [0 - 68]. + */ + int ap_RSSI; + /** + * The security protocol in use (none / WPA / WPA2) + */ + int ap_protocol; + /** + * The supported encryption modes (eg TKIP, CCMP) + */ + int ap_encryption_modes; + /** + * The supported authentication type(s) (eg PSK) + */ + int ap_authentication_mode; + /** + * The fastest data rate this AP is capable of sending + */ + int ap_best_data_rate; + /** + * The capability of WPS. + */ + int ap_wps; + /** + * The IEEE80211 protocol (e.g. a, b, g, n, ac) + */ + int ap_80211_proto; + /** + * QHop role (e.g. 0-None, 1-MBS, 2-RBS) + */ + int ap_qhop_role; +} qcsapi_ap_properties; + +/** + * \brief Structure to contain per node statistics. + * + * This structure is used as a return parameter in the per-node association APIs + * associated with statistics gathering. + * + * \sa qcsapi_wifi_get_node_stats + */ +typedef struct qcsapi_node_stats +{ + /* TX path */ + /** + * The number of transmitted bytes to the node. + */ + uint64_t tx_bytes; + /** + * The number of transmitted packets to the node. + */ + uint32_t tx_pkts; + /** + * The number of transmit discards to the node. + */ + uint32_t tx_discard; + /** + * The number of transmit errors to the node. + */ + uint32_t tx_err; + /** + * The number of transmitted unicast packets to the node. + */ + uint32_t tx_unicast; + /** + * The number of transmitted multicast packets to the node. + */ + uint32_t tx_multicast; + /** + * The number of transmitted broadcast packets to the node. + */ + uint32_t tx_broadcast; + /** + * TX PHY rate in megabits per second (MBPS) + */ + uint32_t tx_phy_rate; + + /* RX path */ + /** + * The number of received bytes from the node. + */ + uint64_t rx_bytes; + /** + * The number of received packets from the node. + */ + uint32_t rx_pkts; + /** + * The numbder of received packets discarded from the node. + */ + uint32_t rx_discard; + /** + * The number of received packets in error from the node. + */ + uint32_t rx_err; + /** + * The number of received unicast packets from the node. + */ + uint32_t rx_unicast; + /** + * The number of received multicast packets from the node. + */ + uint32_t rx_multicast; + /** + * The number of received broadcast packets form the node. + */ + uint32_t rx_broadcast; + /** + * The number of received unknown packets from the node. + */ + uint32_t rx_unknown; + /** + * RX PHY rate in megabits per second (MBPS) + */ + uint32_t rx_phy_rate; + /** + * The MAC address of the node. + */ + qcsapi_mac_addr mac_addr; + /** + * The hw noise of the node. + */ + int32_t hw_noise; + /** + * The snr of the node. + */ + int32_t snr; + /** + * The rssi of the node. + */ + int32_t rssi; + /** + * The bandwidth of the node. + */ + int32_t bw; +} qcsapi_node_stats; + +/** + * \brief Structure to contain per interface statistics. + * + * This structure is used as a return parameter in the per-interface APIs + * associated with statistics gathering. + * + * \sa qcsapi_get_interface_stats + */ +typedef struct _qcsapi_interface_stats +{ + /* TX Path */ + /** + * The number of transmitted bytes on the interface. + */ + uint64_t tx_bytes; + /** + * The number of transmitted packets on the interface. + */ + uint32_t tx_pkts; + /** + * The number of discarded transmit packets on the interface. + */ + uint32_t tx_discard; + /** + * The number of transmit errors on the interface. + */ + uint32_t tx_err; + /** + * The number of transmitted unicast packets on the interface. + */ + uint32_t tx_unicast; + /** + * The number of transmitted multicast packets on the interface. + */ + uint32_t tx_multicast; + /** + * The number of transmitted broadcast packets on the interface. + */ + uint32_t tx_broadcast; + + /* RX Path */ + /** + * The number of received bytes on the interface. + */ + uint64_t rx_bytes; + /** + * The number of received packets on the interface. + */ + uint32_t rx_pkts; + /** + * The number of received packets discarded on the interface. + */ + uint32_t rx_discard; + /** + * The number of received packets in error on the interface. + */ + uint32_t rx_err; + /** + * The number of received unicast packets on the interface. + */ + uint32_t rx_unicast; + /** + * The number of received multicast packets on the interface. + */ + uint32_t rx_multicast; + /** + * The number of received broadcast packets on the interface. + */ + uint32_t rx_broadcast; + /** + * The number of received unknown packets on the interface. + */ + uint32_t rx_unknown; +} qcsapi_interface_stats; + + +/** + * \brief Structure containing PHY statistics. + * + * This structure is used as a return parameter in the per-interface APIs + * associated with PHY statistics gathering. + * + * \sa qcsapi_get_phy_stats + */ +typedef struct _qcsapi_phy_stats +{ + /** + * The timestamp in seconds since system boot up + */ + uint32_t tstamp; + /** + * Associated Station count or if Station is associated + */ + uint32_t assoc; + /** + * Current active channel + */ + uint32_t channel; + /** + * Attenuation + */ + uint32_t atten; + /** + * Total CCA + */ + uint32_t cca_total; + /** + * Transmit CCA + */ + uint32_t cca_tx; + /** + * Receive CCA + */ + uint32_t cca_rx; + /** + * CCA interference + */ + uint32_t cca_int; + /** + * CCA Idle + */ + uint32_t cca_idle; + /** + * Received packets counter + */ + uint32_t rx_pkts; + /** + * Receive gain in dBm + */ + uint32_t rx_gain; + /** + * Received packet counter with frame check error + */ + uint32_t rx_cnt_crc; + /** + * Received noise level in dBm + */ + float rx_noise; + /** + * Transmitted packets counter + */ + uint32_t tx_pkts; + /** + * Deferred packet counter in transmission + */ + uint32_t tx_defers; + /** + * Time-out counter for transimitted packets + */ + uint32_t tx_touts; + /** + * Retried packets counter in transmission + */ + uint32_t tx_retries; + /** + * Counter of short preamble errors + */ + uint32_t cnt_sp_fail; + /** + * Counter of long preamble errors + */ + uint32_t cnt_lp_fail; + /** + * MCS index for last received packet + */ + uint32_t last_rx_mcs; + /** + * MCS index for last transimtted packet + */ + uint32_t last_tx_mcs; + /** + * Received signal strength indicator in dBm + */ + float last_rssi; + /** + * Per Chain RSSI + */ + float last_rssi_array[QCSAPI_QDRV_NUM_RF_STREAMS]; + /** + * Received channel power level in dBm + */ + float last_rcpi; + /** + * Error vector magnitude measured in dBm + */ + float last_evm; + /** + * Per Chain EVM + */ + float last_evm_array[QCSAPI_QDRV_NUM_RF_STREAMS]; +} qcsapi_phy_stats; + +/** + * \brief Structure containing per client mlme statistics. + * + * This structure is used as a return parameter in the mlme statistics + * request functions. + * + * \sa qcsapi_wifi_get_mlme_stats_per_association + * \sa qcsapi_wifi_get_mlme_stats_per_mac + */ +typedef struct _qcsapi_mlme_stats +{ + unsigned int auth; + unsigned int auth_fails; + unsigned int assoc; + unsigned int assoc_fails; + unsigned int deauth; + unsigned int diassoc; +} qcsapi_mlme_stats; + +/** + * \brief Structure containing the list of macs. + * + * This structure is used as a return parameter in + * mlme statistics macs request function + * + * \sa qcsapi_wifi_get_mlme_stats_macs_list + */ +#define QCSAPI_MLME_STATS_MAX_MACS 128 +typedef struct _qcsapi_mlme_stats_macs { + /** + * MAC addresses existing in mlme stats + */ + qcsapi_mac_addr addr[QCSAPI_MLME_STATS_MAX_MACS]; +} qcsapi_mlme_stats_macs; + +/** + * Used with API 'qcsapi_wifi_start_cca' + */ +struct qcsapi_cca_info +{ + /** + * Channel to switch to for off channel CCA measurements + */ + int cca_channel; + + /** + * Duration to stay on the channel being measured, in milliseconds + */ + int cca_duration; +}; + +/** + * \brief Structure containing SCS report for current channel. + * + * This structure is used as a return parameter in the SCS API to return + * report for the current channel. + * + * \sa qcsapi_wifi_get_scs_currchan_report + */ +typedef struct qcsapi_scs_currchan_rpt { + /** + * Current channel number + */ + uint8_t chan; + /** + * Total try count for cca sampling + */ + uint16_t cca_try; + /** + * CCA idle count + */ + uint16_t cca_idle; + /** + * CCA busy count + */ + uint16_t cca_busy; + /** + * CCA interference count + */ + uint16_t cca_intf; + /** + * CCA transmitting count + */ + uint16_t cca_tx; + /** + * Transmiting time in ms + */ + uint16_t tx_ms; + /** + * Receiving time in ms + */ + uint16_t rx_ms; + /** + * Preamble error count + */ + uint32_t pmbl; +} qcsapi_scs_currchan_rpt; + +#define QCSAPI_SCS_REPORT_CHAN_NUM 32 +/** + * \brief Structure containing SCS report for all channels. + * + * This structure is used as a return parameter in the SCS API to return + * report for the all channels. + * + * The attributes for a certain channel use the same index into each + * attribute array. + * + * \sa qcsapi_wifi_get_scs_stat_report + */ +typedef struct qcsapi_scs_ranking_rpt { + /** + * Valid record number in the following attribute arrays + */ + uint8_t num; + /** + * Channel numbers + */ + uint8_t chan[QCSAPI_SCS_REPORT_CHAN_NUM]; + /** + * Whether channel is DFS channel or not + */ + uint8_t dfs[QCSAPI_SCS_REPORT_CHAN_NUM]; + /** + * Txpower + */ + uint8_t txpwr[QCSAPI_SCS_REPORT_CHAN_NUM]; + /** + * Ranking metric + */ + int32_t metric[QCSAPI_SCS_REPORT_CHAN_NUM]; + /** + * Ranking metric age + */ + uint32_t metric_age[QCSAPI_SCS_REPORT_CHAN_NUM]; + /** + * CCA interference + */ + uint16_t cca_intf[QCSAPI_SCS_REPORT_CHAN_NUM]; + /** + * Preamble error detected by AP + */ + uint32_t pmbl_ap[QCSAPI_SCS_REPORT_CHAN_NUM]; + /** + * Maximum preamble error detected by STAs + */ + uint32_t pmbl_sta[QCSAPI_SCS_REPORT_CHAN_NUM]; + /** + * Amount of time the channel was used in seconds + */ + uint32_t duration[QCSAPI_SCS_REPORT_CHAN_NUM]; + /** + * Number of times the channel was used + */ + uint32_t times[QCSAPI_SCS_REPORT_CHAN_NUM]; +} qcsapi_scs_ranking_rpt; + +/** + * \brief Structure containing the scores of all channels. + * + * This structure is used as a return parameter in the SCS API to return + * the scores of the all channels. + * + * The attributes for a certain channel use the same index into each + * attribute array. + * + * \sa qcsapi_wifi_get_scs_score_report + */ +typedef struct qcsapi_scs_score_rpt { + /* + * Valid record number in the following attribute arrays + */ + uint8_t num; + /* + * Channel numbers + */ + uint8_t chan[QCSAPI_SCS_REPORT_CHAN_NUM]; + /* + * The channel score (0 - 100, 100 means the best) + */ + uint8_t score[QCSAPI_SCS_REPORT_CHAN_NUM]; +} qcsapi_scs_score_rpt; + +/** + * \brief Structure containing auto channel report for initial channel selection. + * + * This structure is used as a return parameter in the Auto Channel API to return + * report for initial channel selection. + * + * The attributes for a certain channel use the same index into each attribute array. + * + * \sa qcsapi_wifi_get_autochan_report + */ +typedef struct qcsapi_autochan_rpt { + /** + * Valid record number in the following attribute arrays + */ + uint8_t num; + /** + * Channel number + */ + uint8_t chan[QCSAPI_SCS_REPORT_CHAN_NUM]; + /** + * Whether channel is DFS channel or not + */ + uint8_t dfs[QCSAPI_SCS_REPORT_CHAN_NUM]; + /** + * Txpower + */ + uint8_t txpwr[QCSAPI_SCS_REPORT_CHAN_NUM]; + /** + * Ranking metric + */ + int32_t metric[QCSAPI_SCS_REPORT_CHAN_NUM]; + /** + * Number of beacons detected + */ + uint32_t numbeacons[QCSAPI_SCS_REPORT_CHAN_NUM]; + /** + * Co-channel interference index + */ + uint32_t cci[QCSAPI_SCS_REPORT_CHAN_NUM]; + /** + * Adjacent Channel interference index + */ + uint32_t aci[QCSAPI_SCS_REPORT_CHAN_NUM]; +} qcsapi_autochan_rpt; + +/** + * This structure is the same as 'struct ieee80211req_scs_param_rpt', but (re)defined for convenience + */ +typedef struct qcsapi_scs_param_rpt { + uint32_t scs_cfg_param; + uint32_t scs_signed_param_flag; +} qcsapi_scs_param_rpt; + +/** + * Used with API 'qcsapi_wifi_get_assoc_records' + */ +#define QCSAPI_ASSOC_MAX_RECORDS 32 +typedef struct qcsapi_assoc_records { + /** + * MAC addresses of remote nodes that have associated + */ + qcsapi_mac_addr addr[QCSAPI_ASSOC_MAX_RECORDS]; + /** + * Time stamp of the most recent association by the corresponding remote node + */ + uint32_t timestamp[QCSAPI_ASSOC_MAX_RECORDS]; +} qcsapi_assoc_records; + +/**@}*/ + + +#define TABLE_SIZE( TABLE ) (sizeof( TABLE ) / sizeof( (TABLE)[ 0 ] )) + +#ifndef ARRAY_SIZE +#define ARRAY_SIZE(a) (sizeof (a) / sizeof ((a)[0])) +#endif + +/* Channel 0 means channel auto */ +#define QCSAPI_ANY_CHANNEL 0 +#define QCSAPI_MIN_CHANNEL 1 +#define QCSAPI_MAX_CHANNEL (IEEE80211_CHAN_MAX) + +#define RESTORE_DEFAULT_CONFIG "/scripts/restore_default_config" + +#ifndef BRIDGE_DEVICE +#define BRIDGE_DEVICE "br0" +#endif /* BRIDGE_DEVICE */ + + +/* QCSAPI entry points */ + +/* error reporting */ + + +/* generic */ +#define QCSAPI_CSW_MAX_RECORDS 32 + +/** + * Channel switch history record + */ +typedef struct _qcsapi_csw_record { + /** + * Entry number. Maximum value is QCSAPI_CSW_MAX_RECORDS. + */ + uint32_t cnt; + /** + * Index of the latest channel change. + */ + int32_t index; + /** + * Channel number which the device switch to. If the + * value is 0, it means the record is invalid. + */ + uint32_t channel[QCSAPI_CSW_MAX_RECORDS]; + /** + * Time when the channel change happens. + */ + uint32_t timestamp[QCSAPI_CSW_MAX_RECORDS]; + /** + * Reason for channel change. Possible values are enumerated by + * \link ieee80211_csw_reason \endlink + */ + uint32_t reason[QCSAPI_CSW_MAX_RECORDS]; +} qcsapi_csw_record; + +/** + * Data should be set to the dscp to ac mapping + */ +typedef struct _qcsapi_dscp2ac_data { + /** + * dscp value to be mapped + */ + uint8_t ip_dscp_list[64]; + /** + * Length of DSCP list + */ + uint8_t list_len; + /** + * WME Access Class + */ + uint8_t ac; +} qcsapi_dscp2ac_data; + + +typedef struct _qcsapi_chan_disabled_data { + uint8_t chan[QCSAPI_MAX_CHANNEL]; + uint32_t list_len; + uint8_t flag; /*0: disable 1: enable*/ + uint8_t dir; /*0: set 1: get*/ +} qcsapi_chan_disabled_data; + +/** + * Each channel's Radar status and detected history records + */ +typedef struct _qcsapi_radar_status { + /** + * Which channel to be queried. It must be DFS channel. + */ + uint32_t channel; + /** + * If This API returns without error, it indicates the whether the channel is in non-occupy list currently. + */ + uint32_t flags; + /** + * This records times radar signal is detected on this channel. + */ + uint32_t ic_radardetected; +}qcsapi_radar_status; + +/** + * Connection and Disconnecttion count information + */ +typedef struct _qcsapi_disconn_info { + /** + * This indicates number of stations connect to this device. + */ + uint32_t asso_sta_count; + /** + * Count of disconnect event. + */ + uint32_t disconn_count; + /** + * Sequence to query disconnect count. + */ + uint32_t sequence; + /** + * Time elapses since device boot up. + */ + uint32_t up_time; + /** + * If resetflag is set to TRUE, member disconn_count and sequence will be set to 0. + */ + uint32_t resetflag; +}qcsapi_disconn_info; + +/** + * Retrieve values of tx_power on all antennas for calcmd + */ +typedef struct _qcsapi_calcmd_tx_power_rsp { + uint32_t value[QCSAPI_QDRV_NUM_RF_STREAMS]; +}qcsapi_calcmd_tx_power_rsp; + +/** + * Retrieve values of rssi on all antennas for calcmd + */ +typedef struct _qcsapi_calcmd_rssi_rsp{ + int32_t value[QCSAPI_QDRV_NUM_RF_STREAMS]; +}qcsapi_calcmd_rssi_rsp; + +typedef enum { + qcsapi_extender_role = 1, + qcsapi_extender_mbs_best_rssi, + qcsapi_extender_rbs_best_rssi, + qcsapi_extender_mbs_wgt, + qcsapi_extender_rbs_wgt, + qcsapi_extender_verbose, + qcsapi_extender_roaming, + qcsapi_extender_bgscan_interval, + qcsapi_extender_nosuch_param = 0 +} qcsapi_extender_type; + +typedef enum { + qcsapi_tdls_over_qhop_enabled = 1, + qcsapi_tdls_link_timeout_time, + qcsapi_tdls_indication_window, + qcsapi_tdls_chan_switch_mode, + qcsapi_tdls_chan_switch_off_chan, + qcsapi_tdls_chan_switch_off_chan_bw, + qcsapi_tdls_discovery_interval, + qcsapi_tdls_node_life_cycle, + qcsapi_tdls_verbose, + qcsapi_tdls_mode, + qcsapi_tdls_min_rssi, + qcsapi_tdls_link_weight, + qcsapi_tdls_rate_weight, + qcsapi_tdls_training_pkt_cnt, + qcsapi_tdls_switch_ints, + qcsapi_tdls_path_select_pps_thrshld, + qcsapi_tdls_path_select_rate_thrshld, + qcsapi_tdls_nosuch_param = 0 +} qcsapi_tdls_type; + +typedef enum { + qcsapi_tdls_oper_discover = 1, + qcsapi_tdls_oper_setup, + qcsapi_tdls_oper_teardown, + qcsapi_tdls_oper_switch_chan, + qcsapi_tdls_nosuch_oper = 0 +} qcsapi_tdls_oper; + +typedef enum { + qcsapi_eth_info_connected = 0x00000001, + qcsapi_eth_info_speed_unknown = 0x00000002, + qcsapi_eth_info_speed_10M = 0x00000004, + qcsapi_eth_info_speed_100M = 0x00000008, + qcsapi_eth_info_speed_1000M = 0x00000010, + qcsapi_eth_info_speed_10000M = 0x00000020, + qcsapi_eth_info_duplex_full = 0x00000040, + qcsapi_eth_info_autoneg_on = 0x00000080, + qcsapi_eth_info_autoneg_success = 0x00000100, + qcsapi_eth_info_unknown = 0 +} qcsapi_eth_info_result; + +typedef enum { + qcsapi_eth_info_link_mask = qcsapi_eth_info_connected, + qcsapi_eth_info_speed_mask = qcsapi_eth_info_speed_10M \ + | qcsapi_eth_info_speed_100M \ + | qcsapi_eth_info_speed_1000M \ + | qcsapi_eth_info_speed_10000M \ + | qcsapi_eth_info_speed_unknown, + qcsapi_eth_info_duplex_mask = qcsapi_eth_info_duplex_full, + qcsapi_eth_info_autoneg_mask = qcsapi_eth_info_autoneg_on \ + | qcsapi_eth_info_autoneg_success, + qcsapi_eth_info_all_mask = qcsapi_eth_info_link_mask \ + | qcsapi_eth_info_speed_mask \ + | qcsapi_eth_info_duplex_mask \ + | qcsapi_eth_info_autoneg_mask +} qcsapi_eth_info_type_mask; + +typedef enum { + qcsapi_eth_info_start = 1, + qcsapi_eth_info_link = qcsapi_eth_info_start, + qcsapi_eth_info_speed, + qcsapi_eth_info_duplex, + qcsapi_eth_info_autoneg, + qcsapi_eth_info_all, + qcsapi_eth_nosuch_type = 0 +} qcsapi_eth_info_type; + +typedef enum { + qcsapi_interface_status_error, + qcsapi_interface_status_disabled, + qcsapi_interface_status_up, + qcsapi_interface_status_running, +} qcsapi_interface_status_code; + +/** + * request parameter for 11h and 11k measurement + */ +typedef union _qcsapi_measure_request_param { + /** + * basic measurement paramter + */ + struct _basic { + /** + * offset to start measurement, based on microsecond + */ + uint16_t offset; + /** + * duration to do the measurement, based on microsecond + */ + uint16_t duration; + /** + * channel to execute the measurement, based on IEEEE channel number + */ + uint8_t channel; + } basic; + /** + * CCA measurement paramter + */ + struct _cca { + /** + * offset to start measurement, based on microsecond + */ + uint16_t offset; + /** + * duration to do the measurement, based on microsecond + */ + uint16_t duration; + /** + * channel to execute the measurement, based on IEEEE channel number + */ + uint8_t channel; + } cca; + /** + * RPI measurement paramter + */ + struct _rpi { + /** + * offset to start measurement, based on microsecond + */ + uint16_t offset; + /** + * duration to do the measurement, based on microsecond + */ + uint16_t duration; + /** + * channel to execute the measurement, based on IEEEE channel number + */ + uint8_t channel; + } rpi; + /** + * Channel Load measurement paramter + */ + struct _chan_load { + /** + * operating class, with channel and region to decide which frequency to execute + */ + uint8_t op_class; + /** + * IEEE channel number, with operating class and region to decide which frequency to execute + */ + uint8_t channel; + /** + * duration to do the measurement, based on microsecond + */ + uint16_t duration; + } chan_load; + /** + * Noise histogram measurement paramter + */ + struct _noise_his { + /** + * operating class, with channel and region to decide which frequency to execute + */ + uint8_t op_class; + /** + * IEEE channel number, with operating class and region to decide which frequency to execute + */ + uint8_t channel; + /** + * duration to do the measurement, based on microsecond + */ + uint16_t duration; + } noise_his; + /** + * Beacon measurement paramter + */ + struct _beacon { + /** + * operating class, with channel and region to decide which frequency to execute + */ + uint8_t op_class; + /** + * IEEE channel number, with operating class and region to decide which frequency to execute + */ + uint8_t channel; + /** + * duration to do the measurement, based on microsecond + */ + uint16_t duration; + /** + * beacon measurement mode, 0 passive, 1 active, 2 table + */ + uint8_t mode; + /** + * specified bssid for beacon measurement + */ + uint8_t bssid[6]; + } beacon; + /** + * Frame measurement paramter + */ + struct _frame { + /** + * operating class, with channel and region to decide which frequency to execute + */ + uint8_t op_class; + /** + * IEEE channel number, with operating class and region to decide which frequency to execute + */ + uint8_t channel; + /** + * duration to do the measurement, based on microsecond + */ + uint16_t duration; + /** + * frame type, currently only frame count report(1) is supported + */ + uint8_t type; + /** + * specified mac_address for frame measurement + */ + uint8_t mac_address[6]; + } frame; + /** + * transmit stream/category measurement + */ + struct _tran_steam_cat { + /** + * duration to do the measurement, based on microsecond + */ + uint16_t duration; + /** + * specified mac_address for measurement + */ + uint8_t peer_sta[6]; + /** + * traffic ID + */ + uint8_t tid; + /** + * bin 0 + */ + uint8_t bin0; + } tran_stream_cat; + /** + * multicast diagnostics report + */ + struct _multicast_diag { + /** + * duration to do the measurement, based on microsecond + */ + uint16_t duration; + /** + * specified group mac_address for measurement + */ + uint8_t group_mac[6]; + } multicast_diag; +} qcsapi_measure_request_param; + + +/** +* Neighbor report item +*/ +struct _neighbor_item { + uint8_t bssid[6]; + uint32_t bssid_info; + uint8_t operating_class; + uint8_t channel; + uint8_t phy_type; +}; + +/** + * report parameter for 11h and 11k measurement + */ +typedef union _qcsapi_measure_report_result { + /** + * common place to store results if no specified + */ + int common[16]; + /** + * Transmit power control report + */ + struct _rpt_tpc { + int8_t link_margin; + int8_t tx_power; + } tpc; + /** + * Basic measurement report + */ + uint8_t basic; + /** + * CCA measurement report + */ + uint8_t cca; + /** + * RPI measurement report + */ + uint8_t rpi[8]; + /** + * Channel Load measurement report + */ + uint8_t channel_load; + /** + * Noise histogram measurement report + */ + struct _rpt_noise_histogram { + uint8_t antenna_id; + uint8_t anpi; + uint8_t ipi[11]; + } noise_histogram; + /** + * Beacon measurement report + */ + struct _rpt_beacon { + uint8_t rep_frame_info; + uint8_t rcpi; + uint8_t rsni; + uint8_t bssid[6]; + uint8_t antenna_id; + uint32_t parent_tsf; + } beacon; + /** + * Frame measurement report + */ + struct _rpt_frame { + uint32_t sub_ele_report; + uint8_t ta[6]; + uint8_t bssid[6]; + uint8_t phy_type; + uint8_t avg_rcpi; + uint8_t last_rsni; + uint8_t last_rcpi; + uint8_t antenna_id; + uint16_t frame_count; + } frame; + /** + * Transmit stream/category report + */ + struct _rpt_tran_stream_cat { + uint8_t reason; + uint32_t tran_msdu_cnt; + uint32_t msdu_discard_cnt; + uint32_t msdu_fail_cnt; + uint32_t msdu_mul_retry_cnt; + uint32_t qos_lost_cnt; + uint32_t avg_queue_delay; + uint32_t avg_tran_delay; + uint8_t bin0_range; + uint32_t bins[6]; + } tran_stream_cat; + /** + * Multicast diagnostics report + */ + struct _rpt_multicast_diag { + uint8_t reason; + uint32_t mul_rec_msdu_cnt; + uint16_t first_seq_num; + uint16_t last_seq_num; + uint16_t mul_rate; + } multicast_diag; + /** + * Link measurement + */ + struct _rpt_link_measure { + struct _rpt_tpc_report { + int8_t tx_power; + int8_t link_margin; + } tpc_report; + uint8_t recv_antenna_id; + uint8_t tran_antenna_id; + uint8_t rcpi; + uint8_t rsni; + } link_measure; + /** + * Neighbor report + */ + struct _rpt_neighbor_report { + uint8_t item_num; + struct _neighbor_item items[3]; + } neighbor_report; +} qcsapi_measure_report_result; + +/* parameter-specific */ + +/**@addtogroup BootConfigAPIs + *@{*/ + +/** + * \brief Retrieve a parameter from bootcfg environment + * + * Read a u-boot environment parameter from the bootcfg driver, which manages persistent u-boot environment variables. + * + * \param param_name Name of parameter being requested + * \param param_value Result storage for the value of the parameter + * \param max_param_len size of the buffer passed in param_value + * + * \return 0 on success, -ENODATA if the parameter is not found, or other negative error codes on failure. + * + * \callqcsapi + * + * call_qcsapi get_bootcfg_param \ + * + * Output will be the value of the requested environment variable on success, or an error message on failure. + */ +extern int qcsapi_bootcfg_get_parameter(const char *param_name, + char *param_value, + const size_t max_param_len); +/** + * \brief Persist a parameter in bootcfg environment flash + * + * Write a u-boot environment parameter to the bootcfg driver. Bootcfg driver will handle writing the new parameter to persistent storage. + * + * \param param_name Name of parameter being set + * \param param_value Value of parameter to be set + * + * \return 0 on success, negative error codes on failure. + * + * \callqcsapi + * + * call_qcsapi update_bootcfg_param \ \ + * + * Unless an error occurs, the output will be the string complete. + */ +extern int qcsapi_bootcfg_update_parameter(const char *param_name, + const char *param_value); + +/** + * \brief Sync bootcfg updates to flash + * + * This function can be called after making changes to bootcfg with + * qcsapi_bootcfg_update_parameter, to ensure that all pending updates + * have been committed to flash. + * + * \note This call will block until the flash has been written back. Generally + * this call will complete immediately with interactive use of call_qcsapi, + * and is used during production for ensuring scripts complete write of the + * bootcfg parameters prior to calling board reboot. + * + * \return 0 when all pending updates have been committed to flash + * \return negative error codes on failure + * + * \callqcsapi + * + * call_qcsapi commit_bootcfg + * + * Unless an error occurs, the output will be the string complete. + */ +extern int qcsapi_bootcfg_commit(void); +/**@}*/ + +/**@addtogroup ServicesAPIs + *@{*/ + +extern int qcsapi_telnet_enable( const qcsapi_unsigned_int onoff ); + +/** + * \brief Used to find service enum + * + * This is internally used in service_control + */ +extern int qcsapi_get_service_name_enum(const char * lookup_service, qcsapi_service_name *serv_name); + +/** + * \brief Used to find service action enum + * + * This is internally used in service control + */ +extern int qcsapi_get_service_action_enum(const char * lookup_action, qcsapi_service_action *serv_action); + +/** + * \brief Start, stop, enable or disable the services. + * + * Turn service on or off. + * + * \param service + * \param action start/stop/enable/disable + * + * \return 0 on success or negative values on error + * + * \callqcsapi + * + * call_qcsapi service_control + * + * Unless an error occurs, the output will be the string complete. + */ +extern int qcsapi_service_control(qcsapi_service_name service, qcsapi_service_action action); + +/** + * \brief Enable and disable features that are not needed for WFA testing + * + * Turn WFA certification mode on or off. + * + * \param enable a value turn the WFA certification mode on/off + * + * \return 0 on success or negative values on error + * + * \callqcsapi + * + * call_qcsapi wfa_cert <1|0> + * + * Unless an error occurs, the output will be the string complete. + */ +extern int qcsapi_wfa_cert_mode_enable(uint16_t enable); +/**@}*/ + +/**@addtogroup SCSAPIs + *@{*/ + +/** + * \brief Returns the channels during the last channel change event. + * + * Retrieve the previous channel and the current channel during the + * last channel change event. + * + * \param ifname \wifi0 + * \param p_prev_channel the channel before the channel change. + * \param p_cur_channel the channel after the channel change. + * + * \return 0 on success or -EOPNOTSUPP or other negative values on error. + * + * \callqcsapi + * + * call_qcsapi get_scs_cce_channels \ + * + * Unless an error occurs, the previous and current channel will be displayed. + */ +extern int qcsapi_wifi_get_scs_cce_channels(const char *ifname, + qcsapi_unsigned_int *p_prev_channel, + qcsapi_unsigned_int *p_cur_channel); + +/** + * \brief Turn SCS feature on/off. + * + * Turn the SCS feature on or off. + * + * \param ifname \wifi0 + * \param enable_val a value turn the feature on/off + * + * \return 0 on success or negative values on error + * + * \callqcsapi + * + * call_qcsapi enable_scs \ [ 0 | 1 ] + * + * Unless an error occurs, the output will be the string complete. + */ +extern int qcsapi_wifi_scs_enable(const char *ifname, uint16_t enable_val); + +/** + * \brief Trigger SCS switch channel manually. + * + * Trigger SCS switch channel manually, regardless whether there is interference or not, + * and whether the current channel is the best one or not. + * + * \param ifname \wifi0 + * + * \return 0 on success or negative values on error + * + * \callqcsapi + * + * call_qcsapi scs_switch_chan \ + * + * Unless an error occurs, the output will be the string complete. + */ +extern int qcsapi_wifi_scs_switch_channel(const char *ifname); + +/** + * \internal + * \brief Turn SCS feature's verbose information output on/off. + * + * Turn the SCS feature's verbose information output on or off. + * + * \param ifname \wifi0 + * \param enable_val a value turn the verbose information output on/off + * + * \return 0 on success or negative values on error + * + * \callqcsapi + * + * call_qcsapi set_scs_verbose \ [ 0 | 1 ] + * + * Unless an error occurs, the output will be the string complete. + */ +extern int qcsapi_wifi_set_scs_verbose(const char *ifname, uint16_t enable_val); + +/** + * \brief Get the current enabled state of SCS feature. + * + * Return the current enabled status of the SCS feature. It could be either + * enabled or disabled. + * + * \param ifname \wifi0 + * \param p_scs_status value that contains if SCS is enabled or disabled. + * + * \return 0 on success or negative values on error + * + * \callqcsapi + * + * call_qcsapi get_scs_status \ + * + * The output will be the word "Disabled" or "Enabled" unless an error occurs. + */ +extern int qcsapi_wifi_get_scs_status(const char *ifname, qcsapi_unsigned_int *p_scs_status); + +/** + * \internal + * \brief Turn SCS feature's channel sampling on/off. + * + * Turn the SCS feature's channel sampling on or off. + * + * \param ifname \wifi0 + * \param enable_val a value turn the channel sampling on/off + * + * \return 0 on success or negative values on error + * + * \callqcsapi + * + * call_qcsapi set_scs_smpl_enable \ [ 0 | 1 ] + * + * Unless an error occurs, the output will be the string complete. + */ +extern int qcsapi_wifi_set_scs_smpl_enable(const char *ifname, uint16_t enable_val); + +/** + * \internal + * \brief Set the duration for sampling the busyness of a channel. + * + * API sets the dwell time for the scs feature ie. the duration in + * which the busyness of the channel is sampled. + * Unit is in milliseconds. + * + * \param ifname \wifi0 + * \param scs_sample_time Time during which busyness is sampled. + * + * \return 0 on success or negative values on error + * + * \callqcsapi + * + * call_qcsapi set_scs_smpl_dwell_time \ <duration> + * + * Unless an error occurs, the output will be the string complete. + */ +extern int qcsapi_wifi_set_scs_smpl_dwell_time(const char *ifname, uint16_t scs_sample_time); + +/** + * \internal + * \brief Set the interval between two samples for SCS feature. + * + * API sets the sample interval for the SCS feature. This duration indicates + * the duration to wait after which the next off-channel sampling session starts. + * Unit is in seconds. + * + * \param ifname \wifi0 + * \param scs_sample_intv Time from the previous sample to the next sample. + * + * \return 0 on success or negative values on error + * + * \callqcsapi + * + * call_qcsapi set_scs_smpl_intv \ <duration> + * + *
Unless an error occurs, the output will be the string complete. + */ +extern int qcsapi_wifi_set_scs_sample_intv(const char *ifname, uint16_t scs_sample_intv); + +/** + * \internal + * \brief Set the interval between two interference detection for SCS feature. + * + * API sets the interference detection interval for the SCS feature. This duration indicates + * the duration to wait after which the next interference detection session starts. + * Unit is in seconds. + * + * \param ifname \wifi0 + * \param scs_intf_detect_intv Time from the previous interference detection to the next interference detection. + * + * \return 0 on success or negative values on error + * + * \callqcsapi + * + * call_qcsapi set_scs_intf_detect_intv \ <duration> + * + * Unless an error occurs, the output will be the string complete. + */ +extern int qcsapi_wifi_set_scs_intf_detect_intv(const char *ifname, uint16_t scs_intf_detect_intv); + +/** + * \internal + * \brief Set the threshold values for SCS feature. + * + * API sets the threshold for various parameters that control the + * SCS feature. Threshold affects the sensitivity of the feature. + * + * \param ifname \wifi0 + * \param scs_param_name The threshold by name which is to be set + * \param scs_threshold The value of the threshold to be set + * + * \return 0 on success or negative values on error + * + * \callqcsapi + * + * call_qcsapi set_scs_threshold \ <threshold_name> <value> + * threshold name is one of "smpl_pktnum", "smpl_airtime", "intf_low", "intf_high", "intf_ratio", "dfs_margin", "cca_idle", + * "pmbl_err", "atten_inc", "dfs_reentry", "dfs_reentry_minrate". The unit of "dfs_reentry_minrate" is 100kbps. + * + * Unless an error occurs, the output will be the string complete. + */ + +extern int qcsapi_wifi_set_scs_thrshld(const char *ifname, + const char *scs_param_name, + uint16_t scs_threshold); + +/** + * \internal + * \brief Set if SCS feature should only report. + * + * This API controls if SCS should change the channel upon making a decison + * or just report it. + * + * \param ifname \wifi0 + * \param scs_report_only value that indicates if SCS feature should act + * on thresholds or only report. + * + * \return 0 on success or negative values on error + * + * \callqcsapi + * + * call_qcsapi set_scs_report_only \ [ 0 | 1 ] + * + * Unless an error occurs, the output will be the string complete. + */ +extern int qcsapi_wifi_set_scs_report_only(const char *ifname, uint16_t scs_report_only); + +/** + * \brief Get the channel evaluation result for SCS feature. + * + * This API reports the evaluation result for all channels for the SCS feature. + * Statistics like channel, channel metric are returned. + * + * \param ifname \wifi0 + * \param scs_rpt return the channel evaluation result. + * + * \return 0 on success or negative values on error + * + * \callqcsapi + * + * call_qcsapi get_scs_report \ all + * + * The output will be stats containing channel, channel metric unless an error occurs. + */ +extern int qcsapi_wifi_get_scs_stat_report(const char *ifname, struct qcsapi_scs_ranking_rpt *scs_rpt); + +/** + * \brief Get the channel evaluation with scoring way for SCS feature. + * + * This API reports the scores of all channels for the SCS feature. + * Statistics like channel, score are returned. + * + * \note \aponly + * \note \primarywifi + * + * \param ifname \wifi0only + * \param scs_rpt return the channel score result. + * + * \return 0 on success or negative values on error + * + * \callqcsapi + * + * call_qcsapi get_scs_report \ score + * + * The output will be stats containing channel, score unless an error occurs. + */ +extern int qcsapi_wifi_get_scs_score_report(const char *ifname, struct qcsapi_scs_score_rpt *scs_rpt); + +/** + * \brief Get current channel's stats for SCS feature. + * + * This API reports the statistics for the current channel for the SCS feature. + * Statistics like channel, cca interference are returned. + * + * \param ifname \wifi0 + * \param scs_currchan_rpt return the current channel's stats. + * + * \return 0 on success or negative values on error + * + * \callqcsapi + * + * call_qcsapi get_scs_report \ current + * + * The output will be stats containing channel, cca interference unless an error occurs. + */ +extern int qcsapi_wifi_get_scs_currchan_report(const char *ifname, struct qcsapi_scs_currchan_rpt *scs_currchan_rpt); + +/** + * \internal + * \brief Start/Stop SCS stats task. + * + * Start/Stop the SCS stats task. + * + * \param ifname \wifi0 + * \param start a value for start/stop indication + * + * \return 0 on success or negative values on error + * + * \callqcsapi + * + * call_qcsapi set_scs_stats \ [ 0 | 1 ] + * + * Unless an error occurs, the output will be the string complete. + */ +extern int qcsapi_wifi_set_scs_stats(const char *ifname, uint16_t start); + +/** + * \brief Get the initial auto channel evaluation result. + * + * This API reports the initial channel evalution result for Auto Channel feature. + * Statistics like channel, channel metric are returned. + * + * \param ifname \wifi0 + * \param autochan_rpt the initial channel evaluation result. + * + * \return 0 on success or negative values on error + * + * \callqcsapi + * + * call_qcsapi get_scs_report \ autochan + * + * The output will be stats containing channel, channel metric unless an error occurs. + */ +extern int qcsapi_wifi_get_autochan_report(const char *ifname, struct qcsapi_autochan_rpt *autochan_rpt); + +/** + * \internal + * \brief Set smoothing factor for SCS CCA interference measurement. + * + * This API controls the degree SCS smoothes sequential cca interference measurement. + * + * \param ifname \wifi0 + * \param scs_cca_intf_smth_fctr_noxp value that indicates the smoothing factor + * for channels once used as working channel. + * \param scs_cca_intf_smth_fctr_xped value that indicates the smoothing factor + * for channels never used as working channel. + * + * \return 0 on success or negative values on error + * + * \callqcsapi + * + * call_qcsapi set_scs_cca_intf_smth_fctr \ <smth_fctr_noxp> <smth_fctr_xped> + * + * Unless an error occurs, the output will be the string complete. + */ +extern int qcsapi_wifi_set_scs_cca_intf_smth_fctr(const char *ifname, uint8_t smth_fctr_noxp, uint8_t smth_fctr_xped); + +/** + * \internal + * \brief Set channel metric margin for SCS channel ranking. + * + * This API controls the channel metric margin SCS used for channel ranking. + * + * \param ifname \wifi0 + * \param chan_mtrc_mrgn value that indicates the channel metric margin. + * + * \return 0 on success or negative values on error + * + * \callqcsapi + * + * call_qcsapi set_scs_chan_mtrc_mrgn \ <chan_mtrc_mrgn> + * + * Unless an error occurs, the output will be the string complete. + */ +extern int qcsapi_wifi_set_scs_chan_mtrc_mrgn(const char *ifname, uint8_t chan_mtrc_mrgn); + +/** + * \brief Get the specified channel's CCA interference level. + * + * This API call gets the CCA interference level for a particular channel. + * The got CCA interference value should be a integer value from -1 to 1000. -1 means no + * CCA interference data is available, and other values represent CCA interference levels. + * + * \note \primarywifi + * + * \param ifname \wifi0only + * \param the_channel the channel for which the CCA interference is returned. + * \param p_cca_intf return parameter to contain the CCA interference. + * + * \return -EINVAL or other negative values on error, or 0 on success. + * + * \callqcsapi + * + * call_qcsapi get_scs_cca_intf \ <channel> + * + * Unless an error occurs, the output will be the CCA interference status. + */ +extern int qcsapi_wifi_get_scs_cca_intf(const char *ifname, + const qcsapi_unsigned_int the_channel, + int *p_cca_intf); + +/** + * \brief Get the configured SCS parameters. + * + * This API call gets the configured SCS parameters. + * + * \param ifname \wifi0 + * \param p_scs_param_rpt return parameter to contain the SCS parameters. + * \param param_num value that indicates parameter numbers needed to be returned + * + * \return -EINVAL or other negative values on error, or 0 on success. + * + * \callqcsapi + * + * call_qcsapi get_scs_param \ + * + * Unless an error occurs, the output will include current SCS parameters. + */ +extern int qcsapi_wifi_get_scs_param_report(const char *ifname, struct qcsapi_scs_param_rpt *p_scs_param_rpt, uint32_t param_num); + +/** + * \internal + * \brief Get the current state of SCS DFS Re-entry request. + * + * Return the current status of the SCS DFS Re-entry request. It could be either + * 0(not requested) or 1(requested). + * + * \param ifname \wifi0 + * \param p_scs_dfs_reentry_request value that contains the request level. + * + * \return 0 on success or negative values on error + * + * \callqcsapi + * + * call_qcsapi get_scs_dfs_reentry_request \ + * + * The output will be an integer representing the request level unless an error occurs. + */ +extern int qcsapi_wifi_get_scs_dfs_reentry_request(const char *ifname, qcsapi_unsigned_int *p_scs_dfs_reentry_request); +/**@}*/ + +/**@addtogroup DFSAPIs + *@{*/ + +/** + * \brief Start off-channel CAC. + * + * This API is used to start off-channel CAC on a DFS channel.
+ * + * \param ifname \wifi0 + * \param channel specifies the DFS channel for CAC. 0 is to select DFS channel automatically. + * + * \return 0 on success or negative values on error. + * + * \callqcsapi + * + * call_qcsapi start_ocac wifi0 {auto | \}
+ * + * Unless an error occurs, the output will be the string complete. + * + * \note: This API is deprecated and replaced with qcsapi_wifi_start_dfs_s_radio. + */ +extern int qcsapi_wifi_start_ocac(const char *ifname, uint16_t channel); + +/** + * \brief Stop off-channel CAC. + * + * This API is used to stop off-channel CAC.
+ * + * \param ifname \wifi0 + * + * \return 0 on success or negative values on error + * + * \callqcsapi + * + * call_qcsapi stop_ocac wifi0 + * + * Unless an error occurs, the output will be the string complete. + * + * \note: This API is deprecated and replaced with qcsapi_wifi_stop_dfs_s_radio. + */ +extern int qcsapi_wifi_stop_ocac(const char *ifname); + +/** + * \brief Get the current state of off-channel CAC. + * + * This API return the current state of off-channel CAC. + * + * \param ifname \wifi0 + * \param status value that contains if OCAC is enabled or disabled. + * + * \return 0 on success or negative values on error + * + * \callqcsapi + * + * call_qcsapi get_ocac_status \ + * + * The output will be the word "Disabled" or "Enabled" unless an error occurs. + * + * \note: This API is deprecated and replaced with qcsapi_wifi_get_dfs_s_radio_status. + */ +extern int qcsapi_wifi_get_ocac_status(const char *ifname, qcsapi_unsigned_int *status); + +/** + * \internal + * \brief Set the dwell time on off-channel for off-channel CAC. + * + * API sets the dwell time for the off-channel CAC feature, ie. the duration on + * off channel within a beacon interval. + * Unit is in milliseconds. + * + * \param ifname \wifi0 + * \param dwell_time Dwell time on off-channel in a beacon interval. + * + * \return 0 on success or negative values on error + * + * \callqcsapi + * + * call_qcsapi set_ocac_dwell_time \ <dwelltime> + * + * Unless an error occurs, the output will be the string complete. + * + * \note: This API is deprecated and replaced with qcsapi_wifi_set_dfs_s_radio_dwell_time. + */ +extern int qcsapi_wifi_set_ocac_dwell_time(const char *ifname, uint16_t dwell_time); + +/** + * \internal + * \brief Set the duration during which off-channel CAC is running for a DFS channel. + * + * API sets the duration during which the off-channel CAC is running for a specified + * DFS channel + * Unit is in seconds. + * + * \param ifname \wifi0 + * \param duration Duration for a specified DFS channel to run off-channel CAC. + * + * \return 0 on success or negative values on error + * + * \callqcsapi + * + * call_qcsapi set_ocac_duration \ <duration> + * + * Unless an error occurs, the output will be the string complete. + * + * \note: This API is deprecated and replaced with qcsapi_wifi_set_dfs_s_radio_duration. + */ +extern int qcsapi_wifi_set_ocac_duration(const char *ifname, uint16_t duration); + +/** + * \internal + * \brief Set the total time on off channel for a DFS channel. + * + * API sets the total time on off channel for a specified DFS channel + * Unit is in seconds. + * + * \param ifname \wifi0 + * \param cac_time total time on the specified DFS channel. + * + * \return 0 on success or negative values on error + * + * \callqcsapi + * + * call_qcsapi set_ocac_cac_time \ <cac_time> + * + * Unless an error occurs, the output will be the string complete. + * + * \note: This API is deprecated and replaced with qcsapi_wifi_set_dfs_s_radio_cac_time. + */ +extern int qcsapi_wifi_set_ocac_cac_time(const char *ifname, uint16_t cac_time); + +/** + * \internal + * \brief Set the off-channel CAC report only mode. + * + * API sets the off-channel CAC as report only mode, that means, don't switch channel + * after off-channel CAC is completed if report only mode is set. + * + * \param ifname \wifi0 + * \param enable 0 - disable report only mode, otherwise enable it. + * + * \return 0 on success or negative values on error + * + * \callqcsapi + * + * call_qcsapi set_ocac_report_only \ <1 or 0> + * + * Unless an error occurs, the output will be the string complete. + * + * \note: This API is deprecated and replaced with qcsapi_wifi_set_dfs_s_radio_report_only. + */ +extern int qcsapi_wifi_set_ocac_report_only(const char *ifname, uint16_t enable); + +/** + * \internal + * \brief Set the threshold values for OCAC feature. + * + * API sets the threshold for various parameters that control the off-channel CAC + * feature. Threshold affects the sensitivity of the feature. + * + * \param ifname \wifi0 + * \param param_name The threshold by name which is to be set + * \param threshold The value of the threshold to be set + * + * \return 0 on success or negative values on error + * + * \callqcsapi + * + * call_qcsapi set_ocac_thrshld \ <threshold_name> <value> + * threshold name is one of "fat", "traffic" and "cca_intf". + * "fat" means the free air time, and the threshold value is the percentage for the free air time. + * off-channel CAC can run when the current FAT is larger than this threshold. + * "traffic" is the traffic of local BSS, and the threshold value is the percentage for the local + * traffic time against the measurement time. off-channel CAC can run when the local traffic is + * less than the threshold value. + * "cca_intf" means the cca interference on off channel. AP can switch to the DFS channel after off + * channel CAC only when no radar is detected on this DFS channel and the cca interference on DFS + * channel is less than the threshold, which is the percentage for the interference traffic time + * against the measurement time. + * + * Unless an error occurs, the output will be the string complete. + * + * \note: This API is deprecated and replaced with qcsapi_wifi_set_dfs_s_radio_thrshld. + */ +extern int qcsapi_wifi_set_ocac_thrshld(const char *ifname, + const char *param_name, + uint16_t threshold); + +/** + * \brief Start DFS seamless entry. + * + * This API is used to start DFS seamless entry on a DFS channel.
+ * + * \param ifname \wifi0 + * \param channel specifies the DFS channel. 0 is to select DFS channel automatically. + * + * \return 0 on success or negative values on error. + * + * \callqcsapi + * + * call_qcsapi start_dfs_s_radio wifi0 {auto | \}
+ * + * Unless an error occurs, the output will be the string complete. + */ +extern int qcsapi_wifi_start_dfs_s_radio(const char *ifname, uint16_t channel); + +/** + * \brief Stop DFS seamless entry. + * + * This API is used to stop DFS seamless entry.
+ * + * \param ifname \wifi0 + * + * \return 0 on success or negative values on error + * + * \callqcsapi + * + * call_qcsapi stop_dfs_s_radio wifi0 + * + * Unless an error occurs, the output will be the string complete. + */ +extern int qcsapi_wifi_stop_dfs_s_radio(const char *ifname); + +/** + * \brief Get the current status of DFS seamless entry. + * + * This API return the current status of whether DFS seamless entry is started or not. + * + * \param ifname \wifi0 + * \param status value that contains if DFS seamless entry is enabled or not. + * + * \return 0 on success or negative values on error + * + * \callqcsapi + * + * call_qcsapi get_dfs_s_radio_status \ + * + * The output will be the word "Disabled" or "Enabled" unless an error occurs. + */ +extern int qcsapi_wifi_get_dfs_s_radio_status(const char *ifname, qcsapi_unsigned_int *status); + +/** + * \brief Get the current availability of DFS seamless entry. + * + * This API return the status of whether DFS seamless entry is available or not with the + * current configuration. + * + * \param ifname \wifi0 + * \param available value that contains if DFS seamless entry is available or unavailable. + * + * \return 0 on success or negative values on error + * + * \callqcsapi + * + * call_qcsapi get_dfs_s_radio_availability \ + * + * The output will be the word "Available" or "Unavailable" unless an error occurs. + */ +extern int qcsapi_wifi_get_dfs_s_radio_availability(const char *ifname, qcsapi_unsigned_int *available); + +/** + * \internal + * \brief Set the dwell time on off-channel for DFS seamless entry. + * + * API sets the dwell time for the DFS seamless entry feature, ie. the duration on + * off channel within a beacon interval. + * Unit is in milliseconds. + * + * \param ifname \wifi0 + * \param dwell_time Dwell time on off-channel in a beacon interval. + * + * \return 0 on success or negative values on error + * + * \callqcsapi + * + * call_qcsapi set_dfs_s_radio_dwell_time \ <dwelltime> + * + * Unless an error occurs, the output will be the string complete. + */ +extern int qcsapi_wifi_set_dfs_s_radio_dwell_time(const char *ifname, uint16_t dwell_time); + +/** + * \internal + * \brief Set the duration during which DFS seamless entry is running for a DFS channel. + * + * API sets the duration during which the DFS seamless entry is running for a specified + * DFS channel + * Unit is in seconds. + * + * \param ifname \wifi0 + * \param duration Duration for a specified DFS channel to run DFS seamless entry. + * + * \return 0 on success or negative values on error + * + * \callqcsapi + * + * call_qcsapi set_dfs_s_radio_duration \ <duration> + * + * Unless an error occurs, the output will be the string complete. + */ +extern int qcsapi_wifi_set_dfs_s_radio_duration(const char *ifname, uint16_t duration); + +/** + * \internal + * \brief Set the duration during which DFS seamless entry is running for a weather channel. + * + * API sets the duration during which the DFS seamless entry is running for a specified + * weather channel which is a DFS channel. + * Unit is in seconds. + * + * \param ifname \wifi0 + * \param duration Duration for a specified DFS channel to run DFS seamless entry. + * + * \return 0 on success or negative values on error + * + * \callqcsapi + * + * call_qcsapi set_dfs_s_radio_wea_duration \ <duration> + * + * Unless an error occurs, the output will be the string complete. + */ +extern int qcsapi_wifi_set_dfs_s_radio_wea_duration(const char *ifname, uint32_t duration); + +/** + * \internal + * \brief Set the total time on off channel for a DFS channel. + * + * API sets the total time on off channel for a specified DFS channel + * Unit is in seconds. + * + * \param ifname \wifi0 + * \param cac_time total time on the specified DFS channel. + * + * \return 0 on success or negative values on error + * + * \callqcsapi + * + * call_qcsapi set_dfs_s_radio_cac_time \ <cac_time> + * + * Unless an error occurs, the output will be the string complete. + */ +extern int qcsapi_wifi_set_dfs_s_radio_cac_time(const char *ifname, uint16_t cac_time); + +/** + * \internal + * \brief Set the total time on off channel for a weather channel. + * + * API sets the total time on off channel for a specified weather channel which is a DFS channel. + * Unit is in seconds. + * + * \param ifname \wifi0 + * \param cac_time total time on the specified DFS channel. + * + * \return 0 on success or negative values on error + * + * \callqcsapi + * + * call_qcsapi set_dfs_s_radio_wea_cac_time \ <cac_time> + * + * Unless an error occurs, the output will be the string complete. + */ +extern int qcsapi_wifi_set_dfs_s_radio_wea_cac_time(const char *ifname, uint32_t cac_time); + +/** + * \internal + * \brief Set the DFS seamless entry report only mode. + * + * API sets the DFS seamless entry as report only mode, that means, don't switch channel + * after DFS seamless entry is completed if report only mode is set. + * + * \param ifname \wifi0 + * \param enable 0 - disable report only mode, otherwise enable it. + * + * \return 0 on success or negative values on error + * + * \callqcsapi + * + * call_qcsapi set_dfs_s_radio_report_only \ <1 or 0> + * + * Unless an error occurs, the output will be the string complete. + */ +extern int qcsapi_wifi_set_dfs_s_radio_report_only(const char *ifname, uint16_t enable); + +/** + * \internal + * \brief Set the threshold values for DFS seamless entry. + * + * API sets the threshold for various parameters that control the DFS seamless entry. + * Threshold affects the sensitivity of the feature. + * + * \param ifname \wifi0 + * \param param_name The threshold by name which is to be set + * \param threshold The value of the threshold to be set + * + * \return 0 on success or negative values on error + * + * \callqcsapi + * + * call_qcsapi set_dfs_s_radio_thrshld \ <threshold_name> <value> + * threshold name is one of "fat", "traffic" and "cca_intf". + * "fat" means the free air time, and the threshold value is the percentage for the free air time. + * DFS seamless entry can run when the current FAT is larger than this threshold. + * "traffic" is the traffic of local BSS, and the threshold value is the percentage for the local + * traffic time against the measurement time. DFS seamless entry can run when the local traffic is + * less than the threshold value. + * "cca_intf" means the cca interference on off channel. AP can switch to the DFS channel after DFS + * seamless entry only when no radar is detected on this DFS channel and the cca interference on DFS + * channel is less than the threshold, which is the percentage for the interference traffic time + * against the measurement time. + * + * Unless an error occurs, the output will be the string complete. + */ +extern int qcsapi_wifi_set_dfs_s_radio_thrshld(const char *ifname, + const char *param_name, + uint16_t threshold); + +/**@}*/ + +/**@addtogroup APIInitializationAPIs + *@{*/ + +/** + * \brief Call to initialise the runtime for QCSAPI usage. + * + * This function is required to be called prior to any other QCSAPI function. + * + * To prevent concurrency issues, a multi-threaded application should call this function + * prior to creating additional threads. + * + * \return 0 if the configuration file path was updated successfully. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \note This function does not have a call_qcsapi equivalent call due to its nature. + */ +extern int qcsapi_init( void ); + +/** + * \brief Disconnect the program from the calling terminal. + * + * Often a process needs to run in background. Such a process is described as a daemon process. + * This API will force the process into background mode and disconnect from the controlling terminal or console. + * When such a process is run from the command line the effect of calling this API is immediately apparent, + * as the command line prompt will appear and another command can then be entered. + * + * Use this API for any process that starts as the WiFi device boots, and is expected to remain active until + * the device is halted or rebooted (eg, a long-running daemon process). + * + * \return 0 if the configuration file path was updated successfully. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \note This function does not have a call_qcsapi equivalent call due to its nature. + */ +extern int qcsapi_console_disconnect( void ); + +/**@}*/ + +/**@addtogroup SystemAPIs + *@{*/ + +/** + * \brief Start stateless board + * + * This API call triggers initial configuration of connected stateless board after all the + * parameters have been set. + * + * \return 0 on success. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \warning This API relies on the script '/scripts/start-prod' being present on the board to work. + * + * \callqcsapi + * + * call_qcsapi startprod \ + * + * Unless an error occurs, the output will be the string complete. + */ +extern int qcsapi_wifi_startprod( void ); + +/** + * \brief Get the status of the script start-prod. + * + * This API call returns the status of the script start-prod. + * + * \param p_status return parameter to contain the value indicates the status of the script start-prod, + * 0 if the script start-prod has not finished or not executed, and 1 if the script start-prod has finished. + * + * \return 0 on success. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi is_startprod_done + * + * Unless an error occurs, the output will be "0" or "1" which means the status of the script start-prod. + */ +extern int qcsapi_is_startprod_done( int *p_status ); + +/** + * \brief Get the time since the system started up. + * + * This function is used to determine system uptime. + * + * \param p_elapsed_time return parameter to store the system uptime (number of seconds since boot). + * + * \return 0 if the configuration file path was updated successfully. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi get_time_since_start + * + * The output will be the time in seconds since the system started up, or an error string. + */ +extern int qcsapi_system_get_time_since_start(qcsapi_unsigned_int *p_elapsed_time); + + +/** + * \brief Get system status. + * + * This function is used to get system status. + * + * \param p_status return parameter to store the system status. + * It is in bit-mask format, each bit represents different status. + * Possiable values are defined here @ref QCSAPI_GET_SYSTEM_STATUS + * + * \return 0 if get status successfully. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi get_system_status + */ +extern int qcsapi_get_system_status(qcsapi_unsigned_int *p_status); + + +/** + * \brief Get pseudorandom data from /dev/urandom. + * + * Get pseudorandom data from /dev/urandom. It can be used to store random seed across reboots. + * + * \param random_buf 512 bytes buffer to store random data + * + * \return 0 if no error occurred + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi get_random_seed + * + * The output will be 512 bytes of random data from /dev/urandom similar to cat /dev/urandom + */ +extern int qcsapi_get_random_seed(struct qcsapi_data_512bytes *random_buf); + +/** + * \brief Feed Linux PRNG with new seed. + * + * Add random buffer to Linux PRNG entropy pool as well as update entropy count with an estimation + * of added entropy. + * + * \param random_buf 512 bytes buffer of random data + * \param entropy added entropy estimation + * + * \return 0 if no error occurred + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi set_random_seed + * + * Unless an error occurs, the output will be the string complete. + * + * \note call_qcsapi command line interface is not suitable for setting binary data + * and only provided as an example, a better way is to read random buffer from a file. + */ +extern int qcsapi_set_random_seed(const struct qcsapi_data_512bytes *random_buf, + const qcsapi_unsigned_int entropy); + +/** + * \brief get carrier ID + * + * This API call is used to retrieve current carrier ID which is taking effect. + * + * \param p_carrier_id + * + * \return >= 0 on success, < 0 on error. + * + * \callqcsapi + * + * call_qcsapi get_carrier_id + * + * Unless an error occurs, the output will be the carrier ID. + */ +extern int qcsapi_get_carrier_id(qcsapi_unsigned_int *p_carrier_id); + +/** + * \brief Set carrier ID. + * + * This API call is used to interprete the carrier ID to a set of configurations + * and write the setting carrier ID back to uboot according to the second parameter. + * + * \param carrier_id + * \param update_uboot whether it is needed to write the carrier ID back to uboot env. + * + * \return 0 on success or negative values on error + * + * \callqcsapi + * + * call_qcsapi set_carrier_id \ \ + * + * Unless an error occurs, the output will be the string complete. + */ +extern int qcsapi_set_carrier_id(uint32_t carrier_id, uint32_t update_uboot); + +/** + * \brief get spinor jedecid. + * + * This API get the spinor flash jedec id. + * + * \param ifname \wifi0 + * + * \return >= 0 on success, < 0 on error. + * + * Unless an error occurs, the output will be the jedec id. + * + * \call_qcsapi + * + * call_qcsapi get_spinor_jedecid \ + */ +extern int qcsapi_wifi_get_spinor_jedecid(const char * ifname, unsigned int * p_jedecid); + +/** + * \brief get bb param. + * + * This API get the bb param. + * + * \param ifname \wifi0 + * + * \return >= 0 on success, < 0 on error. + * + * Unless an error occurs, the output will be the status of lock detect function enabled . + * + * \call_qcsapi + * + * call_qcsapi get_bb_param\ + */ +extern int qcsapi_wifi_get_bb_param(const char * ifname, unsigned int * p_jedecid); +/** + * \brief set bb param. + * + * This API set the bb param. + * + * \param ifname \wifi0 + * + * \return >= 0 on success, < 0 on error. + * + * Unless an error occurs, the output will be 1 (enabled) or 0 (disabled) + * + * \call_qcsapi + * + * call_qcsapi set_bb_param \ + */ +extern int qcsapi_wifi_set_bb_param(const char * ifname, const qcsapi_unsigned_int p_jedecid); + +/** + * \brief enable rx optim packet stats. + * + * This API enable rx optim packet stats. + * + * \param ifname \wifi0 + * + * \return >= 0 on success, < 0 on error. + * + * Unless an error occurs, the output will be 1 (enabled) or 0 (disabled) + * + * \call_qcsapi + * + * call_qcsapi set_optim_stats \ + */ +extern int qcsapi_wifi_set_optim_stats(const char * ifname, const qcsapi_unsigned_int p_jedecid); + +/** + * \brief set system time + * + * This API sets system time. + * + * \param timestamp seconds since the epoch, 1970-01-01 00:00:00 +0000 (UTC) + * + * \return >= 0 on success, < 0 on error. + * + * Unless an error occurs, the output will be complete. + * + * \call_qcsapi + * + * call_qcsapi set_sys_time \ + */ +extern int qcsapi_wifi_set_sys_time(const uint32_t timestamp); + +/** + * \brief get system time + * + * This API gets system time. + * + * \param timestamp buffer for returned timestamp + * + * \return >= 0 on success, < 0 on error. + * + * Unless an error occurs, the output will be the current system time in seconds since the Epoch, + * 1970-01-01 00:00:00 +0000 (UTC). + * + * \call_qcsapi + * + * call_qcsapi get_sys_time + */ +extern int qcsapi_wifi_get_sys_time(uint32_t *timestamp); + +/** + * @brief Set the mac addr of the SOC board. + * + * This API sets the SOC's mac addr of the STB to the wlan, then the mac addr will be stored for use. + * + * \param ifname the interface to perform the action on. + * \param soc_mac_addr the mac addr to set + * + * call_qcsapi interface: + * + * call_qcsapi set_soc_macaddr \ \ + * + * Unless an error occurs, the output will be the string complete. + */ +extern int qcsapi_set_soc_mac_addr(const char *ifname, const qcsapi_mac_addr soc_mac_addr); + +/** + * @brief Get a custom value. + * + * This API returns the value of a custom key contained in a file named /etc/custom/key. + * + * \note The filename must not have the substring '..' as any part or the filename + * will be rejected as invalid. + * + * \param custom_key The custom key name + * \param custom_value A buffer in which to store the returned value, which must be at least 129 bytes. + * The value will be truncated if longer than 128 characters. + * + * \return 0 if the custom key is valid and contians a valid value + * \return -qcsapi_configuration_error if the custom key has not been defined + * \return -qcsapi_configuration_error if the key includes the string ".." + * \return -qcsapi_configuration_error if the custom key value is an empty string + * + * \callqcsapi + * + * call_qcsapi get_custom_value \ + * + * Unless an error occurs, the output will be the custom key value. + */ +extern int qcsapi_get_custom_value(const char *custom_key, string_128 custom_value); + +/**@}*/ + +/**@addtogroup ParameterConfAPIs + *@{*/ + +/** + * \brief Get a persistent configuration parameter + * + * Get a persistent configuration parameter. + * + * \param ifname \wifi0 + * \param param_name the parameter to be retrieved + * \param param_value a pointer to the buffer for storing the returned value + * \param max_param_len the size of the buffer + * + * \return 0 if the parameter was returned. + * \return -qcsapi_parameter_not_found if the parameter was not found. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi get_config_param \ \ + * + * or + * + * call_qcsapi get_persistent_param \ \ + * + * The output will be the parameter value unless an error occurs or the parameter is not found. + */ +extern int qcsapi_config_get_parameter(const char *ifname, + const char *param_name, + char *param_value, + const size_t max_param_len); + +/** + * \brief Update a persistent config parameter + * + * Set a persistent configuration parameter. The parameter is added if it does not already exist. + * + * All real work for this API is done in the update_wifi_config script, as explained above. + * + * Unlike most APIs, this one will spawn a subprocess. If for any reason the process + * table is full, this API will fail with unpredictable results. + * + * \param ifname \wifi0 + * \param param_name the parameter to be created or updated + * \param param_value a pointer to a buffer containing the null-terminated parameter value + * string + * + * \return 0 if the parameter was set. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi update_config_param \ \ \ + * + * or + * + * call_qcsapi update_persistent_param \ \ \ + * + * Unless an error occurs, the output will be the string complete. + * + * Examples + * + * To set the WiFi mode to AP, enter: + * + * call_qcsapi update_persistent_param wifi0 mode ap + * + * To set the WiFi channel to 36 (only effective on an AP), enter: + * + * call_qcsapi update_persistent_param wifi0 channel 36 + * + * In each case the device will need to be rebooted for the change to take effect. + * + */ +extern int qcsapi_config_update_parameter(const char *ifname, + const char *param_name, + const char *param_value); +/**@}*/ + +/**@addtogroup ParameterConfAPIs + *@{*/ + +/** + * \brief Get a MBSS persistent configuration parameter + * + * Get a MBSS persistent configuration parameter. + * + * \param ifname wireless interface e.g wifi1 + * \param param_name the parameter to be retrieved + * \param param_value a pointer to the buffer for storing the returned value + * \param max_param_len the size of the buffer + * + * \return 0 if the parameter was returned. + * \return -qcsapi_parameter_not_found if the parameter was not found. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi get_persistent_ssid_param \ \ + * + * The output will be the parameter value unless an error occurs or the parameter is not found. + */ +extern int qcsapi_config_get_ssid_parameter(const char *ifname, + const char *param_name, + char *param_value, + const size_t max_param_len); +/** + * \brief Update a MBSS persistent config parameter + * + * Set a persistent configuration parameter. The parameter is added if it does not already exist. + * + * All real work for this API is done in the update_per_ssid_config script, as explained above. + * + * Unlike most APIs, this one will spawn a subprocess. If for any reason the process + * table is full, this API will fail with unpredictable results. + * + * \param ifname wireless interface e.g wifi1 + * \param param_name the parameter to be created or updated + * \param param_value a pointer to a buffer containing the null-terminated parameter value + * string + * + * \return 0 if the parameter was set. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi update_persistenti_ssid_param \ \ \ + * + * Unless an error occurs, the output will be the string complete. + * + * Examples + * + * To set the WIFI1's priority to AP, enter: + * + * call_qcsapi update_persistent_ssid_param wifi1 priority 3 + * + * In each case the device will need to be rebooted for the change to take effect. + * + */ +extern int qcsapi_config_update_ssid_parameter(const char *ifname, + const char *param_name, + const char *param_value); +/**@}*/ + + +/**@addtogroup FilePathAPIs + *@{*/ + +/** + * \brief Get the configuration file path. + * + * Reports the location associated with the configuration file path for the security files. + * + * \param e_file_path should be the symbolic value qcsapi_security_configuration_path + * \param file_path return parameter to contain the configuration file path to the security files. + * \param path_size the size of the file_path parameter above. + * + * \return 0 if the configuration file path was set in the file_path parameter. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi get_file_path security + * + * The command should be entered exactly as shown above. The output is the current configured path to the security files. + */ +extern int qcsapi_file_path_get_config(const qcsapi_file_path_config e_file_path, + char *file_path, + qcsapi_unsigned_int path_size); + +/** + * @brief Update the location associated with the configuration file path. + * + * Updates the location associated with the file path configuration. + * + * \param e_file_path Use the symbolic value qcsapi_security_configuration_path. + * \param new_path A NULL terminated string for the new path to set. + * + * \return 0 if the configuration file path was updated successfully. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \note The presence or validity of the file path is NOT checked. + * + * \note This API is only available in calibration mode (see @ref mysection4_1_5 "Production mode vs calibration mode"). + * + * \callqcsapi + * + * call_qcsapi set_file_path security \ + * + * As this is a set API, the output from call_qcsapi is complete, unless an error occurs. + * + * \warning Power should not be turned off to the WiFi device when calling the set file path config API or immediately afterwards. + * Failure to follow this restriction can cause the flash memory on the board to get corrupted. + * If power needs to be turned off to the WiFi device when working with this API, enter the "halt" command first and wait for the device to shut down. + * This API should only be called when initially configuring the board. + */ +extern int qcsapi_file_path_set_config( const qcsapi_file_path_config e_file_path, const char *new_path ); + +/** + * \brief Restore the default configuration files. + * + * This API call restores the board to its default (factory) configuration. + * + * After this call, the current configurations on the board will be replaced with the default + * values as in the flash image. + * + * \param flag flag specifies optional operation when restore to default configuration. + * It is a bitmap parameter which can be combination of Macros described below. + * \return 0 this call always succeeds. + * + * There are Macros predefined for the parameter 'flag' as below. + * @code + * QCSAPI_RESTORE_FG_IP -- Restore IP address to default. + * QCSAPI_RESTORE_FG_NOREBOOT -- Don't reboot device. + * QCSAPI_RESTORE_FG_AP -- Restore to AP mode. + * QCSAPI_RESTORE_FG_STA -- Restore to Station mode. + * @endcode + * + * \callqcsapi + * + * call_qcsapi restore_default_config [0 | 1] [ap | sta] [noreboot] [ip] + * + * \warning This call will wipe out any configured parameters and replace them with the default + * values as per a factory configured board. + * + * \note This API requires the script /scripts/restore_default_config to be present on the filesystem. + */ +extern int qcsapi_restore_default_config( int flag ); + +/**@}*/ + + +/**@addtogroup NetInterfaceAPIs + *@{*/ +/*following functions in mygroup4: Network Interface APIs*/ + +/** + * \brief Stores IP address in a persistent storage. + * + * Stores IP address of the primary bridge interface in a file system. It will be used on reboot + * or on stateless initialization after startprod invocation. + * + * \param ipaddr IPv4 address + * \param netmask Network mask + * + * \return 0 if the call succeeded. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi store_ipaddr ipaddr/netmask + * + * Unless an error occurs, the output will be the string complete. + */ +extern int qcsapi_store_ipaddr(qcsapi_unsigned_int ipaddr, qcsapi_unsigned_int netmask); + +/** + * @brief Enable or disable an interface. + * + * Enable (or disable) an interface. Use qcsapi_interface_get_status to establish + * whether an interface is enabled or disabled.
+ * + * \param ifname \wifi0 + * \param enable_flag if 0, disable the interface, else enable the interface. + * + * \return 0 if the interface was successfully enabled or disabled. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi enable_interface \ \<0 | 1\> + * + * Unless an error occurs, the output will be the string complete. + * + * See @ref mysection4_1_4 "QCSAPI Return Values" for error codes and messages. + * + * Examples: + * + * To enable the ethernet interface eth1_0: + * + * call_qcsapi enable_interface eth1_0 1 + * + * To disable the WiFi interface wifi0: + * + * call_qcsapi enable_interface wifi0 0 + * + * \sa qcsapi_interface_get_status + */ +extern int qcsapi_interface_enable( const char *ifname, const int enable_flag ); + +/** + * @brief Get an interface status. + * + * Determine whether an interface is enabled (up) or disabled (down). + * + * \param ifname \wifi0 + * \param interface_status return parameter to indicate the interface status. + * + * \return 0 if the interface was successfully enabled or disabled. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi get_status \ + * + * Output is one of the words up, disabled or error; or an error message. + * + * Examples: + * + * To report the ethernet interface eth1_0, enter: + * + * call_qcsapi get_status eth1_0 + * + * To report the WiFi interface status of wifi0, enter: + * + * call_qcsapi get_status wifi0 + */ +extern int qcsapi_interface_get_status( const char *ifname, char *interface_status ); + +/** + * @brief Set an interface IP address or netmask. + * + * Setup Ip address or netmask of the interfaces. + * + * \param ifname + * \param ipaddr|netmask + * \param ip_val|netmask_val Value of ipaddress or netmask to set the interface. + * + * \return 0 if set the interface Ipaddress or netmask. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi set_ip \ + * + * Output is complete message or an error message. + * + * To Set the Ip address of br0 interface, enter: + * + * call_qcsapi set_ip br0 ipaddr ip_val + */ +extern int qcsapi_interface_set_ip4( const char *ifname, const char *if_param, uint32_t if_param_val); + +/** + * @brief Get an interface IP Address and netmask. + * + * Determine Ip address and netmask of the interface. + * + * \param ifname + * \param ipaddr/netmask return parameter to show the interface IP Aaddress or netmask. + * + * \return 0 if get the interface IP Address or netmask. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi get_ip \ + * + * Output is Ip Address or netmask of the interface or an error message. + * + * To get netmask of br0 interface, enter: + * + * call_qcsapi get_ip br0 netmask + * + * To get the Ip address and netmask of bridge interface br0, enter: + * + * call_qcsapi get_ip br0 + */ +extern int qcsapi_interface_get_ip4( const char *ifname, const char *if_param, string_64 if_param_val); + +/** + * @brief Get statistics from an interface. + * + * This API call returns statistics for a given interface, and given counter. + * + * Per the TR-098 standard, all counters are represented as 32-bit unsigned integers. + * + * \note Be aware that rollover is quite possible, especially with counters reporting the number of bytes transferred. + * + * \param ifname \wifi0 + * \param qcsapi_counter one of the enumerations from the typedef struct qcsapi_counter_type (see the following table). + * \param p_counter_value return parameter to contain the counter value. + * + * \return 0 if the value in p_counter_value is successfully filled in with the correct counter. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi get_counter \ \ + * + * Valid counter names are listed in the following table: + * + * + * + * + * + * + * + * + * + * + * + *
Scripting name\n(call_qcsapi) C-language enum Description
tx_bytes qcsapi_total_bytes_sent The number of bytes transmitted
rx_bytes qcsapi_total_bytes_received The number of bytes received
tx_packets qcsapi_total_packets_sent The number of packets transmitted
rx_packets qcsapi_total_packets_received The number of packets received
tx_discard qcsapi_discard_packets_sent The number of packets discarded on transmit
rx_discard qcsapi_discard_packets_received The number of packets discarded on receive
tx_errors qcsapi_error_packets_sent The number of packets in error on transmit
rx_errors qcsapi_error_packets_received The number of packets in error on receive
+ * + * \sa typedef enum qcsapi_counter_type + */ +extern int qcsapi_interface_get_counter(const char *ifname, + qcsapi_counter_type qcsapi_counter, + qcsapi_unsigned_int *p_counter_value); + +/** + * @brief Get statistics from an interface. + * + * This API call returns statistics for a given interface, and given counter. + * + * It is same with API qcsapi_interface_get_counter, except that it returns a 64 bit value. + * + * \sa qcsapi_interface_get_counter + */ +extern int qcsapi_interface_get_counter64(const char *ifname, + qcsapi_counter_type qcsapi_counter, + uint64_t *p_counter_value); + +/** + * @brief Get the MAC address of an interface. + * + * Returns the MAC address of the interface. For a WiFi device operating in STA mode, this will be different from the BSSID. + * + * \param ifname \wifi0 + * \param current_mac_addr return parameter to contain the MAC address. + * + * \return 0 if the value in current_mac_addr is successfully filled in with the correct value. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi get_mac_addr \ + * + * Output is the MAC address for the interface, displayed in standard format, i.e. with each byte shown as a 2 digit hexadecimal value, + * separated by colons, OR an error message. + * + * Example MAC address: 02:51:55:41:00:4C. See @ref mysection5_1_1 "Format for a MAC address" for details of formatting MAC + * addresses. + */ +extern int qcsapi_interface_get_mac_addr( const char *ifname, qcsapi_mac_addr current_mac_addr ); + +/** + * @brief Set the MAC address of an interface. + * + * Set the MAC address of the interface. + * + * \param ifname \wifi0 + * \param interface_mac_addr parameter to contain the desired MAC address. + * + * \return 0 if the value in interface_mac_addr is successfully set with the correct value. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi set_mac_addr \ + * + * Unless an error occurs, the output will be the string complete. + * + * Example MAC address: 02:51:55:41:00:4C. See @ref mysection5_1_1 "Format for a MAC address" for details of formatting MAC + * addresses. + * + *\note This API needs a system reboot for the MAC address to take effect. + */ +extern int qcsapi_interface_set_mac_addr( const char *ifname, const qcsapi_mac_addr interface_mac_addr ); + +/** + * \brief Get the Value of a Performance Monitoring Counter. + * + * Selected counters are available as Performance Monitor (PM) counters. A PM counter is tied to a PM interval, 15 minutes + * or 24 hours. The PM counter records the change in the counter since the start of the current + * PM interval. (The Get PM Interval Elapsed Time API reports how much time has elapsed in the + * current PM interval.) + * + * \param ifname \wifi0 + * \param qcsapi_counter one of the enumerations from the typedef struct qcsapi_counter_type + * \param pm_interval the PM interval, either "15_min" or "24_hr" + * \param p_counter_value return parameter to contain the counter value. + * + * \return 0 if the value in p_counter_value is successfully filled in with the correct counter. + * \return A negative value if an error occurred. + * + * \callqcsapi + * + * call_qcsapi get_pm_counter \ \ \ + * + * See @ref mysection4_1_4 "QCSAPI Return Values" for error codes and messages. + */ + +extern int qcsapi_pm_get_counter(const char *ifname, + qcsapi_counter_type qcsapi_counter, + const char *pm_interval, + qcsapi_unsigned_int *p_counter_value); +/**@}*/ + +/**@addtogroup PowerAPIs + *@{*/ + +/** + * \brief enable/disable L1 state for the ASPM of PCIE. + * + * when enabling the L1 state, the latency time can be set with parameter(0 ~ 6) for L1 entry. + * 0 - 1us + * 1 - 2us + * 2 - 4us + * 3 - 8us + * 4 - 16us + * 5 - 32us + * 6 - 64us + * + * \param enable 0/1 + * \param latency - time for L1 entry + * + * \return 0 if success. + * \return A negative value if an error occurred. + * + * \callqcsapi + * + * call_qcsapi set_aspm_l1 \ \ + * + * See @ref mysection4_1_4 "QCSAPI Return Values" for error codes and messages. + */ +extern int qcsapi_set_aspm_l1( int enable, int latency); + +/** + * \brief enter/exit L1 state of PCIE link. + * + * \param enter 0/1 + * + * \return 0 if success. + * \return A negative value if an error occurred. + * + * \callqcsapi + * + * call_qcsapi set_l1 \ + * + * See @ref mysection4_1_4 "QCSAPI Return Values" for error codes and messages. + */ +extern int qcsapi_set_l1( int enter ); +/**@}*/ + +/**@addtogroup NetInterfaceAPIs + *@{*/ +/** + * \brief Get the Elapsed Time in the current PM Interval + * + * Returns the amount of time in seconds that has elapsed since the start of the referenced + * PM interval. PM Intervals last either 15 minutes (900 seconds) or 24 hours (86400 seconds). + * + * \param pm_interval the PM interval, either "15_min" or "24_hr" + * \param p_elapsed_time return parameter to contain the elapsed time in seconds. + * + * \return 0 if the value in p_elapsed_time is successfully filled in with the elapsed time. + * \return A negative value if an error occurred. + * + * \callqcsapi + * + * call_qcsapi get_pm_elapsed_time \ + * + * See @ref mysection4_1_4 "QCSAPI Return Values" for error codes and messages. + */ + +extern int qcsapi_pm_get_elapsed_time(const char *pm_interval, + qcsapi_unsigned_int *p_elapsed_time); + +/** + * @brief power on or power off the ethernet PHY. + * + * Power off / on eth PHY. Use qcsapi_eth_phy_power_control to establish + * power on or off the eth PHY.
+ * + * \param on_off if 1, power off the PHY, else power on the PHY. + * \param interface the interface name of the eth device + * + * \return 0 if the eth PHY was successfully power off or power on. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi eth_phy_power_off \ \<0 | 1\> + * + * Unless an error occurs, the output will be the string complete. + * + * See @ref mysection4_1_4 "QCSAPI Return Values" for error codes and messages. + * + * Examples: + * + * To power off the PHY of interface eth1_0: + * + * call_qcsapi eth_phy_power_off eth1_0 1 + */ +extern int qcsapi_eth_phy_power_control(int on_off, const char *interface); + +/** + * @brief Get EMAC switch connectivity. + * + * This function determines if the EMACs on the board have switch functionality enabled. That is, + * whether traffic can be switched between devices connected directly to each port directly. + * + * \param buf return value of the EMAC switch connectivity. + * 1 - switch functionality is enabled; 0 - switch functionality is disabled. + * + * + * \return 0 on success. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi get_emac_switch + * + * Unless an error occurs, the output will be the value of communications between EMAC 0 and EMAC 1 + * + * See @ref mysection4_1_4 "QCSAPI Return Values" for error codes and messages. + */ +extern int qcsapi_get_emac_switch(char *buf); + +/** + * @brief Set EMAC switch connectivity. + * + * This function sets EMAC switch connectivity. + * + * \param value if 0, enabling emac switch functionality, else disabling emac switch functionality. + * + * \return 0 if the emac switch functionality successfully disabled or enabled. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi set_emac_switch \<0 | 1\> + * + * Unless an error occurs, the output will be the string complete. + * + * See @ref mysection4_1_4 "QCSAPI Return Values" for error codes and messages. + * + * Examples: + * + * To disable emac switch functionality: + * + * call_qcsapi set_emac_switch 1 + */ +extern int qcsapi_set_emac_switch(qcsapi_emac_switch value); + +/** + * \brief Prioritizing Traffic in EMAC 0 and EMAC 1 using DSCP Commands + * + * To set and get DSCP priority values in EMAC0 and EMAC1 + * + * \param eth_type type of the ethernet device. It should be emac0 or emac1 + * \param level the dscp level, level range should not be negative and less than 64 + * \param value the dscp priority value, value range should not be negative and less than 16 + * \param buf a pointer to the buffer for storing the returned value + * \param size buf variable size + * + * \return 0 if the command succeeded. + * \return A negative value if an error occurred. + * + * \callqcsapi + * + * call_qcsapi eth_dscp_map \ \ [level] [value] + * + * See @ref mysection4_1_4 "QCSAPI Return Values" for error codes and messages. + */ +extern int qcsapi_eth_dscp_map(qcsapi_eth_dscp_oper oper, + const char *eth_type, + const char *level, + const char *value, + char * buf, + const unsigned int size); + +/** + * \brief get Ethernet interface information + * + * This API gets Ethernet interface information, including link/speed/duplex/auto-negotiation. + * + * \param ifname Ehternet interface name - e.g. eth1_0 + * \param eth_info_type "link", "speed", "duplex" or "autoneg" + * + * \return 0 if the command succeeded. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \call_qcsapi + * + * call_qcsapi get_eth_info \ { link | speed | duplex | autoneg } + */ +extern int qcsapi_get_eth_info(const char * ifname, const qcsapi_eth_info_type eth_info_type); + +/**@}*/ + + + +/**\addtogroup WiFiAPIs + *@{*/ +/*following functions in mygroup5: WiFi API*/ + +/** + * @brief Get the WiFi mode of the interface. + * + * Determine what mode the WiFi interface is operating in, access point or station. + * + * \param ifname \wifi0 + * \param p_wifi_mode return parameter to contain the operational mode of the interface. + * + * \return 0 if the value in p_wifi_mode is successfully filled in with the correct value. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi get_mode \ + * + * Output is either Access Point or Station, unless an error occurs. + */ +extern int qcsapi_wifi_get_mode( const char *ifname, qcsapi_wifi_mode *p_wifi_mode ); + +/** + * @brief Set the WiFi mode of the interface. + * + * Sets the mode for the WiFi interface. + * + * \note As a side effect of this API call, a new network interface may be created. + * + * The API will fail if the referenced interface already exists. + * + * \param ifname \wifi0 + * \param new_wifi_mode the wifi mode to set the interface to. + * + * \return 0 if the WiFi interface mode is set successfully. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi set_mode \ \ + * + * Unless an error occurs, the output will be the string complete. + */ +extern int qcsapi_wifi_set_mode( const char *ifname, const qcsapi_wifi_mode new_wifi_mode ); + +/** + * @brief Get the current mode of the WLAN interface. + * + * Determine what mode the WLAN interface is operating in. + * + * \param ifname \wifi0 + * \param p_wifi_phy_mode return parameter to contain the current phy mode of the interface. + * + * \return 0 if the value in p_wifi_phy_mode is filled the correct value. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi get_phy_mode \ + * + * Output is either 11a or 11na or 11b or 11g or 11ng + or 11ac or 11acEdge+ or 11acEdge- or 11acCntr+ or 11acCntr-, unless an error occurs. + */ +extern int qcsapi_wifi_get_phy_mode( const char *ifname, char *p_wifi_phy_mode ); + +/** + * @brief Set the phy mode of the WLAN interface. + * + * Sets the phy mode for the WiFi interface. + * + * \param ifname \wifi0 + * \param new_phy_mode the wifi phy mode to set the interface to. + * + * \return 0 if the WiFi interface phy mode is set successfully. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi set_phy_mode \ \<11b | 11a | 11g | 11na | 11ng | 11ac | 11acEdge+ + | 11acEdge- | 11acCntrl+ | 11acCntrl- \> + * + * Unless an error occurs, the output will be the string complete. + */ +extern int qcsapi_wifi_set_phy_mode( const char *ifname, const char *new_phy_mode ); + +/** + * @brief Reload the interface to change its mode (AP->STA or STA->AP). + * + * This function will delete the interface and other WDS vaps that may exist, then recreate the interface in the requested mode, + * and perform all necessary initialization. + * + * This API is used for switching between AP and STA modes without rebooting. + * + * \note \primarywifi + * + * \param ifname \wifi0only + * \param new_wifi_mode the new wifi mode to set the interface to. + * + * \return 0 if the WiFi interface mode is changed successfully. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi reload_in_mode \ \ + * + * Unless an error occurs, the output will be the string complete. + */ +extern int qcsapi_wifi_reload_in_mode( const char *ifname, const qcsapi_wifi_mode new_wifi_mode ); + +/** + * \brief Enable or disable Radio(RF). + * + * This API call enables or disables the Radio. Disabling the radio + * kills the daemon process wpa_supplicant or hostapd, + * in addition to bring the RF down. + * + * \param onoff if zero, turn the RF off, else turn the RF + * on. + * + * \return 0 on success. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \warning This API relies on the script '/scripts/rfenable' being present on the board to work. + * + * \callqcsapi + * + * call_qcsapi rfenable <0 | 1> + * + * Unless an error occurs, the output will be the string complete. + */ +extern int qcsapi_wifi_rfenable( const qcsapi_unsigned_int onoff ); + +/** + * \brief Get the current radio status. + * + * This API call returns the current status of the device radio. + * + * \param onoff a pointer to the buffer for storing the returned value + * + * \return 0 on success. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \warning This API relies on the script '/scripts/rfstatus' being present on the board to work. + * + * \callqcsapi + * + * call_qcsapi rfstatus + * + * Unless an error occurs, the output will be the current status of radio. + */ +extern int qcsapi_wifi_rfstatus( qcsapi_unsigned_int *rfstatus ); + +/** + * @brief Get the WiFi interface bandwidth (20MHz or 40MHz). + * + * Return the configured bandwidth, as specified in the 802.11n standard, either 20 MHz or 40 MHz. + * + * Returned value is in MHz, either 20 40, or 80. + * + * \note \primarywifi + * + * \param ifname \wifi0only + * \param p_bw return parameter to contain the bandwidth the interface is working in (20, 40 or 80) + * + * \return 0 on success. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi get_bw \ + * + * Unless an error occurs, the output will be the current bandwidth configuration, either 20, 40 or 80. + * + * \sa qcsapi_wifi_set_bw + * \sa qcsapi_wifi_set_vht + */ +extern int qcsapi_wifi_get_bw( const char *ifname, qcsapi_unsigned_int *p_bw ); + +/** + * @brief Set the WiFi interface bandwidth. + * + * Use this API to set the bandwidth during system startup, before calling the Enable Interface API for the WiFi device. + * + * Bandwidth can be either 40MHz or 20MHz. + * + * \note \primarywifi + * + * If the bandwidth is set to 20MHz, any associations will have a bandwidth limited to 20 MHz. + * If the bandwidth is set to 40MHz, an association will default to a bandwidth of 40 MHz (if the peer supports this). + * If the bandwidth is set to 80MHz, an association will default to a bandwidth of 80 MHz (if the peer supports this). + * + * \param ifname \wifi0only + * \param bw the bandwith to set the device to. + * + * \note 80MHz bandwidth is only supported in 802.11ac mode. 802.11ac mode is set using qcsapi_wifi_set_vht + * + * \callqcsapi + * + * call_qcsapi set_bw \ \<80 | 40 | 20\> + * + * Unless an error occurs, the output will be the string complete. + * + * \sa qcsapi_wifi_set_vht + */ +extern int qcsapi_wifi_set_bw( const char *ifname, const qcsapi_unsigned_int bw ); + +/** + * \brief set vht + * + * This API call is used to set vht mode to enable 802.11ac operation. + * + * \param ifname \wifi0 + * + * \return >= 0 on success, < 0 on error. If success, stats contains + * + * \note The bandwidth to use is set independently, using qcsapi_wifi_set_bw + * + * \callqcsapi + * + * call_qcsapi set_vht \ \<0 | 1\> + * + * \sa qcsapi_wifi_set_bw + */ +extern int qcsapi_wifi_set_vht( const char *ifname, const qcsapi_unsigned_int the_vht ); + +/** + * \brief get vht + * + * This API call is used to get vht mode. + * + * \param ifname \wifi0 + * + * \return >= 0 on success, < 0 on error. + * + * Unless an error occurs, the output will be 1 (enabled) or 0 (disabled) + * + * \callqcsapi + * + * call_qcsapi get_vht \ + */ +extern int qcsapi_wifi_get_vht( const char *ifname, qcsapi_unsigned_int *vht ); + +/** + * \brief Get the current channel. + * + * Get the current channel number. + * + * \note \primarywifi + * + * \param ifname \wifi0only + * \param p_current_channel a pointer to the buffer for storing the returned value + * + * \return 0 if the channel number was returned. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. If the channel has not been set properly, this API can + * return -ERANGE, numeric value out of range. + * + * \callqcsapi + * + * call_qcsapi get_channel \ + * + * The output will be the channel number unless an error occurs. + */ +extern int qcsapi_wifi_get_channel( const char *ifname, qcsapi_unsigned_int *p_current_channel ); + +/** + * \brief Set the current channel. + * + * Set the current channel. + * + * \note \primarywifi + * \note The channel can only be set when the interface is up. + * + * \param ifname \wifi0only + * \param new_channel the new channel to be used + * + * \return 0 if the channel number was returned. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. If the channel has not been set properly, this API can + * return -ERANGE, numeric value out of range. + * + * The new channel must be between 1 and 255, and is further restricted by the 802.11 + * standard. + * + * This is an engineering API, since it does not account for regulatory requirements. Use + * of this API can cause the system to violate regulatory requirements. Use of the Set + * Regulatory Channel API is recommended. + * + * \callqcsapi + * + * call_qcsapi set_channel \ \ + * + * Unless an error occurs, the output will be the string complete. + */ +extern int qcsapi_wifi_set_channel( const char *ifname, const qcsapi_unsigned_int new_channel ); + +/** + * \brief Set the channel inactive flag of primary channel. + * + * Specify whether the channel can be used as primary channel or not. + * + * \note \primarywifi + * + * \param ifname \wifi0only + * \param channel the channel to change the inactive flag + * \param inactive the flag whether it can be used as primary channel or not + * + * \return 0 if the channel number was returned. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * The channel must be between 1 and 255, and is further restricted by the 802.11 + * standard. + * + * The inactive flag must be either 0 or 1. + * + * \callqcsapi + * + * call_qcsapi set_chan_pri_inactive \ \ \ + * + * If inactive flag is not specified, default is 1. + * + * Unless an error occurs, the output will be the string complete. + */ +extern int qcsapi_wifi_set_chan_pri_inactive( const char *ifname, const qcsapi_unsigned_int channel, const qcsapi_unsigned_int inactive); + +/** + * \brief Set the channel disabled/enabled. + * + * Specify the channel can be used or not, this API can only be used during start-up period. + * + * \note \primarywifi + * + * \param ifname \wifi0only + * \param chans point to array of channels. + * \param cnt the number of channels + * \param flag indication of enabling or disabling channels, 0: enable, 1: disable + * + * \return 0 if the channel number was returned. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * The chans must be between -255 and 255, and the absolute value is further restricted by the 802.11 standard. + * + * \callqcsapi + * + * call_qcsapi set_chan_disabled \ \ ... + * + * Unless an error occurs, the output will be the string complete. + */ +extern int qcsapi_wifi_chan_control(const char *ifname, const struct qcsapi_data_256bytes *chans, const uint32_t cnt, const uint8_t flag); + +/** + * \brief Get the disabled channel list. + * + * List the channels which are disabled and can not be used for primary channel. + * + * \note \primarywifi + * + * \param ifname \wifi0only + * \param p_chans a pointer to the buffer for storing array of channels. + * \param p_cnt a pointer to the buffer for storing the number of disabled channels + * + * \return 0 if the channel number was returned. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi get_chan_disabled \ \ ... + * + * Unless an error occurs, the output will be the string complete. + */ +extern int qcsapi_wifi_get_chan_disabled(const char *ifname, struct qcsapi_data_256bytes *p_chans, uint8_t *p_cnt); + +/** + * \brief Get the beacon interval + * + * Get the beacon interval in milliseconds. + * + * \param ifname \wifi0 + * \param p_current_intval a pointer to the buffer for storing the returned value + * + * \return 0 if the command succeeded. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi get_beacon_interval \ + * + * The output will be the beacon interval in milliseconds unless an error occurs. + */ +extern int qcsapi_wifi_get_beacon_interval( const char *ifname, qcsapi_unsigned_int *p_current_intval ); + +/** + * \brief Set the beacon interval + * + * Set the beacon interval in milliseconds. + * + * \param ifname \wifi0 + * \param new_intval a pointer to the buffer for storing the returned value + * + * \return 0 if the command succeeded. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi set_beacon_interval \ \ + * + * Unless an error occurs, the output will be the string complete. + */ +extern int qcsapi_wifi_set_beacon_interval( const char *ifname, const qcsapi_unsigned_int new_intval ); + +/** + * \brief Get the DTIM interval + * + * Get the frequency (in number of beacons) at which the DTIM (Delivery Traffic + * Information Message) Information Element is added to beacons. + * + * \param ifname \wifi0 + * \param p_dtim a pointer to the buffer for storing the returned value + * + * \return 0 if the command succeeded. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi get_dtim \ + * + * The output will be the DTIM interval in milliseconds unless an error occurs. + */ +extern int qcsapi_wifi_get_dtim( const char *ifname, qcsapi_unsigned_int *p_dtim ); + +/** + * \brief Set the DTIM interval + * + * Set the frequency (in number of beacons) at which the DTIM (Delivery Traffic + * Information Message) Information Element is added to beacons. + * + * \param ifname \wifi0 + * \param new_dtim the new DTIM value + * + * \return 0 if the command succeeded. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi set_dtim \ \ + * + * Unless an error occurs, the output will be the string complete. + */ +extern int qcsapi_wifi_set_dtim( const char *ifname, const qcsapi_unsigned_int new_dtim ); + +/** + * \brief Get association limit + * + * This API retrieves the current association limit for the primary interface. + * The association limit is the number of stations that may be simultaneously + * associated to this AP. + * + * \note \aponly + * + * \param ifname \wifi0only + * \param p_assoc_limit Address of variable for result retrieval + * + * \return 0 if the command succeeded. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi get_dev_assoc_limit wifi0 + * + * The output will be the overall device association limit, or an error + * message in case of failure. + * + * \sa qcsapi_wifi_get_bss_assoc_limit + */ +extern int qcsapi_wifi_get_assoc_limit( const char *ifname, qcsapi_unsigned_int *p_assoc_limit ); + +/** + * \brief Get VAP association limit + * + * This API retrieves the current VAP association limit on an interface and its priority. + * The association limit is the minimum number of stations that can be associated to + * this AP even if the device limit is not reached. + * + * \param ifname \wifiX + * \param p_bss_lim_pri Address of variable for return result. Lowest 8 bits is the limit, next 8 bits + * is the priority. + * + * \return 0 if the command succeeded. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi get_bss_assoc_limit \ + * + * The output will be the VAP association limit and priority of the interface, or 0 if + * no limit has been configured using qcsapi_wifi_set_bss_assoc_limit. + * + * \sa qcsapi_wifi_get_assoc_limit + */ +extern int qcsapi_wifi_get_bss_assoc_limit( const char *ifname, qcsapi_unsigned_int *p_bss_lim_pri ); + +/** + * \brief Set association limit + * + * This API sets the current association limit across all BSSes in the system. + * + * \note When the limit is changed, all devices will be disassociated and forced to reassociate. + * + * \note \aponly + * + * \param ifname \wifi0only + * \param new_assoc_limit New association limit + * + * \return 0 if the command succeeded. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi set_dev_assoc_limit wifi0 \ + * + * Unless an error occurs, the output will be the string complete. + * + * \sa qcsapi_wifi_set_bss_assoc_limit + */ +extern int qcsapi_wifi_set_assoc_limit( const char *ifname, const qcsapi_unsigned_int new_assoc_limit ); + +/** + * \brief Set VAP association limit + * + * This API sets the current association limit for the interface. + * + * \note When the limit is changed, all devices will be disassociated and forced to reassociate. + * + * \note \aponly + * + * \param ifname \wifiX + * \param bss_lim_pri Lowest 8-bits is the BSS limit, next 8 bits is the priority + * + * \return 0 if the command succeeded. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi set_bss_assoc_limit \ \ \ + * + * Unless an error occurs, the output will be the string complete. + * + * \sa qcsapi_wifi_set_assoc_limit + */ +extern int qcsapi_wifi_set_bss_assoc_limit( const char *ifname, const qcsapi_unsigned_int bss_lim_pri ); + +/** + * \brief Get current BSSID + * + * This API retrieves the current BSSID (basic service set identification) + * + * \param ifname \wifi0 + * \param current_BSSID memory in which to store the current BSSID. On an unassociated station, or if the interface is disabled, this field will be zeroed. + * + * \return 0 if the command succeeded. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi get_BSSID interface + * + * The output will be a printout of the BSSID MAC address on success, or print an error message on failure. + */ +extern int qcsapi_wifi_get_BSSID( const char *ifname, qcsapi_mac_addr current_BSSID ); + +/** + * \brief Get configured BSSID + * + * Retrieves BSSID stored in configuration file + * + * \param ifname \wifi0 + * \param config_BSSID memory in which to store the configured BSSID. If there is no BSSID + * configured for the interface memory will be filled with zeros. + * + * \return 0 if the command succeeded. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi get_config_BSSID interface + * + * The output will be a printout of the BSSID MAC address on success, or print an error message on + * failure. + */ +extern int qcsapi_wifi_get_config_BSSID( const char *ifname, qcsapi_mac_addr config_BSSID ); + +/** + * \brief Get BSSID for a SSID + * + * Retrieve the BSSID per SSID stored in the configuration file (if it exists) + * + * \param ifname \wifi0 + * \param BSSID memory in which to store the retrieved BSSID. + * If there is no BSSID configured for the SSID, return result will be error 1012 + * + * \return 0 if the command succeeded. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi get_ssid_BSSID interface \ + + * The output will be a printout of the BSSID MAC address on success, or print an error message on + * failure. + */ +extern int qcsapi_wifi_ssid_get_bssid(const char *ifname, const qcsapi_SSID ssid_str, + qcsapi_mac_addr bssid); + +/** + * \brief Set/Unset configured BSSID for a SSID + * + * Add/remove BSSID per SSID stored in configuration file (for a station). This optional + * configuration will restrict to the specified BSSID address. + * + * \param ifname \wifi0 + * \param SSID_str is the SSID to be configured + * \param BSSID memory in which to store the required BSSID. If the BSSID parameter + * is filled with all 0xFF (ie MAC address ff:ff:ff:ff:ff:ff), then any existing configured BSSID + * is removed for the specified SSID. + * + * \return 0 if the command succeeded. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi set_ssid_BSSID interface \ \ + */ +extern int qcsapi_wifi_ssid_set_bssid(const char *ifname, const qcsapi_SSID ssid_str, + const qcsapi_mac_addr bssid); + +/** + * @brief Get the WiFi interface SSID. + * + * Get the current SSID of the interface. + * + * \param ifname \wifi0 + * \param SSID_str return parameter to contain the SSID. + * + * \return 0 if the command succeeded and SSID_str contains the SSID. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \note On a STA with security enabled and is not in an association, this API will return the 0-length string in the SSID_str parameter. + * + * \callqcsapi + * + * call_qcsapi get_SSID \ + * + * Unless an error occurs, the output will be the current SSID. + * On a STA, if security is enabled and is not in association, the output will be a blank line. + */ +extern int qcsapi_wifi_get_SSID( const char *ifname, qcsapi_SSID SSID_str ); + +/** + * @brief Set the WiFi interface SSID. + * + * Set the current SSID for AP operation on the given interface. + * + * \note \aponly + * + * \warning Any preexisting associations will be dropped, and those stations will be required to reassociate, using the new SSID. + * + * Use the WiFi Associate API (qcsapi_wifi_associate) on a STA to set the SSID. + * + * The SSID must be a string with between 1 and 32 characters. Control characters (^C, ^M, etc.) are not permitted. + * + * \param ifname \wifi0 + * \param SSID_str the new SSID to set on the interface. + * + * \return 0 if the command succeeded and the SSID is updated. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi set_SSID \ \ + * + * Unless an error occurs, the output will be the string complete. + * + * Examples + * + * To set SSID to Quantenna, enter: + * + * call_qcsapi set_ssid wifi0 "Quantenna" + * + * To set SSID to 'Quantenna', enter: + * + * call_qcsapi set_ssid wifi0 "'Quantenna'" + * + * To set SSID to "Quantenna", enter: + * + * call_qcsapi set_ssid wifi0 "\"Quantenna\"" + * + * \sa qcsapi_wifi_associate + */ +extern int qcsapi_wifi_set_SSID( const char *ifname, const qcsapi_SSID SSID_str ); + +/** + * @brief Get the IEEE 802.11 PHY mode being used on the interface. + * + * Get the current IEEE 802.11 standard(s) that the WiFi device supports. Expected return values (all are character strings) follow: + * + * + * + * + * + * + * + * + * + *
Value Interpretation
a-only Only 802.11a support present (5 GHz with up to 54 Mbps throughput)
b-only Only 802.11b support present (2.4 GHz with up to 11 Mbps throughput)
g-only Only 802.11g support present (2.4GHz with up to 54 Mbps throughput)
n-only Stations / Access Points are required to support 802.11n
a|n 802.11n with 802.11a available for backwards compatibility
g|n 802.11n with 802.11g available for backwards compatibility
+ * + * Currently "n-only" and "a|n" are the only expected return values. + * + * \note \primarywifi + * \note The passed in string MUST be at least 7 bytes to contain the maximum length string per the preceding table. + * + * \param ifname \wifi0only + * \param IEEE_802_11_standard return parameter to contain the string with the PHY mode. + * + * \return 0 if the command succeeded and the IEEE_802_11_standard string is filled in successfully. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi get_standard \ + * + * call_qcsapi get_802.11 \ + */ +extern int qcsapi_wifi_get_IEEE_802_11_standard( const char *ifname, char *IEEE_802_11_standard ); + +/** + * @brief Get the list of available channels for an interface. + * + * Get the list of available channels with each value separated by commas. + * + * \note \primarywifi + * + * \warning This API does not respect regulatory requirements. + * Use the get list regulatory channels API (qcsapi_wifi_get_list_regulatory_channels) to get the list of valid channels by regulatory authority. + * + * \param ifname \wifi0only + * \param list_of_channels return parameter to contain the list of channels, comma separated. + * + * \return 0 if the command succeeded and the list_of_channels is filled in correctly. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi get_channel_list \ + * + * Unless an error occurs, the output will be the list of WiFi channels per the 802.11 standard. + */ +extern int qcsapi_wifi_get_list_channels( const char *ifname, string_1024 list_of_channels ); + +/** + * \brief Get WiFi mode switch setting + * + * This API retrieves the current WiFi mode switch setting. + * + * \note It is required that the relevant GPIOs attached to the switch (12 and 13 for 3way switch and only 12 for 2way switch) + * be configured as inputs for this API to work. + * + * \param p_wifi_mode_switch_setting pointer to result memory. On success, the result memory will have 0, 1 or 2 written to it depending on the + * position of the switch. If the GPIOs are not configured as inputs, value is undefined. 0 value means AP, 1 means STA and 2 means AUTO mode. + * On 2way switch only AP and STA modes are existing. + * + * \return 0 if the command succeeded and the GPIOs are set properly. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi get_mode_switch + * + * On success, call_qcsapi will print the setting as an integer (1, 2, or 3) depending on the switch setting, or 0 if the relevant GPIOs are not configured as inputs. On failure, an error message will be written to stdout. + */ +extern int qcsapi_wifi_get_mode_switch( uint8_t *p_wifi_mode_switch_setting ); + + +/** + * @brief Force a disassociate on the STA. + * + * This API call ends the current association and puts the device into an idle state, + * so that it does not send out probe requests or attempt to associate with any AP. + * + * \note This API only applies for a STA. + * + * \param ifname \wifi0 + * + * \return 0 if the command succeeded. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi disassociate \ + * + * Unless an error occurs, the output will be the string complete. + */ +extern int qcsapi_wifi_disassociate(const char *ifname); + +/** + * @brief Force a disassociate on the AP. Station to disassociate identified by MAC address + * + * This API call ends association with remote station. It is a wrapper around hostapd's + * "disassociate" function. + * + * \note This API only applies for an AP. + * + * \param ifname \wifi0 + * \param MAC \02:51:55:41:00:4C + * + * \return 0 if the command succeeded. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi disassociate_sta \ \ + * + * Unless an error occurs, the output will be the string complete. + * + * Example MAC address: 02:51:55:41:00:4C. See @ref mysection5_1_1 "Format for a MAC address" for details of formatting MAC + * addresses. + */ +extern int qcsapi_wifi_disassociate_sta(const char *ifname, qcsapi_mac_addr mac); + +/** + * @brief Force reassociation + * + * On AP reassociation of all clients is forced by disassociating them without deauthenticating. + * For STA it forces reassociation without going through scan. + * It is equivalent to calling command iwpriv \ cl_remove 1. + * + * \return 0 if the command succeeded. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi reassociate \ + * + * Unless an error occurs, the output will be the string complete. + */ +extern int qcsapi_wifi_reassociate(const char *ifname); + +/** + * @brief Get information of disconnection count and time since device boot up. + * + * This API is called to get disconnection count. Each time successfully invoke this API, + * the sequence of disconn_info will increase 1, by which the caller can determine whether module has reset. + * Note that disconnection count only increases when the peer is authorized and disassocated later. + * + * In STA mode, the disconn_count of disconn_info indicates how many times STA is disconnected + * from AP since module boot up, the asso_sta_count is 1 if it connects to AP or 0 if not. + * In AP mode, the disconn_count records times that AP disconnects STA which has been associated with it, + * the asso_sta_count means the number of STAs connect to AP. + * + * This API also can reset sequence, and asso_sta_count by setting member resetflag of disconn_info + * with 1. + * + * \note \primarywifi + * + * \param ifname \wifi0only + * \param disconn_info where to save the data. + * + * \return 0 if the command succeeded. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi get_disconn_info \
+ * call_qcsapi reset_disconn_info \ + */ +extern int qcsapi_wifi_get_disconn_info(const char *ifname, qcsapi_disconn_info *disconn_info); + +/** + * \brief Enable/Disable WPS + * + * Available on APs only. This API alters hostapd wps_state. + * + * \param ifname \wifi0 + * \param disable_wps 0 = set wps_state to configured. 1 = set wps_state to disabled. + * + * \return 0 if the command succeeded. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi disable_wps \ <0 | 1> + * + * Unless an error occurs, the output will be the string complete. + */ +extern int qcsapi_wifi_disable_wps(const char *ifname, int disable_wps); + +/** + * @brief Associate a STA to a network. + * + * This API call causes the STA to attempt to associate with the selected SSID, as identified by the input parameter. + * + * The SSID must be present (and configured correctly) on the STA. + * + * \note This API only applies for a STA. + * + * \param ifname \wifi0 + * \param join_ssid the SSID for the STA to join. + * + * \return 0 if the command succeeded (association is started - not that the association succeeds). + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi associate \ \ + * + * Unless an error occurs, the output will be the string complete. + */ +extern int qcsapi_wifi_associate(const char *ifname, const qcsapi_SSID join_ssid); + +/** + * \brief Trigger CCA (Clear Channel Assessment) measurement + * + * This API causes a CCA measurement to be scheduled 1 second after invocation, on the requested channel, for a requested number of milliseconds. + * + * \param ifname \wifi0 + * \param channel Channel to switch to during CCA measurement + * \param duration Time in milliseconds to spend on the channel + * + * \return 0 if the command succeeded (CCA measurement is triggered) + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi start_cca interface channel duration + * + * Unless an error occurs, the output will be the string complete. + */ +extern int qcsapi_wifi_start_cca( const char *ifname, int channel, int duration); + +/** + * @brief Get the noise figure for the current channel. + * + * This API reports the noise on the current channel in dBm. + * + * Since the noise is expected to be much less than 1 milliwatt (0 dBm), the value should be much less than 0. + * + * \note \primarywifi + * + * \param ifname \wifi0only + * \param p_noise return parameter to contain the noise figure read from the interface. + * + * \return 0 if the command succeeded and p_noise contains a valid noise figure. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi get_noise \ + * + * Unless an error occurs, the output will be the current noise in dBm, most likely a negative number. + */ +extern int qcsapi_wifi_get_noise( const char *ifname, int *p_noise ); + +/** + * @brief Get the RSSI measurement per RF chain. + * + * This API reports the RSSI of the selected RF chain in dBm. + * + * \note \primarywifi + * + * \param ifname \wifi0only + * \param rf_chain the RF chain to get the RSSI of (between 0 and 3). + * \param p_rssi return parameter to contain the RSSI reading of the interface/RF chain pair. + * + * \return 0 if the command succeeded and p_rssi contains a valid value. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi get_rssi_by_chain \ \ + * + * Unless an error occurs, the output will be the RSSI of the selected RF chain in dBm. + */ +extern int qcsapi_wifi_get_rssi_by_chain( const char *ifname, int rf_chain, int *p_rssi ); + +/** + * \brief Get the average SNR of the interface. + * + * \note \primarywifi + * + * \param ifname \wifi0only + * \param p_snr return parameter to contain the average SNR of the interface. + * + * \return 0 if the command succeeded and p_snr contains a valid value. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi get_avg_snr \ + * + * Unless an error occurs, the output will be the average SNR of the primary WiFi interface. + */ +extern int qcsapi_wifi_get_avg_snr( const char *ifname, int *p_snr ); + +/** + * @brief Get the primary wireless interface. + * + * This API will return the name of the primary WiFi interface. + * + * The primary interface is usually the first AP-mode interface created on system start up, + * and is the only WiFi interface that allows configuration of the underlying properties of the radio: channel, TX power, bandwidth, etc. + * + * The primary interface is thus distinct from any additional AP-mode virtual interfaces created as part of the MBSSID feature, + * which do not allow these radio properties to be set. + * + * \param ifname \wifi0 + * \param maxlen the size of the buffer pointed to by ifname. + * + * \return 0 if the command succeeded and ifname contains the primary WiFi interface. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi get_primary_interface + * + * Output should be the name of the primary interface unless an error occurs. + */ +extern int qcsapi_get_primary_interface( char *ifname, size_t maxlen ); + +/** + * @brief Get a wireless interface by index. + * + * This API will return the name of the WiFi interface that corresponds to the input parameter. + * + * For if_index = 0, this API will return the name of the primary interface. + * + * For if_index > 0, the API will return the corresponding secondary interface. + * + * If if_index exceeds the number of interfaces - 1, this API will return a range error indicating the index parameter is too large. + * + * No holes in the list of entries will be present; starting at 0, for each consecutive value of index, either a unique interface name is returned + * or the API returns range error. + * + * If for a particular value of index the API returns range error, the API will return the same range error for all larger values of index. + * + * \param if_index the interface index to get the name of. + * \param ifname \wifi0 + * \param maxlen the size of the buffer pointed to by ifname. + * + * \return 0 if the command succeeded and ifname contains the string of the interface correspoinding to index 'if_index'. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi get_interface_by_index \ + * + * Output should be the name of the interface that corresponds to the index value. + */ +extern int qcsapi_get_interface_by_index( unsigned int if_index, char *ifname, size_t maxlen ); + +/** + * \brief Set the primary WiFi interface MAC address. + * + * This API allows the primary WiFi interface MAC address to be set. + * + * \param new_mac_addr the new MAC address for the primary WiFi interface. + * + * \return 0 if the command succeeded. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \warning This API can ONLY be called after the QDRV is started, but before the WiFi mode is selected. + * + * \warning This API cannot be used to change the WiFi MAC address dynamically - it can be called only + * once, after the QDRV is started. To change the WiFi MAC address again, a reboot is required. + * + * \warning This API does NOT save the set WiFi MAC address across reboots. Additional logic is required + * to save/restore the MAC address across reboots. + * + * \callqcsapi + * + * call_qcsapi set_wifi_macaddr \ + * + * Output should be the string complete. + */ +extern int qcsapi_wifi_set_wifi_macaddr( const qcsapi_mac_addr new_mac_addr ); + +/** + * @brief Get the BSSID. + * + * Return the Basic Service Set ID (BSSID). + * + * For an AP, this is the MAC address of the WiFi interface. For a STA, it is the MAC address of the AP it is associated with. + * If the STA is not in association, the BSSID will be the address 00:00:00:00:00:00 + * + * \param ifname \wifi0 + * \param current_BSSID return parameter to contain the BSSID. + * + * \return 0 if the command succeeded and current_BSSID contains a valid value. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi get_BSSID \ + * + * Unless an error occurs, the output will be the current BSSID, expressed in the standard MAC address format. + * + * On a station not in association, the value will be 00:00:00:00:00:00 + */ +extern int qcsapi_interface_get_BSSID( const char *ifname, qcsapi_mac_addr current_BSSID ); + +/** + * @brief Get the list of supported rates on the given interface. + * + * This API will list the supported rates (as a string), with each value in megabits per second, separated by commas. + * + * These rates represent what the device is capable of; the return value is NOT affected by the current rate setting. + * + * \param ifname \wifi0 + * \param rate_type set this to qcsapi_possible_rates. + * \param supported_rates return parameter to contain the comma separated rate list. + * + * \return 0 if the command succeeded and current_BSSID contains a valid value. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi get_rates \ possible_rates + * + * Unless an error occurs, the output will be the set of possible rates supported by the interface. + */ +extern int qcsapi_wifi_get_rates( const char *ifname, qcsapi_rate_type rate_type, string_1024 supported_rates ); + +/** + * \brief Set rates from an MBPS list (unsupported) + * + */ +extern int qcsapi_wifi_set_rates( const char *ifname, qcsapi_rate_type rate_type, const string_256 current_rates, int num_rates); + +/** + * \brief Get the maximum upstream and downstream bit rate available to this connection in Mbps. + * + * This API will only output "auto" currently. + * + * \param ifname \wifi0 + * \param max_bitrate String value of the max_bitrate, currently only "auto" can be retrieved. + * \param max_str_len The length of the string point to max_bitrate. + * + * \return 0 if the command succeeded and max_bitrate contains a valid value. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi get_max_bitrate \ + * + * Unless an error occurs, the output will be the max_bitrate supported by the interface, + * currently only outputting "auto". + */ +extern int qcsapi_get_max_bitrate(const char *ifname, char *max_bitrate, const int max_str_len); + +/** + * \brief Set the maximum upstream and downstream bit rate available to this connection in Mbps. + * + * This API can only input "auto" currently. + * + * \param ifname \wifi0 + * \param max_bitrate String value of the max_bitrate, currently only "auto" can be set. + * + * \return 0 if the command succeeded. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi set_max_bitrate \ \ + * + * Unless an error occurs, output should be the string complete. + */ +extern int qcsapi_set_max_bitrate(const char *ifname, const char *max_bitrate); + +/** + * \brief Get a Quality of Service (QOS) Parameter + * + * + * Returns the value of a Quality of Service Parameter, based on the selected queue. + * + * \param ifname \wifi0 + * \param the_queue which queue to use. Value ranges from 0 to 3, see section + * @ref mygroup5_4 "Quality of Service (QoS) extensions" for queue index to symbolic name mappings. + * \param the_param which parameter to report. Value ranges from 1 to 6, refer to sections + * @ref mysection5_4_1 "ECWMin" through @ref mysection5_4_6 "AckPolicy" for description and limitations. + * \param ap_bss_flag set to "0" or "1" to report either egress (self) or ingress (BSS) QoS parameter respectively. Refer to section + * @ref mygroup5_4 "Quality of Service (QoS) extensions" for difference. + * \param p_value address of the location to receive the value of the QOS parameter. + * + * \return 0 if the command succeeded. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi get_qos_param interface \<0|1|2|3\> <1|2|3|4|6> [<0|1>] + */ +extern int qcsapi_wifi_qos_get_param(const char *ifname, + int the_queue, + int the_param, + int ap_bss_flag, + int *p_value); + +/** + * \brief Set a Quality of Service (QOS) Parameter + * + * \param ifname \wifi0 + * \param the_queue which queue to use. Value ranges from 0 to 3, see section + * @ref mygroup5_4 "Quality of Service (QoS) extensions" for queue index to symbolic name mappings. + * \param the_param which parameter to report. Value ranges from 1 to 6, refer to sections + * @ref mysection5_4_1 "ECWMin" through @ref mysection5_4_6 "AckPolicy" for description and limitations. + * \param ap_bss_flag "0" or "1" to set either egress (self) or ingress (BSS) QoS parameter respectively. Refer to section + * @ref mygroup5_4 "Quality of Service (QoS) extensions" for difference. + * \param value the value of the QOS parameter to set. + * + * \return 0 if the command succeeded. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi set_qos_param interface \<0|1|2|3\> <1|2|3|4|6> [<0|1>] + */ +extern int qcsapi_wifi_qos_set_param(const char *ifname, + int the_queue, + int the_param, + int ap_bss_flag, + int value); + +/** + * \brief Get the mapping table from TOS/DSCP or IEEE802.1p priority to WMM AC index + * + * + * Returns the current mapping table from TOS/DSCP or IEEE802.1p priority to WMM AC index + * + * \param ifname \wifi0 + * \param mapping_table Return value to contain the mapping table for priorities. Must be + * a memory area large enough to contain 64 byte values + * + * \return 0 if the command succeeded. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * call_qcsapi interface: + * + * call_qcsapi get_wmm_ac_map interface + */ +extern int qcsapi_wifi_get_wmm_ac_map(const char *ifname, string_64 mapping_table); + +/** + * \brief Set one mapping table item from TOS/DSCP or IEEE802.1p priority to WMM AC index + * + * \param ifname \wifi0 + * \param user_prio Which user priority to be set. Value ranges from 0 to 7. + * \param ac_index The AC index to map to the input user_prio. Valid values are 0 to 3, + * see @ref mygroup5_4 "Quality of Service (QoS) extensions" for correspondence between AC index and AC symbolic name. + * + * \return 0 if the command succeeded. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi set_wmm_ac_map interface \<0|1|2|3|4|5|6|7\> <0|1|2|3> + */ +extern int qcsapi_wifi_set_wmm_ac_map(const char *ifname, int user_prio, int ac_index); + +/** + * \brief Get the mapping table from IP DSCP to IEEE802.1p priority + * + * Returns the current mapping table from IP DSCP to IEEE802.1p user priority + * + * \param ifname \wifi0 + * \param mapping_table Return value to contain the mapping table for IEEE802.1p user priorities. + * Must be a memory area large enough to contain 64 byte values + * + * \return 0 if the command succeeded. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi get_dscp_8021p_map interface + */ +extern int qcsapi_wifi_get_dscp_8021p_map(const char *ifname, string_64 mapping_table); + +/** + * \brief Get IP DSCP to WMM AC mapping table entries + * + * Returns the current mapping table from IP DSCP to WME AC user priority + * + * \param ifname \wifi0 + * \param mapping_table Return value to contain the mapping table for WME AC user priorities. + * Must be a memory area large enough to contain 64 byte values. + * + * Return parameter to contain the mapping table for WME AC user priorities + * + * \callqcsapi + * + * call_qcsapi get_dscp_ac_map interface + */ +extern int qcsapi_wifi_get_dscp_ac_map(const char *ifname, struct qcsapi_data_64bytes *mapping_table); + +/** + * \brief Set one mapping table item from IP DSCP to IEEE802.1p user priority + * + * \param ifname \wifi0 + * \param ip_dscp_list List of IP DSCP values to be set. Value ranges from 0 to 64 and + * 64 is a special use to revert mapping table to default. If the IP DSCP needed to be set + * is 40 and 46 the format should be 40,46. + * \param dot1p_up the 802.1p UP to be mapped to the input IP DSCP. Value ranges from 0~7. + * + * \return 0 if the command succeeded. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi set_dscp_8021p_map interface \<0-64\>[,1-64]... <0-7> + */ +extern int qcsapi_wifi_set_dscp_8021p_map(const char *ifname, const char *ip_dscp_list, uint8_t dot1p_up); + +/** + * \brief Set one mapping table item from IP DSCP to WMM AC priority. + * + * \param ifname \wifi0 + * \param dscp_list List of IP DSCP value(s) to be set. Value ranges from 0 to 63. + * If more than one IP DSCP mapping is specified, the values must be separated by commas. + * \param dcsp_list_len The number of IP DSCP values in the dscp_list argument. + * \param ac the WME AC value that will be mapped to the input IP DSCP. Value ranges from 0 to 3, + * see @ref mygroup5_4 "Quality of Service (QoS) extensions" for correspondence between AC index and AC symbolic name. + * \return 0 if the command succeeded. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \note Any DSCP mappings not explicitly set will map to AC_BE. + * + * \callqcsapi + * + * call_qcsapi set_dscp_ac_map interface \<0-64\>[,0-64]... <0-3> + * + * As an example, to map the following: + * + * CS0,CS1,CS4,CS7 (map to AC_BE); + * + * AF11,CS2, AF21,CS3,CS6 (map to AC_VI); and + * + * CS5, EF (map to AC_VO) + * + * the following set of call_qcsapi calls are made: + * + * @code + * call_qcsapi set_dscp_ac_map wifi0 0,8,32,56 0 + * call_qcsapi set_dscp_ac_map wifi0 10,16,18,24,48 2 + * call_qcsapi set_dscp_ac_map wifi0 40,46 3 + * @endcode + */ +extern int qcsapi_wifi_set_dscp_ac_map(const char *ifname, const struct qcsapi_data_64bytes *dscp_list, uint8_t dscp_list_len, uint8_t ac); + +/** + * \brief Get the interface priority + * + * Get the priority for the given WiFi interface. The priority is used to differentiate traffic between + * different SSIDs. Traffic in SSIDs with higher priority takes precedence over traffic in SSIDs with lower + * priority. + * + * \param ifname \wifi0 + * \param p_priority a pointer to the buffer for storing the returned value. + * + * \return 0 if the command succeeded. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi get_priority \ + * + * The output will be the priority unless an error occurs. + */ +extern int qcsapi_wifi_get_priority(const char *ifname, uint8_t *p_priority); + +/** + * \brief Set the interface priority + * + * Set the priority for the given WiFi interface. The priority is used to differentiate traffic between + * different SSIDs. Traffic in SSIDs with higher priority takes precedence over traffic in SSIDs with lower + * priority. + * + * \param ifname \wifi0 + * \param priority interface priority. Value ranges from 0 to 3. + * + * \return 0 if the command succeeded. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi set_priority \ \ + * + * Unless an error occurs, the output will be the string complete. + */ +extern int qcsapi_wifi_set_priority(const char *ifname, uint8_t priority); + +/** + * \brief Get the airtime fairness status + * + * Get the airtime fairness status for the given WiFi interface. + * + * \param ifname \wifi0 + * \param p_airfair a pointer to the buffer for storing the returned value. + * + * \return 0 if the command succeeded. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi get_airfair \ + * + * The output will be the status of airtime fairness unless an error occurs. 0 means diabled, + * and 1 means enabled. + */ +extern int qcsapi_wifi_get_airfair(const char *ifname, uint8_t *p_airfair); + +/** + * \brief Set airtime fairness + * + * Set the airtime fairness for the given WiFi interface. + * + * \param ifname \wifi0 + * \param airfair interface airfair status. Value is either 0(disable) or 1(enable). + * + * \return 0 if the command succeeded. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi set_airfair \ \ + * + * Unless an error occurs, the output will be the string complete. + */ +extern int qcsapi_wifi_set_airfair(const char *ifname, uint8_t airfair); + + +/** + * \brief Get the transmit power for the current bandwidth with beamforming off. + * + * This API returns the transmit power for the specified channel, which is the + * maximum allowed power used in the case of beamforming off and 1 spatial stream + * for current bandwidth. + * The TX powers are reported in dBm. + * + * \note \primarywifi + * + * \param ifname \wifi0only + * \param the_channel the channel for which the tx power is returned. + * \param p_tx_power return parameter to contain the transmit power. + * + * \return -EINVAL or other negative values on error, or 0 on success. + * + * \callqcsapi + * + * call_qcsapi get_tx_power \ <channel> + * + * Unless an error occurs, the output will be the transmit power. + * + * \note: This API is deprecated and replaced with qcsapi_wifi_get_tx_power_ext. + */ +extern int qcsapi_wifi_get_tx_power(const char *ifname, + const qcsapi_unsigned_int the_channel, + int *p_tx_power); + +/** + * \brief Set the transmit power for the current bandwidth. + * + * This API call sets the transmit power for a particular channel. + * The TX power is in dBm unit. + * + * \note \primarywifi + * \note \nonpersistent + * + * \param ifname \wifi0only + * \param the_channel the channel for which the tx power is set. + * \param tx_power tx power to be set. + * + * \return negative value on error, 0 on success. + * + * \callqcsapi + * + * call_qcsapi set_tx_power \ \ \ + * + * Unless an error occurs, the output will be the string complete'. + * + * \note: This API is deprecated and replaced with qcsapi_wifi_set_tx_power_ext. + */ +extern int qcsapi_wifi_set_tx_power(const char *ifname, + const qcsapi_unsigned_int the_channel, + const int tx_power); + +/** + * \brief Get the transmit powers for 20/40/80MHz bandwidths with beamforming off. + * + * This API returns the transmit powers for the specified channel, which is the maximum + * allowed powers used in the case of beamforming off and 1 spatial stream. + * The TX powers are reported in dBm. + * + * \note \nonpersistent + * + * \param ifname \wifi0only + * \param the_channel the channel for which the tx power is returned. + * \param p_power_20M return parameter to contain the transmit power for 20MHz bandwidth. + * \param p_power_40M return parameter to contain the transmit power for 40MHz bandwidth. + * \param p_power_80M return parameter to contain the transmit power for 80MHz bandwidth. + * + * \return -EINVAL or other negative values on error, or 0 on success. + * + * \callqcsapi + * + * call_qcsapi get_bw_power \ <channel> + * + * Unless an error occurs, the output will be the transmit powers. + * + * \note: This API is deprecated and replaced with qcsapi_wifi_get_tx_power_ext. + */ +extern int qcsapi_wifi_get_bw_power(const char *ifname, + const qcsapi_unsigned_int the_channel, + int *p_power_20M, + int *p_power_40M, + int *p_power_80M); + +/** + * \brief Set the transmit power for 20/40/80MHz bandwidths. + * + * This API call sets the transmit powers for a particular channel. + * The TX powers are in dBm unit. + * + * \note \primarywifi + * \note \nonpersistent + * + * \param ifname \wifi0only + * \param the_channel the channel for which the tx power is set. + * \param power_20M tx power for 20MHz bandwidth to be set. + * \param power_40M tx power for 40MHz bandwidth to be set. + * \param power_80M tx power for 80MHz bandwidth to be set. + * + * + * \return negative value on error, 0 on success. + * + * \callqcsapi + * + * call_qcsapi set_bw_power \ \ \ \ \ + * + * Unless an error occurs, the output will be the string complete'. + * + * \note: This API is deprecated and replaced with qcsapi_wifi_set_tx_power_ext. + */ +extern int qcsapi_wifi_set_bw_power(const char *ifname, + const qcsapi_unsigned_int the_channel, + const int power_20M, + const int power_40M, + const int power_80M); + +/** + * \brief Get the transmit powers for 20/40/80MHz bandwidths with beamforming on. + * + * This API returns the transmit powers for the specified channel, which is the maximum + * allowed powers used in the case of beamforming is on. + * The TX powers are reported in dBm. + * + * \note \primarywifi + * + * \param ifname \wifi0only + * \param the_channel the channel for which the tx power is returned. + * \param number_ss the number of spatial streams. + * \param p_power_20M return parameter to contain the transmit power for 20MHz bandwidth. + * \param p_power_40M return parameter to contain the transmit power for 40MHz bandwidth. + * \param p_power_80M return parameter to contain the transmit power for 80MHz bandwidth. + * + * \return -EINVAL or other negative values on error, or 0 on success. + * + * \callqcsapi + * + * call_qcsapi get_bf_power \ \ \ + * + * Unless an error occurs, the output will be the transmit powers. + * + * \note: This API is deprecated and replaced with qcsapi_wifi_get_tx_power_ext. + */ +extern int qcsapi_wifi_get_bf_power(const char *ifname, + const qcsapi_unsigned_int the_channel, + const qcsapi_unsigned_int number_ss, + int *p_power_20M, + int *p_power_40M, + int *p_power_80M); + +/** + * \brief Set the transmit power for 20/40/80MHz bandwidths. + * + * This API call sets the transmit powers for a particular channel. + * The TX powers are in dBm unit. + * + * \note \primarywifi + * \note \nonpersistent + * + * \param ifname \wifi0only + * \param the_channel the channel for which the tx power is set. + * \param number_ss the number of spatial streams. + * \param power_20M tx power for 20MHz bandwidth to be set. + * \param power_40M tx power for 40MHz bandwidth to be set. + * \param power_80M tx power for 80MHz bandwidth to be set. + * + * \return negative value on error, 0 on success. + * + * \callqcsapi + * + * call_qcsapi set_bf_power \ \ \ \ \ \ + * + * Unless an error occurs, the output will be the string complete'. + * + * \note: This API is deprecated and replaced with qcsapi_wifi_set_tx_power_ext. + */ +extern int qcsapi_wifi_set_bf_power(const char *ifname, + const qcsapi_unsigned_int the_channel, + const qcsapi_unsigned_int number_ss, + const int power_20M, + const int power_40M, + const int power_80M); + +/** + * \brief Get the transmit powers for 20/40/80MHz bandwidths. + * + * This API returns the transmit powers for a specified channel, which is the maximum + * allowed powers used in the specified case. + * The TX powers are reported in dBm. + * + * \note \primarywifi + * + * \param ifname \wifi0only + * \param the_channel the channel for which the tx power is returned. + * \param bf_on beamforming is either on or off. 1 for beamforming on and 0 for beamforming off. + * \param number_ss the number of spatial streams. + * \param p_power_20M return parameter to contains the transmit power for 20MHz bandwidth. + * \param p_power_40M return parameter to contains the transmit power for 40MHz bandwidth. + * \param p_power_80M return parameter to contains the transmit power for 80MHz bandwidth. + * + * \return -EINVAL or other negative values on error, or 0 on success. + * + * \callqcsapi + * + * call_qcsapi get_tx_power_ext \ \ \ \ + * + * Unless an error occurs, the output will be the transmit powers. + */ +extern int qcsapi_wifi_get_tx_power_ext(const char *ifname, + const qcsapi_unsigned_int the_channel, + const qcsapi_unsigned_int bf_on, + const qcsapi_unsigned_int number_ss, + int *p_power_20M, + int *p_power_40M, + int *p_power_80M); + +/** + * \brief Set the transmit power for 20/40/80MHz bandwidths. + * + * This API call sets the transmit powers for a particular channel. + * The TX powers are in dBm unit. + * + * \note \primarywifi + * \note \nonpersistent + * + * \param ifname \wifi0only + * \param the_channel the channel for which the tx power is set. + * \param bf_on beamforming is either on or off. 1 for beamforming on and 0 for beamforming off. + * \param number_ss the number of spatial streams. + * \param power_20M tx power for 20MHz bandwidth to be set. + * \param power_40M tx power for 40MHz bandwidth to be set. + * \param power_80M tx power for 80MHz bandwidth to be set. + * + * \return negative value on error, 0 on success. + * + * \callqcsapi + * + * call_qcsapi set_tx_power_ext \ \ \ \ \ \ \ + * + * Unless an error occurs, the output will be the string complete'. + */ +extern int qcsapi_wifi_set_tx_power_ext(const char *ifname, + const qcsapi_unsigned_int the_channel, + const qcsapi_unsigned_int bf_on, + const qcsapi_unsigned_int number_ss, + const int power_20M, + const int power_40M, + const int power_80M); + +/** + * \brief Get all the transmit powers for a single channel. + * + * This API returns all the transmit powers for a specified channel. + * The TX powers are reported in dBm. + * + * See the documentation for \ref qcsapi_channel_power_table for full + * details of the return structure. + * + * \note \primarywifi + * + * \param ifname \wifi0only + * \param chan_power_table the pointer to a data structure which is used to store the return powers. + * the variable "channel" of this structure must be initiated before calling this API. + * + * \return -EINVAL or other negative values on error, or 0 on success. + * + * \callqcsapi + * + * call_qcsapi get_chan_power_table \ \ + * + * Unless an error occurs, the output will be the power table of this channel. + * + * \sa qcsapi_channel_power_table + */ +extern int qcsapi_wifi_get_chan_power_table(const char *ifname, + qcsapi_channel_power_table *chan_power_table); + +/** + * \brief Set all the transmit powers for a single channel. + * + * This API sets all the transmit powers for a particular channel. + * The TX powers are in dBm unit. + * + * See the documentation for \ref qcsapi_channel_power_table for full + * details of how to fill out the channel power table. + * + * \note \primarywifi + * \note \nonpersistent + * + * \param ifname \wifi0only + * \param chan_power_table the pointer to a data structure which has the channel number and powers. + * + * \return negative value on error, 0 on success. + * + * \callqcsapi + * + * call_qcsapi set_chan_power_table \ \ \ \ \ \ + * + * max_power is the maximum power of this channel's 24 powers. + * + * backoff_20M is a 32 bits unsigned value, and every 4 bits indicate the backoff from the max_power for a BF/SS case. + * + * The least significant 4 bits are for BF off 1SS case, and the most significant 4 bits are for BF on 4SS case. + * + * For the sequence, please see the enumeration definition for qcsapi_power_indices (\ref qcsapi_power_indices). + * For example, max_power 23 and backoff_20M 0x54324321 give the powers as below: + * + * the power for 20Mhz bfoff 1ss: 23 - 1 = 22dBm + * + * the power for 20Mhz bfoff 2ss: 23 - 2 = 21dBm + * + * the power for 20Mhz bfoff 3ss: 23 - 3 = 20dBm + * + * the power for 20Mhz bfoff 4ss: 23 - 4 = 19dBm + * + * the power for 20Mhz bfon 1ss: 23 - 2 = 21dBm + * + * the power for 20Mhz bfon 2ss: 23 - 3 = 20dBm + * + * the power for 20Mhz bfon 3ss: 23 - 4 = 19dBm + * + * the power for 20Mhz bfon 4ss: 23 - 5 = 18dBm + * + * backoff_40M and backoff_80M use the same format as backoff_20M, and they are the backoff for 40Mhz and 80Mhz respectively. + * + * Unless an error occurs, the output will be the string complete. + * + * \sa qcsapi_channel_power_table + */ +extern int qcsapi_wifi_set_chan_power_table(const char *ifname, + qcsapi_channel_power_table *chan_power_table); + +/** + * \brief Get the current mode for selecting power table. + * + * Get the current mode for selecting power table. + * + * \param p_power_selection a pointer to the buffer for storing the returned value + * + * \return 0 if the mode for selecting power table was returned. + * \return A negative value if an error occurred. + * + * \callqcsapi + * + * call_qcsapi get_power_selection + * + * The output will be the mode for selecting power table number unless an error occurs. + */ +extern int qcsapi_wifi_get_power_selection( qcsapi_unsigned_int *p_power_selection ); + +/** + * \brief Set the mode for selecting power table. + * + * Set the mode for selecting power table. + * + * \param power_selection the mode to be used + * + * \return 0 if the mode is set successfully. + * \return A negative value if an error occurred. + * + * \callqcsapi + * + * call_qcsapi set_power_selection \ + * + * Unless an error occurs, the output will be the string complete. + */ +extern int qcsapi_wifi_set_power_selection( const qcsapi_unsigned_int power_selection ); + +/** + * \brief Get Carrier/Interference. + * + * This API is used to get Carrier/Interference (db). + * + * \param ifname \wifi0 + * \param ci return the Carrier/Interference in db unit. + * + * \return negative value on error, 0 on success. + * + * \callqcsapi + * + * call_qcsapi get_carrier_db \ + * + * Unless an error occurs, the output will be the value of the + * Carrier/Interference in db unit. + */ +extern int qcsapi_wifi_get_carrier_interference(const char *ifname, + int *ci); + +/** + * \brief Get congestion index. + * + * This API is used to get current congestion index. + * + * \param ifname \wifi0 + * \param ci return value to contain the congestion index. + * The congestion index is in the range 0 - 10. + * + * \return negative value on error, 0 on success. + * + * \callqcsapi + * + * call_qcsapi get_congest_idx \ + * + * Unless an error occurs, the output will be the value of the congestion index. + */ +extern int qcsapi_wifi_get_congestion_index(const char *ifname, + int *ci); + +/** + * \brief Get the Supported TX Power Levels (as a list of percentages of the maximum allowed) + * + * This API reports the supported transmit power levels on the current channel as a list of + * percentages of the maximum allowed by the regulatory authority. A regulatory region must + * have been configured with the Set Regulatory Region API. + * + * \note \primarywifi + * + * \param ifname \wifi0only + * \param available_percentages address of a string to recve the list of available percentages. + * + * \return A negative values on error, or 0 on success. + * + * \callqcsapi + * + * call_qcsapi get_supported_tx_power \ + * + * Unless an error occurs, the output will be the list of percentages of the maximum allowed + * by the regulatory authority. + */ +extern int qcsapi_wifi_get_supported_tx_power_levels(const char *ifname, + string_128 available_percentages); +/** + * \brief Get the Current TX Power Level (as a percentage of the maximum allowed) + * + * This API reports the transmit power on the current channel as a percentage of + * the maximum allowed by the regulatory authority. A regulatory region must have + * been configured with the Set Regulatory Region API. + * + * \note \primarywifi + * + * \param ifname \wifi0only + * \param p_current_percentage return parameter to contains the percentage + * + * \return A negative values on error, or 0 on success. + * + * \callqcsapi + * + * call_qcsapi get_current_tx_power \ + * + * Unless an error occurs, the output will be the percentage of the maximum allowed + * by the regulatory authority. + */ +extern int qcsapi_wifi_get_current_tx_power_level(const char *ifname, + uint32_t *p_current_percentage); + +/** + * \brief Set power constraint of current channel + * + * This API sets the power constraint on the current channel. Power constraint will be + * filled in power constraint element of beacon and probe response when spectrum management enabled. + * + * \note \primarywifi + * + * \param ifname \wifi0only + * \param pwr_constraint power constraint to set + * + * \return A negative values on error, or 0 on success. + * + * \callqcsapi + * + * call_qcsapi set_power_constraint \ \ + * + * Unless an error occurs, the output will be the string complete. + */ +extern int qcsapi_wifi_set_power_constraint(const char *ifname, + uint32_t pwr_constraint); + +/** + * \brief Get power constraint of current channel + * + * This API returns the power constraint on the current channel. + * + * \note \primarywifi + * + * \param ifname \wifi0only + * \param p_pwr_constraint return parameter to contains power constraint + * + * \return A negative values on error, or 0 on success. + * + * \callqcsapi + * + * call_qcsapi get_power_constraint \ + * + * Unless an error occurs, the output will be the power constraint on the current channel. + */ +extern int qcsapi_wifi_get_power_constraint(const char *ifname, + uint32_t *p_pwr_constraint); + +/** + * \brief Set tpc interval if 802_11h is enabled + * + * This API sets the tpc request interval if 802_11h is enabled and periodical method + * is used. + * + * \note \primarywifi + * \note This API is available on AP/STA/WDS mode. + * + * \param ifname \wifi0only + * \param tpc_interval interval for tpc request to set + * + * \return A negative values on error, or 0 on success. + * + * \callqcsapi + * + * call_qcsapi set_tpc_interval \ \ + * + * Unless an error occurs, the output will be the string complete. + */ +extern int qcsapi_wifi_set_tpc_interval(const char *ifname, + int32_t tpc_interval); + +/** + * \brief Get tpc interval if 802_11h is enabled + * + * This API gets the tpc request interval if 802_11h is enabled and periodical method + * is used. + * + * \note \primarywifi + * \note This API is available on AP/STA/WDS mode. + * + * \param ifname \wifi0only + * \param tpc_interval interval for tpc request to set + * + * \return A negative values on error, or 0 on success. + * + * \callqcsapi + * + * call_qcsapi get_tpc_interval \ + * + * Unless an error occurs, the output will be the string complete. + */ +extern int qcsapi_wifi_get_tpc_interval(const char *ifname, + uint32_t *p_tpc_interval); + +/** + * \brief Get the record of nodes that have associated with the device. + * + * This API reports all remote STAs that have associated with the local AP. + * The MAC address of the WiFi interface is reported together with the last time + * that STA associated. The STA must pass the 4-way handshake to be included; + * that is, its security credentials must be correct. Only one entry will be + * present for a particular STA, based on its MAC address. + * + * \note \primarywifi + * + * \param ifname \wifi0only + * \param reset set this to 1 to clear the association records. + * The current set of association records will be returned. + * \param records address of the data structure to receive the association records. + * + * \return A negative values on error, or 0 on success. + * + * \callqcsapi + * + * call_qcsapi get_assoc_records \ + * + * Unless an error occur, the output will be a list of all remote STAs that have + * associated with the device, together with the time they last associated. + * + */ +extern int qcsapi_wifi_get_assoc_records(const char *ifname, + int reset, + qcsapi_assoc_records *records); + +/** + * @brief Get the global AP isolation setting + * + * Get the current global AP isolation setting + * + * \note \aponly + * + * \param ifname \wifi0only + * \param p_ap_isolate return parameter to contain the current global AP isolation setting + * + * \return 0 if the command succeeded. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi get_ap_isolate \ + * + * Unless an error occurs, the output will be 0, 1, representing the qcsapi_ap_isolate_type values. + */ +extern int qcsapi_wifi_get_ap_isolate(const char *ifname, int *p_ap_isolate); + +/** + * @brief Set the global AP isolation for all WiFi interfaces + * + * Enable or disable AP isolation global control (applies across all BSSes). + * + * When AP isolation is enabled, packets are not bridged between stations in the same BSS. + * When AP isolation is disabled, packets can be bridged between stations in the same BSS. + * AP isolation is disabled by default. + + * \note \aponly + * \note \primarywifi + * \note When enabled, this API disables AP isolation on all BSSes, regardless of the + * individual interface configuration set using set_intra_bss_isolate + * + * \param ifname \wifi0only + * \param new_ap_isolate the new AP isolation setting + * + * \return 0 if the command succeeded. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi set_ap_isolate \ \<0|1\> + * + * \sa qcsapi_ap_isolate_type + * \sa qcsapi_wifi_set_intra_bss_isolate + * \sa qcsapi_wifi_set_bss_isolate + */ +extern int qcsapi_wifi_set_ap_isolate(const char *ifname, const int new_ap_isolate); + +/** + * @brief Get the current intra-BSS isolation setting. + * + * This API returns the current intra-BSS isolation setting for the given interface. + * + * \note \aponly + * + * \param ifname \wifiX + * \param p_ap_isolate return parameter to contain the the current intra-BSS isolation setting. + * + * \return 0 on success. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi get_intra_bss_isolate \ + * + * Unless an error occurs, the output will be the current intra-BSS isolation setting for the given interface. + */ +extern int qcsapi_wifi_get_intra_bss_isolate(const char *ifname, qcsapi_unsigned_int *p_ap_isolate); + +/** + * @brief Enable or disable intra-BSS isolation per BSS. + * + * This API configures intra-BSS isolation. When enabled for a BSS, packets will not be forwarded + * from one station associated on the BSS to any other stations associated on the same BSS. + * + * \note \aponly + * \note This setting is overridden by the global qcsapi_wifi_set_ap_isolate setting, if enabled. + * + * \param ifname \wifiX + * \param new_ap_isolate the new intra-BSS isolation setting + * + * \return 0 on success. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi set_intra_bss_isolate \ \<0|1\> + * + * Unless an error occurs, the output will be the string complete. + * + * \sa qcsapi_ap_isolate_type + * \sa qcsapi_wifi_set_bss_isolate + * \sa qcsapi_wifi_set_ap_isolate + */ +extern int qcsapi_wifi_set_intra_bss_isolate(const char *ifname, const qcsapi_unsigned_int new_ap_isolate); + +/** + * @brief Get the current inter-BSS isolation setting. + * + * This API returns the current inter-BSS isolation setting for the given interface. + * + * \note \aponly + * + * \param ifname \wifiX + * \param p_ap_isolate return parameter to contain the the current BSS isolation setting. + * + * \return 0 on success. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi get_bss_isolate \ + * + * Unless an error occurs, the output will be the current BSS isolation setting. + */ +extern int qcsapi_wifi_get_bss_isolate(const char *ifname, qcsapi_unsigned_int *p_ap_isolate); + +/** + * @brief Enable or disable inter-BSS isolation. + * + * This API configures inter-BSS isolation. When enabled for a BSS, packets will not be forwarded + * from a station to any station associated on a different BSS. + * + * \note \aponly + * + * \param ifname \wifiX + * \param new_ap_isolate the new BSS isolation setting + * + * \return 0 on success. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi set_bss_isolate \ \<0|1\> + * + * Unless an error occurs, the output will be the string complete. + * + * \sa qcsapi_ap_isolate_type + * \sa qcsapi_wifi_set_ap_isolate + * \sa qcsapi_wifi_set_intra_bss_isolate + */ +extern int qcsapi_wifi_set_bss_isolate(const char *ifname, const qcsapi_unsigned_int new_ap_isolate); + +/** + * \brief Disable DFS channels + * + * Configures the list of channels permitted during operation + * + * \param ifname \wifi0 + * \param disable_dfs disable dfs channels + * \param channel channel to switch after dfs channels are disabled + * + * \return 0 on success, or other negative error codes on failure. + * + * \callqcsapi + * + * call_qcsapi disable_dfs_channels wifi0 \<0|1\> [new channel] + * + */ +extern int qcsapi_wifi_disable_dfs_channels( const char *ifname, int disable_dfs, int channel); +/**@}*/ + + +/**@addtogroup MBSSIDAPIs + *@{*/ +/*MBSS*/ + +/** + * @brief Create a new restricted BSS. + * + * Creates a new MBSSID AP-mode virtual interface with a set of default security parameters. + * This new virtual interface isn't added into back-end bridge, just for test. + * + * After calling this API function the host AP security daemon configuration is updated, reloaded and the new BSS is made active. + * Subsequent security and general interface APIs can then be called on the new virtual interface. + * + * \param ifname \wifi0 + * \param mac_addr mac address of the created vap. If set to 0, driver will generate one mac address + * based on primary interface mac address. + * + * \return 0 if the command succeeded. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi wifi_create_restricted_bss \ [mac_addr]
+ * + * Unless an error occurs, the output will be the string complete. + */ +extern int qcsapi_wifi_create_restricted_bss( const char *ifname, const qcsapi_mac_addr mac_addr ); + +/** + * @brief Create a new BSS. + * + * Creates a new MBSSID AP-mode virtual interface with a set of default security parameters. + * + * After calling this API function the host AP security daemon configuration is updated, reloaded and the new BSS is made active. + * Subsequent security and general interface APIs can then be called on the new virtual interface. + * + * \param ifname \wifi0 + * not be present in the hostapd.conf file. + * \param mac_addr mac address of the created vap. If set to 0, driver will generate one mac address + * based on primary interface mac address. + * + * \return 0 if the command succeeded. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi wifi_create_bss \ [mac_addr]
+ * + * Unless an error occurs, the output will be the string complete. + */ +extern int qcsapi_wifi_create_bss( const char *ifname, const qcsapi_mac_addr mac_addr ); + +/** + * @brief Remove a BSS. + * + * Removes an existing MBSSID AP-mode virtual interface with interface name ifname. + * + * The API will return an error if the named interface does not exist. + * + * After calling this function, the host AP security daemon configuration is modified, reloaded and the interface named is no longer active. + * + * \param ifname \wifi0 + * + * \return 0 if the command succeeded. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi wifi_remove_bss \ + * + * Unless an error occurs, the output will be the string complete. + */ +extern int qcsapi_wifi_remove_bss( const char *ifname ); +/**@}*/ + +/**@addtogroup WDSAPIs + *@{*/ +/*WDS*/ + +/** + * @brief Add a WDS peer + * + * This API adds a new WDS peer with the given peer address. + * + * An error is returned if the maximum number of WDS peers has been reached or if the peer address already exists. + * + * \note The ifname parameter must refer to a primary interface. All WDS peers belong to the primary interface only. + * This API allows unencrypted data to be transmitted across the WDS link as soon as it has been established. + * If the link will be encrypted, use qcsapi_wds_add_peer_encrypt instead. + * + * \note \primarywifi + * + * \param ifname \wifi0only + * \param peer_address the peer address to add to the WDS interface. + * + * \return 0 if the command succeeded. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi wds_add_peer \ \ + * + * Section \ref MAC_ADDRESS_DETAILS "Format for a MAC address" shows how to format the BSSID (MAC address). + * + * Unless an error occurs, the output will be the string complete. + */ +extern int qcsapi_wds_add_peer( const char *ifname, const qcsapi_mac_addr peer_address ); + +/** + * @brief Add a WDS peer with an encrypted link + * + * This API adds a new WDS peer with the given peer address. + * + * An error is returned if the maximum number of WDS peers has been reached or if the peer address already exists. + * + * \note \primarywifi + * \note The ifname parameter must refer to a primary interface. All WDS peers belong to the primary interface only. + * + * \param ifname \wifi0only + * \param peer_address the peer address to add to the WDS interface + * \param encryption 0 if the link will not be encrypted or 1 if the link will be encrypted + * + * \return 0 if the command succeeded. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi wds_add_peer \ \ [encrypt] + * + * Section \ref MAC_ADDRESS_DETAILS "Format for a MAC address" shows how to format the BSSID + * (MAC address). + * If encrypt is set, no data is transmitted across the WDS link until it has been + * secured by using call_qcsapi wds_set_psk. + * \note Not enabling encryption means that data can be transmitted across + * the WDS link as soon as it has been configured but does not preclude encrypting the link. + * + * Unless an error occurs, the output will be the string complete. + */ +extern int qcsapi_wds_add_peer_encrypt(const char *ifname, const qcsapi_mac_addr peer_address, + const qcsapi_unsigned_int encryption); + +/** + * @brief Remove a WDS peer. + * + * This API removes an existing WDS peer. An error is returned if the peer does not exist. + * + * \note \primarywifi + * \note The ifname parameter must refer to a primary interface. All WDS peers belong to the primary interface only. + * + * \param ifname \wifi0only + * \param peer_address the peer address to remove from the WDS interface. + * + * \return 0 if the command succeeded. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi wds_remove_peer \ \ + * + * Section \ref MAC_ADDRESS_DETAILS "Format for a MAC address" shows how to format the BSSID (MAC address). + * + * Unless an error occurs, the output will be the string complete. + */ +extern int qcsapi_wds_remove_peer( const char *ifname, const qcsapi_mac_addr peer_address ); + +/** + * @brief Get a WDS peer by index + * + * This API is used to find a WDS peer address by index. + * + * This API is typically used to construct a list of the configured WDS peers. + * + * \note \primarywifi + * \note The ifname parameter must refer to a primary interface. All WDS peers belong to the primary interface only. + * + * \param ifname \wifi0only + * \param index the index to get the WDS peer address of. + * \param peer_address return parameter to contain the peer address of the given index. + * + * \return 0 if the command succeeded. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi wds_get_peer_address \ \ + * + * Section \ref MAC_ADDRESS_DETAILS "Format for a MAC address" shows how to format the BSSID (MAC address). + * + * Unless an error occurs, the output will be the BSSID for the peer, as selected by its index. + */ +extern int qcsapi_wds_get_peer_address( const char *ifname, const int index, qcsapi_mac_addr peer_address ); + +/** + * @brief Set the WPA PSK for a WDS peer connection. + * + * The WDS link between two APs in a pair can be encrypted. This encryption is per-peer. + * + * The scheme used for WDS encryption is similar to WPA-NONE encryption which is often used for + * ad-hoc connections. + * There is no key exchange protocol. Frames are encrypted with AES using a 256-bit preshared key, + * set to the same value on both peers. + * + * \note \primarywifi + * + * \param ifname \wifi0only + * \param peer_address the WDS peer to apply the key to. + * \param pre_shared_key a 256 bit key, encoded as hexadecimal ASCII characters (0-9, a-f). If this + * parameter is NULL, the WDS peer key will be cleared. + * + * \return 0 if the command succeeded. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi wds_set_psk \ \ \ + * + * where \ is the primary interface, \ is the BSSID of the peer + * AP and \ is the PSK. + * Enter the PSK as a string of exactly 64 hexadecimal digits, or NULL to pass an empty PSK to the + * API. + * + * Unless an error occurs, the output will be the string complete. + */ +extern int qcsapi_wds_set_psk( const char *ifname, const qcsapi_mac_addr peer_address, const string_64 pre_shared_key ); + +/** + * @brief Set the WDS mode for a WDS peer connection. + * + * The WDS peer can play a role of either MBS (main base station) or RBS (remote base station). + * + * \note \primarywifi + * + * \param ifname \wifi0only + * \param peer_address the WDS peer to apply the mode to. + * \param mode non-zero value for rbs mode and zero for mbs mode. + * + * \return 0 if the command succeeded. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi wds_set_mode \ \ \ + * + * where \ is the primary interface, \ is the BSSID of the peer + * AP and \ is either "rbs" or "mbs". + * + * Unless an error occurs, the output will be the string complete. + */ +extern int qcsapi_wds_set_mode( const char *ifname, const qcsapi_mac_addr peer_address, const int mode ); + +/** + * @brief Get a WDS peer mode by index + * + * This API is used to find a WDS peer mode by index. + * + * \note \primarywifi + * \note The ifname parameter must refer to a primary interface. All WDS peers belong to the + * primary interface only. + * + * \param ifname \wifi0only + * \param index the index to get the WDS peer address of. + * \param mode return parameter to contain the peer mode of the given index. + * + * \return 0 if the command succeeded. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi wds_get_mode \ \ + * + * Unless an error occurs, the output will be the mode for the peer, as selected by its index. + */ +extern int qcsapi_wds_get_mode( const char *ifname, const int index, int *mode ); + +/** + * @brief Set Extender device parameter + * + * \param ifname \wifi0 + * \param type Extender parameter type + * \param param_value Extender parameter value + * + * \return 0 if the command succeeded. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi set_extender_params \ \ \ + * + * where WiFi interface is the primary interface, parameter type is one of + * role, mbs_best_rssi, rbs_best_rssi, mbs_wgt, rbs_wgt, + * roaming, bgscan_interval, verbose. + * + * Unless an error occurs, the output will be the string complete. + */ +extern int qcsapi_wifi_set_extender_params(const char *ifname, const qcsapi_extender_type type, const int param_value); + +/** + * @brief get all Extender device parameters infomation + * + * \note \primarywifi + * + * \param ifname \wifi0only + * \param type Extender parameter type + * \param p_value Extender parameter value + * + * \return 0 if the command succeeded. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi get_extender_status \ + * + * where WiFi interface is the primary interface, + * Unless an error occurs, the output will be the Extender related parameter value. + */ + +extern int qcsapi_wifi_get_extender_params(const char *ifname, const qcsapi_extender_type type, int *p_value); + +/**@}*/ + +/**@addtogroup SecurityAPIs + *@{*/ +/* wifi only, encryption and security */ + +/** + * @brief Get the security protocol from the beacon. + * + * Get the current beacon type. Only applicable for an AP; for a STA, use the SSID Get Protocol API (qcsapi_SSID_get_protocol). + * On success, returned string will be one of those as documented in the authentication protocol table in + * \ref CommonSecurityDefinitions + * + * \note \aponly + * + * \param ifname \wifi0 + * \param p_current_beacon the protocol as returned by the API. + * + * \return 0 if the command succeeded. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi get_beacon \ + * + * Unless an error occurs, the response will be one of Basic, 11i, WPA or WPAand11i with the interpretation of each listed in + * the table in the authentication protocol table in \ref CommonSecurityDefinitions. + * + * \sa qcsapi_SSID_get_protocol + */ +extern int qcsapi_wifi_get_beacon_type( const char *ifname, char *p_current_beacon ); + +/** + * @brief Set the security protocol in the beacon. + * + * Set the current beacon type. + * + * This API only applies for an AP; for a Station, use the SSID Set Protocol API (qcsapi_SSID_set_protocol). + * + * The value for the new beacon must be one of the expected values listed in the section on the corresponding get API. + * Value must match exactly including upper vs. lower case letters. + * + * \note \aponly + * + * \param ifname \wifi0 + * \param p_new_beacon the new security protocol to set in the beacon. + * + * \return 0 if the command succeeded. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi set_beacon \ \ + * + * Unless an error occurs, the output will be the string complete. + * + * Beacon type needs to be one of the values as per the authentication protocol table in \ref CommonSecurityDefinitions. + * + * \sa qcsapi_SSID_set_protocol + */ +extern int qcsapi_wifi_set_beacon_type( const char *ifname, const char *p_new_beacon ); + +/* WEP */ + +/** + * \brief API is not supported + * + * \return -EOPNOTSUPP. + */ +extern int qcsapi_wifi_get_WEP_key_index( const char *ifname, qcsapi_unsigned_int *p_key_index ); + +/** + * \brief API is not supported + * + * \return -EOPNOTSUPP. + */ +extern int qcsapi_wifi_set_WEP_key_index( const char *ifname, const qcsapi_unsigned_int key_index ); + +/** + * \brief API is not supported + * + * \return -EOPNOTSUPP. + */ +extern int qcsapi_wifi_get_WEP_key_passphrase( const char *ifname, string_64 current_passphrase ); + +/** + * \brief API is not supported + * + * \return -EOPNOTSUPP. + */ +extern int qcsapi_wifi_set_WEP_key_passphrase( const char *ifname, const string_64 new_passphrase ); + +/** + * \brief Retrieves current encryption level and supported encryption levels. + * + * qcsapi_wifi_get_WEP_encryption_level return current encryption level describing + * current encryption state and available encrytion options + * for example 'Disabled,40-bit,104-bit,128-bit' + * + * \param ifname \wifi0 + * \param current_encryption_level String to store encryption level data. Type string string_64 + * + * \return >= 0 on success + * \return -EFAULT if current_encryption_level is NULL + * \return -EMSGSIZE or negative number if underlying wireless_extensions API indicated an error + * + * \callqcsapi + * + * call_qcsapi get_WEP_encryption_level \ <current_encryption_level> + * + * Unless an error occurs, the output will be the string describing the encryption level + * for example 'Disabled,40-bit,104-bit,128-bit'. + */ +extern int qcsapi_wifi_get_WEP_encryption_level( const char *ifname, string_64 current_encryption_level ); + +/** + * \brief API is not supported + * + * \return -EOPNOTSUPP. + * + */ +extern int qcsapi_wifi_get_basic_encryption_modes( const char *ifname, string_32 encryption_modes ); + +/** + * \brief API is not supported + * + * \return -EOPNOTSUPP. + */ +extern int qcsapi_wifi_set_basic_encryption_modes( const char *ifname, const string_32 encryption_modes ); + +/** + * \brief API is not supported + * + * \return -EOPNOTSUPP. + */ +extern int qcsapi_wifi_get_basic_authentication_mode( const char *ifname, string_32 authentication_mode ); + +/** + * \brief API is not supported. + * + * \return -EOPNOTSUPP. + */ +extern int qcsapi_wifi_set_basic_authentication_mode( const char *ifname, const string_32 authentication_mode ); + +/** + * \brief API is not supported + * + * \return -EOPNOTSUPP + */ +extern int qcsapi_wifi_get_WEP_key( const char *ifname, qcsapi_unsigned_int key_index, string_64 current_passphrase ); + +/** + * \brief API is not supported + * + * \return -EOPNOTSUPP + */ +extern int qcsapi_wifi_set_WEP_key( const char *ifname, qcsapi_unsigned_int key_index, const string_64 new_passphrase ); + +/* WPA */ + +/** + * @brief Get the security encryption mode(s) configured. + * + * Get the current WPA/11i encryption protocol(s) in use. + * Applies to AP only. For a STA, use qcsapi_SSID_get_encryption_modes. + * + * \note \aponly + * + * \param ifname \wifi0 + * \param encryption_modes a string containing a value per the encryption definitions table in + * the \ref CommonSecurityDefinitions section. + * + * \return 0 if the command succeeded. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi get_WPA_encryption_modes \ + * + * Unless an error occurs, the output will be one of the strings listed in the encryption definitions table + * in the \ref CommonSecurityDefinitions section. + * + * \sa qcsapi_SSID_get_encryption_modes + */ +extern int qcsapi_wifi_get_WPA_encryption_modes( const char *ifname, string_32 encryption_modes ); + +/** + * @brief Set the security encryption mode(s). + * + * Set the current security encryption mode(s). Applies to AP only. For a STA, use qcsapi_SSID_set_encryption_modes. + * Value is required to be one of the expected values from the corresponding get operation. + * Value must match exactly including upper vs. lower case letters. + * + * \note \aponly + * + * \param ifname \wifi0 + * \param encryption_modes a string containing a value per the encryption definitions table in + * the \ref CommonSecurityDefinitions section. + * + * \callqcsapi + * + * call_qcsapi set_WPA_encryption_modes \ \ + * + * Unless an error occurs, the output will be the string complete. + * + * Encryptions mode(s) needs to be one of the values per the encryption definitions table in + * the \ref CommonSecurityDefinitions section. + * + * \sa qcsapi_SSID_set_encryption_modes + */ +extern int qcsapi_wifi_set_WPA_encryption_modes( const char *ifname, const string_32 encryption_modes ); + +/** + * @brief Get the security authentication mode configured. + * + * Get the current security authentication mode in use. + * Applies to AP only. For a STA, use qcsapi_SSID_get_authentication_mode + * + * \note \aponly + * + * \param ifname \wifi0 + * \param authentication_mode a string containing a value per the authentication types table in + * the \ref CommonSecurityDefinitions section. + * + * \return 0 if the command succeeded. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi get_WPA_authentication_mode \ + * + * Unless an error occurs, the output will be one of the strings listed in the authentication type table + * in the \ref CommonSecurityDefinitions section. + * + * \sa qcsapi_SSID_get_authentication_mode + */ +extern int qcsapi_wifi_get_WPA_authentication_mode( const char *ifname, string_32 authentication_mode ); + + +/** + * @brief Set the security authentication mode. + * + * Set the current security authentication mode. Applies to AP only. For a STA, use qcsapi_SSID_set_authentication_modes. + * Value is required to be one of the expected values from the corresponding get operation. + * Value must match exactly including upper vs. lower case letters. + * + * \note \aponly + * + * Steps to enable EAP Authentication: + * Set the EAP Authentication mode and the EAP Server Parameters. + * + * Command to set EAPAuthentication: + * \li call_qcsapi set_WPA_authentication_modes EAP Authentication + * + * Command to set Encryption: + * \li call_qcsapi set_WPA_encryption_modes $device + * + * Command to configure RADIUS authentication severs: + * \li call_qcsapi add_radius_auth_server_cfg + * \li call_qcsapi del_radius_auth_server_cfg + * \li call_qcsapi get_radius_auth_server_cfg + * + * \param ifname \wifi0 + * \param authentication_mode a string containing a value per the authentication type table in + * the \ref CommonSecurityDefinitions section. + * + * \return 0 if the command succeeded. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi set_WPA_authentication_modes \ \ + * + * Unless an error occurs, the output will be the string complete. + * + * The authentication mode needs to be one of the values per the authentication type definitions table in + * the \ref CommonSecurityDefinitions section. + * + * \sa qcsapi_SSID_set_authentication_modes + */ +extern int qcsapi_wifi_set_WPA_authentication_mode( const char *ifname, const string_32 authentication_mode ); + +/** + * \brief Get the 802.11u Interworking status + * + * Get the 802.11u Interworking status. + * + * \param ifname \wifiX + * \param interworking a pointer to the buffer for storing the returned value + * + * \return 0 if the command succeeded. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * This command is only supported on Access Points. + * + * \callqcsapi + * + * call_qcsapi get_interworking \ + * + * The output will be the interworking status unless an error occurs. + */ +extern int qcsapi_wifi_get_interworking( const char *ifname, string_32 interworking ); + +/** + * \brief Set the 802.11u Interworking status + * + * Set the 802.11u Interworking status. + * + * \param ifname \wifiX + * \param interworking 0(Disable), 1(Enable) + * + * \return 0 if the command succeeded. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * This command is only supported on Access Points. + * + * \callqcsapi + * + * call_qcsapi set_interworking \ \ + * + * Unless an error occurs, the output will be the string complete. + */ +extern int qcsapi_wifi_set_interworking( const char *ifname, const string_32 interworking ); + +/** + * \brief Get an 802.11u parameter + * + * Get the value for the specified 802.11u parameter, as specified by + * the qcsapi_80211u_params parameter, with the value returned + * in the address specified by p_buffer. + * + * \param ifname \wifiX + * \param u_param is 802.11u parameter to get the value of + * \param p_buffer return parameter to contain the value of the 802.11u parameter + * + * \return 0 if the command succeeded. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * This command is only supported on Access Points. + * + * \callqcsapi + * + * call_qcsapi get_80211u_params \ \ + * + * The output will be the 802.11u parameter unless an error occurs. + */ +extern int qcsapi_wifi_get_80211u_params( const char *ifname, + const string_32 u_param, + string_256 p_buffer ); + +/** + * \brief Set an 802.11u parameter + * + * Set the value for a specified 802.11u parameter. + * + * \param ifname \wifiX + * \param param is the 802.11u parameter to set + * \param value1 is the first value for the parameter + * \param value2 is the second value for the parameter, or + * NULL if the parameter has only one value + * + * \return 0 if the command succeeded. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * This command is only supported on Access Points. + * + * Valid parameters and their corresponding values shown in the following table. + * The exact format of the values for each parameter are described in the + * hostapd.conf man page. + * + * + * + * + * + * + * + * + * + * + *
Parameter value1 value2
internet 0 or 1 -
access_network_type type -
network_auth_type indicator value -
hessid MAC address -
ipaddr_type_availability IPv4 type IPv6 type
domain_name domain name -
anqp_3gpp_cell_net MCC1,MNC1;MCC2,MNC2;...
+ * + * \note Max anqp_3gpp_cell_net count is IEEE80211U_3GPP_CELL_NET_MAX + * + * \callqcsapi + * + * call_qcsapi set_80211u_params \ \ \ \ + * + * Unless an error occurs, the output will be the string complete. + */ +extern int qcsapi_wifi_set_80211u_params( const char *ifname, const string_32 param, + const string_256 value1, const string_32 value2 ); + +/** + * \brief Get 802.11 NAI Realms + * + * Get a list of the configured 802.11u NAI Realms. + * + * \param ifname \wifiX + * + * \param p_value is pointer to the buffer for storing the returned value + * + * \return 0 if the command succeeded. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * This command is only supported on Access Points. + * + * \callqcsapi + * + * call_qcsapi get_nai_realms \ + * + * The output will be a list of NAI Realms unless an error occurs. + */ +extern int qcsapi_security_get_nai_realms( const char *ifname, string_4096 p_value ); + +/** + * \brief Add or update an 802.11 NAI Realm + * + * Add or update an 802.11u NAI Realm. + * + * \param ifname \wifiX + * \param encoding accepts value 0 or 1 + * \param nai_realm + * \param eap_method + * + * \note If the NAI Realm already exists, it will be updated. + * + * \return 0 if the command succeeded. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * This command is only supported on Access Points. + * + * \callqcsapi + * + * call_qcsapi add_nai_realm \ \ \ \ + * + * Unless an error occurs, the output will be the string complete. + */ +extern int qcsapi_security_add_nai_realm( const char *ifname, + const int encoding, + const char *nai_realm, + const char *eap_method ); + +/** + * \brief Delete an 802.11u NAI Realm + * + * Delete an existing 802.11u NAI Realm. + * + * \param ifname \wifiX + * \param p_value nai_realm to be deleted + * + * \return 0 if the command succeeded. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * This command is only supported on Access Points. + * + * \callqcsapi + * + * call_qcsapi del_nai_realm \ \ + * + * Unless an error occurs, the output will be the string complete. + */ +extern int qcsapi_security_del_nai_realm( const char *ifname, const char *nai_realm ); + +/** + * \brief Get 802.11u Roaming Consortia + * + * Get the list of configured 802.11 Roaming Consortia. + * + * \param ifname \wifiX + * \param p_value is pointer to the buffer for storing the returned value + * + * \return 0 if the command succeeded. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * This command is only supported on Access Points. + * + * \callqcsapi + * + * call_qcsapi get_roaming_consortium \ + * + * The output will be the roaming consortium value unless an error occurs. + */ +extern int qcsapi_security_get_roaming_consortium( const char *ifname, string_1024 p_value ); + +/** + * \brief Add the 802.11u roaming_consortium + * + * Add an 802.11u Roaming Consortium. + * + * \param ifname \wifiX + * \param p_value the Roaming Consortium OI, which is a 3 to 15 octet hexadecimal string + * + * \return 0 if the command succeeded. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * This command is only supported on Access Points. + * + * \callqcsapi + * + * call_qcsapi add_roaming_consortium \ \ + * + * Unless an error occurs, the output will be the string complete. + */ +extern int qcsapi_security_add_roaming_consortium( const char *ifname, const char *p_value ); + +/** + * \brief Delete a 802.11u Roaming Consortium. + * + * Delete an existing 802.11 Roaming Consortium. + * + * \param ifname \wifiX + * \param p_value roaming_consortium to be deleted + * + * \return 0 if the command succeeded. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * This command is only supported on Access Points. + * + * \callqcsapi + * + * call_qcsapi del_roaming_consortium \ \ + * + * Unless an error occurs, the output will be the string complete. + */ +extern int qcsapi_security_del_roaming_consortium( const char *ifname, const char *p_value ); + +/** + * \brief Get 802.11u Venue names + * + * Get the list of configured 802.11 Venue names. + * + * \param ifname \wifiX + * \param p_value is pointer to the buffer for storing the returned value + * + * \return 0 if the command succeeded. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * This command is only supported on Access Points. + * + * \callqcsapi + * + * call_qcsapi get_venue_name \ + * + * The output will be the list of venue names unless an error occurs. + */ +extern int qcsapi_security_get_venue_name( const char *ifname, string_4096 p_value ); + +/** + * \brief Add the 802.11u venue name + * + * Add an 802.11u venue name. + * + * \param ifname \wifiX + * \param lang_code 2 or 3 character ISO-639 language code. E.g. "eng" for English + * \param name venue name (Max IEEE80211U_VENUE_NAME_LEN_MAX characters) + * + * \return 0 if the command succeeded. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * This command is only supported on Access Points. + * + * \callqcsapi + * + * call_qcsapi add_venue_name \ \ \ + * + * Unless an error occurs, the output will be the string complete. + */ +extern int qcsapi_security_add_venue_name( const char *ifname, const char *lang_code, const char *venue_name ); + +/** + * \brief Delete the 802.11u venue name + * + * Delete an 802.11u venue name. + * + * \param ifname \wifiX + * \param lang_code 2 or 3 character ISO-639 language code. E.g. "eng" for English + * \param name venue name (Max IEEE80211U_VENUE_NAME_LEN_MAX characters) + * + * \return 0 if the command succeeded. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * This command is only supported on Access Points. + * + * \callqcsapi + * + * call_qcsapi del_venue_name \ \ \ + * + * Unless an error occurs, the output will be the string complete. + */ +extern int qcsapi_security_del_venue_name( const char *ifname, const char *lang_code, const char *venue_name ); + +/** + * \brief Get Hotspot 2.0 opererator friendly names + * + * Get the list of configured Hotspot 2.0 opererator friendly names. + * + * \param ifname \wifiX + * \param p_value is pointer to the buffer for storing the returned value + * + * \return 0 if the command succeeded. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * This command is only supported on Access Points. + * + * \callqcsapi + * + * call_qcsapi get_oper_friendly_name \ + * + * The output will be the list of Hotspot 2.0 opererator friendly names unless an error occurs. + */ +extern int qcsapi_security_get_oper_friendly_name( const char *ifname, string_4096 p_value ); + +/** + * \brief Add Hotspot 2.0 opererator friendly name + * + * Add an Hotspot 2.0 opererator friendly name. + * + * \param ifname \wifiX + * \param lang_code 2 or 3 character ISO-639 language code. E.g. "eng" for English + * \param name Hotspot 2.0 opererator friendly name (Max HS20_OPER_FRIENDLY_NAME_LEN_MAX characters) + * + * \return 0 if the command succeeded. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * This command is only supported on Access Points. + * + * \callqcsapi + * + * call_qcsapi add_oper_friendly_name \ \ \ + * + * Unless an error occurs, the output will be the string complete. + */ +extern int qcsapi_security_add_oper_friendly_name( const char *ifname, const char *lang_code, + const char *oper_friendly_name ); + +/** + * \brief Delete Hotspot 2.0 opererator friendly name + * + * Delete an Hotspot 2.0 opererator friendly name. + * + * \param ifname \wifiX + * \param lang_code 2 or 3 character ISO-639 language code. E.g. "eng" for English + * \param name Hotspot 2.0 opererator friendly name ( Max HS20_OPER_FRIENDLY_NAME_LEN_MAX characters ) + * + * \return 0 if the command succeeded. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * This command is only supported on Access Points. + * + * \callqcsapi + * + * call_qcsapi del_oper_friendly_name \ \ \ + * + * Unless an error occurs, the output will be the string complete. + */ +extern int qcsapi_security_del_oper_friendly_name( const char *ifname, const char *lang_code, + const char *oper_friendly_name ); + +/** + * \brief Get Hotspot 2.0 connection capability + * + * Get the list of configured Hotspot 2.0 connection capability. + * + * \param ifname \wifiX + * \param p_value is pointer to the buffer for storing the returned value + * + * \return 0 if the command succeeded. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * This command is only supported on Access Points. + * + * \callqcsapi + * + * call_qcsapi get_hs20_conn_capab \ + * + * The output will be the list of Hotspot 2.0 connection capability unless an error occurs. + */ +extern int qcsapi_security_get_hs20_conn_capab( const char *ifname, string_4096 p_value ); + +/** + * \brief Add Hotspot 2.0 connection capability + * + * Add an Hotspot 2.0 connection capability. + * + * \param ifname \wifiX + * \param ip_proto is IP Protocol from 0 to IPPROTO_MAX + * \param port_num is Port Number from 0 to USHRT_MAX + * \param status is status of selected IP Protocol and Port Number. + * It can be 0 = Closed, 1 = Open, 2 = Unknown + * + * \return 0 if the command succeeded. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * This command is only supported on Access Points. + * + * \callqcsapi + * + * call_qcsapi add_hs20_conn_capab \ \ \ \ + * + * Unless an error occurs, the output will be the string complete. + */ +extern int qcsapi_security_add_hs20_conn_capab( const char *ifname, const char *ip_proto, + const char *port_num, const char *status ); + +/** + * \brief Delete Hotspot 2.0 connection capability + * + * Delete an Hotspot 2.0 connection capability. + * + * \param ifname \wifiX + * \param ip_proto is IP Protocol from 0 to IPPROTO_MAX + * \param port_num is Port Number from 0 to USHRT_MAX + * \param status is status of selected IP Protocol and Port Number. + * It can be 0 = Closed, 1 = Open, 2 = Unknown. + * + * \return 0 if the command succeeded. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * This command is only supported on Access Points. + * + * \callqcsapi + * + * call_qcsapi del_hs20_conn_capab \ \ \ \ + * + * Unless an error occurs, the output will be the string complete. + */ +extern int qcsapi_security_del_hs20_conn_capab( const char *ifname, const char *ip_proto, + const char *port_num, const char *status ); +/** + * \brief Get the Hotspot 2.0 parameter status + * + * Get the Hotspot 2.0 parameter status. + * + * \param ifname \wifiX + * \param p_hs20 a pointer to the buffer for storing the returned value + * + * \return 0 if the command succeeded. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * This command is only supported on Access Points. + * + * \callqcsapi + * + * call_qcsapi get_hs20_status \ + * + * The output will be the hs status unless an error occurs. + */ +extern int qcsapi_wifi_get_hs20_status( const char *ifname, string_32 p_hs20 ); + +/** + * \brief Enable or Disable Hotspot 2.0 + * + * Enable or Disable Hotspot 2.0. + * + * \param ifname \wifiX + * \param hs20_val either 0(Disable) or 1(Enable) + * + * \return 0 if the command succeeded. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \note If Hotspot 2.0 is enabled then WPS will be disabled. + * + * This command is only supported on Access Points. + * + * \callqcsapi + * + * call_qcsapi set_hs20_status \ \ + * + * Unless an error occurs, the output will be the string complete. + */ +extern int qcsapi_wifi_set_hs20_status( const char *ifname, const string_32 hs20_val ); + +/** + * \brief Get the Proxy ARP parameter status + * + * Get the current Proxy ARP status. + * + * \param ifname \wifiX + * \param p_proxy_arp a pointer to the buffer for storing the returned value + * + * \return 0 if the command succeeded. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * This command is only supported on Access Points. + * + * \callqcsapi + * + * call_qcsapi get_proxy_arp \ + * + * The output will be the Proxy ARP status unless an error occurs. + */ +extern int qcsapi_wifi_get_proxy_arp( const char *ifname, string_32 p_proxy_arp ); + +/** + * \brief Set the Proxy ARP parameter + * + * Set a Proxy ARP parameter. + * + * \param ifname \wifiX + * \param proxy_arp_val 0-Disable, 1-Enable + * + * \return 0 if the command succeeded. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * This command is only supported on Access Points. + * + * \callqcsapi + * + * call_qcsapi set_proxy_arp \ \ + * + * Unless an error occurs, the output will be the string complete. + */ +extern int qcsapi_wifi_set_proxy_arp( const char *ifname, const string_32 proxy_arp_val ); + +/** + * \brief Get the L2 external filter parameters + * + * Get the current L2 external filter parameters. + * + * \param ifname \wifiX + * \param param parameter to get value of + * \param value a pointer to the buffer for storing the returned value + * + * \return 0 if the command succeeded. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * This command is only supported on Access Points. + * + * \callqcsapi + * + * call_qcsapi get_l2_ext_filter \ \ + * + * The output will be the L2 external filter status unless an error occurs. + */ +extern int qcsapi_wifi_get_l2_ext_filter( const char *ifname, const string_32 param, + string_32 value ); + +/** + * \brief Set the L2 external filter parameters + * + * Set the L2 external filter parameters. + * + * \param ifname \wifiX + * \param param parameter to set value of + * \param value value to be set for the parameter + * + * \return 0 if the command succeeded. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * This command is only supported on Access Points. + * + * Valid parameters and their corresponding values shown in the following table. + * + * + * + * + * + *
Parameter value
status 0 (Disable) or 1 (Enable)
port EMAC0 or EMAC1
+ * + * \callqcsapi + * + * call_qcsapi set_l2_ext_filter \ \ \ + * + * Unless an error occurs, the output will be the string complete. + */ +extern int qcsapi_wifi_set_l2_ext_filter( const char *ifname, const string_32 param, + const string_32 value ); + +/** + * \brief Get the hs2 parameter + * + * Get the value for the specified hs2 parameter, as specified by + * the qcsapi_hs20_params, with the value returned + * in the address specified by p_buffer. + * + * \param ifname \wifiX + * \param hs_param is hs2 parameter to get the value of + * \param p_buffer return parameter to contain the value of the hs2 parameter + * + * \return 0 if the command succeeded. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * This command is only supported on Access Points. + * + * \callqcsapi + * + * call_qcsapi get_hs20_params \ \ + * + * The output will be the hs parameter unless an error occurs. + */ +extern int qcsapi_wifi_get_hs20_params( const char *ifname, const string_32 hs_param, string_32 p_buffer ); + +/** + * \brief Set a Hotspot 2.0 parameter value + * + * Set a value for the specified Hotspot 2.0 parameter. + * + * \param ifname \wifiX + * \param hs_param is hs parameter to set + * \param value1-value6 values to be set for the parameter (value2 - value6 may be NULL) + * + * \return 0 if the command succeeded. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * This command is only supported on Access Points. + * + * Valid parameters and their corresponding values are shown in the following table. + * The exact format of the values for each parameter are described in the + * hostapd.conf man page. + * +* + * + * + * + * + *
Parameter value1 value2 value3 value4 value5 value6
hs20_wan_metrics WAN Info Downlink Speed Uplink Speed Downlink Load Uplink Load Load Measurement
disable_dgaf 0 or 1 - - - - -
hs20_operating_class Single Band 2.4 GHz Single Band 5 GHz - - - -
+ * + * \callqcsapi + * + * call_qcsapi set_hs20_params \ \ \ \ \ \ \ \ + * + * Unless an error occurs, the output will be the string complete. + */ +extern int qcsapi_wifi_set_hs20_params( const char *ifname, const string_32 hs_param, + const string_64 value1, const string_64 value2, + const string_64 value3, const string_64 value4, + const string_64 value5, const string_64 value6 ); + +/** + * \brief Remove the 802.11u parameter + * + * Remove the value for the specified 802.11u parameter from hostapd.conf file, + * as specified by the qcsapi_11u_params parameter. + * + * \param ifname \wifiX + * \param param 802.11u parameter to be removed + * + * \return 0 if the command succeeded. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * This command is only supported on Access Points. + * + * \callqcsapi + * + * call_qcsapi remove_11u_param \ \ + * + * Unless an error occurs, the output will be the string complete. + */ +extern int qcsapi_remove_11u_param( const char *ifname, const string_64 param ); + +/** + * \brief Remove the hs parameter + * + * Remove hs parameter from hostapd.conf , as specified by + * the qcsapi_hs20_params parameter. + * + * \param ifname \wifiX + * \param hs_param Hotspot 2.0 parameter to be removed + * + * \return 0 if the command succeeded. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * This command is only supported on Access Points. + * + * \callqcsapi + * + * call_qcsapi remove_hs20_param \ \ + * + * Unless an error occurs, the output will be the string complete. + */ +extern int qcsapi_remove_hs20_param( const char *ifname, const string_64 hs_param ); + +/** + * \brief see qcsapi_wifi_get_WPA_encryption_modes + * + * \sa qcsapi_wifi_get_WPA_encryption_modes + */ +extern int qcsapi_wifi_get_IEEE11i_encryption_modes( const char *ifname, string_32 encryption_modes ); + +/** + * \brief see qcsapi_wifi_set_WPA_encryption_modes + * + * \sa qcsapi_wifi_set_WPA_encryption_modes + */ +extern int qcsapi_wifi_set_IEEE11i_encryption_modes( const char *ifname, const string_32 encryption_modes ); + +/** + * \brief see qcsapi_wifi_get_WPA_authentication_mode + * + * \sa qcsapi_wifi_get_WPA_authentication_mode + */ +extern int qcsapi_wifi_get_IEEE11i_authentication_mode( const char *ifname, string_32 authentication_mode ); + +/** + * \brief see qcsapi_wifi_set_WPA_authentication_mode + * + * \sa qcsapi_wifi_set_WPA_authentication_mode + */ +extern int qcsapi_wifi_set_IEEE11i_authentication_mode( const char *ifname, const string_32 authentication_mode ); + +/** + * @brief Get TKIP MIC errors count. + * + * The total number of times the Michael integrity check has failed. This is an accumulated value of number of times + * MIC check failed starting from the beginning of device operation. Used for information purposes, it is not used + * directly for triggering Michael countermeasures event. Relevant only to WPA and 802.11i. + * + * \param ifname \wifi0 + * \param errcount a pointer to memory where MIC error count value should be placed + * + * \return 0 if the command succeeded. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi get_michael_errcnt \ + * + * Unless an error occurs, the output will be the total number of Michael integrity check errors on specified interface. + */ +extern int qcsapi_wifi_get_michael_errcnt( const char *ifname, uint32_t *errcount ); + +/** + * \brief Get the preshared key + * + * Get the WPA or RSN preshared key for an SSID. + * + * \note \primarywifi + * + * \param ifname \wifi0only + * \param key_index reserved - set to zero + * \param pre_shared_key a pointer to the buffer for storing the returned value + * + * \return 0 if the command succeeded. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * This command is only supported on Access Points. + * + * \callqcsapi + * + * call_qcsapi get_pre_shared_key \ \ + * + * call_qcsapi get_PSK \ \ + * + * The output will be the preshared key unless an error occurs. + */ +extern int qcsapi_wifi_get_pre_shared_key( const char *ifname, const qcsapi_unsigned_int key_index, string_64 pre_shared_key ); + +/** + * \brief Set the preshared key + * + * Set the WPA or RSN preshared key for an SSID. + * + * \note \primarywifi + * + * \param ifname \wifi0only + * \param key_index reserved - set to zero + * \param pre_shared_key a 64 hex digit PSK + * + * \return 0 if the command succeeded. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * This command is only supported on Access Points. + * + * \callqcsapi + * + * call_qcsapi set_pre_shared_key \ \ \ + * + * call_qcsapi set_PSK \ \ \ + * + * Unless an error occurs, the output will be the string complete. + */ +extern int qcsapi_wifi_set_pre_shared_key( const char *ifname, const qcsapi_unsigned_int key_index, const string_64 pre_shared_key ); + +/** + * \brief Add RADIUS authentication server + * + * Add RADIUS authentication server configuration + * + * \param ifname wireless interface (e.g. wifi0) + * \param radius_auth_server_ipaddr - IP address of the RADIUS server + * \param radius_auth_server_port - Port of the RADIUS server + * \param radius_auth_server_sh_key - Shared secret key of the RADIUS server + * + * \return 0 if the command succeeded. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * This command is only supported on Access Points. + * + * \callqcsapi + * + * call_qcsapi add_radius_auth_server_cfg \ \ \ \ + * + * Unless an error occurs, the output will be the string complete. + */ +extern int qcsapi_wifi_add_radius_auth_server_cfg( const char *ifname, const char *radius_auth_server_ipaddr, + const char *radius_auth_server_port, const char *radius_auth_server_sh_key); + +/** + * \brief Remove RADIUS authentication server + * + * Remove RADIUS authentication server configuration + * + * \param ifname wireless interface (e.g. wifi0) + * \param radius_auth_server_ipaddr - IP address of RADIUS server + * \param radius_auth_server_port - Port of the RADIUS server + * + * \return 0 if the command succeeded. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * This command is only supported on Access Points. + * + * \callqcsapi + * + * call_qcsapi del_radius_auth_server_cfg \ \ \ + * + * Unless an error occurs, the output will be the string complete. + */ +extern int qcsapi_wifi_del_radius_auth_server_cfg( const char *ifname, const char *radius_auth_server_ipaddr, + const char *constp_radius_port); + +/** + * \brief Get RADIUS authentication server + * + * Get RADIUS authentication server configuration + * + * \param ifname wireless interface (e.g. wifi0) + * \param radius_auth_server_cfg - reads the RADIUS server configuraion + * + * \return 0 if the command succeeded. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * This command is only supported on Access Points. + * + * \callqcsapi + * + * call_qcsapi get_radius_auth_server_cfg \ + * + * Unless an error occurs, the output will be the string complete. + */ +extern int qcsapi_wifi_get_radius_auth_server_cfg( const char *ifname, string_1024 radius_auth_server_cfg); + +/** + * \brief Set the EAP own ip address of the AP + * + * Set the EAP own ip address of the AP. + * + * \note \primarywifi + * + * \param ifname \wifi0only + * \param own_ip_addr + * + * \return 0 if the command succeeded. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * This command is only supported on Access Points. + * + * \callqcsapi + * + * call_qcsapi set_own_ip_addr \ \ + * + * Unless an error occurs, the output will be the string complete. + */ +extern int qcsapi_wifi_set_own_ip_addr( const char *ifname, const string_16 own_ip_addr ); + +/** + * @brief Get the WiFi passphrase for the given interface. + * + * Returns the current WPA/11i passphrase. Applies to AP only. For a STA, use qcsapi_SSID_get_key_passphrase. + * + * \note \aponly + * + * \param ifname \wifi0 + * \param key_index - reserved, set to 0. + * \param passphrase a string to store the passphrase. + * + * \return 0 if the command succeeded. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi get_key_passphrase \ 0 + * + * call_qcsapi get_passphrase \ 0 + * + * Unless an error occurs, the output will be the current passphrase. + * + * The final '0' in the command line represents the key index. + * + * \sa qcsapi_SSID_get_key_passphrase + */ +extern int qcsapi_wifi_get_key_passphrase( const char *ifname, const qcsapi_unsigned_int key_index, string_64 passphrase ); + +/** + * @brief Set the WiFi passphrase (ASCII) for the given interface. + * + * Sets the WPA/11i ASCII passphrase. Applies to AP only. For a STA, use qcsapi_SSID_set_key_passphrase. + * + * By the WPA standard, the passphrase is required to have between 8 and 63 ASCII characters. + * + * \note \aponly + * + * \param ifname \wifi0 + * \param key_index - reserved, set to 0. + * \param the NULL terminated passphrase string, 8 - 63 ASCII characters (NULL termination not included in the count) + * + * \return 0 if the command succeeded. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi set_key_passphrase \ 0 + * + * call_qcsapi set_passphrase \ 0 + * + * Unless an error occurs, the output will be the string complete. + * + * The final '0' in the command line represents the key index. + * + * \note The Linux shell processes the passphase parameter. Selected characters are interpreted by the shell, + * including the dollar sign ($), the backslash (\) and the backquote (`). We recommend putting the new passphrase + * in quotes and/or using the backslash character to "escape" characters that could be processed by the shell. + * + * \sa qcsapi_SSID_get_key_passphrase + */ +extern int qcsapi_wifi_set_key_passphrase( const char *ifname, const qcsapi_unsigned_int key_index, const string_64 passphrase ); + +/** + * \brief Get the Group key interval + * + * Get the group key interval. + * + * \note \aponly + * + * \param ifname \wifi0 + * \param group_key_interval a pointer to the buffer for storing the returned value + * + * \return 0 if the command succeeded. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi get_group_key_interval \ + * + * The output will be the group key interval unless an error occurs. + * + */ +extern int qcsapi_wifi_get_group_key_interval( const char *ifname, string_16 group_key_interval ); + +/** + * \brief Set the Group key interval + * + * Set the group key interval. + * + * \note \aponly + * + * \param ifname \wifi0 + * \param group_key_interval + * + * \return 0 if the command succeeded. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi set_group_key_interval \ \ + * + * Unless an error occurs, the output will be the string complete. + * + */ +extern int qcsapi_wifi_set_group_key_interval( const char *ifname, const string_16 group_key_interval ); + +/** + * @brief Get the 802.11w capability for the given interface. + * + * Returns the current 802.11w pmf capability. Applies to AP. + * + * \note \aponly + * + * \param ifname \wifi0 + * \param passphrase an int rt. + * + * \return 0 if the command succeeded. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi get_pmf\ 0 + * + * call_qcsapi get_pmf \ 0 + * + * Unless an error occurs, the output will be the current pmf capability. + * + * \sa qcsapi_SSID_get_pmf + */ +extern int qcsapi_wifi_get_pmf( const char *ifname, int *p_pmf_cap); + +/** + * @brief Set the 802.11w / PMF capability for the given interface. + * + * Sets the 802.11w / PMF capability. Applies to AP. + * + * \note \aponly + * + * \param ifname \wifi0 + * \param pmf_cap. + * + * \return 0 if the command succeeded. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi set_pmf \ 0 + * + * call_qcsapi set_pmf \ 0 + * + * Unless an error occurs, the output will be the string complete. + * + * The final '0' in the command line represents the key index. + * + * \note The Linux shell processes the pmf parameter + * + * \sa qcsapi_SSID_set_pmf + */ +extern int qcsapi_wifi_set_pmf( const char *ifname, int pmf_cap ); + + +/** + * @brief Get the the WPA status for the given interface. + * + * Returns the current WPA status. Only applies to AP. + * + * Possible WPA status are: + * For AP + * \li WPA_HANDSHAKING - WPA handshaking started. + * \li NO_WPA_HANDSHAKING - WPA handshaking not started. + * \li WPA_SUCCESS - WPA handshaking is successful. + * + * \param ifname \wifi0 + * \param wpa_status return parameter for storing the informative wpa_status string. + * \param mac_addr the mac_addr of the station that is connecting or connected to the AP. + * \param max_len the length of the wpa_status string passed in. + * + * \return 0 if the command succeeded. + * \return a negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi get_wpa_status \ \< Mac address\> + * + * Unless an error occurs, the output will be the current WPA handshaking status for the AP + */ +extern int qcsapi_wifi_get_wpa_status( const char *ifname, + char *wpa_status, + const char *mac_addr, + const qcsapi_unsigned_int max_len ); + +/** + * @brief Get the total number of PSK authentication failures. + * + * This API returns the total number of PSK authentication failures from + * the AP and associated stations. + * + * \param ifname \wifi0 + * \param count return parameter to contain the count of PSK authentication failures. + * + * \return 0 if the command succeeded. + * \return a negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi get_psk_auth_failures \ + * + * Unless an error occurs, the output will be the count of PSK authentication failures. + */ +extern int qcsapi_wifi_get_psk_auth_failures(const char *ifname, qcsapi_unsigned_int *count); + +/** + * @brief Get the the authenticated state of the specific station according to the mac_addr + * for the given interface. + * + * Returns the authenticated state(0/1). Only applies to AP. + * + * Possible authenticated state are: + * For AP + * \li 1 - the station is authorized. + * \li 0 - the station is not authorized. + * + * \param ifname \wifi0 + * \param mac_addr the mac_addr of the station. + * \param auth_state the state value to return . + * + * \return 0 if the command succeeded. + * \return a negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi get_auth_state \ \< Mac address\> + * + * Unless an error occurs, the output will be the authorized state for the station + */ +extern int qcsapi_wifi_get_auth_state(const char *ifname, + const char *mac_addr, + int *auth_state); + +/** + * \brief Set security defer mode + * + * This API call is used to set the current hostapd/wpa_supplicant configuration mode for a given interface + * + * \param ifname \wifi0 + * \param defer will indicate the current hostapd/wpa_supplicant configuration mode 0: immediate mode 1:defer mode + * \note This API works only for wifi0 interface. + * + * \return >= 0 on success, < 0 on error. + * + * \callqcsapi + * + * call_qcsapi set_security_defer_mode \ {0 | 1} + */ +int qcsapi_wifi_set_security_defer_mode(const char *ifname, int defer); + +/** + * \brief Get security defer mode + * + * This API call is used to get the current hostapd/wpa_supplicant configuration mode for a given interface + * + * \param ifname \wifi0 + * \param defer will store the current hostapd/wpa_supplicant configuration mode 0: immediate mode 1:defer mode + * + * \note This API works only for wifi0 interface. + * + * \return >= 0 on success, < 0 on error. + * + * \call_qcsapi + * + * call_qcsapi get_security_defer_mode \ + */ +int qcsapi_wifi_get_security_defer_mode(const char *ifname, int *defer); + +/** + * \brief Apply security config + * + * This API call is used to configure/reconfigure the current hostapd/wpa_supplicant configration. + * + * \param ifname \wifi0 + * \note This API works across all wifi interfaces. + * + * \return >= 0 on success, < 0 on error. + * + * \call_qcsapi + * + * call_qcsapi apply_security_config \ + */ +extern int qcsapi_wifi_apply_security_config(const char *ifname); + +/**@}*/ + + +/**@addtogroup MACFilterAPIs + *@{*/ + +/** + * @brief Set MAC address filtering for the given interface. + * + * Set the current MAC address filtering, based on the input parameters + * + * If the MAC address filtering was configured as Disabled (qcsapi_disable_mac_address_filtering), + * calling the API to deny access to a MAC address will change the configuration to + * Accept unless Denied (qcsapi_accept_mac_address_unless_denied), + * so the referenced MAC address will be blocked from associating. + * + * Note that MAC address filtering is disabled by default. + * + * \param ifname \wifi0 + * \param new_mac_address_filtering the new MAC address filtering mode to enable. + * + * \return 0 if the command succeeded. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi set_macaddr_filter \ \<0|1|2\> + * + * Final argument configures the MAC address filtering: + * + * \li 0 to disable MAC address filtering, + * \li 1 to accept an association unless the MAC address has been blocked, + * \li 2 to block associations unless the MAC address has been authorized. + * + * These values match those in the enumerated data type qcsapi_mac_address_filtering. Unless an error occurs, the output will be + * the string complete. + * + * \note If the MAC address filtering is set to Accept Unless Blocked, and MAC address filtering is turned off, the list of blocked MAC + * addresses will be lost. + * + * \sa qcsapi_mac_address_filtering + */ +extern int qcsapi_wifi_set_mac_address_filtering( + const char *ifname, + const qcsapi_mac_address_filtering new_mac_address_filtering +); + +/** + * @brief Get MAC Address Filtering + * + * Get the current MAC address filtering. Returned value will matches one of those in the enumerated data type. + * + * This is the dual function of qcsapi_wifi_set_mac_address_filtering. + * + * \param ifname \wifi0 + * \param current_mac_address_filtering return parameter to contain the MAC address filtering mode currently enabled. + * + * \return 0 if the command succeeded. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi get_macaddr_filter \ + * + * Unless an error occurs, the output will be 0, 1 or 2, representing the enumerators in the enumeration qcsapi_mac_address_filtering. + */ +extern int qcsapi_wifi_get_mac_address_filtering( + const char *ifname, + qcsapi_mac_address_filtering *current_mac_address_filtering +); + +/** + * @brief Authorize a MAC address for MAC address filtering. + * + * Authorize the referenced MAC address against the MAC address filtering function. + * + * \param ifname \wifi0 + * \param address_to_authorize the MAC address of the device to authorize. + * + * \return 0 if the command succeeded. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi authorize_macaddr \ \ + * + * Unless an error occurs, the output will be the string complete. + * + * See @ref mysection5_1_1 "Format for a MAC address" for details on the format for entering the MAC address. + */ +extern int qcsapi_wifi_authorize_mac_address( const char *ifname, const qcsapi_mac_addr address_to_authorize ); + +/** + * @brief Block MAC addresses using the MAC address filtering feature. + * + * Block the referenced MAC address. If the MAC address filtering was configured as disabled, + * calling this API will change the configuration to accept unless denied. + * + * \param ifname \wifi0 + * \param address_to_deny the MAC address to deny. + * + * \return 0 if the command succeeded. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi deny_macaddr \ \ + * + * Unless an error occurs, the output will be the string complete. + * + * See @ref mysection5_1_1 "Format for a MAC address" for details on the format for entering the MAC address. + */ +extern int qcsapi_wifi_deny_mac_address( const char *ifname, const qcsapi_mac_addr address_to_deny ); + +/** + * @brief Remove MAC address from the MAC address filtering list. + * + * Remove the referenced MAC address. + * + * \param ifname \wifi0 + * \param address_to_remove the MAC address to remove. + * + * \return 0 if the command succeeded. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi remove_macaddr \ \ + * + * Unless an error occurs, the output will be the string complete. + * + * See @ref mysection5_1_1 "Format for a MAC address" for details on the format for entering the MAC address. + */ +extern int qcsapi_wifi_remove_mac_address( const char *ifname, const qcsapi_mac_addr address_to_remove ); + +/** + * @brief Check whether a MAC address is authorized. + * + * Reports whether a STA with the referenced MAC address is authorized, that is, MAC address filtering will allow the STA to associate. + * + * \param ifname \wifi0 + * \param address_to_verify the MAC address to check for authorization. + * \param p_mac_address_authorized return parameter to indicate authorized (1) or not authorized (0). + * + * \return 0 if the command succeeded. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi is_macaddr_authorized \ \ + * + * See @ref mysection5_1_1 "Format for a MAC address" for details on the format for entering the MAC address. + * + * Unless an error occurs, the output is either 1 (MAC address can associate) or 0 (MAC address will be blocked from associating). + */ +extern int qcsapi_wifi_is_mac_address_authorized( + const char *ifname, + const qcsapi_mac_addr address_to_verify, + int *p_mac_address_authorized +); + +/** + * @brief Get a list of authorized MAC addresses + * + * Get a list of authorized MAC addresses. + * MAC address filtering must have been configured to Deny unless Authorized (qcsapi_deny_mac_address_unless_authorized). + * + * MAC addresses will be returned in list_mac_addresses up to the size of the parameter, as expressed in sizeof_list, + * in the standard format for MAC addresses, separated by commas. + * + * \param ifname \wifi0 + * \param list_mac_addresses return parameter to contain the list of comma delimited MAC addresses + * \param sizeof_list the size of the input list_mac_addresses buffer. + * + * \return 0 if the command succeeded. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi get_authorized_macaddr \ \ + * + * Unless an error occurs, output will be the list of authorized MAC addresses, separated by commas. + * MAC address filtering must be set to deny unless authorized (2); + * use call_qcsapi get_macaddr_filter to verify this. + * + * Final parameter is the size of the string to receive the list of authorized MAC addresses. + */ +extern int qcsapi_wifi_get_authorized_mac_addresses( const char *ifname, char *list_mac_addresses, const unsigned int sizeof_list ); + +/** + * @brief Get a list of denied MAC addresses. + * + * Get a list of denied or blocked MAC addresses. + * MAC address filtering must have been configured to accept unless denied (qcsapi_accept_mac_address_unless_denied). + * MAC addresses will be returned in list_mac_addresses up to the size of the passed in buffer, as expressed in sizeof_list, + * in the standard format for MAC addresses, separated by commas. + * + * \param ifname \wifi0 + * \param list_mac_addresses return parameter to contain the list of comma delimited MAC addresses + * \param sizeof_list the size of the input list_mac_addresses buffer. + * + * \return 0 if the command succeeded. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi get_denied_macaddr \ \
+ * + * Unless an error occurs, output will be the list of denied MAC addresses, separated by commas. + * MAC address filtering must be set to accept unless denied (1); use call_qcsapi get_macaddr_filter to verify this. + * Final parameter is the size of the string to receive the list of denied MAC addresses. + */ +extern int qcsapi_wifi_get_denied_mac_addresses( const char *ifname, char *list_mac_addresses, const unsigned int sizeof_list ); + +/** + * @brief API to set OUI to filter list. + * + * This function can be called to set OUI into filter list. + * + * \param ifname \wifi0 + * \param oui Organizationally unique identifier string in full MAC address format. + * \param flag 1 to insert OUI and 0 to remove OUI to/from white list + * + * \return 0 if the command succeeded. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values". + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi set_accept_oui_filter \ \ \<1 | 0\> + * + * Unless an error occurs, the output will be "complete". + */ +extern int qcsapi_wifi_set_accept_oui_filter(const char *ifname, const qcsapi_mac_addr oui, int flag); + +/** + * @brief API to get of OUI filter list. + * + * This function can be called to get OUI filter list. + * + * \param ifname \wifi0 + * \param oui_list Where to receive oui in string format. + * \param sizeof_list Specifies the size of string that prepare for the list return. + * + * \return 0 if the command succeeded. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi get_accept_oui_filter \ [size] + * + * Unless an error occurs, the output will be string that contains MAC address separated by comma. + */ +extern int qcsapi_wifi_get_accept_oui_filter(const char *ifname, char *oui_list, const unsigned int sizeof_list); + +/** + * @brief Clear the MAC address lists. + * + * This function can be called to clear any accept or deny lists created using the MAC address filtering APIs. + * + * After this is called, the hostapd.deny and hostapd.accept files will be reset to default - any existing MAC addresses + * in these files will be cleared. + * + * \param ifname \wifi0 + * + * \return 0 if the command succeeded. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi clear_mac_filters \ + * + * Unless an error occurs, the output will be the string complete. + */ +extern int qcsapi_wifi_clear_mac_address_filters( const char *ifname ); + +/**@}*/ + + +/**@addtogroup MACReserveAPIs + *@{*/ + +/** + * @brief Set MAC address reservation + * + * Prevent selected MAC addresses from being used by WiFi stations or back-end devices. + * + * This feature can be used to ensure that MAC addresses of core networking devices + * cannot be hijacked by WiFi stations or by devices connected to WiFi stations. + * + * \note \aponly + * \note \primarywifi + * + * \param ifname \wifi0only + * \param addr MAC address to be reserved + * \param mask MAC address mask in the same format as a MAC address, or an empty string for a + * single MAC address + * + * \return 0 if the command succeeded. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * See @ref mysection5_1_1 "Format for a MAC address" for details on the format for entering the MAC address. + * + * \callqcsapi + * + * call_qcsapi set_macaddr_reserve \ \ [\] + * + * Unless an error occurs, the output will be the string complete. + * + * \note A maximum of 6 MAC addresses and/or MAC address ranges may be reserved. + */ +extern int qcsapi_wifi_set_mac_address_reserve(const char *ifname, const char *addr, + const char *mask); + +/** + * @brief Get MAC address reservation + * + * Get the list of reserved MAC addresses. + * + * \param ifname \wifi0 + * \param buf pointer to a buffer for storing the returned list + * + * \return 0 if the command succeeded. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi get_macaddr_reserve \ + * + * Unless an error occurs, the output will be a list of reserved MAC addresses and masks. + */ +extern int qcsapi_wifi_get_mac_address_reserve(const char *ifname, string_256 buf); + +/** + * @brief Clear MAC address reservation + * + * Delete all MAC address reservation configuration. + * + * \param ifname \wifi0 + * + * \return 0 if the command succeeded. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi clear_macaddr_reserve \ + * + * Unless an error occurs, the output will be the string complete. + */ +extern int qcsapi_wifi_clear_mac_address_reserve(const char *ifname); + +/**@}*/ + + +/**@addtogroup OptionsAPIs + *@{*/ +/* generic */ + +/** + * @brief Get a WiFi option + * + * Get the value for an option, as specified by the qcsapi_option_type parameter, + * with the value returned in the address specified by p_current_option. + * + * \note Value will be either 0 (disabled, false) or 1 (enabled, true). If the option (feature) + * is not supported, the API will return -qcsapi_option_not_supported. + * + * \note Two options short_gi and stbc are global and can only be configured on primary interface wifi0. + * + * \param ifname \wifi0 + * \param qcsapi_option the option to get the value of. + * \param p_current_option return parameter to contain the value of the option. + * + * \return 0 if the command succeeded. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi get_option \ \ + * + * \sa qcsapi_option_type + */ +extern int qcsapi_wifi_get_option( const char *ifname, qcsapi_option_type qcsapi_option, int *p_current_option ); + +/** + * @brief Set a WiFi option + * + * Set the value for an option, as specified by the qcsapi_option_type parameter, + * with a value of 0 disabling the option or setting it to false and a value of 1 enabling the option or setting it to true. + * A non-zero value will be interpreted as 1. + * + * \note Not all options can be set. If the feature is not supported, the API + * returns -qcsapi_option_not_supported. For some options having fixed value, + * the API will return -EOPNOTSUPP. + * + * \note Two options short_gi and stbc are global and can only be configured on primary interface wifi0. + * + * \param ifname \wifi0 + * \param qcsapi_option the option to set the value of. + * \param new_option the new option value.. + * + * \return 0 if the command succeeded. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi set_option \ \ \<1 | TRUE | 0 | FALSE\> + * + * \sa qcsapi_option_type. + * For the qcsapi_option_type 'sta_dfs', after enable/disable sta_dfs, + * you must also update the power table using the command + * call_qcsapi restore_regulatory_tx_power wifi0 + */ +extern int qcsapi_wifi_set_option( const char *ifname, qcsapi_option_type qcsapi_option, int new_option ); + +/** +* @brief Get a board related parameter +* +* Get the value for the specified board parameter, as specified by +* the qcsapi_board_parameter_type parameter, with the value returned +* in the address specified by p_buffer. +* +* If the parameter (feature) is not supported, the API will +* return -qcsapi_board_parameter_not_supported. +* +* \param board_param the board parameter to get the value of. +* \param p_buffer return parameter to contain the value of the board parameter. +* +* \return 0 if the command succeeded. +* \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" +* for error codes and messages. +* +* \callqcsapi +* +* call_qcsapi get_board_parameter \ +* +* \sa qcsapi_board_parameter_type +*/ +extern int qcsapi_get_board_parameter( qcsapi_board_parameter_type board_param, string_64 p_buffer ); + +/** +* @brief Get the feature list +* +* Get a list of features supported on this device. +* +* \param p_buffer buffer to return the supported features list +* +* \return 0 if the command succeeded. +* \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" +* for error codes and messages. +* +* \callqcsapi +* +* call_qcsapi get_swfeat_list +* +*/ +extern int qcsapi_get_swfeat_list(string_4096 p_buffer); +/**@}*/ + +/* + * Service Set (SSID) QCSAPIs + * + * Multiple instantiations of the Service Set configuration + * (mostly security parameters) can be configured. + * Separate instantiations are identified by the SSID. + * Thus the QCSAPIs that work with these multiple instantiations are +* called Service Set ID APIs. Each requires an interface (e.g. wifi0) + * and an SSID. + */ + +/**\addtogroup SSIDAPIs + *@{*/ + +/** + * @brief Create a new SSID. + * + * Create a new SSID configuration, as identified by new_SSID. + * + * If the Service Set is already present, this API returns an error. + * + * The SSID must be a string with between 1 and 32 characters, as outlined in \ref SSID_RULES + * + * \param ifname \wifi0 + * \param new_SSID the new SSID to add. + * + * \return 0 if the command succeeded. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi create_SSID \ \ + * + * Unless an error occurs, the output will be the string complete. + */ +extern int qcsapi_SSID_create_SSID( const char *ifname, const qcsapi_SSID new_SSID ); + +/** + * @brief Remove an existing SSID. + * + * Remove an existing SSID configuration, as identified by del_SSID. + * + * If the Service Set is absent, this API returns an error. + * + * \param ifname the interface to remove the SSID from. + * \param del_SSID the existing SSID to remove. + * + * \return 0 if the command succeeded. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * call_qcsapi interface: + * + * call_qcsapi remove_SSID \ \ + * + * Unless an error occurs, the output will be the string complete. + */ + +extern int qcsapi_SSID_remove_SSID( const char *ifname, const qcsapi_SSID del_SSID ); +/** + * @brief Verify an SSID is present + * + * Verifies a Service Set configuration is present, as identified by current_SSID. + * If the Service Set is not present, -qcsapi_SSID_not_found is returned (see @ref + * mysection11_1 "Error Codes from SSID APIs" for more details). + * + * \param ifname \wifi0 + * \param current_SSID the SSID to check. + * + * \return 0 if the SSID is present. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi verify_SSID \ \ + * + * Unless an error occurs, the output will be the string complete. + */ +extern int qcsapi_SSID_verify_SSID( const char *ifname, const qcsapi_SSID current_SSID ); + +/** + * @brief Rename an existing SSID + * + * Renames an SSID, as identified by current_SSID. + * If the original Service Set ID is not present, this API returns an error. + * + * Both new_SSID and current_SSID must be strings with between 1 and 32 characters, as outlined in \ref SSID_RULES + * + * \param ifname \wifi0 + * \param current_SSID a currently defined SSID on this interface. + * \param new_SSID the new SSID value. + * + * \return 0 if the call succeeded. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi rename_SSID \ \ \ + * + * Unless an error occurs, the output will be the string complete. + */ +extern int qcsapi_SSID_rename_SSID( const char *ifname, const qcsapi_SSID current_SSID, const qcsapi_SSID new_SSID ); + + +/** + * \brief Get the list of SSIDs + * + * Get the list of configured SSIDs. + * + * \param ifname \wifi0 + * \param arrayc the maximum number of SSID names to return + * \param list_SSID a pointer to the buffer for storing the returned values + * + * \return 0 if the command succeeded. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi get_SSID_list \ + * + * The output will be the SSID list unless an error occurs. An additional optional parameter selects + * the number of SSID names to be displayed. The default count is 2; the maximum count is 10. + */ +extern int qcsapi_SSID_get_SSID_list( const char *ifname, const unsigned int arrayc, char **list_SSID ); + +/** + * @brief Set the authentication protocol for an SSID + * + * Set the security authentication protocol (WPA or 11i or both) for an SSID. + * Valid values for new_protocol are WPA, 11i and WPAand11i. + * + * This API is the SSID/STA equivalent of the AP only set beacon API. + * + * Basic will not be accepted for the new protocol. To disable security for an SSID, + * use the SSID set authentication mode API (qcsapi_SSID_set_authentication_mode) with an authentication mode of NONE. + * + * \param ifname \wifi0 + * \param current_SSID an previously defined SSID to apply the protocol to. + * \param new_protocol the new protocol, as a string. See the authentication protocol table in \ref CommonSecurityDefinitions for valid values. + * + * \return 0 if the call succeeded. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi SSID_set_proto \ \ \ + * + * Unless an error occurs, the output will be the string complete. + * + * Protocol type needs to be one as listed in the authentication protocol table in \ref CommonSecurityDefinitions. + * + * \sa qcsapi_SSID_set_authentication_mode + * \sa qcsapi_wifi_set_beacon_type + */ +extern int qcsapi_SSID_set_protocol( const char *ifname, const qcsapi_SSID current_SSID, const char *new_protocol ); + +/** + * \brief Get the security protocol for an SSID. + * + * Get the security protocol (WPA or 11i or both) for an SSID. + * + * \param ifname \wifi0 + * \param current_SSID the SSID to check against. + * \param current_protocol set to one of the values in the authentication protocol table in /ref CommonSecurityDefinitions + * + * \return 0 if the call succeeded. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * This API is the SSID/STA equivalent of the get beacon API.
+ * + * \note This API should not be used to determine whether security is enabled for a particular SSID. + * Use the SSID Get Authentication Mode API to determine if security is enabled for the SSID. + * If the returned value is None, then security is disabled for the targeted SSID.
+ * + * \callqcsapi + * + * call_qcsapi SSID_get_proto \ \
+ * + * Unless an error occurs, the response will be one of the values from the authentication protocol table in + * \ref CommonSecurityDefinitions + * + * \sa qcsapi_SSID_get_authentication_mode + * \sa qcsapi_wifi_get_beacon_type + */ +extern int qcsapi_SSID_get_protocol( const char *ifname, const qcsapi_SSID current_SSID, string_16 current_protocol ); + + +/** + * @brief Get the encryption modes for an SSID + * + * Get available encryption modes for an SSID. + * + * This API is called to determing the encryption modes supported on the given SSID. + * + * \param ifname \wifi0 + * \param current_SSID the SSID to read the encryption modes from. + * \param encryption_modes a comma delimited set of strings, one for each encryption mode. The values in this string are from the + * encryption type table in \ref CommonSecurityDefinitions. + * + * \return 0 if the call succeeded. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi SSID_get_encryption_modes \ \ + * + * Unless an error occurs, the output will be one of these three strings, AESEncryption, TKIPEncryption or TKIPandAESEncryption. That is, + * one of the values from the encryption type table in \ref CommonSecurityDefinitions. + * + * \sa qcsapi_SSID_set_encryption_modes + */ +extern int qcsapi_SSID_get_encryption_modes( + const char *ifname, + const qcsapi_SSID current_SSID, + string_32 encryption_modes +); + +/** + * @brief Set the encryption mode for an SSID. + * + * Configure available encryption modes for an SSID. + * + * \param ifname \wifi0 + * \param current_SSID the SSID to set the encryption mode against. + * \param encryption_modes a value as per the encryption type table in \ref CommonSecurityDefinitions. + * + * \return 0 if the call succeeded. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi SSID_set_encryption_modes \ \ \ + * where \ is one of the modes listed in the encryption type table in \ref CommonSecurityDefinitions. + * + * Unless an error occurs, the output will be the string complete. + */ +extern int qcsapi_SSID_set_encryption_modes( + const char *ifname, + const qcsapi_SSID current_SSID, + const string_32 encryption_modes +); + +/** + * \brief Get the group encryption cipher. + * + * Get the group encryption cipher for an SSID. + * + * \param ifname \wifi0 + * \param current_SSID the SSID for which to retrieve the group encryption cipher + * \param encryption_mode a pointer to the buffer for storing the returned value + * + * \return 0 if the command succeeded. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * This command is only supported on Stations. + * + * call_qcsapi SSID_get_group_encryption \ \ + * + * The output will be the encryption cipher unless an error occurs. + */ +extern int qcsapi_SSID_get_group_encryption( + const char *ifname, + const qcsapi_SSID current_SSID, + string_32 encryption_mode +); + +/** + * \brief Set the group encryption cipher. + * + * Set the group encryption cipher for an SSID. + * + * \param ifname \wifi0 + * \param current_SSID the SSID for which to set the group encryption cipher + * \param encryption_mode the cipher to be applied + * + * \return 0 if the command succeeded. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * This command is only supported on Stations. + * + * \callqcsapi + * + * call_qcsapi SSID_set_group_encryption \ \ \ + * + * Unless an error occurs, the output will be the string complete. + */ +extern int qcsapi_SSID_set_group_encryption( + const char *ifname, + const qcsapi_SSID current_SSID, + const string_32 encryption_mode +); + +/** + * @brief Get the authentication mode for an SSID. + * + * Get the current configured authentication mode for an SSID. + * + * This API is the SSID/STA version of WPA get authentication mode API (qcsapi_wifi_get_WPA_authentication_mode); + * see that section for a description of possible authentication modes returned by this API. + * If security is disabled for the referenced SSID, this API will return NONE. + * + * \param ifname \wifi0 + * \param current_SSID the SSID to get the authentication modes from. + * \param authentication_mode return parameter to store the authentication type. + * + * \return 0 if the call succeeded. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi SSID_get_authentication_mode \ \ + * + * Unless an error occurs, the response will be of PSKAuthentication, EAPAuthentication or NONE. That is, one of + * the values outlined in the authentication type table in \ref CommonSecurityDefinitions. + * + * A response of NONE implies security is disabled for the referenced SSID. + * + * \sa qcsapi_wifi_get_WPA_authentication_mode + */ +extern int qcsapi_SSID_get_authentication_mode( + const char *ifname, + const qcsapi_SSID current_SSID, + string_32 authentication_mode +); + +/** + * @brief Set the authentication mode for an SSID. + * + * Set the authentication mode for an SSID. + * + * This API is the SSID/STA version of WPA set authentication mode API (qcsapi_wifi_set_WPA_authentication_mode); + * + * \param ifname \wifi0 + * \param current_SSID the SSID to get the authentication modes from. + * \param authentication_mode the authentication mode to use. One of the values from the authentication type table in + * \ref CommonSecurityDefinitions. + * + * \return 0 if the call succeeded. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi SSID_set_authentication_mode \ \ \ + * + * Unless an error occurs, the output will be the string complete. + * + * Valid values for the authentication mode paramter are outlined in the authentication type table in \ref CommonSecurityDefinitions. + * + * To disable authentication on the SSID, pass the value NONE to the authentication mode parameter. + * + * \sa qcsapi_wifi_set_WPA_authentication_mode + */ +extern int qcsapi_SSID_set_authentication_mode( + const char *ifname, + const qcsapi_SSID current_SSID, + const string_32 authentication_mode +); + +/** + * \brief Get the preshared key + * + * Get the WPA or RSN preshared key for an SSID. + * + * \note \primarywifi + * \note \staonly + * + * \param ifname \wifi0only + * \param current_SSID the SSID for which to retrieve the preshared key + * \param key_index reserved - set to zero + * \param pre_shared_key a pointer to the buffer for storing the returned value + * + * \return 0 if the command succeeded. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi SSID_get_pre_shared_key \ \ \ + * + * The output will be the preshared key unless an error occurs. + */ + +extern int qcsapi_SSID_get_pre_shared_key( + const char *ifname, + const qcsapi_SSID current_SSID, + const qcsapi_unsigned_int key_index, + string_64 pre_shared_key +); + +/** + * \brief Set the preshared key + * + * Set the WPA or RSN preshared key for an SSID. + * + * \note \primarywifi + * \note \staonly + * + * \param ifname \wifi0only + * \param current_SSID the SSID to set the WPA PSK on + * \param key_index reserved - set to zero + * \param pre_shared_key a 64 hex digit PSK + * + * \return 0 if the command succeeded. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi SSID_set_pre_shared_key \ \ \ \ + * + * Unless an error occurs, the output will be the string complete. + */ +extern int qcsapi_SSID_set_pre_shared_key( + const char *ifname, + const qcsapi_SSID current_SSID, + const qcsapi_unsigned_int key_index, + const string_64 pre_shared_key +); + +/** + * @brief Get the passphrase for an SSID. + * + * Get the passphrase for an SSID. + * + * \param ifname \wifi0 + * \param current_SSID the SSID to get the passphrase for. + * \param key_index reserved - set to zero + * \param passphrase return parameter to contain the NULL terminated passphrase. + * + * \return 0 if the call succeeded. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi SSID_get_key_passphrase \ \ 0 + * + * call_qcsapi SSID_get_passphrase \ \ 0 + * + * Unless an error occurs, the output will be the passphrase configured for the SSID. + */ +extern int qcsapi_SSID_get_key_passphrase( + const char *ifname, + const qcsapi_SSID current_SSID, + const qcsapi_unsigned_int key_index, + string_64 passphrase +); + +/** + * @brief Set the passphrase (ASCII) for an SSID. + * + * Set the ASCII passphrase for a Service Set on a STA + * + * By the WPA standard, the passphrase is required to have between 8 and 63 ASCII characters. + * + * \param ifname \wifi0 + * \param current_SSID the SSID to set the passphrase on. + * \param key_index reserved - set to zero + * \param the NULL terminated passphrase string, 8 - 63 ASCII characters (NULL termination not included in the count) + * + * \return 0 if the call succeeded. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi SSID_set_key_passphrase \ \ 0 \ + * + * call_qcsapi SSID_set_passphrase \ \ 0 \ + * + * Unless an error occurs, the output will be the string complete. + * + * \note The Linux shell processes the passphase parameter. + * Selected characters are interpreted by the shell, including the dollar sign ($), the backslash (\) and the backquote (`). + * We recommend putting the new passphrase in quotes and/or using the backslash character + * to escape characters that could be processed by the shell. + */ +extern int qcsapi_SSID_set_key_passphrase( + const char *ifname, + const qcsapi_SSID current_SSID, + const qcsapi_unsigned_int key_index, + const string_64 passphrase +); + +/** + * @brief Get the 802.11w capability for the given interface. + * + * Returns the current 802.11w / PMF capability. + * + * \note staonly + * + * \param ifname \wifi0 + * \param current_SSID the SSID on which to get the PMF capability + * + * \return 0 if the command succeeded. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi SSID_get_pmf \ \ + * + * Unless an error occurs, the output will be the current PMF capability. + * + * \sa qcsapi_SSID_get_pmf + */ +extern int qcsapi_SSID_get_pmf( const char *ifname, const qcsapi_SSID current_SSID, int *p_pmf_cap); + +/** + * @brief Set the 802.11w / PMF capability for the given interface. + * + * Sets the 802.11w / PMF capability. + * + * \note staonly + * + * \param ifname \wifi0 + * \param current_SSID the SSID on which to set the PMF capability + * \param pmf_cap. + * + * \return 0 if the command succeeded. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi SSID_set_pmf \ \ { 0 | 1 | 2 } + * + * Unless an error occurs, the output will be the string complete. + * + * The final '0' in the command line represents the key index. + * + * \note The Linux shell processes the PMF parameter + * + * \sa qcsapi_SSID_set_pmf + */ + +extern int qcsapi_SSID_set_pmf( const char *ifname, const qcsapi_SSID SSID_str, int pmf_cap ); + +/** + * \brief Get the SSID associated with the WPS session. + * + * This API returns the SSID as configured via WPS. This network block + * is marked using a 'flags' parameter to indicate that the SSID was + * configured via WPS. + * + * \note \staonly + * + * \param ifname \wifi0 + * \param wps_SSID the return value to contain the SSID. + * + * \return >= 0 on success, -qcsapi_configuration_error if the SSID is not + * one configured via WPS, -qcsapi_only_on_STA if called on an AP, -EFAULT or + * -qcsapi_programming_error on other errors (NULL parameter etc). + * + * \callqcsapi + * + * call_qcsapi SSID_get_WPS_SSID \ + * + * Unless an error occurs, the output will be the string containing the SSID + * as obtained via WPS. + */ +extern int qcsapi_SSID_get_wps_SSID( + const char *ifname, + qcsapi_SSID wps_SSID +); +/**@}*/ + +/* + * VLAN ... + */ +/**\addtogroup VLANAPIs + *@{*/ + +/** + * \brief VLAN configuration for a wireless interface. + * + * Bind a VLAN to a (non-primary) wireless interface + * , or unbind a VLAN from it. + * + * \param ifname \wifiX + * \param cmd VLAN command - see below. + * @code + * e_qcsapi_vlan_bind bind a VLAN to wireless interface + * e_qcsapi_vlan_unbind unbind a VLAN from wireless interface + * @endcode + * + * \param VLANID VLAN identifier. + * \param flags command-specific flags(Not support yet) - see below:
+ * @code + * Please note: + * By now, flags only works for command of "bind": + * @endcode + * @code + * enable tx tag if command is "bind" 1 + * disable tx tag if command is "bind" 0 + * @endcode + * + * \return 0 if the call succeeded. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi vlan_config \ {bind | unbind} \ [tx tag] + * + * Unless an error occurs, the output will be the string complete. + */ +extern int qcsapi_wifi_vlan_config( + const char *ifname, + qcsapi_vlan_cmd cmd, + uint32_t vlanid, + uint32_t flags); + +/** + * \brief get vlan configuration + * + * This API call is used to retrieve current VLAN configuration which is taking effect. + * + * \param vtable + * + * \return >= 0 on success, < 0 on error. + * + * \callqcsapi + * + * call_qcsapi show_vlan_config + * + * Unless an error occurs, the output will be a table of VLAN configuration + */ +extern int qcsapi_wifi_show_vlan_config(const char *ifname, string_1024 vcfg); + +/** + * \brief Enable and disable bridge VLAN pass through. + * + * Enable and disable bridge VLAN pass through. + * + * \param ifname \wifiX + * \param enabled set 1 to enable VLAN pass through, otherwise set it to 0. + * + * \return 0 if the call succeeded. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi enable_vlan_pass_through \ + * + * Unless an error occurs, the output will be the string complete. + */ +extern int qcsapi_enable_vlan_pass_through(const char *ifname, int enabled); + +/** + * \brief Enable and disable VLAN promiscuous mode. + * + * If VLAN promiscuous mode is enabled, all VLAN tagged packets will be sent to the Linux protocol stack. + * + * \note This API can only be called on an AP device. + * + * \param enabled set to 1 to enable VLAN promiscuous mode, otherwise set to 0. + * + * \return 0 if the call succeeded. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi enable_vlan_promisc \ + * + * Unless an error occurs, the output will be the string complete. + */ +extern int qcsapi_wifi_set_vlan_promisc(int enable); +/**@}*/ + +/* + * WPS ... + */ +/**\addtogroup WPSAPIs + *@{*/ + +/** + * @brief WPS registrar report button press + * + * This API starts a WPS session on the Registrar (AP) by pressing the (virtual) WPS Push Button. + * + * Under the WPS standard, a WPS session can be started by pressing a virtual button; i.e. by entering a command. + * + * A side effect of this API call is that a WPS session will be started. + * + * \param ifname \wifi0 + * + * \return 0 if the call succeeded. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi registrar_report_button_press \ + * + * call_qcsapi registrar_report_pbc \ + * + * This API has 2 scripting interface synonyms. + * + * Unless an error occurs, the output will be the string complete. + */ +extern int qcsapi_wps_registrar_report_button_press( const char *ifname ); + +/** + * @brief Report a PIN event on the registrar. + * + * This API starts a WPS session on the registrar (AP) by reporting a PIN event. + * + * Under the WPS standard, a WPS session can be started by entering a PIN. + * + * The PIN is a sequence of either 4 or 8 digits. If the proposed PIN has a length different from 4 or 8 characters, + * or if any of the characters are not digits, the API will return an error code of Invalid Value (-EINVAL). + * + * \note The 8 digit PIN (which has a checksum) does not check the validity of the checksum digit. + * + * \param ifname \wifi0 + * \param wps_pin the NULL terminated PIN - either 4 or 8 decimal numbers. + * + * \return 0 if the call succeeded. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi registrar_report_pin \ \ + * + * Unless an error occurs, the output will be the string complete. + */ +extern int qcsapi_wps_registrar_report_pin( const char *ifname, const char *wps_pin ); + +/** + * \brief Get the WPS Access Control list + * + * Get the WPS Access Control list. + * + * \note This API is only relevant on an AP device + * + * \param ifname \wifi0 + * \param pp_devname comma-separated list of device IDs allowed or denied to receive credentials via WPS + * + * \return 0 if the command succeeded and pp_devname contains list of Device IDs allowed + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * + * \callqcsapi + * + * call_qcsapi registrar_get_pp_devname \[blacklist\] \ + * + * Unless an error occurs, the output will be the string of allowed Device IDs. + */ +extern int qcsapi_wps_registrar_get_pp_devname( const char *ifname, int blacklist, string_128 pp_devname ); + +/** + * @brief Set WPS Access Control Device ID List + * + * Set the list of Device IDs that are allowed or denied to receive WPS credentials from the AP. + * + * \note \aponly + * + * The Device IDs are a comma separated list 1 to 256 characters in length with commas as delimiters + * + * \param ifname \wifi0 + * \param update_blacklist flag to indicate whether update white-list or black-list + * \param pp_devname comma-separated list of device IDs allowed or denied to receive credentials via WPS. + * + * \return 0 if the command succeeded and the SSID is updated. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi registrar_set_pp_devname \ \[blacklist\] \ + * + * Unless an error occurs, the output will be the string complete. + */ +extern int qcsapi_wps_registrar_set_pp_devname( const char *ifname, int update_blacklist, const string_256 pp_devname ); + +/** + * @brief Report a WPS PBC event on the enrollee. + * + * This API starts a WPS session on the Enrollee (STA) by pressing the (virtual) WPS Push Button. + * + * Under the WPS standard, a WPS session can be started by pressing a virtual button; i.e. by entering a command. + * + * The bssid parameter is present for future expansion and should be set to all 0s (zeros). + * + * \callqcsapi + * + * call_qcsapi enrollee_report_button_press \ + * call_qcsapi enrollee_report_pbc \ + * + * This API has 2 scripting interface synonyms. The bssid parameter is not required and will default to all zeros. + * + * Unless an error occurs, the output will be the string complete. + */ +extern int qcsapi_wps_enrollee_report_button_press( const char *ifname, const qcsapi_mac_addr bssid ); + +/** + * @brief Report a PIN event on the enrollee. + * + * This API starts a WPS session on the enrollee (STA) by reporting a PIN event. + * + * Under the WPS standard, a WPS session can be started by entering a PIN. + * + * The PIN is a sequence of either 4 or 8 digits. If the proposed PIN has a length different from 4 or 8 characters, + * or if any of the characters are not digits, the API will return an error code of Invalid Value (-EINVAL). + * + * \note The 8 digit PIN (which has a checksum) does not check the validity of the checksum digit. + * + * \param ifname \wifi0 + * \param bssid the BSSID to report the PIN evens for. + * \param wps_pin the NULL terminated PIN - either 4 or 8 decimal numbers. + * + * \return 0 if the call succeeded. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi enrollee_report_pin \ \ + * + * Unless an error occurs, the output will be the string complete. + */ +extern int qcsapi_wps_enrollee_report_pin( const char *ifname, const qcsapi_mac_addr bssid, const char *wps_pin ); + +/** + * @brief Generate a WPS PIN on the enrollee. + * + * This API starts a WPS session on the enrollee (STA) by generating a PIN and then reporting + * that newly generated PIN to any suitably configured and available registrars. The generated PIN will have 8 digits. + * + * \param ifname \wifi0 + * \param bssid reserved - set to all zeros. + * \param wps_pin return parameter to contain the WPS PIN (8 digits, so the string should be at least 9 bytes long). + * + * \return 0 if the call succeeded. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi enrollee_generate_pin \ + * + * Unless an error occurs, the output will be a string of 8 digits - the newly generated PIN + * + * The bssid parameter is not required and will default to all zeros. + */ +extern int qcsapi_wps_enrollee_generate_pin( const char *ifname, const qcsapi_mac_addr bssid, char *wps_pin ); + +/** + * \brief Get the AP PIN used for WPS PIN operation. + * + * This API call is used to get the AP PIN associated with the WPS PIN + * function. The PIN is either 4 digits or 8 digits long. + * + * \note this API can only be called on an AP device. + * + * \param ifname each interface in MBSS + * \param wps_pin return parameter for containing the NULL terminated string. + * \param force_regenerate whether to force the AP daemon (hostapd) to regenerate + * the WPS PIN - a random PIN - for this call. + * + * \note a side effect of this call is if there is no WPS PIN currently set for + * the device, a random PIN will be generated. + * + * \return >= 0 success, < 0 or -qcsapi_only_on_AP on error. If success, the + * wps_pin parameter will be filled with the NULL terminated string containing + * the PIN. + * + * \callqcsapi + * + * call_qcsapi get_wps_ap_pin \ + * + * Unless an error occurs, the output will be a string of 8 digits - the PIN on the AP. + */ +extern int qcsapi_wps_get_ap_pin( const char *ifname, char *wps_pin, int force_regenerate ); + +/** + * \brief set the AP PIN used for WPS PIN operation . + * + * This API call is used to set the AP PIN associated with the WPS PIN + * function. The PIN is either 4 digits or 8 digits long. + * + * \note this API can only be called on an AP device. + * + * \param ifname each interface in MBSS + * \param wps_pin return parameter for containing the NULL terminated string. + * + * \return >= 0 success, < 0 or -qcsapi_only_on_AP on error. + * \callqcsapi + * + * call_qcsapi set_wps_ap_pin \ \ + * + * Unless an error occurs, the output will be the string complete. + */ +extern int qcsapi_wps_set_ap_pin(const char *ifname, const char *wps_pin); + +/** + * \brief save ap PIN to configure file + * + * This API call is used to save PIN to configure file + * + * \note this API can only be called on an AP device. + * + * \param ifname each interface in MBSS + * + * \return >= 0 success, < 0 or -qcsapi_parameter_not_found on error. + * \callqcsapi + * + * call_qcsapi save_wps_ap_pin \ + * + * Unless an error occurs, the output will be the string complete. + */ +extern int qcsapi_wps_save_ap_pin(const char *ifname); + +/** + * \brief enable/disable ap pin function + * + * This API call is used to enable/disable external registrar + * configure this AP when wps state is not configured + * + * \note this API can only be called on an AP device. + * + * \param ifname each interface in MBSS + * \param enable + * + * \return >= 0 success, < 0 or -qcsapi_parameter_not_found on error. + * \callqcsapi + * + * call_qcsapi enable_wps_ap_pin \ <0 | 1> + * + * Unless an error occurs, the output will be the string complete. + */ +extern int qcsapi_wps_enable_ap_pin(const char *ifname, int enable); + +/** + * @brief Generate a new PIN randomly + * + * This API is used to generate a new PIN randomly on a STA. + * This API won't start WPS session. + * + * \param ifname \wifi0 + * \param wps_pin return parameter for containing the NULL terminated string. + * + * \return >= 0 success, < 0 on error. If success, the + * wps_pin parameter will be filled with the NULL terminated string containing + * the PIN. + * + * \callqcsapi + * + * call_qcsapi get_wps_sta_pin \ + * + * Unless an error occurs, the output will be a string of 8 digits. + */ +extern int qcsapi_wps_get_sta_pin(const char *ifname, char *wps_pin); + +/** + * @brief Get the state of the current WPS session. + * + * Get the current WPS state, reported as a string in the format "%d (%s)", that is, + * an integer followed by a short descriptive string in parentheses. + * This API works for either an enrollee or a registrar; or stated differently, it works on both an AP and a STA. + * + * Possible WPS states are: + * + * \li 0(WPS_INITIAL) - Initial WPS state. + * \li 1(WPS_START) - WPS transaction has started. + * \li 2(WPS_SUCCESS) - WPS transaction succeeded and the device is in association with its partner. + * \li 3(WPS_ERROR) - WPS transaction ended with an error. + * \li 4(WPS_TIMEOUT) - WPS transaction timed out. + * \li 5(WPS_OVERLAP) - WPS overlap is detected. + * \li 6(WPS_M2_SEND) - WPS is sending M2 frame. + * \li 7(WPS_M8_SEND) - WPS is sending M8 frame. + * \li 8(WPS_STA_CANCEL) - WPS is canceled by STA. + * \li 9(WPS_STA_PIN_ERR) - WPS fail for wrong pin from STA. + * \li 10(WPS_AP_PIN_SUC) - WPS AP pin success. + * \li 11(WPS_AP_PIN_ERR) - WPS AP pin fail. + * + * \param ifname \wifi0 + * \param wps_state return parameter for storing the informative WPS state string. + * \param max_len the length of the wps_state string passed in. + * + * \return 0 if the call succeeded. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi get_wps_state \ + * + * Unless an error occurs, the output will be one of the WPS State strings listed in the description of the API itself. + */ +extern int qcsapi_wps_get_state( const char *ifname, char *wps_state, const qcsapi_unsigned_int max_len ); + +/** + * \brief Get the WPS configured state for the given interface. + * + * This API call is used to find the WPS configured state - either configured or + * not configured. + * + * \note this API can only be called on an AP device. WPS configured/not configured + * is a concept that only applies to the AP. + * + * \param ifname \wifi0 + * \param wps_state return parameter to store the WPS state (configured or + * not configured). + * \param max_len the size of the input buffer (wps_state). + * + * \return >= 0 on success, < 0 on error. If success, the wps_state parameter + * will be filled with the NULL terminated string 'configured' or 'not configured'. + * + * \callqcsapi + * + * call_qcsapi get_wps_configured_state \ + * + * Unless an error occurs, the output will be the string 'configured' or ' + * not configured'. + */ +extern int qcsapi_wps_get_configured_state( const char *ifname, char *wps_state, const qcsapi_unsigned_int max_len ); + + +/** + * \brief Get the WPS runtime state for the given interface. + * + * This API call is used to find the WPS runtime state, disabled, not configured or + * configuired + * + * \note this API can only be called on an AP device. + * + * \param ifname \wifiX + * \param state return parameter to store the WPS state (disabled, configured or + * not configured). + * \param max_len the size of the input buffer (state). + * + * \return >= 0 on success, < 0 on error. If success, the wps_state parameter + * will be filled with the NULL terminated string 'disable', 'configured' or 'not configured'. + * + * \callqcsapi + * + * call_qcsapi get_wps_runtime_state \ + * + * Unless an error occurs, the output will be the string 'disabled', 'configured' or ' + * not configured'. + */ +extern int qcsapi_wps_get_runtime_state(const char *ifname, char *state, int max_len); + +/** + * \brief Set the WPS configured state for the given interface. + * + * This API call is used to set the WPS state to configured or unconfigured. + * + * \note This API can only be called on an AP. + * \note If Hotspot 2.0 is enabled then WPS configuration will not take any effect. + * + * \param ifname \wifiX + * \param state either 0 (disabled), 1 (not configured) or 2 (configured). + * + * \return >= 0 on success, < 0 on failure. + * + * \callqcsapi + * + * call_qcsapi set_wps_configured_state \ \<0 | 1 | 2\> + * + * Unless an error occurs, the output will be the string complete. + */ +extern int qcsapi_wps_set_configured_state( const char *ifname, const qcsapi_unsigned_int state ); + +/** + * @brief Get a WPS parameter + * + * This API returns the value of a WPS Parameter. + * + * \param ifname \wifi0 \wifi1 etc. + * \param wps_type the WPS parameter. See the definition of the enun qcsapi_wps_param_type. + * \param wps_str Address of the string to receive the parameter's value. + * \param max_len Maximum number of characters that can be written to the parameter wps_str + * + * \return >= 0 on success, < 0 on failure. + * + * \callqcsapi + * + * call_qcsapi get_wps_param \ \ + * + * where WPS parameter name is one of uuid, os_version, + * device_name, config_methods or ap_setup_locked + * last_config_error registrar_number registrar_established + * force_broadcast_uuid + * + * \note this API can be used both on AP and STA, except for parameter name is ap_setup_locked and force_broadcast_uuid. + * + * Unless an error occurs, the output will be the value of the selected WPS parameter. + * + * \note last_config_error, registrar_number, and registrar_established are not supported currently. + */ +extern int qcsapi_wps_get_param(const char *ifname, qcsapi_wps_param_type wps_type, char *wps_str, const qcsapi_unsigned_int max_len); + +/** + * @brief set wps walk time value from 120s to 600s + * + * This API call is used to set the wps walk time + * + * \note this API can be called both on an AP device or a STA device. + * + * \param ifname \wifi0 + * \param value. walk time value + * + * \return >= 0 on success, < 0 on failure. + * + * \callqcsapi + * + * call_qcsapi wps_set_timeout \ \ + * + * Unless an error occurs, the output will be the string complete. + */ +extern int qcsapi_wps_set_timeout(const char *ifname, const int value); + +/** + * @brief set wps_on_hidden_ssid enabled or disabled + * + * This API call is used to enable or disable the feature wps_on_hidden_ssid + * + * \note \aponly + * + * \param ifname \wifiX + * \param value. 1 wps_on_hidden_ssid enabled, 0 wps_on_hidden_ssid disabled + * + * \return >= 0 on success, < 0 on failure. + * + * \callqcsapi + * + * call_qcsapi wps_on_hidden_ssid \ \<0 | 1\> + * + * Unless an error occurs, the output will be the string complete. + */ +extern int qcsapi_wps_on_hidden_ssid(const char *ifname, const int value); + +/** + * @brief get wps_on_hidden_ssid status + * + * This API call is used to check status of wps_on_hidden_ssid + * + * \note \aponly + * + * \param ifname \wifiX + * + * \return "on", "off" or "FAIL" + * + * \callqcsapi + * + * call_qcsapi wps_on_hidden_ssid_status \ + * + * Unless an error occurs, the output will be the string complete. + */ +extern int qcsapi_wps_on_hidden_ssid_status(const char *ifname, char *state, int max_len); + +/** + * @brief enable or disable wps upnp module + * + * This API call is used to enable or disable wps upnp module + * + * \note \aponly + * + * \param ifname \wifi0 + * \param value. 1 upnp enabled, 0 upnp disabled + * + * \return >= 0 on success, < 0 on failure. + * + * \callqcsapi + * + * call_qcsapi wps_upnp_enable \ \<0 | 1\> + * + * Unless an error occurs, the output will be the string complete. + */ +extern int qcsapi_wps_upnp_enable(const char *ifname, const int value); + +/** + * @brief get upnp status + * + * This API call is used to get upnp status + * + * \note \aponly + * + * \param ifname \wifi0 + * \param reply. reply buffer + * \param reply_len. reply buffer length + * + * \return >= 0 on success, < 0 on failure. + * + * \callqcsapi + * + * call_qcsapi wps_upnp_status \ + * + * Unless an error occurs, the output will be the string complete. + */ +extern int qcsapi_wps_upnp_status(const char *ifname, char *reply, int reply_len); + +/** + * @brief Allow or forbid the detection of WPS PBC overlap + * + * This API call is used to allow/forbid the detection of PBC overlap. + * + * \note this API can be called both on an AP device or a STA device. + * + * \param ifname \wifi0 + * \param allow. 1 indicates allow, 0 indicates forbid. + * + * \return >= 0 on success, < 0 on failure. + * + * \callqcsapi + * + * call_qcsapi allow_pbc_overlap \ \<0 | 1\> + * + * Unless an error occurs, the output will be the string complete. + */ +extern int qcsapi_wps_allow_pbc_overlap(const char *ifname, const qcsapi_unsigned_int allow); +/** + * @brief get status if PBC overlap is allowed on AP or STA. + * + * This API returns the status if PBC overlap is allowed on AP or STA. + * + * \note this API can be called both on an AP device or a STA device. + * + * \param ifname \wifi0 + * \param status the return value if allow PBC overlap. + * + * \return >= 0 on success, < 0 on failure. If success, the status of allowing + * PBC overlap (0/1) will be returned. + * + * \callqcsapi + * + * call_qcsapi get_allow_pbc_overlap_status \ + * + * Unless an error occurs, the output will be the string '1' or '0' + */ +extern int qcsapi_wps_get_allow_pbc_overlap_status(const char *ifname, int *status); + +/** + * \brief Enable/Disable the WPS Pair Protection for the given interface. + * + * This API call is used to Enable/Disable the WPS Pair Protection. + * + * \note this API can only be called on an AP device. + * + * \param ifname \wifi0 + * \param ctrl_state either 0 (disabled) or 1 (enabled). + * + * \return >= 0 on success, < 0 on failure. + * + * \callqcsapi + * + * call_qcsapi set_wps_access_control \ \<0 | 1\> + * + * Unless an error occurs, the output will be the string complete. + */ +extern int qcsapi_wps_set_access_control(const char *ifname, uint32_t ctrl_state); + +/** + * \brief Get the WPS Pair Protection state for the given interface. + * + * This API call is used to get the WPS Pair Protection state - either enabled or + * disabled. + * + * \note this API can only be called on an AP device. + * + * \param ifname \wifi0 + * \param ctrl_state return parameter to store the WPS Pair Protection state (enabled or + * disabled). + * + * \return >= 0 on success, < 0 on error. If success, the wps pair protection state parameter + * (0/1)will be returned. + * + * \callqcsapi + * + * call_qcsapi get_wps_access_control \ + * + * Unless an error occurs, the output will be the string '1' or '0'. + */ +extern int qcsapi_wps_get_access_control(const char *ifname, uint32_t *ctrl_state); + +/** + * @brief Set a WPS parameter + * + * This API is called to set a WPS Parameter. + * + * \param ifname \wifi0 \wifi1 etc. use \all to set parameter for each existing interface, AP mode only. + * \param wps_type the WPS parameter. See the definition of the enun qcsapi_wps_param_type. + * \param param_value Address of the string to set the parameter's value. + * + * \return >= 0 on success, < 0 on failure. + * + * \callqcsapi + * + * call_qcsapi set_wps_param \ \ \ + * + * where WPS parameter name is one of config_methods, ap_pin, setup_lock, ap_setup_locked + * , uuid or force_broadcast_uuid. The API is only available for AP mode, except for the parameter name uuid and + * config_methods. + * + * Parameter ap_setup_locked can only be set or reset when the WPS parameter + * ap_pin_fail_method is set to auto_lockdown. + * + * When parameter name is config_methods, the available parameter value is + * one of following value or combination of them, usba, ethernet, label, + * display, ext_nfc_token, int_nfc_token, nfc_interface, + * push_button, keypad, virtual_display, + * virtual_push_button, physical_push_button. + * + * The parameter value of uuid has format xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx. For example:
+ * cdcb13e6-baa5-5f43-807f-4b4c28223a68 + * + * Unless an error occurs, the output will be the string complete. + */ +extern int qcsapi_wps_set_param(const char *ifname, const qcsapi_wps_param_type param_type, const char *param_value); + +/** + * @brief Cancel the ongoing wps procedure if any. + * + * This API equivalent to "wpa_cli wps_cancel". It will cancel ongoing wps procedure, + * and do nothing if there are no wps procedure undergoing. + * + * \note this API can only be called on an STA device. + * + * \param ifname \wifi0 + * + * \return 0 if the call succeeded. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi wps_cancel \ + * + * Unless an error occurs, the output will be the string complete. + */ +extern int qcsapi_wps_cancel( const char *ifname ); + +/** + * @brief Add/remove PBC methods in SRCM. + * + * This API is used to add or remove PBC methods in SRCM (selected registrar config methods) + * attribute in WSC IE. + * + * \note this API can only be called on an AP device. + * + * \param ifname \wifi0 + * \param enabled 1 to add and 0 to remove PBC methods in SRCM attribute in WSC IE. + * + * \return 0 if the call succeeded. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi set_wps_pbc_in_srcm \ \<1 | 0\> + * + * Unless an error occurs, the output will be the string complete. + */ +extern int qcsapi_wps_set_pbc_in_srcm(const char *ifname, const qcsapi_unsigned_int enabled); + +/** + * @brief Get currently setting of PBC methods in SRCM attribute. + * + * This API is used to get currently setting of PBC methods in SRCM attribute. + * + * \note this API can only be called on an AP device. + * + * \param ifname \wifi0 + * \param p_enabled Where to store the result return. + * + * \return 0 if the call succeeded. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi get_wps_pbc_in_srcm \ + * + * Unless an error occurs, the output will be the string 0 or 1. + */ + +extern int qcsapi_wps_get_pbc_in_srcm(const char *ifname, qcsapi_unsigned_int *p_enabled); + +/** + * @brief set default bss for WPS Push button + * + * This API is used to set default bss for WPS Push button if there's more than one BSS such like MBSS mode + * default bss for WPS PBC is primary interface(wifi0) after powered up + * + * \note this API can only be called on an AP device. set "null" would remove default setting + * + * \param ifname \wifiX + * + * \return 0 if the call succeeded. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi registrar_set_default_pbc_bss \ + * + * Unless an error occurs, the output will be the string complete. + */ + +extern int qcsapi_registrar_set_default_pbc_bss(const char *ifname); + +/** + * @brief get default bss for WPS Push button + * + * This API is used to get default bss for WPS Push button + * default bss for WPS PBC is primary interface(wifi0) after powered up + * + * \note this API can only be called on an AP device. + * + * \return 0 if the call succeeded. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi registrar_get_default_pbc_bss + * + * Unless an error occurs, the output will be WiFi interface or null. + */ + +extern int qcsapi_registrar_get_default_pbc_bss(char *default_bss, int len); + +/**@}*/ + + +/* + * GPIO ... + */ +/**@addtogroup LEDGPIOAPIs + *@{*/ + +/** + * @brief Set GPIO configuration + * + * \warning This API can potentially damage the chip, please treat it with respect and read through the following documentation + * before using the API. + * + * Configures a GPIO pin for input (1), input/output (2), or disables further use of the GPIO pin (0), + * as specified by the new GPIO config parameter (see \ref qcsapi_gpio_config). + * + * GPIO pin values run from 0 to 31. + * + * \note This API is only available in calibration mode (see @ref mysection4_1_5 "Production mode vs calibration mode"). + * + * \param gpio_pin the GPIO to change. + * \param new_gpio_config the new state of the PIN. + * + * \return 0 if the call succeeded. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi set_gpio_config \ \ + * + * where \ is a GPIO pin number, an integer in the range 0 to 31, and <configuration> is either 0, 1 or 2. + * + * See above for the meaning of 0, 1 and 2 as a GPIO pin configuration. + * + * Unless an error occurs, the output will be the string complete. + * + * \warning Power should not be turned off to the WiFi device when calling the set GPIO config API or immediately afterwards. + * Failure to follow this restriction can cause the flash memory on the board to become corrupted. + * If power needs to be turned off to the WiFi device when working with this API, + * enter the halt command first and wait for the device to shut down. + * This API should only be called when initially configuring the board. + * + * \warning Be aware that configuring a GPIO pin for output that either not present or wired for input can leave the board or + * chip open to being damaged should a set API attempt + * to change the GPIO pin setting to a state not supported by the hardware. + * + * + * \sa qcsapi_gpio_config + */ +extern int qcsapi_gpio_set_config( const uint8_t gpio_pin, const qcsapi_gpio_config new_gpio_config ); + +/** + * @brief Get GPIO configuration + * + * Get the current configuration of a GPIO pin, either input (1), output (2), or disabled (0). + * + * GPIO pin values are the same as in the set GPIO config API. + * + * \param gpio_pin the GPIO to read. + * \param p_gpio_config return parameter to store the state of the PIN. + * + * \return 0 if the call succeeded. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi get_gpio_config \ + * + * where \ is a GPIO pin number, an integer in the range 0 to 31. + */ +extern int qcsapi_gpio_get_config( const uint8_t gpio_pin, qcsapi_gpio_config *p_gpio_config ); + +/** + * @brief Get LED state. + * + * Get the current level for an LED/GPIO pin, either HIGH (1) or LOW (0). + * + * \note The GPIO pin must have been previously configured for input or output thru qcsapi_gpio_set_config. + * + * \param led_ident the GPIO pin number. + * \param p_led_setting + * + * \return 0 if the call succeeded. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi get_LED \ + * + * where \ is an LED / GPIO pin number, an integer in the range 0 to 31. + * + * Unless an error occurs, the output will be either 0 (LOW) or 1 (HIGH). + */ +extern int qcsapi_led_get( const uint8_t led_ident, uint8_t *p_led_setting ); + +/** + * @brief Set LED state. + * + * Set the current level for an LED/GPIO pin, either HIGH (1) or LOW (0). + * + * The LED identity is the GPIO pin number. + * + * \note The GPIO pin must have been previously configured for output thru the set GPIO config API (qcsapi_gpio_set_config). + * + * \warning Be aware that configuring an incorrect GPIO pin for input/output and then setting the level for that invalid GPIO pin can damage the board. + * Consult the documentation or schematics for the board for details on the GPIO pin configuration. + * + * \param led_ident the GPIO corresponding to the LED to change. + * \param new_led_setting the new state of the LED. + * + * \callqcsapi + * + * call_qcsapi set_LED \ \<0 | 1\> + * + * where is an LED / GPIO pin number, an integer in the range 0 to 31. + * + * Unless an error occurs, the output will be the string complete. + * + * \note Most GPIO pins connect to an LED or other item of hardware that software controls directly using the get and set LED APIs. + * However, the WPS Push Button and the Reset Device Push Button require additional programming, + * since the end-user can press these push buttons to start a WPS association process or reset the WiFi device. + * The software thus needs to be "armed" to respond to these events. + * Because the way the system is expect to respond to a WPS push button press is quite different from + * the way it should respond to a Reset Device button press, separate APIs are provided for each. + */ +extern int qcsapi_led_set( const uint8_t led_ident, const uint8_t new_led_setting ); + +/** + * @brief Enable pulse wide modulation for LED GPIO pin. + * + * Enable pulse wide modulation for LED GPIO pin to control LED brightness. + * + * The LED identity is the GPIO pin number. + * + * \param led_ident the GPIO corresponding to the LED to change. + * \param onoff 1 to enable PWM, 0 - to disable. + * \param high_count 'on' duration in each cycle, integer in range 1 - 256 + * \param low_count 'off' duration in each cycle, integer in range 1 - 256 + * + * \callqcsapi + * + * call_qcsapi set_LED_PWM \ \<0 | 1\> \ \ + * + * where is an LED / GPIO pin number, an integer in the range 0 to 31, + * + * Unless an error occurs, the output will be the string complete. + */ +extern int qcsapi_led_pwm_enable( const uint8_t led_ident, const uint8_t onoff, const qcsapi_unsigned_int high_count, const qcsapi_unsigned_int low_count ); + +/** + * @brief Set LED brightness level + * + * Set LED brightness level. Level can be beetween 1 and 10 where 10 is a maximum brightness and 1 is a lowest + * level before turning off the LED. The LED identity is the GPIO pin number. + * + * \param led_ident the GPIO corresponding to the LED to change. + * \param level brightness level in range 1 - 10 + * + * \callqcsapi + * + * call_qcsapi set_LED_brightness \ \ + * + * where is an LED / GPIO pin number, an integer in the range 0 to 31, + * + * Unless an error occurs, the output will be the string complete. + */ +extern int qcsapi_led_brightness(const uint8_t led_ident, const qcsapi_unsigned_int level); + +/** + * This typedef is used to force a function prototype for reset button function callback. + * + * The reset_device_pin passes in the GPIO pin being monitored, and the current_level is either 1 or 0. + * + * \sa qcsapi_gpio_monitor_reset_device + */ +typedef void (*reset_device_callback)(uint8_t reset_device_pin, uint8_t current_level); + +/** + * @brief Monitor the reset device GPIO pin. + * + * This API lets an application identify the GPIO pin connected to the reset device push button, + * and then monitors this push button. + * + * \param reset_device_pin the GPIO pin that is connected to the push button. This pin must be configured for input. + * \param active_logic identifies whether the active state of the pin is high or low, and should be 1 or 0 respectively. + * \param blocking_flag specifies whether the API should block the process until the button is pressed. Currently this must be set to 1 - ie + * the API only supports blocking operation. + * \param respond_reset_device is the address of a callback entry point, with signature as per the \ref reset_device_callback. + * + * When called, this API (after completing error checking) periodically checks the state of reset_device_pin. + * When this pin goes active, as specified by active_logic, it calls the callback entry point identified by reset_device_callback. + * Notice the entry point is responsible for handling any response to pressing the reset device push button. + * + * A sample requirement for how this API is used is: + * + * \li If the Reset Device Push Button is pressed for between 1 second and 5 seconds, the WiFi device reboots. + * \li If the Reset Device Push Button is pressed for more than 5 seconds, the factory default settings are restored and the device then reboots. + * + * Again, the reset device callback, programming not part of the QCSAPI, + * is responsible for handling the response to pressing this push button. + * + * \note The script to restore factory default settings is expected to be located in /scripts/restore_default_config. + * + * \note This API cannot be called from within call_qcsapi + */ +extern int qcsapi_gpio_monitor_reset_device(const uint8_t reset_device_pin, + const uint8_t active_logic, + const int blocking_flag, + reset_device_callback respond_reset_device); + +/** + * @brief Enable the WPS GPIO push button. + * + * This API enables the WPS push button. + * + * Unlike the reset device push button, the expected response when the WPS push button is pressed is predefined. + * For this reason no callback programming is required. + * + * \param wps_push_button the GPIO used for WPS push button operation. + * \param active_logic identifies whether the active state of the pin is high or low, and should be 1 or 0 respectively. + * \param use_interrupt_flag if set to 0, selects polling operation, if 1, selects interrupt operation. If interrupt mode is selected, + * the active logic must be 1. + * + * \callqcsapi + * + * call_qcsapi enable_wps_push_button \ \<0 | 1\> + * + * where \ is the number of the GPIO pin that controls the WPS push button. + * The parameter that follows selects active logic, either LOW (0) or HIGH (1). + * + * To enable the WPS push button in interrupt mode, enter: + * call_qcsapi enable_wps_push_button \ 0 intr + */ +extern int qcsapi_gpio_enable_wps_push_button(const uint8_t wps_push_button, + const uint8_t active_logic, + const uint8_t use_interrupt_flag); +/**@}*/ + + +/*Per associations API*/ +/**@addtogroup PerAssocAPIs + *@{*/ +/* Associations (AP only) */ + +/** + * @brief Get the number of STAs associated. + * + * Gets the number of stations currently associated with the access point. + * As associations are dynamic, this count can change at any time. + * + * \note This API is used on both AP and STA. On a STA, it is used to + * indicate whether it is associated with an AP. + * + * \param ifname \wifi0 + * \param p_association_count return parameter to store the count of STAs associated with the AP. + * + * \return 0 if the call succeeded. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi get_count_assoc \ + * + * call_qcsapi get_count_associations \ + * + * call_qcsapi get_association_count \ + * + * Unless an error occurs, the output will be the count of stations currently associated to this AP. + * + * \sa qcsapi_wifi_get_BSSID + */ +extern int qcsapi_wifi_get_count_associations( const char *ifname, qcsapi_unsigned_int *p_association_count ); + +/** + * @brief Get the associated STA MAC addresses. + * + * Gets the MAC address of a STA currently associated with the AP. Second parameter selects the association index, + * with a range from 0 to the association count - 1. + * An index out of range causes the API to fail with the error set to Out of Range (-ERANGE). + * Use qcsapi_wifi_get_count_associations to determine the current association count. + * + * As associations are dynamic, the count of associations can change at any time. + * An application should never assume that a value previously returned from qcsapi_wifi_get_count_associations remains valid. + * Applications should always be prepared for a return value of -ERANGE from this API, even if it just verified the number of current associations. + * + * This API only works on an AP; for a STA, use the get BSSID API (\ref qcsapi_wifi_get_BSSID) to get the MAC + * address of the associated AP. + * + * \note \aponly + * + * \param ifname \wifi0 + * \param device_index the index of the STA MAC address to return. + * \param device_mac_addr the MAC address of the STA at index 'device_index'. + * + * \return 0 if the call succeeded. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi get_associated_device_mac_addr \ \
+ * + * The output will be the MAC address of the associated station, or an error message. + * + * \sa qcsapi_wifi_get_BSSID + */ +extern int qcsapi_wifi_get_associated_device_mac_addr(const char *ifname, + const qcsapi_unsigned_int device_index, + qcsapi_mac_addr device_mac_addr); + +/** + * @brief Get the associated device IP addresses. + * + * Get the IP address of a device (STA or WDS peer) currently associated with the AP. + * + * \note This API is only used on the AP. + * + * Second parameter selects the association index, with a range from 0 to the association count - 1. + * An index out of range causes the API to fail with the error set to Out of Range (-ERANGE). + * Use qcsapi_wifi_get_count_associations to determine the current association count. + * As associations are dynamic, the count of associations can change at any time. + * An application should never assume that a value previously returned from qcsapi_wifi_get_count_associations remains valid. + * Applications should always be prepared for a return value of -ERANGE from this API, even if it just verified the number of current associations. + * + * \param ifname \wifi_wds + * \param device_index association index of STA, or 0 for a WDS peer + * \param ip_addr the IP address of the device at index 'device_index'. + * + * \return 0 if the call succeeded. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi get_associated_device_ip_addr \ \
+ * + * The output will be the IP address of the associated device, or an error message. + */ +extern int qcsapi_wifi_get_associated_device_ip_addr(const char *ifname, + const qcsapi_unsigned_int device_index, + unsigned int *ip_addr); + +/** + * @brief Get the link quality per association index. + * + * Returns the link quality as the current TX PHY rate in megabits per second (MBPS). + * + * \note The device must have the autorate fallback option enabled. + * + * \param ifname \wifi0 + * \param association_index On the AP this is the association index of the STA link quality to be read. On the STA, this should be 0. + * \param p_link_quality the link quality for the given index. + * + * \return 0 if the call succeeded. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi get_link_quality \ \ + * + * The output will be the current link quality for the association, in terms of the current TX PHY rate in Mbps + */ +extern int qcsapi_wifi_get_link_quality( + const char *ifname, + const qcsapi_unsigned_int association_index, + qcsapi_unsigned_int *p_link_quality +); + +/** + * @brief Get maximum link quality for all stations + * + * Returns link quality as the current TX PHY rate in megabits per second (Mbps). + * The function is similar to qcsapi_wifi_get_link_quality but returns maximum link quality + * for all current associations. + * + * \param ifname \wifi0 + * \param p_max_quality the maximum of the link quality for all current associations. + * + * \return 0 if the call succeeded. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + */ +extern int qcsapi_wifi_get_link_quality_max( + const char *ifname, + qcsapi_unsigned_int *p_max_quality +); + +/** + * @brief Get RX bytes per association index. + * + * Returns the current number of bytes received on the association. + * + * The count is set to 0 at the start of the association. + * + * \param ifname \wifi0 + * \param association_index On the AP this is the association index of the STA RX bytes is to be read. On the STA, this should be 0. + * \param p_rx_bytes return parameter to contain the number of bytes received on this association index. + * + * \return 0 if the call succeeded. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi get_rx_bytes \ \ + * + * The output will be the current number of bytes received on that association. + */ +extern int qcsapi_wifi_get_rx_bytes_per_association( + const char *ifname, + const qcsapi_unsigned_int association_index, + u_int64_t *p_rx_bytes +); + +/** + * @brief Get TX bytes per association index. + * + * Returns the current number of bytes transmitted on the association. + * + * The count is set to 0 at the start of the association. + * + * \param ifname \wifi0 + * \param association_index On the AP this is the association index of the STA TX bytes is to be read. On the STA, this should be 0. + * \param p_tx_bytes return parameter to contain the number of bytes transmitted on this association index. + * + * \return 0 if the call succeeded. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi get_tx_bytes \ \ + * + * The output will be the current number of bytes transmitted on that association. + */ +extern int qcsapi_wifi_get_tx_bytes_per_association( + const char *ifname, + const qcsapi_unsigned_int association_index, + u_int64_t *p_tx_bytes +); + +/** + * @brief Get RX Packets by association. + * + * Returns the current number of packets received on the association. + * + * The count is set to 0 at the start of the association. + * + * \param ifname \wifi0 + * \param association_index On the AP this is the association index of the STA. On the STA, this should be 0. + * \param p_rx_packets return parameter to contain the number of packets received on this association. + * + * \return 0 if the call succeeded. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi get_rx_packets \ \ + * + * call_qcsapi get_assoc_rx_packets \ \ + * + * The output will be the current number of packets received on that association. + */ +extern int qcsapi_wifi_get_rx_packets_per_association( + const char *ifname, + const qcsapi_unsigned_int association_index, + qcsapi_unsigned_int *p_rx_packets +); + +/** + * @brief Get TX Packets by association. + * + * Returns the current number of packets transmitted on the association. + * + * The count is set to 0 at the start of the association. + * + * \param ifname \wifi0 + * \param association_index On the AP this is the association index of the STA. On the STA, this should be 0. + * \param p_tx_packets return parameter to contain the number of packets transmitted on this association. + * + * \return 0 if the call succeeded. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi get_tx_packets \ \ + * + * call_qcsapi get_assoc_tx_packets \ \ + * + * The output will be the current number of packets transmitted on that association. + */ +extern int qcsapi_wifi_get_tx_packets_per_association( + const char *ifname, + const qcsapi_unsigned_int association_index, + qcsapi_unsigned_int *p_tx_packets +); + +/** + * @brief Get TX Packets Errors by association. + * + * Returns the current number of packets that failed to be transmitted on the association. + * + * The count is set to 0 at the start of the association. + * + * \param ifname \wifi0 + * \param association_index On the AP this is the association index of the STA. On the STA, this should be 0. + * \param p_tx_err_packets return parameter to contain the number of packets which failed transmission on this association. + * + * \return 0 if the call succeeded. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi get_tx_err_packets \ \ + * + * The output will be the current number of packets that failed to be transmitted on the association. + */ +extern int qcsapi_wifi_get_tx_err_packets_per_association( + const char *ifname, + const qcsapi_unsigned_int association_index, + qcsapi_unsigned_int *p_tx_err_packets +); + +/** + * @brief Get RSSI per association index. + * + * Returns the current Received Signal Strength Indication (RSSI) in the range [0, 68]. + * + * \param ifname \wifi0 + * \param association_index On the AP this is the association index of the STA RSSID is to be read. On the STA, this should be 0. + * \param p_rssi return parameter to contain the RSSI on this association index, in the range [0 - 68]. + * + * \return 0 if the call succeeded. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi get_rssi \ \ + * + * The output will be the current RSSI for the association in the range [0 - 68]. + */ +extern int qcsapi_wifi_get_rssi_per_association( + const char *ifname, + const qcsapi_unsigned_int association_index, + qcsapi_unsigned_int *p_rssi +); + +/** + * @brief Get RSSI in dBm per association index. + * + * Returns the current Received Signal Strength Indication (RSSI) in dBm. + * + * \param ifname \wifi0 + * \param association_index On the AP this is the association index of the STA to be read. On the STA, this should be 0. + * \param p_rssi return parameter to contain the RSSI on this association index. + * + * \return 0 if the call succeeded. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi get_rssi_dbm \ \ + * + * The output will be the current RSSI in dBm for the association. + */ +extern int qcsapi_wifi_get_rssi_in_dbm_per_association( + const char *ifname, + const qcsapi_unsigned_int association_index, + int *p_rssi +); + +/** + * \brief Get the associated peer bandwidth (20 vs 40MHz). + * + * This API call is used to determine the bandwidth used by the peer STA. + * The bandwidth is 20 or 40, representing 20MHz or 40MHz. + * + * \param ifname \wifi0 + * \param association_index the entry into the association table. + * \param p_bw return parameter for storing the return value (either + * 20 or 40) + * + * \return >= 0, success, < 0 error. + * + * \callqcsapi + * + * call_qcsapi get_assoc_bw \ <index> + * + * Unless an error occurs, the output will be one of the strings + * '20' or '40'. + */ +extern int qcsapi_wifi_get_bw_per_association( + const char *ifname, + const qcsapi_unsigned_int association_index, + qcsapi_unsigned_int *p_bw +); + +/** + * @brief Get TX PHY rate by association index. + * + * Returns the current TX PHY rate in megabits per second (MBPS) + * + * \param ifname \wifi0 + * \param association_index On the AP this is the association index of the STA to be read. On the STA, this should be 0. + * \param p_tx_phy_rate return parameter to receive the TX PHY rate on this association index. + * + * \return 0 if the call succeeded. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi get_tx_phy_rate \ \ + * + * Unless an error occurs, the output will be the current TX PHY rate in MBPS. + */ +extern int qcsapi_wifi_get_tx_phy_rate_per_association( + const char *ifname, + const qcsapi_unsigned_int association_index, + qcsapi_unsigned_int *p_tx_phy_rate +); + +/** + * @brief Get RX PHY rate by association index. + * + * Returns the current RX PHY rate in megabits per second (MBPS) + * + * \param ifname \wifi0 + * \param association_index On the AP this is the association index of the STA to be read. On the STA, this should be 0. + * \param p_rx_phy_rate return parameter to receive the RX PHY rate on this association index. + * + * \return 0 if the call succeeded. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi get_rx_phy_rate \ \ + * + * Unless an error occurs, the output will be the current RX PHY rate in MBPS. + */ +extern int qcsapi_wifi_get_rx_phy_rate_per_association( + const char *ifname, + const qcsapi_unsigned_int association_index, + qcsapi_unsigned_int *p_rx_phy_rate +); + +/** + * @brief Get TX MCS by association index. + * + * Returns the current TX MCS + * + * \param ifname \wifi0 + * \param association_index On the AP this is the association index of the STA to be read. On the STA, this should be 0. + * \param p_mcs return parameter to receive the TX MCS on this association index. + * + * \return 0 if the call succeeded. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi get_tx_mcs \ \ + * + * Unless an error occurs, the output will be the current TX MCS. + */ +extern int qcsapi_wifi_get_tx_mcs_per_association( + const char *ifname, + const qcsapi_unsigned_int association_index, + qcsapi_unsigned_int *p_mcs +); + +/** + * @brief Get RX MCS by association index. + * + * Returns the current RX MCS + * + * \param ifname \wifi0 + * \param association_index On the AP this is the association index of the STA to be read. On the STA, this should be 0. + * \param p_mcs return parameter to receive the RX MCS on this association index. + * + * \return 0 if the call succeeded. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi get_rx_mcs \ \ + * + * Unless an error occurs, the output will be the current RX MCS. + */ +extern int qcsapi_wifi_get_rx_mcs_per_association( + const char *ifname, + const qcsapi_unsigned_int association_index, + qcsapi_unsigned_int *p_mcs +); + +/** + * @brief Get Achievable TX PHY rate by association index. + * + * Returns the achievable TX PHY rate in kilobits per second (KBPS) + * + * \note The units for this API are kilobits per second. The reported achievable TX PHY rate typically ranges between 54000 and 1733300. + * + * \param ifname \wifi0 + * \param association_index On the AP this is the association index of the STA to be read. On the STA, this should be 0. + * \param p_achievable_tx_phy_rate return parameter to receive the achievable RX PHY rate on this association index. + * + * \return 0 if the call succeeded. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi get_achievable_tx_phy_rate \ \ + * + * Unless an error occurs, the output will be the achievable TX PHY rate in KBPS. + */ +extern int qcsapi_wifi_get_achievable_tx_phy_rate_per_association( + const char *ifname, + const qcsapi_unsigned_int association_index, + qcsapi_unsigned_int *p_achievable_tx_phy_rate +); + +/** + * @brief Get Achievable RX PHY rate by association index. + * + * Returns the achievable RX PHY rate in kilobits per second (KBPS) + * + * \note The units for this API are kilobits per second. The reported achievable RX PHY rate typically ranges between 54000 and 1733300. + * + * \param ifname \wifi0 + * \param association_index On the AP this is the association index of the STA RSSID is to be read. On the STA, this should be 0. + * \param p_achievable_rx_phy_rate return parameter to receive the achievable RX PHY rate on this association index. + * + * \return 0 if the call succeeded. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi get_achievable_rx_phy_rate \ \ + * + * Unless an error occurs, the output will be the achievable RX PHY rate in KBPS. + */ +extern int qcsapi_wifi_get_achievable_rx_phy_rate_per_association( + const char *ifname, + const qcsapi_unsigned_int association_index, + qcsapi_unsigned_int *p_achievable_rx_phy_rate +); + + +/** + * @brief Get authentification description by association index. + * + * Returns the auth algorithm, key management, key protocol and cipher. + * + * \param ifname \wifi0 + * \param association_index On the AP this is the association index of the STA authentification detail is to be read. + * \param p_auth_enc return parameter to receive the authetification details. Information is passed in packed format: + * Bits 0 - 7: Auth algorithm (0x00 - OPEN, 0x01 - SHARED) + * Bits 8 - 15: Key management (0x00 - NONE, 0x01 - EAP, 0x02 - PSK, 0x03 - WEP) + * Bits 16 - 23: Key protocol (0x00 - NONE, 0x01 - WPA, 0x02 - WPA2) + * Bits 24 - 31: Cipher (0x01 - TKIP, 0x03 - CCMP) + * + * \return 0 if the call succeeded. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi get_auth_enc_per_assoc \ \ + * + * Unless an error occurs, the output will be the authenification details. + */ +extern int qcsapi_wifi_get_auth_enc_per_association( + const char *ifname, + const qcsapi_unsigned_int association_index, + qcsapi_unsigned_int *p_auth_enc +); + +/** + * \internal + * \brief Get HT and VHT capabilities by association index. + * + * Returns the contents of the HT and VHT information elements for an associated station. + * + * \param ifname \wifi0 + * \param association_index the association index of an associated station + * \param tput_caps buffer to receive the returned data + * + * \return 0 if the call succeeded. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi get_tput_caps \ \ + * + * Unless an error occurs, the output will be the content of the station's HT and VHT + * information elements in hex format. LSB to MSB order will be used for output. + */ +extern int qcsapi_wifi_get_tput_caps( + const char *ifname, + const qcsapi_unsigned_int association_index, + struct ieee8011req_sta_tput_caps *tput_caps +); + +/** + * \internal + * \brief Get connection mode by association index. + * + * Returns the connection mode for an associated station. + * + * \param ifname \wifi0 + * \param association_index the association index of an associated station + * \param connection_mode buffer to receive the current mode, which is a value from the + * ieee80211_wifi_modes enum + * + * \return 0 if the call succeeded. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi get_connection_mode \ \ + * + * Unless an error occurs, the output will be a WiFi mode from the qcsapi_wifi_modes_strings + * array. E.g. 'a', 'b', 'g', 'na', 'ng' or 'ac'. + */ +extern int qcsapi_wifi_get_connection_mode( + const char *ifname, + const qcsapi_unsigned_int association_index, + qcsapi_unsigned_int *connection_mode +); + +/** + * @brief Get vendor by association index. + * + * Returns vendor name of the peer device (if known) for the given association index. + * + * \param ifname \wifi0 + * \param association_index On the AP this is the association index of the STA RSSID is to be read. On the STA, this should be 0. + * \param p_vendor return vendor name for this association index. + * + * \return 0 if the call succeeded. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi get_vendor \ \ + * + * Unless an error occurs, the output will be the vendor of the client. + */ +extern int qcsapi_wifi_get_vendor_per_association( + const char *ifname, + const qcsapi_unsigned_int association_index, + qcsapi_unsigned_int *p_vendor +); + +/** + * \internal + * \brief Get max MIMO streams by association index + * + * Returns the maximum number of receive and transmit spatial streams allowed to/from an associated + * station. + * + * \param ifname \wifi0 + * \param association_index the association index of an associated station + * \param p_max_mimo buffer to receive the max MIMO streams + * + * \return 0 if the call succeeded. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi get_max_mimo \ \ + * + * Unless an error occurs, the output will be a string representing max MIMO streams supported by + * the station in the form "Rx:A Tx:B" where A and B are integers. The output will be "unknown" if + * the number of streams cannot be determined. + */ +extern int qcsapi_wifi_get_max_mimo( + const char *ifname, + const qcsapi_unsigned_int association_index, + string_16 p_max_mimo +); + + +/** + * @brief Get Signal to Noise Ratio (SNR) by association index. + * + * Returns the current SNR for the given association index. + * + * \param ifname \wifi0 + * \param association_index On the AP this is the association index of the STA RSSID is to be read. On the STA, this should be 0. + * \param p_snr return parameter to receive the SNR on this association index. + * + * \return 0 if the call succeeded. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi get_snr \ \ + * + * Unless an error occurs, the output will be the current SNR. + */ +extern int qcsapi_wifi_get_snr_per_association( + const char *ifname, + const qcsapi_unsigned_int association_index, + int *p_snr +); + +/** + * @brief Get the associated device time per association index. + * + * Returns the time in seconds a STA has been associated with an AP. + * This API can be applied to both station and AP mode. + * + * \param ifname \wifi0 + * \param association_index On the AP this is the association index of the STA to be read. On the STA, this should be 0. + * \param time_associated return parameter to contain the time associated on this association index. + * + * \return 0 if the call succeeded. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi get_time_associated \ 0 + * + * The output will be the time in seconds that the STA has been associated with an AP. + * + * For the AP, the final parameter is + * + * call_qcsapi get_time_associated \ \ + * + * The output will be the time in seconds that the STA at association index has been associated with an AP. + */ +extern int qcsapi_wifi_get_time_associated_per_association(const char *ifname, + const qcsapi_unsigned_int association_index, + qcsapi_unsigned_int *time_associated ); +/** + * @brief Get a Parameter for a Node + * + * Returns the value of the selected parameter for the selected node. + * + * \param ifname \wifi0 + * \param node_index selects the node to report. + * \param param_type the parameter type. See the definition of the enun qcsapi_per_assoc_param. + * \param local_remote_flag use local flag to get local parameters, use remote flag to get parameters from remote associated STA; set to QCSAPI_LOCAL_NODE or QCSAPI_REMOTE_NODE + * \param input_param_str address to related request parameters, actual request structure information please refer to qcsapi_measure_request_param + * \param report_result address to receive all kinds of results + * + * \return 0 if the call succeeded. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi get_node_param \ \ \ \ \ + * + * where parameter name is one of link_quality, tx_phy_rate, + * rx_phy_rate, rssi_dbm, snr, rssi, hw_noise, + * soc_macaddr, bw, basic, cca, rpi, chan_load, + * noise_histogram, beacon + * + * The output will be the value for the selected parameter. RSSI_DBM will be in dBm; SNR and RSSI will be in dB. + */ +extern int qcsapi_wifi_get_node_param( + const char *ifname, + const uint32_t node_index, + qcsapi_per_assoc_param param_type, + int local_remote_flag, + string_128 input_param_str, + qcsapi_measure_report_result *report_result); +/** + * @brief Get a Counter for a Node + * + * Returns the value of the selected counter for the selected node. + * + * \param ifname \wifi0 + * \param node_index selects the node to report. + * \param counter_type the counter to select. See the definition of the enun qcsapi_counter_type. + * \param local_remote_flag use local flag to get local counters, use remote flag to get counters from remote associated STA; set to QCSAPI_LOCAL_NODE or QCSAPI_REMOTE_NODE + * \param p_value address to receive the value of the parameter. It must address a 64-bit quantity. + * + * \note Not all per-node counters are 64 bits wide. Some will roll over when the maximum 32-bit value is reached. + * + * \return 0 if the call succeeded. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi get_node_counter \ \ \ \ + * + * where counter name is as defined in the section on the Get Counter API. + * + * The output will be the value for the selected counter. + */ +extern int qcsapi_wifi_get_node_counter( + const char *ifname, + const uint32_t node_index, + qcsapi_counter_type counter_type, + int local_remote_flag, + uint64_t *p_value); +/** + * @brief Get the Statistics (data structure of counters) for a Node + * + * Returns a data structure populated with statistics (counters) for a node. + * + * \param ifname \wifi0 + * \param node_index selects the node to report. + * \param local_remote_flag use local flag to get local statistics, use remote flag to get statistics from remote associated STA; set to QCSAPI_LOCAL_NODE or QCSAPI_REMOTE_NODE + * \param p_stats address of a struct qcsapi_node_stats + * + * \note See the definition of the Node Stats data struct for details on what + * counters this API will return. + * + * \return 0 if the call succeeded. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi get_node_stats \ \ \ + * + * The output will be the contents of the Node Stats data struct, one value per line. + * The name of the field is also displayed. + */ +extern int qcsapi_wifi_get_node_stats( + const char *ifname, + const uint32_t node_index, + int local_remote_flag, + struct qcsapi_node_stats *p_stats); + +/** + * @brief Get the Maximum Number of Packets That Were Queued for the Selected Node + * + * Returns the maxiumum number of packets that were queued for the selected node. + * + * \param ifname \wifi0 + * \param node_index selects the node to report. + * \param local_remote_flag use local flag to get local max queued packets, use remote flag to get max queues packets from remote associated STA; set to QCSAPI_LOCAL_NODE or QCSAPI_REMOTE_NODE + * \param reset_flag whether to reset the statistic on read. "1" to reset and "0" not to reset. + * \param max_queued address of a 32-bit unsigned integer to receive the value + * + * \callqcsapi + * + * call_qcsapi get_max_queued \ \ \ \ + * + * The output will be the maximum number of packets that were queued for the selected + * node index. + */ +extern int qcsapi_wifi_get_max_queued( + const char *ifname, + const uint32_t node_index, + int local_remote_flag, + int reset_flag, + uint32_t *max_queued); + +/** + * @brief Get HW Noise per association index. + * + * Returns the current HW noise. + * + * \param ifname \wifi0 + * \param association_index On the AP this is the association index of the STA RSSID is to be read. On the STA, this should be 0. + * \param p_hw_noise return parameter to contain the hw_noise on this association index. + * + * \return 0 if the call succeeded. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi get_hw_noise \ \ + * + * The output will be the current HW noise for the association in the range. + */ +extern int qcsapi_wifi_get_hw_noise_per_association( + const char *ifname, + const qcsapi_unsigned_int association_index, + int *p_hw_noise); + +/** + * @brief Get a MLME statistics record. + * + * This API returns the mlme statistics record for specified mac address. + * + * \param client_mac_addr the mac addr of the client. 00:00:00:00:00:00 should be used + * to get mlme stats for clients who were not associated with an AP. + * \param stats address of a struct qcsapi_mlme_stats + * + * \return 0 if the stats record for required mac address exists. + * \return -qcsapi_mlme_stats_not_supported if statistics facility is not suported. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi get_mlme_stats_per_mac \ + * + * Unless an error occurs, the output will be the mlme statistics for specified mac. + */ +extern int qcsapi_wifi_get_mlme_stats_per_mac(const qcsapi_mac_addr client_mac_addr, qcsapi_mlme_stats *stats); + +/** + * @brief Get a MLME statistics record. + * + * This API returns the mlme statistics record for specified association index. + * + * \param ifname the interface to perform the action on. + * \param association_index the association index to get mlme statistics about + * \param stats address of a struct qcsapi_mlme_stats + * + * \note This API is only available on AP mode interface. + * + * \return 0 if the stats record for required association index address exists. + * \return -qcsapi_mlme_stats_not_supported if statistics facility is not suported. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi get_mlme_stats_per_association \ \ + * + * Unless an error occurs, the output will be the mlme statistics for specified association index. + */ +extern int qcsapi_wifi_get_mlme_stats_per_association(const char *ifname, const qcsapi_unsigned_int association_index, qcsapi_mlme_stats *stats); + +/** + * @brief Get a list of macs addresses. + * + * This API returns the list of macs currently existing in mlme statistic factory. + * + * \param macs_list address of a struct qcsapi_mlme_stats_macs + * + * \return 0 if the list obtained successfully. + * \return -qcsapi_mlme_stats_not_supported if statistics facility is not suported. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi get_mlme_stats_macs_list + * + * Unless an error occurs, the output will be the list of the mac addresses existing in mlme statistics table. + */ +extern int qcsapi_wifi_get_mlme_stats_macs_list(qcsapi_mlme_stats_macs *macs_list); +/**@}*/ + + +/**@addtogroup RegulatoryAPIs + *@{*/ + +/*Transmit power by regulatory authority*/ +/** + * \brief Get the list of WiFi regulatory regions. + * + * Use this API to get a list of the regulatory regions supported by the current firmware. + * String will contain a list of regions, each separated by a comma. + * + * \param list_regulatory_regions the string where the results are returned. + * + * \return -EFAULT on error, or 0. + * + * \callqcsapi + * + * call_qcsapi get_list_regulatory_regions \ + * + * The output will be the list of regulatory regions that the firmware supports. + * Some listed regions may be synonyms, e.g. "Europe" and "eu" are synonyms as are "USA" and "us". + */ +extern int qcsapi_wifi_get_list_regulatory_regions( string_256 list_regulatory_regions ); + +/*Transmit power by regulatory authority*/ +/** + * \brief Get the list of WiFi regulatory regions from regulatory database. + * + * Use this API to get a list of the regulatory regions supported by the current firmware. + * String will contain a list of regions, each separated by a comma. + * + * \param list_regulatory_regions the string where the results are returned. + * + * \return -EFAULT on error, or 0. + * + * \callqcsapi + * + * call_qcsapi get_list_regulatory_regions \ + * + * The output will be the list of regulatory regions that the firmware supports. + * Some listed regions may be synonyms, e.g. "Europe" and "eu" are synonyms as are "USA" and "us". + */ +extern int qcsapi_regulatory_get_list_regulatory_regions( string_256 list_regulatory_regions ); + +/** + * \brief Get the List of Regulatory Channels. + * + * Use this API to get the list of channels authorized for use in the indicated regulatory region. + * Bandwidth parameter should be either 20 or 40. Valid channels are returned + * in the list_of_channels parameter as a list of numeric values separated by commas. + * This API is provided as a reference and a convenience; its use is not required to insure regulatory compliance. + * + * \param region_by_name the regulatory region for which the channel list is expected. + * \param bw the bandwidth that is currently used. 40Mhz or 20Mhz. + * \param list_of_channels the list of channels returned. + * + * \return -EFAULT, -EINVAL, -EOPNOTSUPP or other negative values on + * error, or 0 on success. + * + * \callqcsapi + * + * call_qcsapi get_regulatory_channels \ \<20 | 40> + * + * call_qcsapi get_list_regulatory_channels \ \<20 | 40> + * + * where \ should be one of the regions listed in by the get list + * regulatory regions API / command. Final parameter is the bandwidth and is optional. + * If not present, the system will use the current configured bandwidth, defaulting to 40 if that cannot be established. + * Output is the list of channels valid for that region separated by commas. + * + * Example:
+ * call_qcsapi get_list_regulatory_channels eu + */ +extern int qcsapi_wifi_get_list_regulatory_channels(const char *region_by_name, + const qcsapi_unsigned_int bw, + string_1024 list_of_channels); +/** + * \brief Get the List of Regulatory Channels from regulatory database. + * + * Use this API to get the list of channels authorized for use in the indicated regulatory region. + * Bandwidth parameter should be 20, 40 or 80. Valid channels are returned + * in the list_of_channels parameter as a list of numeric values separated by commas. + * This API is provided as a reference and a convenience; its use is not required to insure regulatory compliance. + * + * \param region_by_name the regulatory region for which the channel list is expected. + * \param bw the bandwidth that is currently used. 80MHz, 40Mhz or 20Mhz. + * \param list_of_channels the list of channels returned. + * + * \return -EFAULT, -EINVAL, -EOPNOTSUPP or other negative values on + * error, or 0 on success. + * + * \callqcsapi + * + * call_qcsapi get_regulatory_channels \ \<20 | 40 | 80> + * + * call_qcsapi get_list_regulatory_channels \ \<20 | 40 | 80> + * + * where \ should be one of the regions listed in by the get list + * regulatory regions API / command. Final parameter is the bandwidth and is optional. + * If not present, the system will use the current configured bandwidth, defaulting to 80 if that cannot be established. + * Output is the list of channels valid for that region separated by commas. + * + * Example:
+ * call_qcsapi get_list_regulatory_channels eu + */ +extern int qcsapi_regulatory_get_list_regulatory_channels(const char *region_by_name, + const qcsapi_unsigned_int bw, + string_1024 list_of_channels); + +/** + * \brief Get the List of Regulatory bands from regulatory database. + * + * Use this API to get the list of band authorized for use in the indicated regulatory region. + * Valid channels are returned in the list_of_bands parameter as a list of numeric values separated by commas. + * This API is provided as a reference and a convenience; its use is not required to insure regulatory compliance. + * + * \param region_by_name the regulatory region for which the channel list is expected. + * \param list_of_bands the list of bands returned. + * + * \return -EFAULT, -EINVAL, -EOPNOTSUPP or other negative values on + * error, or 0 on success. + * + * \callqcsapi + * + * call_qcsapi get_list_regulatory_bands \ + * + * where \ should be one of the regions listed in by the get list + * regulatory regions API / command. + * Output is the list of bands valid for that region separated by commas. + * + * Example:
+ * call_qcsapi get_list_regulatory_bands eu + */ +extern int qcsapi_regulatory_get_list_regulatory_bands(const char *region_by_name, string_128 list_of_bands); + +/** + * \brief Get the Regulatory Transmit Power. + * + * This API call gets the transmit power in a regulatory region for a particular + * channel. + * + * \param ifname \wifi0 + * \param the_channel the channel for which the tx power is returned. + * \param region_by_name the regulatory region for which the tx power is returned. + * \param p_tx_power the result which contains the transmit power. + * + * \return -EFAULT, -EOPNOTSUPP or other negative values on error, or 0 on success. + * + * \callqcsapi + * + * call_qcsapi get_regulatory_tx_power \ \ \ + * + * Unless an error occurs, the output will be the channel number. + * eg. 20
+ * Examples:
+ * A valid call: + * @code + * quantenna # call_qcsapi get_regulatory_tx_power wifi0 100 eu + * 22 + * @endcode + * An invalid call: + * @code + * quantenna # call_qcsapi get_regulatory_tx_power wifi0 188 eu + * QCS API error 22: Invalid argument + * @endcode + */ +extern int qcsapi_wifi_get_regulatory_tx_power(const char *ifname, + const qcsapi_unsigned_int the_channel, + const char *region_by_name, + int *p_tx_power); + +/** + * \brief Get the Regulatory Transmit Power from regulatory database. + * + * This API call gets the transmit power in a regulatory region for a particular + * channel. + * + * \param ifname \wifi0 + * \param the_channel the channel for which the tx power is returned. + * \param region_by_name the regulatory region for which the tx power is returned. + * \param p_tx_power the result which contains the transmit power. + * + * \return -EFAULT, -EOPNOTSUPP or other negative values on error, or 0 on success. + * + * \callqcsapi + * + * call_qcsapi get_regulatory_tx_power \ \ \ + * + * Unless an error occurs, the output will be the channel number. + * eg. 20
+ * Examples:
+ * A valid call: + * @code + * quantenna # call_qcsapi get_regulatory_tx_power wifi0 100 eu + * 22 + * @endcode + * An invalid call: + * @code + * quantenna # call_qcsapi get_regulatory_tx_power wifi0 188 eu + * QCS API error 22: Invalid argument + * @endcode + */ +extern int qcsapi_regulatory_get_regulatory_tx_power(const char *ifname, + const qcsapi_unsigned_int the_channel, + const char *region_by_name, + int *p_tx_power); + +/** + * \brief Get WiFi Configured TX power. + * + * This API call gets the configured transmit power in a regulatory region + * for a particular channel. + * + * \param ifname \wifi0 + * \param the_channel the channel for which the tx power is returned. + * \param region_by_name the regulatory region for which the tx power is returned. + * \param bw the bandwidth that is currently used. 40Mhz or 20Mhz. + * \param p_tx_power the result which contains the transmit power. + * + * \return -EFAULT, -EOPNOTSUPP or other negative values on error, or 0 on success. + * + * \callqcsapi + * + * call_qcsapi get_configured_tx_power \ <channel> <region> + * + * Unless an error occurs, the output will be the channel number. + * Examples:
+ * @code + * quantenna # call_qcsapi get_configured_tx_power wifi0 100 eu 40 + * 19 + * quantenna # call_qcsapi get_configured_tx_power wifi0 100 eu 20 + * 19 + * quantenna # call_qcsapi get_configured_tx_power wifi0 64 eu 40 + * 15 + * quantenna # call_qcsapi get_configured_tx_power wifi0 64 eu 20 + * 15 + * quantenna # call_qcsapi get_configured_tx_power wifi0 188 eu 20 + * QCSAPI error 22: Invalid argument + * @endcode + * Note: Numeric TX power results are just examples. Actual TX Power values may differ from what is shown above. + */ +extern int qcsapi_wifi_get_configured_tx_power(const char *ifname, + const qcsapi_unsigned_int the_channel, + const char *region_by_name, + const qcsapi_unsigned_int bw, + int *p_tx_power); +/** + * \brief Get WiFi Configured TX power from regulatory database. + * + * This API call gets the configured transmit power in a regulatory region + * for a particular channel, for one spatial stream and beamforming off. + * Please use qcsapi_regulatory_get_configured_tx_power_ext() to obtain + * maximum allowed TX power taking into consideration beamforming and number of spatial streams. + * + * \param ifname \wifi0 + * \param the_channel the channel for which the tx power is returned. + * \param region_by_name the regulatory region for which the tx power is returned. + * \param bw the bandwidth that is currently used. 80Mhz, 40Mhz or 20Mhz. + * \param p_tx_power the result which contains the transmit power. + * + * \return -EFAULT, -EOPNOTSUPP or other negative values on error, or 0 on success. + * + * \callqcsapi + * + * call_qcsapi get_configured_tx_power \ \ \ \ + * + * Unless an error occurs, the output will be the channel number. + * Examples:
+ * @code + * quantenna # call_qcsapi get_configured_tx_power wifi0 100 eu 40 + * 19 + * quantenna # call_qcsapi get_configured_tx_power wifi0 100 eu 20 + * 19 + * quantenna # call_qcsapi get_configured_tx_power wifi0 64 eu 40 + * 15 + * quantenna # call_qcsapi get_configured_tx_power wifi0 64 eu 20 + * 15 + * quantenna # call_qcsapi get_configured_tx_power wifi0 188 eu 20 + * QCSAPI error 22: Invalid argument + * @endcode + * \note: This API is deprecated and replaced with qcsapi_regulatory_get_configured_tx_power_ext. + */ +extern int qcsapi_regulatory_get_configured_tx_power(const char *ifname, + const qcsapi_unsigned_int the_channel, + const char *region_by_name, + const qcsapi_unsigned_int bw, + int *p_tx_power); + +/** + * \brief Get WiFi Configured TX power from regulatory database. + * + * This API call gets the configured transmit power in a regulatory region + * for a particular channel and number of spatial streams. + * + * \param ifname \wifi0 + * \param the_channel the channel for which the tx power is returned. + * \param region_by_name the regulatory region. + * \param the_bw the bandwidth that is currently used. 80Mhz, 40Mhz or 20Mhz. + * \param bf_on beamforming is either on or off. 1 for beamforming on and 0 for beamforming off. + * \param number_ss the number of spatial streams. + * \param p_tx_power the result which contains the transmit power. + * + * \return -EFAULT or other negative values on error, or 0 on success. + * + * \callqcsapi + * + * call_qcsapi get_configured_tx_power \ \ \ \ \ \ + * + * Unless an error occurs, the output will be the channel number. + * Examples:
+ * @code + * quantenna # call_qcsapi get_configured_tx_power wifi0 100 us 80 1 4 + * 15 + * quantenna # call_qcsapi get_configured_tx_power wifi0 100 us 20 0 2 + * 17 + * @endcode + * Note: Numeric TX power results are just examples. Actual TX Power values may differ from what is shown above. + */ +extern int qcsapi_regulatory_get_configured_tx_power_ext(const char *ifname, + const qcsapi_unsigned_int the_channel, + const char *region_by_name, + const qcsapi_bw the_bw, + const qcsapi_unsigned_int bf_on, + const qcsapi_unsigned_int number_ss, + int *p_tx_power); + +/** + * \brief Set the Regulatory Region. + * + * This API call sets the regulatory region on a given interface. + * + * \param ifname \wifi0 + * \param region_by_name the regulatory region. + * + * \return -EFAULT, -EOPNOTSUPP or other negative values on error, or 0 on success. + * + * \callqcsapi + * + * call_qcsapi set_regulatory_region \ \ + * + * Unless an error occurs, the output will be the string complete. + */ +extern int qcsapi_wifi_set_regulatory_region(const char *ifname, + const char *region_by_name); +/** + * \brief Set the Regulatory Region supported by regulatory database. + * + * This API call sets the regulatory region on a given interface. + * + * \param ifname \wifi0 + * \param region_by_name the regulatory region. + * + * \return -EFAULT, -EOPNOTSUPP or other negative values on error, or 0 on success. + * + * \callqcsapi + * + * call_qcsapi set_regulatory_region \ \ + * + * Unless an error occurs, the output will be the string complete. + */ +extern int qcsapi_regulatory_set_regulatory_region(const char *ifname, + const char *region_by_name); +/** + * \brief restore TX power by regulatory database + * + * This API call restore TX power by regulatory database + * + * \param ifname \wifi0 + * + * \return -EFAULT, -EOPNOTSUPP or other negative values on error, or 0 on success. + * + * \callqcsapi + * + * call_qcsapi restore_regulatory_tx_power \ + * + * Unless an error occurs, the output will be the string complete. + */ +extern int qcsapi_regulatory_restore_regulatory_tx_power(const char *ifname); + +/** + * \brief Get the current Regulatory Region. + * + * This API call gets the current regulatory region on a given interface. + * + * \param ifname \wifi0 + * \param region_by_name the regulatory region that is currently configured. + * + * \return -EFAULT or other negative values on error, or 0 on success. + * + * \callqcsapi + * + * call_qcsapi get_regulatory_region \ + * + * Unless an error occurs, the output will be the '<region>'. + */ +extern int qcsapi_wifi_get_regulatory_region(const char *ifname, + char *region_by_name); + +/** + * \brief Overwrite country code, mainly set speicfic country string + * in country IE when EU region is used. + * + * This API call sets secific country code for EU region on a given interface. + * + * \param ifname \wifi0 + * \param curr_country_name the current country name. + * \param new_country_name the specific country name. + * + * \return -EFAULT, -EOPNOTSUPP or other negative values on error, or 0 on success. + * + * \callqcsapi + * + * call_qcsapi overwrite_country_code \ \ \ + * + * Unless an error occurs, the output will be the string complete. + */ +extern int qcsapi_regulatory_overwrite_country_code(const char *ifname, + const char *curr_country_name, const char *new_country_name); +/** + * \brief Set WiFi Regulatory Channel. + * + * This API call sets the transmit power adjusting the offset on a given channel + * on a given region(should be current region) for the passed in interface. + * + * \param ifname \wifi0 + * \param the_channel the channel for which the tx power is returned. + * \param region_by_name the regulatory region for which the tx power is modified + * \param tx_power_offset the offset in integer from the currently configured tx power. + * + * \return -EOPNOTSUPP or other negative values on error, or 0 on success. + * + * \callqcsapi + * + * call_qcsapi set_regulatory_channel \ \ \ \ + * + * Unless an error occurs, the output will be the string complete. + */ +extern int qcsapi_wifi_set_regulatory_channel(const char *ifname, + const qcsapi_unsigned_int the_channel, + const char *region_by_name, + const qcsapi_unsigned_int tx_power_offset); + +/** + * \brief Set WiFi Regulatory Channel supported by regulatory database. + * + * This API call sets the transmit power adjusting the offset on a given channel + * on a given region(should be current region) for the passed in interface. + * + * \param ifname \wifi0 + * \param the_channel the channel for which the tx power is returned. + * \param region_by_name the regulatory region for which the tx power is modified + * \param tx_power_offset the offset in integer from the currently configured tx power. + * + * \return -EOPNOTSUPP or other negative values on error, or 0 on success. + * + * \callqcsapi + * + * call_qcsapi set_regulatory_channel \ \ \ \ + * + * Unless an error occurs, the output will be the string complete. + */ +extern int qcsapi_regulatory_set_regulatory_channel(const char *ifname, + const qcsapi_unsigned_int the_channel, + const char *region_by_name, + const qcsapi_unsigned_int tx_power_offset); + +/** + * \brief Get regulatory database version number from regulatory database. + * + * This API call gets the regulatory database version number + * + * \param p_version pointer to save version number + * \param index - which version number will be retrieved + * + * \return -EOPNOTSUPP or other negative values on error, or 0 on success. + * + * \callqcsapi + * + * call_qcsapi get_regulatory_db_version [index] + * + * Unless an error occurs, the output will be the version number. + */ +extern int qcsapi_regulatory_get_db_version(int *p_version, const int index); + +/** + * \brief set if tx power is capped by regulatory database. + * + * This API call set TX power capped by regulatory database + * + * \param capped - zero for no capped by databse, non-zero for capped by database + * + * \return -EOPNOTSUPP or other negative values on error, or 0 on success. + * + * \callqcsapi + * + * call_qcsapi apply_regulatory_cap <0|1> + * + * Unless an error occurs, the output will be the string complete. + */ +extern int qcsapi_regulatory_apply_tx_power_cap(int capped); +/**@}*/ + + +/* + * DFS + */ +/**@addtogroup DFSAPIs + *@{*/ + +/** + * @brief Get the list of DFS channels + * + * Use this API to get a list of all channels that require following the DFS protocols, + * or alternately a list of channels that do not require the DFS protocols. + * + * \param region_by_name the region to return. Has the same interpretation as with the regulatory authority APIs. + * \param DFS_flag set to 1 to get a list of DFS affected channels, set to 0 to get the complement list of channels. + * \param bw the bandwidth in use - either 20 or 40 to represent 20MHz and 40MHz respectively. + * \param list_of_channels return parameter to contain the comma delimited list of channels. + * + * \return 0 if the call succeeded. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi get_list_DFS_channels \ \<1 | 0\> \<20 | 40\> + * + * where \ should be one of the regions listed in by the get list regulatory + * regions API/command. + * + * Choices for the other two parameters are as shown above. + * + * Unless an error occurs, the output will be a list of channels, each value separated by a comma. + * + * Examples: + * + * To get the list of 40 MHz channels that require following the DFS protocols for Europe, enter: + * + * call_qcsapi get_list_DFS_channels eu 1 40 + * + * To get the list of 20 MHz channels that do not require DFS protocols for the US, enter: + * + * call_qcsapi get_list_DFS_channels us 0 20 + */ +extern int qcsapi_wifi_get_list_DFS_channels(const char *region_by_name, + const int DFS_flag, + const qcsapi_unsigned_int bw, + string_1024 list_of_channels); + +/** + * @brief Get the list of DFS channels + * + * Use this API to get a list of all channels that require following the DFS protocols, + * or alternately a list of channels that do not require the DFS protocols. + * + * \param region_by_name the region to return. Has the same interpretation as with the regulatory authority APIs. + * \param DFS_flag set to 1 to get a list of DFS affected channels, set to 0 to get the complement list of channels. + * \param bw the bandwidth in use - either 20 or 40 to represent 20MHz and 40MHz respectively. + * \param list_of_channels return parameter to contain the comma delimited list of channels. + * + * \return 0 if the call succeeded. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi get_list_DFS_channels \ \<1 | 0\> \<20 | 40 | 80\> + * + * where \ should be one of the regions listed in by the get list regulatory + * regions API/command. + * + * Choices for the other two parameters are as shown above. + * + * Unless an error occurs, the output will be a list of channels, each value separated by a comma. + * + * Examples: + * + * To get the list of 80 MHz channels that require following the DFS protocols for Europe, enter: + * + * call_qcsapi get_list_DFS_channels eu 1 80 + * + * To get the list of 40 MHz channels that require following the DFS protocols for Europe, enter: + * + * call_qcsapi get_list_DFS_channels eu 1 40 + * + * To get the list of 20 MHz channels that do not require DFS protocols for the US, enter: + * + * call_qcsapi get_list_DFS_channels us 0 20 + */ +extern int qcsapi_regulatory_get_list_DFS_channels(const char *region_by_name, + const int DFS_flag, + const qcsapi_unsigned_int bw, + string_1024 list_of_channels); + +/** + * @brief Is the given channel a DFS channel. + * + * Use this API to determine whether a particular channel is subject to the DFS protocols. + * + * \param region_by_name the region to return. Has the same interpretation as with the regulatory authority APIs. + * \param the_channel unsigned integer from 0 to 255. The channel must be valid for the referenced regulatory region. + * \param p_channel_is_DFS return value which is set to 1 if the channel is affected by DFS, set to 0 otherwise. + * + * \return 0 if the call succeeded. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi is_channel_DFS \ \ + * + * where <regulatory region> should be one of the regions listed in by the get list regulatory + * regions API / command and <channel> is an unsigned integer. + * + * Unless an error occurs, the output will be either 0 or 1 depending on + * whether DFS protocols are required for the referenced channel. + */ +extern int qcsapi_wifi_is_channel_DFS(const char *region_by_name, + const qcsapi_unsigned_int the_channel, + int *p_channel_is_DFS); + +/** + * @brief Is the given channel a DFS channel. + * + * Use this API to determine whether a particular channel is subject to the DFS protocols. + * + * \param region_by_name the region to return. Has the same interpretation as with the regulatory authority APIs. + * \param the_channel unsigned integer from 0 to 255. The channel must be valid for the referenced regulatory region. + * \param p_channel_is_DFS return value which is set to 1 if the channel is affected by DFS, set to 0 otherwise. + * + * \return 0 if the call succeeded. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi is_channel_DFS \ \ + * + * where <regulatory region> should be one of the regions listed in by the get list regulatory + * regions API / command and <channel> is an unsigned integer. + * + * Unless an error occurs, the output will be either 0 or 1 depending on + * whether DFS protocols are required for the referenced channel. + */ +extern int qcsapi_regulatory_is_channel_DFS(const char *region_by_name, + const qcsapi_unsigned_int the_channel, + int *p_channel_is_DFS); +/** + * @brief Get previous and current channels from the most recent DFS channel change event + * + * This API returns the channel switched from and to as a result of the most recent DFS channel change event. + * + * \param ifname \wifi0 + * \param p_prev_channel result memory pointer for the channel switched from + * \param p_cur_channel result memory pointer for the channel switched to + * + * \return 0 if the call succeeded. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi get_dfs_cce_channels \ + * + * The output will be the previous channel number then the current channel number, unless an error occurs. If no DFS channel change has occurred, both numbers will be zero. + */ +extern int qcsapi_wifi_get_dfs_cce_channels(const char *ifname, + qcsapi_unsigned_int *p_prev_channel, + qcsapi_unsigned_int *p_cur_channel); + +/** + * \brief Get the alternative DFS channel to be used in case of radar + * detection. + * + * This API call is used to get the alternative DFS channel that will be + * switched over to in case radar is detected in the current channel. + * This is known as a 'fast switch', to allow quickly changing to another + * high power channel without having to do slow scans through all the + * channels. + * + * \note This API can only be called on an AP device. + * + * \param ifname \wifi0 + * \param p_dfs_alt_chan return parameter for the alternative DFS channel. + * + * \return >= 0 on success, < 0 on error. On success, p_dfs_alt_chan will + * contain the configured alternate DFS channel. + * + * \callqcsapi + * + * call_qcsapi get_DFS_alt_channel \ + * + * Unless an error occurs, the output will be the string containing the + * DFS alternative channel (0 if no alternative channel is specified). + * + * \sa qcsapi_wifi_set_DFS_alt_channel + */ +extern int qcsapi_wifi_get_DFS_alt_channel( const char *ifname, qcsapi_unsigned_int *p_dfs_alt_chan ); + +/** + * \brief Set the alternative DFS channel to be used in case of radar + * detection. + ** + * This API call is used to set the alternative DFS channel that will be + * switched over to in case radar is detected in the current channel. + * This is known as a 'fast switch', to allow quickly changing to another + * high power channel without having to do slow scans through all the + * channels. + * + * \param ifname \wifi0 + * \param dfs_alt_chan the alternative DFS channel to set. + * + * \return 0 if the call succeeded. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi set_DFS_alt_channel \ <alternative channel> + * + * Unless an error occurs, the output will be the string complete. + * + * Error can occur if the alternative channel being set is the same as the + * current channel on the device. + * + * \sa qcsapi_wifi_get_DFS_alt_channel + */ +extern int qcsapi_wifi_set_DFS_alt_channel( const char *ifname, const qcsapi_unsigned_int dfs_alt_chan ); + +/** + * \brief Start a channel scan and select a best DFS channel for usage. + * + * This API is used to trigger a channel scan and once the scan is done, the AP will switch to a + * DFS channel based on channel ranking algorithm. + * + * \param ifname \wifi0 + * + * \callqcsapi + * + * call_qcsapi start_dfsreentry \ + * Unless an error occurs, the output will be the string complete. + * + * Error can occur if all DFS channels have been in non-occupy list. + */ +extern int qcsapi_wifi_start_dfs_reentry(const char *ifname); + +/** + * \brief Start a channel scan and select channel based on given rules. + * + * This API provides a way to scan channel and select channel by different rules.
+ * The value of scan_flag specifies the parameters for this API, including the control + * flags for scanning activity, the channel set which is used for channel selection, and the + * algorithm which is used to pick the channel. + * + * Flags used as channel set are defined as below and they are mutually-exclusive:
+ * @code + * IEEE80211_PICK_ALL 0x0001 + * IEEE80211_PICK_DFS 0x0002 + * IEEE80211_PICK_NONDFS 0x0004 + * @endcode + * + * Flags used as the control flags for scanning activity as below, the flags which + * have string "BG" are mutually-exclusive:
+ * @code + * IEEE80211_PICK_SCAN_FLUSH 0x0008 + * IEEE80211_PICK_BG_ACTIVE 0x0010 + * IEEE80211_PICK_BG_PASSIVE_FAST 0x0020 + * IEEE80211_PICK_BG_PASSIVE_NORMAL 0x0040 + * IEEE80211_PICK_BG_PASSIVE_SLOW 0x0080 + * @endcode + * + * Flags used as algorithm are defined as below and they are mutually-exclusive:
+ * @code + * IEEE80211_PICK_CLEAREST 0x0100 + * IEEE80211_PICK_REENTRY 0x0200 + * IEEE80211_PICK_NOPICK 0x0400 + * IEEE80211_PICK_NOPICK_BG 0x0800 + * @endcode + * + * scan_flag may be any combination of channel set and algorithm. + * The header file net80211/ieee80211_dfs_reentry.h including this macros comes with the package libqcsapi_client_src.zip. + * + * \callqcsapi + * + * call_qcsapi start_scan wifi0 \ \ \
+ * Where \ should be "reentry", "clearest", "no_pick" or "background". "reentry" means it will start dfs-reentry function. "clearest" means it will pick the clearest channel. + * "no_pick" means it will only perform channel scan. "background" means scan channel in the background and no_pick. + * + * Where \ should be "dfs", "non_dfs" or "all". This parameter indicates that what kind of channel to be selected. + * With using "dfs", It will pick channel from available dfs channels. With using "non-dfs", it will pick channel from available non-dfs channels. + * And "all" is default which means it will pick channel from all available channels. + * + * Where \ should be "flush", and/or "active", "fast", "normal" and "slow". + * Theses parameter indicates the required behaviors for scanning activity. + * If "flush" is set, the previous scanning result will be flushed at first before the new channel scanning. + * "active", "fast", "normal" and "slow" work for "background" algorithm only, and only one of them can be set. + * "active" mean the active scanning on DFS channel, and others mean the passive scanning on DFS channels. + * "fast" means the fast passive scanning, "slow" means the slow passive scanning, and "normal" is between of them. + * + * \callqcsapi + * + * call_qcsapi start_scan wifi0 reentry dfs + */ +extern int qcsapi_wifi_start_scan_ext(const char *ifname, const int scan_flag); + +/** + * \brief Get channel switch history records + * + * This API reports back the channel change history up to a maximum of 32 records. This API can also reset the + * records. As a get function, it needs struct qcsapi_csw_record as a buffer to receive return data. + * + * \param ifname \wifi0 + * \param reset indicate whether to reset the records. "1" to reset records, and "0" to get records. + * \param record where to store the records. + * + * \return >=0 on success, <0 on error. + * + * \note This API does not work on a STA. + * + * \callqcsapi + * + * call_qcsapi get_csw_records \
+ * call_qcsapi get_csw_records \ 1 + * + * The output from the first command is the channel change record count, followed by a list of + * channel change records. A channel change record includes time from start-up, channel that was + * selected and a reason for channel change. Reasons are enumerated by \link ieee80211_csw_reason \endlink. + * Mappings to printed strings are defined by the array qcsapi_csw_reason_list. + * + * The output from the second command is the channel change history + * followed by the string "clear records complete". + * + * @code + * #call_qcsapi get_csw_records wifi0 1 + * channel switch history record count : 3 + * time=1234 channel=123 reason=SCS + * time=11 channel=36 reason=CONFIG + * time=7 channel=40 reason=CONFIG + * clear records complete + * @endcode + */ +extern int qcsapi_wifi_get_csw_records( const char *ifname, int reset, qcsapi_csw_record *record); + +/** + * \brief Get channel radar status and history of detected records + * + * This API is used to query the status of a DFS channel; whether it is in non-occupy list, and how many times + * the radar signal has be detected on this channel. This data can be used to analyse the local enviroment for radar usage. + * + * \param ifname \wifi0 + * \param rdstatus when used as input,it contain channel to query, when used as return value, it stores the radar channel status. + * + * \return >=0 on success, <0 on error. + * \note The channel passed in the rdstatus structure must be DFS affected, based on the regulatory region. + * + * \callqcsapi + * + * call_qcsapi get_radar_status \ \
+ * + * Unless an error occurs, the output will show the radar status of DFS-Channel.
+ * Example: + * + * @code + * #call_qcsapi get_radar_status wifi0 100 + * channel 100: + * radar_status=0 + * radar_count=1 + * @endcode + */ +extern int qcsapi_wifi_get_radar_status(const char *ifname, qcsapi_radar_status *rdstatus); + +/** + * @brief Get CAC status. + * + * This API is used to get CAC status on AP. Application can use this API to poll CAC status + * and ensure CAC process is completed. + * + * \param ifname \wifi0 + * \param cacstatus return the currently CAC status, 1 for CAC is running and 0 for no CAC is running. + * + * \return 0 if the command succeeded. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi get_cacstatus \ + * + * Unless an error occurs, the output will be the 1 or 0. + */ +extern int qcsapi_wifi_get_cac_status(const char *ifname, int *cacstatus); +/**@}*/ + +/* Reporting the results of an AP scan */ +/**@addtogroup ScanAPIs + *@{*/ + +/** + * @brief Get the results of an AP scan. + * + * This API gets the results of the most recent AP scan and caches them in memory for future reference. + * + * \param ifname \wifi0 + * \param p_count_APs return parameter to contain the count of the number of AP scan results. + * + * \return 0 if the call succeeded. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi get_results_AP_scan \ + * + * Unless an error occurs, the output will be the number of APs found in the last scan. + */ +extern int qcsapi_wifi_get_results_AP_scan( const char *ifname, qcsapi_unsigned_int *p_count_APs ); + +/** + * \brief Get a count of the number of APs scanned. + * + * This API call is used to get the count of APs that have been scanned in the + * most recent channel scan. + * + * \param ifname \wifi0 + * \param p_count_APs return parameter to contain the count of APs that have + * been scanned in the most recent scan. + * + * \return >= 0 on success, < 0 on error. If success, p_count_APs contains a + * count of the number of APs scanned in the previous scan. + * + * \callqcsapi + * + * call_qcsapi get_count_APs_scanned \ + * + * Unless an error occurs, the output will be the number of APs that were + * scanned in the previous channel scan. + */ +extern int qcsapi_wifi_get_count_APs_scanned( const char *ifname, qcsapi_unsigned_int *p_count_APs ); + +/** + * @brief Get AP properties per scan result. + * + * This API reports on the properties of an AP, with the AP indentified by index. + * The index is numbered starting at 0. + * + * If the cache of AP scan results is not present, this API will call the Get Results AP Scan to update the cache. + * + * \param ifname \wifi0 + * \param index_AP the index to get the result from. + * \param p_ap_properties return parameter for storing the AP scan properties. + * + * \return 0 if the call succeeded. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi get_properties_AP \ \ + * + * Unless an error occurs, the output will be the properties of the referenced AP, + * in the order of SSID, MAC address, WiFi channel, RSSI, flags, protocol, + * authentication mode, encryption mode, Qhop and WPS flags. + * The SSID is enclosed in quotes since it can have embedded blanks. + * + * WPS flags: bit 0 - WPS supported + * bit 1 - WPS registrar + * bit 2 - WPS registrar supporting push-button + * bit 3 - WPS push-button active + * + * Example output from call_qcsapi: + * + * @code + * quantenna # call_qcsapi get_properties_AP wifi0 0 + * "FAE-Lab-10" c0:3f:0e:7d:5a:dc 40 25 0 0 0 0 0 1 + * @endcode + * + * This AP has "FAE-Lab-10" as its SSID (the SSID is enclosed in quotes since an + * SSID can have embedded blank characters), MAC address of c0:3f:03:7d:51:dc, + * is broadcasting on WiFi channel 40 (5.2 GHz), with an RSSI of 25. Security is disabled for the AP. + * Qhop is off and WPS is supported. + * + * @code + * quantenna # call_qcsapi get_properties_AP wifi0 2 + * "Quantenna1" 00:26:86:00:11:5f 60 56 1 2 1 2 0 15 + * @endcode + * + * This AP has "Quantenna1" as its SSID, MAC address of 00:26:86:00:11:5f, + * is broadcasting on WiFi channel 60 (5.3 GHz), with an RSSI of 56. + * Security is enabled for this AP. The security protocol is WPA2 (11i); + * the authentication mode is PSK; and the encryption mode is CCMP. Qhop is off, WPS is available and + * WPS push-button is currently active. + * + * @code + * quantenna # call_qcsapi get_properties_AP wifi0 4 + * QCS API error 34: Parameter value out of range + * @endcode + * When the index becomes too large, the call_qcsapi command will fail as shown above. + * In this setup, only 4 APs were found in the scan. Since the index is numbered starting at 0, + * valid index values here are 0, 1, 2 and 3.
+ * + * \note The Get Properties API uses the results it finds in the in-memory cache. + * To ensure the results from the latest AP scan are used, + * an application should always call the Get Results AP Scan API first. + * The example application shows how this should be programmed. + * + * \sa qcsapi_ap_properties + */ +extern int qcsapi_wifi_get_properties_AP( + const char *ifname, + const qcsapi_unsigned_int index_AP, + qcsapi_ap_properties *p_ap_properties +); + + +/** + * \brief Set scan results check interval, unit is second + * + * This API sets the scan results check interval + * + * \note primarywifi + * + * \param ifname \wifi0only + * \param scan_chk_inv interval for scan results availability check + * + * \return A negative values on error, or 0 on success. + * + * \callqcsapi + * + * call_qcsapi set_scan_chk_inv \ \ + * + * Unless an error occurs, the output will be the string complete. + */ +extern int qcsapi_wifi_set_scan_chk_inv(const char *ifname, + int scan_chk_inv); + +/** + * \brief Get scan results check interval, unit is second + * + * This API gets the scan results check interval + * + * \note \primarywifi + * \note This API is available on AP/STA mode. + * + * \param ifname \wifi0only + * \param p pointer to interval for scan results check + * + * \return A negative values on error, or 0 on success. + * + * \callqcsapi + * + * call_qcsapi get_scan_chk_inv \ + * + * Unless an error occurs, the output will be the string complete. + */ +extern int qcsapi_wifi_get_scan_chk_inv(const char *ifname, + int *p); + +/** + * \brief Set the maximum scan buffer size for returned scan results + * + * Configure the maximum buffer size for scan results. If the result list exceeds this size + * it is sorted according to the following rules prior to truncation. + * - matched SSID + * - WPS active + * - WPA/RSN security + * - High RSSI + * + * \staonly + * + * \param ifname \wifi0 + * \param max_buf_size max buffer size vlaue + * + * \return 0 if the command succeeded. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi set_scan_buf_max_size \ \ + * + * Unless an error occurs, the output will be the string complete. + */ +extern int qcsapi_wifi_set_scan_buf_max_size(const char *ifname, const unsigned int max_buf_size); + +/** + * \brief Get the maximum scan buffer size for returned scan results + * + * This API call is used to retrieve the maximum scan buffer size + * + * \staonly + * + * \param ifname \wifi0 + * \param max_buf_size return value to store scan buffer max size + * + * \return >= 0 on success, < 0 on error. + * + * \callqcsapi + * + * call_qcsapi get_scan_buf_max_size \ + * + * Unless an error occurs, the output will be the max scan buffer size. + */ +extern int qcsapi_wifi_get_scan_buf_max_size(const char *ifname, unsigned int *max_buf_size); + +/** + * \brief Set the maximum number of returned scan results + * + * This API call is used to set the maximum number of returned scan results + * If the result list exceeds this number it is sorted according to + * the following rules prior to truncation. + * - matched SSID + * - WPS active + * - WPA/RSN security + * - High RSSI + * + * \param ifname \wifi0 + * \param max_table_len scan table max length + * + * \return 0 if the command succeeded. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi set_scan_table_max_len \ \ + * + * Unless an error occurs, the output will be the string complete. + */ +extern int qcsapi_wifi_set_scan_table_max_len(const char *ifname, const unsigned int max_table_len); + +/** + * \brief Get the maximum number of returned scan results + * + * This API call is used to get the maximum number of returned scan results + * + * \param ifname \wifi0 + * \param max_table_len return value to store scan table max length + * + * \return >= 0 on success, < 0 on error. + * + * \callqcsapi + * + * call_qcsapi get_scan_table_max_len \ + * + * Unless an error occurs, the output will be the scan table max length + */ +extern int qcsapi_wifi_get_scan_table_max_len(const char *ifname, unsigned int *max_table_len); + +/*APIs relating to scanning channels.*/ +/** + * \brief Set dwell times + * + * This API sets minimum and maximum active and passive channel dwell times used when scanning. + * + * \param ifname \wifi0 + * \param max_dwell_time_active_chan Maximum dwell time for active scans + * \param min_dwell_time_active_chan Minimum dwell time for active scans + * \param max_dwell_time_passive_chan Maximum dwell time for passive scans + * \param min_dwell_time_passive_chan Maximum dwell time for passive scans + * + * All units are milliseconds. + * + * \return 0 if the command succeeded. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi set_dwell_times interface max_active min_active max_passive min_passive + * + * Unless an error occurs, the output will be the string complete. + */ +extern int qcsapi_wifi_set_dwell_times( + const char *ifname, + const unsigned int max_dwell_time_active_chan, + const unsigned int min_dwell_time_active_chan, + const unsigned int max_dwell_time_passive_chan, + const unsigned int min_dwell_time_passive_chan +); + +/** + * \brief Get dwell times + * + * This API retrieves dwell times from the WLAN driver. + * + * \param ifname \wifi0 + * \param p_max_dwell_time_active_chan Result memory for maximum dwell time for active scans + * \param p_min_dwell_time_active_chan Result memory for minimum dwell time for active scans + * \param p_max_dwell_time_passive_chan Result memory for maximum dwell time for passive scans + * \param p_min_dwell_time_passive_chan Result memory for maximum dwell time for passive scans + * + * \return 0 if the command succeeded. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi get_dwell_times interface + * + * call_qcsapi will print dwell times in argument order to stdout on success, or print an error message to stdout on failure. + */ +extern int qcsapi_wifi_get_dwell_times( + const char *ifname, + unsigned int *p_max_dwell_time_active_chan, + unsigned int *p_min_dwell_time_active_chan, + unsigned int *p_max_dwell_time_passive_chan, + unsigned int *p_min_dwell_time_passive_chan +); + +/** + * \brief Set bgscan dwell times + * + * This API sets active and passive channel dwell times used when background scanning. + * + * \param ifname \wifi0 + * \param dwell_time_active_chan dwell time for active scans + * \param dwell_time_passive_chan dwell time for passive scans + * + * All units are milliseconds. + * + * \note bgscan dwell times should be less than regular scan dwell times. + * + * \return 0 if the command succeeded. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi set_bgscan_dwell_times interface active passive + * + * Unless an error occurs, the output will be the string complete. + */ +extern int qcsapi_wifi_set_bgscan_dwell_times( + const char *ifname, + const unsigned int dwell_time_active_chan, + const unsigned int dwell_time_passive_chan +); + +/** + * \brief Get bgscan dwell times + * + * This API retrieves background scan dwell times from the WLAN driver. + * + * \param ifname \wifi0 + * \param p_dwell_time_active_chan Result memory for dwell time for active scans + * \param p_dwell_time_passive_chan Result memory for dwell time for passive scans + * + * \return 0 if the command succeeded. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi get_bgscan_dwell_times interface + * + * call_qcsapi will print dwell times in argument order to stdout on success, or print an error message to stdout on failure. + */ +extern int qcsapi_wifi_get_bgscan_dwell_times( + const char *ifname, + unsigned int *p_dwell_time_active_chan, + unsigned int *p_dwell_time_passive_chan +); + +/** + * @brief Start a scan on the given wireless interface. + * + * This API causes the STA to scan available WiFi channels for beacons and associate with an Access Point whose SSID is configured correctly. + * + * \note \primarywifi + * + * \param ifname \wifi0only + * + * \return 0 if the command succeeded (the scan is triggered, not that the scan is complete). + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi start_scan \ + * + * Unless an error occurs, the output will be the string complete. + */ +extern int qcsapi_wifi_start_scan(const char *ifname); + +/** + * @brief Cancel an ongoing scan on the given wireless interface. + * + * This API will cancel any ongoing WiFi channels scanning performed by the STA. It will do nothing if no + * scanning is currently running. + * + * \note \primarywifi + * + * \param ifname \wifi0only + * \param force Set to 0 to trigger scanning cancellation as soon as possible and return immediately. + * Set to 1 to cancel scan immediately and then return. + * + * \return 0 if the command succeeded - scan cancellation is triggered (force=0), or scan is cancelled (force=1), or + * no scan was in progress. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi cancel_scan \ \ + * + * Unless an error occurs, the output will be the string complete. + */ +extern int qcsapi_wifi_cancel_scan(const char *ifname, int force); + +/** + * @brief Get scan status. + * + * This API is used to get scan status. Application can use this API to poll scan status + * and ensure scan is completed. + * + * \note \primarywifi + * + * \param ifname \wifi0only + * \param scanstatus return the currently scan status, 1 for scan is running and 0 for no scan is running. + * + * \return 0 if the command succeeded. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi get_scanstatus \ + * + * Unless an error occurs, the output will be the 1 or 0. + */ +extern int qcsapi_wifi_get_scan_status(const char *ifname, int *scanstatus); + +/** + * @brief Enable background scan + * + * \note \primarywifi + * + * \param ifname \wifi0only + * \param enable Enable parameter, 1 means enable else 0 means disable + * + * \return 0 if the command succeeded. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi enable_bgscan \ \ + * + * where WiFi interface is the primary interface, enable is 0 | 1. + * + * Unless an error occurs, the output will be the string complete. + */ +extern int qcsapi_wifi_enable_bgscan(const char *ifname, const int enable); + +/** + * @brief get background scan status + * + * \note \primarywifi + * + * \param ifname \wifi0only + * \param enable background scan enable status + * + * \return 0 if the command succeeded. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi get_bgscan_status \ + * + * where WiFi interface is the primary interface, + * Unless an error occurs, the output will be the Extender related parameter value. + */ +extern int qcsapi_wifi_get_bgscan_status(const char *ifname, int *enable); + +/** + * @brief Wait until the currently running scan has completed. + * + * This API, when called, will block the calling thread until the previously triggered scan completes. + * + * \param ifname \wifi0 + * \param timeout how long to wait for the scan to complete. + * + * If the scan has not completed in the specified timeout interval, the API will return an error reporting timeout. + * + * This API is targeted for the STA but will also work on an AP. + * + * If no scan is in progress, the API will block the calling process until the timeout expires. + * + * \note To check whether scan is completed in RPC case, use non-block polling API qcsapi_wifi_get_scan_status() + * instead of this block API. + * + * \callqcsapi + * + * call_qcsapi wait_scan_completes \ \ + * + * Unless an error occurs, the output will be the string complete. + * + * A timeout will be reported as QCSAPI error 62: Timer expired. + */ +extern int qcsapi_wifi_wait_scan_completes(const char *ifname, time_t timeout); + +/**@}*/ + + +/* + * APIs relating to STA backoff in the event security parameters do not match those on the partner AP. + */ +/**@addtogroup SecurityMisAPIs + *@{*/ + +/** + * @brief Configure the retry backoff failure maximum count. + * + * Sets the number of times an association attempt can fail before backing off. + * + * \note This API is only valid on an STA. + * + * \param ifname \wifi0 + * \param fail_max the maximum number of failures permitted. The parameter can range from 2 to 20. The default failure value is 3. + * + * \return 0 if the call succeeded. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi backoff_fail_max \ \ + * + * Example: + * + * call_qcsapi backoff_fail_max wifi0 3 + * + * Unless an error occurs, the output will be the string complete. + */ +extern int qcsapi_wifi_backoff_fail_max( const char *ifname, const int fail_max ); + +/** + * @brief Configure retry backoff timeout. + * + * Configures the time to wait in seconds after backing off before attempting to associate again. + * + * \note This API is only valid on an STA. + * + * \param ifname \wifi0 + * \param timeout the timeout between backoff and attempting a reconnection. Range is between 10 and 300 seconds. Default value + * is 60 seconds. + * + * \return 0 if the call succeeded. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi backoff_timeout \ \ + * + * Example: + * + * call_qcsapi backoff_timeout wifi0 60 + * + * Unless an error occurs, the output will be the string complete. + */ +extern int qcsapi_wifi_backoff_timeout( const char *ifname, const int timeout ); + +/**@}*/ + +/**@addtogroup EngineeringAPIs + *@{*/ + +/** + * @brief Get the current MCS rate. + * + * Get the current MCS rate. + * + * Value will be a string with format "MCSn" or "MCSnn", + * where n or nn is an integer in ASCII format from 0 to 76, excluding 32. + * For 11ac rate, the value will be string with format "MCSx0y", + * where x is from 1 to 4, and y is from 0 to 9. x means Nss (number of spatial stream) and y + * mean MCS index. + * + * If the autorate fallback option has been selected, this API will return Configuration Error. + * + * This API only returns an actual MCS rate if the set MCS rate API has been called to select a particular MCS rate. + * + * \param ifname \wifi0 + * \param current_mcs_rate return parameter for storing the current MCS rate. + * + * \return 0 if the call succeeded. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi get_mcs_rate \ + * + * Unless an error occurs, the output will be an MCS index string, e.g. for 11n, + * MCS0, MCS8, MCS76, for 11ac, MCS100, MCS307 etc, or + * Configuration Error if the auto rate fallback option has been selected. + * + * This command can return incorrect results if the rate has never been configured. + */ +extern int qcsapi_wifi_get_mcs_rate(const char *ifname, + qcsapi_mcs_rate current_mcs_rate); + +/** + * @brief Set the MCS rate. + * + * Set the current MCS rate. + * For 11n rate, value is required to be a string with format "MCSn" or "MCSnn", + * where n or nn is an integer in ASCII format from 0 to 76, excluding 32. Leading zeros are NOT permitted; + * the string "MCS01" will not be accepted. + * For 11ac rate, value is required to be a string with format + * "MCSx0y", where x means Nss (number of spatial streams) and y means MCS index, the possible value are + * 100 ~ 109, 200 ~ 209, 300 ~ 309, 400 ~ 409. + * This API cannot be used to configure auto rate fallback; + * use the Set Option API with qcsapi_autorate_fallback as the option to select auto rate fallback. + * + * \note \primarywifi + * \note To set an 802.11n MCS on a VHT capable device, you must first set the bandwidth to 20MHz or 40MHz. + * \sa qcsapi_wifi_set_bw + * + * \note This API should only be used to evaluate the performance of a particular MCS (modulation and coding) index. + * Using it in a production application (i.e. with the end-user) can result in unexpectedly poor performance, + * either lower than expected transfer rates or a failure to associate. + * Use of the auto rate fallback option is strongly recommended. + * + * If option autorate fallback is enabled, this API will disable it as a side effect. + * + * \param ifname \wifi0only + * \param new_mcs_rate the new MCS rate to use (fixed rate). + * + * \callqcsapi + * + * call_qcsapi set_mcs_rate \ \ + * + * where \ is an MCS index string. + * + * See the description of the API itself for the expected format of the MCS index string. + * + * Unless an error occurs, the output will be the string complete. + * + * \note This command cannot be used to configure the auto rate fallback option; + * use call_qcsapi set_option with autorate as the option for that purpose. + */ +extern int qcsapi_wifi_set_mcs_rate( const char *ifname, const qcsapi_mcs_rate new_mcs_rate ); + +/** + * @brief Set pairing ID for pairing protection + * + * Set pairing ID for use of pairing protection + * + * The pairing ID is a 32 characters' string + * + * \param ifname \wifi0 + * \param pairing_id a 32 characters' string used for pairing protection. + * + * \return 0 if the command succeeded and the pairing ID is updated. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi set_pairing_id \ \ + * + * Unless an error occurs, the output will be the string complete. + */ +extern int qcsapi_wifi_set_pairing_id(const char *ifname, const char *pairing_id); + +/** + * @brief Get pairing ID for pairing protection + * + * Get pairing ID which is for use of pairing protection + * + * The pairing ID is a 32 characters' string + * + * \param ifname \wifi0 + * \param pairing_id a 32 characters' string used for pairing protection. + * + * \return 0 if the pairing ID is fetched. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi get_pairing_id \ + * + * Unless an error occurs, the output will be the string of pairing ID. + */ +extern int qcsapi_wifi_get_pairing_id(const char *ifname, char *pairing_id); + +/** + * @brief Set pairing enable flag for pairing protection + * + * enable/disable the pairing protection + * + * \note \aponly + * + * \param ifname \wifi0 + * \param enable Enabling mode of the pairing protection. + * 0 - disable + * 1 - enable and accept the association when pairing ID matches. + * 2 - enable and deby the association when pairing ID matches. + * + * \return 0 if the command succeeded and the pairing enable flag is updated. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi set_pairing_enable \ \ + * + * Unless an error occurs, the output will be the string complete. + */ +extern int qcsapi_wifi_set_pairing_enable(const char *ifname, const char *enable); + +/** + * @brief Get pairing enable flag for pairing protection + * + * Get pairing enable flag which is for enabling pairing protection + * + * \note \aponly + * + * The pairing enable flag is "0" or "1" + * + * \param ifname \wifi0 + * \param enable a string used for enabling pairing protection. + * + * \return 0 if the enable flag is fetched. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi get_pairing_enable \ + * + * Unless an error occurs, the output will be the string of enable flag + */ +extern int qcsapi_wifi_get_pairing_enable(const char *ifname, char *enable); + +/** + * @brief Set non_WPS pairing ptrotection enable flag for pairing protection + * + * Set non_WPS pairing enable flag which is for enabling pairing protection + * + * The pairing enable flag is "0" or "1" + * + * \param ifname \wifi0 + * \param ctrl_state a string used for enabling non WPS pairing protection. + * + * \return 0 if the enable flag is set. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi set_non_wps_pp_enable \ \ + * + * Unless an error occurs, the output will be the string complete. + */ +extern int qcsapi_non_wps_set_pp_enable(const char *ifname, uint32_t ctrl_state); + +/** + * @brief Get non_WPS pairing ptrotection enable flag for pairing protection + * + * Get non_WPS pairing enable flag which is for enabling pairing protection + * + * The pairing enable flag is "0" or "1" + * + * \param ifname \wifi0 + * \param ctrl_state a string used for getting the non WPS pairing protection status. + * + * \return 0 if the enable flag is fetched. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi get_non_wps_pp_enable \ + * + * Unless an error occurs, the output will be the string of enable flag + */ +extern int qcsapi_non_wps_get_pp_enable(const char *ifname, uint32_t *ctrl_state); + +/** + * @brief Set various fix items for compatibility issue with other vendor chipset. + * + * Set various fix items for compatibility issue with other vendor chipset. + * + * \param ifname \wifi0 + * \param fix_param the param to enable or disable the fix. + * \param value enable(1) or disable(0) the fix. + * + * \return 0 if the enabling or disabling the fix is successful. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * call_qcsapi interface: + * + * call_qcsapi set_vendor_fix \ \ \ + * + * Unless an error occurs, the output will be the string complete. + */ +extern int qcsapi_wifi_set_vendor_fix(const char *ifname, int fix_param, int value); + +/** + * @brief Convert a numeric error code to a descriptive string + * + * Given a numeric error code, convert to a human readable string. This wills for conventional negative errno values, as well as QCSAPI negative error values (<= -1000). + * + * \param qcsapi_retval a negative error value to find the associated string of + * \param error_msg memory for result storage + * \param msglen length of error_msg buffer in bytes, including the null terminator + * + * \callqcsapi + * + * call_qcsapi get_error_message \ + * + * where \ is a negative error value + * + * Output will be the requested error message, or the relevant error message if an error occurs. + */ +extern int qcsapi_errno_get_message( const int qcsapi_retval, char *error_msg, unsigned int msglen ); +/**@}*/ + +/**@addtogroup StatisticsAPIs + *@{*/ +/** + * \brief Get statistics data of an interface. + * + * This API call is used to get interface statistics data. + * + * \param ifname \wifi0 + * \param stats return parameter to contain the statistics data of the interface being queried. + * + * \return >= 0 on success, < 0 on error. If success, stats contains + * the statistics data retrieved from the device for the interface. + * + * \callqcsapi + * + * call_qcsapi get_interface_stats <interface name> + * + * Unless an error occurs, the output will be the statistics data of the interface. + */ +extern int qcsapi_get_interface_stats( const char *ifname, qcsapi_interface_stats *stats ); +/**@}*/ + +/**@addtogroup StatisticsAPIs + *@{*/ +/** + * \brief Get latest PHY statistics data of an interface + * + * This API call is used to get latest PHY statistics data. + * + * \param ifname \wifi0 + * \param stats return parameter to contain the statistics data of the interface being queried. + * + * \return >= 0 on success, < 0 on error. If success, stats contains + * the PHY statistics data retrieved from the device for the interface. + * + * \callqcsapi + * + * call_qcsapi get_phy_stats <interface name> + * + * Unless an error occurs, the output will be the PHY statistics data of the interface. + */ +extern int qcsapi_get_phy_stats( const char *ifname, qcsapi_phy_stats *stats ); +/**@}*/ + +/**@addtogroup StatisticsAPIs + *@{*/ +/** + * \brief Reset statistics data of an interface. + * + * This API call is used to reset interface statistics data. + * + * \param ifname \wifi0 + * \param node_index selects the node to operate, it's valid in AP mode when local_remote_flag is set to QCSAPI_REMOTE_NODE. + * \param local_remote_flag use local flag to reset local all counters, use remote flag to reset all counters on the remote associated STA; set to QCSAPI_LOCAL_NODE or QCSAPI_REMOTE_NODE + * + * \return >= 0 on success, < 0 on error. If success,the statistics data + * of the interface will be cleared. + * + * \callqcsapi + * + * call_qcsapi reset_all_stats \ \ \ + * + */ +extern int qcsapi_reset_all_counters( const char *ifname, const uint32_t node_index, int local_remote_flag ); +/**@}*/ + +/**@addtogroup FirmwareAPIs + *@{*/ + +/* U-boot information related defines */ +#define UBOOT_INFO_VER 0 +#define UBOOT_INFO_BUILT 1 +#define UBOOT_INFO_TYPE 2 +#define UBOOT_INFO_ALL 3 +#define UBOOT_INFO_LARGE 0 +#define UBOOT_INFO_MINI 1 +#define UBOOT_INFO_TINY 2 +#define MTD_DEV_BLOCK0 "/dev/mtdblock0" +#define MTD_UBOOT_VER_OFFSET 11 +#define MTD_UBOOT_OTHER_INFO_OFFSET 32 + +/** + * @brief Get u-boot information. + * + * \param uboot_info (0 - ver, 1 - built, 2 - type, 3 - all) + * type can be U-boot (Mini) or U-boot (Large) + * + * \return 0 upon success, otherwise error value + * See @ref mysection4_1_4 "QCSAPI Return Values" for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi get_uboot_info \ + * + * \usage + * call_qcsapi get_uboot_info 0 + * Version: v36.7.0.2 + * + * call_qcsapi get_uboot_info 1 + * Built: 05 June 2014 06:30:07 + * + * call_qcsapi get_uboot_info 2 + * Type: U-boot (Mini) + * + * call_qcsapi get_uboot_info 3 + * Version: v36.7.0.2 + * Built : 05 June 2014 06:30:07 + * Type : U-boot (Mini) + */ +extern int qcsapi_get_uboot_info(string_32 uboot_version, struct early_flash_config *ef_config); + +/** + * @brief Get the version of the firmware running on the device. + * + * This API reports the version of the firmware running on the device. + * + * \param firmware_version return parameter string to contain the firmware version. + * \param version_size the size of the buffer firmware_version. + * + * \callqcsapi + * + * call_qcsapi get_firmware_version + * + * Unless an error occurs, the output will be the version of the firmware currently running on the device. + * It is not necessary to specify the version size parameter; it will default to 40 (characters). + */ +extern int qcsapi_firmware_get_version( char *firmware_version, const qcsapi_unsigned_int version_size ); + +/** + * @brief Update an image partition with the requested image. + * + * This API updates either the live or safety partition with a new image. The image is checked to be for the appropriate architecture and checksummed before writing to flash. + * + * \param image_file path to the new firmware image in the filesystem + * \param partition_to_upgrade either the live or safety partition + * + * \callqcsapi + * + * call_qcsapi flash_image_update \ \ + * + * Unless an error occurs, the output will be the string complete. + * \note when used via RPC, timeout is 60 seconds + */ +extern int qcsapi_flash_image_update( const char *image_file, qcsapi_flash_partiton_type partition_to_upgrade ); + +/** + * @brief Copy an image file from RC to EP + * + * This API transfers either kernel or bootloader image file from RC to /tmp directory of EP + * + * \param image_file path to the new firmware image in the filesystem + * \param image_flags any additional flags, for future extensions + * + * \callqcsapi + * + * call_qcsapi flash_image_update \ \ + * + * Unless an error occurs, the output will be the string complete. + * Default binding interface for the server is pcie0. + * This can be overwritten in /mnt/jffs2/qfts.conf file. + */ +extern int qcsapi_send_file(const char *image_file_path, const int image_flags); + +/**@}*/ + + +/**@addtogroup PowerAPIs + *@{*/ + +/** + * @brief Set power save setting + * + * Set the current power save setting + * + * \param mode new power save setting. Valid values are: + *
    + *
  • QCSAPI_PM_MODE_DISABLE - Disable all power saving features
  • + *
  • QCSAPI_PM_MODE_AUTO - Automatic; power saving will adjust itself based on associated stations, traffic levels etc
  • + *
  • QCSAPI_PM_MODE_SUSPEND - Suspend all operations + *
+ * + * \return 0 if the command succeeded. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi pm \ + */ +extern int qcsapi_pm_set_mode(int mode); + +/** + * @brief Get power save setting + * + * Get the current power save setting. This is related to the SoC power saving, not 802.11 power saving. + * + * \param mode pointer to where the current power save setting value should be stored. + * + * \return 0 if the command succeeded. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi pm + * + * Unless an error occurs, the output will be the current value of power save setting from a list \. + */ +extern int qcsapi_pm_get_mode(int *mode); + +/** + * @brief Get qpm level + * + * Get the current qpm level. This is related to the SoC power saving + * + * \param qpm_level to where the current qpm level value should be stored + * \return 0 if the command succeeded. + * \return a negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi qpm_level + * + * Unless an error occurs, the output will be a number in the range 0 to 6. Value 0 indicates power save disabled; + * Values 1 to 5 indicate the current power save level; Value 6 indicates power saving is suspended. + */ +extern int qcsapi_get_qpm_level(int *qpm_level); + +#define QCSAPI_PM_MODE_DISABLE BOARD_PM_LEVEL_FORCE_NO +#define QCSAPI_PM_MODE_AUTO -1 +#define QCSAPI_PM_MODE_SUSPEND BOARD_PM_LEVEL_SUSPEND + +/** + * \brief set host state + * + * This API call is used for host CPU to inform radio module its state + * + * \param ifname \wifi0 + * \param host_state either '0 (exit power save) or '1' (enter power save) + * \note This API works across all wifi interfaces. + * + * \return >= 0 on success, < 0 on error. + * + * \call_qcsapi + * + * call_qcsapi wowlan_host_state \ {0 | 1} + */ +extern int qcsapi_set_host_state( const char *ifname, const uint32_t host_state); + +/**@}*/ + +/**@addtogroup QTM_group + *@{*/ + +/** + * \brief Get QTM status + * + * This API obtains QTM runtime status and flags + * + * \param ifname \wifi0 + * \param param item to query status of. Valid values are: + * \li QVSP_STATE_ENABLE - query whether qtm is enabled + * \li QVSP_STATE_FAT - query most recently reported free air time + * \param value result memory + * + * \return 0 on success, negative on error. + */ +extern int qcsapi_qtm_get_state(const char *ifname, unsigned int param, unsigned int *value); + +/** + * \brief Get all QTM status + * + * This API obtains all QTM runtime status and flags with 1 invocation + * + * \param ifname \wifi0 + * \param value pointer to an array of unsigned ints for value storage + * \param max maximum number of unsigned ints to return, typically QVSP_STATE_READ_MAX + * + * \return 0 on success, negative on error. + */ +extern int qcsapi_qtm_get_state_all(const char *ifname, struct qcsapi_data_128bytes *value, unsigned int max); + +/** + * \brief Set QTM status + * + * This API handles QTM enable/disable, test settings and reset + * + * \param ifname \wifi0 + * \param param item to query status of. Valid values are: + * \li QVSP_STATE_ENABLE - enable (value nonzero) / disable (value zero) QTM + * \li QVSP_STATE_RESET - reset VSP stream accounting (value unused) + * \li QVSP_STATE_TEST_FAT - set a FAT value in order to simulate undersubscription or oversubscription (value is FAT to set) + * \param value context dependant parameter value + * + * Parts of this API can be called via call_qcsapi. + * + * \callqcsapi + * + * call_qcsapi qtm enable + * call_qcsapi qtm disable + * call_qcsapi qtm reset + * call_qcsapi qtm test fat + */ +extern int qcsapi_qtm_set_state(const char *ifname, unsigned int param, unsigned int value); + +/** + * \internal + * \brief Get QTM config option + * + * This API obtains QTM configuration options + * + * \param ifname \wifi0 + * \param param configuration option to query + * \param value result memory + * + * \return 0 on success, negative on error + * + * \callqcsapi + * + * call_qcsapi qtm get + * + * This will print the parameter obtained if successful, or an error message on failure. + */ +extern int qcsapi_qtm_get_config(const char *ifname, unsigned int param, unsigned int *value); + +/** + * \internal + * \brief Get all QTM config options + * + * This API stores all QTM configuration options into an array + * + * \param ifname \wifi0 + * \param value pointer to an array of unsigned ints for value storage + * \param max maximum number of unsigned ints to return, typically QVSP_STATE_READ_MAX + * + * \return 0 on success, negative on error. + * + * \callqcsapi + * + * call_qcsapi qtm show config will call this API, and some others. + * + * Unless an error occurs, the output will be all configuration options, all whitelist entries and all rules. + */ +extern int qcsapi_qtm_get_config_all(const char *ifname, struct qcsapi_data_1Kbytes *value, unsigned int max); + +/** + * \internal + * \brief Set QTM config option + * + * This API sets QTM configuration options + * + * \param ifname \wifi0 + * \param param configuration option to modify + * \param value value to set + * + * \return 0 on success, negative on error + * + * \callqcsapi + * + * call_qcsapi qtm set + * + * Output is silent with a return code of zero if successful, and an error message on failure. + */ +extern int qcsapi_qtm_set_config(const char *ifname, unsigned int param, unsigned int value); + +/** + * \internal + * \brief Add QTM rule + * + * Add a QTM rule. Rules determine which streams to drop in an oversubscription event. + * + * \param ifname \wifi0 + * \param entry rule to add + * + * \return 0 on success, negative on error + * + * \callqcsapi + * + * call_qcsapi qtm rule add [ ]... + * + * Where are rule parameter name/value pairs. Many pairs can be used in one rule. + * + * Output is silent with a return code of zero if successful, and an error message on failure. + */ +extern int qcsapi_qtm_add_rule(const char *ifname, const struct qcsapi_data_128bytes *entry); + +/** + * \internal + * \brief Delete QTM rule + * + * Delete a QTM rule. + * + * \param ifname \wifi0 + * \param entry rule to delete + * + * \return 0 on success, negative on error + * + * \callqcsapi + * + * call_qcsapi qtm rule add [ ]... + * + * Where are rule parameter name/value pairs. Many pairs can be used in one rule. + * + * Output is silent with a return code of zero if successful, and an error message on failure. + */ +extern int qcsapi_qtm_del_rule(const char *ifname, const struct qcsapi_data_128bytes *entry); + +/** + * \internal + * \brief Delete a QTM rule by index + * + * Delete a QTM rule by index + * + * \param ifname \wifi0 + * \param index index of the entry to delete, starting from 1 + * + * \return 0 on success, negative on error + * + * \callqcsapi + * + * call_qcsapi qtm rule del + * + * Output is silent with a return code of zero if successful, and an error message on failure. + */ +extern int qcsapi_qtm_del_rule_index(const char *ifname, unsigned int index); + +/** + * \internal + * \brief Read QTM rules + * + * Read QTM rules + * + * \param ifname \wifi0 + * \param entries an array of rule structures for result storage + * \param max_entries the length of the array passed in 'entries' + * + * \return Number of rules currently configured on success, negative on error + * + * \callqcsapi + * + * call_qcsapi qtm show config will call this API, and some others. + * + * Unless an error occurs, the output will be all configuration options, all whitelist entries and all rules. + */ +extern int qcsapi_qtm_get_rule(const char *ifname, struct qcsapi_data_3Kbytes *entries, unsigned int max_entries); + +/** + * \internal + * \brief Read QTM streams + * + * Read QTM streams + * + * \param ifname \wifi0 + * \param entries an buffer of stream structures for result storage + * \param max_entries the length of the array passed in 'entries' + * \param show_all show all streams + * + * \return Number of streams currently configured on success, negative on error + * + * \callqcsapi + * + * call_qcsapi qtm show [all] will call this API, and some others. + * + * Unless an error occurs, the output will be status, and current high throughput streams. Usage of the argument 'all' adds low throughput streams. + */ +extern int qcsapi_qtm_get_strm(const char *ifname, struct qcsapi_data_4Kbytes *strms, + unsigned int max_entries, int show_all); + +/** + * \internal + * \brief Read QTM statistics + * + * Read QTM statistics + * + * \param ifname \wifi0 + * \param stats result memory + * + * \return 0 on success, negative on error + * + * \callqcsapi + * + * call_qcsapi qtm show stats + * + * The output will show various statistics on success, and an error message on failure. + */ +extern int qcsapi_qtm_get_stats(const char *ifname, struct qcsapi_data_512bytes *stats); + +/** + * \internal + * \brief Read QTM inactive flags + * + * Read QTM inactive flags + * + * \param ifname \wifi0 + * \param flags result memory + * + * \return 0 on success, negative on error + * + * \callqcsapi + * + * call_qcsapi qtm show + * + * The output will show the inactive reason if QTM is inactive. + */ +extern int qcsapi_qtm_get_inactive_flags(const char *ifname, unsigned long *flags); + +/**@}*/ + + +/**@addtogroup invoke_script + *@{*/ + +/** + * \brief API of scripts for EMI testing and RF testing + * + * This function is used to call a script on the board. This API should be used when device + * is configured to calstate=1 mode. The following scripts are supported: + * + * set_test_mode
+ * This script is used to configure the packet type.
+ * set_test_mode \ <11n signal>
+ * Channel: channel number of the center frequency
+ * Antenna: 127 - 4 chanis on, 113 - chain 1 on, 116 - chain3 on, 120 - chain 4 on.
+ * MCS level: MCS# of packet transmitted
+ * BW: 20 or 40 in MHz units.
+ * Size: packet size in 100bytes units, it should be a number smaller than 40 and bigger than 0
+ * 11n signal: 1 - 11n, 0 - 11a.
+ * BF: 0 default. + * + * send_test_packet
+ * Start to transmit packet. Please note that before calling this script, test mode should be set by + * script set_test_mode
+ * send_test_packet
+ * number: How many(number*1000) packets will be sent. + * + * stop_test_packet
+ * stop sending packet. + * + * set_tx_pow x
+ * set the packet output power to xdBm where x can vary depending on the front end device. + * + * send_cw_signal
+ * Generate CW tone for different channels for frequency offset measurement.
+ * send_cw_signal \
+ * channel: channel number like 36, 40, 44, ...
+ * chain: the value are 2 separate numbers. + * - 0 0 - chain1 + * - 0 2 - chain2 + * - 1 0 - chain3 + * - 1 2 - chain4 + * + * CW pattern: + * - 0 - 625KHz with 0 dBFS power + * - 1 - 625KHz with -3 dBFS power + * - 2 - 1MHz with 0 dBFS power + * - 3 - 1MHz with -3dBFS power + * + * stop_cw_signal
+ * stop the CW tone. + * + * send_cw_signal_4chain
+ * Generate CW tone for different channels and send signal using all four chains, or stop the CW tone.
+ * send_cw_signal_4chain { start \ | stop }
+ * + * show_test_packet
+ * show information about test packet. + * + * \param scriptname the name of the script file + * \param param parameters used by the script + * + * \return 0 on success, negative on error. + * + * \callqcsapi + * + * call_qcsapi run_script \ \ + * + * The output will be silent on success, or an error message on failure. + * + * Example:
+ * call_qcsapi run_script set_test_mode 36 127 15 20 40 1 0 + */ +extern int qcsapi_wifi_run_script(const char *scriptname, const char *param); + +/**@}*/ + + +/**@addtogroup WiFiAPIs + *@{*/ + +/** + * @brief Start/Stop test traffic. + * + * Start/Stop test traffic (null or qos null packets) on specified WiFi interface. + * + * \param ifname \wifi0 + * \param period Period interval for sending test traffic in milliseconds. 0 means disable. + * + * \return 0 if the command succeeded. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi test_traffic \ \ + */ +extern int qcsapi_wifi_test_traffic(const char *ifname, uint32_t period); + +/** + * \brief Add a multicast IP address to the flood-forwarding table + * + * Packets matching these addresses will be flood-forwarded to every interface and every associated + * station. + * + * \note SSDP (239.255.255.250) and LNCB (224.0.0.0/24) packets are always flood-forwarded and do + * not need to be added to this table. + * + * \param ipaddr the multicast IPv4 address to be added to the table + * + * \return 0 if the call succeeded. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi add_ipff \ + * + * Unless an error occurs, the output will be the string complete. + */ +extern int qcsapi_wifi_add_ipff(qcsapi_unsigned_int ipaddr); + +/** + * \brief Remove a multicast IP address from the flood-forwarding table + * + * \param ipaddr the multicast IPv4 address to be removed from the table + * + * \return 0 if the call succeeded. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi del_ipff \ + * + * Unless an error occurs, the output will be the string complete. + */ +extern int qcsapi_wifi_del_ipff(qcsapi_unsigned_int ipaddr); + +/** + * \brief Display the contents of the flood-forwarding table + * + * \note SSDP (239.255.255.250) and LNCB (224.0.0.0/24) packets are always flood-forwarded, even + * if not added to this table. + * + * \return 0 if the call succeeded. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi get_ipff + * + * Unless an error occurs, the output is a list of configured multicast IP addresses, + * separated by newline characters.complete. + */ +extern int qcsapi_wifi_get_ipff(char *buf, int buflen); + +/** + * \brief Get RTS threshold + * + * \param ifname \wifi0 + * \param rts_threshold Output parameter to contain the value of RTS threshold + * + * \return 0 if the call succeeded. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi get_rts_threshold + * + * Unless an error occurs, outputs RTS threshold configured for interface + */ +extern int qcsapi_wifi_get_rts_threshold(const char *ifname, qcsapi_unsigned_int *rts_threshold); + +/** + * \brief Set RTS threshold + * + * \note Value of RTS threshold should be in the range 0 - 65537; + * 0 - enables RTS/CTS for every frame, 65537 or more - disables RTS threshold + * + * \param ifname \wifi0 + * \param rts_threshold New value of RTS threshold + * + * \return 0 if the call succeeded. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi set_rts_threshold + * + * Unless an error occurs, the output will be the string complete. + */ +extern int qcsapi_wifi_set_rts_threshold(const char *ifname, qcsapi_unsigned_int rts_threshold); + +/** + * \brief set nss cap + * + * This API call is used to set the maximum number of spatial streams for a given interface + * + * \param ifname \wifi0 + * \param modulation either 'ht' (for 802.11n) or 'vht' (for 802.11ac) + * \note This API works across all wifi interfaces. + * + * \return >= 0 on success, < 0 on error. + * + * \callqcsapi + * + * call_qcsapi set_nss_cap \ {ht | vht} \ + */ +extern int qcsapi_wifi_set_nss_cap(const char *ifname, const qcsapi_mimo_type modulation, + const qcsapi_unsigned_int nss); + +/** + * \brief get nss cap + * + * This API call is used to get the maximum number of spatial streams for a given interface + * + * \param ifname \wifi0 + * \param modulation either 'ht' (for 802.11n) or 'vht' (for 802.11ac) + * \note This API works across all wifi interfaces. + * + * \return >= 0 on success, < 0 on error. + * + * \call_qcsapi + * + * call_qcsapi get_nss_cap \ {ht | vht} + */ +extern int qcsapi_wifi_get_nss_cap(const char *ifname, const qcsapi_mimo_type modulation, + qcsapi_unsigned_int *nss); + +/** + * \brief get A-MSDU status for VAP + * + * \param ifname \wifi 0 + * \param enable returned A-MSDU status + * + * \return 0 on success or a negative value on error. + * + * \call_qcsapi + * + * call_qcsapi get_tx_amsdu \ + */ +extern int qcsapi_wifi_get_tx_amsdu(const char *ifname, int *enable); + +/** + * \brief enable/disable A-MSDU for VAP + * + * \param ifname \wifi0 + * \param enable 0 to disable A-MSDU, 1 to enable it + * + * \return 0 on success or a negative value on error. + * + * \call_qcsapi + * + * call_qcsapi set_tx_amsdu \ { 0 | 1 } + */ +extern int qcsapi_wifi_set_tx_amsdu(const char *ifname, int enable); + +/** + * \brief get disassoc reason code + * + * This API call is used to get disassoc reason. + * + * \param ifname \wifi0 + * + * \return >= 0 on success, < 0 on error. + * + * \callqcsapi + * + * call_qcsapi disassoc_reason \ + */ +extern int qcsapi_wifi_get_disassoc_reason( const char *ifname, qcsapi_unsigned_int *reason ); + +/** + * \brief Block or unblock all association request for one specified BSS. + * + * Block one BSS. + * + * \param ifname wifix + * \param flag user configuration for the specified BSS. 1: Block 0 Unblock + * + * \return 0 if operation succeeds. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi block_bss \ \ + * + * Unless an error occurs, the output will be the string complete. + */ +extern int qcsapi_wifi_block_bss(const char *ifname, const qcsapi_unsigned_int flag); + +/** + * \brief Check if device is in repeater mode + * + * Check if device is in repeater mode. + * + * \return 1 if in repeater mode. + * \return 0 if not in repeater mode. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \call_qcsapi + * + * call_qcsapi verify_repeater_mode + */ +extern int qcsapi_wifi_verify_repeater_mode(void); + +/** + * \brief Configure the AP interface name + * + * Configure the AP interface name for AP mode or primary AP interface name for repeater mode. + * + * \note The new name does not take effect until configuration is reloaded. + * + * \param ifname the new interface name for AP mode + * + * \return 0 if the command succeeded. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \call_qcsapi + * + * call_qcsapi set_ap_interface_name + */ +extern int qcsapi_wifi_set_ap_interface_name(const char *ifname); + +/** + * \brief Get the AP interface name + * + * This API gets interface name for AP mode or primary AP interface name for repeater mode. + * + * \param ifname the AP interface name returned + * + * \return 0 if the command succeeded. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \call_qcsapi + * + * call_qcsapi get_ap_interface_name + */ +extern int qcsapi_wifi_get_ap_interface_name(char *ifname); + +/**@}*/ + +/**@addtogroup StatisticsAPIs + *@{*/ +/** + * @brief Get RFIC temperature + * + * Get RFIC temperature + * + * \param temp_exter Buffer to contain the returned RFIC external temperature. + * \param temp_inter Buffer to contain the returned RFIC internal temperature. + * \param temp_bbic Buffer to contain the returned BBIC temperature. + * + * \return 0 if the command succeeded. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \note The return value is a fixed point number, and the actual internal/external temperature + * value (in degrees Celsius) can be obtained using the following code snippet.
+ * @code + * float rfic_temperature_extr, rfic_temperature_inter, bbic_temperature; + * rfic_temperature_extr = temp_exter / 100000.0f; + * rfic_temperature_inter = temp_inter / 1000000.0f; + * bbic_temperature = temp_bbic / 1000000.0f; + * @endcode + * temp_exter value returned by this API is guaranteed to be no more than 5 seconds old. + * + * \callqcsapi
+ * + * call_qcsapi get_temperature + */ +extern int qcsapi_get_temperature_info(int *temp_exter, int *temp_inter, int *temp_bbic); +/**@}*/ + + +/**@addtogroup CalcmdAPI + *@{*/ + +/** + * \brief QCSAPI for calcmd SET_TEST_MODE + * + * \param ifname \wifi0 + * \param value value to set. The param belonging to each value is predefined. + * + * \return 0 on success, negative on error + * + * \callqcsapi + * + * call_qcsapi set_test_mode calcmd \ \ \ \ \ \ + * + * Output is silent with a return code of zero if successful, and an error message on failure. + * + * Example:
+ * call_qcsapi set_test_mode calcmd 36 127 15 40 40 1 0 (Channel 36, 4 antenna, MCS 15, HT40, 4Kbytes, 11N Signal, bf) + */ + +extern int qcsapi_calcmd_set_test_mode( qcsapi_unsigned_int channel, + qcsapi_unsigned_int antenna, + qcsapi_unsigned_int mcs, + qcsapi_unsigned_int bw, + qcsapi_unsigned_int pkt_size, + qcsapi_unsigned_int eleven_n, + qcsapi_unsigned_int bf); + + +/** + * \brief Show TX packet number, RX packet number and CRC number + * + * This API call is used to show test mode packet statistics. + * + * \param ifname \wifi0 + * \param stats return parameter to contain the statistics of TX, RX, CRC packet number. + * + * \return >= 0 on success, < 0 on error. If success, stats contains + * the packet number statistics data retrieved from the device for the interface. + * + * \callqcsapi + * + * call_qcsapi show_test_packet calcmd + * + * Unless an error occurs, the output will be the PHY statistics data of the interface. + */ + +extern int qcsapi_calcmd_show_test_packet(qcsapi_unsigned_int *tx_packet_num, qcsapi_unsigned_int *rx_packet_num, qcsapi_unsigned_int *crc_packet_num); + + +/** + * \brief Start sending OFDM Packet + * + * This API call is used to send OFDM packet. + * + * \param ifname \wifi0 + * \param value the number of packet to transmit, 1 is 1000 packets. If number is set, it will automatically stop, if 0, transmit infinitely + * + * \return >= 0 on success, < 0 on error. If success, stats contains + * the packet number statistics data retrieved from the device for the interface. + * + * \callqcsapi + * + * call_qcsapi send_test_packet calcmd \ + * + * Output is silent with a return code of zero if successful, and an error message on failure. + */ + +extern int qcsapi_calcmd_send_test_packet(qcsapi_unsigned_int to_transmit_packet_num); + +/** + * \brief Stop transmitting OFDM Packet + * + * This API call is used to stop transmitting OFDM packet in test mode. + * + * \param ifname \wifi0 + * + * \return >= 0 on success, < 0 on error. If success, stats contains + * + * \callqcsapi + * + * call_qcsapi stop_test_packet calcmd + * + * Output is silent with a return code of zero if successful, and an error message on failure. + */ + +extern int qcsapi_calcmd_stop_test_packet(void); + +/** + * \brief send CW signal at center frequency for Frequency offset measurement + * + * This API call is used to send continuous signal in test mode. + * + * \param ifname \wifi0 + * + * \param channel to perform the action on. (calcmd) + * + * \return >= 0 on success, < 0 on error. If success, stats contains + * + * \callqcsapi + * + * call_qcsapi send_dc_cw_signal calcmd + * + * Output is silent with a return code of zero if successful, and an error message on failure. + */ + +extern int qcsapi_calcmd_send_dc_cw_signal(qcsapi_unsigned_int channel); + +/** + * \brief stop transmitting CW signal + * + * This API call is used to stop Continuous signal in test mode. + * + * \param ifname \wifi0 + * + * \return >= 0 on success, < 0 on error. If success, stats contains + * + * \callqcsapi + * + * call_qcsapi stop_dc_cw_signal calcmd + * + * Output is silent with a return code of zero if successful, and an error message on failure. + */ + +extern int qcsapi_calcmd_stop_dc_cw_signal(void); + +/** + * \brief get antenna selection + * + * This API call is used to retrieve antenna configuration in test mode. + * + * \param ifname \wifi0 + * + * \return >= 0 on success, < 0 on error. If success, stats contains + * + * \callqcsapi + * + * call_qcsapi get_test_mode_antenna_sel calcmd + * + * Output is antenna number with bit mask type. e.g) 1010 means Ant4 & Ant2 is enabled. + */ + +extern int qcsapi_calcmd_get_test_mode_antenna_sel(qcsapi_unsigned_int *antenna_bit_mask); + +/** + * \brief get mcs config + * + * This API call is used to retrieve MCS configuration in test mode. + * + * \param ifname \wifi0 + * + * \return >= 0 on success, < 0 on error. If success, stats contains + * + * \callqcsapi + * + * call_qcsapi get_test_mode_mcs calcmd + * + * Output is MCS configuration. + */ + +extern int qcsapi_calcmd_get_test_mode_mcs(qcsapi_unsigned_int *test_mode_mcs); + + +/** + * \brief get bandwidth config + * + * This API call is used to retrieve bandwidth configuration in test mode. + * + * \param ifname \wifi0 + * + * \return >= 0 on success, < 0 on error. If success, stats contains + * + * \callqcsapi + * + * call_qcsapi get_test_mode_bw calcmd + * + * Output is Bandwidth configuration. + */ + +extern int qcsapi_calcmd_get_test_mode_bw(qcsapi_unsigned_int *test_mode_bw); + + +/** + * \brief get tx power value + * + * This API call is used to retrieve current TX power. + * + * \param ifname \wifi0 + * + * \return >= 0 on success, < 0 on error. If success, stats contains + * + * \callqcsapi + * + * call_qcsapi get_test_mode_tx_power calcmd + * + * Output is TX power value. + */ + +extern int qcsapi_calcmd_get_tx_power(qcsapi_calcmd_tx_power_rsp *tx_power); + + +/** + * \brief set target tx power + * + * This API call is used to set TX power. + * + * \param ifname \wifi0 + * + * \value target power to transmission + * + * \return >= 0 on success, < 0 on error. If success, stats contains + * + * \callqcsapi + * + * call_qcsapi set_test_mode_tx_power calcmd \ + */ + +extern int qcsapi_calcmd_set_tx_power(qcsapi_unsigned_int tx_power); + + +/** + * \brief get RSSI value + * + * This API call is used to retrieve RSSI value in test mode. + * + * \param ifname \wifi0 + * + * \return >= 0 on success, < 0 on error. If success, stats contains + * + * \callqcsapi + * + * call_qcsapi get_test_mode_rssi calcmd + * + * Output is RSSI value. + */ + +extern int qcsapi_calcmd_get_test_mode_rssi(qcsapi_calcmd_rssi_rsp *test_mode_rssi); + + +/** + * \brief set mac filter + * + * This API call is used to set mac filter. + * + * \param q_num the contention queue number + * + * \param sec_enable the security if enable or not + * + * \param mac_addr the mac address which the device is used to filter the packet + * + * \return >= 0 on success, < 0 on error. If success, stats contains + * + * \callqcsapi + * + * call_qcsapi calcmd_set_mac_filter calcmd \ \ \ + * + * Unless an error occurs, the output will be the string complete. + * + * Example:
+ * call_qcsapi calcmd_set_mac_filter calcmd 0 2 00:11:22:33:44:55 + */ + +extern int qcsapi_calcmd_set_mac_filter(int q_num, int sec_enable, const qcsapi_mac_addr mac_addr); + + +/** + * \brief get number of antenna + * + * This API call is used to retrieve auntenna counter in test mode. + * + * \param ifname \wifi0 + * + * \return >= 0 on success, < 0 on error. If success, stats contains + * + * \callqcsapi + * + * call_qcsapi get_antenna_counter calcmd + * + * Output is number of antenna. + */ + +extern int qcsapi_calcmd_get_antenna_count(qcsapi_unsigned_int *antenna_count); + + +/** + * \brief clear tx/rx counter + * + * This API call is used to clear counter of tx/rx packets. + * + * \param ifname \wifi0 + * + * \return >= 0 on success, < 0 on error. If success, stats contains + * + * \callqcsapi + * + * call_qcsapi calcmd_clear_counter calcmd + */ + +extern int qcsapi_calcmd_clear_counter(void); + +/** + * \brief get firmware info + * + * This API call is used to retrieve firmware information. + * + * \param output_info + * + * \return >= 0 on success, < 0 on error. + * + * \callqcsapi + * + * call_qcsapi get_info wifi0 + * + * Output is firmware info. + */ +extern int qcsapi_calcmd_get_info(string_1024 output_info); +/**@}*/ + +/**@addtogroup WOWLAN_group + *@{*/ + +/** + * \brief set WOWLAN match type + * + * This API call is used to set which type to use to match WOWLAN packet + * + * \param ifname \wifi0 + * \param wowlan_match '1' (L2 ether type) or '2' (L3 UDP), default is 0 match either of them + * \note This API works across all wifi interfaces. + * + * \return >= 0 on success, < 0 on error. + * + * \call_qcsapi + * + * call_qcsapi wowlan_match_type \ {0 | 1 | 2} + */ +extern int qcsapi_wowlan_set_match_type( const char *ifname, const uint32_t wowlan_match); + +/** + * \brief set WOWLAN L2 ether type + * + * This API call is used to set the ehter type value when using L2 to do matching + * + * \param ifname \wifi0 + * \param ether_type ether type value. 0x0842 will be used by default. + * \note This API works across all wifi interfaces. + * + * \return >= 0 on success, < 0 on error. + * + * \call_qcsapi + * + * call_qcsapi wowlan_L2_type \ <\ether type\> + */ +extern int qcsapi_wowlan_set_L2_type( const char *ifname, const uint32_t ether_type); + +/** + * \brief set WOWLAN L3 UDP destination port + * + * This API call is used to set UDP destination port when using UDP to do matching + * + * \param ifname \wifi0 + * \param udp_port UDP destination port value. By default 7 or 9 will be used + * \note This API works across all wifi interfaces. + * + * \return >= 0 on success, < 0 on error. + * + * \call_qcsapi + * + * call_qcsapi wowlan_udp_port \ <\udp dest port\> + */ +extern int qcsapi_wowlan_set_udp_port( const char *ifname, const uint32_t udp_port); + +/** + * \brief set user self-defined WOWLAN match pattern + * + * This API call is used to set user self-defined pattern. + * + * \param ifname \wifi0 + * \param pattern pattern array, 256 bytes in total length. + * Default format is 6 bytes of all 255 (FF FF FF FF FF FF in hexadecimal), + * followed by sixteen repetitions of BSSID or host CPU's MAC address + * \param len length of pattern + * \note This API works across all wifi interfaces. + * + * \return >= 0 on success, < 0 on error. + * + * \call_qcsapi + * + * call_qcsapi wowlan_pattern \ <\pattern\>\<\len\> + */ +extern int qcsapi_wowlan_set_magic_pattern(const char *ifname, struct qcsapi_data_256bytes *pattern, uint32_t len); + +/** + * \brief Get host CPU's power save state. + * + * This API is used to get host CPU's power save state. + * + * \param ifname \wifi0 + * \param p_value Buffer contains state of host CPU, 1: host in power save state, 0 : not. + * \param len Buffer contains the length of the return parameter value. + * \return negative value on error, 0 on success. + * + * \callqcsapi + * + * call_qcsapi wowlan_get_host_state \ + * + * Unless an error occurs, the output will be the value of the host state. + */ +extern int qcsapi_wifi_wowlan_get_host_state(const char *ifname, uint16_t *p_value, uint32_t *len); +/** + * \brief Get WOWLAN match type. + * This API is used to get which match type is used for current WOWLAN filtering. + * + * \param ifname \wifi0 + * \param p_value Buffer contains match type value, 0: default, 1: L2 ether type matching, 2: UDP port matching. + * \param len Buffer contains the length of the return parameter value. + * \return negative value on error, 0 on success. + * + * \callqcsapi + * + * call_qcsapi wowlan_get_match_type \ + * + * Unless an error occurs, the output will be the value of the match type. + */ +extern int qcsapi_wifi_wowlan_get_match_type(const char *ifname, uint16_t *p_value, uint32_t *len); +/** + * \brief Get WOWLAN ether type value. + * + * This API is used to ether type value used for current WOWLAN filtering. + * + * \param ifname \wifi0 + * \param p_value Buffer contains ether type value. + * \param len Buffer contains the length of the return parameter value. + * \return negative value on error, 0 on success. + * + * \callqcsapi + * + * call_qcsapi wowlan_get_L2_type \ + * + * Unless an error occurs, the output will be the value of the ether type. + */ +extern int qcsapi_wifi_wowlan_get_l2_type(const char *ifname, uint16_t *p_value, uint32_t *len); +/** + * \brief Get WOWLAN UDP destination port. + * + * This API is used to get UDP destination port value used for current WOWLAN filtering. + * + * \param ifname \wifi0 + * \param p_value Buffer contains udp port value. + * \param len Buffer contains the length of the return parameter value. + * \return negative value on error, 0 on success. + * + * \callqcsapi + * + * call_qcsapi wowlan_get_udp_port \ + * + * Unless an error occurs, the output will be the value of the udp port. + */ +extern int qcsapi_wifi_wowlan_get_udp_port(const char *ifname, uint16_t *p_value, uint32_t *len); +/** + * \brief Get WOWLAN magci pattern. + * + * This API is used to get magic pattern used for current WOWLAN filtering. + * + * \param ifname \wifi0 + * \param p_value Buffer contains magic pattern in the format of "010203998877". + * \param len Buffer contains the length of the return parameter value. + * \return negative value on error, 0 on success. + * + * \callqcsapi + * + * call_qcsapi wowlan_get_pattern \ + * + * Unless an error occurs, the output will be the value of the + * magic pattern and its length. + */ +extern int qcsapi_wifi_wowlan_get_magic_pattern(const char *ifname, struct qcsapi_data_256bytes *p_value, uint32_t *len); +/**@}*/ + +/**@addtogroup MU_group + *@{*/ + +/** + * \brief Enable/disable MU-MIMO functionality on AP + * + * This API call is used to enable/disable MU-MIMO functionality on AP + * + * \note This API only applies for an AP. + * + * \param ifname \wifi0 + * \param mu_enable 1 to enable MU-MIMO, 0 to disable it + * + * \return 0 if the command succeeded. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi set_enable_mu \ \ + * + * Unless an error occurs, the output will be the string complete. + */ +extern int qcsapi_wifi_set_enable_mu(const char *ifname, const unsigned int mu_enable); + +/** + * \brief Get the status of MU-MIMO, if it is enabled or not + * + * This API call is used to get the the status of MU-MIMO + * + * \param ifname \wifi0 + * \param mu_enable return value storing a flag showing if MU-MIMO is enabled or not + * + * \return >= 0 on success, < 0 on error. + * + * \callqcsapi + * + * call_qcsapi get_enable_mu \ + * + * Unless an error occurs, the output will be the MU-MIMO enable flag + */ +extern int qcsapi_wifi_get_enable_mu(const char *ifname, unsigned int * mu_enable); + +/** + * \brief Enable/disable MU-MIMO precoding matrix for the group on AP + * + * This API call is used to enable/disable MU-MIMO precoding matrix for the group + * + * \param ifname \wifi0 + * \param grp MU-MIMO group ID, the valid range is [1-62] + * \param prec_enable 1 to enable MU-MIMO precoding matrix for the group, 0 to disable it + * + * \return 0 if the command succeeded. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi set_mu_use_precode \ \ \ + * + * Unless an error occurs, the output will be the string complete. + */ +extern int qcsapi_wifi_set_mu_use_precode(const char *ifname, const unsigned int grp, + const unsigned int prec_enable); + +/** + * \brief Get the status of MU-MIMO precoding matric for the group, if it is enabled or not + * + * This API call is used to get the the status of MU-MIMO precoding matrix +* + * \note This API only applies for an AP. + * + * \param ifname \wifi0 + * \param grp MU-MIMO group ID, the valid range is [1-62] + * \param prec_enable return value storing a flag showing if MU-MIMO precoding matrix is + * enabled or not + * + * \return >= 0 on success, < 0 on error. + * + * \callqcsapi + * + * call_qcsapi get_mu_use_precode \ \ + * + * Unless an error occurs, the output will be the MU-MIMO enable flag + */ +extern int qcsapi_wifi_get_mu_use_precode(const char *ifname, const unsigned int grp, + unsigned int * prec_enable); + +/** + * \brief Enable/disable MU equalizer on STA + * + * This API call is used to enable/disable MU-MIMO equalizer on STA + * + * \note This API only applies for an STA. + * + * \param ifname \wifi0 + * \param eq_enable 1 to enable equalizer, 0 to disable it + * + * \return 0 if the command succeeded. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi set_mu_use_eq \ \ + * + * Unless an error occurs, the output will be the string complete. + */ +extern int qcsapi_wifi_set_mu_use_eq(const char *ifname, const unsigned int eq_enable); + +/** + * \brief Get the status of MU equalizer, if it is enabled or not + * + * This API call is used to get the the status of MU equalizer +* + * \note This API only applies for an STA. + * + * \param ifname \wifi0 + * \param mu_enable return value storing a flag showing if MU equalizer is enabled or not + * + * \return >= 0 on success, < 0 on error. + * + * \callqcsapi + * + * call_qcsapi get_mu_use_eq \ + * + * Unless an error occurs, the output will be the MU equalizer enable flag + */ +extern int qcsapi_wifi_get_mu_use_eq(const char *ifname, unsigned int * meq_enable); + +/** + * \brief Get information about MU-MIMO groups formed + * + * This API call is used to get information about MU-MIMO groups + * + * \param ifname \wifi0 + * \param buf pointer to a buffer where the resulted information is placed to + * \param size size of the buffer + * + * \return >= 0 the number of bytes returned in the buf, < 0 on error. + * + * \callqcsapi + * + * call_qcsapi get_mu_groups \ + * + * Unless an error occurs, the output on AP will be MU groups information in the following form + *GRP ID: 1 update cnt 304 Enabled + * Rank: 44468 + * AID0: 0x0001 AID1: 0x0004 + * IDX0: 5 IDX1: 8 + * u0_1ss_u1_1ss: 0x0 + * u0_2ss_u1_1ss: 0x21 + * u0_3ss_u1_1ss: 0x52 + * u0_1ss_u1_2ss: 0x93 + * u0_1ss_u1_3ss: 0xc4 + * u0_2ss_u1_2ss: 0x105 +.* The same table is repeated for each existing groups group + * For the STA the output will be + * AP GRP ID: 1 update cnt 0 + * User pos = 0 with AID = 0x0004 + * The same table is reapeated for every group the STA belongs to + */ +extern int qcsapi_wifi_get_mu_groups(const char *ifname, char * buf, const unsigned int size); + +/**@}*/ + +/**@addtogroup TDLS_group + *@{*/ + +/** + * \brief enable TDLS + * + * This API call is used to enable or disable tdls + * + * \Note: This API is only used on a station. + * + * \param ifname \wifi0 + * \param enable_tdls disable or enable tdls, 0 disable, 1 enable + * + * \return 0 if the command succeeded. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi enable_tdls \ <0 | 1> + * + * Unless an error occurs, the output will be the string complete. + */ +extern int qcsapi_wifi_enable_tdls(const char *ifname, uint32_t enable_tdls); + +/** + * \brief enable TDLS over Qhop + * + * This API call is used to enable or disable tdls over Qhop + * + * \Note: This API is only used on a station. + * + * \param ifname \wifi0 + * \param tdls_over_qhop_en disable or enable tdls over qhop, 0 disable, 1 enable + * + * \return 0 if the command succeeded. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi enable_tdls_over_qhop \ <0 | 1> + * + * Unless an error occurs, the output will be the string complete. + */ +extern int qcsapi_wifi_enable_tdls_over_qhop(const char *ifname, uint32_t tdls_over_qhop_en); + +/** + * \brief get TDLS status + * + * This API call is used to retrieve TDLS status, if TDLS is enable, also display current TDLS path select mode + * + * \Note: This API is only used on a station. + * + * \param ifname \wifi0 + * \param p_tdls_status return parameter to store the TDLS status + * + * \return >= 0 on success, < 0 on error. If success, TDLS status contain + * + * \callqcsapi + * + * call_qcsapi get_tdls_status \ + * + * Unless an error occurs, the output will be the TDLS related status. + */ +extern int qcsapi_wifi_get_tdls_status(const char *ifname, uint32_t *p_tdls_status); + +/** + * \brief set TDLS parameters + * + * This API call is used to set TDLS parameters + * + * \Note: This API is only used on a station. + * + * \param ifname \wifi0 + * \param type tdls parameter type, used to indentify tdls parameter + * \param param_value parameter value set to system + * + * \return 0 if the command succeeded. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi set_tdls_params \ \ \ + * + * where parameter name is one of link_timeout_time, link_weight, + * disc_interval, training_pkt_cnt, path_sel_pps_thrshld, + * path_sel_rate_thrshld min_valid_rssi link_switch_ints + * phy_rate_weight mode indication_window node_life_cycle + * chan_switch_mode chan_switch_off_chan or chan_switch_off_chan_bw + * + * Unless an error occurs, the output will be the string complete. + */ +extern int qcsapi_wifi_set_tdls_params(const char *ifname, qcsapi_tdls_type type, int param_value); + +/** + * \internal + * \brief get TDLS parameters + * + * This API call is used to retrieve TDLS parameters + * + * \Note: This API is only used on a station. + * + * \param ifname \wifi0 + * \param type tdls parameter type, used to indentify tdls parameter + * \param p_value return parameter to store the TDLS parameter value + * + * \return >= 0 on success, < 0 on error. If success, TDLS parameter value contain + * + * \callqcsapi + * + * call_qcsapi get_tdls_params \ + * + * Unless an error occurs, the output will be the TDLS related parameter value. + */ +extern int qcsapi_wifi_get_tdls_params(const char *ifname, qcsapi_tdls_type type, int *p_value); + +/** + * \brief excute TDLS operation + * + * This API call is used to excute TDLS operation + * + * \Note: This API is only used on a station. + * + * \param ifname \wifi0 + * \param operate TDLS operation type, indentify TDLS operation + * \param mac_addr_str peer station mac address string, its format is "xx:xx:xx:xx:xx:xx" + * \param cs_interval channel switch interval as milliseconds, only required by operation switch_chan, + * 0 indicates to stop the channel switch. + * + * \return 0 if the command succeeded. + * \return A negative value if an error occurred. See @ref mysection4_1_4 "QCSAPI Return Values" + * for error codes and messages. + * + * \callqcsapi + * + * call_qcsapi tdls_operate \ \ \ [cs_interval] + * + * where operation name is one of discover, setup, teardown + * or switch_chan + * + * Unless an error occurs, the output will be the string complete. + */ +extern int qcsapi_wifi_tdls_operate(const char *ifname, qcsapi_tdls_oper operate, + const char *mac_addr_str, int cs_interval); +/**@}*/ + +#ifdef __cplusplus +} +#endif + +#endif /* _QCSAPI_H */ + diff --git a/package/firmware/quantenna/src/qcsapi_driver.c b/package/firmware/quantenna/src/qcsapi_driver.c new file mode 100644 index 000000000..dbb333ad8 --- /dev/null +++ b/package/firmware/quantenna/src/qcsapi_driver.c @@ -0,0 +1,2545 @@ +/*SH0 +******************************************************************************* +** ** +** Copyright (c) 2009 - 2012 Quantenna Communications, Inc. ** +** ** +** File : qcsapi_driver.c ** +** Description : ** +** ** +******************************************************************************* +** ** +** Redistribution and use in source and binary forms, with or without ** +** modification, are permitted provided that the following conditions ** +** are met: ** +** 1. Redistributions of source code must retain the above copyright ** +** notice, this list of conditions and the following disclaimer. ** +** 2. Redistributions in binary form must reproduce the above copyright ** +** notice, this list of conditions and the following disclaimer in the ** +** documentation and/or other materials provided with the distribution. ** +** 3. The name of the author may not be used to endorse or promote products ** +** derived from this software without specific prior written permission. ** +** ** +** Alternatively, this software may be distributed under the terms of the ** +** GNU General Public License ("GPL") version 2, or (at your option) any ** +** later version as published by the Free Software Foundation. ** +** ** +** In the case this software is distributed under the GPL license, ** +** you should have received a copy of the GNU General Public License ** +** along with this software; if not, write to the Free Software ** +** Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ** +** ** +** THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR ** +** IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES** +** OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. ** +** IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, ** +** INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT ** +** NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,** +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ** +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ** +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF ** +** THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ** +** ** +******************************************************************************* +EH0*/ + +#include + +#include "qcsapi.h" +#include "qcsapi_driver.h" + +static const qcsapi_entry qcsapi_entry_table[] = +{ + { e_qcsapi_errno_get_message, + e_qcsapi_get_system_value, + e_qcsapi_none, + e_qcsapi_string + }, + { e_qcsapi_store_ipaddr, + e_qcsapi_set_system_value, + e_qcsapi_none, + e_qcsapi_integer + }, + { e_qcsapi_interface_enable, + e_qcsapi_set_api, + e_qcsapi_none, + e_qcsapi_integer + }, + { e_qcsapi_interface_get_BSSID, + e_qcsapi_get_api, + e_qcsapi_none, + e_qcsapi_mac_addr + }, + { e_qcsapi_interface_get_mac_addr, + e_qcsapi_get_api, + e_qcsapi_none, + e_qcsapi_mac_addr + }, + { e_qcsapi_interface_set_mac_addr, + e_qcsapi_set_api, + e_qcsapi_none, + e_qcsapi_mac_addr + }, + { e_qcsapi_interface_get_counter, + e_qcsapi_get_api, + e_qcsapi_counter, + e_qcsapi_unsigned_int + }, + { e_qcsapi_interface_get_counter64, + e_qcsapi_get_api, + e_qcsapi_counter, + e_qcsapi_unsigned_int + }, + { e_qcsapi_pm_get_counter, + e_qcsapi_get_api, + e_qcsapi_counter, + e_qcsapi_unsigned_int + }, + { e_qcsapi_pm_get_elapsed_time, + e_qcsapi_get_system_value, + e_qcsapi_none, + e_qcsapi_unsigned_int + }, + { e_qcsapi_flash_image_update, + e_qcsapi_get_system_value, + e_qcsapi_none, + e_qcsapi_string + }, + { e_qcsapi_firmware_get_version, + e_qcsapi_get_system_value, + e_qcsapi_none, + e_qcsapi_string + }, + { e_qcsapi_system_get_time_since_start, + e_qcsapi_get_system_value, + e_qcsapi_none, + e_qcsapi_unsigned_int + }, + { e_qcsapi_get_system_status, + e_qcsapi_get_system_value, + e_qcsapi_none, + e_qcsapi_unsigned_int + }, + { e_qcsapi_get_random_seed, + e_qcsapi_get_system_value, + e_qcsapi_none, + e_qcsapi_nosuch_specific_parameter + }, + { e_qcsapi_set_random_seed, + e_qcsapi_set_system_value, + e_qcsapi_none, + e_qcsapi_nosuch_specific_parameter + }, + { e_qcsapi_led_get, + e_qcsapi_get_system_value, + e_qcsapi_LED, + e_qcsapi_unsigned_int + }, + { e_qcsapi_led_set, + e_qcsapi_set_system_value, + e_qcsapi_LED, + e_qcsapi_unsigned_int + }, + { e_qcsapi_led_pwm_enable, + e_qcsapi_set_system_value, + e_qcsapi_LED, + e_qcsapi_unsigned_int + }, + { e_qcsapi_led_brightness, + e_qcsapi_set_system_value, + e_qcsapi_LED, + e_qcsapi_unsigned_int + }, + { e_qcsapi_gpio_get_config, + e_qcsapi_get_system_value, + e_qcsapi_LED, + e_qcsapi_unsigned_int + }, + { e_qcsapi_gpio_set_config, + e_qcsapi_set_system_value, + e_qcsapi_LED, + e_qcsapi_unsigned_int + }, + { e_qcsapi_gpio_enable_wps_push_button, + e_qcsapi_set_system_value, + e_qcsapi_LED, + e_qcsapi_unsigned_int + }, + { e_qcsapi_file_path_get_config, + e_qcsapi_get_system_value, + e_qcsapi_file_path_config, + e_qcsapi_string + }, + { e_qcsapi_file_path_set_config, + e_qcsapi_set_system_value, + e_qcsapi_file_path_config, + e_qcsapi_string + }, + { e_qcsapi_wifi_set_wifi_macaddr, + e_qcsapi_set_system_value, + e_qcsapi_none, + e_qcsapi_string + }, + { e_qcsapi_wifi_create_restricted_bss, + e_qcsapi_set_api_without_parameter, + e_qcsapi_none, + e_qcsapi_nosuch_specific_parameter + }, + { e_qcsapi_wifi_create_bss, + e_qcsapi_set_api_without_parameter, + e_qcsapi_none, + e_qcsapi_nosuch_specific_parameter + }, + { e_qcsapi_wifi_remove_bss, + e_qcsapi_set_api_without_parameter, + e_qcsapi_none, + e_qcsapi_nosuch_specific_parameter + }, + { e_qcsapi_wifi_get_primary_interface, + e_qcsapi_get_api_without_ifname_parameter, + e_qcsapi_none, + e_qcsapi_nosuch_specific_parameter + }, + { e_qcsapi_wifi_get_interface_by_index, + e_qcsapi_get_api_without_ifname, + e_qcsapi_index, + e_qcsapi_nosuch_specific_parameter + }, + { e_qcsapi_wifi_get_mode, + e_qcsapi_get_api, + e_qcsapi_none, + e_qcsapi_wifi_mode + }, + { e_qcsapi_wifi_set_mode, + e_qcsapi_set_api, + e_qcsapi_none, + e_qcsapi_wifi_mode + }, + { e_qcsapi_wifi_get_phy_mode, + e_qcsapi_get_api, + e_qcsapi_none, + e_qcsapi_wifi_mode + }, + { e_qcsapi_wifi_set_phy_mode, + e_qcsapi_set_api, + e_qcsapi_none, + e_qcsapi_wifi_mode + }, + { e_qcsapi_wifi_reload_in_mode, + e_qcsapi_set_api, + e_qcsapi_none, + e_qcsapi_wifi_mode + }, + { e_qcsapi_wifi_rfenable, + e_qcsapi_set_system_value, + e_qcsapi_none, + e_qcsapi_unsigned_int + }, + { e_qcsapi_wifi_rfstatus, + e_qcsapi_get_api_without_ifname, + e_qcsapi_none, + e_qcsapi_unsigned_int + }, + { e_qcsapi_wifi_startprod, + e_qcsapi_get_api_without_ifname_parameter, + e_qcsapi_none, + e_qcsapi_none + }, + { e_qcsapi_wifi_get_bw, + e_qcsapi_get_api, + e_qcsapi_none, + e_qcsapi_unsigned_int + }, + { e_qcsapi_wifi_set_bw, + e_qcsapi_set_api, + e_qcsapi_none, + e_qcsapi_unsigned_int + }, + { e_qcsapi_wifi_get_BSSID, + e_qcsapi_get_api, + e_qcsapi_none, + e_qcsapi_mac_addr + }, + { e_qcsapi_wifi_get_config_BSSID, + e_qcsapi_get_api, + e_qcsapi_none, + e_qcsapi_mac_addr + }, + { e_qcsapi_wifi_ssid_get_bssid, + e_qcsapi_get_api, + e_qcsapi_select_SSID, + e_qcsapi_mac_addr + }, + { e_qcsapi_wifi_ssid_set_bssid, + e_qcsapi_set_api, + e_qcsapi_select_SSID, + e_qcsapi_mac_addr + }, + { e_qcsapi_wifi_get_SSID, + e_qcsapi_get_api, + e_qcsapi_none, + e_qcsapi_SSID_param + }, + { e_qcsapi_wifi_set_SSID, + e_qcsapi_set_api, + e_qcsapi_none, + e_qcsapi_SSID_param + }, + { e_qcsapi_wifi_get_channel, + e_qcsapi_get_api, + e_qcsapi_none, + e_qcsapi_unsigned_int + }, + { e_qcsapi_wifi_set_channel, + e_qcsapi_set_api, + e_qcsapi_none, + e_qcsapi_unsigned_int + }, + { e_qcsapi_wifi_get_auto_channel, + e_qcsapi_get_api, + e_qcsapi_none, + e_qcsapi_none + }, + { e_qcsapi_wifi_set_auto_channel, + e_qcsapi_set_api, + e_qcsapi_none, + e_qcsapi_string + }, + { e_qcsapi_wifi_get_standard, + e_qcsapi_get_api, + e_qcsapi_none, + e_qcsapi_string + }, + { e_qcsapi_wifi_get_dtim, + e_qcsapi_get_api, + e_qcsapi_none, + e_qcsapi_unsigned_int + }, + { e_qcsapi_wifi_set_dtim, + e_qcsapi_set_api, + e_qcsapi_none, + e_qcsapi_unsigned_int + }, + { e_qcsapi_wifi_get_assoc_limit, + e_qcsapi_get_api, + e_qcsapi_none, + e_qcsapi_unsigned_int + }, + { e_qcsapi_wifi_set_assoc_limit, + e_qcsapi_set_api, + e_qcsapi_none, + e_qcsapi_unsigned_int + }, + { e_qcsapi_wifi_get_bss_assoc_limit, + e_qcsapi_get_api, + e_qcsapi_none, + e_qcsapi_unsigned_int + }, + { e_qcsapi_wifi_set_bss_assoc_limit, + e_qcsapi_set_api, + e_qcsapi_none, + e_qcsapi_unsigned_int + }, + { e_qcsapi_interface_get_status, + e_qcsapi_get_api, + e_qcsapi_none, + e_qcsapi_string + }, + { e_qcsapi_interface_set_ip4, + e_qcsapi_set_api, + e_qcsapi_none, + e_qcsapi_string + }, + { e_qcsapi_interface_get_ip4, + e_qcsapi_get_api, + e_qcsapi_none, + e_qcsapi_string + }, + { e_qcsapi_wifi_get_list_channels, + e_qcsapi_get_api, + e_qcsapi_none, + e_qcsapi_string + }, + { e_qcsapi_wifi_get_mode_switch, + e_qcsapi_get_system_value, + e_qcsapi_none, + e_qcsapi_unsigned_int + }, + { e_qcsapi_wifi_get_noise, + e_qcsapi_get_api, + e_qcsapi_none, + e_qcsapi_integer + }, + { e_qcsapi_wifi_get_rssi_by_chain, + e_qcsapi_get_api, + e_qcsapi_none, + e_qcsapi_integer + }, + { e_qcsapi_wifi_get_avg_snr, + e_qcsapi_get_api, + e_qcsapi_none, + e_qcsapi_integer + }, + { e_qcsapi_wifi_get_option, + e_qcsapi_get_api, + e_qcsapi_option, + e_qcsapi_integer + }, + { e_qcsapi_wifi_set_option, + e_qcsapi_set_api, + e_qcsapi_option, + e_qcsapi_integer + }, + { e_qcsapi_get_board_parameter, + e_qcsapi_get_system_value, + e_qcsapi_board_parameter, + e_qcsapi_integer + }, + { e_qcsapi_wifi_get_rates, + e_qcsapi_get_api, + e_qcsapi_rates, + e_qcsapi_string + }, + { e_qcsapi_wifi_set_rates, + e_qcsapi_set_api, + e_qcsapi_rates, + e_qcsapi_string + }, + { e_qcsapi_wifi_set_max_bitrate, + e_qcsapi_set_api, + e_qcsapi_none, + e_qcsapi_string + }, + { e_qcsapi_wifi_get_max_bitrate, + e_qcsapi_get_api, + e_qcsapi_none, + e_qcsapi_string + }, + { e_qcsapi_wifi_get_beacon_type, + e_qcsapi_get_api, + e_qcsapi_none, + e_qcsapi_string + }, + { e_qcsapi_wifi_set_beacon_type, + e_qcsapi_set_api, + e_qcsapi_none, + e_qcsapi_string + }, + { e_qcsapi_wifi_get_beacon_interval, + e_qcsapi_get_api, + e_qcsapi_none, + e_qcsapi_unsigned_int + }, + { e_qcsapi_wifi_set_beacon_interval, + e_qcsapi_set_api, + e_qcsapi_none, + e_qcsapi_unsigned_int + }, + { e_qcsapi_wifi_get_list_regulatory_regions, + e_qcsapi_get_system_value, + e_qcsapi_none, + e_qcsapi_string + }, + { e_qcsapi_wifi_get_regulatory_tx_power, + e_qcsapi_get_api, + e_qcsapi_none, + e_qcsapi_integer + }, + { e_qcsapi_wifi_get_configured_tx_power, + e_qcsapi_get_api, + e_qcsapi_none, + e_qcsapi_string + }, + { e_qcsapi_wifi_set_regulatory_channel, + e_qcsapi_set_api, + e_qcsapi_none, + e_qcsapi_string + }, + { e_qcsapi_wifi_set_regulatory_region, + e_qcsapi_set_api, + e_qcsapi_none, + e_qcsapi_string + }, + { e_qcsapi_wifi_get_regulatory_region, + e_qcsapi_get_api, + e_qcsapi_none, + e_qcsapi_string + }, + { e_qcsapi_wifi_overwrite_country_code, + e_qcsapi_set_api, + e_qcsapi_none, + e_qcsapi_string + }, + { e_qcsapi_wifi_get_list_regulatory_channels, + e_qcsapi_get_system_value, + e_qcsapi_none, + e_qcsapi_string + }, + { e_qcsapi_wifi_get_list_regulatory_bands, + e_qcsapi_get_system_value, + e_qcsapi_none, + e_qcsapi_string + }, + { e_qcsapi_wifi_get_regulatory_db_version, + e_qcsapi_get_api_without_ifname, + e_qcsapi_none, + e_qcsapi_string + }, + { e_qcsapi_wifi_set_regulatory_tx_power_cap, + e_qcsapi_set_api, + e_qcsapi_none, + e_qcsapi_unsigned_int + }, + { e_qcsapi_wifi_restore_regulatory_tx_power, + e_qcsapi_set_api_without_parameter, + e_qcsapi_none, + e_qcsapi_none + }, + { e_qcsapi_wifi_set_chan_pri_inactive, + e_qcsapi_set_api, + e_qcsapi_none, + e_qcsapi_unsigned_int + }, + { e_qcsapi_wifi_set_chan_disabled, + e_qcsapi_set_api, + e_qcsapi_none, + e_qcsapi_unsigned_int + }, + { e_qcsapi_wifi_get_chan_disabled, + e_qcsapi_get_api, + e_qcsapi_none, + e_qcsapi_string + }, + { e_qcsapi_wifi_get_tx_power, + e_qcsapi_get_api, + e_qcsapi_none, + e_qcsapi_string + }, + { e_qcsapi_wifi_set_tx_power, + e_qcsapi_set_api, + e_qcsapi_none, + e_qcsapi_string + }, + { e_qcsapi_wifi_get_tx_power_ext, + e_qcsapi_get_api, + e_qcsapi_none, + e_qcsapi_string + }, + { e_qcsapi_wifi_set_tx_power_ext, + e_qcsapi_set_api, + e_qcsapi_none, + e_qcsapi_string + }, + { e_qcsapi_wifi_get_chan_power_table, + e_qcsapi_get_api, + e_qcsapi_none, + e_qcsapi_string + }, + { e_qcsapi_wifi_set_chan_power_table, + e_qcsapi_set_api, + e_qcsapi_none, + e_qcsapi_string + }, + { e_qcsapi_wifi_get_bw_power, + e_qcsapi_get_api, + e_qcsapi_none, + e_qcsapi_string + }, + { e_qcsapi_wifi_set_bw_power, + e_qcsapi_set_api, + e_qcsapi_none, + e_qcsapi_string + }, + { e_qcsapi_wifi_get_bf_power, + e_qcsapi_get_api, + e_qcsapi_none, + e_qcsapi_string + }, + { e_qcsapi_wifi_set_bf_power, + e_qcsapi_set_api, + e_qcsapi_none, + e_qcsapi_string + }, + { e_qcsapi_wifi_get_power_selection, + e_qcsapi_get_system_value, + e_qcsapi_none, + e_qcsapi_string + }, + { e_qcsapi_wifi_set_power_selection, + e_qcsapi_set_system_value, + e_qcsapi_none, + e_qcsapi_string + }, + { e_qcsapi_wifi_get_carrier_interference, + e_qcsapi_get_api, + e_qcsapi_none, + e_qcsapi_string + }, + { e_qcsapi_wifi_get_congestion_idx, + e_qcsapi_get_api, + e_qcsapi_none, + e_qcsapi_string + }, + { e_qcsapi_wifi_get_supported_tx_power_levels, + e_qcsapi_get_api, + e_qcsapi_none, + e_qcsapi_string + }, + { e_qcsapi_wifi_get_current_tx_power_level, + e_qcsapi_get_api, + e_qcsapi_none, + e_qcsapi_unsigned_int + }, + { e_qcsapi_wifi_set_power_constraint, + e_qcsapi_set_api, + e_qcsapi_none, + e_qcsapi_unsigned_int + }, + { e_qcsapi_wifi_get_power_constraint, + e_qcsapi_get_api, + e_qcsapi_none, + e_qcsapi_unsigned_int + }, + { e_qcsapi_wifi_set_tpc_interval, + e_qcsapi_set_api, + e_qcsapi_none, + e_qcsapi_integer + }, + { e_qcsapi_wifi_get_tpc_interval, + e_qcsapi_get_api, + e_qcsapi_none, + e_qcsapi_unsigned_int + }, + { e_qcsapi_wifi_get_assoc_records, + e_qcsapi_get_api, + e_qcsapi_none, + e_qcsapi_unsigned_int + }, + { e_qcsapi_wifi_get_list_DFS_channels, + e_qcsapi_get_system_value, + e_qcsapi_none, + e_qcsapi_string + }, + { e_qcsapi_wifi_is_channel_DFS, + e_qcsapi_get_system_value, + e_qcsapi_none, + e_qcsapi_string + }, + { e_qcsapi_wifi_get_DFS_alt_channel, + e_qcsapi_get_api, + e_qcsapi_none, + e_qcsapi_integer + }, + { e_qcsapi_wifi_set_DFS_alt_channel, + e_qcsapi_set_api, + e_qcsapi_none, + e_qcsapi_integer + }, + { e_qcsapi_wifi_set_DFS_reentry, + e_qcsapi_set_api_without_parameter, + e_qcsapi_none, + e_qcsapi_none + }, + { e_qcsapi_wifi_get_scs_cce_channels, + e_qcsapi_get_api, + e_qcsapi_none, + e_qcsapi_unsigned_int + }, + { e_qcsapi_wifi_get_dfs_cce_channels, + e_qcsapi_get_api, + e_qcsapi_none, + e_qcsapi_unsigned_int + }, + { e_qcsapi_wifi_get_csw_records, + e_qcsapi_get_api, + e_qcsapi_none, + e_qcsapi_none, + }, + { e_qcsapi_wifi_get_radar_status, + e_qcsapi_get_api, + e_qcsapi_none, + e_qcsapi_none, + }, + { e_qcsapi_wifi_get_WEP_encryption_level, + e_qcsapi_get_api, + e_qcsapi_none, + e_qcsapi_string + }, + { e_qcsapi_wifi_get_WPA_encryption_modes, + e_qcsapi_get_api, + e_qcsapi_none, + e_qcsapi_string + }, + { e_qcsapi_wifi_set_WPA_encryption_modes, + e_qcsapi_set_api, + e_qcsapi_none, + e_qcsapi_string + }, + { e_qcsapi_wifi_get_WPA_authentication_mode, + e_qcsapi_get_api, + e_qcsapi_none, + e_qcsapi_string + }, + { e_qcsapi_wifi_set_WPA_authentication_mode, + e_qcsapi_set_api, + e_qcsapi_none, + e_qcsapi_string + }, + { e_qcsapi_wifi_get_interworking, + e_qcsapi_get_api, + e_qcsapi_none, + e_qcsapi_string + }, + { e_qcsapi_wifi_set_interworking, + e_qcsapi_set_api, + e_qcsapi_none, + e_qcsapi_string + }, + { e_qcsapi_wifi_get_80211u_params, + e_qcsapi_get_api, + e_qcsapi_none, + e_qcsapi_string + }, + { e_qcsapi_wifi_set_80211u_params, + e_qcsapi_set_api, + e_qcsapi_none, + e_qcsapi_string + }, + { e_qcsapi_security_get_nai_realms, + e_qcsapi_get_api, + e_qcsapi_none, + e_qcsapi_string + }, + { e_qcsapi_security_add_nai_realm, + e_qcsapi_set_api, + e_qcsapi_none, + e_qcsapi_string + }, + { e_qcsapi_security_del_nai_realm, + e_qcsapi_set_api, + e_qcsapi_none, + e_qcsapi_string + }, + { e_qcsapi_security_add_roaming_consortium, + e_qcsapi_set_api, + e_qcsapi_none, + e_qcsapi_string + }, + { e_qcsapi_security_del_roaming_consortium, + e_qcsapi_set_api, + e_qcsapi_none, + e_qcsapi_string + }, + { e_qcsapi_security_get_roaming_consortium, + e_qcsapi_get_api, + e_qcsapi_none, + e_qcsapi_string + }, + { e_qcsapi_security_get_venue_name, + e_qcsapi_get_api, + e_qcsapi_none, + e_qcsapi_string + }, + { e_qcsapi_security_add_venue_name, + e_qcsapi_set_api, + e_qcsapi_none, + e_qcsapi_string + }, + { e_qcsapi_security_del_venue_name, + e_qcsapi_set_api, + e_qcsapi_none, + e_qcsapi_string + }, + { e_qcsapi_security_get_oper_friendly_name, + e_qcsapi_get_api, + e_qcsapi_none, + e_qcsapi_string + }, + { e_qcsapi_security_add_oper_friendly_name, + e_qcsapi_set_api, + e_qcsapi_none, + e_qcsapi_string + }, + { e_qcsapi_security_del_oper_friendly_name, + e_qcsapi_set_api, + e_qcsapi_none, + e_qcsapi_string + }, + { e_qcsapi_security_get_hs20_conn_capab, + e_qcsapi_get_api, + e_qcsapi_none, + e_qcsapi_string + }, + { e_qcsapi_security_add_hs20_conn_capab, + e_qcsapi_set_api, + e_qcsapi_none, + e_qcsapi_string + }, + { e_qcsapi_security_del_hs20_conn_capab, + e_qcsapi_set_api, + e_qcsapi_none, + e_qcsapi_string + }, + { e_qcsapi_wifi_get_hs20_status, + e_qcsapi_get_api, + e_qcsapi_none, + e_qcsapi_string + }, + { e_qcsapi_wifi_set_hs20_status, + e_qcsapi_set_api, + e_qcsapi_none, + e_qcsapi_string + }, + { e_qcsapi_wifi_get_proxy_arp, + e_qcsapi_get_api, + e_qcsapi_none, + e_qcsapi_string + }, + { e_qcsapi_wifi_set_proxy_arp, + e_qcsapi_set_api, + e_qcsapi_none, + e_qcsapi_string + }, + { e_qcsapi_wifi_get_l2_ext_filter, + e_qcsapi_get_api, + e_qcsapi_none, + e_qcsapi_unsigned_int + }, + { e_qcsapi_wifi_set_l2_ext_filter, + e_qcsapi_set_api, + e_qcsapi_none, + e_qcsapi_unsigned_int + }, + { e_qcsapi_wifi_get_hs20_params, + e_qcsapi_get_api, + e_qcsapi_none, + e_qcsapi_string + }, + { e_qcsapi_wifi_set_hs20_params, + e_qcsapi_set_api, + e_qcsapi_none, + e_qcsapi_string + }, + { e_qcsapi_remove_11u_param, + e_qcsapi_set_api, + e_qcsapi_none, + e_qcsapi_string + }, + { e_qcsapi_remove_hs20_param, + e_qcsapi_set_api, + e_qcsapi_none, + e_qcsapi_string + }, + { e_qcsapi_wifi_get_IEEE11i_encryption_modes, + e_qcsapi_get_api, + e_qcsapi_none, + e_qcsapi_string + }, + { e_qcsapi_wifi_set_IEEE11i_encryption_modes, + e_qcsapi_set_api, + e_qcsapi_none, + e_qcsapi_string + }, + { e_qcsapi_wifi_get_IEEE11i_authentication_mode, + e_qcsapi_get_api, + e_qcsapi_none, + e_qcsapi_string + }, + { e_qcsapi_wifi_set_IEEE11i_authentication_mode, + e_qcsapi_set_api, + e_qcsapi_none, + e_qcsapi_string + }, + { e_qcsapi_wifi_get_michael_errcnt, + e_qcsapi_get_api, + e_qcsapi_none, + e_qcsapi_unsigned_int + }, + { e_qcsapi_wifi_get_pre_shared_key, + e_qcsapi_get_api, + e_qcsapi_index, + e_qcsapi_string + }, + { e_qcsapi_wifi_set_pre_shared_key, + e_qcsapi_set_api, + e_qcsapi_index, + e_qcsapi_string + }, + { e_qcsapi_wifi_add_radius_auth_server_cfg, + e_qcsapi_set_api, + e_qcsapi_none, + e_qcsapi_string + }, + { e_qcsapi_wifi_del_radius_auth_server_cfg, + e_qcsapi_set_api, + e_qcsapi_none, + e_qcsapi_string + }, + { e_qcsapi_wifi_get_radius_auth_server_cfg, + e_qcsapi_get_api, + e_qcsapi_none, + e_qcsapi_string + }, + { e_qcsapi_wifi_set_own_ip_addr, + e_qcsapi_set_api, + e_qcsapi_none, + e_qcsapi_string + }, + { e_qcsapi_wifi_get_psk_auth_failures, + e_qcsapi_get_api, + e_qcsapi_none, + e_qcsapi_string + }, + { e_qcsapi_wifi_get_key_passphrase, + e_qcsapi_get_api, + e_qcsapi_index, + e_qcsapi_string + }, + { e_qcsapi_wifi_set_key_passphrase, + e_qcsapi_set_api, + e_qcsapi_index, + e_qcsapi_string + }, + { e_qcsapi_wifi_get_group_key_interval, + e_qcsapi_get_api, + e_qcsapi_none, + e_qcsapi_unsigned_int + }, + { e_qcsapi_wifi_set_group_key_interval, + e_qcsapi_set_api, + e_qcsapi_none, + e_qcsapi_unsigned_int + }, + { e_qcsapi_wifi_get_pmf, + e_qcsapi_get_api, + e_qcsapi_none, + e_qcsapi_unsigned_int + }, + { e_qcsapi_wifi_set_pmf, + e_qcsapi_set_api, + e_qcsapi_none, + e_qcsapi_unsigned_int + }, + { e_qcsapi_wifi_get_mac_address_filtering, + e_qcsapi_get_api, + e_qcsapi_none, + e_qcsapi_integer + }, + { e_qcsapi_wifi_set_mac_address_filtering, + e_qcsapi_set_api, + e_qcsapi_none, + e_qcsapi_integer + }, + { e_qcsapi_wifi_is_mac_address_authorized, + e_qcsapi_get_api, + e_qcsapi_none, + e_qcsapi_mac_addr + }, + { e_qcsapi_wifi_get_authorized_mac_addresses, + e_qcsapi_get_api, + e_qcsapi_none, + e_qcsapi_string + }, + { e_qcsapi_wifi_get_denied_mac_addresses, + e_qcsapi_get_api, + e_qcsapi_none, + e_qcsapi_string + }, + { e_qcsapi_wifi_authorize_mac_address, + e_qcsapi_set_api, + e_qcsapi_none, + e_qcsapi_mac_addr + }, + { e_qcsapi_wifi_deny_mac_address, + e_qcsapi_set_api, + e_qcsapi_none, + e_qcsapi_mac_addr + }, + { e_qcsapi_wifi_remove_mac_address, + e_qcsapi_set_api, + e_qcsapi_none, + e_qcsapi_mac_addr + }, + { e_qcsapi_wifi_clear_mac_address_filters, + e_qcsapi_set_api_without_parameter, + e_qcsapi_none, + e_qcsapi_nosuch_specific_parameter + }, + { e_qcsapi_wifi_set_mac_address_reserve, + e_qcsapi_set_api, + e_qcsapi_none, + e_qcsapi_nosuch_specific_parameter + }, + { e_qcsapi_wifi_get_mac_address_reserve, + e_qcsapi_get_api, + e_qcsapi_none, + e_qcsapi_nosuch_specific_parameter + }, + { e_qcsapi_wifi_clear_mac_address_reserve, + e_qcsapi_set_api_without_parameter, + e_qcsapi_none, + e_qcsapi_nosuch_specific_parameter + }, + { e_qcsapi_wifi_backoff_fail_max, + e_qcsapi_set_api, + e_qcsapi_none, + e_qcsapi_integer + }, + { e_qcsapi_wifi_backoff_timeout, + e_qcsapi_set_api, + e_qcsapi_none, + e_qcsapi_integer + }, + { e_qcsapi_wifi_get_count_associations, + e_qcsapi_get_api, + e_qcsapi_none, + e_qcsapi_unsigned_int + }, + { e_qcsapi_wifi_get_associated_device_mac_addr, + e_qcsapi_get_api, + e_qcsapi_index, + e_qcsapi_mac_addr + }, + { e_qcsapi_wifi_get_associated_device_ip_addr, + e_qcsapi_get_api, + e_qcsapi_index, + e_qcsapi_string + }, + { e_qcsapi_wifi_get_link_quality, + e_qcsapi_get_api, + e_qcsapi_index, + e_qcsapi_unsigned_int + }, + { e_qcsapi_wifi_get_rssi_per_association, + e_qcsapi_get_api, + e_qcsapi_index, + e_qcsapi_unsigned_int + }, + { e_qcsapi_wifi_get_rssi_in_dbm_per_association, + e_qcsapi_get_api, + e_qcsapi_index, + e_qcsapi_unsigned_int + }, + { e_qcsapi_wifi_get_snr_per_association, + e_qcsapi_get_api, + e_qcsapi_index, + e_qcsapi_unsigned_int + }, + { e_qcsapi_wifi_get_hw_noise_per_association, + e_qcsapi_get_api, + e_qcsapi_index, + e_qcsapi_unsigned_int + }, + { e_qcsapi_wifi_get_rx_bytes_per_association, + e_qcsapi_get_api, + e_qcsapi_index, + e_qcsapi_unsigned_int + }, + { e_qcsapi_wifi_get_tx_bytes_per_association, + e_qcsapi_get_api, + e_qcsapi_index, + e_qcsapi_unsigned_int + }, + { e_qcsapi_wifi_get_rx_packets_per_association, + e_qcsapi_get_api, + e_qcsapi_index, + e_qcsapi_unsigned_int + }, + { e_qcsapi_wifi_get_tx_packets_per_association, + e_qcsapi_get_api, + e_qcsapi_index, + e_qcsapi_unsigned_int + }, + { e_qcsapi_wifi_get_tx_err_packets_per_association, + e_qcsapi_get_api, + e_qcsapi_index, + e_qcsapi_unsigned_int + }, + { e_qcsapi_wifi_get_bw_per_association, + e_qcsapi_get_api, + e_qcsapi_index, + e_qcsapi_unsigned_int + }, + { e_qcsapi_wifi_get_tx_phy_rate_per_association, + e_qcsapi_get_api, + e_qcsapi_index, + e_qcsapi_unsigned_int + }, + { e_qcsapi_wifi_get_rx_phy_rate_per_association, + e_qcsapi_get_api, + e_qcsapi_index, + e_qcsapi_unsigned_int + }, + { e_qcsapi_wifi_get_tx_mcs_per_association, + e_qcsapi_get_api, + e_qcsapi_index, + e_qcsapi_unsigned_int + }, + { e_qcsapi_wifi_get_rx_mcs_per_association, + e_qcsapi_get_api, + e_qcsapi_index, + e_qcsapi_unsigned_int + }, + { e_qcsapi_wifi_get_achievable_tx_phy_rate_per_association, + e_qcsapi_get_api, + e_qcsapi_index, + e_qcsapi_unsigned_int + }, + { e_qcsapi_wifi_get_achievable_rx_phy_rate_per_association, + e_qcsapi_get_api, + e_qcsapi_index, + e_qcsapi_unsigned_int + }, + { e_qcsapi_wifi_get_auth_enc_per_association, + e_qcsapi_get_api, + e_qcsapi_index, + e_qcsapi_unsigned_int + }, + { e_qcsapi_wifi_get_tput_caps, + e_qcsapi_get_api, + e_qcsapi_index, + e_qcsapi_nosuch_specific_parameter + }, + { e_qcsapi_wifi_get_connection_mode, + e_qcsapi_get_api, + e_qcsapi_index, + e_qcsapi_unsigned_int + }, + { e_qcsapi_wifi_get_vendor_per_association, + e_qcsapi_get_api, + e_qcsapi_index, + e_qcsapi_unsigned_int + }, + { e_qcsapi_wifi_get_max_mimo, + e_qcsapi_get_api, + e_qcsapi_index, + e_qcsapi_string + }, + { e_qcsapi_wifi_get_node_counter, + e_qcsapi_get_api, + e_qcsapi_index, + e_qcsapi_unsigned_int + }, + { e_qcsapi_wifi_get_node_param, + e_qcsapi_get_api, + e_qcsapi_index, + e_qcsapi_integer + }, + { e_qcsapi_wifi_get_node_stats, + e_qcsapi_get_api, + e_qcsapi_index, + e_qcsapi_integer + }, + { e_qcsapi_wifi_get_max_queued, + e_qcsapi_get_api, + e_qcsapi_index, + e_qcsapi_integer + }, + { e_qcsapi_wps_registrar_report_button_press, + e_qcsapi_get_api, + e_qcsapi_none, + e_qcsapi_string + }, + { e_qcsapi_wps_registrar_report_pin, + e_qcsapi_get_api, + e_qcsapi_none, + e_qcsapi_string + }, + { e_qcsapi_wps_registrar_get_pp_devname, + e_qcsapi_get_api, + e_qcsapi_none, + e_qcsapi_string + }, + { e_qcsapi_wps_registrar_set_pp_devname, + e_qcsapi_set_api, + e_qcsapi_none, + e_qcsapi_string + }, + { e_qcsapi_wps_enrollee_report_button_press, + e_qcsapi_get_api, + e_qcsapi_none, + e_qcsapi_string + }, + { e_qcsapi_wps_enrollee_report_pin, + e_qcsapi_get_api, + e_qcsapi_none, + e_qcsapi_string + }, + { e_qcsapi_wps_enrollee_generate_pin, + e_qcsapi_get_api, + e_qcsapi_none, + e_qcsapi_string + }, + { e_qcsapi_wps_get_ap_pin, + e_qcsapi_get_api, + e_qcsapi_none, + e_qcsapi_string + }, + { e_qcsapi_wps_set_ap_pin, + e_qcsapi_set_api, + e_qcsapi_none, + e_qcsapi_integer + }, + { e_qcsapi_wps_save_ap_pin, + e_qcsapi_set_api_without_parameter, + e_qcsapi_none, + e_qcsapi_nosuch_specific_parameter + }, + { e_qcsapi_wps_enable_ap_pin, + e_qcsapi_set_api, + e_qcsapi_none, + e_qcsapi_integer + }, + { e_qcsapi_wps_get_sta_pin, + e_qcsapi_get_api, + e_qcsapi_none, + e_qcsapi_string + }, + { e_qcsapi_wps_get_state, + e_qcsapi_get_api, + e_qcsapi_none, + e_qcsapi_string + }, + { e_qcsapi_wps_get_configured_state, + e_qcsapi_get_api, + e_qcsapi_none, + e_qcsapi_string + }, + { e_qcsapi_wps_set_configured_state, + e_qcsapi_set_api, + e_qcsapi_none, + e_qcsapi_unsigned_int + }, + { e_qcsapi_wps_get_runtime_state, + e_qcsapi_get_api, + e_qcsapi_none, + e_qcsapi_string + }, + { e_qcsapi_wps_get_allow_pbc_overlap_status, + e_qcsapi_get_api, + e_qcsapi_none, + e_qcsapi_unsigned_int + }, + { e_qcsapi_wps_allow_pbc_overlap, + e_qcsapi_set_api, + e_qcsapi_none, + e_qcsapi_unsigned_int + }, + { e_qcsapi_wps_get_param, + e_qcsapi_get_api, + e_qcsapi_none, + e_qcsapi_string + }, + { e_qcsapi_wifi_set_dwell_times, + e_qcsapi_set_api, + e_qcsapi_none, + e_qcsapi_unsigned_int + }, + { e_qcsapi_wifi_get_dwell_times, + e_qcsapi_get_api, + e_qcsapi_none, + e_qcsapi_unsigned_int + }, + { e_qcsapi_wifi_set_bgscan_dwell_times, + e_qcsapi_set_api, + e_qcsapi_none, + e_qcsapi_unsigned_int + }, + { e_qcsapi_wifi_get_bgscan_dwell_times, + e_qcsapi_get_api, + e_qcsapi_none, + e_qcsapi_unsigned_int + }, + { e_qcsapi_wifi_start_scan, + e_qcsapi_get_api, + e_qcsapi_none, + e_qcsapi_integer + }, + { e_qcsapi_wifi_cancel_scan, + e_qcsapi_get_api, + e_qcsapi_none, + e_qcsapi_integer + }, + { e_qcsapi_wifi_get_scan_status, + e_qcsapi_get_api, + e_qcsapi_none, + e_qcsapi_integer + }, + { e_qcsapi_wifi_get_cac_status, + e_qcsapi_get_api, + e_qcsapi_none, + e_qcsapi_integer + }, + { e_qcsapi_wifi_wait_scan_completes, + e_qcsapi_get_api, + e_qcsapi_none, + e_qcsapi_integer + }, + { e_qcsapi_wifi_set_scan_chk_inv, + e_qcsapi_set_api, + e_qcsapi_none, + e_qcsapi_integer + }, + { e_qcsapi_wifi_get_scan_chk_inv, + e_qcsapi_get_api, + e_qcsapi_none, + e_qcsapi_unsigned_int + }, + { e_qcsapi_SSID_create_SSID, + e_qcsapi_set_api, + e_qcsapi_none, + e_qcsapi_SSID_param + }, + { e_qcsapi_SSID_remove_SSID, + e_qcsapi_set_api, + e_qcsapi_none, + e_qcsapi_SSID_param + }, + { e_qcsapi_SSID_verify_SSID, + e_qcsapi_set_api, + e_qcsapi_none, + e_qcsapi_SSID_param + }, + { e_qcsapi_SSID_rename_SSID, + e_qcsapi_set_api, + e_qcsapi_select_SSID, + e_qcsapi_SSID_param + }, + { e_qcsapi_SSID_get_SSID_list, + e_qcsapi_get_api, + e_qcsapi_none, + e_qcsapi_string + }, + { e_qcsapi_wifi_associate, + e_qcsapi_set_api, + e_qcsapi_none, + e_qcsapi_SSID_param + }, + { e_qcsapi_SSID_get_protocol, + e_qcsapi_get_api, + e_qcsapi_select_SSID, + e_qcsapi_string + }, + { e_qcsapi_SSID_set_protocol, + e_qcsapi_set_api, + e_qcsapi_select_SSID, + e_qcsapi_string + }, + { e_qcsapi_SSID_get_encryption_modes, + e_qcsapi_get_api, + e_qcsapi_select_SSID, + e_qcsapi_string + }, + { e_qcsapi_SSID_set_encryption_modes, + e_qcsapi_set_api, + e_qcsapi_select_SSID, + e_qcsapi_string + }, + { e_qcsapi_SSID_get_group_encryption, + e_qcsapi_get_api, + e_qcsapi_select_SSID, + e_qcsapi_string + }, + { e_qcsapi_SSID_set_group_encryption, + e_qcsapi_set_api, + e_qcsapi_select_SSID, + e_qcsapi_string + }, + { e_qcsapi_SSID_get_authentication_mode, + e_qcsapi_get_api, + e_qcsapi_select_SSID, + e_qcsapi_string + }, + { e_qcsapi_SSID_set_authentication_mode, + e_qcsapi_set_api, + e_qcsapi_select_SSID, + e_qcsapi_string + }, + { e_qcsapi_SSID_get_pre_shared_key, + e_qcsapi_get_api, + e_qcsapi_SSID_index, + e_qcsapi_string + }, + { e_qcsapi_SSID_set_pre_shared_key, + e_qcsapi_get_api, + e_qcsapi_SSID_index, + e_qcsapi_string + }, + { e_qcsapi_SSID_get_key_passphrase, + e_qcsapi_get_api, + e_qcsapi_SSID_index, + e_qcsapi_string + }, + { e_qcsapi_SSID_set_key_passphrase, + e_qcsapi_get_api, + e_qcsapi_SSID_index, + e_qcsapi_string + }, + { e_qcsapi_SSID_get_pmf, + e_qcsapi_get_api, + e_qcsapi_select_SSID, + e_qcsapi_unsigned_int + }, + { e_qcsapi_SSID_set_pmf, + e_qcsapi_get_api, + e_qcsapi_select_SSID, + e_qcsapi_unsigned_int + }, + { e_qcsapi_SSID_get_wps_SSID, + e_qcsapi_get_api, + e_qcsapi_none, + e_qcsapi_SSID_param + }, + { e_qcsapi_wifi_vlan_config, + e_qcsapi_set_api, + e_qcsapi_none, + e_qcsapi_string + }, + { e_qcsapi_wifi_show_vlan_config, + e_qcsapi_get_api, + e_qcsapi_none, + e_qcsapi_string + }, + { e_qcsapi_enable_vlan_pass_through, + e_qcsapi_set_system_value, + e_qcsapi_none, + e_qcsapi_string + }, + { e_qcsapi_br_vlan_promisc, + e_qcsapi_set_system_value, + e_qcsapi_none, + e_qcsapi_string + }, + { e_qcsapi_add_ipff, + e_qcsapi_set_system_value, + e_qcsapi_none, + e_qcsapi_string + }, + { e_qcsapi_del_ipff, + e_qcsapi_set_system_value, + e_qcsapi_none, + e_qcsapi_string + }, + { e_qcsapi_get_ipff, + e_qcsapi_get_system_value, + e_qcsapi_none, + e_qcsapi_string + }, + { e_qcsapi_wifi_start_cca, + e_qcsapi_set_api, + e_qcsapi_none, + e_qcsapi_integer + }, + { e_qcsapi_wifi_disable_wps, + e_qcsapi_set_api, + e_qcsapi_none, + e_qcsapi_string + }, + { e_qcsapi_wifi_disassociate, + e_qcsapi_get_api, + e_qcsapi_none, + e_qcsapi_integer + }, + { e_qcsapi_wifi_get_results_AP_scan, + e_qcsapi_get_api, + e_qcsapi_none, + e_qcsapi_integer + }, + { e_qcsapi_wifi_get_count_APs_scanned, + e_qcsapi_get_api, + e_qcsapi_none, + e_qcsapi_integer + }, + { e_qcsapi_wifi_get_properties_AP, + e_qcsapi_get_api, + e_qcsapi_index, + e_qcsapi_integer + }, + { e_qcsapi_wifi_get_mcs_rate, + e_qcsapi_get_api, + e_qcsapi_none, + e_qcsapi_string + }, + { e_qcsapi_wifi_set_mcs_rate, + e_qcsapi_set_api, + e_qcsapi_none, + e_qcsapi_string + }, + { e_qcsapi_service_control, + e_qcsapi_set_system_value, + e_qcsapi_none, + e_qcsapi_string, + }, + { e_qcsapi_wfa_cert, + e_qcsapi_set_system_value, + e_qcsapi_none, + e_qcsapi_integer, + }, + { e_qcsapi_wifi_enable_scs, + e_qcsapi_get_api, + e_qcsapi_none, + e_qcsapi_string + }, + { e_qcsapi_wifi_scs_switch_channel, + e_qcsapi_get_api, + e_qcsapi_none, + e_qcsapi_string + }, + { e_qcsapi_wifi_set_scs_verbose, + e_qcsapi_set_api, + e_qcsapi_none, + e_qcsapi_string + }, + { e_qcsapi_wifi_set_scs_smpl_enable, + e_qcsapi_set_api, + e_qcsapi_none, + e_qcsapi_string + }, + { e_qcsapi_wifi_set_scs_smpl_dwell_time, + e_qcsapi_set_api, + e_qcsapi_none, + e_qcsapi_string + }, + { e_qcsapi_wifi_set_scs_smpl_intv, + e_qcsapi_set_api, + e_qcsapi_none, + e_qcsapi_string + }, + { e_qcsapi_wifi_set_scs_intf_detect_intv, + e_qcsapi_set_api, + e_qcsapi_none, + e_qcsapi_string + }, + { e_qcsapi_wifi_set_scs_thrshld, + e_qcsapi_set_api, + e_qcsapi_none, + e_qcsapi_string + }, + { e_qcsapi_wifi_set_scs_report_only, + e_qcsapi_set_api, + e_qcsapi_none, + e_qcsapi_string + }, + { e_qcsapi_wifi_get_scs_status, + e_qcsapi_get_api, + e_qcsapi_none, + e_qcsapi_string + }, + { e_qcsapi_wifi_get_scs_report_stat, + e_qcsapi_set_api, + e_qcsapi_none, + e_qcsapi_string + }, + { e_qcsapi_wifi_set_scs_cca_intf_smth_fctr, + e_qcsapi_set_api, + e_qcsapi_none, + e_qcsapi_string + }, + { e_qcsapi_wifi_set_scs_chan_mtrc_mrgn, + e_qcsapi_set_api, + e_qcsapi_none, + e_qcsapi_string + }, + { e_qcsapi_wifi_get_scs_dfs_reentry_request, + e_qcsapi_get_api, + e_qcsapi_none, + e_qcsapi_string + }, + { e_qcsapi_wifi_get_scs_cca_intf, + e_qcsapi_get_api, + e_qcsapi_none, + e_qcsapi_string + }, + { e_qcsapi_wifi_get_scs_param, + e_qcsapi_get_api, + e_qcsapi_none, + e_qcsapi_string + }, + { e_qcsapi_wifi_set_scs_stats, + e_qcsapi_set_api, + e_qcsapi_none, + e_qcsapi_string + }, + { e_qcsapi_wifi_start_ocac, + e_qcsapi_get_api, + e_qcsapi_none, + e_qcsapi_integer + }, + { e_qcsapi_wifi_stop_ocac, + e_qcsapi_get_api, + e_qcsapi_none, + e_qcsapi_integer + }, + { e_qcsapi_wifi_get_ocac_status, + e_qcsapi_get_api, + e_qcsapi_none, + e_qcsapi_string + }, + { e_qcsapi_wifi_set_ocac_threshold, + e_qcsapi_set_api, + e_qcsapi_none, + e_qcsapi_string + }, + { e_qcsapi_wifi_set_ocac_dwell_time, + e_qcsapi_set_api, + e_qcsapi_none, + e_qcsapi_string + }, + { e_qcsapi_wifi_set_ocac_duration, + e_qcsapi_set_api, + e_qcsapi_none, + e_qcsapi_string + }, + { e_qcsapi_wifi_set_ocac_cac_time, + e_qcsapi_set_api, + e_qcsapi_none, + e_qcsapi_string + }, + { e_qcsapi_wifi_set_ocac_report_only, + e_qcsapi_set_api, + e_qcsapi_none, + e_qcsapi_string + }, + { e_qcsapi_wifi_start_dfs_s_radio, + e_qcsapi_get_api, + e_qcsapi_none, + e_qcsapi_integer + }, + { e_qcsapi_wifi_stop_dfs_s_radio, + e_qcsapi_get_api, + e_qcsapi_none, + e_qcsapi_integer + }, + { e_qcsapi_wifi_get_dfs_s_radio_status, + e_qcsapi_get_api, + e_qcsapi_none, + e_qcsapi_string + }, + { e_qcsapi_wifi_get_dfs_s_radio_availability, + e_qcsapi_get_api, + e_qcsapi_none, + e_qcsapi_string + }, + { e_qcsapi_wifi_set_dfs_s_radio_threshold, + e_qcsapi_set_api, + e_qcsapi_none, + e_qcsapi_string + }, + { e_qcsapi_wifi_set_dfs_s_radio_dwell_time, + e_qcsapi_set_api, + e_qcsapi_none, + e_qcsapi_string + }, + { e_qcsapi_wifi_set_dfs_s_radio_duration, + e_qcsapi_set_api, + e_qcsapi_none, + e_qcsapi_string + }, + { e_qcsapi_wifi_set_dfs_s_radio_cac_time, + e_qcsapi_set_api, + e_qcsapi_none, + e_qcsapi_string + }, + { e_qcsapi_wifi_set_dfs_s_radio_report_only, + e_qcsapi_set_api, + e_qcsapi_none, + e_qcsapi_string + }, + { e_qcsapi_wifi_set_dfs_s_radio_wea_duration, + e_qcsapi_set_api, + e_qcsapi_none, + e_qcsapi_string + }, + { e_qcsapi_wifi_set_dfs_s_radio_wea_cac_time, + e_qcsapi_set_api, + e_qcsapi_none, + e_qcsapi_string + }, + { e_qcsapi_wifi_get_ap_isolate, + e_qcsapi_get_api, + e_qcsapi_none, + e_qcsapi_integer + }, + { e_qcsapi_wifi_set_ap_isolate, + e_qcsapi_set_api, + e_qcsapi_none, + e_qcsapi_integer + }, + { e_qcsapi_power_save, + e_qcsapi_get_api_without_ifname_parameter, + e_qcsapi_none, + e_qcsapi_integer + }, + { e_qcsapi_qpm_level, + e_qcsapi_get_api_without_ifname_parameter, + e_qcsapi_none, + e_qcsapi_integer + }, + { e_qcsapi_wifi_get_time_associated_per_association, + e_qcsapi_get_api, + e_qcsapi_index, + e_qcsapi_integer + }, + { e_qcsapi_wifi_wds_add_peer, + e_qcsapi_set_api, + e_qcsapi_none, + e_qcsapi_mac_addr + }, + { e_qcsapi_wifi_wds_remove_peer, + e_qcsapi_set_api, + e_qcsapi_none, + e_qcsapi_mac_addr + }, + { e_qcsapi_wifi_wds_get_peer_address, + e_qcsapi_get_api, + e_qcsapi_none, + e_qcsapi_unsigned_int + }, + { e_qcsapi_wifi_wds_set_psk, + e_qcsapi_set_api, + e_qcsapi_none, + e_qcsapi_nosuch_specific_parameter + }, + { e_qcsapi_wifi_wds_set_mode, + e_qcsapi_set_api, + e_qcsapi_none, + e_qcsapi_string + }, + { e_qcsapi_wifi_wds_get_mode, + e_qcsapi_get_api, + e_qcsapi_none, + e_qcsapi_string + }, + { e_qcsapi_wifi_qos_get_param, + e_qcsapi_get_api, + e_qcsapi_none, + e_qcsapi_integer + }, + { e_qcsapi_wifi_qos_set_param, + e_qcsapi_set_api, + e_qcsapi_none, + e_qcsapi_integer + }, + { e_qcsapi_wifi_get_wmm_ac_map, + e_qcsapi_get_api, + e_qcsapi_none, + e_qcsapi_integer + }, + { e_qcsapi_wifi_set_wmm_ac_map, + e_qcsapi_set_api, + e_qcsapi_none, + e_qcsapi_integer + }, + { e_qcsapi_wifi_get_dscp_8021p_map, + e_qcsapi_get_api, + e_qcsapi_none, + e_qcsapi_integer + }, + { e_qcsapi_wifi_set_dscp_8021p_map, + e_qcsapi_set_api, + e_qcsapi_none, + e_qcsapi_integer + }, + { e_qcsapi_wifi_get_dscp_ac_map, + e_qcsapi_get_api, + e_qcsapi_none, + e_qcsapi_integer + }, + { e_qcsapi_wifi_set_dscp_ac_map, + e_qcsapi_set_api, + e_qcsapi_none, + e_qcsapi_integer + }, + { e_qcsapi_wifi_get_priority, + e_qcsapi_get_api, + e_qcsapi_none, + e_qcsapi_integer + }, + { e_qcsapi_wifi_set_priority, + e_qcsapi_set_api, + e_qcsapi_none, + e_qcsapi_integer + }, + { e_qcsapi_wifi_get_airfair, + e_qcsapi_get_api, + e_qcsapi_none, + e_qcsapi_integer + }, + { e_qcsapi_wifi_set_airfair, + e_qcsapi_set_api, + e_qcsapi_none, + e_qcsapi_integer + }, + { e_qcsapi_config_get_parameter, + e_qcsapi_get_api, + e_qcsapi_none, + e_qcsapi_string + }, + { e_qcsapi_config_update_parameter, + e_qcsapi_set_api, + e_qcsapi_none, + e_qcsapi_string + }, + { e_qcsapi_config_get_ssid_parameter, + e_qcsapi_get_api, + e_qcsapi_none, + e_qcsapi_string + }, + { e_qcsapi_config_update_ssid_parameter, + e_qcsapi_set_api, + e_qcsapi_none, + e_qcsapi_string + }, + { e_qcsapi_bootcfg_get_parameter, + e_qcsapi_get_api_without_ifname, + e_qcsapi_none, + e_qcsapi_string + }, + { e_qcsapi_bootcfg_update_parameter, + e_qcsapi_set_system_value, + e_qcsapi_none, + e_qcsapi_string + }, + { e_qcsapi_bootcfg_commit, + e_qcsapi_get_api_without_ifname, + e_qcsapi_none, + e_qcsapi_string + }, + { e_qcsapi_wifi_set_vendor_fix, + e_qcsapi_set_api, + e_qcsapi_none, + e_qcsapi_integer + }, + { e_qcsapi_get_interface_stats, + e_qcsapi_get_api, + e_qcsapi_none, + e_qcsapi_string + }, + { e_qcsapi_get_phy_stats, + e_qcsapi_get_api, + e_qcsapi_none, + e_qcsapi_string + }, + { + e_qcsapi_wps_set_access_control, + e_qcsapi_set_api, + e_qcsapi_none, + e_qcsapi_string + }, + { + e_qcsapi_wps_get_access_control, + e_qcsapi_get_api, + e_qcsapi_none, + e_qcsapi_string + }, + { + e_qcsapi_non_wps_set_pp_enable, + e_qcsapi_set_api, + e_qcsapi_none, + e_qcsapi_string + }, + { + e_qcsapi_non_wps_get_pp_enable, + e_qcsapi_get_api, + e_qcsapi_none, + e_qcsapi_string + }, + { + e_qcsapi_wps_cancel, + e_qcsapi_get_api, + e_qcsapi_none, + e_qcsapi_none + }, + { + e_qcsapi_wps_set_pbc_in_srcm, + e_qcsapi_set_api, + e_qcsapi_none, + e_qcsapi_integer + }, + { + e_qcsapi_wps_get_pbc_in_srcm, + e_qcsapi_get_api, + e_qcsapi_none, + e_qcsapi_string + }, + { + e_qcsapi_wps_timeout, + e_qcsapi_set_api, + e_qcsapi_none, + e_qcsapi_integer + }, + { + e_qcsapi_wps_on_hidden_ssid, + e_qcsapi_set_api, + e_qcsapi_none, + e_qcsapi_integer + }, + { + e_qcsapi_wps_on_hidden_ssid_status, + e_qcsapi_get_api, + e_qcsapi_none, + e_qcsapi_string + }, + { + e_qcsapi_wps_upnp_enable, + e_qcsapi_set_api, + e_qcsapi_none, + e_qcsapi_integer + }, + { + e_qcsapi_wps_upnp_status, + e_qcsapi_get_api, + e_qcsapi_none, + e_qcsapi_none + }, + { + e_qcsapi_wps_registrar_set_dfl_pbc_bss, + e_qcsapi_get_api, + e_qcsapi_none, + e_qcsapi_string + }, + { + e_qcsapi_wps_registrar_get_dfl_pbc_bss, + e_qcsapi_get_api_without_ifname_parameter, + e_qcsapi_none, + e_qcsapi_string + }, + { + e_qcsapi_wifi_get_wpa_status, + e_qcsapi_get_api, + e_qcsapi_none, + e_qcsapi_string + }, + { + e_qcsapi_wifi_get_auth_state, + e_qcsapi_get_api, + e_qcsapi_none, + e_qcsapi_string + }, + { + e_qcsapi_wifi_get_disconn_info, + e_qcsapi_get_api, + e_qcsapi_none, + e_qcsapi_string + }, + { + e_qcsapi_wifi_reset_disconn_info, + e_qcsapi_set_api_without_parameter, + e_qcsapi_none, + e_qcsapi_string + }, + { + e_qcsapi_wifi_get_pairing_id, + e_qcsapi_get_api, + e_qcsapi_none, + e_qcsapi_string + }, + { + e_qcsapi_wifi_set_pairing_id, + e_qcsapi_set_api, + e_qcsapi_none, + e_qcsapi_string + }, + { + e_qcsapi_wifi_get_pairing_enable, + e_qcsapi_get_api, + e_qcsapi_none, + e_qcsapi_string + }, + { + e_qcsapi_wifi_set_pairing_enable, + e_qcsapi_set_api, + e_qcsapi_none, + e_qcsapi_string + }, + { e_qcsapi_wifi_get_rts_threshold, + e_qcsapi_get_api, + e_qcsapi_none, + e_qcsapi_unsigned_int + }, + { e_qcsapi_wifi_set_rts_threshold, + e_qcsapi_set_api, + e_qcsapi_none, + e_qcsapi_unsigned_int + }, + { + e_qcsapi_wifi_set_txqos_sched_tbl, + e_qcsapi_set_api, + e_qcsapi_none, + e_qcsapi_string + }, + { + e_qcsapi_wifi_get_txqos_sched_tbl, + e_qcsapi_get_api, + e_qcsapi_none, + e_qcsapi_string + }, + { + e_qcsapi_wps_set_param, + e_qcsapi_set_api, + e_qcsapi_none, + e_qcsapi_string + }, + { + e_qcsapi_reset_all_stats, + e_qcsapi_set_api, + e_qcsapi_index, + e_qcsapi_integer + }, + { + e_qcsapi_eth_phy_power_off, + e_qcsapi_set_api, + e_qcsapi_none, + e_qcsapi_string + }, + { + e_qcsapi_aspm_l1, + e_qcsapi_set_system_value, + e_qcsapi_none, + e_qcsapi_string + }, + { + e_qcsapi_l1, + e_qcsapi_set_system_value, + e_qcsapi_none, + e_qcsapi_string + }, + { + e_qcsapi_test_traffic, + e_qcsapi_set_api, + e_qcsapi_none, + e_qcsapi_string + }, + { + e_qcsapi_get_temperature, + e_qcsapi_get_api_without_ifname_parameter, + e_qcsapi_none, + e_qcsapi_string + }, + { e_qcsapi_telnet_enable, + e_qcsapi_set_system_value, + e_qcsapi_none, + e_qcsapi_string + }, + { e_qcsapi_restore_default_config, + e_qcsapi_get_api_without_ifname_parameter, + e_qcsapi_none, + e_qcsapi_nosuch_specific_parameter + }, + { e_qcsapi_run_script, + e_qcsapi_get_api_without_ifname_parameter, + e_qcsapi_none, + e_qcsapi_string + }, + { e_qcsapi_qtm, + e_qcsapi_set_api, + e_qcsapi_none, + e_qcsapi_nosuch_specific_parameter + }, + { e_qcsapi_set_accept_oui_filter, + e_qcsapi_set_api, + e_qcsapi_none, + e_qcsapi_mac_addr + }, + { e_qcsapi_get_accept_oui_filter, + e_qcsapi_get_api, + e_qcsapi_none, + e_qcsapi_string + }, + { e_qcsapi_get_swfeat_list, + e_qcsapi_get_api_without_ifname_parameter, + e_qcsapi_none, + e_qcsapi_nosuch_specific_parameter + }, + { e_qcsapi_wifi_set_vht, + e_qcsapi_set_api, + e_qcsapi_none, + e_qcsapi_unsigned_int + }, + { e_qcsapi_wifi_get_vht, + e_qcsapi_get_api, + e_qcsapi_none, + e_qcsapi_unsigned_int + }, + { e_qcsapi_calcmd_set_test_mode, + e_qcsapi_set_api, + e_qcsapi_none, + e_qcsapi_integer + }, + { e_qcsapi_calcmd_show_test_packet, + e_qcsapi_get_api, + e_qcsapi_none, + e_qcsapi_string + }, + { e_qcsapi_calcmd_send_test_packet, + e_qcsapi_set_api, + e_qcsapi_none, + e_qcsapi_integer + }, + { e_qcsapi_calcmd_stop_test_packet, + e_qcsapi_get_api, + e_qcsapi_none, + e_qcsapi_string + }, + { e_qcsapi_calcmd_send_dc_cw_signal, + e_qcsapi_set_api, + e_qcsapi_none, + e_qcsapi_integer + }, + { e_qcsapi_calcmd_stop_dc_cw_signal, + e_qcsapi_get_api, + e_qcsapi_none, + e_qcsapi_string + }, + { e_qcsapi_calcmd_get_test_mode_antenna_sel, + e_qcsapi_get_api, + e_qcsapi_none, + e_qcsapi_string + }, + { e_qcsapi_calcmd_get_test_mode_mcs, + e_qcsapi_get_api, + e_qcsapi_none, + e_qcsapi_string + }, + { e_qcsapi_calcmd_get_test_mode_bw, + e_qcsapi_get_api, + e_qcsapi_none, + e_qcsapi_string + }, + { e_qcsapi_calcmd_get_tx_power, + e_qcsapi_get_api, + e_qcsapi_none, + e_qcsapi_string + }, + { e_qcsapi_calcmd_set_tx_power, + e_qcsapi_set_api, + e_qcsapi_none, + e_qcsapi_string + }, + { e_qcsapi_calcmd_get_test_mode_rssi, + e_qcsapi_get_api, + e_qcsapi_none, + e_qcsapi_string + }, + { e_qcsapi_calcmd_set_mac_filter, + e_qcsapi_set_api, + e_qcsapi_none, + e_qcsapi_string + }, + { e_qcsapi_calcmd_get_antenna_count, + e_qcsapi_get_api, + e_qcsapi_none, + e_qcsapi_string + }, + { e_qcsapi_calcmd_clear_counter, + e_qcsapi_get_api, + e_qcsapi_none, + e_qcsapi_string + }, + { e_qcsapi_calcmd_get_info, + e_qcsapi_get_api, + e_qcsapi_none, + e_qcsapi_string + }, + { e_qcsapi_set_soc_macaddr, + e_qcsapi_set_api, + e_qcsapi_none, + e_qcsapi_string + }, + { e_qcsapi_wifi_disable_dfs_channels, + e_qcsapi_set_api, + e_qcsapi_none, + e_qcsapi_string + }, + { e_qcsapi_get_carrier_id, + e_qcsapi_get_api_without_ifname_parameter, + e_qcsapi_none, + e_qcsapi_nosuch_specific_parameter + }, + { e_qcsapi_set_carrier_id, + e_qcsapi_get_api_without_ifname_parameter, + e_qcsapi_none, + e_qcsapi_string + }, + { e_qcsapi_wifi_enable_tdls, + e_qcsapi_set_api, + e_qcsapi_none, + e_qcsapi_string + }, + { e_qcsapi_wifi_enable_tdls_over_qhop, + e_qcsapi_set_api, + e_qcsapi_none, + e_qcsapi_string + }, + { e_qcsapi_wifi_get_tdls_status, + e_qcsapi_get_api, + e_qcsapi_none, + e_qcsapi_string + }, + { e_qcsapi_wifi_set_tdls_params, + e_qcsapi_set_api, + e_qcsapi_tdls_params, + e_qcsapi_string + }, + { e_qcsapi_wifi_get_tdls_params, + e_qcsapi_get_api, + e_qcsapi_none, + e_qcsapi_string + }, + { e_qcsapi_wifi_tdls_operate, + e_qcsapi_set_api, + e_qcsapi_tdls_oper, + e_qcsapi_string + }, + { e_qcsapi_get_spinor_jedecid, + e_qcsapi_get_api, + e_qcsapi_none, + e_qcsapi_string + }, + { e_qcsapi_get_custom_value, + e_qcsapi_get_api_without_ifname, + e_qcsapi_none, + e_qcsapi_string + }, + { e_qcsapi_wifi_get_mlme_stats_per_mac, + e_qcsapi_get_api_without_ifname_parameter, + e_qcsapi_none, + e_qcsapi_string, + }, + { e_qcsapi_wifi_get_mlme_stats_per_association, + e_qcsapi_get_api, + e_qcsapi_index, + e_qcsapi_string, + }, + { e_qcsapi_wifi_get_mlme_stats_macs_list, + e_qcsapi_get_api_without_ifname_parameter, + e_qcsapi_none, + e_qcsapi_string, + }, + { + e_qcsapi_get_nss_cap, + e_qcsapi_get_api, + e_qcsapi_modulation, + e_qcsapi_string + }, + { + e_qcsapi_set_nss_cap, + e_qcsapi_set_api, + e_qcsapi_modulation, + e_qcsapi_string + }, + { + e_qcsapi_get_security_defer_mode, + e_qcsapi_get_api, + e_qcsapi_none, + e_qcsapi_integer + }, + { + e_qcsapi_set_security_defer_mode, + e_qcsapi_set_api, + e_qcsapi_none, + e_qcsapi_integer + }, + { + e_qcsapi_apply_security_config, + e_qcsapi_set_api_without_parameter, + e_qcsapi_none, + e_qcsapi_none, + }, + { e_qcsapi_wifi_set_intra_bss_isolate, + e_qcsapi_set_api, + e_qcsapi_none, + e_qcsapi_unsigned_int + }, + { e_qcsapi_wifi_get_intra_bss_isolate, + e_qcsapi_get_api, + e_qcsapi_none, + e_qcsapi_unsigned_int + }, + { e_qcsapi_wifi_set_bss_isolate, + e_qcsapi_set_api, + e_qcsapi_none, + e_qcsapi_unsigned_int + }, + { e_qcsapi_wifi_get_bss_isolate, + e_qcsapi_get_api, + e_qcsapi_none, + e_qcsapi_unsigned_int + }, + { e_qcsapi_wowlan_host_state, + e_qcsapi_set_api, + e_qcsapi_none, + e_qcsapi_integer + }, + { e_qcsapi_wowlan_match_type, + e_qcsapi_set_api, + e_qcsapi_none, + e_qcsapi_integer + }, + { e_qcsapi_wowlan_L2_type, + e_qcsapi_set_api, + e_qcsapi_none, + e_qcsapi_integer + }, + { e_qcsapi_wowlan_udp_port, + e_qcsapi_set_api, + e_qcsapi_none, + e_qcsapi_integer + }, + { e_qcsapi_wowlan_pattern, + e_qcsapi_set_api, + e_qcsapi_none, + e_qcsapi_integer + }, + { e_qcsapi_wowlan_get_host_state, + e_qcsapi_get_api, + e_qcsapi_none, + e_qcsapi_unsigned_int + }, + { e_qcsapi_wowlan_get_match_type, + e_qcsapi_get_api, + e_qcsapi_none, + e_qcsapi_unsigned_int + }, + { e_qcsapi_wowlan_get_L2_type, + e_qcsapi_get_api, + e_qcsapi_none, + e_qcsapi_unsigned_int + }, + { e_qcsapi_wowlan_get_udp_port, + e_qcsapi_get_api, + e_qcsapi_none, + e_qcsapi_unsigned_int + }, + { e_qcsapi_wowlan_get_pattern, + e_qcsapi_get_api, + e_qcsapi_none, + e_qcsapi_string + }, + { e_qcsapi_wifi_set_extender_params, + e_qcsapi_set_api, + e_qcsapi_extender_params, + e_qcsapi_string + }, + { e_qcsapi_wifi_get_extender_status, + e_qcsapi_get_api, + e_qcsapi_none, + e_qcsapi_string + }, + { e_qcsapi_wifi_enable_bgscan, + e_qcsapi_set_api, + e_qcsapi_none, + e_qcsapi_string + }, + { e_qcsapi_wifi_get_bgscan_status, + e_qcsapi_get_api, + e_qcsapi_none, + e_qcsapi_string + }, + { e_qcsapi_get_uboot_info, + e_qcsapi_get_api_without_ifname_parameter, + e_qcsapi_none, + e_qcsapi_unsigned_int + }, + { e_qcsapi_wifi_get_disassoc_reason, + e_qcsapi_get_api, + e_qcsapi_none, + e_qcsapi_unsigned_int + }, + { e_qcsapi_is_startprod_done, + e_qcsapi_get_system_value, + e_qcsapi_none, + e_qcsapi_unsigned_int + }, + { e_qcsapi_wifi_disassociate_sta, + e_qcsapi_set_api, + e_qcsapi_none, + e_qcsapi_mac_addr + }, + { e_qcsapi_wifi_reassociate, + e_qcsapi_set_api_without_parameter, + e_qcsapi_none, + e_qcsapi_nosuch_specific_parameter + }, + { e_qcsapi_get_bb_param, + e_qcsapi_get_api, + e_qcsapi_none, + e_qcsapi_unsigned_int + }, + { e_qcsapi_set_bb_param, + e_qcsapi_set_api, + e_qcsapi_none, + e_qcsapi_unsigned_int + }, + { e_qcsapi_wifi_get_tx_amsdu, + e_qcsapi_get_api, + e_qcsapi_none, + e_qcsapi_integer + }, + { e_qcsapi_wifi_set_tx_amsdu, + e_qcsapi_set_api, + e_qcsapi_none, + e_qcsapi_integer + }, + { e_qcsapi_wifi_set_scan_buf_max_size, + e_qcsapi_set_api, + e_qcsapi_none, + e_qcsapi_unsigned_int + }, + { e_qcsapi_wifi_get_scan_buf_max_size, + e_qcsapi_get_api, + e_qcsapi_none, + e_qcsapi_unsigned_int + }, + { e_qcsapi_wifi_set_scan_table_max_len, + e_qcsapi_set_api, + e_qcsapi_none, + e_qcsapi_unsigned_int + }, + { e_qcsapi_wifi_get_scan_table_max_len, + e_qcsapi_get_api, + e_qcsapi_none, + e_qcsapi_unsigned_int + }, + { e_qcsapi_wifi_set_enable_mu, + e_qcsapi_set_api, + e_qcsapi_none, + e_qcsapi_unsigned_int + }, + { e_qcsapi_wifi_get_enable_mu, + e_qcsapi_get_api, + e_qcsapi_none, + e_qcsapi_unsigned_int + }, + { e_qcsapi_wifi_set_mu_use_precode, + e_qcsapi_set_api, + e_qcsapi_none, + e_qcsapi_unsigned_int + }, + { e_qcsapi_wifi_get_mu_use_precode, + e_qcsapi_get_api, + e_qcsapi_none, + e_qcsapi_unsigned_int + }, + { e_qcsapi_wifi_set_mu_use_eq, + e_qcsapi_set_api, + e_qcsapi_none, + e_qcsapi_unsigned_int + }, + { e_qcsapi_wifi_get_mu_use_eq, + e_qcsapi_get_api, + e_qcsapi_none, + e_qcsapi_unsigned_int + }, + { e_qcsapi_wifi_get_mu_groups, + e_qcsapi_get_api, + e_qcsapi_none, + e_qcsapi_unsigned_int + }, + { e_qcsapi_send_file, + e_qcsapi_get_system_value, + e_qcsapi_none, + e_qcsapi_string + }, + { e_qcsapi_get_emac_switch, + e_qcsapi_get_system_value, + e_qcsapi_none, + e_qcsapi_unsigned_int + }, + { e_qcsapi_set_emac_switch, + e_qcsapi_set_system_value, + e_qcsapi_none, + e_qcsapi_unsigned_int + }, + { e_qcsapi_eth_dscp_map, + e_qcsapi_set_system_value, + e_qcsapi_none, + e_qcsapi_string + }, + { e_qcsapi_set_optim_stats, + e_qcsapi_set_api, + e_qcsapi_none, + e_qcsapi_unsigned_int + }, + { e_qcsapi_set_sys_time, + e_qcsapi_set_system_value, + e_qcsapi_none, + e_qcsapi_string + }, + { e_qcsapi_get_sys_time, + e_qcsapi_get_system_value, + e_qcsapi_none, + e_qcsapi_string + }, + { e_qcsapi_get_eth_info, + e_qcsapi_get_api, + e_qcsapi_none, + e_qcsapi_string + }, + { e_qcsapi_wifi_block_bss, + e_qcsapi_set_api, + e_qcsapi_none, + e_qcsapi_unsigned_int + }, + { e_qcsapi_wifi_verify_repeater_mode, + e_qcsapi_get_api_without_ifname, + e_qcsapi_none, + e_qcsapi_string + }, + { e_qcsapi_wifi_set_ap_interface_name, + e_qcsapi_set_api_without_ifname, + e_qcsapi_none, + e_qcsapi_string + }, + { e_qcsapi_wifi_get_ap_interface_name, + e_qcsapi_get_api_without_ifname, + e_qcsapi_none, + e_qcsapi_string + }, +}; + +static const unsigned int sizeof_entry_table = sizeof( qcsapi_entry_table ) / sizeof( qcsapi_entry_table[ 0 ] ); + + +const struct qcsapi_entry * +entry_point_enum_to_table_entry( qcsapi_entry_point this_entry_point ) +{ + int found_entry = 0; + unsigned int iter; + const struct qcsapi_entry *retaddr = NULL; + + for (iter = 0; iter < sizeof_entry_table && found_entry == 0; iter++) + { + if (qcsapi_entry_table[ iter ].e_entry_point == this_entry_point ) + { + found_entry = 1; + retaddr = &qcsapi_entry_table[ iter ]; + } + } + + return( retaddr ); +} + +/* returns 1 if successful; 0 if failure */ + +int +lookup_generic_parameter_type( qcsapi_entry_point qcsapi_selection, qcsapi_generic_parameter_type *p_generic_parameter_type ) +{ + int retval = 0; + int found_entry = 0; + unsigned int iter; + + for (iter = 0; iter < sizeof_entry_table; iter++) + { + if (qcsapi_entry_table[ iter ].e_entry_point == qcsapi_selection) + { + *p_generic_parameter_type = qcsapi_entry_table[ iter ].e_generic_param_type; + found_entry = 1; + } + } + + if (found_entry) + retval = 1; + + return( retval ); +} + diff --git a/package/firmware/quantenna/src/qcsapi_driver.h b/package/firmware/quantenna/src/qcsapi_driver.h new file mode 100644 index 000000000..90b23d0fa --- /dev/null +++ b/package/firmware/quantenna/src/qcsapi_driver.h @@ -0,0 +1,740 @@ +/*SH1 +******************************************************************************* +** ** +** Copyright (c) 2009 - 2012 Quantenna Communications, Inc. ** +** ** +** File : qcsapi_driver.h ** +** Description : ** +** ** +******************************************************************************* +** ** +** Redistribution and use in source and binary forms, with or without ** +** modification, are permitted provided that the following conditions ** +** are met: ** +** 1. Redistributions of source code must retain the above copyright ** +** notice, this list of conditions and the following disclaimer. ** +** 2. Redistributions in binary form must reproduce the above copyright ** +** notice, this list of conditions and the following disclaimer in the ** +** documentation and/or other materials provided with the distribution. ** +** 3. The name of the author may not be used to endorse or promote products ** +** derived from this software without specific prior written permission. ** +** ** +** Alternatively, this software may be distributed under the terms of the ** +** GNU General Public License ("GPL") version 2, or (at your option) any ** +** later version as published by the Free Software Foundation. ** +** ** +** In the case this software is distributed under the GPL license, ** +** you should have received a copy of the GNU General Public License ** +** along with this software; if not, write to the Free Software ** +** Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ** +** ** +** THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR ** +** IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES** +** OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. ** +** IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, ** +** INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT ** +** NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,** +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ** +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ** +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF ** +** THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ** +** ** +******************************************************************************* +EH1*/ + +#ifndef _QCSAPI_DRIVER_H +#define _QCSAPI_DRIVER_H + +#include "qcsapi_output.h" + +/* + * get_api and set_api expect an interface (wifi0, eth1_0, etc.) + * get_system_value and set_system_value do NOT expect an interface. They apply to the entire device. + */ + +typedef enum { + e_qcsapi_get_api = 1, + e_qcsapi_set_api, + e_qcsapi_get_system_value, + e_qcsapi_set_system_value, + /*GET API without interface name and other parameters as input*/ + e_qcsapi_get_api_without_ifname_parameter, + /*SET API with interface name as parameter, but without other parameters as input*/ + e_qcsapi_set_api_without_parameter, + /*GET API without interface name as parameter*/ + e_qcsapi_get_api_without_ifname, + /*SET API without interface name as parameter*/ + e_qcsapi_set_api_without_ifname, + e_qcsapi_nosuch_typeof_api = 0, +} qcsapi_typeof_api; + +typedef enum { + e_qcsapi_option = 1, + e_qcsapi_counter, + e_qcsapi_rates, + e_qcsapi_modulation, + e_qcsapi_index, + e_qcsapi_select_SSID, + e_qcsapi_SSID_index, + e_qcsapi_LED, + e_qcsapi_file_path_config, + e_qcsapi_tdls_params, + e_qcsapi_tdls_oper, + e_qcsapi_board_parameter, + e_qcsapi_extender_params, + e_qcsapi_none, + e_qcsapi_nosuch_generic_parameter = 0 +} qcsapi_generic_parameter_type; + +/* enum to describe type of configuration and monitoring parameters */ + +typedef enum { + e_qcsapi_integer = 1, + e_qcsapi_unsigned_int, + e_qcsapi_wifi_mode, + e_qcsapi_SSID_param, + e_qcsapi_mac_addr, + e_qcsapi_string, + e_qcsapi_nosuch_specific_parameter = 0 +} qcsapi_specific_parameter_type; + +/* + * Abstract handle to reference a QCSAPI. + * Each QCSAPI entry point has a corresponding enum, + * but a few additional enum's are defined. + */ + +typedef enum { + e_qcsapi_errno_get_message = 1, + e_qcsapi_first_entry_point = e_qcsapi_errno_get_message, + + e_qcsapi_store_ipaddr, + e_qcsapi_interface_enable, + e_qcsapi_interface_get_BSSID, + e_qcsapi_interface_get_mac_addr, + e_qcsapi_interface_set_mac_addr, + e_qcsapi_interface_get_counter, + e_qcsapi_interface_get_counter64, + e_qcsapi_interface_get_status, + e_qcsapi_interface_get_ip4, + + e_qcsapi_pm_get_counter, + e_qcsapi_pm_get_elapsed_time, + + e_qcsapi_flash_image_update, + + e_qcsapi_firmware_get_version, + + e_qcsapi_system_get_time_since_start, + e_qcsapi_get_system_status, + e_qcsapi_get_random_seed, + e_qcsapi_set_random_seed, + + e_qcsapi_led_get, + e_qcsapi_led_set, + + e_qcsapi_led_pwm_enable, + e_qcsapi_led_brightness, + + e_qcsapi_gpio_get_config, + e_qcsapi_gpio_set_config, + + e_qcsapi_gpio_monitor_reset_device, + e_qcsapi_gpio_enable_wps_push_button, + + e_qcsapi_file_path_get_config, + e_qcsapi_file_path_set_config, + + e_qcsapi_wifi_set_wifi_macaddr, + e_qcsapi_wifi_create_restricted_bss, + e_qcsapi_wifi_create_bss, + e_qcsapi_wifi_remove_bss, + e_qcsapi_wifi_get_primary_interface, + e_qcsapi_wifi_get_interface_by_index, + e_qcsapi_wifi_get_mode, + e_qcsapi_wifi_set_mode, + e_qcsapi_wifi_reload_in_mode, + e_qcsapi_wifi_rfenable, + e_qcsapi_service_control, + e_qcsapi_wfa_cert, + e_qcsapi_wifi_rfstatus, + e_qcsapi_wifi_startprod, + e_qcsapi_wifi_get_bw, + e_qcsapi_wifi_set_bw, + e_qcsapi_wifi_get_BSSID, + e_qcsapi_wifi_get_config_BSSID, + e_qcsapi_wifi_ssid_set_bssid, + e_qcsapi_wifi_ssid_get_bssid, + e_qcsapi_wifi_get_SSID, + e_qcsapi_wifi_set_SSID, + e_qcsapi_wifi_get_channel, + e_qcsapi_wifi_set_channel, + e_qcsapi_wifi_get_auto_channel, + e_qcsapi_wifi_set_auto_channel, + e_qcsapi_wifi_get_standard, + e_qcsapi_wifi_get_dtim, + e_qcsapi_wifi_set_dtim, + e_qcsapi_wifi_get_assoc_limit, + e_qcsapi_wifi_set_assoc_limit, + e_qcsapi_wifi_get_bss_assoc_limit, + e_qcsapi_wifi_set_bss_assoc_limit, + e_qcsapi_interface_set_ip4, + e_qcsapi_wifi_get_list_channels, + e_qcsapi_wifi_get_mode_switch, + e_qcsapi_wifi_get_noise, + e_qcsapi_wifi_get_rssi_by_chain, + e_qcsapi_wifi_get_avg_snr, + + e_qcsapi_wifi_get_phy_mode, + e_qcsapi_wifi_set_phy_mode, + + e_qcsapi_wifi_get_option, + e_qcsapi_wifi_set_option, + e_qcsapi_wifi_get_rates, + e_qcsapi_wifi_set_rates, + e_qcsapi_wifi_get_max_bitrate, + e_qcsapi_wifi_set_max_bitrate, + e_qcsapi_wifi_get_beacon_type, + e_qcsapi_wifi_set_beacon_type, + e_qcsapi_wifi_get_beacon_interval, + e_qcsapi_wifi_set_beacon_interval, + + e_qcsapi_get_board_parameter, + + e_qcsapi_wifi_get_list_regulatory_regions, + e_qcsapi_wifi_get_regulatory_tx_power, + e_qcsapi_wifi_get_configured_tx_power, + e_qcsapi_wifi_set_regulatory_channel, + e_qcsapi_wifi_set_regulatory_region, + e_qcsapi_wifi_get_regulatory_region, + e_qcsapi_wifi_overwrite_country_code, + e_qcsapi_wifi_get_list_regulatory_channels, + e_qcsapi_wifi_get_list_regulatory_bands, + e_qcsapi_wifi_get_regulatory_db_version, + e_qcsapi_wifi_set_regulatory_tx_power_cap, + e_qcsapi_wifi_restore_regulatory_tx_power, + e_qcsapi_wifi_set_chan_pri_inactive, + e_qcsapi_wifi_set_chan_disabled, + e_qcsapi_wifi_get_chan_disabled, + + e_qcsapi_wifi_get_tx_power, + e_qcsapi_wifi_set_tx_power, + e_qcsapi_wifi_get_tx_power_ext, + e_qcsapi_wifi_set_tx_power_ext, + e_qcsapi_wifi_get_chan_power_table, + e_qcsapi_wifi_set_chan_power_table, + e_qcsapi_wifi_get_bw_power, + e_qcsapi_wifi_set_bw_power, + e_qcsapi_wifi_get_bf_power, + e_qcsapi_wifi_set_bf_power, + e_qcsapi_wifi_get_power_selection, + e_qcsapi_wifi_set_power_selection, + e_qcsapi_wifi_get_carrier_interference, + e_qcsapi_wifi_get_congestion_idx, + e_qcsapi_wifi_get_supported_tx_power_levels, + e_qcsapi_wifi_get_current_tx_power_level, + e_qcsapi_wifi_set_power_constraint, + e_qcsapi_wifi_get_power_constraint, + e_qcsapi_wifi_set_tpc_interval, + e_qcsapi_wifi_get_tpc_interval, + + e_qcsapi_wifi_get_assoc_records, + + e_qcsapi_wifi_get_list_DFS_channels, + e_qcsapi_wifi_is_channel_DFS, + e_qcsapi_wifi_get_DFS_alt_channel, + e_qcsapi_wifi_set_DFS_alt_channel, + + e_qcsapi_wifi_set_DFS_reentry, + + e_qcsapi_wifi_get_scs_cce_channels, + e_qcsapi_wifi_get_dfs_cce_channels, + + e_qcsapi_wifi_get_csw_records, + e_qcsapi_wifi_get_radar_status, + + e_qcsapi_wifi_get_WEP_key_index, + e_qcsapi_wifi_set_WEP_key_index, + e_qcsapi_wifi_get_WEP_key_passphrase, + e_qcsapi_wifi_set_WEP_key_passphrase, + e_qcsapi_wifi_get_WEP_encryption_level, + e_qcsapi_wifi_get_basic_encryption_modes, + e_qcsapi_wifi_set_basic_encryption_modes, + e_qcsapi_wifi_get_basic_authentication_mode, + e_qcsapi_wifi_set_basic_authentication_mode, + e_qcsapi_wifi_get_WEP_key, + e_qcsapi_wifi_set_WEP_key, + + e_qcsapi_wifi_get_WPA_encryption_modes, + e_qcsapi_wifi_set_WPA_encryption_modes, + e_qcsapi_wifi_get_WPA_authentication_mode, + e_qcsapi_wifi_set_WPA_authentication_mode, + + e_qcsapi_wifi_get_interworking, + e_qcsapi_wifi_set_interworking, + e_qcsapi_wifi_get_80211u_params, + e_qcsapi_wifi_set_80211u_params, + e_qcsapi_security_get_nai_realms, + e_qcsapi_security_add_nai_realm, + e_qcsapi_security_del_nai_realm, + e_qcsapi_security_add_roaming_consortium, + e_qcsapi_security_del_roaming_consortium, + e_qcsapi_security_get_roaming_consortium, + e_qcsapi_security_get_venue_name, + e_qcsapi_security_add_venue_name, + e_qcsapi_security_del_venue_name, + e_qcsapi_security_get_oper_friendly_name, + e_qcsapi_security_add_oper_friendly_name, + e_qcsapi_security_del_oper_friendly_name, + e_qcsapi_security_add_hs20_conn_capab, + e_qcsapi_security_get_hs20_conn_capab, + e_qcsapi_security_del_hs20_conn_capab, + + e_qcsapi_wifi_get_hs20_status, + e_qcsapi_wifi_set_hs20_status, + e_qcsapi_wifi_get_hs20_params, + e_qcsapi_wifi_set_hs20_params, + e_qcsapi_wifi_get_proxy_arp, + e_qcsapi_wifi_set_proxy_arp, + e_qcsapi_wifi_get_l2_ext_filter, + e_qcsapi_wifi_set_l2_ext_filter, + + e_qcsapi_remove_11u_param, + e_qcsapi_remove_hs20_param, + + e_qcsapi_wifi_get_IEEE11i_encryption_modes, + e_qcsapi_wifi_set_IEEE11i_encryption_modes, + e_qcsapi_wifi_get_IEEE11i_authentication_mode, + e_qcsapi_wifi_set_IEEE11i_authentication_mode, + e_qcsapi_wifi_get_michael_errcnt, + e_qcsapi_wifi_get_pre_shared_key, + e_qcsapi_wifi_set_pre_shared_key, + e_qcsapi_wifi_add_radius_auth_server_cfg, + e_qcsapi_wifi_del_radius_auth_server_cfg, + e_qcsapi_wifi_get_radius_auth_server_cfg, + e_qcsapi_wifi_set_own_ip_addr, + e_qcsapi_wifi_set_own_ip_address, + e_qcsapi_wifi_get_psk_auth_failures, + e_qcsapi_wifi_get_key_passphrase, + e_qcsapi_wifi_set_key_passphrase, + e_qcsapi_wifi_get_group_key_interval, + e_qcsapi_wifi_set_group_key_interval, + e_qcsapi_wifi_get_pmf, + e_qcsapi_wifi_set_pmf, + e_qcsapi_wifi_get_count_associations, + e_qcsapi_wifi_get_associated_device_mac_addr, + e_qcsapi_wifi_get_associated_device_ip_addr, + e_qcsapi_wifi_get_link_quality, + e_qcsapi_wifi_get_rssi_per_association, + e_qcsapi_wifi_get_rssi_in_dbm_per_association, + e_qcsapi_wifi_get_snr_per_association, + e_qcsapi_wifi_get_hw_noise_per_association, + e_qcsapi_wifi_get_rx_bytes_per_association, + e_qcsapi_wifi_get_tx_bytes_per_association, + e_qcsapi_wifi_get_rx_packets_per_association, + e_qcsapi_wifi_get_tx_packets_per_association, + e_qcsapi_wifi_get_tx_err_packets_per_association, + e_qcsapi_wifi_get_bw_per_association, + e_qcsapi_wifi_get_tx_phy_rate_per_association, + e_qcsapi_wifi_get_rx_phy_rate_per_association, + e_qcsapi_wifi_get_tx_mcs_per_association, + e_qcsapi_wifi_get_rx_mcs_per_association, + e_qcsapi_wifi_get_achievable_tx_phy_rate_per_association, + e_qcsapi_wifi_get_achievable_rx_phy_rate_per_association, + e_qcsapi_wifi_get_auth_enc_per_association, + e_qcsapi_wifi_get_tput_caps, + e_qcsapi_wifi_get_connection_mode, + e_qcsapi_wifi_get_vendor_per_association, + e_qcsapi_wifi_get_max_mimo, + + e_qcsapi_wifi_get_node_counter, + e_qcsapi_wifi_get_node_param, + e_qcsapi_wifi_get_node_stats, + + e_qcsapi_wifi_get_max_queued, + + e_qcsapi_wifi_disassociate, + e_qcsapi_wifi_associate, + e_qcsapi_wifi_get_wpa_status, + e_qcsapi_wifi_get_auth_state, + e_qcsapi_wifi_get_disconn_info, + e_qcsapi_wifi_reset_disconn_info, + + e_qcsapi_wps_registrar_report_button_press, + e_qcsapi_wps_registrar_report_pin, + e_qcsapi_wps_registrar_get_pp_devname, + e_qcsapi_wps_registrar_set_pp_devname, + e_qcsapi_wps_enrollee_report_button_press, + e_qcsapi_wps_enrollee_report_pin, + e_qcsapi_wps_enrollee_generate_pin, + e_qcsapi_wps_get_ap_pin, + e_qcsapi_wps_set_ap_pin, + e_qcsapi_wps_save_ap_pin, + e_qcsapi_wps_enable_ap_pin, + e_qcsapi_wps_get_sta_pin, + e_qcsapi_wps_get_state, + e_qcsapi_wps_get_configured_state, + e_qcsapi_wps_set_configured_state, + e_qcsapi_wps_get_runtime_state, + e_qcsapi_wps_get_allow_pbc_overlap_status, + e_qcsapi_wps_allow_pbc_overlap, + e_qcsapi_wps_get_param, + e_qcsapi_wps_set_param, + e_qcsapi_wps_set_access_control, + e_qcsapi_wps_get_access_control, + e_qcsapi_non_wps_set_pp_enable, + e_qcsapi_non_wps_get_pp_enable, + e_qcsapi_wps_cancel, + e_qcsapi_wps_set_pbc_in_srcm, + e_qcsapi_wps_get_pbc_in_srcm, + e_qcsapi_wps_timeout, + e_qcsapi_wps_on_hidden_ssid, + e_qcsapi_wps_on_hidden_ssid_status, + e_qcsapi_wps_upnp_enable, + e_qcsapi_wps_upnp_status, + e_qcsapi_wps_registrar_set_dfl_pbc_bss, + e_qcsapi_wps_registrar_get_dfl_pbc_bss, + + e_qcsapi_wifi_set_dwell_times, + e_qcsapi_wifi_get_dwell_times, + e_qcsapi_wifi_set_bgscan_dwell_times, + e_qcsapi_wifi_get_bgscan_dwell_times, + e_qcsapi_wifi_start_scan, + e_qcsapi_wifi_cancel_scan, + e_qcsapi_wifi_get_scan_status, + e_qcsapi_wifi_get_cac_status, + e_qcsapi_wifi_wait_scan_completes, + e_qcsapi_wifi_set_scan_chk_inv, + e_qcsapi_wifi_get_scan_chk_inv, + + e_qcsapi_SSID_create_SSID, + e_qcsapi_SSID_remove_SSID, + e_qcsapi_SSID_verify_SSID, + e_qcsapi_SSID_rename_SSID, + e_qcsapi_SSID_get_SSID_list, + e_qcsapi_SSID_get_protocol, + e_qcsapi_SSID_set_protocol, + e_qcsapi_SSID_get_encryption_modes, + e_qcsapi_SSID_set_encryption_modes, + e_qcsapi_SSID_get_group_encryption, + e_qcsapi_SSID_set_group_encryption, + e_qcsapi_SSID_get_authentication_mode, + e_qcsapi_SSID_set_authentication_mode, + e_qcsapi_SSID_get_pre_shared_key, + e_qcsapi_SSID_set_pre_shared_key, + e_qcsapi_SSID_get_key_passphrase, + e_qcsapi_SSID_set_key_passphrase, + e_qcsapi_SSID_get_pmf, + e_qcsapi_SSID_set_pmf, + e_qcsapi_SSID_get_wps_SSID, + e_qcsapi_wifi_vlan_config, + e_qcsapi_wifi_show_vlan_config, + e_qcsapi_enable_vlan_pass_through, + e_qcsapi_br_vlan_promisc, + e_qcsapi_add_ipff, + e_qcsapi_del_ipff, + e_qcsapi_get_ipff, + + e_qcsapi_wifi_disable_wps, + e_qcsapi_wifi_get_results_AP_scan, + e_qcsapi_wifi_get_count_APs_scanned, + e_qcsapi_wifi_get_properties_AP, + + e_qcsapi_wifi_get_mac_address_filtering, + e_qcsapi_wifi_set_mac_address_filtering, + e_qcsapi_wifi_is_mac_address_authorized, + e_qcsapi_wifi_get_authorized_mac_addresses, + e_qcsapi_wifi_get_denied_mac_addresses, + e_qcsapi_wifi_authorize_mac_address, + e_qcsapi_wifi_deny_mac_address, + e_qcsapi_wifi_remove_mac_address, + e_qcsapi_wifi_clear_mac_address_filters, + e_qcsapi_wifi_set_mac_address_reserve, + e_qcsapi_wifi_get_mac_address_reserve, + e_qcsapi_wifi_clear_mac_address_reserve, + + e_qcsapi_wifi_backoff_fail_max, + e_qcsapi_wifi_backoff_timeout, + + e_qcsapi_wifi_get_time_associated_per_association, + + e_qcsapi_wifi_wds_add_peer, + e_qcsapi_wifi_wds_remove_peer, + e_qcsapi_wifi_wds_get_peer_address, + e_qcsapi_wifi_wds_set_psk, + e_qcsapi_wifi_wds_set_mode, + e_qcsapi_wifi_wds_get_mode, + + e_qcsapi_wifi_qos_get_param, + e_qcsapi_wifi_qos_set_param, + + e_qcsapi_wifi_get_wmm_ac_map, + e_qcsapi_wifi_set_wmm_ac_map, + e_qcsapi_wifi_get_dscp_8021p_map, + e_qcsapi_wifi_set_dscp_8021p_map, + e_qcsapi_wifi_get_dscp_ac_map, + e_qcsapi_wifi_set_dscp_ac_map, + e_qcsapi_wifi_get_priority, + e_qcsapi_wifi_set_priority, + e_qcsapi_wifi_get_airfair, + e_qcsapi_wifi_set_airfair, + + e_qcsapi_config_get_parameter, + e_qcsapi_config_update_parameter, + e_qcsapi_config_get_ssid_parameter, + e_qcsapi_config_update_ssid_parameter, + e_qcsapi_bootcfg_get_parameter, + e_qcsapi_bootcfg_update_parameter, + e_qcsapi_bootcfg_commit, + + e_qcsapi_wifi_start_cca, + e_qcsapi_wifi_get_mcs_rate, + e_qcsapi_wifi_set_mcs_rate, + e_qcsapi_wifi_enable_scs, + e_qcsapi_wifi_scs_switch_channel, + e_qcsapi_wifi_set_scs_verbose, + e_qcsapi_wifi_get_scs_status, + e_qcsapi_wifi_set_scs_smpl_enable, + e_qcsapi_wifi_set_scs_smpl_dwell_time, + e_qcsapi_wifi_set_scs_smpl_intv, + e_qcsapi_wifi_set_scs_intf_detect_intv, + e_qcsapi_wifi_set_scs_thrshld, + e_qcsapi_wifi_set_scs_report_only, + e_qcsapi_wifi_get_scs_report_stat, + e_qcsapi_wifi_set_scs_cca_intf_smth_fctr, + e_qcsapi_wifi_set_scs_chan_mtrc_mrgn, + e_qcsapi_wifi_get_scs_dfs_reentry_request, + e_qcsapi_wifi_get_scs_cca_intf, + e_qcsapi_wifi_get_scs_param, + e_qcsapi_wifi_set_scs_stats, + + e_qcsapi_wifi_start_ocac, + e_qcsapi_wifi_stop_ocac, + e_qcsapi_wifi_get_ocac_status, + e_qcsapi_wifi_set_ocac_threshold, + e_qcsapi_wifi_set_ocac_dwell_time, + e_qcsapi_wifi_set_ocac_duration, + e_qcsapi_wifi_set_ocac_cac_time, + e_qcsapi_wifi_set_ocac_report_only, + + e_qcsapi_wifi_start_dfs_s_radio, + e_qcsapi_wifi_stop_dfs_s_radio, + e_qcsapi_wifi_get_dfs_s_radio_status, + e_qcsapi_wifi_get_dfs_s_radio_availability, + e_qcsapi_wifi_set_dfs_s_radio_threshold, + e_qcsapi_wifi_set_dfs_s_radio_dwell_time, + e_qcsapi_wifi_set_dfs_s_radio_duration, + e_qcsapi_wifi_set_dfs_s_radio_cac_time, + e_qcsapi_wifi_set_dfs_s_radio_report_only, + e_qcsapi_wifi_set_dfs_s_radio_wea_duration, + e_qcsapi_wifi_set_dfs_s_radio_wea_cac_time, + + e_qcsapi_wifi_set_ap_isolate, + e_qcsapi_wifi_get_ap_isolate, + e_qcsapi_wifi_get_pairing_id, + e_qcsapi_wifi_set_pairing_id, + e_qcsapi_wifi_get_pairing_enable, + e_qcsapi_wifi_set_pairing_enable, + + e_qcsapi_wifi_get_rts_threshold, + e_qcsapi_wifi_set_rts_threshold, + + e_qcsapi_wifi_set_txqos_sched_tbl, + e_qcsapi_wifi_get_txqos_sched_tbl, + + e_qcsapi_wifi_set_vendor_fix, + + e_qcsapi_power_save, + e_qcsapi_qpm_level, + + e_qcsapi_get_interface_stats, + e_qcsapi_get_phy_stats, + e_qcsapi_reset_all_stats, + e_qcsapi_eth_phy_power_off, + e_qcsapi_test_traffic, + e_qcsapi_aspm_l1, + e_qcsapi_l1, + + e_qcsapi_get_temperature, + + e_qcsapi_telnet_enable, + e_qcsapi_restore_default_config, + e_qcsapi_set_soc_macaddr, + + e_qcsapi_run_script, + e_qcsapi_qtm, + + e_qcsapi_set_accept_oui_filter, + e_qcsapi_get_accept_oui_filter, + + e_qcsapi_get_swfeat_list, + + e_qcsapi_wifi_set_vht, + e_qcsapi_wifi_get_vht, + + e_qcsapi_last_entry_point = e_qcsapi_wifi_get_vht, + e_qcsapi_help, /* dummy APIs; used to send messages within the driver programs */ + e_qcsapi_exit, + e_qcsapi_aging, + + /* qcsapi cal mode */ + e_qcsapi_calcmd_set_test_mode, + e_qcsapi_calcmd_show_test_packet, + e_qcsapi_calcmd_send_test_packet, + e_qcsapi_calcmd_stop_test_packet, + e_qcsapi_calcmd_send_dc_cw_signal, + e_qcsapi_calcmd_stop_dc_cw_signal, + e_qcsapi_calcmd_get_test_mode_antenna_sel, + e_qcsapi_calcmd_get_test_mode_mcs, + e_qcsapi_calcmd_get_test_mode_bw, + e_qcsapi_calcmd_get_tx_power, + e_qcsapi_calcmd_set_tx_power, + e_qcsapi_calcmd_get_test_mode_rssi, + e_qcsapi_calcmd_set_mac_filter, + e_qcsapi_calcmd_get_antenna_count, + e_qcsapi_calcmd_clear_counter, + e_qcsapi_calcmd_get_info, + + e_qcsapi_wifi_disable_dfs_channels, + e_qcsapi_get_carrier_id, + e_qcsapi_set_carrier_id, + e_qcsapi_wifi_enable_tdls, + e_qcsapi_wifi_enable_tdls_over_qhop, + e_qcsapi_wifi_get_tdls_status, + e_qcsapi_wifi_set_tdls_params, + e_qcsapi_wifi_get_tdls_params, + e_qcsapi_wifi_tdls_operate, + + e_qcsapi_get_spinor_jedecid, + + e_qcsapi_get_custom_value, + + e_qcsapi_wifi_get_mlme_stats_per_mac, + e_qcsapi_wifi_get_mlme_stats_per_association, + e_qcsapi_wifi_get_mlme_stats_macs_list, + + e_qcsapi_get_nss_cap, + e_qcsapi_set_nss_cap, + + e_qcsapi_get_security_defer_mode, + e_qcsapi_set_security_defer_mode, + e_qcsapi_apply_security_config, + + e_qcsapi_wifi_set_intra_bss_isolate, + e_qcsapi_wifi_get_intra_bss_isolate, + e_qcsapi_wifi_set_bss_isolate, + e_qcsapi_wifi_get_bss_isolate, + + e_qcsapi_wowlan_host_state, + e_qcsapi_wowlan_match_type, + e_qcsapi_wowlan_L2_type, + e_qcsapi_wowlan_udp_port, + e_qcsapi_wowlan_pattern, + e_qcsapi_wowlan_get_host_state, + e_qcsapi_wowlan_get_match_type, + e_qcsapi_wowlan_get_L2_type, + e_qcsapi_wowlan_get_udp_port, + e_qcsapi_wowlan_get_pattern, + + e_qcsapi_wifi_set_extender_params, + e_qcsapi_wifi_get_extender_status, + + e_qcsapi_wifi_enable_bgscan, + e_qcsapi_wifi_get_bgscan_status, + + e_qcsapi_get_uboot_info, + e_qcsapi_wifi_get_disassoc_reason, + e_qcsapi_wifi_get_tx_amsdu, + e_qcsapi_wifi_set_tx_amsdu, + + e_qcsapi_is_startprod_done, + + e_qcsapi_wifi_disassociate_sta, + e_qcsapi_wifi_reassociate, + + e_qcsapi_get_bb_param, + e_qcsapi_set_bb_param, + + e_qcsapi_wifi_set_scan_buf_max_size, + e_qcsapi_wifi_get_scan_buf_max_size, + e_qcsapi_wifi_set_scan_table_max_len, + e_qcsapi_wifi_get_scan_table_max_len, + + e_qcsapi_wifi_set_enable_mu, + e_qcsapi_wifi_get_enable_mu, + e_qcsapi_wifi_set_mu_use_precode, + e_qcsapi_wifi_get_mu_use_precode, + e_qcsapi_wifi_set_mu_use_eq, + e_qcsapi_wifi_get_mu_use_eq, + e_qcsapi_wifi_get_mu_groups, + e_qcsapi_get_emac_switch, + e_qcsapi_set_emac_switch, + e_qcsapi_eth_dscp_map, + + e_qcsapi_send_file, + e_qcsapi_wifi_verify_repeater_mode, + e_qcsapi_wifi_set_ap_interface_name, + e_qcsapi_wifi_get_ap_interface_name, + + e_qcsapi_set_optim_stats, + + e_qcsapi_set_sys_time, + e_qcsapi_get_sys_time, + + e_qcsapi_get_eth_info, + e_qcsapi_wifi_block_bss, + + e_qcsapi_nosuch_api = 0 +} qcsapi_entry_point; + +typedef struct qcsapi_generic_parameter { + qcsapi_generic_parameter_type generic_parameter_type; +/* + * Selected QCSAPI entry points take BOTH a Service Set ID (SSID) AND and index + */ + qcsapi_unsigned_int index; + union + { + qcsapi_counter_type counter; + qcsapi_option_type option; + qcsapi_rate_type typeof_rates; + qcsapi_mimo_type modulation; + qcsapi_board_parameter_type board_param; + char the_SSID[ IW_ESSID_MAX_SIZE + 10 ]; + qcsapi_tdls_type type_of_tdls; + qcsapi_tdls_oper tdls_oper; + qcsapi_extender_type type_of_extender; + } parameter_type; +} qcsapi_generic_parameter; + +typedef struct call_qcsapi_bundle { + qcsapi_entry_point caller_qcsapi; + const char *caller_interface; + qcsapi_generic_parameter caller_generic_parameter; + qcsapi_output *caller_output; +} call_qcsapi_bundle; + +typedef struct qcsapi_entry +{ + qcsapi_entry_point e_entry_point; + qcsapi_typeof_api e_typeof_api; + qcsapi_generic_parameter_type e_generic_param_type; + qcsapi_specific_parameter_type e_specific_param_type; +} qcsapi_entry; + + +#ifdef __cplusplus +extern "C" { +#endif + +extern const struct qcsapi_entry *entry_point_enum_to_table_entry( qcsapi_entry_point this_entry_point ); +extern int lookup_generic_parameter_type( + qcsapi_entry_point qcsapi_selection, + qcsapi_generic_parameter_type *p_generic_parameter_type +); + +#ifdef __cplusplus +} +#endif + +#endif /* _QCSAPI_DRIVER_H */ diff --git a/package/firmware/quantenna/src/qcsapi_output.c b/package/firmware/quantenna/src/qcsapi_output.c new file mode 100644 index 000000000..3b236b84a --- /dev/null +++ b/package/firmware/quantenna/src/qcsapi_output.c @@ -0,0 +1,144 @@ +/*SH0 +******************************************************************************* +** ** +** Copyright (c) 2009 - 2011 Quantenna Communications Inc ** +** ** +** File : call_qcsapi_local.c ** +** Description : tiny wrapper to invoke call_qcsapi locally, from main() ** +** ** +******************************************************************************* +** ** +** Redistribution and use in source and binary forms, with or without ** +** modification, are permitted provided that the following conditions ** +** are met: ** +** 1. Redistributions of source code must retain the above copyright ** +** notice, this list of conditions and the following disclaimer. ** +** 2. Redistributions in binary form must reproduce the above copyright ** +** notice, this list of conditions and the following disclaimer in the ** +** documentation and/or other materials provided with the distribution. ** +** 3. The name of the author may not be used to endorse or promote products ** +** derived from this software without specific prior written permission. ** +** ** +** Alternatively, this software may be distributed under the terms of the ** +** GNU General Public License ("GPL") version 2, or (at your option) any ** +** later version as published by the Free Software Foundation. ** +** ** +** In the case this software is distributed under the GPL license, ** +** you should have received a copy of the GNU General Public License ** +** along with this software; if not, write to the Free Software ** +** Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ** +** ** +** THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR ** +** IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES** +** OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. ** +** IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, ** +** INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT ** +** NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,** +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ** +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ** +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF ** +** THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ** +** ** +******************************************************************************* +EH0*/ + +#include "qcsapi_output.h" +#include +#include +#include + +int qcsapi_output_stdio_fn(struct qcsapi_output* qo, + enum qcsapi_print_type out_type, const char * format, va_list args) +{ + FILE *file = stderr; + int rv; + + if (out_type == OUT) { + file = stdout; + } else { + file = stderr; + } + + rv = vfprintf(file, format, args); + + return rv; +} + +int qcsapi_output_buf_fn(struct qcsapi_output* qo, + enum qcsapi_print_type out_type, const char * format, va_list args) +{ + const ssize_t realloc_threshold = 512; + ssize_t limit; + int ret; + struct qcsapi_output_bufinfo *bi = NULL; + + if (out_type == OUT) { + bi = &qo->out; + } else { + bi = &qo->err; + } + + limit = bi->bufsize - bi->bytes_written - 1; + + if ((qo->flags & QCSAPI_OUTPUT_REALLOC) && + (*bi->buf == NULL || + limit < realloc_threshold)) { + char *newbuf; + ssize_t newbufsize; + + newbufsize = bi->bufsize; + if (newbufsize < realloc_threshold) + newbufsize = realloc_threshold; + newbufsize <<= 1; + + newbuf = realloc(*bi->buf, newbufsize); + if (newbuf == NULL) { + return -ENOMEM; + } + *bi->buf = newbuf; + bi->bufsize = newbufsize; + + limit = bi->bufsize - bi->bytes_written - 1; + } + + if (limit <= 0) { + ret = 0; + } else { + ret = vsnprintf(&(*bi->buf)[bi->bytes_written], limit, format, args); + bi->bytes_written += ret; + (*bi->buf)[bi->bytes_written] = '\0'; + } + + return ret; +} + +struct qcsapi_output qcsapi_output_stdio_adapter(void) +{ + struct qcsapi_output qo = {0}; + + qo.func = qcsapi_output_stdio_fn; + + return qo; +} + +struct qcsapi_output qcsapi_output_buf_adapter( + char **outbuf, size_t outbufsize, + char **errbuf, size_t errbufsize, + int realloc_allowed) +{ + struct qcsapi_output qo; + + qo.func = qcsapi_output_buf_fn; + qo.flags = realloc_allowed ? QCSAPI_OUTPUT_REALLOC : 0; + + qo.out.buf = outbuf; + qo.out.bufsize = outbufsize; + qo.out.bytes_written = 0; + + qo.err.buf = errbuf; + qo.err.bufsize = errbufsize; + qo.err.bytes_written = 0; + + return qo; +} + diff --git a/package/firmware/quantenna/src/qcsapi_output.h b/package/firmware/quantenna/src/qcsapi_output.h new file mode 100644 index 000000000..c47083423 --- /dev/null +++ b/package/firmware/quantenna/src/qcsapi_output.h @@ -0,0 +1,98 @@ +/*SH1 +******************************************************************************* +** ** +** Copyright (c) 2009 - 2011 Quantenna Communications Inc ** +** ** +** File : qcsapi.h ** +** Description : ** +** ** +******************************************************************************* +** ** +** Redistribution and use in source and binary forms, with or without ** +** modification, are permitted provided that the following conditions ** +** are met: ** +** 1. Redistributions of source code must retain the above copyright ** +** notice, this list of conditions and the following disclaimer. ** +** 2. Redistributions in binary form must reproduce the above copyright ** +** notice, this list of conditions and the following disclaimer in the ** +** documentation and/or other materials provided with the distribution. ** +** 3. The name of the author may not be used to endorse or promote products ** +** derived from this software without specific prior written permission. ** +** ** +** Alternatively, this software may be distributed under the terms of the ** +** GNU General Public License ("GPL") version 2, or (at your option) any ** +** later version as published by the Free Software Foundation. ** +** ** +** In the case this software is distributed under the GPL license, ** +** you should have received a copy of the GNU General Public License ** +** along with this software; if not, write to the Free Software ** +** Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ** +** ** +** THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR ** +** IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES** +** OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. ** +** IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, ** +** INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT ** +** NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,** +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ** +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ** +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF ** +** THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ** +** ** +******************************************************************************* +EH1*/ + +#ifndef _QCSAPI_OUTPUT_H +#define _QCSAPI_OUTPUT_H + +#include +#include + +enum qcsapi_print_type { + OUT, + ERR, +}; + +struct qcsapi_output_bufinfo { + char **buf; + ssize_t bufsize; + ssize_t bytes_written; +}; + +typedef struct qcsapi_output { + int (*func)(struct qcsapi_output*, enum qcsapi_print_type, const char *, va_list args); + struct qcsapi_output_bufinfo out; + struct qcsapi_output_bufinfo err; +#define QCSAPI_OUTPUT_REALLOC 0x1 + int flags; +} qcsapi_output; + +extern struct qcsapi_output qcsapi_output_stdio_adapter(void); +extern struct qcsapi_output qcsapi_output_buf_adapter(char **stdout_buf, size_t stdout_bufsize, + char **stderr_buf, size_t stderr_bufsize, int realloc_allowed); + +static inline int print_out(struct qcsapi_output *output, const char *format, ...) +{ + int ret; + va_list args; + + va_start(args, format); + ret = output->func(output, OUT, format, args); + va_end(args); + + return ret; +} + +static inline int print_err(struct qcsapi_output *output, const char *format, ...) +{ + int ret; + va_list args; + + va_start(args, format); + ret = output->func(output, ERR, format, args); + va_end(args); + + return ret; +} + +#endif /* _QCSAPI_OUTPUT_H */ diff --git a/package/firmware/quantenna/src/qcsapi_rpc/client/pcie/qcsapi_pcie_rpc_client.c b/package/firmware/quantenna/src/qcsapi_rpc/client/pcie/qcsapi_pcie_rpc_client.c new file mode 100644 index 000000000..5fe2991ac --- /dev/null +++ b/package/firmware/quantenna/src/qcsapi_rpc/client/pcie/qcsapi_pcie_rpc_client.c @@ -0,0 +1,77 @@ +/*SH0 +******************************************************************************* +** ** +** Copyright (c) 2009 - 2011 Quantenna Communications Inc ** +** ** +** File : call_qcsapi_local.c ** +** Description : tiny wrapper to invoke call_qcsapi locally, from main() ** +** ** +******************************************************************************* +** ** +** Redistribution and use in source and binary forms, with or without ** +** modification, are permitted provided that the following conditions ** +** are met: ** +** 1. Redistributions of source code must retain the above copyright ** +** notice, this list of conditions and the following disclaimer. ** +** 2. Redistributions in binary form must reproduce the above copyright ** +** notice, this list of conditions and the following disclaimer in the ** +** documentation and/or other materials provided with the distribution. ** +** 3. The name of the author may not be used to endorse or promote products ** +** derived from this software without specific prior written permission. ** +** ** +** Alternatively, this software may be distributed under the terms of the ** +** GNU General Public License ("GPL") version 2, or (at your option) any ** +** later version as published by the Free Software Foundation. ** +** ** +** In the case this software is distributed under the GPL license, ** +** you should have received a copy of the GNU General Public License ** +** along with this software; if not, write to the Free Software ** +** Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ** +** ** +** THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR ** +** IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES** +** OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. ** +** IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, ** +** INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT ** +** NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,** +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ** +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ** +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF ** +** THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ** +** ** +******************************************************************************* +EH0*/ + +#include +#include +#include +#include +#include +#include + +int main(int argc, char **argv) +{ + int ret; + char *host; + CLIENT *clnt; + struct qcsapi_output output; + + output = qcsapi_output_stdio_adapter(); + + host = "localhost"; + + clnt = clnt_pci_create(host, QCSAPI_PROG, QCSAPI_VERS, NULL); + if (clnt == NULL) { + clnt_pcreateerror(host); + exit (1); + } + + client_qcsapi_set_rpcclient(clnt); + + ret = qcsapi_main(&output, argc, argv); + + clnt_destroy(clnt); + + return ret; +} + diff --git a/package/firmware/quantenna/src/qcsapi_rpc/client/qcsapi_rpc_client.h b/package/firmware/quantenna/src/qcsapi_rpc/client/qcsapi_rpc_client.h new file mode 100644 index 000000000..3a38c1b8e --- /dev/null +++ b/package/firmware/quantenna/src/qcsapi_rpc/client/qcsapi_rpc_client.h @@ -0,0 +1,61 @@ +/*SH0 +******************************************************************************* +** ** +** Copyright (c) 2011 Quantenna Communications Inc ** +** ** +** File : call_qcsapi_sockrpcd.c ** +** Description : Wrapper from rpc server daemon to call_qcsapi, ** +** starting from an rpcgen generated server stub. ** +** ** +******************************************************************************* +** ** +** Redistribution and use in source and binary forms, with or without ** +** modification, are permitted provided that the following conditions ** +** are met: ** +** 1. Redistributions of source code must retain the above copyright ** +** notice, this list of conditions and the following disclaimer. ** +** 2. Redistributions in binary form must reproduce the above copyright ** +** notice, this list of conditions and the following disclaimer in the ** +** documentation and/or other materials provided with the distribution. ** +** 3. The name of the author may not be used to endorse or promote products ** +** derived from this software without specific prior written permission. ** +** ** +** Alternatively, this software may be distributed under the terms of the ** +** GNU General Public License ("GPL") version 2, or (at your option) any ** +** later version as published by the Free Software Foundation. ** +** ** +** In the case this software is distributed under the GPL license, ** +** you should have received a copy of the GNU General Public License ** +** along with this software; if not, write to the Free Software ** +** Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ** +** ** +** THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR ** +** IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES** +** OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. ** +** IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, ** +** INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT ** +** NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,** +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ** +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ** +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF ** +** THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ** +** ** +******************************************************************************* +EH0*/ + +#ifndef __QCSAPI_RPC_CLIENT_H__ +#define __QCSAPI_RPC_CLIENT_H__ + +#include + +typedef void (*client_qcsapi_callback_pre_t)(const char *); +typedef void (*client_qcsapi_callback_post_t)(const char *, int was_error); +typedef void (*client_qcsapi_callback_reconnect_t)(const char *); + +extern void client_qcsapi_set_rpcclient(CLIENT * clnt); +extern void client_qcsapi_set_callbacks(client_qcsapi_callback_pre_t, + client_qcsapi_callback_post_t, + client_qcsapi_callback_reconnect_t); + +#endif /* __QCSAPI_RPC_CLIENT_H__ */ + diff --git a/package/firmware/quantenna/src/qcsapi_rpc/client/socket/qcsapi_socket_rpc_client.c b/package/firmware/quantenna/src/qcsapi_rpc/client/socket/qcsapi_socket_rpc_client.c new file mode 100644 index 000000000..2db83a85e --- /dev/null +++ b/package/firmware/quantenna/src/qcsapi_rpc/client/socket/qcsapi_socket_rpc_client.c @@ -0,0 +1,113 @@ +/*SH0 +******************************************************************************* +** ** +** Copyright (c) 2009 - 2011 Quantenna Communications Inc ** +** ** +** File : call_qcsapi_local.c ** +** Description : tiny wrapper to invoke call_qcsapi locally, from main() ** +** ** +******************************************************************************* +** ** +** Redistribution and use in source and binary forms, with or without ** +** modification, are permitted provided that the following conditions ** +** are met: ** +** 1. Redistributions of source code must retain the above copyright ** +** notice, this list of conditions and the following disclaimer. ** +** 2. Redistributions in binary form must reproduce the above copyright ** +** notice, this list of conditions and the following disclaimer in the ** +** documentation and/or other materials provided with the distribution. ** +** 3. The name of the author may not be used to endorse or promote products ** +** derived from this software without specific prior written permission. ** +** ** +** Alternatively, this software may be distributed under the terms of the ** +** GNU General Public License ("GPL") version 2, or (at your option) any ** +** later version as published by the Free Software Foundation. ** +** ** +** In the case this software is distributed under the GPL license, ** +** you should have received a copy of the GNU General Public License ** +** along with this software; if not, write to the Free Software ** +** Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ** +** ** +** THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR ** +** IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES** +** OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. ** +** IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, ** +** INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT ** +** NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,** +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ** +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ** +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF ** +** THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ** +** ** +******************************************************************************* +EH0*/ + +#include +#include +#include +#include +#include +#include + +static int client_qcsapi_get_udp_retry_timeout(int *argc, char ***argv) +{ + int timeout = -1; + + if (argc && argv && *argc >= 2 && strcmp((*argv)[1], "--udp-retry-timeout") == 0) { + timeout = atoi((const char *)(*argv)[2]); + + /* move program argv[0] */ + (*argv)[2] = (*argv)[0]; + + /* skip over --host args */ + *argc = *argc - 2; + *argv = &(*argv)[2]; + } + + return timeout; +} + +int main(int argc, char **argv) +{ + int ret; + const char *host; + int udp_retry_timeout; + CLIENT *clnt; + struct qcsapi_output output; + + output = qcsapi_output_stdio_adapter(); + + host = client_qcsapi_find_host_addr(&argc, &argv); + if (!host) { + client_qcsapi_find_host_errmsg(argv[0]); + exit(1); + } + + udp_retry_timeout = client_qcsapi_get_udp_retry_timeout(&argc, &argv); + + clnt = clnt_create(host, QCSAPI_PROG, QCSAPI_VERS, "udp"); + if (clnt == NULL) { + clnt = clnt_create(host, QCSAPI_PROG, QCSAPI_VERS, "tcp"); + } else { + if (udp_retry_timeout>0) { + struct timeval value; + value.tv_sec = (time_t)udp_retry_timeout; + value.tv_usec = (suseconds_t)0; + clnt_control(clnt, CLSET_RETRY_TIMEOUT, (char *)&value); + } + } + + if (clnt == NULL) { + clnt_pcreateerror(host); + exit(1); + } + + client_qcsapi_set_rpcclient(clnt); + + ret = qcsapi_main(&output, argc, argv); + + clnt_destroy(clnt); + + return ret; +} + diff --git a/package/firmware/quantenna/src/qcsapi_rpc/client/socket_raw/qcsapi_socketraw_rpc_client.c b/package/firmware/quantenna/src/qcsapi_rpc/client/socket_raw/qcsapi_socketraw_rpc_client.c new file mode 100644 index 000000000..574e4b3d8 --- /dev/null +++ b/package/firmware/quantenna/src/qcsapi_rpc/client/socket_raw/qcsapi_socketraw_rpc_client.c @@ -0,0 +1,88 @@ +/*SH0 +******************************************************************************* +** ** +** Copyright (c) 2014 Quantenna Communications Inc ** +** ** +** ** +******************************************************************************* +** ** +** Redistribution and use in source and binary forms, with or without ** +** modification, are permitted provided that the following conditions ** +** are met: ** +** 1. Redistributions of source code must retain the above copyright ** +** notice, this list of conditions and the following disclaimer. ** +** 2. Redistributions in binary form must reproduce the above copyright ** +** notice, this list of conditions and the following disclaimer in the ** +** documentation and/or other materials provided with the distribution. ** +** 3. The name of the author may not be used to endorse or promote products ** +** derived from this software without specific prior written permission. ** +** ** +** Alternatively, this software may be distributed under the terms of the ** +** GNU General Public License ("GPL") version 2, or (at your option) any ** +** later version as published by the Free Software Foundation. ** +** ** +** In the case this software is distributed under the GPL license, ** +** you should have received a copy of the GNU General Public License ** +** along with this software; if not, write to the Free Software ** +** Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ** +** ** +** THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR ** +** IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES** +** OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. ** +** IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, ** +** INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT ** +** NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,** +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ** +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ** +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF ** +** THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ** +** ** +******************************************************************************* +EH0*/ + +#include +#include +#include +#include +#include +#include + +int main(int argc, char **argv) +{ + CLIENT *clnt; + struct qcsapi_output output; + uint8_t dst_mac[ETH_HLEN]; + int ret; + + if (geteuid()) { + printf("QRPC: only root can do that\n"); + exit(1); + } + + if (argc < 3) { + printf("QRPC: \n"); + exit(1); + } + + if (str_to_mac(argv[2], dst_mac) < 0) { + printf("QRPC: Wrong destination MAC address format. " + "Use the following format: XX:XX:XX:XX:XX:XX\n"); + exit(1); + } + + output = qcsapi_output_stdio_adapter(); + + clnt = qrpc_clnt_raw_create(QCSAPI_PROG, QCSAPI_VERS, argv[1], dst_mac, QRPC_QCSAPI_RPCD_SID); + if (clnt == NULL) { + clnt_pcreateerror("QRPC: "); + exit (1); + } + + client_qcsapi_set_rpcclient(clnt); + argv[2] = argv[0]; + ret = qcsapi_main(&output, argc - 2, &argv[2]); + clnt_destroy(clnt); + + return ret; +} + diff --git a/package/firmware/quantenna/src/qcsapi_rpc/generated/qcsapi_rpc.h b/package/firmware/quantenna/src/qcsapi_rpc/generated/qcsapi_rpc.h new file mode 100644 index 000000000..5243edb39 --- /dev/null +++ b/package/firmware/quantenna/src/qcsapi_rpc/generated/qcsapi_rpc.h @@ -0,0 +1,8401 @@ +/* + * Please do not edit this file. + * It was generated using rpcgen. + */ + +#ifndef _QCSAPI_RPC_H_RPCGEN +#define _QCSAPI_RPC_H_RPCGEN + +#include + +#include + +#ifdef __cplusplus +extern "C" { +#endif + + +typedef char *str; + +struct __rpc_string { + char *data; +}; +typedef struct __rpc_string __rpc_string; + +typedef __rpc_string *__rpc_string_p; + +struct __rpc_qcsapi_mac_addr { + u_char data[6]; +}; +typedef struct __rpc_qcsapi_mac_addr __rpc_qcsapi_mac_addr; + +typedef __rpc_qcsapi_mac_addr *__rpc_qcsapi_mac_addr_p; + +struct __rpc_qcsapi_int_a32 { + int data[32]; +}; +typedef struct __rpc_qcsapi_int_a32 __rpc_qcsapi_int_a32; + +typedef __rpc_qcsapi_int_a32 *__rpc_qcsapi_int_a32_p; + +struct __rpc_qcsapi_SSID { + u_char data[33]; +}; +typedef struct __rpc_qcsapi_SSID __rpc_qcsapi_SSID; + +struct __rpc_qcsapi_scs_ranking_rpt { + uint8_t num; + uint8_t chan[32]; + uint8_t dfs[32]; + uint8_t txpwr[32]; + int32_t metric[32]; + uint32_t metric_age[32]; + uint16_t cca_intf[32]; + uint32_t pmbl_ap[32]; + uint32_t pmbl_sta[32]; + uint32_t duration[32]; + uint32_t times[32]; +}; +typedef struct __rpc_qcsapi_scs_ranking_rpt __rpc_qcsapi_scs_ranking_rpt; + +struct __rpc_qcsapi_scs_score_rpt { + uint8_t num; + uint8_t chan[32]; + uint8_t score[32]; +}; +typedef struct __rpc_qcsapi_scs_score_rpt __rpc_qcsapi_scs_score_rpt; + +struct __rpc_qcsapi_scs_currchan_rpt { + uint8_t chan; + uint16_t cca_try; + uint16_t cca_idle; + uint16_t cca_busy; + uint16_t cca_intf; + uint16_t cca_tx; + uint16_t tx_ms; + uint16_t rx_ms; + uint32_t pmbl; +}; +typedef struct __rpc_qcsapi_scs_currchan_rpt __rpc_qcsapi_scs_currchan_rpt; + +struct __rpc_qcsapi_autochan_rpt { + uint8_t num; + uint8_t chan[32]; + uint8_t dfs[32]; + uint8_t txpwr[32]; + int32_t metric[32]; + uint32_t numbeacons[32]; + uint32_t cci[32]; + uint32_t aci[32]; +}; +typedef struct __rpc_qcsapi_autochan_rpt __rpc_qcsapi_autochan_rpt; + +struct __rpc_qcsapi_scs_param_rpt { + uint32_t scs_cfg_param; + uint32_t scs_signed_param_flag; +}; +typedef struct __rpc_qcsapi_scs_param_rpt __rpc_qcsapi_scs_param_rpt; + +struct __rpc_qcsapi_data_512bytes { + uint8_t data[512]; +}; +typedef struct __rpc_qcsapi_data_512bytes __rpc_qcsapi_data_512bytes; + +struct __rpc_qcsapi_data_256bytes { + uint8_t data[256]; +}; +typedef struct __rpc_qcsapi_data_256bytes __rpc_qcsapi_data_256bytes; + +struct __rpc_qcsapi_disconn_info { + uint32_t asso_sta_count; + uint32_t disconn_count; + uint32_t sequence; + uint32_t up_time; + uint32_t resetflag; +}; +typedef struct __rpc_qcsapi_disconn_info __rpc_qcsapi_disconn_info; + +struct __rpc_qcsapi_data_64bytes { + uint8_t data[64]; +}; +typedef struct __rpc_qcsapi_data_64bytes __rpc_qcsapi_data_64bytes; + +struct __rpc_qcsapi_channel_power_table { + uint8_t channel; + int power_20M[8]; + int power_40M[8]; + int power_80M[8]; +}; +typedef struct __rpc_qcsapi_channel_power_table __rpc_qcsapi_channel_power_table; + +struct __rpc_qcsapi_assoc_records { + __rpc_qcsapi_mac_addr addr[32]; + uint32_t timestamp[32]; +}; +typedef struct __rpc_qcsapi_assoc_records __rpc_qcsapi_assoc_records; + +struct __rpc_ieee8011req_sta_tput_caps { + uint8_t macaddr[6]; + uint8_t mode; + uint8_t htcap_ie[28]; + uint8_t vhtcap_ie[14]; +}; +typedef struct __rpc_ieee8011req_sta_tput_caps __rpc_ieee8011req_sta_tput_caps; + +struct __rpc_qcsapi_measure_report_result { + int common[16]; + uint8_t basic; + uint8_t cca; + uint8_t rpi[8]; + uint8_t channel_load; +}; +typedef struct __rpc_qcsapi_measure_report_result __rpc_qcsapi_measure_report_result; + +struct __rpc_qcsapi_node_stats { + uint64_t tx_bytes; + uint32_t tx_pkts; + uint32_t tx_discard; + uint32_t tx_err; + uint32_t tx_unicast; + uint32_t tx_multicast; + uint32_t tx_broadcast; + uint32_t tx_phy_rate; + uint64_t rx_bytes; + uint32_t rx_pkts; + uint32_t rx_discard; + uint32_t rx_err; + uint32_t rx_unicast; + uint32_t rx_multicast; + uint32_t rx_broadcast; + uint32_t rx_unknown; + uint32_t rx_phy_rate; + __rpc_qcsapi_mac_addr mac_addr; + int32_t hw_noise; + int32_t snr; + int32_t rssi; + int32_t bw; +}; +typedef struct __rpc_qcsapi_node_stats __rpc_qcsapi_node_stats; + +struct __rpc_qcsapi_mlme_stats { + u_int auth; + u_int auth_fails; + u_int assoc; + u_int assoc_fails; + u_int deauth; + u_int diassoc; +}; +typedef struct __rpc_qcsapi_mlme_stats __rpc_qcsapi_mlme_stats; + +struct __rpc_qcsapi_mlme_stats_macs { + __rpc_qcsapi_mac_addr addr[128]; +}; +typedef struct __rpc_qcsapi_mlme_stats_macs __rpc_qcsapi_mlme_stats_macs; + +struct __rpc_qcsapi_csw_record { + uint32_t cnt; + int32_t index; + uint32_t channel[32]; + uint32_t timestamp[32]; + uint32_t reason[32]; +}; +typedef struct __rpc_qcsapi_csw_record __rpc_qcsapi_csw_record; + +struct __rpc_qcsapi_radar_status { + uint32_t channel; + uint32_t flags; + uint32_t ic_radardetected; +}; +typedef struct __rpc_qcsapi_radar_status __rpc_qcsapi_radar_status; + +struct __rpc_qcsapi_ap_properties { + __rpc_qcsapi_SSID ap_name_SSID; + __rpc_qcsapi_mac_addr ap_mac_addr; + u_int ap_flags; + int ap_channel; + int ap_RSSI; + int ap_protocol; + int ap_encryption_modes; + int ap_authentication_mode; + int ap_best_data_rate; + int ap_wps; + int ap_80211_proto; + int ap_qhop_role; +}; +typedef struct __rpc_qcsapi_ap_properties __rpc_qcsapi_ap_properties; + +struct __rpc_qcsapi_interface_stats { + uint64_t tx_bytes; + uint32_t tx_pkts; + uint32_t tx_discard; + uint32_t tx_err; + uint32_t tx_unicast; + uint32_t tx_multicast; + uint32_t tx_broadcast; + uint64_t rx_bytes; + uint32_t rx_pkts; + uint32_t rx_discard; + uint32_t rx_err; + uint32_t rx_unicast; + uint32_t rx_multicast; + uint32_t rx_broadcast; + uint32_t rx_unknown; +}; +typedef struct __rpc_qcsapi_interface_stats __rpc_qcsapi_interface_stats; + +struct __rpc_qcsapi_phy_stats { + uint32_t tstamp; + uint32_t assoc; + uint32_t channel; + uint32_t atten; + uint32_t cca_total; + uint32_t cca_tx; + uint32_t cca_rx; + uint32_t cca_int; + uint32_t cca_idle; + uint32_t rx_pkts; + uint32_t rx_gain; + uint32_t rx_cnt_crc; + float rx_noise; + uint32_t tx_pkts; + uint32_t tx_defers; + uint32_t tx_touts; + uint32_t tx_retries; + uint32_t cnt_sp_fail; + uint32_t cnt_lp_fail; + uint32_t last_rx_mcs; + uint32_t last_tx_mcs; + float last_rssi; + float last_rssi_array[4]; + float last_rcpi; + float last_evm; + float last_evm_array[4]; +}; +typedef struct __rpc_qcsapi_phy_stats __rpc_qcsapi_phy_stats; + +struct __rpc_early_flash_config { + uint32_t method; + uint32_t ipaddr; + uint32_t serverip; + uint8_t built_time_utc_sec[11]; + uint8_t uboot_type; +}; +typedef struct __rpc_early_flash_config __rpc_early_flash_config; + +struct __rpc_qcsapi_data_128bytes { + uint8_t data[128]; +}; +typedef struct __rpc_qcsapi_data_128bytes __rpc_qcsapi_data_128bytes; + +struct __rpc_qcsapi_data_1Kbytes { + uint8_t data[1024]; +}; +typedef struct __rpc_qcsapi_data_1Kbytes __rpc_qcsapi_data_1Kbytes; + +struct __rpc_qcsapi_data_3Kbytes { + uint8_t data[3072]; +}; +typedef struct __rpc_qcsapi_data_3Kbytes __rpc_qcsapi_data_3Kbytes; + +struct __rpc_qcsapi_data_4Kbytes { + uint8_t data[4096]; +}; +typedef struct __rpc_qcsapi_data_4Kbytes __rpc_qcsapi_data_4Kbytes; + +struct __rpc_qcsapi_calcmd_tx_power_rsp { + uint32_t value[4]; +}; +typedef struct __rpc_qcsapi_calcmd_tx_power_rsp __rpc_qcsapi_calcmd_tx_power_rsp; + +struct __rpc_qcsapi_calcmd_rssi_rsp { + int32_t value[4]; +}; +typedef struct __rpc_qcsapi_calcmd_rssi_rsp __rpc_qcsapi_calcmd_rssi_rsp; + +struct qcsapi_bootcfg_get_parameter_rpcdata { + __rpc_string *param_name; + uint32_t max_param_len; + __rpc_string *param_value; + int return_code; +}; +typedef struct qcsapi_bootcfg_get_parameter_rpcdata qcsapi_bootcfg_get_parameter_rpcdata; + +struct qcsapi_bootcfg_update_parameter_rpcdata { + __rpc_string *param_name; + __rpc_string *param_value; + int return_code; +}; +typedef struct qcsapi_bootcfg_update_parameter_rpcdata qcsapi_bootcfg_update_parameter_rpcdata; + +struct qcsapi_bootcfg_commit_rpcdata { + int return_code; +}; +typedef struct qcsapi_bootcfg_commit_rpcdata qcsapi_bootcfg_commit_rpcdata; + +struct qcsapi_telnet_enable_rpcdata { + u_int onoff; + int return_code; +}; +typedef struct qcsapi_telnet_enable_rpcdata qcsapi_telnet_enable_rpcdata; + +struct qcsapi_get_service_name_enum_rpcdata { + __rpc_string *lookup_service; + int *serv_name; + int return_code; +}; +typedef struct qcsapi_get_service_name_enum_rpcdata qcsapi_get_service_name_enum_rpcdata; + +struct qcsapi_get_service_action_enum_rpcdata { + __rpc_string *lookup_action; + int *serv_action; + int return_code; +}; +typedef struct qcsapi_get_service_action_enum_rpcdata qcsapi_get_service_action_enum_rpcdata; + +struct qcsapi_service_control_rpcdata { + int service; + int action; + int return_code; +}; +typedef struct qcsapi_service_control_rpcdata qcsapi_service_control_rpcdata; + +struct qcsapi_wfa_cert_mode_enable_rpcdata { + uint16_t enable; + int return_code; +}; +typedef struct qcsapi_wfa_cert_mode_enable_rpcdata qcsapi_wfa_cert_mode_enable_rpcdata; + +struct qcsapi_wifi_get_scs_cce_channels_rpcdata { + __rpc_string *ifname; + u_int *p_prev_channel; + u_int *p_cur_channel; + int return_code; +}; +typedef struct qcsapi_wifi_get_scs_cce_channels_rpcdata qcsapi_wifi_get_scs_cce_channels_rpcdata; + +struct qcsapi_wifi_scs_enable_rpcdata { + __rpc_string *ifname; + uint16_t enable_val; + int return_code; +}; +typedef struct qcsapi_wifi_scs_enable_rpcdata qcsapi_wifi_scs_enable_rpcdata; + +struct qcsapi_wifi_scs_switch_channel_rpcdata { + __rpc_string *ifname; + int return_code; +}; +typedef struct qcsapi_wifi_scs_switch_channel_rpcdata qcsapi_wifi_scs_switch_channel_rpcdata; + +struct qcsapi_wifi_set_scs_verbose_rpcdata { + __rpc_string *ifname; + uint16_t enable_val; + int return_code; +}; +typedef struct qcsapi_wifi_set_scs_verbose_rpcdata qcsapi_wifi_set_scs_verbose_rpcdata; + +struct qcsapi_wifi_get_scs_status_rpcdata { + __rpc_string *ifname; + u_int *p_scs_status; + int return_code; +}; +typedef struct qcsapi_wifi_get_scs_status_rpcdata qcsapi_wifi_get_scs_status_rpcdata; + +struct qcsapi_wifi_set_scs_smpl_enable_rpcdata { + __rpc_string *ifname; + uint16_t enable_val; + int return_code; +}; +typedef struct qcsapi_wifi_set_scs_smpl_enable_rpcdata qcsapi_wifi_set_scs_smpl_enable_rpcdata; + +struct qcsapi_wifi_set_scs_smpl_dwell_time_rpcdata { + __rpc_string *ifname; + uint16_t scs_sample_time; + int return_code; +}; +typedef struct qcsapi_wifi_set_scs_smpl_dwell_time_rpcdata qcsapi_wifi_set_scs_smpl_dwell_time_rpcdata; + +struct qcsapi_wifi_set_scs_sample_intv_rpcdata { + __rpc_string *ifname; + uint16_t scs_sample_intv; + int return_code; +}; +typedef struct qcsapi_wifi_set_scs_sample_intv_rpcdata qcsapi_wifi_set_scs_sample_intv_rpcdata; + +struct qcsapi_wifi_set_scs_intf_detect_intv_rpcdata { + __rpc_string *ifname; + uint16_t scs_intf_detect_intv; + int return_code; +}; +typedef struct qcsapi_wifi_set_scs_intf_detect_intv_rpcdata qcsapi_wifi_set_scs_intf_detect_intv_rpcdata; + +struct qcsapi_wifi_set_scs_thrshld_rpcdata { + __rpc_string *ifname; + __rpc_string *scs_param_name; + uint16_t scs_threshold; + int return_code; +}; +typedef struct qcsapi_wifi_set_scs_thrshld_rpcdata qcsapi_wifi_set_scs_thrshld_rpcdata; + +struct qcsapi_wifi_set_scs_report_only_rpcdata { + __rpc_string *ifname; + uint16_t scs_report_only; + int return_code; +}; +typedef struct qcsapi_wifi_set_scs_report_only_rpcdata qcsapi_wifi_set_scs_report_only_rpcdata; + +struct qcsapi_wifi_get_scs_stat_report_rpcdata { + __rpc_string *ifname; + __rpc_qcsapi_scs_ranking_rpt *scs_rpt; + int return_code; +}; +typedef struct qcsapi_wifi_get_scs_stat_report_rpcdata qcsapi_wifi_get_scs_stat_report_rpcdata; + +struct qcsapi_wifi_get_scs_score_report_rpcdata { + __rpc_string *ifname; + __rpc_qcsapi_scs_score_rpt *scs_rpt; + int return_code; +}; +typedef struct qcsapi_wifi_get_scs_score_report_rpcdata qcsapi_wifi_get_scs_score_report_rpcdata; + +struct qcsapi_wifi_get_scs_currchan_report_rpcdata { + __rpc_string *ifname; + __rpc_qcsapi_scs_currchan_rpt *scs_currchan_rpt; + int return_code; +}; +typedef struct qcsapi_wifi_get_scs_currchan_report_rpcdata qcsapi_wifi_get_scs_currchan_report_rpcdata; + +struct qcsapi_wifi_set_scs_stats_rpcdata { + __rpc_string *ifname; + uint16_t start; + int return_code; +}; +typedef struct qcsapi_wifi_set_scs_stats_rpcdata qcsapi_wifi_set_scs_stats_rpcdata; + +struct qcsapi_wifi_get_autochan_report_rpcdata { + __rpc_string *ifname; + __rpc_qcsapi_autochan_rpt *autochan_rpt; + int return_code; +}; +typedef struct qcsapi_wifi_get_autochan_report_rpcdata qcsapi_wifi_get_autochan_report_rpcdata; + +struct qcsapi_wifi_set_scs_cca_intf_smth_fctr_rpcdata { + __rpc_string *ifname; + uint8_t smth_fctr_noxp; + uint8_t smth_fctr_xped; + int return_code; +}; +typedef struct qcsapi_wifi_set_scs_cca_intf_smth_fctr_rpcdata qcsapi_wifi_set_scs_cca_intf_smth_fctr_rpcdata; + +struct qcsapi_wifi_set_scs_chan_mtrc_mrgn_rpcdata { + __rpc_string *ifname; + uint8_t chan_mtrc_mrgn; + int return_code; +}; +typedef struct qcsapi_wifi_set_scs_chan_mtrc_mrgn_rpcdata qcsapi_wifi_set_scs_chan_mtrc_mrgn_rpcdata; + +struct qcsapi_wifi_get_scs_cca_intf_rpcdata { + __rpc_string *ifname; + u_int the_channel; + int *p_cca_intf; + int return_code; +}; +typedef struct qcsapi_wifi_get_scs_cca_intf_rpcdata qcsapi_wifi_get_scs_cca_intf_rpcdata; + +struct qcsapi_wifi_get_scs_param_report_rpcdata { + __rpc_string *ifname; + uint32_t param_num; + __rpc_qcsapi_scs_param_rpt *p_scs_param_rpt; + int return_code; +}; +typedef struct qcsapi_wifi_get_scs_param_report_rpcdata qcsapi_wifi_get_scs_param_report_rpcdata; + +struct qcsapi_wifi_get_scs_dfs_reentry_request_rpcdata { + __rpc_string *ifname; + u_int *p_scs_dfs_reentry_request; + int return_code; +}; +typedef struct qcsapi_wifi_get_scs_dfs_reentry_request_rpcdata qcsapi_wifi_get_scs_dfs_reentry_request_rpcdata; + +struct qcsapi_wifi_start_ocac_rpcdata { + __rpc_string *ifname; + uint16_t channel; + int return_code; +}; +typedef struct qcsapi_wifi_start_ocac_rpcdata qcsapi_wifi_start_ocac_rpcdata; + +struct qcsapi_wifi_stop_ocac_rpcdata { + __rpc_string *ifname; + int return_code; +}; +typedef struct qcsapi_wifi_stop_ocac_rpcdata qcsapi_wifi_stop_ocac_rpcdata; + +struct qcsapi_wifi_get_ocac_status_rpcdata { + __rpc_string *ifname; + u_int *status; + int return_code; +}; +typedef struct qcsapi_wifi_get_ocac_status_rpcdata qcsapi_wifi_get_ocac_status_rpcdata; + +struct qcsapi_wifi_set_ocac_dwell_time_rpcdata { + __rpc_string *ifname; + uint16_t dwell_time; + int return_code; +}; +typedef struct qcsapi_wifi_set_ocac_dwell_time_rpcdata qcsapi_wifi_set_ocac_dwell_time_rpcdata; + +struct qcsapi_wifi_set_ocac_duration_rpcdata { + __rpc_string *ifname; + uint16_t duration; + int return_code; +}; +typedef struct qcsapi_wifi_set_ocac_duration_rpcdata qcsapi_wifi_set_ocac_duration_rpcdata; + +struct qcsapi_wifi_set_ocac_cac_time_rpcdata { + __rpc_string *ifname; + uint16_t cac_time; + int return_code; +}; +typedef struct qcsapi_wifi_set_ocac_cac_time_rpcdata qcsapi_wifi_set_ocac_cac_time_rpcdata; + +struct qcsapi_wifi_set_ocac_report_only_rpcdata { + __rpc_string *ifname; + uint16_t enable; + int return_code; +}; +typedef struct qcsapi_wifi_set_ocac_report_only_rpcdata qcsapi_wifi_set_ocac_report_only_rpcdata; + +struct qcsapi_wifi_set_ocac_thrshld_rpcdata { + __rpc_string *ifname; + __rpc_string *param_name; + uint16_t threshold; + int return_code; +}; +typedef struct qcsapi_wifi_set_ocac_thrshld_rpcdata qcsapi_wifi_set_ocac_thrshld_rpcdata; + +struct qcsapi_wifi_start_dfs_s_radio_rpcdata { + __rpc_string *ifname; + uint16_t channel; + int return_code; +}; +typedef struct qcsapi_wifi_start_dfs_s_radio_rpcdata qcsapi_wifi_start_dfs_s_radio_rpcdata; + +struct qcsapi_wifi_stop_dfs_s_radio_rpcdata { + __rpc_string *ifname; + int return_code; +}; +typedef struct qcsapi_wifi_stop_dfs_s_radio_rpcdata qcsapi_wifi_stop_dfs_s_radio_rpcdata; + +struct qcsapi_wifi_get_dfs_s_radio_status_rpcdata { + __rpc_string *ifname; + u_int *status; + int return_code; +}; +typedef struct qcsapi_wifi_get_dfs_s_radio_status_rpcdata qcsapi_wifi_get_dfs_s_radio_status_rpcdata; + +struct qcsapi_wifi_get_dfs_s_radio_availability_rpcdata { + __rpc_string *ifname; + u_int *available; + int return_code; +}; +typedef struct qcsapi_wifi_get_dfs_s_radio_availability_rpcdata qcsapi_wifi_get_dfs_s_radio_availability_rpcdata; + +struct qcsapi_wifi_set_dfs_s_radio_dwell_time_rpcdata { + __rpc_string *ifname; + uint16_t dwell_time; + int return_code; +}; +typedef struct qcsapi_wifi_set_dfs_s_radio_dwell_time_rpcdata qcsapi_wifi_set_dfs_s_radio_dwell_time_rpcdata; + +struct qcsapi_wifi_set_dfs_s_radio_duration_rpcdata { + __rpc_string *ifname; + uint16_t duration; + int return_code; +}; +typedef struct qcsapi_wifi_set_dfs_s_radio_duration_rpcdata qcsapi_wifi_set_dfs_s_radio_duration_rpcdata; + +struct qcsapi_wifi_set_dfs_s_radio_wea_duration_rpcdata { + __rpc_string *ifname; + uint32_t duration; + int return_code; +}; +typedef struct qcsapi_wifi_set_dfs_s_radio_wea_duration_rpcdata qcsapi_wifi_set_dfs_s_radio_wea_duration_rpcdata; + +struct qcsapi_wifi_set_dfs_s_radio_cac_time_rpcdata { + __rpc_string *ifname; + uint16_t cac_time; + int return_code; +}; +typedef struct qcsapi_wifi_set_dfs_s_radio_cac_time_rpcdata qcsapi_wifi_set_dfs_s_radio_cac_time_rpcdata; + +struct qcsapi_wifi_set_dfs_s_radio_wea_cac_time_rpcdata { + __rpc_string *ifname; + uint32_t cac_time; + int return_code; +}; +typedef struct qcsapi_wifi_set_dfs_s_radio_wea_cac_time_rpcdata qcsapi_wifi_set_dfs_s_radio_wea_cac_time_rpcdata; + +struct qcsapi_wifi_set_dfs_s_radio_report_only_rpcdata { + __rpc_string *ifname; + uint16_t enable; + int return_code; +}; +typedef struct qcsapi_wifi_set_dfs_s_radio_report_only_rpcdata qcsapi_wifi_set_dfs_s_radio_report_only_rpcdata; + +struct qcsapi_wifi_set_dfs_s_radio_thrshld_rpcdata { + __rpc_string *ifname; + __rpc_string *param_name; + uint16_t threshold; + int return_code; +}; +typedef struct qcsapi_wifi_set_dfs_s_radio_thrshld_rpcdata qcsapi_wifi_set_dfs_s_radio_thrshld_rpcdata; + +struct qcsapi_init_rpcdata { + int return_code; +}; +typedef struct qcsapi_init_rpcdata qcsapi_init_rpcdata; + +struct qcsapi_console_disconnect_rpcdata { + int return_code; +}; +typedef struct qcsapi_console_disconnect_rpcdata qcsapi_console_disconnect_rpcdata; + +struct qcsapi_wifi_startprod_rpcdata { + int return_code; +}; +typedef struct qcsapi_wifi_startprod_rpcdata qcsapi_wifi_startprod_rpcdata; + +struct qcsapi_is_startprod_done_rpcdata { + int *p_status; + int return_code; +}; +typedef struct qcsapi_is_startprod_done_rpcdata qcsapi_is_startprod_done_rpcdata; + +struct qcsapi_system_get_time_since_start_rpcdata { + u_int *p_elapsed_time; + int return_code; +}; +typedef struct qcsapi_system_get_time_since_start_rpcdata qcsapi_system_get_time_since_start_rpcdata; + +struct qcsapi_get_system_status_rpcdata { + u_int *p_status; + int return_code; +}; +typedef struct qcsapi_get_system_status_rpcdata qcsapi_get_system_status_rpcdata; + +struct qcsapi_get_random_seed_rpcdata { + __rpc_qcsapi_data_512bytes *random_buf; + int return_code; +}; +typedef struct qcsapi_get_random_seed_rpcdata qcsapi_get_random_seed_rpcdata; + +struct qcsapi_set_random_seed_rpcdata { + __rpc_qcsapi_data_512bytes *random_buf; + u_int entropy; + int return_code; +}; +typedef struct qcsapi_set_random_seed_rpcdata qcsapi_set_random_seed_rpcdata; + +struct qcsapi_get_carrier_id_rpcdata { + u_int *p_carrier_id; + int return_code; +}; +typedef struct qcsapi_get_carrier_id_rpcdata qcsapi_get_carrier_id_rpcdata; + +struct qcsapi_set_carrier_id_rpcdata { + uint32_t carrier_id; + uint32_t update_uboot; + int return_code; +}; +typedef struct qcsapi_set_carrier_id_rpcdata qcsapi_set_carrier_id_rpcdata; + +struct qcsapi_wifi_get_spinor_jedecid_rpcdata { + __rpc_string *ifname; + u_int *p_jedecid; + int return_code; +}; +typedef struct qcsapi_wifi_get_spinor_jedecid_rpcdata qcsapi_wifi_get_spinor_jedecid_rpcdata; + +struct qcsapi_wifi_get_bb_param_rpcdata { + __rpc_string *ifname; + u_int *p_jedecid; + int return_code; +}; +typedef struct qcsapi_wifi_get_bb_param_rpcdata qcsapi_wifi_get_bb_param_rpcdata; + +struct qcsapi_wifi_set_bb_param_rpcdata { + __rpc_string *ifname; + u_int p_jedecid; + int return_code; +}; +typedef struct qcsapi_wifi_set_bb_param_rpcdata qcsapi_wifi_set_bb_param_rpcdata; + +struct qcsapi_wifi_set_optim_stats_rpcdata { + __rpc_string *ifname; + u_int p_jedecid; + int return_code; +}; +typedef struct qcsapi_wifi_set_optim_stats_rpcdata qcsapi_wifi_set_optim_stats_rpcdata; + +struct qcsapi_wifi_set_sys_time_rpcdata { + uint32_t timestamp; + int return_code; +}; +typedef struct qcsapi_wifi_set_sys_time_rpcdata qcsapi_wifi_set_sys_time_rpcdata; + +struct qcsapi_wifi_get_sys_time_rpcdata { + uint32_t *timestamp; + int return_code; +}; +typedef struct qcsapi_wifi_get_sys_time_rpcdata qcsapi_wifi_get_sys_time_rpcdata; + +struct qcsapi_set_soc_mac_addr_rpcdata { + __rpc_string *ifname; + __rpc_qcsapi_mac_addr_p soc_mac_addr; + int return_code; +}; +typedef struct qcsapi_set_soc_mac_addr_rpcdata qcsapi_set_soc_mac_addr_rpcdata; + +struct qcsapi_get_custom_value_rpcdata { + __rpc_string *custom_key; + __rpc_string *custom_value; + int return_code; +}; +typedef struct qcsapi_get_custom_value_rpcdata qcsapi_get_custom_value_rpcdata; + +struct qcsapi_config_get_parameter_rpcdata { + __rpc_string *ifname; + __rpc_string *param_name; + uint32_t max_param_len; + __rpc_string *param_value; + int return_code; +}; +typedef struct qcsapi_config_get_parameter_rpcdata qcsapi_config_get_parameter_rpcdata; + +struct qcsapi_config_update_parameter_rpcdata { + __rpc_string *ifname; + __rpc_string *param_name; + __rpc_string *param_value; + int return_code; +}; +typedef struct qcsapi_config_update_parameter_rpcdata qcsapi_config_update_parameter_rpcdata; + +struct qcsapi_config_get_ssid_parameter_rpcdata { + __rpc_string *ifname; + __rpc_string *param_name; + uint32_t max_param_len; + __rpc_string *param_value; + int return_code; +}; +typedef struct qcsapi_config_get_ssid_parameter_rpcdata qcsapi_config_get_ssid_parameter_rpcdata; + +struct qcsapi_config_update_ssid_parameter_rpcdata { + __rpc_string *ifname; + __rpc_string *param_name; + __rpc_string *param_value; + int return_code; +}; +typedef struct qcsapi_config_update_ssid_parameter_rpcdata qcsapi_config_update_ssid_parameter_rpcdata; + +struct qcsapi_file_path_get_config_rpcdata { + int e_file_path; + u_int path_size; + __rpc_string *file_path; + int return_code; +}; +typedef struct qcsapi_file_path_get_config_rpcdata qcsapi_file_path_get_config_rpcdata; + +struct qcsapi_file_path_set_config_rpcdata { + int e_file_path; + __rpc_string *new_path; + int return_code; +}; +typedef struct qcsapi_file_path_set_config_rpcdata qcsapi_file_path_set_config_rpcdata; + +struct qcsapi_restore_default_config_rpcdata { + int flag; + int return_code; +}; +typedef struct qcsapi_restore_default_config_rpcdata qcsapi_restore_default_config_rpcdata; + +struct qcsapi_store_ipaddr_rpcdata { + u_int ipaddr; + u_int netmask; + int return_code; +}; +typedef struct qcsapi_store_ipaddr_rpcdata qcsapi_store_ipaddr_rpcdata; + +struct qcsapi_interface_enable_rpcdata { + __rpc_string *ifname; + int enable_flag; + int return_code; +}; +typedef struct qcsapi_interface_enable_rpcdata qcsapi_interface_enable_rpcdata; + +struct qcsapi_interface_get_status_rpcdata { + __rpc_string *ifname; + __rpc_string *interface_status; + int return_code; +}; +typedef struct qcsapi_interface_get_status_rpcdata qcsapi_interface_get_status_rpcdata; + +struct qcsapi_interface_set_ip4_rpcdata { + __rpc_string *ifname; + __rpc_string *if_param; + uint32_t if_param_val; + int return_code; +}; +typedef struct qcsapi_interface_set_ip4_rpcdata qcsapi_interface_set_ip4_rpcdata; + +struct qcsapi_interface_get_ip4_rpcdata { + __rpc_string *ifname; + __rpc_string *if_param; + __rpc_string *if_param_val; + int return_code; +}; +typedef struct qcsapi_interface_get_ip4_rpcdata qcsapi_interface_get_ip4_rpcdata; + +struct qcsapi_interface_get_counter_rpcdata { + __rpc_string *ifname; + int qcsapi_counter; + u_int *p_counter_value; + int return_code; +}; +typedef struct qcsapi_interface_get_counter_rpcdata qcsapi_interface_get_counter_rpcdata; + +struct qcsapi_interface_get_counter64_rpcdata { + __rpc_string *ifname; + int qcsapi_counter; + uint64_t *p_counter_value; + int return_code; +}; +typedef struct qcsapi_interface_get_counter64_rpcdata qcsapi_interface_get_counter64_rpcdata; + +struct qcsapi_interface_get_mac_addr_rpcdata { + __rpc_string *ifname; + __rpc_qcsapi_mac_addr_p current_mac_addr; + int return_code; +}; +typedef struct qcsapi_interface_get_mac_addr_rpcdata qcsapi_interface_get_mac_addr_rpcdata; + +struct qcsapi_interface_set_mac_addr_rpcdata { + __rpc_string *ifname; + __rpc_qcsapi_mac_addr_p interface_mac_addr; + int return_code; +}; +typedef struct qcsapi_interface_set_mac_addr_rpcdata qcsapi_interface_set_mac_addr_rpcdata; + +struct qcsapi_pm_get_counter_rpcdata { + __rpc_string *ifname; + int qcsapi_counter; + __rpc_string *pm_interval; + u_int *p_counter_value; + int return_code; +}; +typedef struct qcsapi_pm_get_counter_rpcdata qcsapi_pm_get_counter_rpcdata; + +struct qcsapi_set_aspm_l1_rpcdata { + int enable; + int latency; + int return_code; +}; +typedef struct qcsapi_set_aspm_l1_rpcdata qcsapi_set_aspm_l1_rpcdata; + +struct qcsapi_set_l1_rpcdata { + int enter; + int return_code; +}; +typedef struct qcsapi_set_l1_rpcdata qcsapi_set_l1_rpcdata; + +struct qcsapi_pm_get_elapsed_time_rpcdata { + __rpc_string *pm_interval; + u_int *p_elapsed_time; + int return_code; +}; +typedef struct qcsapi_pm_get_elapsed_time_rpcdata qcsapi_pm_get_elapsed_time_rpcdata; + +struct qcsapi_eth_phy_power_control_rpcdata { + int on_off; + __rpc_string *interface; + int return_code; +}; +typedef struct qcsapi_eth_phy_power_control_rpcdata qcsapi_eth_phy_power_control_rpcdata; + +struct qcsapi_get_emac_switch_rpcdata { + __rpc_string *buf; + int return_code; +}; +typedef struct qcsapi_get_emac_switch_rpcdata qcsapi_get_emac_switch_rpcdata; + +struct qcsapi_set_emac_switch_rpcdata { + int value; + int return_code; +}; +typedef struct qcsapi_set_emac_switch_rpcdata qcsapi_set_emac_switch_rpcdata; + +struct qcsapi_eth_dscp_map_rpcdata { + int oper; + __rpc_string *eth_type; + __rpc_string *level; + __rpc_string *value; + u_int size; + __rpc_string *buf; + int return_code; +}; +typedef struct qcsapi_eth_dscp_map_rpcdata qcsapi_eth_dscp_map_rpcdata; + +struct qcsapi_get_eth_info_rpcdata { + __rpc_string *ifname; + int eth_info_type; + int return_code; +}; +typedef struct qcsapi_get_eth_info_rpcdata qcsapi_get_eth_info_rpcdata; + +struct qcsapi_wifi_get_mode_rpcdata { + __rpc_string *ifname; + int *p_wifi_mode; + int return_code; +}; +typedef struct qcsapi_wifi_get_mode_rpcdata qcsapi_wifi_get_mode_rpcdata; + +struct qcsapi_wifi_set_mode_rpcdata { + __rpc_string *ifname; + int new_wifi_mode; + int return_code; +}; +typedef struct qcsapi_wifi_set_mode_rpcdata qcsapi_wifi_set_mode_rpcdata; + +struct qcsapi_wifi_get_phy_mode_rpcdata { + __rpc_string *ifname; + __rpc_string *p_wifi_phy_mode; + int return_code; +}; +typedef struct qcsapi_wifi_get_phy_mode_rpcdata qcsapi_wifi_get_phy_mode_rpcdata; + +struct qcsapi_wifi_set_phy_mode_rpcdata { + __rpc_string *ifname; + __rpc_string *new_phy_mode; + int return_code; +}; +typedef struct qcsapi_wifi_set_phy_mode_rpcdata qcsapi_wifi_set_phy_mode_rpcdata; + +struct qcsapi_wifi_reload_in_mode_rpcdata { + __rpc_string *ifname; + int new_wifi_mode; + int return_code; +}; +typedef struct qcsapi_wifi_reload_in_mode_rpcdata qcsapi_wifi_reload_in_mode_rpcdata; + +struct qcsapi_wifi_rfenable_rpcdata { + u_int onoff; + int return_code; +}; +typedef struct qcsapi_wifi_rfenable_rpcdata qcsapi_wifi_rfenable_rpcdata; + +struct qcsapi_wifi_rfstatus_rpcdata { + u_int *rfstatus; + int return_code; +}; +typedef struct qcsapi_wifi_rfstatus_rpcdata qcsapi_wifi_rfstatus_rpcdata; + +struct qcsapi_wifi_get_bw_rpcdata { + __rpc_string *ifname; + u_int *p_bw; + int return_code; +}; +typedef struct qcsapi_wifi_get_bw_rpcdata qcsapi_wifi_get_bw_rpcdata; + +struct qcsapi_wifi_set_bw_rpcdata { + __rpc_string *ifname; + u_int bw; + int return_code; +}; +typedef struct qcsapi_wifi_set_bw_rpcdata qcsapi_wifi_set_bw_rpcdata; + +struct qcsapi_wifi_set_vht_rpcdata { + __rpc_string *ifname; + u_int the_vht; + int return_code; +}; +typedef struct qcsapi_wifi_set_vht_rpcdata qcsapi_wifi_set_vht_rpcdata; + +struct qcsapi_wifi_get_vht_rpcdata { + __rpc_string *ifname; + u_int *vht; + int return_code; +}; +typedef struct qcsapi_wifi_get_vht_rpcdata qcsapi_wifi_get_vht_rpcdata; + +struct qcsapi_wifi_get_channel_rpcdata { + __rpc_string *ifname; + u_int *p_current_channel; + int return_code; +}; +typedef struct qcsapi_wifi_get_channel_rpcdata qcsapi_wifi_get_channel_rpcdata; + +struct qcsapi_wifi_set_channel_rpcdata { + __rpc_string *ifname; + u_int new_channel; + int return_code; +}; +typedef struct qcsapi_wifi_set_channel_rpcdata qcsapi_wifi_set_channel_rpcdata; + +struct qcsapi_wifi_set_chan_pri_inactive_rpcdata { + __rpc_string *ifname; + u_int channel; + u_int inactive; + int return_code; +}; +typedef struct qcsapi_wifi_set_chan_pri_inactive_rpcdata qcsapi_wifi_set_chan_pri_inactive_rpcdata; + +struct qcsapi_wifi_chan_control_rpcdata { + __rpc_string *ifname; + __rpc_qcsapi_data_256bytes *chans; + uint32_t cnt; + uint8_t flag; + int return_code; +}; +typedef struct qcsapi_wifi_chan_control_rpcdata qcsapi_wifi_chan_control_rpcdata; + +struct qcsapi_wifi_get_chan_disabled_rpcdata { + __rpc_string *ifname; + __rpc_qcsapi_data_256bytes *p_chans; + uint8_t *p_cnt; + int return_code; +}; +typedef struct qcsapi_wifi_get_chan_disabled_rpcdata qcsapi_wifi_get_chan_disabled_rpcdata; + +struct qcsapi_wifi_get_beacon_interval_rpcdata { + __rpc_string *ifname; + u_int *p_current_intval; + int return_code; +}; +typedef struct qcsapi_wifi_get_beacon_interval_rpcdata qcsapi_wifi_get_beacon_interval_rpcdata; + +struct qcsapi_wifi_set_beacon_interval_rpcdata { + __rpc_string *ifname; + u_int new_intval; + int return_code; +}; +typedef struct qcsapi_wifi_set_beacon_interval_rpcdata qcsapi_wifi_set_beacon_interval_rpcdata; + +struct qcsapi_wifi_get_dtim_rpcdata { + __rpc_string *ifname; + u_int *p_dtim; + int return_code; +}; +typedef struct qcsapi_wifi_get_dtim_rpcdata qcsapi_wifi_get_dtim_rpcdata; + +struct qcsapi_wifi_set_dtim_rpcdata { + __rpc_string *ifname; + u_int new_dtim; + int return_code; +}; +typedef struct qcsapi_wifi_set_dtim_rpcdata qcsapi_wifi_set_dtim_rpcdata; + +struct qcsapi_wifi_get_assoc_limit_rpcdata { + __rpc_string *ifname; + u_int *p_assoc_limit; + int return_code; +}; +typedef struct qcsapi_wifi_get_assoc_limit_rpcdata qcsapi_wifi_get_assoc_limit_rpcdata; + +struct qcsapi_wifi_get_bss_assoc_limit_rpcdata { + __rpc_string *ifname; + u_int *p_bss_lim_pri; + int return_code; +}; +typedef struct qcsapi_wifi_get_bss_assoc_limit_rpcdata qcsapi_wifi_get_bss_assoc_limit_rpcdata; + +struct qcsapi_wifi_set_assoc_limit_rpcdata { + __rpc_string *ifname; + u_int new_assoc_limit; + int return_code; +}; +typedef struct qcsapi_wifi_set_assoc_limit_rpcdata qcsapi_wifi_set_assoc_limit_rpcdata; + +struct qcsapi_wifi_set_bss_assoc_limit_rpcdata { + __rpc_string *ifname; + u_int bss_lim_pri; + int return_code; +}; +typedef struct qcsapi_wifi_set_bss_assoc_limit_rpcdata qcsapi_wifi_set_bss_assoc_limit_rpcdata; + +struct qcsapi_wifi_get_BSSID_rpcdata { + __rpc_string *ifname; + __rpc_qcsapi_mac_addr_p current_BSSID; + int return_code; +}; +typedef struct qcsapi_wifi_get_BSSID_rpcdata qcsapi_wifi_get_BSSID_rpcdata; + +struct qcsapi_wifi_get_config_BSSID_rpcdata { + __rpc_string *ifname; + __rpc_qcsapi_mac_addr_p config_BSSID; + int return_code; +}; +typedef struct qcsapi_wifi_get_config_BSSID_rpcdata qcsapi_wifi_get_config_BSSID_rpcdata; + +struct qcsapi_wifi_ssid_get_bssid_rpcdata { + __rpc_string *ifname; + __rpc_string *ssid_str; + __rpc_qcsapi_mac_addr_p bssid; + int return_code; +}; +typedef struct qcsapi_wifi_ssid_get_bssid_rpcdata qcsapi_wifi_ssid_get_bssid_rpcdata; + +struct qcsapi_wifi_ssid_set_bssid_rpcdata { + __rpc_string *ifname; + __rpc_string *ssid_str; + __rpc_qcsapi_mac_addr_p bssid; + int return_code; +}; +typedef struct qcsapi_wifi_ssid_set_bssid_rpcdata qcsapi_wifi_ssid_set_bssid_rpcdata; + +struct qcsapi_wifi_get_SSID_rpcdata { + __rpc_string *ifname; + __rpc_string *SSID_str; + int return_code; +}; +typedef struct qcsapi_wifi_get_SSID_rpcdata qcsapi_wifi_get_SSID_rpcdata; + +struct qcsapi_wifi_set_SSID_rpcdata { + __rpc_string *ifname; + __rpc_string *SSID_str; + int return_code; +}; +typedef struct qcsapi_wifi_set_SSID_rpcdata qcsapi_wifi_set_SSID_rpcdata; + +struct qcsapi_wifi_get_IEEE_802_11_standard_rpcdata { + __rpc_string *ifname; + __rpc_string *IEEE_802_11_standard; + int return_code; +}; +typedef struct qcsapi_wifi_get_IEEE_802_11_standard_rpcdata qcsapi_wifi_get_IEEE_802_11_standard_rpcdata; + +struct qcsapi_wifi_get_list_channels_rpcdata { + __rpc_string *ifname; + __rpc_string *list_of_channels; + int return_code; +}; +typedef struct qcsapi_wifi_get_list_channels_rpcdata qcsapi_wifi_get_list_channels_rpcdata; + +struct qcsapi_wifi_get_mode_switch_rpcdata { + uint8_t *p_wifi_mode_switch_setting; + int return_code; +}; +typedef struct qcsapi_wifi_get_mode_switch_rpcdata qcsapi_wifi_get_mode_switch_rpcdata; + +struct qcsapi_wifi_disassociate_rpcdata { + __rpc_string *ifname; + int return_code; +}; +typedef struct qcsapi_wifi_disassociate_rpcdata qcsapi_wifi_disassociate_rpcdata; + +struct qcsapi_wifi_disassociate_sta_rpcdata { + __rpc_string *ifname; + __rpc_qcsapi_mac_addr_p mac; + int return_code; +}; +typedef struct qcsapi_wifi_disassociate_sta_rpcdata qcsapi_wifi_disassociate_sta_rpcdata; + +struct qcsapi_wifi_reassociate_rpcdata { + __rpc_string *ifname; + int return_code; +}; +typedef struct qcsapi_wifi_reassociate_rpcdata qcsapi_wifi_reassociate_rpcdata; + +struct qcsapi_wifi_get_disconn_info_rpcdata { + __rpc_string *ifname; + __rpc_qcsapi_disconn_info *disconn_info; + int return_code; +}; +typedef struct qcsapi_wifi_get_disconn_info_rpcdata qcsapi_wifi_get_disconn_info_rpcdata; + +struct qcsapi_wifi_disable_wps_rpcdata { + __rpc_string *ifname; + int disable_wps; + int return_code; +}; +typedef struct qcsapi_wifi_disable_wps_rpcdata qcsapi_wifi_disable_wps_rpcdata; + +struct qcsapi_wifi_associate_rpcdata { + __rpc_string *ifname; + __rpc_string *join_ssid; + int return_code; +}; +typedef struct qcsapi_wifi_associate_rpcdata qcsapi_wifi_associate_rpcdata; + +struct qcsapi_wifi_start_cca_rpcdata { + __rpc_string *ifname; + int channel; + int duration; + int return_code; +}; +typedef struct qcsapi_wifi_start_cca_rpcdata qcsapi_wifi_start_cca_rpcdata; + +struct qcsapi_wifi_get_noise_rpcdata { + __rpc_string *ifname; + int *p_noise; + int return_code; +}; +typedef struct qcsapi_wifi_get_noise_rpcdata qcsapi_wifi_get_noise_rpcdata; + +struct qcsapi_wifi_get_rssi_by_chain_rpcdata { + __rpc_string *ifname; + int rf_chain; + int *p_rssi; + int return_code; +}; +typedef struct qcsapi_wifi_get_rssi_by_chain_rpcdata qcsapi_wifi_get_rssi_by_chain_rpcdata; + +struct qcsapi_wifi_get_avg_snr_rpcdata { + __rpc_string *ifname; + int *p_snr; + int return_code; +}; +typedef struct qcsapi_wifi_get_avg_snr_rpcdata qcsapi_wifi_get_avg_snr_rpcdata; + +struct qcsapi_get_primary_interface_rpcdata { + uint32_t maxlen; + __rpc_string *ifname; + int return_code; +}; +typedef struct qcsapi_get_primary_interface_rpcdata qcsapi_get_primary_interface_rpcdata; + +struct qcsapi_get_interface_by_index_rpcdata { + u_int if_index; + uint32_t maxlen; + __rpc_string *ifname; + int return_code; +}; +typedef struct qcsapi_get_interface_by_index_rpcdata qcsapi_get_interface_by_index_rpcdata; + +struct qcsapi_wifi_set_wifi_macaddr_rpcdata { + __rpc_qcsapi_mac_addr_p new_mac_addr; + int return_code; +}; +typedef struct qcsapi_wifi_set_wifi_macaddr_rpcdata qcsapi_wifi_set_wifi_macaddr_rpcdata; + +struct qcsapi_interface_get_BSSID_rpcdata { + __rpc_string *ifname; + __rpc_qcsapi_mac_addr_p current_BSSID; + int return_code; +}; +typedef struct qcsapi_interface_get_BSSID_rpcdata qcsapi_interface_get_BSSID_rpcdata; + +struct qcsapi_wifi_get_rates_rpcdata { + __rpc_string *ifname; + int rate_type; + __rpc_string *supported_rates; + int return_code; +}; +typedef struct qcsapi_wifi_get_rates_rpcdata qcsapi_wifi_get_rates_rpcdata; + +struct qcsapi_wifi_set_rates_rpcdata { + __rpc_string *ifname; + int rate_type; + __rpc_string *current_rates; + int num_rates; + int return_code; +}; +typedef struct qcsapi_wifi_set_rates_rpcdata qcsapi_wifi_set_rates_rpcdata; + +struct qcsapi_get_max_bitrate_rpcdata { + __rpc_string *ifname; + int max_str_len; + __rpc_string *max_bitrate; + int return_code; +}; +typedef struct qcsapi_get_max_bitrate_rpcdata qcsapi_get_max_bitrate_rpcdata; + +struct qcsapi_set_max_bitrate_rpcdata { + __rpc_string *ifname; + __rpc_string *max_bitrate; + int return_code; +}; +typedef struct qcsapi_set_max_bitrate_rpcdata qcsapi_set_max_bitrate_rpcdata; + +struct qcsapi_wifi_qos_get_param_rpcdata { + __rpc_string *ifname; + int the_queue; + int the_param; + int ap_bss_flag; + int *p_value; + int return_code; +}; +typedef struct qcsapi_wifi_qos_get_param_rpcdata qcsapi_wifi_qos_get_param_rpcdata; + +struct qcsapi_wifi_qos_set_param_rpcdata { + __rpc_string *ifname; + int the_queue; + int the_param; + int ap_bss_flag; + int value; + int return_code; +}; +typedef struct qcsapi_wifi_qos_set_param_rpcdata qcsapi_wifi_qos_set_param_rpcdata; + +struct qcsapi_wifi_get_wmm_ac_map_rpcdata { + __rpc_string *ifname; + __rpc_string *mapping_table; + int return_code; +}; +typedef struct qcsapi_wifi_get_wmm_ac_map_rpcdata qcsapi_wifi_get_wmm_ac_map_rpcdata; + +struct qcsapi_wifi_set_wmm_ac_map_rpcdata { + __rpc_string *ifname; + int user_prio; + int ac_index; + int return_code; +}; +typedef struct qcsapi_wifi_set_wmm_ac_map_rpcdata qcsapi_wifi_set_wmm_ac_map_rpcdata; + +struct qcsapi_wifi_get_dscp_8021p_map_rpcdata { + __rpc_string *ifname; + __rpc_string *mapping_table; + int return_code; +}; +typedef struct qcsapi_wifi_get_dscp_8021p_map_rpcdata qcsapi_wifi_get_dscp_8021p_map_rpcdata; + +struct qcsapi_wifi_get_dscp_ac_map_rpcdata { + __rpc_string *ifname; + __rpc_qcsapi_data_64bytes *mapping_table; + int return_code; +}; +typedef struct qcsapi_wifi_get_dscp_ac_map_rpcdata qcsapi_wifi_get_dscp_ac_map_rpcdata; + +struct qcsapi_wifi_set_dscp_8021p_map_rpcdata { + __rpc_string *ifname; + __rpc_string *ip_dscp_list; + uint8_t dot1p_up; + int return_code; +}; +typedef struct qcsapi_wifi_set_dscp_8021p_map_rpcdata qcsapi_wifi_set_dscp_8021p_map_rpcdata; + +struct qcsapi_wifi_set_dscp_ac_map_rpcdata { + __rpc_string *ifname; + __rpc_qcsapi_data_64bytes *dscp_list; + uint8_t dscp_list_len; + uint8_t ac; + int return_code; +}; +typedef struct qcsapi_wifi_set_dscp_ac_map_rpcdata qcsapi_wifi_set_dscp_ac_map_rpcdata; + +struct qcsapi_wifi_get_priority_rpcdata { + __rpc_string *ifname; + uint8_t *p_priority; + int return_code; +}; +typedef struct qcsapi_wifi_get_priority_rpcdata qcsapi_wifi_get_priority_rpcdata; + +struct qcsapi_wifi_set_priority_rpcdata { + __rpc_string *ifname; + uint8_t priority; + int return_code; +}; +typedef struct qcsapi_wifi_set_priority_rpcdata qcsapi_wifi_set_priority_rpcdata; + +struct qcsapi_wifi_get_airfair_rpcdata { + __rpc_string *ifname; + uint8_t *p_airfair; + int return_code; +}; +typedef struct qcsapi_wifi_get_airfair_rpcdata qcsapi_wifi_get_airfair_rpcdata; + +struct qcsapi_wifi_set_airfair_rpcdata { + __rpc_string *ifname; + uint8_t airfair; + int return_code; +}; +typedef struct qcsapi_wifi_set_airfair_rpcdata qcsapi_wifi_set_airfair_rpcdata; + +struct qcsapi_wifi_get_tx_power_rpcdata { + __rpc_string *ifname; + u_int the_channel; + int *p_tx_power; + int return_code; +}; +typedef struct qcsapi_wifi_get_tx_power_rpcdata qcsapi_wifi_get_tx_power_rpcdata; + +struct qcsapi_wifi_set_tx_power_rpcdata { + __rpc_string *ifname; + u_int the_channel; + int tx_power; + int return_code; +}; +typedef struct qcsapi_wifi_set_tx_power_rpcdata qcsapi_wifi_set_tx_power_rpcdata; + +struct qcsapi_wifi_get_bw_power_rpcdata { + __rpc_string *ifname; + u_int the_channel; + int *p_power_20M; + int *p_power_40M; + int *p_power_80M; + int return_code; +}; +typedef struct qcsapi_wifi_get_bw_power_rpcdata qcsapi_wifi_get_bw_power_rpcdata; + +struct qcsapi_wifi_set_bw_power_rpcdata { + __rpc_string *ifname; + u_int the_channel; + int power_20M; + int power_40M; + int power_80M; + int return_code; +}; +typedef struct qcsapi_wifi_set_bw_power_rpcdata qcsapi_wifi_set_bw_power_rpcdata; + +struct qcsapi_wifi_get_bf_power_rpcdata { + __rpc_string *ifname; + u_int the_channel; + u_int number_ss; + int *p_power_20M; + int *p_power_40M; + int *p_power_80M; + int return_code; +}; +typedef struct qcsapi_wifi_get_bf_power_rpcdata qcsapi_wifi_get_bf_power_rpcdata; + +struct qcsapi_wifi_set_bf_power_rpcdata { + __rpc_string *ifname; + u_int the_channel; + u_int number_ss; + int power_20M; + int power_40M; + int power_80M; + int return_code; +}; +typedef struct qcsapi_wifi_set_bf_power_rpcdata qcsapi_wifi_set_bf_power_rpcdata; + +struct qcsapi_wifi_get_tx_power_ext_rpcdata { + __rpc_string *ifname; + u_int the_channel; + u_int bf_on; + u_int number_ss; + int *p_power_20M; + int *p_power_40M; + int *p_power_80M; + int return_code; +}; +typedef struct qcsapi_wifi_get_tx_power_ext_rpcdata qcsapi_wifi_get_tx_power_ext_rpcdata; + +struct qcsapi_wifi_set_tx_power_ext_rpcdata { + __rpc_string *ifname; + u_int the_channel; + u_int bf_on; + u_int number_ss; + int power_20M; + int power_40M; + int power_80M; + int return_code; +}; +typedef struct qcsapi_wifi_set_tx_power_ext_rpcdata qcsapi_wifi_set_tx_power_ext_rpcdata; + +struct qcsapi_wifi_get_chan_power_table_rpcdata { + __rpc_string *ifname; + __rpc_qcsapi_channel_power_table *chan_power_table; + int return_code; +}; +typedef struct qcsapi_wifi_get_chan_power_table_rpcdata qcsapi_wifi_get_chan_power_table_rpcdata; + +struct qcsapi_wifi_set_chan_power_table_rpcdata { + __rpc_string *ifname; + __rpc_qcsapi_channel_power_table *chan_power_table; + int return_code; +}; +typedef struct qcsapi_wifi_set_chan_power_table_rpcdata qcsapi_wifi_set_chan_power_table_rpcdata; + +struct qcsapi_wifi_get_power_selection_rpcdata { + u_int *p_power_selection; + int return_code; +}; +typedef struct qcsapi_wifi_get_power_selection_rpcdata qcsapi_wifi_get_power_selection_rpcdata; + +struct qcsapi_wifi_set_power_selection_rpcdata { + u_int power_selection; + int return_code; +}; +typedef struct qcsapi_wifi_set_power_selection_rpcdata qcsapi_wifi_set_power_selection_rpcdata; + +struct qcsapi_wifi_get_carrier_interference_rpcdata { + __rpc_string *ifname; + int *ci; + int return_code; +}; +typedef struct qcsapi_wifi_get_carrier_interference_rpcdata qcsapi_wifi_get_carrier_interference_rpcdata; + +struct qcsapi_wifi_get_congestion_index_rpcdata { + __rpc_string *ifname; + int *ci; + int return_code; +}; +typedef struct qcsapi_wifi_get_congestion_index_rpcdata qcsapi_wifi_get_congestion_index_rpcdata; + +struct qcsapi_wifi_get_supported_tx_power_levels_rpcdata { + __rpc_string *ifname; + __rpc_string *available_percentages; + int return_code; +}; +typedef struct qcsapi_wifi_get_supported_tx_power_levels_rpcdata qcsapi_wifi_get_supported_tx_power_levels_rpcdata; + +struct qcsapi_wifi_get_current_tx_power_level_rpcdata { + __rpc_string *ifname; + uint32_t *p_current_percentage; + int return_code; +}; +typedef struct qcsapi_wifi_get_current_tx_power_level_rpcdata qcsapi_wifi_get_current_tx_power_level_rpcdata; + +struct qcsapi_wifi_set_power_constraint_rpcdata { + __rpc_string *ifname; + uint32_t pwr_constraint; + int return_code; +}; +typedef struct qcsapi_wifi_set_power_constraint_rpcdata qcsapi_wifi_set_power_constraint_rpcdata; + +struct qcsapi_wifi_get_power_constraint_rpcdata { + __rpc_string *ifname; + uint32_t *p_pwr_constraint; + int return_code; +}; +typedef struct qcsapi_wifi_get_power_constraint_rpcdata qcsapi_wifi_get_power_constraint_rpcdata; + +struct qcsapi_wifi_set_tpc_interval_rpcdata { + __rpc_string *ifname; + int32_t tpc_interval; + int return_code; +}; +typedef struct qcsapi_wifi_set_tpc_interval_rpcdata qcsapi_wifi_set_tpc_interval_rpcdata; + +struct qcsapi_wifi_get_tpc_interval_rpcdata { + __rpc_string *ifname; + uint32_t *p_tpc_interval; + int return_code; +}; +typedef struct qcsapi_wifi_get_tpc_interval_rpcdata qcsapi_wifi_get_tpc_interval_rpcdata; + +struct qcsapi_wifi_get_assoc_records_rpcdata { + __rpc_string *ifname; + int reset; + __rpc_qcsapi_assoc_records *records; + int return_code; +}; +typedef struct qcsapi_wifi_get_assoc_records_rpcdata qcsapi_wifi_get_assoc_records_rpcdata; + +struct qcsapi_wifi_get_ap_isolate_rpcdata { + __rpc_string *ifname; + int *p_ap_isolate; + int return_code; +}; +typedef struct qcsapi_wifi_get_ap_isolate_rpcdata qcsapi_wifi_get_ap_isolate_rpcdata; + +struct qcsapi_wifi_set_ap_isolate_rpcdata { + __rpc_string *ifname; + int new_ap_isolate; + int return_code; +}; +typedef struct qcsapi_wifi_set_ap_isolate_rpcdata qcsapi_wifi_set_ap_isolate_rpcdata; + +struct qcsapi_wifi_get_intra_bss_isolate_rpcdata { + __rpc_string *ifname; + u_int *p_ap_isolate; + int return_code; +}; +typedef struct qcsapi_wifi_get_intra_bss_isolate_rpcdata qcsapi_wifi_get_intra_bss_isolate_rpcdata; + +struct qcsapi_wifi_set_intra_bss_isolate_rpcdata { + __rpc_string *ifname; + u_int new_ap_isolate; + int return_code; +}; +typedef struct qcsapi_wifi_set_intra_bss_isolate_rpcdata qcsapi_wifi_set_intra_bss_isolate_rpcdata; + +struct qcsapi_wifi_get_bss_isolate_rpcdata { + __rpc_string *ifname; + u_int *p_ap_isolate; + int return_code; +}; +typedef struct qcsapi_wifi_get_bss_isolate_rpcdata qcsapi_wifi_get_bss_isolate_rpcdata; + +struct qcsapi_wifi_set_bss_isolate_rpcdata { + __rpc_string *ifname; + u_int new_ap_isolate; + int return_code; +}; +typedef struct qcsapi_wifi_set_bss_isolate_rpcdata qcsapi_wifi_set_bss_isolate_rpcdata; + +struct qcsapi_wifi_disable_dfs_channels_rpcdata { + __rpc_string *ifname; + int disable_dfs; + int channel; + int return_code; +}; +typedef struct qcsapi_wifi_disable_dfs_channels_rpcdata qcsapi_wifi_disable_dfs_channels_rpcdata; + +struct qcsapi_wifi_create_restricted_bss_rpcdata { + __rpc_string *ifname; + __rpc_qcsapi_mac_addr_p mac_addr; + int return_code; +}; +typedef struct qcsapi_wifi_create_restricted_bss_rpcdata qcsapi_wifi_create_restricted_bss_rpcdata; + +struct qcsapi_wifi_create_bss_rpcdata { + __rpc_string *ifname; + __rpc_qcsapi_mac_addr_p mac_addr; + int return_code; +}; +typedef struct qcsapi_wifi_create_bss_rpcdata qcsapi_wifi_create_bss_rpcdata; + +struct qcsapi_wifi_remove_bss_rpcdata { + __rpc_string *ifname; + int return_code; +}; +typedef struct qcsapi_wifi_remove_bss_rpcdata qcsapi_wifi_remove_bss_rpcdata; + +struct qcsapi_wds_add_peer_rpcdata { + __rpc_string *ifname; + __rpc_qcsapi_mac_addr_p peer_address; + int return_code; +}; +typedef struct qcsapi_wds_add_peer_rpcdata qcsapi_wds_add_peer_rpcdata; + +struct qcsapi_wds_add_peer_encrypt_rpcdata { + __rpc_string *ifname; + __rpc_qcsapi_mac_addr_p peer_address; + u_int encryption; + int return_code; +}; +typedef struct qcsapi_wds_add_peer_encrypt_rpcdata qcsapi_wds_add_peer_encrypt_rpcdata; + +struct qcsapi_wds_remove_peer_rpcdata { + __rpc_string *ifname; + __rpc_qcsapi_mac_addr_p peer_address; + int return_code; +}; +typedef struct qcsapi_wds_remove_peer_rpcdata qcsapi_wds_remove_peer_rpcdata; + +struct qcsapi_wds_get_peer_address_rpcdata { + __rpc_string *ifname; + int index; + __rpc_qcsapi_mac_addr_p peer_address; + int return_code; +}; +typedef struct qcsapi_wds_get_peer_address_rpcdata qcsapi_wds_get_peer_address_rpcdata; + +struct qcsapi_wds_set_psk_rpcdata { + __rpc_string *ifname; + __rpc_qcsapi_mac_addr_p peer_address; + __rpc_string *pre_shared_key; + int return_code; +}; +typedef struct qcsapi_wds_set_psk_rpcdata qcsapi_wds_set_psk_rpcdata; + +struct qcsapi_wds_set_mode_rpcdata { + __rpc_string *ifname; + __rpc_qcsapi_mac_addr_p peer_address; + int mode; + int return_code; +}; +typedef struct qcsapi_wds_set_mode_rpcdata qcsapi_wds_set_mode_rpcdata; + +struct qcsapi_wds_get_mode_rpcdata { + __rpc_string *ifname; + int index; + int *mode; + int return_code; +}; +typedef struct qcsapi_wds_get_mode_rpcdata qcsapi_wds_get_mode_rpcdata; + +struct qcsapi_wifi_set_extender_params_rpcdata { + __rpc_string *ifname; + int type; + int param_value; + int return_code; +}; +typedef struct qcsapi_wifi_set_extender_params_rpcdata qcsapi_wifi_set_extender_params_rpcdata; + +struct qcsapi_wifi_get_extender_params_rpcdata { + __rpc_string *ifname; + int type; + int *p_value; + int return_code; +}; +typedef struct qcsapi_wifi_get_extender_params_rpcdata qcsapi_wifi_get_extender_params_rpcdata; + +struct qcsapi_wifi_get_beacon_type_rpcdata { + __rpc_string *ifname; + __rpc_string *p_current_beacon; + int return_code; +}; +typedef struct qcsapi_wifi_get_beacon_type_rpcdata qcsapi_wifi_get_beacon_type_rpcdata; + +struct qcsapi_wifi_set_beacon_type_rpcdata { + __rpc_string *ifname; + __rpc_string *p_new_beacon; + int return_code; +}; +typedef struct qcsapi_wifi_set_beacon_type_rpcdata qcsapi_wifi_set_beacon_type_rpcdata; + +struct qcsapi_wifi_get_WEP_key_index_rpcdata { + __rpc_string *ifname; + u_int *p_key_index; + int return_code; +}; +typedef struct qcsapi_wifi_get_WEP_key_index_rpcdata qcsapi_wifi_get_WEP_key_index_rpcdata; + +struct qcsapi_wifi_set_WEP_key_index_rpcdata { + __rpc_string *ifname; + u_int key_index; + int return_code; +}; +typedef struct qcsapi_wifi_set_WEP_key_index_rpcdata qcsapi_wifi_set_WEP_key_index_rpcdata; + +struct qcsapi_wifi_get_WEP_key_passphrase_rpcdata { + __rpc_string *ifname; + __rpc_string *current_passphrase; + int return_code; +}; +typedef struct qcsapi_wifi_get_WEP_key_passphrase_rpcdata qcsapi_wifi_get_WEP_key_passphrase_rpcdata; + +struct qcsapi_wifi_set_WEP_key_passphrase_rpcdata { + __rpc_string *ifname; + __rpc_string *new_passphrase; + int return_code; +}; +typedef struct qcsapi_wifi_set_WEP_key_passphrase_rpcdata qcsapi_wifi_set_WEP_key_passphrase_rpcdata; + +struct qcsapi_wifi_get_WEP_encryption_level_rpcdata { + __rpc_string *ifname; + __rpc_string *current_encryption_level; + int return_code; +}; +typedef struct qcsapi_wifi_get_WEP_encryption_level_rpcdata qcsapi_wifi_get_WEP_encryption_level_rpcdata; + +struct qcsapi_wifi_get_basic_encryption_modes_rpcdata { + __rpc_string *ifname; + __rpc_string *encryption_modes; + int return_code; +}; +typedef struct qcsapi_wifi_get_basic_encryption_modes_rpcdata qcsapi_wifi_get_basic_encryption_modes_rpcdata; + +struct qcsapi_wifi_set_basic_encryption_modes_rpcdata { + __rpc_string *ifname; + __rpc_string *encryption_modes; + int return_code; +}; +typedef struct qcsapi_wifi_set_basic_encryption_modes_rpcdata qcsapi_wifi_set_basic_encryption_modes_rpcdata; + +struct qcsapi_wifi_get_basic_authentication_mode_rpcdata { + __rpc_string *ifname; + __rpc_string *authentication_mode; + int return_code; +}; +typedef struct qcsapi_wifi_get_basic_authentication_mode_rpcdata qcsapi_wifi_get_basic_authentication_mode_rpcdata; + +struct qcsapi_wifi_set_basic_authentication_mode_rpcdata { + __rpc_string *ifname; + __rpc_string *authentication_mode; + int return_code; +}; +typedef struct qcsapi_wifi_set_basic_authentication_mode_rpcdata qcsapi_wifi_set_basic_authentication_mode_rpcdata; + +struct qcsapi_wifi_get_WEP_key_rpcdata { + __rpc_string *ifname; + u_int key_index; + __rpc_string *current_passphrase; + int return_code; +}; +typedef struct qcsapi_wifi_get_WEP_key_rpcdata qcsapi_wifi_get_WEP_key_rpcdata; + +struct qcsapi_wifi_set_WEP_key_rpcdata { + __rpc_string *ifname; + u_int key_index; + __rpc_string *new_passphrase; + int return_code; +}; +typedef struct qcsapi_wifi_set_WEP_key_rpcdata qcsapi_wifi_set_WEP_key_rpcdata; + +struct qcsapi_wifi_get_WPA_encryption_modes_rpcdata { + __rpc_string *ifname; + __rpc_string *encryption_modes; + int return_code; +}; +typedef struct qcsapi_wifi_get_WPA_encryption_modes_rpcdata qcsapi_wifi_get_WPA_encryption_modes_rpcdata; + +struct qcsapi_wifi_set_WPA_encryption_modes_rpcdata { + __rpc_string *ifname; + __rpc_string *encryption_modes; + int return_code; +}; +typedef struct qcsapi_wifi_set_WPA_encryption_modes_rpcdata qcsapi_wifi_set_WPA_encryption_modes_rpcdata; + +struct qcsapi_wifi_get_WPA_authentication_mode_rpcdata { + __rpc_string *ifname; + __rpc_string *authentication_mode; + int return_code; +}; +typedef struct qcsapi_wifi_get_WPA_authentication_mode_rpcdata qcsapi_wifi_get_WPA_authentication_mode_rpcdata; + +struct qcsapi_wifi_set_WPA_authentication_mode_rpcdata { + __rpc_string *ifname; + __rpc_string *authentication_mode; + int return_code; +}; +typedef struct qcsapi_wifi_set_WPA_authentication_mode_rpcdata qcsapi_wifi_set_WPA_authentication_mode_rpcdata; + +struct qcsapi_wifi_get_interworking_rpcdata { + __rpc_string *ifname; + __rpc_string *interworking; + int return_code; +}; +typedef struct qcsapi_wifi_get_interworking_rpcdata qcsapi_wifi_get_interworking_rpcdata; + +struct qcsapi_wifi_set_interworking_rpcdata { + __rpc_string *ifname; + __rpc_string *interworking; + int return_code; +}; +typedef struct qcsapi_wifi_set_interworking_rpcdata qcsapi_wifi_set_interworking_rpcdata; + +struct qcsapi_wifi_get_80211u_params_rpcdata { + __rpc_string *ifname; + __rpc_string *u_param; + __rpc_string *p_buffer; + int return_code; +}; +typedef struct qcsapi_wifi_get_80211u_params_rpcdata qcsapi_wifi_get_80211u_params_rpcdata; + +struct qcsapi_wifi_set_80211u_params_rpcdata { + __rpc_string *ifname; + __rpc_string *param; + __rpc_string *value1; + __rpc_string *value2; + int return_code; +}; +typedef struct qcsapi_wifi_set_80211u_params_rpcdata qcsapi_wifi_set_80211u_params_rpcdata; + +struct qcsapi_security_get_nai_realms_rpcdata { + __rpc_string *ifname; + __rpc_string *p_value; + int return_code; +}; +typedef struct qcsapi_security_get_nai_realms_rpcdata qcsapi_security_get_nai_realms_rpcdata; + +struct qcsapi_security_add_nai_realm_rpcdata { + __rpc_string *ifname; + int encoding; + __rpc_string *nai_realm; + __rpc_string *eap_method; + int return_code; +}; +typedef struct qcsapi_security_add_nai_realm_rpcdata qcsapi_security_add_nai_realm_rpcdata; + +struct qcsapi_security_del_nai_realm_rpcdata { + __rpc_string *ifname; + __rpc_string *nai_realm; + int return_code; +}; +typedef struct qcsapi_security_del_nai_realm_rpcdata qcsapi_security_del_nai_realm_rpcdata; + +struct qcsapi_security_get_roaming_consortium_rpcdata { + __rpc_string *ifname; + __rpc_string *p_value; + int return_code; +}; +typedef struct qcsapi_security_get_roaming_consortium_rpcdata qcsapi_security_get_roaming_consortium_rpcdata; + +struct qcsapi_security_add_roaming_consortium_rpcdata { + __rpc_string *ifname; + __rpc_string *p_value; + int return_code; +}; +typedef struct qcsapi_security_add_roaming_consortium_rpcdata qcsapi_security_add_roaming_consortium_rpcdata; + +struct qcsapi_security_del_roaming_consortium_rpcdata { + __rpc_string *ifname; + __rpc_string *p_value; + int return_code; +}; +typedef struct qcsapi_security_del_roaming_consortium_rpcdata qcsapi_security_del_roaming_consortium_rpcdata; + +struct qcsapi_security_get_venue_name_rpcdata { + __rpc_string *ifname; + __rpc_string *p_value; + int return_code; +}; +typedef struct qcsapi_security_get_venue_name_rpcdata qcsapi_security_get_venue_name_rpcdata; + +struct qcsapi_security_add_venue_name_rpcdata { + __rpc_string *ifname; + __rpc_string *lang_code; + __rpc_string *venue_name; + int return_code; +}; +typedef struct qcsapi_security_add_venue_name_rpcdata qcsapi_security_add_venue_name_rpcdata; + +struct qcsapi_security_del_venue_name_rpcdata { + __rpc_string *ifname; + __rpc_string *lang_code; + __rpc_string *venue_name; + int return_code; +}; +typedef struct qcsapi_security_del_venue_name_rpcdata qcsapi_security_del_venue_name_rpcdata; + +struct qcsapi_security_get_oper_friendly_name_rpcdata { + __rpc_string *ifname; + __rpc_string *p_value; + int return_code; +}; +typedef struct qcsapi_security_get_oper_friendly_name_rpcdata qcsapi_security_get_oper_friendly_name_rpcdata; + +struct qcsapi_security_add_oper_friendly_name_rpcdata { + __rpc_string *ifname; + __rpc_string *lang_code; + __rpc_string *oper_friendly_name; + int return_code; +}; +typedef struct qcsapi_security_add_oper_friendly_name_rpcdata qcsapi_security_add_oper_friendly_name_rpcdata; + +struct qcsapi_security_del_oper_friendly_name_rpcdata { + __rpc_string *ifname; + __rpc_string *lang_code; + __rpc_string *oper_friendly_name; + int return_code; +}; +typedef struct qcsapi_security_del_oper_friendly_name_rpcdata qcsapi_security_del_oper_friendly_name_rpcdata; + +struct qcsapi_security_get_hs20_conn_capab_rpcdata { + __rpc_string *ifname; + __rpc_string *p_value; + int return_code; +}; +typedef struct qcsapi_security_get_hs20_conn_capab_rpcdata qcsapi_security_get_hs20_conn_capab_rpcdata; + +struct qcsapi_security_add_hs20_conn_capab_rpcdata { + __rpc_string *ifname; + __rpc_string *ip_proto; + __rpc_string *port_num; + __rpc_string *status; + int return_code; +}; +typedef struct qcsapi_security_add_hs20_conn_capab_rpcdata qcsapi_security_add_hs20_conn_capab_rpcdata; + +struct qcsapi_security_del_hs20_conn_capab_rpcdata { + __rpc_string *ifname; + __rpc_string *ip_proto; + __rpc_string *port_num; + __rpc_string *status; + int return_code; +}; +typedef struct qcsapi_security_del_hs20_conn_capab_rpcdata qcsapi_security_del_hs20_conn_capab_rpcdata; + +struct qcsapi_wifi_get_hs20_status_rpcdata { + __rpc_string *ifname; + __rpc_string *p_hs20; + int return_code; +}; +typedef struct qcsapi_wifi_get_hs20_status_rpcdata qcsapi_wifi_get_hs20_status_rpcdata; + +struct qcsapi_wifi_set_hs20_status_rpcdata { + __rpc_string *ifname; + __rpc_string *hs20_val; + int return_code; +}; +typedef struct qcsapi_wifi_set_hs20_status_rpcdata qcsapi_wifi_set_hs20_status_rpcdata; + +struct qcsapi_wifi_get_proxy_arp_rpcdata { + __rpc_string *ifname; + __rpc_string *p_proxy_arp; + int return_code; +}; +typedef struct qcsapi_wifi_get_proxy_arp_rpcdata qcsapi_wifi_get_proxy_arp_rpcdata; + +struct qcsapi_wifi_set_proxy_arp_rpcdata { + __rpc_string *ifname; + __rpc_string *proxy_arp_val; + int return_code; +}; +typedef struct qcsapi_wifi_set_proxy_arp_rpcdata qcsapi_wifi_set_proxy_arp_rpcdata; + +struct qcsapi_wifi_get_l2_ext_filter_rpcdata { + __rpc_string *ifname; + __rpc_string *param; + __rpc_string *value; + int return_code; +}; +typedef struct qcsapi_wifi_get_l2_ext_filter_rpcdata qcsapi_wifi_get_l2_ext_filter_rpcdata; + +struct qcsapi_wifi_set_l2_ext_filter_rpcdata { + __rpc_string *ifname; + __rpc_string *param; + __rpc_string *value; + int return_code; +}; +typedef struct qcsapi_wifi_set_l2_ext_filter_rpcdata qcsapi_wifi_set_l2_ext_filter_rpcdata; + +struct qcsapi_wifi_get_hs20_params_rpcdata { + __rpc_string *ifname; + __rpc_string *hs_param; + __rpc_string *p_buffer; + int return_code; +}; +typedef struct qcsapi_wifi_get_hs20_params_rpcdata qcsapi_wifi_get_hs20_params_rpcdata; + +struct qcsapi_wifi_set_hs20_params_rpcdata { + __rpc_string *ifname; + __rpc_string *hs_param; + __rpc_string *value1; + __rpc_string *value2; + __rpc_string *value3; + __rpc_string *value4; + __rpc_string *value5; + __rpc_string *value6; + int return_code; +}; +typedef struct qcsapi_wifi_set_hs20_params_rpcdata qcsapi_wifi_set_hs20_params_rpcdata; + +struct qcsapi_remove_11u_param_rpcdata { + __rpc_string *ifname; + __rpc_string *param; + int return_code; +}; +typedef struct qcsapi_remove_11u_param_rpcdata qcsapi_remove_11u_param_rpcdata; + +struct qcsapi_remove_hs20_param_rpcdata { + __rpc_string *ifname; + __rpc_string *hs_param; + int return_code; +}; +typedef struct qcsapi_remove_hs20_param_rpcdata qcsapi_remove_hs20_param_rpcdata; + +struct qcsapi_wifi_get_IEEE11i_encryption_modes_rpcdata { + __rpc_string *ifname; + __rpc_string *encryption_modes; + int return_code; +}; +typedef struct qcsapi_wifi_get_IEEE11i_encryption_modes_rpcdata qcsapi_wifi_get_IEEE11i_encryption_modes_rpcdata; + +struct qcsapi_wifi_set_IEEE11i_encryption_modes_rpcdata { + __rpc_string *ifname; + __rpc_string *encryption_modes; + int return_code; +}; +typedef struct qcsapi_wifi_set_IEEE11i_encryption_modes_rpcdata qcsapi_wifi_set_IEEE11i_encryption_modes_rpcdata; + +struct qcsapi_wifi_get_IEEE11i_authentication_mode_rpcdata { + __rpc_string *ifname; + __rpc_string *authentication_mode; + int return_code; +}; +typedef struct qcsapi_wifi_get_IEEE11i_authentication_mode_rpcdata qcsapi_wifi_get_IEEE11i_authentication_mode_rpcdata; + +struct qcsapi_wifi_set_IEEE11i_authentication_mode_rpcdata { + __rpc_string *ifname; + __rpc_string *authentication_mode; + int return_code; +}; +typedef struct qcsapi_wifi_set_IEEE11i_authentication_mode_rpcdata qcsapi_wifi_set_IEEE11i_authentication_mode_rpcdata; + +struct qcsapi_wifi_get_michael_errcnt_rpcdata { + __rpc_string *ifname; + uint32_t *errcount; + int return_code; +}; +typedef struct qcsapi_wifi_get_michael_errcnt_rpcdata qcsapi_wifi_get_michael_errcnt_rpcdata; + +struct qcsapi_wifi_get_pre_shared_key_rpcdata { + __rpc_string *ifname; + u_int key_index; + __rpc_string *pre_shared_key; + int return_code; +}; +typedef struct qcsapi_wifi_get_pre_shared_key_rpcdata qcsapi_wifi_get_pre_shared_key_rpcdata; + +struct qcsapi_wifi_set_pre_shared_key_rpcdata { + __rpc_string *ifname; + u_int key_index; + __rpc_string *pre_shared_key; + int return_code; +}; +typedef struct qcsapi_wifi_set_pre_shared_key_rpcdata qcsapi_wifi_set_pre_shared_key_rpcdata; + +struct qcsapi_wifi_add_radius_auth_server_cfg_rpcdata { + __rpc_string *ifname; + __rpc_string *radius_auth_server_ipaddr; + __rpc_string *radius_auth_server_port; + __rpc_string *radius_auth_server_sh_key; + int return_code; +}; +typedef struct qcsapi_wifi_add_radius_auth_server_cfg_rpcdata qcsapi_wifi_add_radius_auth_server_cfg_rpcdata; + +struct qcsapi_wifi_del_radius_auth_server_cfg_rpcdata { + __rpc_string *ifname; + __rpc_string *radius_auth_server_ipaddr; + __rpc_string *constp_radius_port; + int return_code; +}; +typedef struct qcsapi_wifi_del_radius_auth_server_cfg_rpcdata qcsapi_wifi_del_radius_auth_server_cfg_rpcdata; + +struct qcsapi_wifi_get_radius_auth_server_cfg_rpcdata { + __rpc_string *ifname; + __rpc_string *radius_auth_server_cfg; + int return_code; +}; +typedef struct qcsapi_wifi_get_radius_auth_server_cfg_rpcdata qcsapi_wifi_get_radius_auth_server_cfg_rpcdata; + +struct qcsapi_wifi_set_own_ip_addr_rpcdata { + __rpc_string *ifname; + __rpc_string *own_ip_addr; + int return_code; +}; +typedef struct qcsapi_wifi_set_own_ip_addr_rpcdata qcsapi_wifi_set_own_ip_addr_rpcdata; + +struct qcsapi_wifi_get_key_passphrase_rpcdata { + __rpc_string *ifname; + u_int key_index; + __rpc_string *passphrase; + int return_code; +}; +typedef struct qcsapi_wifi_get_key_passphrase_rpcdata qcsapi_wifi_get_key_passphrase_rpcdata; + +struct qcsapi_wifi_set_key_passphrase_rpcdata { + __rpc_string *ifname; + u_int key_index; + __rpc_string *passphrase; + int return_code; +}; +typedef struct qcsapi_wifi_set_key_passphrase_rpcdata qcsapi_wifi_set_key_passphrase_rpcdata; + +struct qcsapi_wifi_get_group_key_interval_rpcdata { + __rpc_string *ifname; + __rpc_string *group_key_interval; + int return_code; +}; +typedef struct qcsapi_wifi_get_group_key_interval_rpcdata qcsapi_wifi_get_group_key_interval_rpcdata; + +struct qcsapi_wifi_set_group_key_interval_rpcdata { + __rpc_string *ifname; + __rpc_string *group_key_interval; + int return_code; +}; +typedef struct qcsapi_wifi_set_group_key_interval_rpcdata qcsapi_wifi_set_group_key_interval_rpcdata; + +struct qcsapi_wifi_get_pmf_rpcdata { + __rpc_string *ifname; + int *p_pmf_cap; + int return_code; +}; +typedef struct qcsapi_wifi_get_pmf_rpcdata qcsapi_wifi_get_pmf_rpcdata; + +struct qcsapi_wifi_set_pmf_rpcdata { + __rpc_string *ifname; + int pmf_cap; + int return_code; +}; +typedef struct qcsapi_wifi_set_pmf_rpcdata qcsapi_wifi_set_pmf_rpcdata; + +struct qcsapi_wifi_get_wpa_status_rpcdata { + __rpc_string *ifname; + __rpc_string *mac_addr; + u_int max_len; + __rpc_string *wpa_status; + int return_code; +}; +typedef struct qcsapi_wifi_get_wpa_status_rpcdata qcsapi_wifi_get_wpa_status_rpcdata; + +struct qcsapi_wifi_get_psk_auth_failures_rpcdata { + __rpc_string *ifname; + u_int *count; + int return_code; +}; +typedef struct qcsapi_wifi_get_psk_auth_failures_rpcdata qcsapi_wifi_get_psk_auth_failures_rpcdata; + +struct qcsapi_wifi_get_auth_state_rpcdata { + __rpc_string *ifname; + __rpc_string *mac_addr; + int *auth_state; + int return_code; +}; +typedef struct qcsapi_wifi_get_auth_state_rpcdata qcsapi_wifi_get_auth_state_rpcdata; + +struct qcsapi_wifi_set_security_defer_mode_rpcdata { + __rpc_string *ifname; + int defer; + int return_code; +}; +typedef struct qcsapi_wifi_set_security_defer_mode_rpcdata qcsapi_wifi_set_security_defer_mode_rpcdata; + +struct qcsapi_wifi_get_security_defer_mode_rpcdata { + __rpc_string *ifname; + int *defer; + int return_code; +}; +typedef struct qcsapi_wifi_get_security_defer_mode_rpcdata qcsapi_wifi_get_security_defer_mode_rpcdata; + +struct qcsapi_wifi_apply_security_config_rpcdata { + __rpc_string *ifname; + int return_code; +}; +typedef struct qcsapi_wifi_apply_security_config_rpcdata qcsapi_wifi_apply_security_config_rpcdata; + +struct qcsapi_wifi_set_mac_address_filtering_rpcdata { + __rpc_string *ifname; + int new_mac_address_filtering; + int return_code; +}; +typedef struct qcsapi_wifi_set_mac_address_filtering_rpcdata qcsapi_wifi_set_mac_address_filtering_rpcdata; + +struct qcsapi_wifi_get_mac_address_filtering_rpcdata { + __rpc_string *ifname; + int *current_mac_address_filtering; + int return_code; +}; +typedef struct qcsapi_wifi_get_mac_address_filtering_rpcdata qcsapi_wifi_get_mac_address_filtering_rpcdata; + +struct qcsapi_wifi_authorize_mac_address_rpcdata { + __rpc_string *ifname; + __rpc_qcsapi_mac_addr_p address_to_authorize; + int return_code; +}; +typedef struct qcsapi_wifi_authorize_mac_address_rpcdata qcsapi_wifi_authorize_mac_address_rpcdata; + +struct qcsapi_wifi_deny_mac_address_rpcdata { + __rpc_string *ifname; + __rpc_qcsapi_mac_addr_p address_to_deny; + int return_code; +}; +typedef struct qcsapi_wifi_deny_mac_address_rpcdata qcsapi_wifi_deny_mac_address_rpcdata; + +struct qcsapi_wifi_remove_mac_address_rpcdata { + __rpc_string *ifname; + __rpc_qcsapi_mac_addr_p address_to_remove; + int return_code; +}; +typedef struct qcsapi_wifi_remove_mac_address_rpcdata qcsapi_wifi_remove_mac_address_rpcdata; + +struct qcsapi_wifi_is_mac_address_authorized_rpcdata { + __rpc_string *ifname; + __rpc_qcsapi_mac_addr_p address_to_verify; + int *p_mac_address_authorized; + int return_code; +}; +typedef struct qcsapi_wifi_is_mac_address_authorized_rpcdata qcsapi_wifi_is_mac_address_authorized_rpcdata; + +struct qcsapi_wifi_get_authorized_mac_addresses_rpcdata { + __rpc_string *ifname; + u_int sizeof_list; + __rpc_string *list_mac_addresses; + int return_code; +}; +typedef struct qcsapi_wifi_get_authorized_mac_addresses_rpcdata qcsapi_wifi_get_authorized_mac_addresses_rpcdata; + +struct qcsapi_wifi_get_denied_mac_addresses_rpcdata { + __rpc_string *ifname; + u_int sizeof_list; + __rpc_string *list_mac_addresses; + int return_code; +}; +typedef struct qcsapi_wifi_get_denied_mac_addresses_rpcdata qcsapi_wifi_get_denied_mac_addresses_rpcdata; + +struct qcsapi_wifi_set_accept_oui_filter_rpcdata { + __rpc_string *ifname; + __rpc_qcsapi_mac_addr_p oui; + int flag; + int return_code; +}; +typedef struct qcsapi_wifi_set_accept_oui_filter_rpcdata qcsapi_wifi_set_accept_oui_filter_rpcdata; + +struct qcsapi_wifi_get_accept_oui_filter_rpcdata { + __rpc_string *ifname; + u_int sizeof_list; + __rpc_string *oui_list; + int return_code; +}; +typedef struct qcsapi_wifi_get_accept_oui_filter_rpcdata qcsapi_wifi_get_accept_oui_filter_rpcdata; + +struct qcsapi_wifi_clear_mac_address_filters_rpcdata { + __rpc_string *ifname; + int return_code; +}; +typedef struct qcsapi_wifi_clear_mac_address_filters_rpcdata qcsapi_wifi_clear_mac_address_filters_rpcdata; + +struct qcsapi_wifi_set_mac_address_reserve_rpcdata { + __rpc_string *ifname; + __rpc_string *addr; + __rpc_string *mask; + int return_code; +}; +typedef struct qcsapi_wifi_set_mac_address_reserve_rpcdata qcsapi_wifi_set_mac_address_reserve_rpcdata; + +struct qcsapi_wifi_get_mac_address_reserve_rpcdata { + __rpc_string *ifname; + __rpc_string *buf; + int return_code; +}; +typedef struct qcsapi_wifi_get_mac_address_reserve_rpcdata qcsapi_wifi_get_mac_address_reserve_rpcdata; + +struct qcsapi_wifi_clear_mac_address_reserve_rpcdata { + __rpc_string *ifname; + int return_code; +}; +typedef struct qcsapi_wifi_clear_mac_address_reserve_rpcdata qcsapi_wifi_clear_mac_address_reserve_rpcdata; + +struct qcsapi_wifi_get_option_rpcdata { + __rpc_string *ifname; + int qcsapi_option; + int *p_current_option; + int return_code; +}; +typedef struct qcsapi_wifi_get_option_rpcdata qcsapi_wifi_get_option_rpcdata; + +struct qcsapi_wifi_set_option_rpcdata { + __rpc_string *ifname; + int qcsapi_option; + int new_option; + int return_code; +}; +typedef struct qcsapi_wifi_set_option_rpcdata qcsapi_wifi_set_option_rpcdata; + +struct qcsapi_get_board_parameter_rpcdata { + int board_param; + __rpc_string *p_buffer; + int return_code; +}; +typedef struct qcsapi_get_board_parameter_rpcdata qcsapi_get_board_parameter_rpcdata; + +struct qcsapi_get_swfeat_list_rpcdata { + __rpc_string *p_buffer; + int return_code; +}; +typedef struct qcsapi_get_swfeat_list_rpcdata qcsapi_get_swfeat_list_rpcdata; + +struct qcsapi_SSID_create_SSID_rpcdata { + __rpc_string *ifname; + __rpc_string *new_SSID; + int return_code; +}; +typedef struct qcsapi_SSID_create_SSID_rpcdata qcsapi_SSID_create_SSID_rpcdata; + +struct qcsapi_SSID_remove_SSID_rpcdata { + __rpc_string *ifname; + __rpc_string *del_SSID; + int return_code; +}; +typedef struct qcsapi_SSID_remove_SSID_rpcdata qcsapi_SSID_remove_SSID_rpcdata; + +struct qcsapi_SSID_verify_SSID_rpcdata { + __rpc_string *ifname; + __rpc_string *current_SSID; + int return_code; +}; +typedef struct qcsapi_SSID_verify_SSID_rpcdata qcsapi_SSID_verify_SSID_rpcdata; + +struct qcsapi_SSID_rename_SSID_rpcdata { + __rpc_string *ifname; + __rpc_string *current_SSID; + __rpc_string *new_SSID; + int return_code; +}; +typedef struct qcsapi_SSID_rename_SSID_rpcdata qcsapi_SSID_rename_SSID_rpcdata; + +struct qcsapi_SSID_get_SSID_list_rpcdata { + __rpc_string *ifname; + u_int arrayc; + struct { + u_int list_SSID_len; + str *list_SSID_val; + } list_SSID; + int return_code; +}; +typedef struct qcsapi_SSID_get_SSID_list_rpcdata qcsapi_SSID_get_SSID_list_rpcdata; + +struct qcsapi_SSID_set_protocol_rpcdata { + __rpc_string *ifname; + __rpc_string *current_SSID; + __rpc_string *new_protocol; + int return_code; +}; +typedef struct qcsapi_SSID_set_protocol_rpcdata qcsapi_SSID_set_protocol_rpcdata; + +struct qcsapi_SSID_get_protocol_rpcdata { + __rpc_string *ifname; + __rpc_string *current_SSID; + __rpc_string *current_protocol; + int return_code; +}; +typedef struct qcsapi_SSID_get_protocol_rpcdata qcsapi_SSID_get_protocol_rpcdata; + +struct qcsapi_SSID_get_encryption_modes_rpcdata { + __rpc_string *ifname; + __rpc_string *current_SSID; + __rpc_string *encryption_modes; + int return_code; +}; +typedef struct qcsapi_SSID_get_encryption_modes_rpcdata qcsapi_SSID_get_encryption_modes_rpcdata; + +struct qcsapi_SSID_set_encryption_modes_rpcdata { + __rpc_string *ifname; + __rpc_string *current_SSID; + __rpc_string *encryption_modes; + int return_code; +}; +typedef struct qcsapi_SSID_set_encryption_modes_rpcdata qcsapi_SSID_set_encryption_modes_rpcdata; + +struct qcsapi_SSID_get_group_encryption_rpcdata { + __rpc_string *ifname; + __rpc_string *current_SSID; + __rpc_string *encryption_mode; + int return_code; +}; +typedef struct qcsapi_SSID_get_group_encryption_rpcdata qcsapi_SSID_get_group_encryption_rpcdata; + +struct qcsapi_SSID_set_group_encryption_rpcdata { + __rpc_string *ifname; + __rpc_string *current_SSID; + __rpc_string *encryption_mode; + int return_code; +}; +typedef struct qcsapi_SSID_set_group_encryption_rpcdata qcsapi_SSID_set_group_encryption_rpcdata; + +struct qcsapi_SSID_get_authentication_mode_rpcdata { + __rpc_string *ifname; + __rpc_string *current_SSID; + __rpc_string *authentication_mode; + int return_code; +}; +typedef struct qcsapi_SSID_get_authentication_mode_rpcdata qcsapi_SSID_get_authentication_mode_rpcdata; + +struct qcsapi_SSID_set_authentication_mode_rpcdata { + __rpc_string *ifname; + __rpc_string *current_SSID; + __rpc_string *authentication_mode; + int return_code; +}; +typedef struct qcsapi_SSID_set_authentication_mode_rpcdata qcsapi_SSID_set_authentication_mode_rpcdata; + +struct qcsapi_SSID_get_pre_shared_key_rpcdata { + __rpc_string *ifname; + __rpc_string *current_SSID; + u_int key_index; + __rpc_string *pre_shared_key; + int return_code; +}; +typedef struct qcsapi_SSID_get_pre_shared_key_rpcdata qcsapi_SSID_get_pre_shared_key_rpcdata; + +struct qcsapi_SSID_set_pre_shared_key_rpcdata { + __rpc_string *ifname; + __rpc_string *current_SSID; + u_int key_index; + __rpc_string *pre_shared_key; + int return_code; +}; +typedef struct qcsapi_SSID_set_pre_shared_key_rpcdata qcsapi_SSID_set_pre_shared_key_rpcdata; + +struct qcsapi_SSID_get_key_passphrase_rpcdata { + __rpc_string *ifname; + __rpc_string *current_SSID; + u_int key_index; + __rpc_string *passphrase; + int return_code; +}; +typedef struct qcsapi_SSID_get_key_passphrase_rpcdata qcsapi_SSID_get_key_passphrase_rpcdata; + +struct qcsapi_SSID_set_key_passphrase_rpcdata { + __rpc_string *ifname; + __rpc_string *current_SSID; + u_int key_index; + __rpc_string *passphrase; + int return_code; +}; +typedef struct qcsapi_SSID_set_key_passphrase_rpcdata qcsapi_SSID_set_key_passphrase_rpcdata; + +struct qcsapi_SSID_get_pmf_rpcdata { + __rpc_string *ifname; + __rpc_string *current_SSID; + int *p_pmf_cap; + int return_code; +}; +typedef struct qcsapi_SSID_get_pmf_rpcdata qcsapi_SSID_get_pmf_rpcdata; + +struct qcsapi_SSID_set_pmf_rpcdata { + __rpc_string *ifname; + __rpc_string *SSID_str; + int pmf_cap; + int return_code; +}; +typedef struct qcsapi_SSID_set_pmf_rpcdata qcsapi_SSID_set_pmf_rpcdata; + +struct qcsapi_SSID_get_wps_SSID_rpcdata { + __rpc_string *ifname; + __rpc_string *wps_SSID; + int return_code; +}; +typedef struct qcsapi_SSID_get_wps_SSID_rpcdata qcsapi_SSID_get_wps_SSID_rpcdata; + +struct qcsapi_wifi_vlan_config_rpcdata { + __rpc_string *ifname; + int cmd; + uint32_t vlanid; + uint32_t flags; + int return_code; +}; +typedef struct qcsapi_wifi_vlan_config_rpcdata qcsapi_wifi_vlan_config_rpcdata; + +struct qcsapi_wifi_show_vlan_config_rpcdata { + __rpc_string *ifname; + __rpc_string *vcfg; + int return_code; +}; +typedef struct qcsapi_wifi_show_vlan_config_rpcdata qcsapi_wifi_show_vlan_config_rpcdata; + +struct qcsapi_enable_vlan_pass_through_rpcdata { + __rpc_string *ifname; + int enabled; + int return_code; +}; +typedef struct qcsapi_enable_vlan_pass_through_rpcdata qcsapi_enable_vlan_pass_through_rpcdata; + +struct qcsapi_wifi_set_vlan_promisc_rpcdata { + int enable; + int return_code; +}; +typedef struct qcsapi_wifi_set_vlan_promisc_rpcdata qcsapi_wifi_set_vlan_promisc_rpcdata; + +struct qcsapi_wps_registrar_report_button_press_rpcdata { + __rpc_string *ifname; + int return_code; +}; +typedef struct qcsapi_wps_registrar_report_button_press_rpcdata qcsapi_wps_registrar_report_button_press_rpcdata; + +struct qcsapi_wps_registrar_report_pin_rpcdata { + __rpc_string *ifname; + __rpc_string *wps_pin; + int return_code; +}; +typedef struct qcsapi_wps_registrar_report_pin_rpcdata qcsapi_wps_registrar_report_pin_rpcdata; + +struct qcsapi_wps_registrar_get_pp_devname_rpcdata { + __rpc_string *ifname; + int blacklist; + __rpc_string *pp_devname; + int return_code; +}; +typedef struct qcsapi_wps_registrar_get_pp_devname_rpcdata qcsapi_wps_registrar_get_pp_devname_rpcdata; + +struct qcsapi_wps_registrar_set_pp_devname_rpcdata { + __rpc_string *ifname; + int update_blacklist; + __rpc_string *pp_devname; + int return_code; +}; +typedef struct qcsapi_wps_registrar_set_pp_devname_rpcdata qcsapi_wps_registrar_set_pp_devname_rpcdata; + +struct qcsapi_wps_enrollee_report_button_press_rpcdata { + __rpc_string *ifname; + __rpc_qcsapi_mac_addr_p bssid; + int return_code; +}; +typedef struct qcsapi_wps_enrollee_report_button_press_rpcdata qcsapi_wps_enrollee_report_button_press_rpcdata; + +struct qcsapi_wps_enrollee_report_pin_rpcdata { + __rpc_string *ifname; + __rpc_qcsapi_mac_addr_p bssid; + __rpc_string *wps_pin; + int return_code; +}; +typedef struct qcsapi_wps_enrollee_report_pin_rpcdata qcsapi_wps_enrollee_report_pin_rpcdata; + +struct qcsapi_wps_enrollee_generate_pin_rpcdata { + __rpc_string *ifname; + __rpc_qcsapi_mac_addr_p bssid; + __rpc_string *wps_pin; + int return_code; +}; +typedef struct qcsapi_wps_enrollee_generate_pin_rpcdata qcsapi_wps_enrollee_generate_pin_rpcdata; + +struct qcsapi_wps_get_ap_pin_rpcdata { + __rpc_string *ifname; + int force_regenerate; + __rpc_string *wps_pin; + int return_code; +}; +typedef struct qcsapi_wps_get_ap_pin_rpcdata qcsapi_wps_get_ap_pin_rpcdata; + +struct qcsapi_wps_set_ap_pin_rpcdata { + __rpc_string *ifname; + __rpc_string *wps_pin; + int return_code; +}; +typedef struct qcsapi_wps_set_ap_pin_rpcdata qcsapi_wps_set_ap_pin_rpcdata; + +struct qcsapi_wps_save_ap_pin_rpcdata { + __rpc_string *ifname; + int return_code; +}; +typedef struct qcsapi_wps_save_ap_pin_rpcdata qcsapi_wps_save_ap_pin_rpcdata; + +struct qcsapi_wps_enable_ap_pin_rpcdata { + __rpc_string *ifname; + int enable; + int return_code; +}; +typedef struct qcsapi_wps_enable_ap_pin_rpcdata qcsapi_wps_enable_ap_pin_rpcdata; + +struct qcsapi_wps_get_sta_pin_rpcdata { + __rpc_string *ifname; + __rpc_string *wps_pin; + int return_code; +}; +typedef struct qcsapi_wps_get_sta_pin_rpcdata qcsapi_wps_get_sta_pin_rpcdata; + +struct qcsapi_wps_get_state_rpcdata { + __rpc_string *ifname; + u_int max_len; + __rpc_string *wps_state; + int return_code; +}; +typedef struct qcsapi_wps_get_state_rpcdata qcsapi_wps_get_state_rpcdata; + +struct qcsapi_wps_get_configured_state_rpcdata { + __rpc_string *ifname; + u_int max_len; + __rpc_string *wps_state; + int return_code; +}; +typedef struct qcsapi_wps_get_configured_state_rpcdata qcsapi_wps_get_configured_state_rpcdata; + +struct qcsapi_wps_get_runtime_state_rpcdata { + __rpc_string *ifname; + int max_len; + __rpc_string *state; + int return_code; +}; +typedef struct qcsapi_wps_get_runtime_state_rpcdata qcsapi_wps_get_runtime_state_rpcdata; + +struct qcsapi_wps_set_configured_state_rpcdata { + __rpc_string *ifname; + u_int state; + int return_code; +}; +typedef struct qcsapi_wps_set_configured_state_rpcdata qcsapi_wps_set_configured_state_rpcdata; + +struct qcsapi_wps_get_param_rpcdata { + __rpc_string *ifname; + int wps_type; + u_int max_len; + __rpc_string *wps_str; + int return_code; +}; +typedef struct qcsapi_wps_get_param_rpcdata qcsapi_wps_get_param_rpcdata; + +struct qcsapi_wps_set_timeout_rpcdata { + __rpc_string *ifname; + int value; + int return_code; +}; +typedef struct qcsapi_wps_set_timeout_rpcdata qcsapi_wps_set_timeout_rpcdata; + +struct qcsapi_wps_on_hidden_ssid_rpcdata { + __rpc_string *ifname; + int value; + int return_code; +}; +typedef struct qcsapi_wps_on_hidden_ssid_rpcdata qcsapi_wps_on_hidden_ssid_rpcdata; + +struct qcsapi_wps_on_hidden_ssid_status_rpcdata { + __rpc_string *ifname; + int max_len; + __rpc_string *state; + int return_code; +}; +typedef struct qcsapi_wps_on_hidden_ssid_status_rpcdata qcsapi_wps_on_hidden_ssid_status_rpcdata; + +struct qcsapi_wps_upnp_enable_rpcdata { + __rpc_string *ifname; + int value; + int return_code; +}; +typedef struct qcsapi_wps_upnp_enable_rpcdata qcsapi_wps_upnp_enable_rpcdata; + +struct qcsapi_wps_upnp_status_rpcdata { + __rpc_string *ifname; + int reply_len; + __rpc_string *reply; + int return_code; +}; +typedef struct qcsapi_wps_upnp_status_rpcdata qcsapi_wps_upnp_status_rpcdata; + +struct qcsapi_wps_allow_pbc_overlap_rpcdata { + __rpc_string *ifname; + u_int allow; + int return_code; +}; +typedef struct qcsapi_wps_allow_pbc_overlap_rpcdata qcsapi_wps_allow_pbc_overlap_rpcdata; + +struct qcsapi_wps_get_allow_pbc_overlap_status_rpcdata { + __rpc_string *ifname; + int *status; + int return_code; +}; +typedef struct qcsapi_wps_get_allow_pbc_overlap_status_rpcdata qcsapi_wps_get_allow_pbc_overlap_status_rpcdata; + +struct qcsapi_wps_set_access_control_rpcdata { + __rpc_string *ifname; + uint32_t ctrl_state; + int return_code; +}; +typedef struct qcsapi_wps_set_access_control_rpcdata qcsapi_wps_set_access_control_rpcdata; + +struct qcsapi_wps_get_access_control_rpcdata { + __rpc_string *ifname; + uint32_t *ctrl_state; + int return_code; +}; +typedef struct qcsapi_wps_get_access_control_rpcdata qcsapi_wps_get_access_control_rpcdata; + +struct qcsapi_wps_set_param_rpcdata { + __rpc_string *ifname; + int param_type; + __rpc_string *param_value; + int return_code; +}; +typedef struct qcsapi_wps_set_param_rpcdata qcsapi_wps_set_param_rpcdata; + +struct qcsapi_wps_cancel_rpcdata { + __rpc_string *ifname; + int return_code; +}; +typedef struct qcsapi_wps_cancel_rpcdata qcsapi_wps_cancel_rpcdata; + +struct qcsapi_wps_set_pbc_in_srcm_rpcdata { + __rpc_string *ifname; + u_int enabled; + int return_code; +}; +typedef struct qcsapi_wps_set_pbc_in_srcm_rpcdata qcsapi_wps_set_pbc_in_srcm_rpcdata; + +struct qcsapi_wps_get_pbc_in_srcm_rpcdata { + __rpc_string *ifname; + u_int *p_enabled; + int return_code; +}; +typedef struct qcsapi_wps_get_pbc_in_srcm_rpcdata qcsapi_wps_get_pbc_in_srcm_rpcdata; + +struct qcsapi_registrar_set_default_pbc_bss_rpcdata { + __rpc_string *ifname; + int return_code; +}; +typedef struct qcsapi_registrar_set_default_pbc_bss_rpcdata qcsapi_registrar_set_default_pbc_bss_rpcdata; + +struct qcsapi_registrar_get_default_pbc_bss_rpcdata { + int len; + __rpc_string *default_bss; + int return_code; +}; +typedef struct qcsapi_registrar_get_default_pbc_bss_rpcdata qcsapi_registrar_get_default_pbc_bss_rpcdata; + +struct qcsapi_gpio_set_config_rpcdata { + uint8_t gpio_pin; + int new_gpio_config; + int return_code; +}; +typedef struct qcsapi_gpio_set_config_rpcdata qcsapi_gpio_set_config_rpcdata; + +struct qcsapi_gpio_get_config_rpcdata { + uint8_t gpio_pin; + int *p_gpio_config; + int return_code; +}; +typedef struct qcsapi_gpio_get_config_rpcdata qcsapi_gpio_get_config_rpcdata; + +struct qcsapi_led_get_rpcdata { + uint8_t led_ident; + uint8_t *p_led_setting; + int return_code; +}; +typedef struct qcsapi_led_get_rpcdata qcsapi_led_get_rpcdata; + +struct qcsapi_led_set_rpcdata { + uint8_t led_ident; + uint8_t new_led_setting; + int return_code; +}; +typedef struct qcsapi_led_set_rpcdata qcsapi_led_set_rpcdata; + +struct qcsapi_led_pwm_enable_rpcdata { + uint8_t led_ident; + uint8_t onoff; + u_int high_count; + u_int low_count; + int return_code; +}; +typedef struct qcsapi_led_pwm_enable_rpcdata qcsapi_led_pwm_enable_rpcdata; + +struct qcsapi_led_brightness_rpcdata { + uint8_t led_ident; + u_int level; + int return_code; +}; +typedef struct qcsapi_led_brightness_rpcdata qcsapi_led_brightness_rpcdata; + +struct qcsapi_gpio_enable_wps_push_button_rpcdata { + uint8_t wps_push_button; + uint8_t active_logic; + uint8_t use_interrupt_flag; + int return_code; +}; +typedef struct qcsapi_gpio_enable_wps_push_button_rpcdata qcsapi_gpio_enable_wps_push_button_rpcdata; + +struct qcsapi_wifi_get_count_associations_rpcdata { + __rpc_string *ifname; + u_int *p_association_count; + int return_code; +}; +typedef struct qcsapi_wifi_get_count_associations_rpcdata qcsapi_wifi_get_count_associations_rpcdata; + +struct qcsapi_wifi_get_associated_device_mac_addr_rpcdata { + __rpc_string *ifname; + u_int device_index; + __rpc_qcsapi_mac_addr_p device_mac_addr; + int return_code; +}; +typedef struct qcsapi_wifi_get_associated_device_mac_addr_rpcdata qcsapi_wifi_get_associated_device_mac_addr_rpcdata; + +struct qcsapi_wifi_get_associated_device_ip_addr_rpcdata { + __rpc_string *ifname; + u_int device_index; + u_int *ip_addr; + int return_code; +}; +typedef struct qcsapi_wifi_get_associated_device_ip_addr_rpcdata qcsapi_wifi_get_associated_device_ip_addr_rpcdata; + +struct qcsapi_wifi_get_link_quality_rpcdata { + __rpc_string *ifname; + u_int association_index; + u_int *p_link_quality; + int return_code; +}; +typedef struct qcsapi_wifi_get_link_quality_rpcdata qcsapi_wifi_get_link_quality_rpcdata; + +struct qcsapi_wifi_get_link_quality_max_rpcdata { + __rpc_string *ifname; + u_int *p_max_quality; + int return_code; +}; +typedef struct qcsapi_wifi_get_link_quality_max_rpcdata qcsapi_wifi_get_link_quality_max_rpcdata; + +struct qcsapi_wifi_get_rx_bytes_per_association_rpcdata { + __rpc_string *ifname; + u_int association_index; + uint64_t *p_rx_bytes; + int return_code; +}; +typedef struct qcsapi_wifi_get_rx_bytes_per_association_rpcdata qcsapi_wifi_get_rx_bytes_per_association_rpcdata; + +struct qcsapi_wifi_get_tx_bytes_per_association_rpcdata { + __rpc_string *ifname; + u_int association_index; + uint64_t *p_tx_bytes; + int return_code; +}; +typedef struct qcsapi_wifi_get_tx_bytes_per_association_rpcdata qcsapi_wifi_get_tx_bytes_per_association_rpcdata; + +struct qcsapi_wifi_get_rx_packets_per_association_rpcdata { + __rpc_string *ifname; + u_int association_index; + u_int *p_rx_packets; + int return_code; +}; +typedef struct qcsapi_wifi_get_rx_packets_per_association_rpcdata qcsapi_wifi_get_rx_packets_per_association_rpcdata; + +struct qcsapi_wifi_get_tx_packets_per_association_rpcdata { + __rpc_string *ifname; + u_int association_index; + u_int *p_tx_packets; + int return_code; +}; +typedef struct qcsapi_wifi_get_tx_packets_per_association_rpcdata qcsapi_wifi_get_tx_packets_per_association_rpcdata; + +struct qcsapi_wifi_get_tx_err_packets_per_association_rpcdata { + __rpc_string *ifname; + u_int association_index; + u_int *p_tx_err_packets; + int return_code; +}; +typedef struct qcsapi_wifi_get_tx_err_packets_per_association_rpcdata qcsapi_wifi_get_tx_err_packets_per_association_rpcdata; + +struct qcsapi_wifi_get_rssi_per_association_rpcdata { + __rpc_string *ifname; + u_int association_index; + u_int *p_rssi; + int return_code; +}; +typedef struct qcsapi_wifi_get_rssi_per_association_rpcdata qcsapi_wifi_get_rssi_per_association_rpcdata; + +struct qcsapi_wifi_get_rssi_in_dbm_per_association_rpcdata { + __rpc_string *ifname; + u_int association_index; + int *p_rssi; + int return_code; +}; +typedef struct qcsapi_wifi_get_rssi_in_dbm_per_association_rpcdata qcsapi_wifi_get_rssi_in_dbm_per_association_rpcdata; + +struct qcsapi_wifi_get_bw_per_association_rpcdata { + __rpc_string *ifname; + u_int association_index; + u_int *p_bw; + int return_code; +}; +typedef struct qcsapi_wifi_get_bw_per_association_rpcdata qcsapi_wifi_get_bw_per_association_rpcdata; + +struct qcsapi_wifi_get_tx_phy_rate_per_association_rpcdata { + __rpc_string *ifname; + u_int association_index; + u_int *p_tx_phy_rate; + int return_code; +}; +typedef struct qcsapi_wifi_get_tx_phy_rate_per_association_rpcdata qcsapi_wifi_get_tx_phy_rate_per_association_rpcdata; + +struct qcsapi_wifi_get_rx_phy_rate_per_association_rpcdata { + __rpc_string *ifname; + u_int association_index; + u_int *p_rx_phy_rate; + int return_code; +}; +typedef struct qcsapi_wifi_get_rx_phy_rate_per_association_rpcdata qcsapi_wifi_get_rx_phy_rate_per_association_rpcdata; + +struct qcsapi_wifi_get_tx_mcs_per_association_rpcdata { + __rpc_string *ifname; + u_int association_index; + u_int *p_mcs; + int return_code; +}; +typedef struct qcsapi_wifi_get_tx_mcs_per_association_rpcdata qcsapi_wifi_get_tx_mcs_per_association_rpcdata; + +struct qcsapi_wifi_get_rx_mcs_per_association_rpcdata { + __rpc_string *ifname; + u_int association_index; + u_int *p_mcs; + int return_code; +}; +typedef struct qcsapi_wifi_get_rx_mcs_per_association_rpcdata qcsapi_wifi_get_rx_mcs_per_association_rpcdata; + +struct qcsapi_wifi_get_achievable_tx_phy_rate_per_association_rpcdata { + __rpc_string *ifname; + u_int association_index; + u_int *p_achievable_tx_phy_rate; + int return_code; +}; +typedef struct qcsapi_wifi_get_achievable_tx_phy_rate_per_association_rpcdata qcsapi_wifi_get_achievable_tx_phy_rate_per_association_rpcdata; + +struct qcsapi_wifi_get_achievable_rx_phy_rate_per_association_rpcdata { + __rpc_string *ifname; + u_int association_index; + u_int *p_achievable_rx_phy_rate; + int return_code; +}; +typedef struct qcsapi_wifi_get_achievable_rx_phy_rate_per_association_rpcdata qcsapi_wifi_get_achievable_rx_phy_rate_per_association_rpcdata; + +struct qcsapi_wifi_get_auth_enc_per_association_rpcdata { + __rpc_string *ifname; + u_int association_index; + u_int *p_auth_enc; + int return_code; +}; +typedef struct qcsapi_wifi_get_auth_enc_per_association_rpcdata qcsapi_wifi_get_auth_enc_per_association_rpcdata; + +struct qcsapi_wifi_get_tput_caps_rpcdata { + __rpc_string *ifname; + u_int association_index; + __rpc_ieee8011req_sta_tput_caps *tput_caps; + int return_code; +}; +typedef struct qcsapi_wifi_get_tput_caps_rpcdata qcsapi_wifi_get_tput_caps_rpcdata; + +struct qcsapi_wifi_get_connection_mode_rpcdata { + __rpc_string *ifname; + u_int association_index; + u_int *connection_mode; + int return_code; +}; +typedef struct qcsapi_wifi_get_connection_mode_rpcdata qcsapi_wifi_get_connection_mode_rpcdata; + +struct qcsapi_wifi_get_vendor_per_association_rpcdata { + __rpc_string *ifname; + u_int association_index; + u_int *p_vendor; + int return_code; +}; +typedef struct qcsapi_wifi_get_vendor_per_association_rpcdata qcsapi_wifi_get_vendor_per_association_rpcdata; + +struct qcsapi_wifi_get_max_mimo_rpcdata { + __rpc_string *ifname; + u_int association_index; + __rpc_string *p_max_mimo; + int return_code; +}; +typedef struct qcsapi_wifi_get_max_mimo_rpcdata qcsapi_wifi_get_max_mimo_rpcdata; + +struct qcsapi_wifi_get_snr_per_association_rpcdata { + __rpc_string *ifname; + u_int association_index; + int *p_snr; + int return_code; +}; +typedef struct qcsapi_wifi_get_snr_per_association_rpcdata qcsapi_wifi_get_snr_per_association_rpcdata; + +struct qcsapi_wifi_get_time_associated_per_association_rpcdata { + __rpc_string *ifname; + u_int association_index; + u_int *time_associated; + int return_code; +}; +typedef struct qcsapi_wifi_get_time_associated_per_association_rpcdata qcsapi_wifi_get_time_associated_per_association_rpcdata; + +struct qcsapi_wifi_get_node_param_rpcdata { + __rpc_string *ifname; + uint32_t node_index; + int param_type; + int local_remote_flag; + __rpc_string *input_param_str; + __rpc_qcsapi_measure_report_result *report_result; + int return_code; +}; +typedef struct qcsapi_wifi_get_node_param_rpcdata qcsapi_wifi_get_node_param_rpcdata; + +struct qcsapi_wifi_get_node_counter_rpcdata { + __rpc_string *ifname; + uint32_t node_index; + int counter_type; + int local_remote_flag; + uint64_t *p_value; + int return_code; +}; +typedef struct qcsapi_wifi_get_node_counter_rpcdata qcsapi_wifi_get_node_counter_rpcdata; + +struct qcsapi_wifi_get_node_stats_rpcdata { + __rpc_string *ifname; + uint32_t node_index; + int local_remote_flag; + __rpc_qcsapi_node_stats *p_stats; + int return_code; +}; +typedef struct qcsapi_wifi_get_node_stats_rpcdata qcsapi_wifi_get_node_stats_rpcdata; + +struct qcsapi_wifi_get_max_queued_rpcdata { + __rpc_string *ifname; + uint32_t node_index; + int local_remote_flag; + int reset_flag; + uint32_t *max_queued; + int return_code; +}; +typedef struct qcsapi_wifi_get_max_queued_rpcdata qcsapi_wifi_get_max_queued_rpcdata; + +struct qcsapi_wifi_get_hw_noise_per_association_rpcdata { + __rpc_string *ifname; + u_int association_index; + int *p_hw_noise; + int return_code; +}; +typedef struct qcsapi_wifi_get_hw_noise_per_association_rpcdata qcsapi_wifi_get_hw_noise_per_association_rpcdata; + +struct qcsapi_wifi_get_mlme_stats_per_mac_rpcdata { + __rpc_qcsapi_mac_addr_p client_mac_addr; + __rpc_qcsapi_mlme_stats *stats; + int return_code; +}; +typedef struct qcsapi_wifi_get_mlme_stats_per_mac_rpcdata qcsapi_wifi_get_mlme_stats_per_mac_rpcdata; + +struct qcsapi_wifi_get_mlme_stats_per_association_rpcdata { + __rpc_string *ifname; + u_int association_index; + __rpc_qcsapi_mlme_stats *stats; + int return_code; +}; +typedef struct qcsapi_wifi_get_mlme_stats_per_association_rpcdata qcsapi_wifi_get_mlme_stats_per_association_rpcdata; + +struct qcsapi_wifi_get_mlme_stats_macs_list_rpcdata { + __rpc_qcsapi_mlme_stats_macs *macs_list; + int return_code; +}; +typedef struct qcsapi_wifi_get_mlme_stats_macs_list_rpcdata qcsapi_wifi_get_mlme_stats_macs_list_rpcdata; + +struct qcsapi_wifi_get_list_regulatory_regions_rpcdata { + __rpc_string *list_regulatory_regions; + int return_code; +}; +typedef struct qcsapi_wifi_get_list_regulatory_regions_rpcdata qcsapi_wifi_get_list_regulatory_regions_rpcdata; + +struct qcsapi_regulatory_get_list_regulatory_regions_rpcdata { + __rpc_string *list_regulatory_regions; + int return_code; +}; +typedef struct qcsapi_regulatory_get_list_regulatory_regions_rpcdata qcsapi_regulatory_get_list_regulatory_regions_rpcdata; + +struct qcsapi_wifi_get_list_regulatory_channels_rpcdata { + __rpc_string *region_by_name; + u_int bw; + __rpc_string *list_of_channels; + int return_code; +}; +typedef struct qcsapi_wifi_get_list_regulatory_channels_rpcdata qcsapi_wifi_get_list_regulatory_channels_rpcdata; + +struct qcsapi_regulatory_get_list_regulatory_channels_rpcdata { + __rpc_string *region_by_name; + u_int bw; + __rpc_string *list_of_channels; + int return_code; +}; +typedef struct qcsapi_regulatory_get_list_regulatory_channels_rpcdata qcsapi_regulatory_get_list_regulatory_channels_rpcdata; + +struct qcsapi_regulatory_get_list_regulatory_bands_rpcdata { + __rpc_string *region_by_name; + __rpc_string *list_of_bands; + int return_code; +}; +typedef struct qcsapi_regulatory_get_list_regulatory_bands_rpcdata qcsapi_regulatory_get_list_regulatory_bands_rpcdata; + +struct qcsapi_wifi_get_regulatory_tx_power_rpcdata { + __rpc_string *ifname; + u_int the_channel; + __rpc_string *region_by_name; + int *p_tx_power; + int return_code; +}; +typedef struct qcsapi_wifi_get_regulatory_tx_power_rpcdata qcsapi_wifi_get_regulatory_tx_power_rpcdata; + +struct qcsapi_regulatory_get_regulatory_tx_power_rpcdata { + __rpc_string *ifname; + u_int the_channel; + __rpc_string *region_by_name; + int *p_tx_power; + int return_code; +}; +typedef struct qcsapi_regulatory_get_regulatory_tx_power_rpcdata qcsapi_regulatory_get_regulatory_tx_power_rpcdata; + +struct qcsapi_wifi_get_configured_tx_power_rpcdata { + __rpc_string *ifname; + u_int the_channel; + __rpc_string *region_by_name; + u_int bw; + int *p_tx_power; + int return_code; +}; +typedef struct qcsapi_wifi_get_configured_tx_power_rpcdata qcsapi_wifi_get_configured_tx_power_rpcdata; + +struct qcsapi_regulatory_get_configured_tx_power_rpcdata { + __rpc_string *ifname; + u_int the_channel; + __rpc_string *region_by_name; + u_int bw; + int *p_tx_power; + int return_code; +}; +typedef struct qcsapi_regulatory_get_configured_tx_power_rpcdata qcsapi_regulatory_get_configured_tx_power_rpcdata; + +struct qcsapi_regulatory_get_configured_tx_power_ext_rpcdata { + __rpc_string *ifname; + u_int the_channel; + __rpc_string *region_by_name; + int the_bw; + u_int bf_on; + u_int number_ss; + int *p_tx_power; + int return_code; +}; +typedef struct qcsapi_regulatory_get_configured_tx_power_ext_rpcdata qcsapi_regulatory_get_configured_tx_power_ext_rpcdata; + +struct qcsapi_wifi_set_regulatory_region_rpcdata { + __rpc_string *ifname; + __rpc_string *region_by_name; + int return_code; +}; +typedef struct qcsapi_wifi_set_regulatory_region_rpcdata qcsapi_wifi_set_regulatory_region_rpcdata; + +struct qcsapi_regulatory_set_regulatory_region_rpcdata { + __rpc_string *ifname; + __rpc_string *region_by_name; + int return_code; +}; +typedef struct qcsapi_regulatory_set_regulatory_region_rpcdata qcsapi_regulatory_set_regulatory_region_rpcdata; + +struct qcsapi_regulatory_restore_regulatory_tx_power_rpcdata { + __rpc_string *ifname; + int return_code; +}; +typedef struct qcsapi_regulatory_restore_regulatory_tx_power_rpcdata qcsapi_regulatory_restore_regulatory_tx_power_rpcdata; + +struct qcsapi_wifi_get_regulatory_region_rpcdata { + __rpc_string *ifname; + __rpc_string *region_by_name; + int return_code; +}; +typedef struct qcsapi_wifi_get_regulatory_region_rpcdata qcsapi_wifi_get_regulatory_region_rpcdata; + +struct qcsapi_regulatory_overwrite_country_code_rpcdata { + __rpc_string *ifname; + __rpc_string *curr_country_name; + __rpc_string *new_country_name; + int return_code; +}; +typedef struct qcsapi_regulatory_overwrite_country_code_rpcdata qcsapi_regulatory_overwrite_country_code_rpcdata; + +struct qcsapi_wifi_set_regulatory_channel_rpcdata { + __rpc_string *ifname; + u_int the_channel; + __rpc_string *region_by_name; + u_int tx_power_offset; + int return_code; +}; +typedef struct qcsapi_wifi_set_regulatory_channel_rpcdata qcsapi_wifi_set_regulatory_channel_rpcdata; + +struct qcsapi_regulatory_set_regulatory_channel_rpcdata { + __rpc_string *ifname; + u_int the_channel; + __rpc_string *region_by_name; + u_int tx_power_offset; + int return_code; +}; +typedef struct qcsapi_regulatory_set_regulatory_channel_rpcdata qcsapi_regulatory_set_regulatory_channel_rpcdata; + +struct qcsapi_regulatory_get_db_version_rpcdata { + int index; + int *p_version; + int return_code; +}; +typedef struct qcsapi_regulatory_get_db_version_rpcdata qcsapi_regulatory_get_db_version_rpcdata; + +struct qcsapi_regulatory_apply_tx_power_cap_rpcdata { + int capped; + int return_code; +}; +typedef struct qcsapi_regulatory_apply_tx_power_cap_rpcdata qcsapi_regulatory_apply_tx_power_cap_rpcdata; + +struct qcsapi_wifi_get_list_DFS_channels_rpcdata { + __rpc_string *region_by_name; + int DFS_flag; + u_int bw; + __rpc_string *list_of_channels; + int return_code; +}; +typedef struct qcsapi_wifi_get_list_DFS_channels_rpcdata qcsapi_wifi_get_list_DFS_channels_rpcdata; + +struct qcsapi_regulatory_get_list_DFS_channels_rpcdata { + __rpc_string *region_by_name; + int DFS_flag; + u_int bw; + __rpc_string *list_of_channels; + int return_code; +}; +typedef struct qcsapi_regulatory_get_list_DFS_channels_rpcdata qcsapi_regulatory_get_list_DFS_channels_rpcdata; + +struct qcsapi_wifi_is_channel_DFS_rpcdata { + __rpc_string *region_by_name; + u_int the_channel; + int *p_channel_is_DFS; + int return_code; +}; +typedef struct qcsapi_wifi_is_channel_DFS_rpcdata qcsapi_wifi_is_channel_DFS_rpcdata; + +struct qcsapi_regulatory_is_channel_DFS_rpcdata { + __rpc_string *region_by_name; + u_int the_channel; + int *p_channel_is_DFS; + int return_code; +}; +typedef struct qcsapi_regulatory_is_channel_DFS_rpcdata qcsapi_regulatory_is_channel_DFS_rpcdata; + +struct qcsapi_wifi_get_dfs_cce_channels_rpcdata { + __rpc_string *ifname; + u_int *p_prev_channel; + u_int *p_cur_channel; + int return_code; +}; +typedef struct qcsapi_wifi_get_dfs_cce_channels_rpcdata qcsapi_wifi_get_dfs_cce_channels_rpcdata; + +struct qcsapi_wifi_get_DFS_alt_channel_rpcdata { + __rpc_string *ifname; + u_int *p_dfs_alt_chan; + int return_code; +}; +typedef struct qcsapi_wifi_get_DFS_alt_channel_rpcdata qcsapi_wifi_get_DFS_alt_channel_rpcdata; + +struct qcsapi_wifi_set_DFS_alt_channel_rpcdata { + __rpc_string *ifname; + u_int dfs_alt_chan; + int return_code; +}; +typedef struct qcsapi_wifi_set_DFS_alt_channel_rpcdata qcsapi_wifi_set_DFS_alt_channel_rpcdata; + +struct qcsapi_wifi_start_dfs_reentry_rpcdata { + __rpc_string *ifname; + int return_code; +}; +typedef struct qcsapi_wifi_start_dfs_reentry_rpcdata qcsapi_wifi_start_dfs_reentry_rpcdata; + +struct qcsapi_wifi_start_scan_ext_rpcdata { + __rpc_string *ifname; + int scan_flag; + int return_code; +}; +typedef struct qcsapi_wifi_start_scan_ext_rpcdata qcsapi_wifi_start_scan_ext_rpcdata; + +struct qcsapi_wifi_get_csw_records_rpcdata { + __rpc_string *ifname; + int reset; + __rpc_qcsapi_csw_record *record; + int return_code; +}; +typedef struct qcsapi_wifi_get_csw_records_rpcdata qcsapi_wifi_get_csw_records_rpcdata; + +struct qcsapi_wifi_get_radar_status_rpcdata { + __rpc_string *ifname; + __rpc_qcsapi_radar_status *rdstatus; + int return_code; +}; +typedef struct qcsapi_wifi_get_radar_status_rpcdata qcsapi_wifi_get_radar_status_rpcdata; + +struct qcsapi_wifi_get_cac_status_rpcdata { + __rpc_string *ifname; + int *cacstatus; + int return_code; +}; +typedef struct qcsapi_wifi_get_cac_status_rpcdata qcsapi_wifi_get_cac_status_rpcdata; + +struct qcsapi_wifi_get_results_AP_scan_rpcdata { + __rpc_string *ifname; + u_int *p_count_APs; + int return_code; +}; +typedef struct qcsapi_wifi_get_results_AP_scan_rpcdata qcsapi_wifi_get_results_AP_scan_rpcdata; + +struct qcsapi_wifi_get_count_APs_scanned_rpcdata { + __rpc_string *ifname; + u_int *p_count_APs; + int return_code; +}; +typedef struct qcsapi_wifi_get_count_APs_scanned_rpcdata qcsapi_wifi_get_count_APs_scanned_rpcdata; + +struct qcsapi_wifi_get_properties_AP_rpcdata { + __rpc_string *ifname; + u_int index_AP; + __rpc_qcsapi_ap_properties *p_ap_properties; + int return_code; +}; +typedef struct qcsapi_wifi_get_properties_AP_rpcdata qcsapi_wifi_get_properties_AP_rpcdata; + +struct qcsapi_wifi_set_scan_chk_inv_rpcdata { + __rpc_string *ifname; + int scan_chk_inv; + int return_code; +}; +typedef struct qcsapi_wifi_set_scan_chk_inv_rpcdata qcsapi_wifi_set_scan_chk_inv_rpcdata; + +struct qcsapi_wifi_get_scan_chk_inv_rpcdata { + __rpc_string *ifname; + int *p; + int return_code; +}; +typedef struct qcsapi_wifi_get_scan_chk_inv_rpcdata qcsapi_wifi_get_scan_chk_inv_rpcdata; + +struct qcsapi_wifi_set_scan_buf_max_size_rpcdata { + __rpc_string *ifname; + u_int max_buf_size; + int return_code; +}; +typedef struct qcsapi_wifi_set_scan_buf_max_size_rpcdata qcsapi_wifi_set_scan_buf_max_size_rpcdata; + +struct qcsapi_wifi_get_scan_buf_max_size_rpcdata { + __rpc_string *ifname; + u_int *max_buf_size; + int return_code; +}; +typedef struct qcsapi_wifi_get_scan_buf_max_size_rpcdata qcsapi_wifi_get_scan_buf_max_size_rpcdata; + +struct qcsapi_wifi_set_scan_table_max_len_rpcdata { + __rpc_string *ifname; + u_int max_table_len; + int return_code; +}; +typedef struct qcsapi_wifi_set_scan_table_max_len_rpcdata qcsapi_wifi_set_scan_table_max_len_rpcdata; + +struct qcsapi_wifi_get_scan_table_max_len_rpcdata { + __rpc_string *ifname; + u_int *max_table_len; + int return_code; +}; +typedef struct qcsapi_wifi_get_scan_table_max_len_rpcdata qcsapi_wifi_get_scan_table_max_len_rpcdata; + +struct qcsapi_wifi_set_dwell_times_rpcdata { + __rpc_string *ifname; + u_int max_dwell_time_active_chan; + u_int min_dwell_time_active_chan; + u_int max_dwell_time_passive_chan; + u_int min_dwell_time_passive_chan; + int return_code; +}; +typedef struct qcsapi_wifi_set_dwell_times_rpcdata qcsapi_wifi_set_dwell_times_rpcdata; + +struct qcsapi_wifi_get_dwell_times_rpcdata { + __rpc_string *ifname; + u_int *p_max_dwell_time_active_chan; + u_int *p_min_dwell_time_active_chan; + u_int *p_max_dwell_time_passive_chan; + u_int *p_min_dwell_time_passive_chan; + int return_code; +}; +typedef struct qcsapi_wifi_get_dwell_times_rpcdata qcsapi_wifi_get_dwell_times_rpcdata; + +struct qcsapi_wifi_set_bgscan_dwell_times_rpcdata { + __rpc_string *ifname; + u_int dwell_time_active_chan; + u_int dwell_time_passive_chan; + int return_code; +}; +typedef struct qcsapi_wifi_set_bgscan_dwell_times_rpcdata qcsapi_wifi_set_bgscan_dwell_times_rpcdata; + +struct qcsapi_wifi_get_bgscan_dwell_times_rpcdata { + __rpc_string *ifname; + u_int *p_dwell_time_active_chan; + u_int *p_dwell_time_passive_chan; + int return_code; +}; +typedef struct qcsapi_wifi_get_bgscan_dwell_times_rpcdata qcsapi_wifi_get_bgscan_dwell_times_rpcdata; + +struct qcsapi_wifi_start_scan_rpcdata { + __rpc_string *ifname; + int return_code; +}; +typedef struct qcsapi_wifi_start_scan_rpcdata qcsapi_wifi_start_scan_rpcdata; + +struct qcsapi_wifi_cancel_scan_rpcdata { + __rpc_string *ifname; + int force; + int return_code; +}; +typedef struct qcsapi_wifi_cancel_scan_rpcdata qcsapi_wifi_cancel_scan_rpcdata; + +struct qcsapi_wifi_get_scan_status_rpcdata { + __rpc_string *ifname; + int *scanstatus; + int return_code; +}; +typedef struct qcsapi_wifi_get_scan_status_rpcdata qcsapi_wifi_get_scan_status_rpcdata; + +struct qcsapi_wifi_enable_bgscan_rpcdata { + __rpc_string *ifname; + int enable; + int return_code; +}; +typedef struct qcsapi_wifi_enable_bgscan_rpcdata qcsapi_wifi_enable_bgscan_rpcdata; + +struct qcsapi_wifi_get_bgscan_status_rpcdata { + __rpc_string *ifname; + int *enable; + int return_code; +}; +typedef struct qcsapi_wifi_get_bgscan_status_rpcdata qcsapi_wifi_get_bgscan_status_rpcdata; + +struct qcsapi_wifi_wait_scan_completes_rpcdata { + __rpc_string *ifname; + uint32_t timeout; + int return_code; +}; +typedef struct qcsapi_wifi_wait_scan_completes_rpcdata qcsapi_wifi_wait_scan_completes_rpcdata; + +struct qcsapi_wifi_backoff_fail_max_rpcdata { + __rpc_string *ifname; + int fail_max; + int return_code; +}; +typedef struct qcsapi_wifi_backoff_fail_max_rpcdata qcsapi_wifi_backoff_fail_max_rpcdata; + +struct qcsapi_wifi_backoff_timeout_rpcdata { + __rpc_string *ifname; + int timeout; + int return_code; +}; +typedef struct qcsapi_wifi_backoff_timeout_rpcdata qcsapi_wifi_backoff_timeout_rpcdata; + +struct qcsapi_wifi_get_mcs_rate_rpcdata { + __rpc_string *ifname; + __rpc_string *current_mcs_rate; + int return_code; +}; +typedef struct qcsapi_wifi_get_mcs_rate_rpcdata qcsapi_wifi_get_mcs_rate_rpcdata; + +struct qcsapi_wifi_set_mcs_rate_rpcdata { + __rpc_string *ifname; + __rpc_string *new_mcs_rate; + int return_code; +}; +typedef struct qcsapi_wifi_set_mcs_rate_rpcdata qcsapi_wifi_set_mcs_rate_rpcdata; + +struct qcsapi_wifi_set_pairing_id_rpcdata { + __rpc_string *ifname; + __rpc_string *pairing_id; + int return_code; +}; +typedef struct qcsapi_wifi_set_pairing_id_rpcdata qcsapi_wifi_set_pairing_id_rpcdata; + +struct qcsapi_wifi_get_pairing_id_rpcdata { + __rpc_string *ifname; + __rpc_string *pairing_id; + int return_code; +}; +typedef struct qcsapi_wifi_get_pairing_id_rpcdata qcsapi_wifi_get_pairing_id_rpcdata; + +struct qcsapi_wifi_set_pairing_enable_rpcdata { + __rpc_string *ifname; + __rpc_string *enable; + int return_code; +}; +typedef struct qcsapi_wifi_set_pairing_enable_rpcdata qcsapi_wifi_set_pairing_enable_rpcdata; + +struct qcsapi_wifi_get_pairing_enable_rpcdata { + __rpc_string *ifname; + __rpc_string *enable; + int return_code; +}; +typedef struct qcsapi_wifi_get_pairing_enable_rpcdata qcsapi_wifi_get_pairing_enable_rpcdata; + +struct qcsapi_non_wps_set_pp_enable_rpcdata { + __rpc_string *ifname; + uint32_t ctrl_state; + int return_code; +}; +typedef struct qcsapi_non_wps_set_pp_enable_rpcdata qcsapi_non_wps_set_pp_enable_rpcdata; + +struct qcsapi_non_wps_get_pp_enable_rpcdata { + __rpc_string *ifname; + uint32_t *ctrl_state; + int return_code; +}; +typedef struct qcsapi_non_wps_get_pp_enable_rpcdata qcsapi_non_wps_get_pp_enable_rpcdata; + +struct qcsapi_wifi_set_vendor_fix_rpcdata { + __rpc_string *ifname; + int fix_param; + int value; + int return_code; +}; +typedef struct qcsapi_wifi_set_vendor_fix_rpcdata qcsapi_wifi_set_vendor_fix_rpcdata; + +struct qcsapi_errno_get_message_rpcdata { + int qcsapi_retval; + u_int msglen; + __rpc_string *error_msg; + int return_code; +}; +typedef struct qcsapi_errno_get_message_rpcdata qcsapi_errno_get_message_rpcdata; + +struct qcsapi_get_interface_stats_rpcdata { + __rpc_string *ifname; + __rpc_qcsapi_interface_stats *stats; + int return_code; +}; +typedef struct qcsapi_get_interface_stats_rpcdata qcsapi_get_interface_stats_rpcdata; + +struct qcsapi_get_phy_stats_rpcdata { + __rpc_string *ifname; + __rpc_qcsapi_phy_stats *stats; + int return_code; +}; +typedef struct qcsapi_get_phy_stats_rpcdata qcsapi_get_phy_stats_rpcdata; + +struct qcsapi_reset_all_counters_rpcdata { + __rpc_string *ifname; + uint32_t node_index; + int local_remote_flag; + int return_code; +}; +typedef struct qcsapi_reset_all_counters_rpcdata qcsapi_reset_all_counters_rpcdata; + +struct qcsapi_get_uboot_info_rpcdata { + __rpc_string *uboot_version; + __rpc_early_flash_config *ef_config; + int return_code; +}; +typedef struct qcsapi_get_uboot_info_rpcdata qcsapi_get_uboot_info_rpcdata; + +struct qcsapi_firmware_get_version_rpcdata { + u_int version_size; + __rpc_string *firmware_version; + int return_code; +}; +typedef struct qcsapi_firmware_get_version_rpcdata qcsapi_firmware_get_version_rpcdata; + +struct qcsapi_flash_image_update_rpcdata { + __rpc_string *image_file; + int partition_to_upgrade; + int return_code; +}; +typedef struct qcsapi_flash_image_update_rpcdata qcsapi_flash_image_update_rpcdata; + +struct qcsapi_send_file_rpcdata { + __rpc_string *image_file_path; + int image_flags; + int return_code; +}; +typedef struct qcsapi_send_file_rpcdata qcsapi_send_file_rpcdata; + +struct qcsapi_pm_set_mode_rpcdata { + int mode; + int return_code; +}; +typedef struct qcsapi_pm_set_mode_rpcdata qcsapi_pm_set_mode_rpcdata; + +struct qcsapi_pm_get_mode_rpcdata { + int *mode; + int return_code; +}; +typedef struct qcsapi_pm_get_mode_rpcdata qcsapi_pm_get_mode_rpcdata; + +struct qcsapi_get_qpm_level_rpcdata { + int *qpm_level; + int return_code; +}; +typedef struct qcsapi_get_qpm_level_rpcdata qcsapi_get_qpm_level_rpcdata; + +struct qcsapi_set_host_state_rpcdata { + __rpc_string *ifname; + uint32_t host_state; + int return_code; +}; +typedef struct qcsapi_set_host_state_rpcdata qcsapi_set_host_state_rpcdata; + +struct qcsapi_qtm_get_state_rpcdata { + __rpc_string *ifname; + u_int param; + u_int *value; + int return_code; +}; +typedef struct qcsapi_qtm_get_state_rpcdata qcsapi_qtm_get_state_rpcdata; + +struct qcsapi_qtm_get_state_all_rpcdata { + __rpc_string *ifname; + u_int max; + __rpc_qcsapi_data_128bytes *value; + int return_code; +}; +typedef struct qcsapi_qtm_get_state_all_rpcdata qcsapi_qtm_get_state_all_rpcdata; + +struct qcsapi_qtm_set_state_rpcdata { + __rpc_string *ifname; + u_int param; + u_int value; + int return_code; +}; +typedef struct qcsapi_qtm_set_state_rpcdata qcsapi_qtm_set_state_rpcdata; + +struct qcsapi_qtm_get_config_rpcdata { + __rpc_string *ifname; + u_int param; + u_int *value; + int return_code; +}; +typedef struct qcsapi_qtm_get_config_rpcdata qcsapi_qtm_get_config_rpcdata; + +struct qcsapi_qtm_get_config_all_rpcdata { + __rpc_string *ifname; + u_int max; + __rpc_qcsapi_data_1Kbytes *value; + int return_code; +}; +typedef struct qcsapi_qtm_get_config_all_rpcdata qcsapi_qtm_get_config_all_rpcdata; + +struct qcsapi_qtm_set_config_rpcdata { + __rpc_string *ifname; + u_int param; + u_int value; + int return_code; +}; +typedef struct qcsapi_qtm_set_config_rpcdata qcsapi_qtm_set_config_rpcdata; + +struct qcsapi_qtm_add_rule_rpcdata { + __rpc_string *ifname; + __rpc_qcsapi_data_128bytes *entry; + int return_code; +}; +typedef struct qcsapi_qtm_add_rule_rpcdata qcsapi_qtm_add_rule_rpcdata; + +struct qcsapi_qtm_del_rule_rpcdata { + __rpc_string *ifname; + __rpc_qcsapi_data_128bytes *entry; + int return_code; +}; +typedef struct qcsapi_qtm_del_rule_rpcdata qcsapi_qtm_del_rule_rpcdata; + +struct qcsapi_qtm_del_rule_index_rpcdata { + __rpc_string *ifname; + u_int index; + int return_code; +}; +typedef struct qcsapi_qtm_del_rule_index_rpcdata qcsapi_qtm_del_rule_index_rpcdata; + +struct qcsapi_qtm_get_rule_rpcdata { + __rpc_string *ifname; + u_int max_entries; + __rpc_qcsapi_data_3Kbytes *entries; + int return_code; +}; +typedef struct qcsapi_qtm_get_rule_rpcdata qcsapi_qtm_get_rule_rpcdata; + +struct qcsapi_qtm_get_strm_rpcdata { + __rpc_string *ifname; + u_int max_entries; + int show_all; + __rpc_qcsapi_data_4Kbytes *strms; + int return_code; +}; +typedef struct qcsapi_qtm_get_strm_rpcdata qcsapi_qtm_get_strm_rpcdata; + +struct qcsapi_qtm_get_stats_rpcdata { + __rpc_string *ifname; + __rpc_qcsapi_data_512bytes *stats; + int return_code; +}; +typedef struct qcsapi_qtm_get_stats_rpcdata qcsapi_qtm_get_stats_rpcdata; + +struct qcsapi_qtm_get_inactive_flags_rpcdata { + __rpc_string *ifname; + u_long *flags; + int return_code; +}; +typedef struct qcsapi_qtm_get_inactive_flags_rpcdata qcsapi_qtm_get_inactive_flags_rpcdata; + +struct qcsapi_wifi_run_script_rpcdata { + __rpc_string *scriptname; + __rpc_string *param; + int return_code; +}; +typedef struct qcsapi_wifi_run_script_rpcdata qcsapi_wifi_run_script_rpcdata; + +struct qcsapi_wifi_test_traffic_rpcdata { + __rpc_string *ifname; + uint32_t period; + int return_code; +}; +typedef struct qcsapi_wifi_test_traffic_rpcdata qcsapi_wifi_test_traffic_rpcdata; + +struct qcsapi_wifi_add_ipff_rpcdata { + u_int ipaddr; + int return_code; +}; +typedef struct qcsapi_wifi_add_ipff_rpcdata qcsapi_wifi_add_ipff_rpcdata; + +struct qcsapi_wifi_del_ipff_rpcdata { + u_int ipaddr; + int return_code; +}; +typedef struct qcsapi_wifi_del_ipff_rpcdata qcsapi_wifi_del_ipff_rpcdata; + +struct qcsapi_wifi_get_ipff_rpcdata { + int buflen; + __rpc_string *buf; + int return_code; +}; +typedef struct qcsapi_wifi_get_ipff_rpcdata qcsapi_wifi_get_ipff_rpcdata; + +struct qcsapi_wifi_get_rts_threshold_rpcdata { + __rpc_string *ifname; + u_int *rts_threshold; + int return_code; +}; +typedef struct qcsapi_wifi_get_rts_threshold_rpcdata qcsapi_wifi_get_rts_threshold_rpcdata; + +struct qcsapi_wifi_set_rts_threshold_rpcdata { + __rpc_string *ifname; + u_int rts_threshold; + int return_code; +}; +typedef struct qcsapi_wifi_set_rts_threshold_rpcdata qcsapi_wifi_set_rts_threshold_rpcdata; + +struct qcsapi_wifi_set_nss_cap_rpcdata { + __rpc_string *ifname; + int modulation; + u_int nss; + int return_code; +}; +typedef struct qcsapi_wifi_set_nss_cap_rpcdata qcsapi_wifi_set_nss_cap_rpcdata; + +struct qcsapi_wifi_get_nss_cap_rpcdata { + __rpc_string *ifname; + int modulation; + u_int *nss; + int return_code; +}; +typedef struct qcsapi_wifi_get_nss_cap_rpcdata qcsapi_wifi_get_nss_cap_rpcdata; + +struct qcsapi_wifi_get_tx_amsdu_rpcdata { + __rpc_string *ifname; + int *enable; + int return_code; +}; +typedef struct qcsapi_wifi_get_tx_amsdu_rpcdata qcsapi_wifi_get_tx_amsdu_rpcdata; + +struct qcsapi_wifi_set_tx_amsdu_rpcdata { + __rpc_string *ifname; + int enable; + int return_code; +}; +typedef struct qcsapi_wifi_set_tx_amsdu_rpcdata qcsapi_wifi_set_tx_amsdu_rpcdata; + +struct qcsapi_wifi_get_disassoc_reason_rpcdata { + __rpc_string *ifname; + u_int *reason; + int return_code; +}; +typedef struct qcsapi_wifi_get_disassoc_reason_rpcdata qcsapi_wifi_get_disassoc_reason_rpcdata; + +struct qcsapi_wifi_block_bss_rpcdata { + __rpc_string *ifname; + u_int flag; + int return_code; +}; +typedef struct qcsapi_wifi_block_bss_rpcdata qcsapi_wifi_block_bss_rpcdata; + +struct qcsapi_wifi_verify_repeater_mode_rpcdata { + int return_code; +}; +typedef struct qcsapi_wifi_verify_repeater_mode_rpcdata qcsapi_wifi_verify_repeater_mode_rpcdata; + +struct qcsapi_wifi_set_ap_interface_name_rpcdata { + __rpc_string *ifname; + int return_code; +}; +typedef struct qcsapi_wifi_set_ap_interface_name_rpcdata qcsapi_wifi_set_ap_interface_name_rpcdata; + +struct qcsapi_wifi_get_ap_interface_name_rpcdata { + __rpc_string *ifname; + int return_code; +}; +typedef struct qcsapi_wifi_get_ap_interface_name_rpcdata qcsapi_wifi_get_ap_interface_name_rpcdata; + +struct qcsapi_get_temperature_info_rpcdata { + int *temp_exter; + int *temp_inter; + int *temp_bbic; + int return_code; +}; +typedef struct qcsapi_get_temperature_info_rpcdata qcsapi_get_temperature_info_rpcdata; + +struct qcsapi_calcmd_set_test_mode_rpcdata { + u_int channel; + u_int antenna; + u_int mcs; + u_int bw; + u_int pkt_size; + u_int eleven_n; + u_int bf; + int return_code; +}; +typedef struct qcsapi_calcmd_set_test_mode_rpcdata qcsapi_calcmd_set_test_mode_rpcdata; + +struct qcsapi_calcmd_show_test_packet_rpcdata { + u_int *tx_packet_num; + u_int *rx_packet_num; + u_int *crc_packet_num; + int return_code; +}; +typedef struct qcsapi_calcmd_show_test_packet_rpcdata qcsapi_calcmd_show_test_packet_rpcdata; + +struct qcsapi_calcmd_send_test_packet_rpcdata { + u_int to_transmit_packet_num; + int return_code; +}; +typedef struct qcsapi_calcmd_send_test_packet_rpcdata qcsapi_calcmd_send_test_packet_rpcdata; + +struct qcsapi_calcmd_stop_test_packet_rpcdata { + int return_code; +}; +typedef struct qcsapi_calcmd_stop_test_packet_rpcdata qcsapi_calcmd_stop_test_packet_rpcdata; + +struct qcsapi_calcmd_send_dc_cw_signal_rpcdata { + u_int channel; + int return_code; +}; +typedef struct qcsapi_calcmd_send_dc_cw_signal_rpcdata qcsapi_calcmd_send_dc_cw_signal_rpcdata; + +struct qcsapi_calcmd_stop_dc_cw_signal_rpcdata { + int return_code; +}; +typedef struct qcsapi_calcmd_stop_dc_cw_signal_rpcdata qcsapi_calcmd_stop_dc_cw_signal_rpcdata; + +struct qcsapi_calcmd_get_test_mode_antenna_sel_rpcdata { + u_int *antenna_bit_mask; + int return_code; +}; +typedef struct qcsapi_calcmd_get_test_mode_antenna_sel_rpcdata qcsapi_calcmd_get_test_mode_antenna_sel_rpcdata; + +struct qcsapi_calcmd_get_test_mode_mcs_rpcdata { + u_int *test_mode_mcs; + int return_code; +}; +typedef struct qcsapi_calcmd_get_test_mode_mcs_rpcdata qcsapi_calcmd_get_test_mode_mcs_rpcdata; + +struct qcsapi_calcmd_get_test_mode_bw_rpcdata { + u_int *test_mode_bw; + int return_code; +}; +typedef struct qcsapi_calcmd_get_test_mode_bw_rpcdata qcsapi_calcmd_get_test_mode_bw_rpcdata; + +struct qcsapi_calcmd_get_tx_power_rpcdata { + __rpc_qcsapi_calcmd_tx_power_rsp *tx_power; + int return_code; +}; +typedef struct qcsapi_calcmd_get_tx_power_rpcdata qcsapi_calcmd_get_tx_power_rpcdata; + +struct qcsapi_calcmd_set_tx_power_rpcdata { + u_int tx_power; + int return_code; +}; +typedef struct qcsapi_calcmd_set_tx_power_rpcdata qcsapi_calcmd_set_tx_power_rpcdata; + +struct qcsapi_calcmd_get_test_mode_rssi_rpcdata { + __rpc_qcsapi_calcmd_rssi_rsp *test_mode_rssi; + int return_code; +}; +typedef struct qcsapi_calcmd_get_test_mode_rssi_rpcdata qcsapi_calcmd_get_test_mode_rssi_rpcdata; + +struct qcsapi_calcmd_set_mac_filter_rpcdata { + int q_num; + int sec_enable; + __rpc_qcsapi_mac_addr_p mac_addr; + int return_code; +}; +typedef struct qcsapi_calcmd_set_mac_filter_rpcdata qcsapi_calcmd_set_mac_filter_rpcdata; + +struct qcsapi_calcmd_get_antenna_count_rpcdata { + u_int *antenna_count; + int return_code; +}; +typedef struct qcsapi_calcmd_get_antenna_count_rpcdata qcsapi_calcmd_get_antenna_count_rpcdata; + +struct qcsapi_calcmd_clear_counter_rpcdata { + int return_code; +}; +typedef struct qcsapi_calcmd_clear_counter_rpcdata qcsapi_calcmd_clear_counter_rpcdata; + +struct qcsapi_calcmd_get_info_rpcdata { + __rpc_string *output_info; + int return_code; +}; +typedef struct qcsapi_calcmd_get_info_rpcdata qcsapi_calcmd_get_info_rpcdata; + +struct qcsapi_wowlan_set_match_type_rpcdata { + __rpc_string *ifname; + uint32_t wowlan_match; + int return_code; +}; +typedef struct qcsapi_wowlan_set_match_type_rpcdata qcsapi_wowlan_set_match_type_rpcdata; + +struct qcsapi_wowlan_set_L2_type_rpcdata { + __rpc_string *ifname; + uint32_t ether_type; + int return_code; +}; +typedef struct qcsapi_wowlan_set_L2_type_rpcdata qcsapi_wowlan_set_L2_type_rpcdata; + +struct qcsapi_wowlan_set_udp_port_rpcdata { + __rpc_string *ifname; + uint32_t udp_port; + int return_code; +}; +typedef struct qcsapi_wowlan_set_udp_port_rpcdata qcsapi_wowlan_set_udp_port_rpcdata; + +struct qcsapi_wowlan_set_magic_pattern_rpcdata { + __rpc_string *ifname; + uint32_t len; + __rpc_qcsapi_data_256bytes *pattern; + int return_code; +}; +typedef struct qcsapi_wowlan_set_magic_pattern_rpcdata qcsapi_wowlan_set_magic_pattern_rpcdata; + +struct qcsapi_wifi_wowlan_get_host_state_rpcdata { + __rpc_string *ifname; + uint16_t *p_value; + uint32_t *len; + int return_code; +}; +typedef struct qcsapi_wifi_wowlan_get_host_state_rpcdata qcsapi_wifi_wowlan_get_host_state_rpcdata; + +struct qcsapi_wifi_wowlan_get_match_type_rpcdata { + __rpc_string *ifname; + uint16_t *p_value; + uint32_t *len; + int return_code; +}; +typedef struct qcsapi_wifi_wowlan_get_match_type_rpcdata qcsapi_wifi_wowlan_get_match_type_rpcdata; + +struct qcsapi_wifi_wowlan_get_l2_type_rpcdata { + __rpc_string *ifname; + uint16_t *p_value; + uint32_t *len; + int return_code; +}; +typedef struct qcsapi_wifi_wowlan_get_l2_type_rpcdata qcsapi_wifi_wowlan_get_l2_type_rpcdata; + +struct qcsapi_wifi_wowlan_get_udp_port_rpcdata { + __rpc_string *ifname; + uint16_t *p_value; + uint32_t *len; + int return_code; +}; +typedef struct qcsapi_wifi_wowlan_get_udp_port_rpcdata qcsapi_wifi_wowlan_get_udp_port_rpcdata; + +struct qcsapi_wifi_wowlan_get_magic_pattern_rpcdata { + __rpc_string *ifname; + __rpc_qcsapi_data_256bytes *p_value; + uint32_t *len; + int return_code; +}; +typedef struct qcsapi_wifi_wowlan_get_magic_pattern_rpcdata qcsapi_wifi_wowlan_get_magic_pattern_rpcdata; + +struct qcsapi_wifi_set_enable_mu_rpcdata { + __rpc_string *ifname; + u_int mu_enable; + int return_code; +}; +typedef struct qcsapi_wifi_set_enable_mu_rpcdata qcsapi_wifi_set_enable_mu_rpcdata; + +struct qcsapi_wifi_get_enable_mu_rpcdata { + __rpc_string *ifname; + u_int *mu_enable; + int return_code; +}; +typedef struct qcsapi_wifi_get_enable_mu_rpcdata qcsapi_wifi_get_enable_mu_rpcdata; + +struct qcsapi_wifi_set_mu_use_precode_rpcdata { + __rpc_string *ifname; + u_int grp; + u_int prec_enable; + int return_code; +}; +typedef struct qcsapi_wifi_set_mu_use_precode_rpcdata qcsapi_wifi_set_mu_use_precode_rpcdata; + +struct qcsapi_wifi_get_mu_use_precode_rpcdata { + __rpc_string *ifname; + u_int grp; + u_int *prec_enable; + int return_code; +}; +typedef struct qcsapi_wifi_get_mu_use_precode_rpcdata qcsapi_wifi_get_mu_use_precode_rpcdata; + +struct qcsapi_wifi_set_mu_use_eq_rpcdata { + __rpc_string *ifname; + u_int eq_enable; + int return_code; +}; +typedef struct qcsapi_wifi_set_mu_use_eq_rpcdata qcsapi_wifi_set_mu_use_eq_rpcdata; + +struct qcsapi_wifi_get_mu_use_eq_rpcdata { + __rpc_string *ifname; + u_int *meq_enable; + int return_code; +}; +typedef struct qcsapi_wifi_get_mu_use_eq_rpcdata qcsapi_wifi_get_mu_use_eq_rpcdata; + +struct qcsapi_wifi_get_mu_groups_rpcdata { + __rpc_string *ifname; + u_int size; + __rpc_string *buf; + int return_code; +}; +typedef struct qcsapi_wifi_get_mu_groups_rpcdata qcsapi_wifi_get_mu_groups_rpcdata; + +struct qcsapi_wifi_enable_tdls_rpcdata { + __rpc_string *ifname; + uint32_t enable_tdls; + int return_code; +}; +typedef struct qcsapi_wifi_enable_tdls_rpcdata qcsapi_wifi_enable_tdls_rpcdata; + +struct qcsapi_wifi_enable_tdls_over_qhop_rpcdata { + __rpc_string *ifname; + uint32_t tdls_over_qhop_en; + int return_code; +}; +typedef struct qcsapi_wifi_enable_tdls_over_qhop_rpcdata qcsapi_wifi_enable_tdls_over_qhop_rpcdata; + +struct qcsapi_wifi_get_tdls_status_rpcdata { + __rpc_string *ifname; + uint32_t *p_tdls_status; + int return_code; +}; +typedef struct qcsapi_wifi_get_tdls_status_rpcdata qcsapi_wifi_get_tdls_status_rpcdata; + +struct qcsapi_wifi_set_tdls_params_rpcdata { + __rpc_string *ifname; + int type; + int param_value; + int return_code; +}; +typedef struct qcsapi_wifi_set_tdls_params_rpcdata qcsapi_wifi_set_tdls_params_rpcdata; + +struct qcsapi_wifi_get_tdls_params_rpcdata { + __rpc_string *ifname; + int type; + int *p_value; + int return_code; +}; +typedef struct qcsapi_wifi_get_tdls_params_rpcdata qcsapi_wifi_get_tdls_params_rpcdata; + +struct qcsapi_wifi_tdls_operate_rpcdata { + __rpc_string *ifname; + int operate; + __rpc_string *mac_addr_str; + int cs_interval; + int return_code; +}; +typedef struct qcsapi_wifi_tdls_operate_rpcdata qcsapi_wifi_tdls_operate_rpcdata; + +/* defines for local-only functions */ +#define QCSAPI_GPIO_MONITOR_RESET_DEVICE_REMOTE 2771 + +#define QCSAPI_PROG 0x20000002 +#define QCSAPI_VERS 1 + +#if defined(__STDC__) || defined(__cplusplus) +#define QCSAPI_BOOTCFG_GET_PARAMETER_REMOTE 1 +extern enum clnt_stat qcsapi_bootcfg_get_parameter_remote_1(qcsapi_bootcfg_get_parameter_rpcdata *, qcsapi_bootcfg_get_parameter_rpcdata *, CLIENT *); +extern bool_t qcsapi_bootcfg_get_parameter_remote_1_svc(qcsapi_bootcfg_get_parameter_rpcdata *, qcsapi_bootcfg_get_parameter_rpcdata *, struct svc_req *); +#define QCSAPI_BOOTCFG_UPDATE_PARAMETER_REMOTE 11 +extern enum clnt_stat qcsapi_bootcfg_update_parameter_remote_1(qcsapi_bootcfg_update_parameter_rpcdata *, qcsapi_bootcfg_update_parameter_rpcdata *, CLIENT *); +extern bool_t qcsapi_bootcfg_update_parameter_remote_1_svc(qcsapi_bootcfg_update_parameter_rpcdata *, qcsapi_bootcfg_update_parameter_rpcdata *, struct svc_req *); +#define QCSAPI_BOOTCFG_COMMIT_REMOTE 21 +extern enum clnt_stat qcsapi_bootcfg_commit_remote_1(qcsapi_bootcfg_commit_rpcdata *, qcsapi_bootcfg_commit_rpcdata *, CLIENT *); +extern bool_t qcsapi_bootcfg_commit_remote_1_svc(qcsapi_bootcfg_commit_rpcdata *, qcsapi_bootcfg_commit_rpcdata *, struct svc_req *); +#define QCSAPI_TELNET_ENABLE_REMOTE 31 +extern enum clnt_stat qcsapi_telnet_enable_remote_1(qcsapi_telnet_enable_rpcdata *, qcsapi_telnet_enable_rpcdata *, CLIENT *); +extern bool_t qcsapi_telnet_enable_remote_1_svc(qcsapi_telnet_enable_rpcdata *, qcsapi_telnet_enable_rpcdata *, struct svc_req *); +#define QCSAPI_GET_SERVICE_NAME_ENUM_REMOTE 5651 +extern enum clnt_stat qcsapi_get_service_name_enum_remote_1(qcsapi_get_service_name_enum_rpcdata *, qcsapi_get_service_name_enum_rpcdata *, CLIENT *); +extern bool_t qcsapi_get_service_name_enum_remote_1_svc(qcsapi_get_service_name_enum_rpcdata *, qcsapi_get_service_name_enum_rpcdata *, struct svc_req *); +#define QCSAPI_GET_SERVICE_ACTION_ENUM_REMOTE 5661 +extern enum clnt_stat qcsapi_get_service_action_enum_remote_1(qcsapi_get_service_action_enum_rpcdata *, qcsapi_get_service_action_enum_rpcdata *, CLIENT *); +extern bool_t qcsapi_get_service_action_enum_remote_1_svc(qcsapi_get_service_action_enum_rpcdata *, qcsapi_get_service_action_enum_rpcdata *, struct svc_req *); +#define QCSAPI_SERVICE_CONTROL_REMOTE 5671 +extern enum clnt_stat qcsapi_service_control_remote_1(qcsapi_service_control_rpcdata *, qcsapi_service_control_rpcdata *, CLIENT *); +extern bool_t qcsapi_service_control_remote_1_svc(qcsapi_service_control_rpcdata *, qcsapi_service_control_rpcdata *, struct svc_req *); +#define QCSAPI_WFA_CERT_MODE_ENABLE_REMOTE 5931 +extern enum clnt_stat qcsapi_wfa_cert_mode_enable_remote_1(qcsapi_wfa_cert_mode_enable_rpcdata *, qcsapi_wfa_cert_mode_enable_rpcdata *, CLIENT *); +extern bool_t qcsapi_wfa_cert_mode_enable_remote_1_svc(qcsapi_wfa_cert_mode_enable_rpcdata *, qcsapi_wfa_cert_mode_enable_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_GET_SCS_CCE_CHANNELS_REMOTE 41 +extern enum clnt_stat qcsapi_wifi_get_scs_cce_channels_remote_1(qcsapi_wifi_get_scs_cce_channels_rpcdata *, qcsapi_wifi_get_scs_cce_channels_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_get_scs_cce_channels_remote_1_svc(qcsapi_wifi_get_scs_cce_channels_rpcdata *, qcsapi_wifi_get_scs_cce_channels_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_SCS_ENABLE_REMOTE 51 +extern enum clnt_stat qcsapi_wifi_scs_enable_remote_1(qcsapi_wifi_scs_enable_rpcdata *, qcsapi_wifi_scs_enable_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_scs_enable_remote_1_svc(qcsapi_wifi_scs_enable_rpcdata *, qcsapi_wifi_scs_enable_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_SCS_SWITCH_CHANNEL_REMOTE 61 +extern enum clnt_stat qcsapi_wifi_scs_switch_channel_remote_1(qcsapi_wifi_scs_switch_channel_rpcdata *, qcsapi_wifi_scs_switch_channel_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_scs_switch_channel_remote_1_svc(qcsapi_wifi_scs_switch_channel_rpcdata *, qcsapi_wifi_scs_switch_channel_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_SET_SCS_VERBOSE_REMOTE 71 +extern enum clnt_stat qcsapi_wifi_set_scs_verbose_remote_1(qcsapi_wifi_set_scs_verbose_rpcdata *, qcsapi_wifi_set_scs_verbose_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_set_scs_verbose_remote_1_svc(qcsapi_wifi_set_scs_verbose_rpcdata *, qcsapi_wifi_set_scs_verbose_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_GET_SCS_STATUS_REMOTE 81 +extern enum clnt_stat qcsapi_wifi_get_scs_status_remote_1(qcsapi_wifi_get_scs_status_rpcdata *, qcsapi_wifi_get_scs_status_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_get_scs_status_remote_1_svc(qcsapi_wifi_get_scs_status_rpcdata *, qcsapi_wifi_get_scs_status_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_SET_SCS_SMPL_ENABLE_REMOTE 91 +extern enum clnt_stat qcsapi_wifi_set_scs_smpl_enable_remote_1(qcsapi_wifi_set_scs_smpl_enable_rpcdata *, qcsapi_wifi_set_scs_smpl_enable_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_set_scs_smpl_enable_remote_1_svc(qcsapi_wifi_set_scs_smpl_enable_rpcdata *, qcsapi_wifi_set_scs_smpl_enable_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_SET_SCS_SMPL_DWELL_TIME_REMOTE 101 +extern enum clnt_stat qcsapi_wifi_set_scs_smpl_dwell_time_remote_1(qcsapi_wifi_set_scs_smpl_dwell_time_rpcdata *, qcsapi_wifi_set_scs_smpl_dwell_time_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_set_scs_smpl_dwell_time_remote_1_svc(qcsapi_wifi_set_scs_smpl_dwell_time_rpcdata *, qcsapi_wifi_set_scs_smpl_dwell_time_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_SET_SCS_SAMPLE_INTV_REMOTE 111 +extern enum clnt_stat qcsapi_wifi_set_scs_sample_intv_remote_1(qcsapi_wifi_set_scs_sample_intv_rpcdata *, qcsapi_wifi_set_scs_sample_intv_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_set_scs_sample_intv_remote_1_svc(qcsapi_wifi_set_scs_sample_intv_rpcdata *, qcsapi_wifi_set_scs_sample_intv_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_SET_SCS_INTF_DETECT_INTV_REMOTE 121 +extern enum clnt_stat qcsapi_wifi_set_scs_intf_detect_intv_remote_1(qcsapi_wifi_set_scs_intf_detect_intv_rpcdata *, qcsapi_wifi_set_scs_intf_detect_intv_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_set_scs_intf_detect_intv_remote_1_svc(qcsapi_wifi_set_scs_intf_detect_intv_rpcdata *, qcsapi_wifi_set_scs_intf_detect_intv_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_SET_SCS_THRSHLD_REMOTE 131 +extern enum clnt_stat qcsapi_wifi_set_scs_thrshld_remote_1(qcsapi_wifi_set_scs_thrshld_rpcdata *, qcsapi_wifi_set_scs_thrshld_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_set_scs_thrshld_remote_1_svc(qcsapi_wifi_set_scs_thrshld_rpcdata *, qcsapi_wifi_set_scs_thrshld_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_SET_SCS_REPORT_ONLY_REMOTE 141 +extern enum clnt_stat qcsapi_wifi_set_scs_report_only_remote_1(qcsapi_wifi_set_scs_report_only_rpcdata *, qcsapi_wifi_set_scs_report_only_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_set_scs_report_only_remote_1_svc(qcsapi_wifi_set_scs_report_only_rpcdata *, qcsapi_wifi_set_scs_report_only_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_GET_SCS_STAT_REPORT_REMOTE 151 +extern enum clnt_stat qcsapi_wifi_get_scs_stat_report_remote_1(qcsapi_wifi_get_scs_stat_report_rpcdata *, qcsapi_wifi_get_scs_stat_report_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_get_scs_stat_report_remote_1_svc(qcsapi_wifi_get_scs_stat_report_rpcdata *, qcsapi_wifi_get_scs_stat_report_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_GET_SCS_SCORE_REPORT_REMOTE 152 +extern enum clnt_stat qcsapi_wifi_get_scs_score_report_remote_1(qcsapi_wifi_get_scs_score_report_rpcdata *, qcsapi_wifi_get_scs_score_report_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_get_scs_score_report_remote_1_svc(qcsapi_wifi_get_scs_score_report_rpcdata *, qcsapi_wifi_get_scs_score_report_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_GET_SCS_CURRCHAN_REPORT_REMOTE 161 +extern enum clnt_stat qcsapi_wifi_get_scs_currchan_report_remote_1(qcsapi_wifi_get_scs_currchan_report_rpcdata *, qcsapi_wifi_get_scs_currchan_report_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_get_scs_currchan_report_remote_1_svc(qcsapi_wifi_get_scs_currchan_report_rpcdata *, qcsapi_wifi_get_scs_currchan_report_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_SET_SCS_STATS_REMOTE 171 +extern enum clnt_stat qcsapi_wifi_set_scs_stats_remote_1(qcsapi_wifi_set_scs_stats_rpcdata *, qcsapi_wifi_set_scs_stats_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_set_scs_stats_remote_1_svc(qcsapi_wifi_set_scs_stats_rpcdata *, qcsapi_wifi_set_scs_stats_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_GET_AUTOCHAN_REPORT_REMOTE 181 +extern enum clnt_stat qcsapi_wifi_get_autochan_report_remote_1(qcsapi_wifi_get_autochan_report_rpcdata *, qcsapi_wifi_get_autochan_report_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_get_autochan_report_remote_1_svc(qcsapi_wifi_get_autochan_report_rpcdata *, qcsapi_wifi_get_autochan_report_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_SET_SCS_CCA_INTF_SMTH_FCTR_REMOTE 191 +extern enum clnt_stat qcsapi_wifi_set_scs_cca_intf_smth_fctr_remote_1(qcsapi_wifi_set_scs_cca_intf_smth_fctr_rpcdata *, qcsapi_wifi_set_scs_cca_intf_smth_fctr_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_set_scs_cca_intf_smth_fctr_remote_1_svc(qcsapi_wifi_set_scs_cca_intf_smth_fctr_rpcdata *, qcsapi_wifi_set_scs_cca_intf_smth_fctr_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_SET_SCS_CHAN_MTRC_MRGN_REMOTE 201 +extern enum clnt_stat qcsapi_wifi_set_scs_chan_mtrc_mrgn_remote_1(qcsapi_wifi_set_scs_chan_mtrc_mrgn_rpcdata *, qcsapi_wifi_set_scs_chan_mtrc_mrgn_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_set_scs_chan_mtrc_mrgn_remote_1_svc(qcsapi_wifi_set_scs_chan_mtrc_mrgn_rpcdata *, qcsapi_wifi_set_scs_chan_mtrc_mrgn_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_GET_SCS_CCA_INTF_REMOTE 211 +extern enum clnt_stat qcsapi_wifi_get_scs_cca_intf_remote_1(qcsapi_wifi_get_scs_cca_intf_rpcdata *, qcsapi_wifi_get_scs_cca_intf_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_get_scs_cca_intf_remote_1_svc(qcsapi_wifi_get_scs_cca_intf_rpcdata *, qcsapi_wifi_get_scs_cca_intf_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_GET_SCS_PARAM_REPORT_REMOTE 221 +extern enum clnt_stat qcsapi_wifi_get_scs_param_report_remote_1(qcsapi_wifi_get_scs_param_report_rpcdata *, qcsapi_wifi_get_scs_param_report_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_get_scs_param_report_remote_1_svc(qcsapi_wifi_get_scs_param_report_rpcdata *, qcsapi_wifi_get_scs_param_report_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_GET_SCS_DFS_REENTRY_REQUEST_REMOTE 231 +extern enum clnt_stat qcsapi_wifi_get_scs_dfs_reentry_request_remote_1(qcsapi_wifi_get_scs_dfs_reentry_request_rpcdata *, qcsapi_wifi_get_scs_dfs_reentry_request_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_get_scs_dfs_reentry_request_remote_1_svc(qcsapi_wifi_get_scs_dfs_reentry_request_rpcdata *, qcsapi_wifi_get_scs_dfs_reentry_request_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_START_OCAC_REMOTE 241 +extern enum clnt_stat qcsapi_wifi_start_ocac_remote_1(qcsapi_wifi_start_ocac_rpcdata *, qcsapi_wifi_start_ocac_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_start_ocac_remote_1_svc(qcsapi_wifi_start_ocac_rpcdata *, qcsapi_wifi_start_ocac_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_STOP_OCAC_REMOTE 251 +extern enum clnt_stat qcsapi_wifi_stop_ocac_remote_1(qcsapi_wifi_stop_ocac_rpcdata *, qcsapi_wifi_stop_ocac_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_stop_ocac_remote_1_svc(qcsapi_wifi_stop_ocac_rpcdata *, qcsapi_wifi_stop_ocac_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_GET_OCAC_STATUS_REMOTE 261 +extern enum clnt_stat qcsapi_wifi_get_ocac_status_remote_1(qcsapi_wifi_get_ocac_status_rpcdata *, qcsapi_wifi_get_ocac_status_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_get_ocac_status_remote_1_svc(qcsapi_wifi_get_ocac_status_rpcdata *, qcsapi_wifi_get_ocac_status_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_SET_OCAC_DWELL_TIME_REMOTE 271 +extern enum clnt_stat qcsapi_wifi_set_ocac_dwell_time_remote_1(qcsapi_wifi_set_ocac_dwell_time_rpcdata *, qcsapi_wifi_set_ocac_dwell_time_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_set_ocac_dwell_time_remote_1_svc(qcsapi_wifi_set_ocac_dwell_time_rpcdata *, qcsapi_wifi_set_ocac_dwell_time_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_SET_OCAC_DURATION_REMOTE 281 +extern enum clnt_stat qcsapi_wifi_set_ocac_duration_remote_1(qcsapi_wifi_set_ocac_duration_rpcdata *, qcsapi_wifi_set_ocac_duration_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_set_ocac_duration_remote_1_svc(qcsapi_wifi_set_ocac_duration_rpcdata *, qcsapi_wifi_set_ocac_duration_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_SET_OCAC_CAC_TIME_REMOTE 291 +extern enum clnt_stat qcsapi_wifi_set_ocac_cac_time_remote_1(qcsapi_wifi_set_ocac_cac_time_rpcdata *, qcsapi_wifi_set_ocac_cac_time_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_set_ocac_cac_time_remote_1_svc(qcsapi_wifi_set_ocac_cac_time_rpcdata *, qcsapi_wifi_set_ocac_cac_time_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_SET_OCAC_REPORT_ONLY_REMOTE 301 +extern enum clnt_stat qcsapi_wifi_set_ocac_report_only_remote_1(qcsapi_wifi_set_ocac_report_only_rpcdata *, qcsapi_wifi_set_ocac_report_only_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_set_ocac_report_only_remote_1_svc(qcsapi_wifi_set_ocac_report_only_rpcdata *, qcsapi_wifi_set_ocac_report_only_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_SET_OCAC_THRSHLD_REMOTE 311 +extern enum clnt_stat qcsapi_wifi_set_ocac_thrshld_remote_1(qcsapi_wifi_set_ocac_thrshld_rpcdata *, qcsapi_wifi_set_ocac_thrshld_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_set_ocac_thrshld_remote_1_svc(qcsapi_wifi_set_ocac_thrshld_rpcdata *, qcsapi_wifi_set_ocac_thrshld_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_START_DFS_S_RADIO_REMOTE 242 +extern enum clnt_stat qcsapi_wifi_start_dfs_s_radio_remote_1(qcsapi_wifi_start_dfs_s_radio_rpcdata *, qcsapi_wifi_start_dfs_s_radio_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_start_dfs_s_radio_remote_1_svc(qcsapi_wifi_start_dfs_s_radio_rpcdata *, qcsapi_wifi_start_dfs_s_radio_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_STOP_DFS_S_RADIO_REMOTE 252 +extern enum clnt_stat qcsapi_wifi_stop_dfs_s_radio_remote_1(qcsapi_wifi_stop_dfs_s_radio_rpcdata *, qcsapi_wifi_stop_dfs_s_radio_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_stop_dfs_s_radio_remote_1_svc(qcsapi_wifi_stop_dfs_s_radio_rpcdata *, qcsapi_wifi_stop_dfs_s_radio_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_GET_DFS_S_RADIO_STATUS_REMOTE 262 +extern enum clnt_stat qcsapi_wifi_get_dfs_s_radio_status_remote_1(qcsapi_wifi_get_dfs_s_radio_status_rpcdata *, qcsapi_wifi_get_dfs_s_radio_status_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_get_dfs_s_radio_status_remote_1_svc(qcsapi_wifi_get_dfs_s_radio_status_rpcdata *, qcsapi_wifi_get_dfs_s_radio_status_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_GET_DFS_S_RADIO_AVAILABILITY_REMOTE 263 +extern enum clnt_stat qcsapi_wifi_get_dfs_s_radio_availability_remote_1(qcsapi_wifi_get_dfs_s_radio_availability_rpcdata *, qcsapi_wifi_get_dfs_s_radio_availability_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_get_dfs_s_radio_availability_remote_1_svc(qcsapi_wifi_get_dfs_s_radio_availability_rpcdata *, qcsapi_wifi_get_dfs_s_radio_availability_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_SET_DFS_S_RADIO_DWELL_TIME_REMOTE 272 +extern enum clnt_stat qcsapi_wifi_set_dfs_s_radio_dwell_time_remote_1(qcsapi_wifi_set_dfs_s_radio_dwell_time_rpcdata *, qcsapi_wifi_set_dfs_s_radio_dwell_time_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_set_dfs_s_radio_dwell_time_remote_1_svc(qcsapi_wifi_set_dfs_s_radio_dwell_time_rpcdata *, qcsapi_wifi_set_dfs_s_radio_dwell_time_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_SET_DFS_S_RADIO_DURATION_REMOTE 282 +extern enum clnt_stat qcsapi_wifi_set_dfs_s_radio_duration_remote_1(qcsapi_wifi_set_dfs_s_radio_duration_rpcdata *, qcsapi_wifi_set_dfs_s_radio_duration_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_set_dfs_s_radio_duration_remote_1_svc(qcsapi_wifi_set_dfs_s_radio_duration_rpcdata *, qcsapi_wifi_set_dfs_s_radio_duration_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_SET_DFS_S_RADIO_WEA_DURATION_REMOTE 283 +extern enum clnt_stat qcsapi_wifi_set_dfs_s_radio_wea_duration_remote_1(qcsapi_wifi_set_dfs_s_radio_wea_duration_rpcdata *, qcsapi_wifi_set_dfs_s_radio_wea_duration_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_set_dfs_s_radio_wea_duration_remote_1_svc(qcsapi_wifi_set_dfs_s_radio_wea_duration_rpcdata *, qcsapi_wifi_set_dfs_s_radio_wea_duration_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_SET_DFS_S_RADIO_CAC_TIME_REMOTE 292 +extern enum clnt_stat qcsapi_wifi_set_dfs_s_radio_cac_time_remote_1(qcsapi_wifi_set_dfs_s_radio_cac_time_rpcdata *, qcsapi_wifi_set_dfs_s_radio_cac_time_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_set_dfs_s_radio_cac_time_remote_1_svc(qcsapi_wifi_set_dfs_s_radio_cac_time_rpcdata *, qcsapi_wifi_set_dfs_s_radio_cac_time_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_SET_DFS_S_RADIO_WEA_CAC_TIME_REMOTE 293 +extern enum clnt_stat qcsapi_wifi_set_dfs_s_radio_wea_cac_time_remote_1(qcsapi_wifi_set_dfs_s_radio_wea_cac_time_rpcdata *, qcsapi_wifi_set_dfs_s_radio_wea_cac_time_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_set_dfs_s_radio_wea_cac_time_remote_1_svc(qcsapi_wifi_set_dfs_s_radio_wea_cac_time_rpcdata *, qcsapi_wifi_set_dfs_s_radio_wea_cac_time_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_SET_DFS_S_RADIO_REPORT_ONLY_REMOTE 302 +extern enum clnt_stat qcsapi_wifi_set_dfs_s_radio_report_only_remote_1(qcsapi_wifi_set_dfs_s_radio_report_only_rpcdata *, qcsapi_wifi_set_dfs_s_radio_report_only_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_set_dfs_s_radio_report_only_remote_1_svc(qcsapi_wifi_set_dfs_s_radio_report_only_rpcdata *, qcsapi_wifi_set_dfs_s_radio_report_only_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_SET_DFS_S_RADIO_THRSHLD_REMOTE 312 +extern enum clnt_stat qcsapi_wifi_set_dfs_s_radio_thrshld_remote_1(qcsapi_wifi_set_dfs_s_radio_thrshld_rpcdata *, qcsapi_wifi_set_dfs_s_radio_thrshld_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_set_dfs_s_radio_thrshld_remote_1_svc(qcsapi_wifi_set_dfs_s_radio_thrshld_rpcdata *, qcsapi_wifi_set_dfs_s_radio_thrshld_rpcdata *, struct svc_req *); +#define QCSAPI_INIT_REMOTE 321 +extern enum clnt_stat qcsapi_init_remote_1(qcsapi_init_rpcdata *, qcsapi_init_rpcdata *, CLIENT *); +extern bool_t qcsapi_init_remote_1_svc(qcsapi_init_rpcdata *, qcsapi_init_rpcdata *, struct svc_req *); +#define QCSAPI_CONSOLE_DISCONNECT_REMOTE 331 +extern enum clnt_stat qcsapi_console_disconnect_remote_1(qcsapi_console_disconnect_rpcdata *, qcsapi_console_disconnect_rpcdata *, CLIENT *); +extern bool_t qcsapi_console_disconnect_remote_1_svc(qcsapi_console_disconnect_rpcdata *, qcsapi_console_disconnect_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_STARTPROD_REMOTE 611 +extern enum clnt_stat qcsapi_wifi_startprod_remote_1(qcsapi_wifi_startprod_rpcdata *, qcsapi_wifi_startprod_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_startprod_remote_1_svc(qcsapi_wifi_startprod_rpcdata *, qcsapi_wifi_startprod_rpcdata *, struct svc_req *); +#define QCSAPI_IS_STARTPROD_DONE_REMOTE 621 +extern enum clnt_stat qcsapi_is_startprod_done_remote_1(qcsapi_is_startprod_done_rpcdata *, qcsapi_is_startprod_done_rpcdata *, CLIENT *); +extern bool_t qcsapi_is_startprod_done_remote_1_svc(qcsapi_is_startprod_done_rpcdata *, qcsapi_is_startprod_done_rpcdata *, struct svc_req *); +#define QCSAPI_SYSTEM_GET_TIME_SINCE_START_REMOTE 341 +extern enum clnt_stat qcsapi_system_get_time_since_start_remote_1(qcsapi_system_get_time_since_start_rpcdata *, qcsapi_system_get_time_since_start_rpcdata *, CLIENT *); +extern bool_t qcsapi_system_get_time_since_start_remote_1_svc(qcsapi_system_get_time_since_start_rpcdata *, qcsapi_system_get_time_since_start_rpcdata *, struct svc_req *); +#define QCSAPI_GET_SYSTEM_STATUS_REMOTE 351 +extern enum clnt_stat qcsapi_get_system_status_remote_1(qcsapi_get_system_status_rpcdata *, qcsapi_get_system_status_rpcdata *, CLIENT *); +extern bool_t qcsapi_get_system_status_remote_1_svc(qcsapi_get_system_status_rpcdata *, qcsapi_get_system_status_rpcdata *, struct svc_req *); +#define QCSAPI_GET_RANDOM_SEED_REMOTE 5831 +extern enum clnt_stat qcsapi_get_random_seed_remote_1(qcsapi_get_random_seed_rpcdata *, qcsapi_get_random_seed_rpcdata *, CLIENT *); +extern bool_t qcsapi_get_random_seed_remote_1_svc(qcsapi_get_random_seed_rpcdata *, qcsapi_get_random_seed_rpcdata *, struct svc_req *); +#define QCSAPI_SET_RANDOM_SEED_REMOTE 5841 +extern enum clnt_stat qcsapi_set_random_seed_remote_1(qcsapi_set_random_seed_rpcdata *, qcsapi_set_random_seed_rpcdata *, CLIENT *); +extern bool_t qcsapi_set_random_seed_remote_1_svc(qcsapi_set_random_seed_rpcdata *, qcsapi_set_random_seed_rpcdata *, struct svc_req *); +#define QCSAPI_GET_CARRIER_ID_REMOTE 4071 +extern enum clnt_stat qcsapi_get_carrier_id_remote_1(qcsapi_get_carrier_id_rpcdata *, qcsapi_get_carrier_id_rpcdata *, CLIENT *); +extern bool_t qcsapi_get_carrier_id_remote_1_svc(qcsapi_get_carrier_id_rpcdata *, qcsapi_get_carrier_id_rpcdata *, struct svc_req *); +#define QCSAPI_SET_CARRIER_ID_REMOTE 4081 +extern enum clnt_stat qcsapi_set_carrier_id_remote_1(qcsapi_set_carrier_id_rpcdata *, qcsapi_set_carrier_id_rpcdata *, CLIENT *); +extern bool_t qcsapi_set_carrier_id_remote_1_svc(qcsapi_set_carrier_id_rpcdata *, qcsapi_set_carrier_id_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_GET_SPINOR_JEDECID_REMOTE 4121 +extern enum clnt_stat qcsapi_wifi_get_spinor_jedecid_remote_1(qcsapi_wifi_get_spinor_jedecid_rpcdata *, qcsapi_wifi_get_spinor_jedecid_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_get_spinor_jedecid_remote_1_svc(qcsapi_wifi_get_spinor_jedecid_rpcdata *, qcsapi_wifi_get_spinor_jedecid_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_GET_BB_PARAM_REMOTE 4281 +extern enum clnt_stat qcsapi_wifi_get_bb_param_remote_1(qcsapi_wifi_get_bb_param_rpcdata *, qcsapi_wifi_get_bb_param_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_get_bb_param_remote_1_svc(qcsapi_wifi_get_bb_param_rpcdata *, qcsapi_wifi_get_bb_param_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_SET_BB_PARAM_REMOTE 4291 +extern enum clnt_stat qcsapi_wifi_set_bb_param_remote_1(qcsapi_wifi_set_bb_param_rpcdata *, qcsapi_wifi_set_bb_param_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_set_bb_param_remote_1_svc(qcsapi_wifi_set_bb_param_rpcdata *, qcsapi_wifi_set_bb_param_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_SET_OPTIM_STATS_REMOTE 6001 +extern enum clnt_stat qcsapi_wifi_set_optim_stats_remote_1(qcsapi_wifi_set_optim_stats_rpcdata *, qcsapi_wifi_set_optim_stats_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_set_optim_stats_remote_1_svc(qcsapi_wifi_set_optim_stats_rpcdata *, qcsapi_wifi_set_optim_stats_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_SET_SYS_TIME_REMOTE 6101 +extern enum clnt_stat qcsapi_wifi_set_sys_time_remote_1(qcsapi_wifi_set_sys_time_rpcdata *, qcsapi_wifi_set_sys_time_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_set_sys_time_remote_1_svc(qcsapi_wifi_set_sys_time_rpcdata *, qcsapi_wifi_set_sys_time_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_GET_SYS_TIME_REMOTE 6111 +extern enum clnt_stat qcsapi_wifi_get_sys_time_remote_1(qcsapi_wifi_get_sys_time_rpcdata *, qcsapi_wifi_get_sys_time_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_get_sys_time_remote_1_svc(qcsapi_wifi_get_sys_time_rpcdata *, qcsapi_wifi_get_sys_time_rpcdata *, struct svc_req *); +#define QCSAPI_SET_SOC_MAC_ADDR_REMOTE 3571 +extern enum clnt_stat qcsapi_set_soc_mac_addr_remote_1(qcsapi_set_soc_mac_addr_rpcdata *, qcsapi_set_soc_mac_addr_rpcdata *, CLIENT *); +extern bool_t qcsapi_set_soc_mac_addr_remote_1_svc(qcsapi_set_soc_mac_addr_rpcdata *, qcsapi_set_soc_mac_addr_rpcdata *, struct svc_req *); +#define QCSAPI_GET_CUSTOM_VALUE_REMOTE 3581 +extern enum clnt_stat qcsapi_get_custom_value_remote_1(qcsapi_get_custom_value_rpcdata *, qcsapi_get_custom_value_rpcdata *, CLIENT *); +extern bool_t qcsapi_get_custom_value_remote_1_svc(qcsapi_get_custom_value_rpcdata *, qcsapi_get_custom_value_rpcdata *, struct svc_req *); +#define QCSAPI_CONFIG_GET_PARAMETER_REMOTE 361 +extern enum clnt_stat qcsapi_config_get_parameter_remote_1(qcsapi_config_get_parameter_rpcdata *, qcsapi_config_get_parameter_rpcdata *, CLIENT *); +extern bool_t qcsapi_config_get_parameter_remote_1_svc(qcsapi_config_get_parameter_rpcdata *, qcsapi_config_get_parameter_rpcdata *, struct svc_req *); +#define QCSAPI_CONFIG_UPDATE_PARAMETER_REMOTE 371 +extern enum clnt_stat qcsapi_config_update_parameter_remote_1(qcsapi_config_update_parameter_rpcdata *, qcsapi_config_update_parameter_rpcdata *, CLIENT *); +extern bool_t qcsapi_config_update_parameter_remote_1_svc(qcsapi_config_update_parameter_rpcdata *, qcsapi_config_update_parameter_rpcdata *, struct svc_req *); +#define QCSAPI_CONFIG_GET_SSID_PARAMETER_REMOTE 381 +extern enum clnt_stat qcsapi_config_get_ssid_parameter_remote_1(qcsapi_config_get_ssid_parameter_rpcdata *, qcsapi_config_get_ssid_parameter_rpcdata *, CLIENT *); +extern bool_t qcsapi_config_get_ssid_parameter_remote_1_svc(qcsapi_config_get_ssid_parameter_rpcdata *, qcsapi_config_get_ssid_parameter_rpcdata *, struct svc_req *); +#define QCSAPI_CONFIG_UPDATE_SSID_PARAMETER_REMOTE 391 +extern enum clnt_stat qcsapi_config_update_ssid_parameter_remote_1(qcsapi_config_update_ssid_parameter_rpcdata *, qcsapi_config_update_ssid_parameter_rpcdata *, CLIENT *); +extern bool_t qcsapi_config_update_ssid_parameter_remote_1_svc(qcsapi_config_update_ssid_parameter_rpcdata *, qcsapi_config_update_ssid_parameter_rpcdata *, struct svc_req *); +#define QCSAPI_FILE_PATH_GET_CONFIG_REMOTE 401 +extern enum clnt_stat qcsapi_file_path_get_config_remote_1(qcsapi_file_path_get_config_rpcdata *, qcsapi_file_path_get_config_rpcdata *, CLIENT *); +extern bool_t qcsapi_file_path_get_config_remote_1_svc(qcsapi_file_path_get_config_rpcdata *, qcsapi_file_path_get_config_rpcdata *, struct svc_req *); +#define QCSAPI_FILE_PATH_SET_CONFIG_REMOTE 411 +extern enum clnt_stat qcsapi_file_path_set_config_remote_1(qcsapi_file_path_set_config_rpcdata *, qcsapi_file_path_set_config_rpcdata *, CLIENT *); +extern bool_t qcsapi_file_path_set_config_remote_1_svc(qcsapi_file_path_set_config_rpcdata *, qcsapi_file_path_set_config_rpcdata *, struct svc_req *); +#define QCSAPI_RESTORE_DEFAULT_CONFIG_REMOTE 421 +extern enum clnt_stat qcsapi_restore_default_config_remote_1(qcsapi_restore_default_config_rpcdata *, qcsapi_restore_default_config_rpcdata *, CLIENT *); +extern bool_t qcsapi_restore_default_config_remote_1_svc(qcsapi_restore_default_config_rpcdata *, qcsapi_restore_default_config_rpcdata *, struct svc_req *); +#define QCSAPI_STORE_IPADDR_REMOTE 431 +extern enum clnt_stat qcsapi_store_ipaddr_remote_1(qcsapi_store_ipaddr_rpcdata *, qcsapi_store_ipaddr_rpcdata *, CLIENT *); +extern bool_t qcsapi_store_ipaddr_remote_1_svc(qcsapi_store_ipaddr_rpcdata *, qcsapi_store_ipaddr_rpcdata *, struct svc_req *); +#define QCSAPI_INTERFACE_ENABLE_REMOTE 441 +extern enum clnt_stat qcsapi_interface_enable_remote_1(qcsapi_interface_enable_rpcdata *, qcsapi_interface_enable_rpcdata *, CLIENT *); +extern bool_t qcsapi_interface_enable_remote_1_svc(qcsapi_interface_enable_rpcdata *, qcsapi_interface_enable_rpcdata *, struct svc_req *); +#define QCSAPI_INTERFACE_GET_STATUS_REMOTE 451 +extern enum clnt_stat qcsapi_interface_get_status_remote_1(qcsapi_interface_get_status_rpcdata *, qcsapi_interface_get_status_rpcdata *, CLIENT *); +extern bool_t qcsapi_interface_get_status_remote_1_svc(qcsapi_interface_get_status_rpcdata *, qcsapi_interface_get_status_rpcdata *, struct svc_req *); +#define QCSAPI_INTERFACE_SET_IP4_REMOTE 5691 +extern enum clnt_stat qcsapi_interface_set_ip4_remote_1(qcsapi_interface_set_ip4_rpcdata *, qcsapi_interface_set_ip4_rpcdata *, CLIENT *); +extern bool_t qcsapi_interface_set_ip4_remote_1_svc(qcsapi_interface_set_ip4_rpcdata *, qcsapi_interface_set_ip4_rpcdata *, struct svc_req *); +#define QCSAPI_INTERFACE_GET_IP4_REMOTE 5701 +extern enum clnt_stat qcsapi_interface_get_ip4_remote_1(qcsapi_interface_get_ip4_rpcdata *, qcsapi_interface_get_ip4_rpcdata *, CLIENT *); +extern bool_t qcsapi_interface_get_ip4_remote_1_svc(qcsapi_interface_get_ip4_rpcdata *, qcsapi_interface_get_ip4_rpcdata *, struct svc_req *); +#define QCSAPI_INTERFACE_GET_COUNTER_REMOTE 461 +extern enum clnt_stat qcsapi_interface_get_counter_remote_1(qcsapi_interface_get_counter_rpcdata *, qcsapi_interface_get_counter_rpcdata *, CLIENT *); +extern bool_t qcsapi_interface_get_counter_remote_1_svc(qcsapi_interface_get_counter_rpcdata *, qcsapi_interface_get_counter_rpcdata *, struct svc_req *); +#define QCSAPI_INTERFACE_GET_COUNTER64_REMOTE 471 +extern enum clnt_stat qcsapi_interface_get_counter64_remote_1(qcsapi_interface_get_counter64_rpcdata *, qcsapi_interface_get_counter64_rpcdata *, CLIENT *); +extern bool_t qcsapi_interface_get_counter64_remote_1_svc(qcsapi_interface_get_counter64_rpcdata *, qcsapi_interface_get_counter64_rpcdata *, struct svc_req *); +#define QCSAPI_INTERFACE_GET_MAC_ADDR_REMOTE 481 +extern enum clnt_stat qcsapi_interface_get_mac_addr_remote_1(qcsapi_interface_get_mac_addr_rpcdata *, qcsapi_interface_get_mac_addr_rpcdata *, CLIENT *); +extern bool_t qcsapi_interface_get_mac_addr_remote_1_svc(qcsapi_interface_get_mac_addr_rpcdata *, qcsapi_interface_get_mac_addr_rpcdata *, struct svc_req *); +#define QCSAPI_INTERFACE_SET_MAC_ADDR_REMOTE 491 +extern enum clnt_stat qcsapi_interface_set_mac_addr_remote_1(qcsapi_interface_set_mac_addr_rpcdata *, qcsapi_interface_set_mac_addr_rpcdata *, CLIENT *); +extern bool_t qcsapi_interface_set_mac_addr_remote_1_svc(qcsapi_interface_set_mac_addr_rpcdata *, qcsapi_interface_set_mac_addr_rpcdata *, struct svc_req *); +#define QCSAPI_PM_GET_COUNTER_REMOTE 501 +extern enum clnt_stat qcsapi_pm_get_counter_remote_1(qcsapi_pm_get_counter_rpcdata *, qcsapi_pm_get_counter_rpcdata *, CLIENT *); +extern bool_t qcsapi_pm_get_counter_remote_1_svc(qcsapi_pm_get_counter_rpcdata *, qcsapi_pm_get_counter_rpcdata *, struct svc_req *); +#define QCSAPI_SET_ASPM_L1_REMOTE 511 +extern enum clnt_stat qcsapi_set_aspm_l1_remote_1(qcsapi_set_aspm_l1_rpcdata *, qcsapi_set_aspm_l1_rpcdata *, CLIENT *); +extern bool_t qcsapi_set_aspm_l1_remote_1_svc(qcsapi_set_aspm_l1_rpcdata *, qcsapi_set_aspm_l1_rpcdata *, struct svc_req *); +#define QCSAPI_SET_L1_REMOTE 521 +extern enum clnt_stat qcsapi_set_l1_remote_1(qcsapi_set_l1_rpcdata *, qcsapi_set_l1_rpcdata *, CLIENT *); +extern bool_t qcsapi_set_l1_remote_1_svc(qcsapi_set_l1_rpcdata *, qcsapi_set_l1_rpcdata *, struct svc_req *); +#define QCSAPI_PM_GET_ELAPSED_TIME_REMOTE 531 +extern enum clnt_stat qcsapi_pm_get_elapsed_time_remote_1(qcsapi_pm_get_elapsed_time_rpcdata *, qcsapi_pm_get_elapsed_time_rpcdata *, CLIENT *); +extern bool_t qcsapi_pm_get_elapsed_time_remote_1_svc(qcsapi_pm_get_elapsed_time_rpcdata *, qcsapi_pm_get_elapsed_time_rpcdata *, struct svc_req *); +#define QCSAPI_ETH_PHY_POWER_CONTROL_REMOTE 541 +extern enum clnt_stat qcsapi_eth_phy_power_control_remote_1(qcsapi_eth_phy_power_control_rpcdata *, qcsapi_eth_phy_power_control_rpcdata *, CLIENT *); +extern bool_t qcsapi_eth_phy_power_control_remote_1_svc(qcsapi_eth_phy_power_control_rpcdata *, qcsapi_eth_phy_power_control_rpcdata *, struct svc_req *); +#define QCSAPI_GET_EMAC_SWITCH_REMOTE 5971 +extern enum clnt_stat qcsapi_get_emac_switch_remote_1(qcsapi_get_emac_switch_rpcdata *, qcsapi_get_emac_switch_rpcdata *, CLIENT *); +extern bool_t qcsapi_get_emac_switch_remote_1_svc(qcsapi_get_emac_switch_rpcdata *, qcsapi_get_emac_switch_rpcdata *, struct svc_req *); +#define QCSAPI_SET_EMAC_SWITCH_REMOTE 5981 +extern enum clnt_stat qcsapi_set_emac_switch_remote_1(qcsapi_set_emac_switch_rpcdata *, qcsapi_set_emac_switch_rpcdata *, CLIENT *); +extern bool_t qcsapi_set_emac_switch_remote_1_svc(qcsapi_set_emac_switch_rpcdata *, qcsapi_set_emac_switch_rpcdata *, struct svc_req *); +#define QCSAPI_ETH_DSCP_MAP_REMOTE 5991 +extern enum clnt_stat qcsapi_eth_dscp_map_remote_1(qcsapi_eth_dscp_map_rpcdata *, qcsapi_eth_dscp_map_rpcdata *, CLIENT *); +extern bool_t qcsapi_eth_dscp_map_remote_1_svc(qcsapi_eth_dscp_map_rpcdata *, qcsapi_eth_dscp_map_rpcdata *, struct svc_req *); +#define QCSAPI_GET_ETH_INFO_REMOTE 6121 +extern enum clnt_stat qcsapi_get_eth_info_remote_1(qcsapi_get_eth_info_rpcdata *, qcsapi_get_eth_info_rpcdata *, CLIENT *); +extern bool_t qcsapi_get_eth_info_remote_1_svc(qcsapi_get_eth_info_rpcdata *, qcsapi_get_eth_info_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_GET_MODE_REMOTE 551 +extern enum clnt_stat qcsapi_wifi_get_mode_remote_1(qcsapi_wifi_get_mode_rpcdata *, qcsapi_wifi_get_mode_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_get_mode_remote_1_svc(qcsapi_wifi_get_mode_rpcdata *, qcsapi_wifi_get_mode_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_SET_MODE_REMOTE 561 +extern enum clnt_stat qcsapi_wifi_set_mode_remote_1(qcsapi_wifi_set_mode_rpcdata *, qcsapi_wifi_set_mode_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_set_mode_remote_1_svc(qcsapi_wifi_set_mode_rpcdata *, qcsapi_wifi_set_mode_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_GET_PHY_MODE_REMOTE 571 +extern enum clnt_stat qcsapi_wifi_get_phy_mode_remote_1(qcsapi_wifi_get_phy_mode_rpcdata *, qcsapi_wifi_get_phy_mode_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_get_phy_mode_remote_1_svc(qcsapi_wifi_get_phy_mode_rpcdata *, qcsapi_wifi_get_phy_mode_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_SET_PHY_MODE_REMOTE 581 +extern enum clnt_stat qcsapi_wifi_set_phy_mode_remote_1(qcsapi_wifi_set_phy_mode_rpcdata *, qcsapi_wifi_set_phy_mode_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_set_phy_mode_remote_1_svc(qcsapi_wifi_set_phy_mode_rpcdata *, qcsapi_wifi_set_phy_mode_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_RELOAD_IN_MODE_REMOTE 591 +extern enum clnt_stat qcsapi_wifi_reload_in_mode_remote_1(qcsapi_wifi_reload_in_mode_rpcdata *, qcsapi_wifi_reload_in_mode_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_reload_in_mode_remote_1_svc(qcsapi_wifi_reload_in_mode_rpcdata *, qcsapi_wifi_reload_in_mode_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_RFENABLE_REMOTE 601 +extern enum clnt_stat qcsapi_wifi_rfenable_remote_1(qcsapi_wifi_rfenable_rpcdata *, qcsapi_wifi_rfenable_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_rfenable_remote_1_svc(qcsapi_wifi_rfenable_rpcdata *, qcsapi_wifi_rfenable_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_RFSTATUS_REMOTE 631 +extern enum clnt_stat qcsapi_wifi_rfstatus_remote_1(qcsapi_wifi_rfstatus_rpcdata *, qcsapi_wifi_rfstatus_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_rfstatus_remote_1_svc(qcsapi_wifi_rfstatus_rpcdata *, qcsapi_wifi_rfstatus_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_GET_BW_REMOTE 641 +extern enum clnt_stat qcsapi_wifi_get_bw_remote_1(qcsapi_wifi_get_bw_rpcdata *, qcsapi_wifi_get_bw_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_get_bw_remote_1_svc(qcsapi_wifi_get_bw_rpcdata *, qcsapi_wifi_get_bw_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_SET_BW_REMOTE 651 +extern enum clnt_stat qcsapi_wifi_set_bw_remote_1(qcsapi_wifi_set_bw_rpcdata *, qcsapi_wifi_set_bw_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_set_bw_remote_1_svc(qcsapi_wifi_set_bw_rpcdata *, qcsapi_wifi_set_bw_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_SET_VHT_REMOTE 4091 +extern enum clnt_stat qcsapi_wifi_set_vht_remote_1(qcsapi_wifi_set_vht_rpcdata *, qcsapi_wifi_set_vht_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_set_vht_remote_1_svc(qcsapi_wifi_set_vht_rpcdata *, qcsapi_wifi_set_vht_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_GET_VHT_REMOTE 4101 +extern enum clnt_stat qcsapi_wifi_get_vht_remote_1(qcsapi_wifi_get_vht_rpcdata *, qcsapi_wifi_get_vht_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_get_vht_remote_1_svc(qcsapi_wifi_get_vht_rpcdata *, qcsapi_wifi_get_vht_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_GET_CHANNEL_REMOTE 671 +extern enum clnt_stat qcsapi_wifi_get_channel_remote_1(qcsapi_wifi_get_channel_rpcdata *, qcsapi_wifi_get_channel_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_get_channel_remote_1_svc(qcsapi_wifi_get_channel_rpcdata *, qcsapi_wifi_get_channel_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_SET_CHANNEL_REMOTE 681 +extern enum clnt_stat qcsapi_wifi_set_channel_remote_1(qcsapi_wifi_set_channel_rpcdata *, qcsapi_wifi_set_channel_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_set_channel_remote_1_svc(qcsapi_wifi_set_channel_rpcdata *, qcsapi_wifi_set_channel_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_SET_CHAN_PRI_INACTIVE_REMOTE 691 +extern enum clnt_stat qcsapi_wifi_set_chan_pri_inactive_remote_1(qcsapi_wifi_set_chan_pri_inactive_rpcdata *, qcsapi_wifi_set_chan_pri_inactive_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_set_chan_pri_inactive_remote_1_svc(qcsapi_wifi_set_chan_pri_inactive_rpcdata *, qcsapi_wifi_set_chan_pri_inactive_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_CHAN_CONTROL_REMOTE 6211 +extern enum clnt_stat qcsapi_wifi_chan_control_remote_1(qcsapi_wifi_chan_control_rpcdata *, qcsapi_wifi_chan_control_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_chan_control_remote_1_svc(qcsapi_wifi_chan_control_rpcdata *, qcsapi_wifi_chan_control_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_GET_CHAN_DISABLED_REMOTE 6221 +extern enum clnt_stat qcsapi_wifi_get_chan_disabled_remote_1(qcsapi_wifi_get_chan_disabled_rpcdata *, qcsapi_wifi_get_chan_disabled_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_get_chan_disabled_remote_1_svc(qcsapi_wifi_get_chan_disabled_rpcdata *, qcsapi_wifi_get_chan_disabled_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_GET_BEACON_INTERVAL_REMOTE 701 +extern enum clnt_stat qcsapi_wifi_get_beacon_interval_remote_1(qcsapi_wifi_get_beacon_interval_rpcdata *, qcsapi_wifi_get_beacon_interval_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_get_beacon_interval_remote_1_svc(qcsapi_wifi_get_beacon_interval_rpcdata *, qcsapi_wifi_get_beacon_interval_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_SET_BEACON_INTERVAL_REMOTE 711 +extern enum clnt_stat qcsapi_wifi_set_beacon_interval_remote_1(qcsapi_wifi_set_beacon_interval_rpcdata *, qcsapi_wifi_set_beacon_interval_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_set_beacon_interval_remote_1_svc(qcsapi_wifi_set_beacon_interval_rpcdata *, qcsapi_wifi_set_beacon_interval_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_GET_DTIM_REMOTE 721 +extern enum clnt_stat qcsapi_wifi_get_dtim_remote_1(qcsapi_wifi_get_dtim_rpcdata *, qcsapi_wifi_get_dtim_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_get_dtim_remote_1_svc(qcsapi_wifi_get_dtim_rpcdata *, qcsapi_wifi_get_dtim_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_SET_DTIM_REMOTE 731 +extern enum clnt_stat qcsapi_wifi_set_dtim_remote_1(qcsapi_wifi_set_dtim_rpcdata *, qcsapi_wifi_set_dtim_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_set_dtim_remote_1_svc(qcsapi_wifi_set_dtim_rpcdata *, qcsapi_wifi_set_dtim_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_GET_ASSOC_LIMIT_REMOTE 741 +extern enum clnt_stat qcsapi_wifi_get_assoc_limit_remote_1(qcsapi_wifi_get_assoc_limit_rpcdata *, qcsapi_wifi_get_assoc_limit_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_get_assoc_limit_remote_1_svc(qcsapi_wifi_get_assoc_limit_rpcdata *, qcsapi_wifi_get_assoc_limit_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_GET_BSS_ASSOC_LIMIT_REMOTE 5721 +extern enum clnt_stat qcsapi_wifi_get_bss_assoc_limit_remote_1(qcsapi_wifi_get_bss_assoc_limit_rpcdata *, qcsapi_wifi_get_bss_assoc_limit_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_get_bss_assoc_limit_remote_1_svc(qcsapi_wifi_get_bss_assoc_limit_rpcdata *, qcsapi_wifi_get_bss_assoc_limit_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_SET_ASSOC_LIMIT_REMOTE 751 +extern enum clnt_stat qcsapi_wifi_set_assoc_limit_remote_1(qcsapi_wifi_set_assoc_limit_rpcdata *, qcsapi_wifi_set_assoc_limit_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_set_assoc_limit_remote_1_svc(qcsapi_wifi_set_assoc_limit_rpcdata *, qcsapi_wifi_set_assoc_limit_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_SET_BSS_ASSOC_LIMIT_REMOTE 5711 +extern enum clnt_stat qcsapi_wifi_set_bss_assoc_limit_remote_1(qcsapi_wifi_set_bss_assoc_limit_rpcdata *, qcsapi_wifi_set_bss_assoc_limit_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_set_bss_assoc_limit_remote_1_svc(qcsapi_wifi_set_bss_assoc_limit_rpcdata *, qcsapi_wifi_set_bss_assoc_limit_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_GET_BSSID_REMOTE 761 +extern enum clnt_stat qcsapi_wifi_get_bssid_remote_1(qcsapi_wifi_get_BSSID_rpcdata *, qcsapi_wifi_get_BSSID_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_get_bssid_remote_1_svc(qcsapi_wifi_get_BSSID_rpcdata *, qcsapi_wifi_get_BSSID_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_GET_CONFIG_BSSID_REMOTE 771 +extern enum clnt_stat qcsapi_wifi_get_config_bssid_remote_1(qcsapi_wifi_get_config_BSSID_rpcdata *, qcsapi_wifi_get_config_BSSID_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_get_config_bssid_remote_1_svc(qcsapi_wifi_get_config_BSSID_rpcdata *, qcsapi_wifi_get_config_BSSID_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_SSID_GET_BSSID_REMOTE 6131 +extern enum clnt_stat qcsapi_wifi_ssid_get_bssid_remote_1(qcsapi_wifi_ssid_get_bssid_rpcdata *, qcsapi_wifi_ssid_get_bssid_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_ssid_get_bssid_remote_1_svc(qcsapi_wifi_ssid_get_bssid_rpcdata *, qcsapi_wifi_ssid_get_bssid_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_SSID_SET_BSSID_REMOTE 6141 +extern enum clnt_stat qcsapi_wifi_ssid_set_bssid_remote_1(qcsapi_wifi_ssid_set_bssid_rpcdata *, qcsapi_wifi_ssid_set_bssid_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_ssid_set_bssid_remote_1_svc(qcsapi_wifi_ssid_set_bssid_rpcdata *, qcsapi_wifi_ssid_set_bssid_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_GET_SSID_REMOTE 781 +extern enum clnt_stat qcsapi_wifi_get_ssid_remote_1(qcsapi_wifi_get_SSID_rpcdata *, qcsapi_wifi_get_SSID_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_get_ssid_remote_1_svc(qcsapi_wifi_get_SSID_rpcdata *, qcsapi_wifi_get_SSID_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_SET_SSID_REMOTE 791 +extern enum clnt_stat qcsapi_wifi_set_ssid_remote_1(qcsapi_wifi_set_SSID_rpcdata *, qcsapi_wifi_set_SSID_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_set_ssid_remote_1_svc(qcsapi_wifi_set_SSID_rpcdata *, qcsapi_wifi_set_SSID_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_GET_IEEE_802_11_STANDARD_REMOTE 801 +extern enum clnt_stat qcsapi_wifi_get_ieee_802_11_standard_remote_1(qcsapi_wifi_get_IEEE_802_11_standard_rpcdata *, qcsapi_wifi_get_IEEE_802_11_standard_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_get_ieee_802_11_standard_remote_1_svc(qcsapi_wifi_get_IEEE_802_11_standard_rpcdata *, qcsapi_wifi_get_IEEE_802_11_standard_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_GET_LIST_CHANNELS_REMOTE 811 +extern enum clnt_stat qcsapi_wifi_get_list_channels_remote_1(qcsapi_wifi_get_list_channels_rpcdata *, qcsapi_wifi_get_list_channels_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_get_list_channels_remote_1_svc(qcsapi_wifi_get_list_channels_rpcdata *, qcsapi_wifi_get_list_channels_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_GET_MODE_SWITCH_REMOTE 821 +extern enum clnt_stat qcsapi_wifi_get_mode_switch_remote_1(qcsapi_wifi_get_mode_switch_rpcdata *, qcsapi_wifi_get_mode_switch_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_get_mode_switch_remote_1_svc(qcsapi_wifi_get_mode_switch_rpcdata *, qcsapi_wifi_get_mode_switch_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_DISASSOCIATE_REMOTE 831 +extern enum clnt_stat qcsapi_wifi_disassociate_remote_1(qcsapi_wifi_disassociate_rpcdata *, qcsapi_wifi_disassociate_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_disassociate_remote_1_svc(qcsapi_wifi_disassociate_rpcdata *, qcsapi_wifi_disassociate_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_DISASSOCIATE_STA_REMOTE 841 +extern enum clnt_stat qcsapi_wifi_disassociate_sta_remote_1(qcsapi_wifi_disassociate_sta_rpcdata *, qcsapi_wifi_disassociate_sta_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_disassociate_sta_remote_1_svc(qcsapi_wifi_disassociate_sta_rpcdata *, qcsapi_wifi_disassociate_sta_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_REASSOCIATE_REMOTE 4441 +extern enum clnt_stat qcsapi_wifi_reassociate_remote_1(qcsapi_wifi_reassociate_rpcdata *, qcsapi_wifi_reassociate_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_reassociate_remote_1_svc(qcsapi_wifi_reassociate_rpcdata *, qcsapi_wifi_reassociate_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_GET_DISCONN_INFO_REMOTE 851 +extern enum clnt_stat qcsapi_wifi_get_disconn_info_remote_1(qcsapi_wifi_get_disconn_info_rpcdata *, qcsapi_wifi_get_disconn_info_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_get_disconn_info_remote_1_svc(qcsapi_wifi_get_disconn_info_rpcdata *, qcsapi_wifi_get_disconn_info_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_DISABLE_WPS_REMOTE 861 +extern enum clnt_stat qcsapi_wifi_disable_wps_remote_1(qcsapi_wifi_disable_wps_rpcdata *, qcsapi_wifi_disable_wps_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_disable_wps_remote_1_svc(qcsapi_wifi_disable_wps_rpcdata *, qcsapi_wifi_disable_wps_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_ASSOCIATE_REMOTE 871 +extern enum clnt_stat qcsapi_wifi_associate_remote_1(qcsapi_wifi_associate_rpcdata *, qcsapi_wifi_associate_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_associate_remote_1_svc(qcsapi_wifi_associate_rpcdata *, qcsapi_wifi_associate_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_START_CCA_REMOTE 881 +extern enum clnt_stat qcsapi_wifi_start_cca_remote_1(qcsapi_wifi_start_cca_rpcdata *, qcsapi_wifi_start_cca_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_start_cca_remote_1_svc(qcsapi_wifi_start_cca_rpcdata *, qcsapi_wifi_start_cca_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_GET_NOISE_REMOTE 891 +extern enum clnt_stat qcsapi_wifi_get_noise_remote_1(qcsapi_wifi_get_noise_rpcdata *, qcsapi_wifi_get_noise_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_get_noise_remote_1_svc(qcsapi_wifi_get_noise_rpcdata *, qcsapi_wifi_get_noise_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_GET_RSSI_BY_CHAIN_REMOTE 901 +extern enum clnt_stat qcsapi_wifi_get_rssi_by_chain_remote_1(qcsapi_wifi_get_rssi_by_chain_rpcdata *, qcsapi_wifi_get_rssi_by_chain_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_get_rssi_by_chain_remote_1_svc(qcsapi_wifi_get_rssi_by_chain_rpcdata *, qcsapi_wifi_get_rssi_by_chain_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_GET_AVG_SNR_REMOTE 911 +extern enum clnt_stat qcsapi_wifi_get_avg_snr_remote_1(qcsapi_wifi_get_avg_snr_rpcdata *, qcsapi_wifi_get_avg_snr_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_get_avg_snr_remote_1_svc(qcsapi_wifi_get_avg_snr_rpcdata *, qcsapi_wifi_get_avg_snr_rpcdata *, struct svc_req *); +#define QCSAPI_GET_PRIMARY_INTERFACE_REMOTE 921 +extern enum clnt_stat qcsapi_get_primary_interface_remote_1(qcsapi_get_primary_interface_rpcdata *, qcsapi_get_primary_interface_rpcdata *, CLIENT *); +extern bool_t qcsapi_get_primary_interface_remote_1_svc(qcsapi_get_primary_interface_rpcdata *, qcsapi_get_primary_interface_rpcdata *, struct svc_req *); +#define QCSAPI_GET_INTERFACE_BY_INDEX_REMOTE 931 +extern enum clnt_stat qcsapi_get_interface_by_index_remote_1(qcsapi_get_interface_by_index_rpcdata *, qcsapi_get_interface_by_index_rpcdata *, CLIENT *); +extern bool_t qcsapi_get_interface_by_index_remote_1_svc(qcsapi_get_interface_by_index_rpcdata *, qcsapi_get_interface_by_index_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_SET_WIFI_MACADDR_REMOTE 941 +extern enum clnt_stat qcsapi_wifi_set_wifi_macaddr_remote_1(qcsapi_wifi_set_wifi_macaddr_rpcdata *, qcsapi_wifi_set_wifi_macaddr_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_set_wifi_macaddr_remote_1_svc(qcsapi_wifi_set_wifi_macaddr_rpcdata *, qcsapi_wifi_set_wifi_macaddr_rpcdata *, struct svc_req *); +#define QCSAPI_INTERFACE_GET_BSSID_REMOTE 951 +extern enum clnt_stat qcsapi_interface_get_bssid_remote_1(qcsapi_interface_get_BSSID_rpcdata *, qcsapi_interface_get_BSSID_rpcdata *, CLIENT *); +extern bool_t qcsapi_interface_get_bssid_remote_1_svc(qcsapi_interface_get_BSSID_rpcdata *, qcsapi_interface_get_BSSID_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_GET_RATES_REMOTE 961 +extern enum clnt_stat qcsapi_wifi_get_rates_remote_1(qcsapi_wifi_get_rates_rpcdata *, qcsapi_wifi_get_rates_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_get_rates_remote_1_svc(qcsapi_wifi_get_rates_rpcdata *, qcsapi_wifi_get_rates_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_SET_RATES_REMOTE 971 +extern enum clnt_stat qcsapi_wifi_set_rates_remote_1(qcsapi_wifi_set_rates_rpcdata *, qcsapi_wifi_set_rates_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_set_rates_remote_1_svc(qcsapi_wifi_set_rates_rpcdata *, qcsapi_wifi_set_rates_rpcdata *, struct svc_req *); +#define QCSAPI_GET_MAX_BITRATE_REMOTE 981 +extern enum clnt_stat qcsapi_get_max_bitrate_remote_1(qcsapi_get_max_bitrate_rpcdata *, qcsapi_get_max_bitrate_rpcdata *, CLIENT *); +extern bool_t qcsapi_get_max_bitrate_remote_1_svc(qcsapi_get_max_bitrate_rpcdata *, qcsapi_get_max_bitrate_rpcdata *, struct svc_req *); +#define QCSAPI_SET_MAX_BITRATE_REMOTE 991 +extern enum clnt_stat qcsapi_set_max_bitrate_remote_1(qcsapi_set_max_bitrate_rpcdata *, qcsapi_set_max_bitrate_rpcdata *, CLIENT *); +extern bool_t qcsapi_set_max_bitrate_remote_1_svc(qcsapi_set_max_bitrate_rpcdata *, qcsapi_set_max_bitrate_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_QOS_GET_PARAM_REMOTE 1001 +extern enum clnt_stat qcsapi_wifi_qos_get_param_remote_1(qcsapi_wifi_qos_get_param_rpcdata *, qcsapi_wifi_qos_get_param_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_qos_get_param_remote_1_svc(qcsapi_wifi_qos_get_param_rpcdata *, qcsapi_wifi_qos_get_param_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_QOS_SET_PARAM_REMOTE 1011 +extern enum clnt_stat qcsapi_wifi_qos_set_param_remote_1(qcsapi_wifi_qos_set_param_rpcdata *, qcsapi_wifi_qos_set_param_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_qos_set_param_remote_1_svc(qcsapi_wifi_qos_set_param_rpcdata *, qcsapi_wifi_qos_set_param_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_GET_WMM_AC_MAP_REMOTE 1021 +extern enum clnt_stat qcsapi_wifi_get_wmm_ac_map_remote_1(qcsapi_wifi_get_wmm_ac_map_rpcdata *, qcsapi_wifi_get_wmm_ac_map_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_get_wmm_ac_map_remote_1_svc(qcsapi_wifi_get_wmm_ac_map_rpcdata *, qcsapi_wifi_get_wmm_ac_map_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_SET_WMM_AC_MAP_REMOTE 1031 +extern enum clnt_stat qcsapi_wifi_set_wmm_ac_map_remote_1(qcsapi_wifi_set_wmm_ac_map_rpcdata *, qcsapi_wifi_set_wmm_ac_map_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_set_wmm_ac_map_remote_1_svc(qcsapi_wifi_set_wmm_ac_map_rpcdata *, qcsapi_wifi_set_wmm_ac_map_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_GET_DSCP_8021P_MAP_REMOTE 1041 +extern enum clnt_stat qcsapi_wifi_get_dscp_8021p_map_remote_1(qcsapi_wifi_get_dscp_8021p_map_rpcdata *, qcsapi_wifi_get_dscp_8021p_map_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_get_dscp_8021p_map_remote_1_svc(qcsapi_wifi_get_dscp_8021p_map_rpcdata *, qcsapi_wifi_get_dscp_8021p_map_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_GET_DSCP_AC_MAP_REMOTE 1051 +extern enum clnt_stat qcsapi_wifi_get_dscp_ac_map_remote_1(qcsapi_wifi_get_dscp_ac_map_rpcdata *, qcsapi_wifi_get_dscp_ac_map_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_get_dscp_ac_map_remote_1_svc(qcsapi_wifi_get_dscp_ac_map_rpcdata *, qcsapi_wifi_get_dscp_ac_map_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_SET_DSCP_8021P_MAP_REMOTE 1061 +extern enum clnt_stat qcsapi_wifi_set_dscp_8021p_map_remote_1(qcsapi_wifi_set_dscp_8021p_map_rpcdata *, qcsapi_wifi_set_dscp_8021p_map_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_set_dscp_8021p_map_remote_1_svc(qcsapi_wifi_set_dscp_8021p_map_rpcdata *, qcsapi_wifi_set_dscp_8021p_map_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_SET_DSCP_AC_MAP_REMOTE 1071 +extern enum clnt_stat qcsapi_wifi_set_dscp_ac_map_remote_1(qcsapi_wifi_set_dscp_ac_map_rpcdata *, qcsapi_wifi_set_dscp_ac_map_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_set_dscp_ac_map_remote_1_svc(qcsapi_wifi_set_dscp_ac_map_rpcdata *, qcsapi_wifi_set_dscp_ac_map_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_GET_PRIORITY_REMOTE 1081 +extern enum clnt_stat qcsapi_wifi_get_priority_remote_1(qcsapi_wifi_get_priority_rpcdata *, qcsapi_wifi_get_priority_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_get_priority_remote_1_svc(qcsapi_wifi_get_priority_rpcdata *, qcsapi_wifi_get_priority_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_SET_PRIORITY_REMOTE 1091 +extern enum clnt_stat qcsapi_wifi_set_priority_remote_1(qcsapi_wifi_set_priority_rpcdata *, qcsapi_wifi_set_priority_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_set_priority_remote_1_svc(qcsapi_wifi_set_priority_rpcdata *, qcsapi_wifi_set_priority_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_GET_AIRFAIR_REMOTE 1101 +extern enum clnt_stat qcsapi_wifi_get_airfair_remote_1(qcsapi_wifi_get_airfair_rpcdata *, qcsapi_wifi_get_airfair_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_get_airfair_remote_1_svc(qcsapi_wifi_get_airfair_rpcdata *, qcsapi_wifi_get_airfair_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_SET_AIRFAIR_REMOTE 1111 +extern enum clnt_stat qcsapi_wifi_set_airfair_remote_1(qcsapi_wifi_set_airfair_rpcdata *, qcsapi_wifi_set_airfair_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_set_airfair_remote_1_svc(qcsapi_wifi_set_airfair_rpcdata *, qcsapi_wifi_set_airfair_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_GET_TX_POWER_REMOTE 1211 +extern enum clnt_stat qcsapi_wifi_get_tx_power_remote_1(qcsapi_wifi_get_tx_power_rpcdata *, qcsapi_wifi_get_tx_power_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_get_tx_power_remote_1_svc(qcsapi_wifi_get_tx_power_rpcdata *, qcsapi_wifi_get_tx_power_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_SET_TX_POWER_REMOTE 1221 +extern enum clnt_stat qcsapi_wifi_set_tx_power_remote_1(qcsapi_wifi_set_tx_power_rpcdata *, qcsapi_wifi_set_tx_power_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_set_tx_power_remote_1_svc(qcsapi_wifi_set_tx_power_rpcdata *, qcsapi_wifi_set_tx_power_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_GET_BW_POWER_REMOTE 1231 +extern enum clnt_stat qcsapi_wifi_get_bw_power_remote_1(qcsapi_wifi_get_bw_power_rpcdata *, qcsapi_wifi_get_bw_power_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_get_bw_power_remote_1_svc(qcsapi_wifi_get_bw_power_rpcdata *, qcsapi_wifi_get_bw_power_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_SET_BW_POWER_REMOTE 1241 +extern enum clnt_stat qcsapi_wifi_set_bw_power_remote_1(qcsapi_wifi_set_bw_power_rpcdata *, qcsapi_wifi_set_bw_power_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_set_bw_power_remote_1_svc(qcsapi_wifi_set_bw_power_rpcdata *, qcsapi_wifi_set_bw_power_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_GET_BF_POWER_REMOTE 1261 +extern enum clnt_stat qcsapi_wifi_get_bf_power_remote_1(qcsapi_wifi_get_bf_power_rpcdata *, qcsapi_wifi_get_bf_power_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_get_bf_power_remote_1_svc(qcsapi_wifi_get_bf_power_rpcdata *, qcsapi_wifi_get_bf_power_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_SET_BF_POWER_REMOTE 1271 +extern enum clnt_stat qcsapi_wifi_set_bf_power_remote_1(qcsapi_wifi_set_bf_power_rpcdata *, qcsapi_wifi_set_bf_power_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_set_bf_power_remote_1_svc(qcsapi_wifi_set_bf_power_rpcdata *, qcsapi_wifi_set_bf_power_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_GET_TX_POWER_EXT_REMOTE 4541 +extern enum clnt_stat qcsapi_wifi_get_tx_power_ext_remote_1(qcsapi_wifi_get_tx_power_ext_rpcdata *, qcsapi_wifi_get_tx_power_ext_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_get_tx_power_ext_remote_1_svc(qcsapi_wifi_get_tx_power_ext_rpcdata *, qcsapi_wifi_get_tx_power_ext_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_SET_TX_POWER_EXT_REMOTE 4551 +extern enum clnt_stat qcsapi_wifi_set_tx_power_ext_remote_1(qcsapi_wifi_set_tx_power_ext_rpcdata *, qcsapi_wifi_set_tx_power_ext_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_set_tx_power_ext_remote_1_svc(qcsapi_wifi_set_tx_power_ext_rpcdata *, qcsapi_wifi_set_tx_power_ext_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_GET_CHAN_POWER_TABLE_REMOTE 6151 +extern enum clnt_stat qcsapi_wifi_get_chan_power_table_remote_1(qcsapi_wifi_get_chan_power_table_rpcdata *, qcsapi_wifi_get_chan_power_table_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_get_chan_power_table_remote_1_svc(qcsapi_wifi_get_chan_power_table_rpcdata *, qcsapi_wifi_get_chan_power_table_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_SET_CHAN_POWER_TABLE_REMOTE 6161 +extern enum clnt_stat qcsapi_wifi_set_chan_power_table_remote_1(qcsapi_wifi_set_chan_power_table_rpcdata *, qcsapi_wifi_set_chan_power_table_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_set_chan_power_table_remote_1_svc(qcsapi_wifi_set_chan_power_table_rpcdata *, qcsapi_wifi_set_chan_power_table_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_GET_POWER_SELECTION_REMOTE 4471 +extern enum clnt_stat qcsapi_wifi_get_power_selection_remote_1(qcsapi_wifi_get_power_selection_rpcdata *, qcsapi_wifi_get_power_selection_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_get_power_selection_remote_1_svc(qcsapi_wifi_get_power_selection_rpcdata *, qcsapi_wifi_get_power_selection_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_SET_POWER_SELECTION_REMOTE 4481 +extern enum clnt_stat qcsapi_wifi_set_power_selection_remote_1(qcsapi_wifi_set_power_selection_rpcdata *, qcsapi_wifi_set_power_selection_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_set_power_selection_remote_1_svc(qcsapi_wifi_set_power_selection_rpcdata *, qcsapi_wifi_set_power_selection_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_GET_CARRIER_INTERFERENCE_REMOTE 1291 +extern enum clnt_stat qcsapi_wifi_get_carrier_interference_remote_1(qcsapi_wifi_get_carrier_interference_rpcdata *, qcsapi_wifi_get_carrier_interference_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_get_carrier_interference_remote_1_svc(qcsapi_wifi_get_carrier_interference_rpcdata *, qcsapi_wifi_get_carrier_interference_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_GET_CONGESTION_INDEX_REMOTE 1301 +extern enum clnt_stat qcsapi_wifi_get_congestion_index_remote_1(qcsapi_wifi_get_congestion_index_rpcdata *, qcsapi_wifi_get_congestion_index_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_get_congestion_index_remote_1_svc(qcsapi_wifi_get_congestion_index_rpcdata *, qcsapi_wifi_get_congestion_index_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_GET_SUPPORTED_TX_POWER_LEVELS_REMOTE 1311 +extern enum clnt_stat qcsapi_wifi_get_supported_tx_power_levels_remote_1(qcsapi_wifi_get_supported_tx_power_levels_rpcdata *, qcsapi_wifi_get_supported_tx_power_levels_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_get_supported_tx_power_levels_remote_1_svc(qcsapi_wifi_get_supported_tx_power_levels_rpcdata *, qcsapi_wifi_get_supported_tx_power_levels_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_GET_CURRENT_TX_POWER_LEVEL_REMOTE 1321 +extern enum clnt_stat qcsapi_wifi_get_current_tx_power_level_remote_1(qcsapi_wifi_get_current_tx_power_level_rpcdata *, qcsapi_wifi_get_current_tx_power_level_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_get_current_tx_power_level_remote_1_svc(qcsapi_wifi_get_current_tx_power_level_rpcdata *, qcsapi_wifi_get_current_tx_power_level_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_SET_POWER_CONSTRAINT_REMOTE 1331 +extern enum clnt_stat qcsapi_wifi_set_power_constraint_remote_1(qcsapi_wifi_set_power_constraint_rpcdata *, qcsapi_wifi_set_power_constraint_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_set_power_constraint_remote_1_svc(qcsapi_wifi_set_power_constraint_rpcdata *, qcsapi_wifi_set_power_constraint_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_GET_POWER_CONSTRAINT_REMOTE 1341 +extern enum clnt_stat qcsapi_wifi_get_power_constraint_remote_1(qcsapi_wifi_get_power_constraint_rpcdata *, qcsapi_wifi_get_power_constraint_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_get_power_constraint_remote_1_svc(qcsapi_wifi_get_power_constraint_rpcdata *, qcsapi_wifi_get_power_constraint_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_SET_TPC_INTERVAL_REMOTE 1351 +extern enum clnt_stat qcsapi_wifi_set_tpc_interval_remote_1(qcsapi_wifi_set_tpc_interval_rpcdata *, qcsapi_wifi_set_tpc_interval_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_set_tpc_interval_remote_1_svc(qcsapi_wifi_set_tpc_interval_rpcdata *, qcsapi_wifi_set_tpc_interval_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_GET_TPC_INTERVAL_REMOTE 1361 +extern enum clnt_stat qcsapi_wifi_get_tpc_interval_remote_1(qcsapi_wifi_get_tpc_interval_rpcdata *, qcsapi_wifi_get_tpc_interval_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_get_tpc_interval_remote_1_svc(qcsapi_wifi_get_tpc_interval_rpcdata *, qcsapi_wifi_get_tpc_interval_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_GET_ASSOC_RECORDS_REMOTE 1371 +extern enum clnt_stat qcsapi_wifi_get_assoc_records_remote_1(qcsapi_wifi_get_assoc_records_rpcdata *, qcsapi_wifi_get_assoc_records_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_get_assoc_records_remote_1_svc(qcsapi_wifi_get_assoc_records_rpcdata *, qcsapi_wifi_get_assoc_records_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_GET_AP_ISOLATE_REMOTE 1381 +extern enum clnt_stat qcsapi_wifi_get_ap_isolate_remote_1(qcsapi_wifi_get_ap_isolate_rpcdata *, qcsapi_wifi_get_ap_isolate_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_get_ap_isolate_remote_1_svc(qcsapi_wifi_get_ap_isolate_rpcdata *, qcsapi_wifi_get_ap_isolate_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_SET_AP_ISOLATE_REMOTE 1391 +extern enum clnt_stat qcsapi_wifi_set_ap_isolate_remote_1(qcsapi_wifi_set_ap_isolate_rpcdata *, qcsapi_wifi_set_ap_isolate_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_set_ap_isolate_remote_1_svc(qcsapi_wifi_set_ap_isolate_rpcdata *, qcsapi_wifi_set_ap_isolate_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_GET_INTRA_BSS_ISOLATE_REMOTE 1401 +extern enum clnt_stat qcsapi_wifi_get_intra_bss_isolate_remote_1(qcsapi_wifi_get_intra_bss_isolate_rpcdata *, qcsapi_wifi_get_intra_bss_isolate_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_get_intra_bss_isolate_remote_1_svc(qcsapi_wifi_get_intra_bss_isolate_rpcdata *, qcsapi_wifi_get_intra_bss_isolate_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_SET_INTRA_BSS_ISOLATE_REMOTE 1411 +extern enum clnt_stat qcsapi_wifi_set_intra_bss_isolate_remote_1(qcsapi_wifi_set_intra_bss_isolate_rpcdata *, qcsapi_wifi_set_intra_bss_isolate_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_set_intra_bss_isolate_remote_1_svc(qcsapi_wifi_set_intra_bss_isolate_rpcdata *, qcsapi_wifi_set_intra_bss_isolate_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_GET_BSS_ISOLATE_REMOTE 1421 +extern enum clnt_stat qcsapi_wifi_get_bss_isolate_remote_1(qcsapi_wifi_get_bss_isolate_rpcdata *, qcsapi_wifi_get_bss_isolate_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_get_bss_isolate_remote_1_svc(qcsapi_wifi_get_bss_isolate_rpcdata *, qcsapi_wifi_get_bss_isolate_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_SET_BSS_ISOLATE_REMOTE 1431 +extern enum clnt_stat qcsapi_wifi_set_bss_isolate_remote_1(qcsapi_wifi_set_bss_isolate_rpcdata *, qcsapi_wifi_set_bss_isolate_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_set_bss_isolate_remote_1_svc(qcsapi_wifi_set_bss_isolate_rpcdata *, qcsapi_wifi_set_bss_isolate_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_DISABLE_DFS_CHANNELS_REMOTE 4061 +extern enum clnt_stat qcsapi_wifi_disable_dfs_channels_remote_1(qcsapi_wifi_disable_dfs_channels_rpcdata *, qcsapi_wifi_disable_dfs_channels_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_disable_dfs_channels_remote_1_svc(qcsapi_wifi_disable_dfs_channels_rpcdata *, qcsapi_wifi_disable_dfs_channels_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_CREATE_RESTRICTED_BSS_REMOTE 1441 +extern enum clnt_stat qcsapi_wifi_create_restricted_bss_remote_1(qcsapi_wifi_create_restricted_bss_rpcdata *, qcsapi_wifi_create_restricted_bss_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_create_restricted_bss_remote_1_svc(qcsapi_wifi_create_restricted_bss_rpcdata *, qcsapi_wifi_create_restricted_bss_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_CREATE_BSS_REMOTE 1451 +extern enum clnt_stat qcsapi_wifi_create_bss_remote_1(qcsapi_wifi_create_bss_rpcdata *, qcsapi_wifi_create_bss_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_create_bss_remote_1_svc(qcsapi_wifi_create_bss_rpcdata *, qcsapi_wifi_create_bss_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_REMOVE_BSS_REMOTE 1461 +extern enum clnt_stat qcsapi_wifi_remove_bss_remote_1(qcsapi_wifi_remove_bss_rpcdata *, qcsapi_wifi_remove_bss_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_remove_bss_remote_1_svc(qcsapi_wifi_remove_bss_rpcdata *, qcsapi_wifi_remove_bss_rpcdata *, struct svc_req *); +#define QCSAPI_WDS_ADD_PEER_REMOTE 1471 +extern enum clnt_stat qcsapi_wds_add_peer_remote_1(qcsapi_wds_add_peer_rpcdata *, qcsapi_wds_add_peer_rpcdata *, CLIENT *); +extern bool_t qcsapi_wds_add_peer_remote_1_svc(qcsapi_wds_add_peer_rpcdata *, qcsapi_wds_add_peer_rpcdata *, struct svc_req *); +#define QCSAPI_WDS_ADD_PEER_ENCRYPT_REMOTE 1481 +extern enum clnt_stat qcsapi_wds_add_peer_encrypt_remote_1(qcsapi_wds_add_peer_encrypt_rpcdata *, qcsapi_wds_add_peer_encrypt_rpcdata *, CLIENT *); +extern bool_t qcsapi_wds_add_peer_encrypt_remote_1_svc(qcsapi_wds_add_peer_encrypt_rpcdata *, qcsapi_wds_add_peer_encrypt_rpcdata *, struct svc_req *); +#define QCSAPI_WDS_REMOVE_PEER_REMOTE 1491 +extern enum clnt_stat qcsapi_wds_remove_peer_remote_1(qcsapi_wds_remove_peer_rpcdata *, qcsapi_wds_remove_peer_rpcdata *, CLIENT *); +extern bool_t qcsapi_wds_remove_peer_remote_1_svc(qcsapi_wds_remove_peer_rpcdata *, qcsapi_wds_remove_peer_rpcdata *, struct svc_req *); +#define QCSAPI_WDS_GET_PEER_ADDRESS_REMOTE 1501 +extern enum clnt_stat qcsapi_wds_get_peer_address_remote_1(qcsapi_wds_get_peer_address_rpcdata *, qcsapi_wds_get_peer_address_rpcdata *, CLIENT *); +extern bool_t qcsapi_wds_get_peer_address_remote_1_svc(qcsapi_wds_get_peer_address_rpcdata *, qcsapi_wds_get_peer_address_rpcdata *, struct svc_req *); +#define QCSAPI_WDS_SET_PSK_REMOTE 1511 +extern enum clnt_stat qcsapi_wds_set_psk_remote_1(qcsapi_wds_set_psk_rpcdata *, qcsapi_wds_set_psk_rpcdata *, CLIENT *); +extern bool_t qcsapi_wds_set_psk_remote_1_svc(qcsapi_wds_set_psk_rpcdata *, qcsapi_wds_set_psk_rpcdata *, struct svc_req *); +#define QCSAPI_WDS_SET_MODE_REMOTE 1521 +extern enum clnt_stat qcsapi_wds_set_mode_remote_1(qcsapi_wds_set_mode_rpcdata *, qcsapi_wds_set_mode_rpcdata *, CLIENT *); +extern bool_t qcsapi_wds_set_mode_remote_1_svc(qcsapi_wds_set_mode_rpcdata *, qcsapi_wds_set_mode_rpcdata *, struct svc_req *); +#define QCSAPI_WDS_GET_MODE_REMOTE 1531 +extern enum clnt_stat qcsapi_wds_get_mode_remote_1(qcsapi_wds_get_mode_rpcdata *, qcsapi_wds_get_mode_rpcdata *, CLIENT *); +extern bool_t qcsapi_wds_get_mode_remote_1_svc(qcsapi_wds_get_mode_rpcdata *, qcsapi_wds_get_mode_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_SET_EXTENDER_PARAMS_REMOTE 1541 +extern enum clnt_stat qcsapi_wifi_set_extender_params_remote_1(qcsapi_wifi_set_extender_params_rpcdata *, qcsapi_wifi_set_extender_params_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_set_extender_params_remote_1_svc(qcsapi_wifi_set_extender_params_rpcdata *, qcsapi_wifi_set_extender_params_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_GET_EXTENDER_PARAMS_REMOTE 1551 +extern enum clnt_stat qcsapi_wifi_get_extender_params_remote_1(qcsapi_wifi_get_extender_params_rpcdata *, qcsapi_wifi_get_extender_params_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_get_extender_params_remote_1_svc(qcsapi_wifi_get_extender_params_rpcdata *, qcsapi_wifi_get_extender_params_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_GET_BEACON_TYPE_REMOTE 1581 +extern enum clnt_stat qcsapi_wifi_get_beacon_type_remote_1(qcsapi_wifi_get_beacon_type_rpcdata *, qcsapi_wifi_get_beacon_type_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_get_beacon_type_remote_1_svc(qcsapi_wifi_get_beacon_type_rpcdata *, qcsapi_wifi_get_beacon_type_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_SET_BEACON_TYPE_REMOTE 1591 +extern enum clnt_stat qcsapi_wifi_set_beacon_type_remote_1(qcsapi_wifi_set_beacon_type_rpcdata *, qcsapi_wifi_set_beacon_type_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_set_beacon_type_remote_1_svc(qcsapi_wifi_set_beacon_type_rpcdata *, qcsapi_wifi_set_beacon_type_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_GET_WEP_KEY_INDEX_REMOTE 1601 +extern enum clnt_stat qcsapi_wifi_get_wep_key_index_remote_1(qcsapi_wifi_get_WEP_key_index_rpcdata *, qcsapi_wifi_get_WEP_key_index_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_get_wep_key_index_remote_1_svc(qcsapi_wifi_get_WEP_key_index_rpcdata *, qcsapi_wifi_get_WEP_key_index_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_SET_WEP_KEY_INDEX_REMOTE 1611 +extern enum clnt_stat qcsapi_wifi_set_wep_key_index_remote_1(qcsapi_wifi_set_WEP_key_index_rpcdata *, qcsapi_wifi_set_WEP_key_index_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_set_wep_key_index_remote_1_svc(qcsapi_wifi_set_WEP_key_index_rpcdata *, qcsapi_wifi_set_WEP_key_index_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_GET_WEP_KEY_PASSPHRASE_REMOTE 1621 +extern enum clnt_stat qcsapi_wifi_get_wep_key_passphrase_remote_1(qcsapi_wifi_get_WEP_key_passphrase_rpcdata *, qcsapi_wifi_get_WEP_key_passphrase_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_get_wep_key_passphrase_remote_1_svc(qcsapi_wifi_get_WEP_key_passphrase_rpcdata *, qcsapi_wifi_get_WEP_key_passphrase_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_SET_WEP_KEY_PASSPHRASE_REMOTE 1631 +extern enum clnt_stat qcsapi_wifi_set_wep_key_passphrase_remote_1(qcsapi_wifi_set_WEP_key_passphrase_rpcdata *, qcsapi_wifi_set_WEP_key_passphrase_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_set_wep_key_passphrase_remote_1_svc(qcsapi_wifi_set_WEP_key_passphrase_rpcdata *, qcsapi_wifi_set_WEP_key_passphrase_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_GET_WEP_ENCRYPTION_LEVEL_REMOTE 1641 +extern enum clnt_stat qcsapi_wifi_get_wep_encryption_level_remote_1(qcsapi_wifi_get_WEP_encryption_level_rpcdata *, qcsapi_wifi_get_WEP_encryption_level_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_get_wep_encryption_level_remote_1_svc(qcsapi_wifi_get_WEP_encryption_level_rpcdata *, qcsapi_wifi_get_WEP_encryption_level_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_GET_BASIC_ENCRYPTION_MODES_REMOTE 1651 +extern enum clnt_stat qcsapi_wifi_get_basic_encryption_modes_remote_1(qcsapi_wifi_get_basic_encryption_modes_rpcdata *, qcsapi_wifi_get_basic_encryption_modes_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_get_basic_encryption_modes_remote_1_svc(qcsapi_wifi_get_basic_encryption_modes_rpcdata *, qcsapi_wifi_get_basic_encryption_modes_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_SET_BASIC_ENCRYPTION_MODES_REMOTE 1661 +extern enum clnt_stat qcsapi_wifi_set_basic_encryption_modes_remote_1(qcsapi_wifi_set_basic_encryption_modes_rpcdata *, qcsapi_wifi_set_basic_encryption_modes_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_set_basic_encryption_modes_remote_1_svc(qcsapi_wifi_set_basic_encryption_modes_rpcdata *, qcsapi_wifi_set_basic_encryption_modes_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_GET_BASIC_AUTHENTICATION_MODE_REMOTE 1671 +extern enum clnt_stat qcsapi_wifi_get_basic_authentication_mode_remote_1(qcsapi_wifi_get_basic_authentication_mode_rpcdata *, qcsapi_wifi_get_basic_authentication_mode_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_get_basic_authentication_mode_remote_1_svc(qcsapi_wifi_get_basic_authentication_mode_rpcdata *, qcsapi_wifi_get_basic_authentication_mode_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_SET_BASIC_AUTHENTICATION_MODE_REMOTE 1681 +extern enum clnt_stat qcsapi_wifi_set_basic_authentication_mode_remote_1(qcsapi_wifi_set_basic_authentication_mode_rpcdata *, qcsapi_wifi_set_basic_authentication_mode_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_set_basic_authentication_mode_remote_1_svc(qcsapi_wifi_set_basic_authentication_mode_rpcdata *, qcsapi_wifi_set_basic_authentication_mode_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_GET_WEP_KEY_REMOTE 1691 +extern enum clnt_stat qcsapi_wifi_get_wep_key_remote_1(qcsapi_wifi_get_WEP_key_rpcdata *, qcsapi_wifi_get_WEP_key_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_get_wep_key_remote_1_svc(qcsapi_wifi_get_WEP_key_rpcdata *, qcsapi_wifi_get_WEP_key_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_SET_WEP_KEY_REMOTE 1701 +extern enum clnt_stat qcsapi_wifi_set_wep_key_remote_1(qcsapi_wifi_set_WEP_key_rpcdata *, qcsapi_wifi_set_WEP_key_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_set_wep_key_remote_1_svc(qcsapi_wifi_set_WEP_key_rpcdata *, qcsapi_wifi_set_WEP_key_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_GET_WPA_ENCRYPTION_MODES_REMOTE 1711 +extern enum clnt_stat qcsapi_wifi_get_wpa_encryption_modes_remote_1(qcsapi_wifi_get_WPA_encryption_modes_rpcdata *, qcsapi_wifi_get_WPA_encryption_modes_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_get_wpa_encryption_modes_remote_1_svc(qcsapi_wifi_get_WPA_encryption_modes_rpcdata *, qcsapi_wifi_get_WPA_encryption_modes_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_SET_WPA_ENCRYPTION_MODES_REMOTE 1721 +extern enum clnt_stat qcsapi_wifi_set_wpa_encryption_modes_remote_1(qcsapi_wifi_set_WPA_encryption_modes_rpcdata *, qcsapi_wifi_set_WPA_encryption_modes_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_set_wpa_encryption_modes_remote_1_svc(qcsapi_wifi_set_WPA_encryption_modes_rpcdata *, qcsapi_wifi_set_WPA_encryption_modes_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_GET_WPA_AUTHENTICATION_MODE_REMOTE 1731 +extern enum clnt_stat qcsapi_wifi_get_wpa_authentication_mode_remote_1(qcsapi_wifi_get_WPA_authentication_mode_rpcdata *, qcsapi_wifi_get_WPA_authentication_mode_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_get_wpa_authentication_mode_remote_1_svc(qcsapi_wifi_get_WPA_authentication_mode_rpcdata *, qcsapi_wifi_get_WPA_authentication_mode_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_SET_WPA_AUTHENTICATION_MODE_REMOTE 1741 +extern enum clnt_stat qcsapi_wifi_set_wpa_authentication_mode_remote_1(qcsapi_wifi_set_WPA_authentication_mode_rpcdata *, qcsapi_wifi_set_WPA_authentication_mode_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_set_wpa_authentication_mode_remote_1_svc(qcsapi_wifi_set_WPA_authentication_mode_rpcdata *, qcsapi_wifi_set_WPA_authentication_mode_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_GET_INTERWORKING_REMOTE 5451 +extern enum clnt_stat qcsapi_wifi_get_interworking_remote_1(qcsapi_wifi_get_interworking_rpcdata *, qcsapi_wifi_get_interworking_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_get_interworking_remote_1_svc(qcsapi_wifi_get_interworking_rpcdata *, qcsapi_wifi_get_interworking_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_SET_INTERWORKING_REMOTE 5461 +extern enum clnt_stat qcsapi_wifi_set_interworking_remote_1(qcsapi_wifi_set_interworking_rpcdata *, qcsapi_wifi_set_interworking_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_set_interworking_remote_1_svc(qcsapi_wifi_set_interworking_rpcdata *, qcsapi_wifi_set_interworking_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_GET_80211U_PARAMS_REMOTE 5471 +extern enum clnt_stat qcsapi_wifi_get_80211u_params_remote_1(qcsapi_wifi_get_80211u_params_rpcdata *, qcsapi_wifi_get_80211u_params_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_get_80211u_params_remote_1_svc(qcsapi_wifi_get_80211u_params_rpcdata *, qcsapi_wifi_get_80211u_params_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_SET_80211U_PARAMS_REMOTE 5481 +extern enum clnt_stat qcsapi_wifi_set_80211u_params_remote_1(qcsapi_wifi_set_80211u_params_rpcdata *, qcsapi_wifi_set_80211u_params_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_set_80211u_params_remote_1_svc(qcsapi_wifi_set_80211u_params_rpcdata *, qcsapi_wifi_set_80211u_params_rpcdata *, struct svc_req *); +#define QCSAPI_SECURITY_GET_NAI_REALMS_REMOTE 5491 +extern enum clnt_stat qcsapi_security_get_nai_realms_remote_1(qcsapi_security_get_nai_realms_rpcdata *, qcsapi_security_get_nai_realms_rpcdata *, CLIENT *); +extern bool_t qcsapi_security_get_nai_realms_remote_1_svc(qcsapi_security_get_nai_realms_rpcdata *, qcsapi_security_get_nai_realms_rpcdata *, struct svc_req *); +#define QCSAPI_SECURITY_ADD_NAI_REALM_REMOTE 5501 +extern enum clnt_stat qcsapi_security_add_nai_realm_remote_1(qcsapi_security_add_nai_realm_rpcdata *, qcsapi_security_add_nai_realm_rpcdata *, CLIENT *); +extern bool_t qcsapi_security_add_nai_realm_remote_1_svc(qcsapi_security_add_nai_realm_rpcdata *, qcsapi_security_add_nai_realm_rpcdata *, struct svc_req *); +#define QCSAPI_SECURITY_DEL_NAI_REALM_REMOTE 5511 +extern enum clnt_stat qcsapi_security_del_nai_realm_remote_1(qcsapi_security_del_nai_realm_rpcdata *, qcsapi_security_del_nai_realm_rpcdata *, CLIENT *); +extern bool_t qcsapi_security_del_nai_realm_remote_1_svc(qcsapi_security_del_nai_realm_rpcdata *, qcsapi_security_del_nai_realm_rpcdata *, struct svc_req *); +#define QCSAPI_SECURITY_GET_ROAMING_CONSORTIUM_REMOTE 5521 +extern enum clnt_stat qcsapi_security_get_roaming_consortium_remote_1(qcsapi_security_get_roaming_consortium_rpcdata *, qcsapi_security_get_roaming_consortium_rpcdata *, CLIENT *); +extern bool_t qcsapi_security_get_roaming_consortium_remote_1_svc(qcsapi_security_get_roaming_consortium_rpcdata *, qcsapi_security_get_roaming_consortium_rpcdata *, struct svc_req *); +#define QCSAPI_SECURITY_ADD_ROAMING_CONSORTIUM_REMOTE 5531 +extern enum clnt_stat qcsapi_security_add_roaming_consortium_remote_1(qcsapi_security_add_roaming_consortium_rpcdata *, qcsapi_security_add_roaming_consortium_rpcdata *, CLIENT *); +extern bool_t qcsapi_security_add_roaming_consortium_remote_1_svc(qcsapi_security_add_roaming_consortium_rpcdata *, qcsapi_security_add_roaming_consortium_rpcdata *, struct svc_req *); +#define QCSAPI_SECURITY_DEL_ROAMING_CONSORTIUM_REMOTE 5541 +extern enum clnt_stat qcsapi_security_del_roaming_consortium_remote_1(qcsapi_security_del_roaming_consortium_rpcdata *, qcsapi_security_del_roaming_consortium_rpcdata *, CLIENT *); +extern bool_t qcsapi_security_del_roaming_consortium_remote_1_svc(qcsapi_security_del_roaming_consortium_rpcdata *, qcsapi_security_del_roaming_consortium_rpcdata *, struct svc_req *); +#define QCSAPI_SECURITY_GET_VENUE_NAME_REMOTE 5551 +extern enum clnt_stat qcsapi_security_get_venue_name_remote_1(qcsapi_security_get_venue_name_rpcdata *, qcsapi_security_get_venue_name_rpcdata *, CLIENT *); +extern bool_t qcsapi_security_get_venue_name_remote_1_svc(qcsapi_security_get_venue_name_rpcdata *, qcsapi_security_get_venue_name_rpcdata *, struct svc_req *); +#define QCSAPI_SECURITY_ADD_VENUE_NAME_REMOTE 5561 +extern enum clnt_stat qcsapi_security_add_venue_name_remote_1(qcsapi_security_add_venue_name_rpcdata *, qcsapi_security_add_venue_name_rpcdata *, CLIENT *); +extern bool_t qcsapi_security_add_venue_name_remote_1_svc(qcsapi_security_add_venue_name_rpcdata *, qcsapi_security_add_venue_name_rpcdata *, struct svc_req *); +#define QCSAPI_SECURITY_DEL_VENUE_NAME_REMOTE 5731 +extern enum clnt_stat qcsapi_security_del_venue_name_remote_1(qcsapi_security_del_venue_name_rpcdata *, qcsapi_security_del_venue_name_rpcdata *, CLIENT *); +extern bool_t qcsapi_security_del_venue_name_remote_1_svc(qcsapi_security_del_venue_name_rpcdata *, qcsapi_security_del_venue_name_rpcdata *, struct svc_req *); +#define QCSAPI_SECURITY_GET_OPER_FRIENDLY_NAME_REMOTE 5741 +extern enum clnt_stat qcsapi_security_get_oper_friendly_name_remote_1(qcsapi_security_get_oper_friendly_name_rpcdata *, qcsapi_security_get_oper_friendly_name_rpcdata *, CLIENT *); +extern bool_t qcsapi_security_get_oper_friendly_name_remote_1_svc(qcsapi_security_get_oper_friendly_name_rpcdata *, qcsapi_security_get_oper_friendly_name_rpcdata *, struct svc_req *); +#define QCSAPI_SECURITY_ADD_OPER_FRIENDLY_NAME_REMOTE 5751 +extern enum clnt_stat qcsapi_security_add_oper_friendly_name_remote_1(qcsapi_security_add_oper_friendly_name_rpcdata *, qcsapi_security_add_oper_friendly_name_rpcdata *, CLIENT *); +extern bool_t qcsapi_security_add_oper_friendly_name_remote_1_svc(qcsapi_security_add_oper_friendly_name_rpcdata *, qcsapi_security_add_oper_friendly_name_rpcdata *, struct svc_req *); +#define QCSAPI_SECURITY_DEL_OPER_FRIENDLY_NAME_REMOTE 5761 +extern enum clnt_stat qcsapi_security_del_oper_friendly_name_remote_1(qcsapi_security_del_oper_friendly_name_rpcdata *, qcsapi_security_del_oper_friendly_name_rpcdata *, CLIENT *); +extern bool_t qcsapi_security_del_oper_friendly_name_remote_1_svc(qcsapi_security_del_oper_friendly_name_rpcdata *, qcsapi_security_del_oper_friendly_name_rpcdata *, struct svc_req *); +#define QCSAPI_SECURITY_GET_HS20_CONN_CAPAB_REMOTE 5771 +extern enum clnt_stat qcsapi_security_get_hs20_conn_capab_remote_1(qcsapi_security_get_hs20_conn_capab_rpcdata *, qcsapi_security_get_hs20_conn_capab_rpcdata *, CLIENT *); +extern bool_t qcsapi_security_get_hs20_conn_capab_remote_1_svc(qcsapi_security_get_hs20_conn_capab_rpcdata *, qcsapi_security_get_hs20_conn_capab_rpcdata *, struct svc_req *); +#define QCSAPI_SECURITY_ADD_HS20_CONN_CAPAB_REMOTE 5781 +extern enum clnt_stat qcsapi_security_add_hs20_conn_capab_remote_1(qcsapi_security_add_hs20_conn_capab_rpcdata *, qcsapi_security_add_hs20_conn_capab_rpcdata *, CLIENT *); +extern bool_t qcsapi_security_add_hs20_conn_capab_remote_1_svc(qcsapi_security_add_hs20_conn_capab_rpcdata *, qcsapi_security_add_hs20_conn_capab_rpcdata *, struct svc_req *); +#define QCSAPI_SECURITY_DEL_HS20_CONN_CAPAB_REMOTE 5791 +extern enum clnt_stat qcsapi_security_del_hs20_conn_capab_remote_1(qcsapi_security_del_hs20_conn_capab_rpcdata *, qcsapi_security_del_hs20_conn_capab_rpcdata *, CLIENT *); +extern bool_t qcsapi_security_del_hs20_conn_capab_remote_1_svc(qcsapi_security_del_hs20_conn_capab_rpcdata *, qcsapi_security_del_hs20_conn_capab_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_GET_HS20_STATUS_REMOTE 5571 +extern enum clnt_stat qcsapi_wifi_get_hs20_status_remote_1(qcsapi_wifi_get_hs20_status_rpcdata *, qcsapi_wifi_get_hs20_status_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_get_hs20_status_remote_1_svc(qcsapi_wifi_get_hs20_status_rpcdata *, qcsapi_wifi_get_hs20_status_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_SET_HS20_STATUS_REMOTE 5581 +extern enum clnt_stat qcsapi_wifi_set_hs20_status_remote_1(qcsapi_wifi_set_hs20_status_rpcdata *, qcsapi_wifi_set_hs20_status_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_set_hs20_status_remote_1_svc(qcsapi_wifi_set_hs20_status_rpcdata *, qcsapi_wifi_set_hs20_status_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_GET_PROXY_ARP_REMOTE 5641 +extern enum clnt_stat qcsapi_wifi_get_proxy_arp_remote_1(qcsapi_wifi_get_proxy_arp_rpcdata *, qcsapi_wifi_get_proxy_arp_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_get_proxy_arp_remote_1_svc(qcsapi_wifi_get_proxy_arp_rpcdata *, qcsapi_wifi_get_proxy_arp_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_SET_PROXY_ARP_REMOTE 5631 +extern enum clnt_stat qcsapi_wifi_set_proxy_arp_remote_1(qcsapi_wifi_set_proxy_arp_rpcdata *, qcsapi_wifi_set_proxy_arp_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_set_proxy_arp_remote_1_svc(qcsapi_wifi_set_proxy_arp_rpcdata *, qcsapi_wifi_set_proxy_arp_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_GET_L2_EXT_FILTER_REMOTE 5941 +extern enum clnt_stat qcsapi_wifi_get_l2_ext_filter_remote_1(qcsapi_wifi_get_l2_ext_filter_rpcdata *, qcsapi_wifi_get_l2_ext_filter_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_get_l2_ext_filter_remote_1_svc(qcsapi_wifi_get_l2_ext_filter_rpcdata *, qcsapi_wifi_get_l2_ext_filter_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_SET_L2_EXT_FILTER_REMOTE 5951 +extern enum clnt_stat qcsapi_wifi_set_l2_ext_filter_remote_1(qcsapi_wifi_set_l2_ext_filter_rpcdata *, qcsapi_wifi_set_l2_ext_filter_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_set_l2_ext_filter_remote_1_svc(qcsapi_wifi_set_l2_ext_filter_rpcdata *, qcsapi_wifi_set_l2_ext_filter_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_GET_HS20_PARAMS_REMOTE 5591 +extern enum clnt_stat qcsapi_wifi_get_hs20_params_remote_1(qcsapi_wifi_get_hs20_params_rpcdata *, qcsapi_wifi_get_hs20_params_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_get_hs20_params_remote_1_svc(qcsapi_wifi_get_hs20_params_rpcdata *, qcsapi_wifi_get_hs20_params_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_SET_HS20_PARAMS_REMOTE 5601 +extern enum clnt_stat qcsapi_wifi_set_hs20_params_remote_1(qcsapi_wifi_set_hs20_params_rpcdata *, qcsapi_wifi_set_hs20_params_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_set_hs20_params_remote_1_svc(qcsapi_wifi_set_hs20_params_rpcdata *, qcsapi_wifi_set_hs20_params_rpcdata *, struct svc_req *); +#define QCSAPI_REMOVE_11U_PARAM_REMOTE 5611 +extern enum clnt_stat qcsapi_remove_11u_param_remote_1(qcsapi_remove_11u_param_rpcdata *, qcsapi_remove_11u_param_rpcdata *, CLIENT *); +extern bool_t qcsapi_remove_11u_param_remote_1_svc(qcsapi_remove_11u_param_rpcdata *, qcsapi_remove_11u_param_rpcdata *, struct svc_req *); +#define QCSAPI_REMOVE_HS20_PARAM_REMOTE 5621 +extern enum clnt_stat qcsapi_remove_hs20_param_remote_1(qcsapi_remove_hs20_param_rpcdata *, qcsapi_remove_hs20_param_rpcdata *, CLIENT *); +extern bool_t qcsapi_remove_hs20_param_remote_1_svc(qcsapi_remove_hs20_param_rpcdata *, qcsapi_remove_hs20_param_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_GET_IEEE11I_ENCRYPTION_MODES_REMOTE 1751 +extern enum clnt_stat qcsapi_wifi_get_ieee11i_encryption_modes_remote_1(qcsapi_wifi_get_IEEE11i_encryption_modes_rpcdata *, qcsapi_wifi_get_IEEE11i_encryption_modes_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_get_ieee11i_encryption_modes_remote_1_svc(qcsapi_wifi_get_IEEE11i_encryption_modes_rpcdata *, qcsapi_wifi_get_IEEE11i_encryption_modes_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_SET_IEEE11I_ENCRYPTION_MODES_REMOTE 1761 +extern enum clnt_stat qcsapi_wifi_set_ieee11i_encryption_modes_remote_1(qcsapi_wifi_set_IEEE11i_encryption_modes_rpcdata *, qcsapi_wifi_set_IEEE11i_encryption_modes_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_set_ieee11i_encryption_modes_remote_1_svc(qcsapi_wifi_set_IEEE11i_encryption_modes_rpcdata *, qcsapi_wifi_set_IEEE11i_encryption_modes_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_GET_IEEE11I_AUTHENTICATION_MODE_REMOTE 1771 +extern enum clnt_stat qcsapi_wifi_get_ieee11i_authentication_mode_remote_1(qcsapi_wifi_get_IEEE11i_authentication_mode_rpcdata *, qcsapi_wifi_get_IEEE11i_authentication_mode_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_get_ieee11i_authentication_mode_remote_1_svc(qcsapi_wifi_get_IEEE11i_authentication_mode_rpcdata *, qcsapi_wifi_get_IEEE11i_authentication_mode_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_SET_IEEE11I_AUTHENTICATION_MODE_REMOTE 1781 +extern enum clnt_stat qcsapi_wifi_set_ieee11i_authentication_mode_remote_1(qcsapi_wifi_set_IEEE11i_authentication_mode_rpcdata *, qcsapi_wifi_set_IEEE11i_authentication_mode_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_set_ieee11i_authentication_mode_remote_1_svc(qcsapi_wifi_set_IEEE11i_authentication_mode_rpcdata *, qcsapi_wifi_set_IEEE11i_authentication_mode_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_GET_MICHAEL_ERRCNT_REMOTE 1791 +extern enum clnt_stat qcsapi_wifi_get_michael_errcnt_remote_1(qcsapi_wifi_get_michael_errcnt_rpcdata *, qcsapi_wifi_get_michael_errcnt_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_get_michael_errcnt_remote_1_svc(qcsapi_wifi_get_michael_errcnt_rpcdata *, qcsapi_wifi_get_michael_errcnt_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_GET_PRE_SHARED_KEY_REMOTE 1801 +extern enum clnt_stat qcsapi_wifi_get_pre_shared_key_remote_1(qcsapi_wifi_get_pre_shared_key_rpcdata *, qcsapi_wifi_get_pre_shared_key_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_get_pre_shared_key_remote_1_svc(qcsapi_wifi_get_pre_shared_key_rpcdata *, qcsapi_wifi_get_pre_shared_key_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_SET_PRE_SHARED_KEY_REMOTE 1811 +extern enum clnt_stat qcsapi_wifi_set_pre_shared_key_remote_1(qcsapi_wifi_set_pre_shared_key_rpcdata *, qcsapi_wifi_set_pre_shared_key_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_set_pre_shared_key_remote_1_svc(qcsapi_wifi_set_pre_shared_key_rpcdata *, qcsapi_wifi_set_pre_shared_key_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_ADD_RADIUS_AUTH_SERVER_CFG_REMOTE 5801 +extern enum clnt_stat qcsapi_wifi_add_radius_auth_server_cfg_remote_1(qcsapi_wifi_add_radius_auth_server_cfg_rpcdata *, qcsapi_wifi_add_radius_auth_server_cfg_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_add_radius_auth_server_cfg_remote_1_svc(qcsapi_wifi_add_radius_auth_server_cfg_rpcdata *, qcsapi_wifi_add_radius_auth_server_cfg_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_DEL_RADIUS_AUTH_SERVER_CFG_REMOTE 5811 +extern enum clnt_stat qcsapi_wifi_del_radius_auth_server_cfg_remote_1(qcsapi_wifi_del_radius_auth_server_cfg_rpcdata *, qcsapi_wifi_del_radius_auth_server_cfg_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_del_radius_auth_server_cfg_remote_1_svc(qcsapi_wifi_del_radius_auth_server_cfg_rpcdata *, qcsapi_wifi_del_radius_auth_server_cfg_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_GET_RADIUS_AUTH_SERVER_CFG_REMOTE 5821 +extern enum clnt_stat qcsapi_wifi_get_radius_auth_server_cfg_remote_1(qcsapi_wifi_get_radius_auth_server_cfg_rpcdata *, qcsapi_wifi_get_radius_auth_server_cfg_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_get_radius_auth_server_cfg_remote_1_svc(qcsapi_wifi_get_radius_auth_server_cfg_rpcdata *, qcsapi_wifi_get_radius_auth_server_cfg_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_SET_OWN_IP_ADDR_REMOTE 1881 +extern enum clnt_stat qcsapi_wifi_set_own_ip_addr_remote_1(qcsapi_wifi_set_own_ip_addr_rpcdata *, qcsapi_wifi_set_own_ip_addr_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_set_own_ip_addr_remote_1_svc(qcsapi_wifi_set_own_ip_addr_rpcdata *, qcsapi_wifi_set_own_ip_addr_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_GET_KEY_PASSPHRASE_REMOTE 1891 +extern enum clnt_stat qcsapi_wifi_get_key_passphrase_remote_1(qcsapi_wifi_get_key_passphrase_rpcdata *, qcsapi_wifi_get_key_passphrase_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_get_key_passphrase_remote_1_svc(qcsapi_wifi_get_key_passphrase_rpcdata *, qcsapi_wifi_get_key_passphrase_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_SET_KEY_PASSPHRASE_REMOTE 1901 +extern enum clnt_stat qcsapi_wifi_set_key_passphrase_remote_1(qcsapi_wifi_set_key_passphrase_rpcdata *, qcsapi_wifi_set_key_passphrase_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_set_key_passphrase_remote_1_svc(qcsapi_wifi_set_key_passphrase_rpcdata *, qcsapi_wifi_set_key_passphrase_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_GET_GROUP_KEY_INTERVAL_REMOTE 1911 +extern enum clnt_stat qcsapi_wifi_get_group_key_interval_remote_1(qcsapi_wifi_get_group_key_interval_rpcdata *, qcsapi_wifi_get_group_key_interval_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_get_group_key_interval_remote_1_svc(qcsapi_wifi_get_group_key_interval_rpcdata *, qcsapi_wifi_get_group_key_interval_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_SET_GROUP_KEY_INTERVAL_REMOTE 1921 +extern enum clnt_stat qcsapi_wifi_set_group_key_interval_remote_1(qcsapi_wifi_set_group_key_interval_rpcdata *, qcsapi_wifi_set_group_key_interval_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_set_group_key_interval_remote_1_svc(qcsapi_wifi_set_group_key_interval_rpcdata *, qcsapi_wifi_set_group_key_interval_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_GET_PMF_REMOTE 1931 +extern enum clnt_stat qcsapi_wifi_get_pmf_remote_1(qcsapi_wifi_get_pmf_rpcdata *, qcsapi_wifi_get_pmf_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_get_pmf_remote_1_svc(qcsapi_wifi_get_pmf_rpcdata *, qcsapi_wifi_get_pmf_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_SET_PMF_REMOTE 1941 +extern enum clnt_stat qcsapi_wifi_set_pmf_remote_1(qcsapi_wifi_set_pmf_rpcdata *, qcsapi_wifi_set_pmf_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_set_pmf_remote_1_svc(qcsapi_wifi_set_pmf_rpcdata *, qcsapi_wifi_set_pmf_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_GET_WPA_STATUS_REMOTE 1951 +extern enum clnt_stat qcsapi_wifi_get_wpa_status_remote_1(qcsapi_wifi_get_wpa_status_rpcdata *, qcsapi_wifi_get_wpa_status_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_get_wpa_status_remote_1_svc(qcsapi_wifi_get_wpa_status_rpcdata *, qcsapi_wifi_get_wpa_status_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_GET_PSK_AUTH_FAILURES_REMOTE 1961 +extern enum clnt_stat qcsapi_wifi_get_psk_auth_failures_remote_1(qcsapi_wifi_get_psk_auth_failures_rpcdata *, qcsapi_wifi_get_psk_auth_failures_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_get_psk_auth_failures_remote_1_svc(qcsapi_wifi_get_psk_auth_failures_rpcdata *, qcsapi_wifi_get_psk_auth_failures_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_GET_AUTH_STATE_REMOTE 1971 +extern enum clnt_stat qcsapi_wifi_get_auth_state_remote_1(qcsapi_wifi_get_auth_state_rpcdata *, qcsapi_wifi_get_auth_state_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_get_auth_state_remote_1_svc(qcsapi_wifi_get_auth_state_rpcdata *, qcsapi_wifi_get_auth_state_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_SET_SECURITY_DEFER_MODE_REMOTE 1981 +extern enum clnt_stat qcsapi_wifi_set_security_defer_mode_remote_1(qcsapi_wifi_set_security_defer_mode_rpcdata *, qcsapi_wifi_set_security_defer_mode_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_set_security_defer_mode_remote_1_svc(qcsapi_wifi_set_security_defer_mode_rpcdata *, qcsapi_wifi_set_security_defer_mode_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_GET_SECURITY_DEFER_MODE_REMOTE 1991 +extern enum clnt_stat qcsapi_wifi_get_security_defer_mode_remote_1(qcsapi_wifi_get_security_defer_mode_rpcdata *, qcsapi_wifi_get_security_defer_mode_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_get_security_defer_mode_remote_1_svc(qcsapi_wifi_get_security_defer_mode_rpcdata *, qcsapi_wifi_get_security_defer_mode_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_APPLY_SECURITY_CONFIG_REMOTE 2001 +extern enum clnt_stat qcsapi_wifi_apply_security_config_remote_1(qcsapi_wifi_apply_security_config_rpcdata *, qcsapi_wifi_apply_security_config_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_apply_security_config_remote_1_svc(qcsapi_wifi_apply_security_config_rpcdata *, qcsapi_wifi_apply_security_config_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_SET_MAC_ADDRESS_FILTERING_REMOTE 2011 +extern enum clnt_stat qcsapi_wifi_set_mac_address_filtering_remote_1(qcsapi_wifi_set_mac_address_filtering_rpcdata *, qcsapi_wifi_set_mac_address_filtering_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_set_mac_address_filtering_remote_1_svc(qcsapi_wifi_set_mac_address_filtering_rpcdata *, qcsapi_wifi_set_mac_address_filtering_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_GET_MAC_ADDRESS_FILTERING_REMOTE 2021 +extern enum clnt_stat qcsapi_wifi_get_mac_address_filtering_remote_1(qcsapi_wifi_get_mac_address_filtering_rpcdata *, qcsapi_wifi_get_mac_address_filtering_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_get_mac_address_filtering_remote_1_svc(qcsapi_wifi_get_mac_address_filtering_rpcdata *, qcsapi_wifi_get_mac_address_filtering_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_AUTHORIZE_MAC_ADDRESS_REMOTE 2031 +extern enum clnt_stat qcsapi_wifi_authorize_mac_address_remote_1(qcsapi_wifi_authorize_mac_address_rpcdata *, qcsapi_wifi_authorize_mac_address_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_authorize_mac_address_remote_1_svc(qcsapi_wifi_authorize_mac_address_rpcdata *, qcsapi_wifi_authorize_mac_address_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_DENY_MAC_ADDRESS_REMOTE 2041 +extern enum clnt_stat qcsapi_wifi_deny_mac_address_remote_1(qcsapi_wifi_deny_mac_address_rpcdata *, qcsapi_wifi_deny_mac_address_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_deny_mac_address_remote_1_svc(qcsapi_wifi_deny_mac_address_rpcdata *, qcsapi_wifi_deny_mac_address_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_REMOVE_MAC_ADDRESS_REMOTE 2051 +extern enum clnt_stat qcsapi_wifi_remove_mac_address_remote_1(qcsapi_wifi_remove_mac_address_rpcdata *, qcsapi_wifi_remove_mac_address_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_remove_mac_address_remote_1_svc(qcsapi_wifi_remove_mac_address_rpcdata *, qcsapi_wifi_remove_mac_address_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_IS_MAC_ADDRESS_AUTHORIZED_REMOTE 2061 +extern enum clnt_stat qcsapi_wifi_is_mac_address_authorized_remote_1(qcsapi_wifi_is_mac_address_authorized_rpcdata *, qcsapi_wifi_is_mac_address_authorized_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_is_mac_address_authorized_remote_1_svc(qcsapi_wifi_is_mac_address_authorized_rpcdata *, qcsapi_wifi_is_mac_address_authorized_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_GET_AUTHORIZED_MAC_ADDRESSES_REMOTE 2071 +extern enum clnt_stat qcsapi_wifi_get_authorized_mac_addresses_remote_1(qcsapi_wifi_get_authorized_mac_addresses_rpcdata *, qcsapi_wifi_get_authorized_mac_addresses_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_get_authorized_mac_addresses_remote_1_svc(qcsapi_wifi_get_authorized_mac_addresses_rpcdata *, qcsapi_wifi_get_authorized_mac_addresses_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_GET_DENIED_MAC_ADDRESSES_REMOTE 2081 +extern enum clnt_stat qcsapi_wifi_get_denied_mac_addresses_remote_1(qcsapi_wifi_get_denied_mac_addresses_rpcdata *, qcsapi_wifi_get_denied_mac_addresses_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_get_denied_mac_addresses_remote_1_svc(qcsapi_wifi_get_denied_mac_addresses_rpcdata *, qcsapi_wifi_get_denied_mac_addresses_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_SET_ACCEPT_OUI_FILTER_REMOTE 2091 +extern enum clnt_stat qcsapi_wifi_set_accept_oui_filter_remote_1(qcsapi_wifi_set_accept_oui_filter_rpcdata *, qcsapi_wifi_set_accept_oui_filter_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_set_accept_oui_filter_remote_1_svc(qcsapi_wifi_set_accept_oui_filter_rpcdata *, qcsapi_wifi_set_accept_oui_filter_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_GET_ACCEPT_OUI_FILTER_REMOTE 2101 +extern enum clnt_stat qcsapi_wifi_get_accept_oui_filter_remote_1(qcsapi_wifi_get_accept_oui_filter_rpcdata *, qcsapi_wifi_get_accept_oui_filter_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_get_accept_oui_filter_remote_1_svc(qcsapi_wifi_get_accept_oui_filter_rpcdata *, qcsapi_wifi_get_accept_oui_filter_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_CLEAR_MAC_ADDRESS_FILTERS_REMOTE 2111 +extern enum clnt_stat qcsapi_wifi_clear_mac_address_filters_remote_1(qcsapi_wifi_clear_mac_address_filters_rpcdata *, qcsapi_wifi_clear_mac_address_filters_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_clear_mac_address_filters_remote_1_svc(qcsapi_wifi_clear_mac_address_filters_rpcdata *, qcsapi_wifi_clear_mac_address_filters_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_SET_MAC_ADDRESS_RESERVE_REMOTE 6011 +extern enum clnt_stat qcsapi_wifi_set_mac_address_reserve_remote_1(qcsapi_wifi_set_mac_address_reserve_rpcdata *, qcsapi_wifi_set_mac_address_reserve_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_set_mac_address_reserve_remote_1_svc(qcsapi_wifi_set_mac_address_reserve_rpcdata *, qcsapi_wifi_set_mac_address_reserve_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_GET_MAC_ADDRESS_RESERVE_REMOTE 6021 +extern enum clnt_stat qcsapi_wifi_get_mac_address_reserve_remote_1(qcsapi_wifi_get_mac_address_reserve_rpcdata *, qcsapi_wifi_get_mac_address_reserve_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_get_mac_address_reserve_remote_1_svc(qcsapi_wifi_get_mac_address_reserve_rpcdata *, qcsapi_wifi_get_mac_address_reserve_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_CLEAR_MAC_ADDRESS_RESERVE_REMOTE 6031 +extern enum clnt_stat qcsapi_wifi_clear_mac_address_reserve_remote_1(qcsapi_wifi_clear_mac_address_reserve_rpcdata *, qcsapi_wifi_clear_mac_address_reserve_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_clear_mac_address_reserve_remote_1_svc(qcsapi_wifi_clear_mac_address_reserve_rpcdata *, qcsapi_wifi_clear_mac_address_reserve_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_GET_OPTION_REMOTE 2121 +extern enum clnt_stat qcsapi_wifi_get_option_remote_1(qcsapi_wifi_get_option_rpcdata *, qcsapi_wifi_get_option_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_get_option_remote_1_svc(qcsapi_wifi_get_option_rpcdata *, qcsapi_wifi_get_option_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_SET_OPTION_REMOTE 2131 +extern enum clnt_stat qcsapi_wifi_set_option_remote_1(qcsapi_wifi_set_option_rpcdata *, qcsapi_wifi_set_option_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_set_option_remote_1_svc(qcsapi_wifi_set_option_rpcdata *, qcsapi_wifi_set_option_rpcdata *, struct svc_req *); +#define QCSAPI_GET_BOARD_PARAMETER_REMOTE 2141 +extern enum clnt_stat qcsapi_get_board_parameter_remote_1(qcsapi_get_board_parameter_rpcdata *, qcsapi_get_board_parameter_rpcdata *, CLIENT *); +extern bool_t qcsapi_get_board_parameter_remote_1_svc(qcsapi_get_board_parameter_rpcdata *, qcsapi_get_board_parameter_rpcdata *, struct svc_req *); +#define QCSAPI_GET_SWFEAT_LIST_REMOTE 4451 +extern enum clnt_stat qcsapi_get_swfeat_list_remote_1(qcsapi_get_swfeat_list_rpcdata *, qcsapi_get_swfeat_list_rpcdata *, CLIENT *); +extern bool_t qcsapi_get_swfeat_list_remote_1_svc(qcsapi_get_swfeat_list_rpcdata *, qcsapi_get_swfeat_list_rpcdata *, struct svc_req *); +#define QCSAPI_SSID_CREATE_SSID_REMOTE 2151 +extern enum clnt_stat qcsapi_ssid_create_ssid_remote_1(qcsapi_SSID_create_SSID_rpcdata *, qcsapi_SSID_create_SSID_rpcdata *, CLIENT *); +extern bool_t qcsapi_ssid_create_ssid_remote_1_svc(qcsapi_SSID_create_SSID_rpcdata *, qcsapi_SSID_create_SSID_rpcdata *, struct svc_req *); +#define QCSAPI_SSID_REMOVE_SSID_REMOTE 2161 +extern enum clnt_stat qcsapi_ssid_remove_ssid_remote_1(qcsapi_SSID_remove_SSID_rpcdata *, qcsapi_SSID_remove_SSID_rpcdata *, CLIENT *); +extern bool_t qcsapi_ssid_remove_ssid_remote_1_svc(qcsapi_SSID_remove_SSID_rpcdata *, qcsapi_SSID_remove_SSID_rpcdata *, struct svc_req *); +#define QCSAPI_SSID_VERIFY_SSID_REMOTE 2171 +extern enum clnt_stat qcsapi_ssid_verify_ssid_remote_1(qcsapi_SSID_verify_SSID_rpcdata *, qcsapi_SSID_verify_SSID_rpcdata *, CLIENT *); +extern bool_t qcsapi_ssid_verify_ssid_remote_1_svc(qcsapi_SSID_verify_SSID_rpcdata *, qcsapi_SSID_verify_SSID_rpcdata *, struct svc_req *); +#define QCSAPI_SSID_RENAME_SSID_REMOTE 2181 +extern enum clnt_stat qcsapi_ssid_rename_ssid_remote_1(qcsapi_SSID_rename_SSID_rpcdata *, qcsapi_SSID_rename_SSID_rpcdata *, CLIENT *); +extern bool_t qcsapi_ssid_rename_ssid_remote_1_svc(qcsapi_SSID_rename_SSID_rpcdata *, qcsapi_SSID_rename_SSID_rpcdata *, struct svc_req *); +#define QCSAPI_SSID_GET_SSID_LIST_REMOTE 2191 +extern enum clnt_stat qcsapi_ssid_get_ssid_list_remote_1(qcsapi_SSID_get_SSID_list_rpcdata *, qcsapi_SSID_get_SSID_list_rpcdata *, CLIENT *); +extern bool_t qcsapi_ssid_get_ssid_list_remote_1_svc(qcsapi_SSID_get_SSID_list_rpcdata *, qcsapi_SSID_get_SSID_list_rpcdata *, struct svc_req *); +#define QCSAPI_SSID_SET_PROTOCOL_REMOTE 2201 +extern enum clnt_stat qcsapi_ssid_set_protocol_remote_1(qcsapi_SSID_set_protocol_rpcdata *, qcsapi_SSID_set_protocol_rpcdata *, CLIENT *); +extern bool_t qcsapi_ssid_set_protocol_remote_1_svc(qcsapi_SSID_set_protocol_rpcdata *, qcsapi_SSID_set_protocol_rpcdata *, struct svc_req *); +#define QCSAPI_SSID_GET_PROTOCOL_REMOTE 2211 +extern enum clnt_stat qcsapi_ssid_get_protocol_remote_1(qcsapi_SSID_get_protocol_rpcdata *, qcsapi_SSID_get_protocol_rpcdata *, CLIENT *); +extern bool_t qcsapi_ssid_get_protocol_remote_1_svc(qcsapi_SSID_get_protocol_rpcdata *, qcsapi_SSID_get_protocol_rpcdata *, struct svc_req *); +#define QCSAPI_SSID_GET_ENCRYPTION_MODES_REMOTE 2221 +extern enum clnt_stat qcsapi_ssid_get_encryption_modes_remote_1(qcsapi_SSID_get_encryption_modes_rpcdata *, qcsapi_SSID_get_encryption_modes_rpcdata *, CLIENT *); +extern bool_t qcsapi_ssid_get_encryption_modes_remote_1_svc(qcsapi_SSID_get_encryption_modes_rpcdata *, qcsapi_SSID_get_encryption_modes_rpcdata *, struct svc_req *); +#define QCSAPI_SSID_SET_ENCRYPTION_MODES_REMOTE 2231 +extern enum clnt_stat qcsapi_ssid_set_encryption_modes_remote_1(qcsapi_SSID_set_encryption_modes_rpcdata *, qcsapi_SSID_set_encryption_modes_rpcdata *, CLIENT *); +extern bool_t qcsapi_ssid_set_encryption_modes_remote_1_svc(qcsapi_SSID_set_encryption_modes_rpcdata *, qcsapi_SSID_set_encryption_modes_rpcdata *, struct svc_req *); +#define QCSAPI_SSID_GET_GROUP_ENCRYPTION_REMOTE 2241 +extern enum clnt_stat qcsapi_ssid_get_group_encryption_remote_1(qcsapi_SSID_get_group_encryption_rpcdata *, qcsapi_SSID_get_group_encryption_rpcdata *, CLIENT *); +extern bool_t qcsapi_ssid_get_group_encryption_remote_1_svc(qcsapi_SSID_get_group_encryption_rpcdata *, qcsapi_SSID_get_group_encryption_rpcdata *, struct svc_req *); +#define QCSAPI_SSID_SET_GROUP_ENCRYPTION_REMOTE 2251 +extern enum clnt_stat qcsapi_ssid_set_group_encryption_remote_1(qcsapi_SSID_set_group_encryption_rpcdata *, qcsapi_SSID_set_group_encryption_rpcdata *, CLIENT *); +extern bool_t qcsapi_ssid_set_group_encryption_remote_1_svc(qcsapi_SSID_set_group_encryption_rpcdata *, qcsapi_SSID_set_group_encryption_rpcdata *, struct svc_req *); +#define QCSAPI_SSID_GET_AUTHENTICATION_MODE_REMOTE 2261 +extern enum clnt_stat qcsapi_ssid_get_authentication_mode_remote_1(qcsapi_SSID_get_authentication_mode_rpcdata *, qcsapi_SSID_get_authentication_mode_rpcdata *, CLIENT *); +extern bool_t qcsapi_ssid_get_authentication_mode_remote_1_svc(qcsapi_SSID_get_authentication_mode_rpcdata *, qcsapi_SSID_get_authentication_mode_rpcdata *, struct svc_req *); +#define QCSAPI_SSID_SET_AUTHENTICATION_MODE_REMOTE 2271 +extern enum clnt_stat qcsapi_ssid_set_authentication_mode_remote_1(qcsapi_SSID_set_authentication_mode_rpcdata *, qcsapi_SSID_set_authentication_mode_rpcdata *, CLIENT *); +extern bool_t qcsapi_ssid_set_authentication_mode_remote_1_svc(qcsapi_SSID_set_authentication_mode_rpcdata *, qcsapi_SSID_set_authentication_mode_rpcdata *, struct svc_req *); +#define QCSAPI_SSID_GET_PRE_SHARED_KEY_REMOTE 2281 +extern enum clnt_stat qcsapi_ssid_get_pre_shared_key_remote_1(qcsapi_SSID_get_pre_shared_key_rpcdata *, qcsapi_SSID_get_pre_shared_key_rpcdata *, CLIENT *); +extern bool_t qcsapi_ssid_get_pre_shared_key_remote_1_svc(qcsapi_SSID_get_pre_shared_key_rpcdata *, qcsapi_SSID_get_pre_shared_key_rpcdata *, struct svc_req *); +#define QCSAPI_SSID_SET_PRE_SHARED_KEY_REMOTE 2291 +extern enum clnt_stat qcsapi_ssid_set_pre_shared_key_remote_1(qcsapi_SSID_set_pre_shared_key_rpcdata *, qcsapi_SSID_set_pre_shared_key_rpcdata *, CLIENT *); +extern bool_t qcsapi_ssid_set_pre_shared_key_remote_1_svc(qcsapi_SSID_set_pre_shared_key_rpcdata *, qcsapi_SSID_set_pre_shared_key_rpcdata *, struct svc_req *); +#define QCSAPI_SSID_GET_KEY_PASSPHRASE_REMOTE 2301 +extern enum clnt_stat qcsapi_ssid_get_key_passphrase_remote_1(qcsapi_SSID_get_key_passphrase_rpcdata *, qcsapi_SSID_get_key_passphrase_rpcdata *, CLIENT *); +extern bool_t qcsapi_ssid_get_key_passphrase_remote_1_svc(qcsapi_SSID_get_key_passphrase_rpcdata *, qcsapi_SSID_get_key_passphrase_rpcdata *, struct svc_req *); +#define QCSAPI_SSID_SET_KEY_PASSPHRASE_REMOTE 2311 +extern enum clnt_stat qcsapi_ssid_set_key_passphrase_remote_1(qcsapi_SSID_set_key_passphrase_rpcdata *, qcsapi_SSID_set_key_passphrase_rpcdata *, CLIENT *); +extern bool_t qcsapi_ssid_set_key_passphrase_remote_1_svc(qcsapi_SSID_set_key_passphrase_rpcdata *, qcsapi_SSID_set_key_passphrase_rpcdata *, struct svc_req *); +#define QCSAPI_SSID_GET_PMF_REMOTE 2321 +extern enum clnt_stat qcsapi_ssid_get_pmf_remote_1(qcsapi_SSID_get_pmf_rpcdata *, qcsapi_SSID_get_pmf_rpcdata *, CLIENT *); +extern bool_t qcsapi_ssid_get_pmf_remote_1_svc(qcsapi_SSID_get_pmf_rpcdata *, qcsapi_SSID_get_pmf_rpcdata *, struct svc_req *); +#define QCSAPI_SSID_SET_PMF_REMOTE 2331 +extern enum clnt_stat qcsapi_ssid_set_pmf_remote_1(qcsapi_SSID_set_pmf_rpcdata *, qcsapi_SSID_set_pmf_rpcdata *, CLIENT *); +extern bool_t qcsapi_ssid_set_pmf_remote_1_svc(qcsapi_SSID_set_pmf_rpcdata *, qcsapi_SSID_set_pmf_rpcdata *, struct svc_req *); +#define QCSAPI_SSID_GET_WPS_SSID_REMOTE 2341 +extern enum clnt_stat qcsapi_ssid_get_wps_ssid_remote_1(qcsapi_SSID_get_wps_SSID_rpcdata *, qcsapi_SSID_get_wps_SSID_rpcdata *, CLIENT *); +extern bool_t qcsapi_ssid_get_wps_ssid_remote_1_svc(qcsapi_SSID_get_wps_SSID_rpcdata *, qcsapi_SSID_get_wps_SSID_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_VLAN_CONFIG_REMOTE 2351 +extern enum clnt_stat qcsapi_wifi_vlan_config_remote_1(qcsapi_wifi_vlan_config_rpcdata *, qcsapi_wifi_vlan_config_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_vlan_config_remote_1_svc(qcsapi_wifi_vlan_config_rpcdata *, qcsapi_wifi_vlan_config_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_SHOW_VLAN_CONFIG_REMOTE 2361 +extern enum clnt_stat qcsapi_wifi_show_vlan_config_remote_1(qcsapi_wifi_show_vlan_config_rpcdata *, qcsapi_wifi_show_vlan_config_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_show_vlan_config_remote_1_svc(qcsapi_wifi_show_vlan_config_rpcdata *, qcsapi_wifi_show_vlan_config_rpcdata *, struct svc_req *); +#define QCSAPI_ENABLE_VLAN_PASS_THROUGH_REMOTE 2371 +extern enum clnt_stat qcsapi_enable_vlan_pass_through_remote_1(qcsapi_enable_vlan_pass_through_rpcdata *, qcsapi_enable_vlan_pass_through_rpcdata *, CLIENT *); +extern bool_t qcsapi_enable_vlan_pass_through_remote_1_svc(qcsapi_enable_vlan_pass_through_rpcdata *, qcsapi_enable_vlan_pass_through_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_SET_VLAN_PROMISC_REMOTE 2381 +extern enum clnt_stat qcsapi_wifi_set_vlan_promisc_remote_1(qcsapi_wifi_set_vlan_promisc_rpcdata *, qcsapi_wifi_set_vlan_promisc_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_set_vlan_promisc_remote_1_svc(qcsapi_wifi_set_vlan_promisc_rpcdata *, qcsapi_wifi_set_vlan_promisc_rpcdata *, struct svc_req *); +#define QCSAPI_WPS_REGISTRAR_REPORT_BUTTON_PRESS_REMOTE 2391 +extern enum clnt_stat qcsapi_wps_registrar_report_button_press_remote_1(qcsapi_wps_registrar_report_button_press_rpcdata *, qcsapi_wps_registrar_report_button_press_rpcdata *, CLIENT *); +extern bool_t qcsapi_wps_registrar_report_button_press_remote_1_svc(qcsapi_wps_registrar_report_button_press_rpcdata *, qcsapi_wps_registrar_report_button_press_rpcdata *, struct svc_req *); +#define QCSAPI_WPS_REGISTRAR_REPORT_PIN_REMOTE 2401 +extern enum clnt_stat qcsapi_wps_registrar_report_pin_remote_1(qcsapi_wps_registrar_report_pin_rpcdata *, qcsapi_wps_registrar_report_pin_rpcdata *, CLIENT *); +extern bool_t qcsapi_wps_registrar_report_pin_remote_1_svc(qcsapi_wps_registrar_report_pin_rpcdata *, qcsapi_wps_registrar_report_pin_rpcdata *, struct svc_req *); +#define QCSAPI_WPS_REGISTRAR_GET_PP_DEVNAME_REMOTE 2411 +extern enum clnt_stat qcsapi_wps_registrar_get_pp_devname_remote_1(qcsapi_wps_registrar_get_pp_devname_rpcdata *, qcsapi_wps_registrar_get_pp_devname_rpcdata *, CLIENT *); +extern bool_t qcsapi_wps_registrar_get_pp_devname_remote_1_svc(qcsapi_wps_registrar_get_pp_devname_rpcdata *, qcsapi_wps_registrar_get_pp_devname_rpcdata *, struct svc_req *); +#define QCSAPI_WPS_REGISTRAR_SET_PP_DEVNAME_REMOTE 2421 +extern enum clnt_stat qcsapi_wps_registrar_set_pp_devname_remote_1(qcsapi_wps_registrar_set_pp_devname_rpcdata *, qcsapi_wps_registrar_set_pp_devname_rpcdata *, CLIENT *); +extern bool_t qcsapi_wps_registrar_set_pp_devname_remote_1_svc(qcsapi_wps_registrar_set_pp_devname_rpcdata *, qcsapi_wps_registrar_set_pp_devname_rpcdata *, struct svc_req *); +#define QCSAPI_WPS_ENROLLEE_REPORT_BUTTON_PRESS_REMOTE 2431 +extern enum clnt_stat qcsapi_wps_enrollee_report_button_press_remote_1(qcsapi_wps_enrollee_report_button_press_rpcdata *, qcsapi_wps_enrollee_report_button_press_rpcdata *, CLIENT *); +extern bool_t qcsapi_wps_enrollee_report_button_press_remote_1_svc(qcsapi_wps_enrollee_report_button_press_rpcdata *, qcsapi_wps_enrollee_report_button_press_rpcdata *, struct svc_req *); +#define QCSAPI_WPS_ENROLLEE_REPORT_PIN_REMOTE 2441 +extern enum clnt_stat qcsapi_wps_enrollee_report_pin_remote_1(qcsapi_wps_enrollee_report_pin_rpcdata *, qcsapi_wps_enrollee_report_pin_rpcdata *, CLIENT *); +extern bool_t qcsapi_wps_enrollee_report_pin_remote_1_svc(qcsapi_wps_enrollee_report_pin_rpcdata *, qcsapi_wps_enrollee_report_pin_rpcdata *, struct svc_req *); +#define QCSAPI_WPS_ENROLLEE_GENERATE_PIN_REMOTE 2451 +extern enum clnt_stat qcsapi_wps_enrollee_generate_pin_remote_1(qcsapi_wps_enrollee_generate_pin_rpcdata *, qcsapi_wps_enrollee_generate_pin_rpcdata *, CLIENT *); +extern bool_t qcsapi_wps_enrollee_generate_pin_remote_1_svc(qcsapi_wps_enrollee_generate_pin_rpcdata *, qcsapi_wps_enrollee_generate_pin_rpcdata *, struct svc_req *); +#define QCSAPI_WPS_GET_AP_PIN_REMOTE 2461 +extern enum clnt_stat qcsapi_wps_get_ap_pin_remote_1(qcsapi_wps_get_ap_pin_rpcdata *, qcsapi_wps_get_ap_pin_rpcdata *, CLIENT *); +extern bool_t qcsapi_wps_get_ap_pin_remote_1_svc(qcsapi_wps_get_ap_pin_rpcdata *, qcsapi_wps_get_ap_pin_rpcdata *, struct svc_req *); +#define QCSAPI_WPS_SET_AP_PIN_REMOTE 2471 +extern enum clnt_stat qcsapi_wps_set_ap_pin_remote_1(qcsapi_wps_set_ap_pin_rpcdata *, qcsapi_wps_set_ap_pin_rpcdata *, CLIENT *); +extern bool_t qcsapi_wps_set_ap_pin_remote_1_svc(qcsapi_wps_set_ap_pin_rpcdata *, qcsapi_wps_set_ap_pin_rpcdata *, struct svc_req *); +#define QCSAPI_WPS_SAVE_AP_PIN_REMOTE 2481 +extern enum clnt_stat qcsapi_wps_save_ap_pin_remote_1(qcsapi_wps_save_ap_pin_rpcdata *, qcsapi_wps_save_ap_pin_rpcdata *, CLIENT *); +extern bool_t qcsapi_wps_save_ap_pin_remote_1_svc(qcsapi_wps_save_ap_pin_rpcdata *, qcsapi_wps_save_ap_pin_rpcdata *, struct svc_req *); +#define QCSAPI_WPS_ENABLE_AP_PIN_REMOTE 2491 +extern enum clnt_stat qcsapi_wps_enable_ap_pin_remote_1(qcsapi_wps_enable_ap_pin_rpcdata *, qcsapi_wps_enable_ap_pin_rpcdata *, CLIENT *); +extern bool_t qcsapi_wps_enable_ap_pin_remote_1_svc(qcsapi_wps_enable_ap_pin_rpcdata *, qcsapi_wps_enable_ap_pin_rpcdata *, struct svc_req *); +#define QCSAPI_WPS_GET_STA_PIN_REMOTE 2501 +extern enum clnt_stat qcsapi_wps_get_sta_pin_remote_1(qcsapi_wps_get_sta_pin_rpcdata *, qcsapi_wps_get_sta_pin_rpcdata *, CLIENT *); +extern bool_t qcsapi_wps_get_sta_pin_remote_1_svc(qcsapi_wps_get_sta_pin_rpcdata *, qcsapi_wps_get_sta_pin_rpcdata *, struct svc_req *); +#define QCSAPI_WPS_GET_STATE_REMOTE 2511 +extern enum clnt_stat qcsapi_wps_get_state_remote_1(qcsapi_wps_get_state_rpcdata *, qcsapi_wps_get_state_rpcdata *, CLIENT *); +extern bool_t qcsapi_wps_get_state_remote_1_svc(qcsapi_wps_get_state_rpcdata *, qcsapi_wps_get_state_rpcdata *, struct svc_req *); +#define QCSAPI_WPS_GET_CONFIGURED_STATE_REMOTE 2521 +extern enum clnt_stat qcsapi_wps_get_configured_state_remote_1(qcsapi_wps_get_configured_state_rpcdata *, qcsapi_wps_get_configured_state_rpcdata *, CLIENT *); +extern bool_t qcsapi_wps_get_configured_state_remote_1_svc(qcsapi_wps_get_configured_state_rpcdata *, qcsapi_wps_get_configured_state_rpcdata *, struct svc_req *); +#define QCSAPI_WPS_GET_RUNTIME_STATE_REMOTE 2531 +extern enum clnt_stat qcsapi_wps_get_runtime_state_remote_1(qcsapi_wps_get_runtime_state_rpcdata *, qcsapi_wps_get_runtime_state_rpcdata *, CLIENT *); +extern bool_t qcsapi_wps_get_runtime_state_remote_1_svc(qcsapi_wps_get_runtime_state_rpcdata *, qcsapi_wps_get_runtime_state_rpcdata *, struct svc_req *); +#define QCSAPI_WPS_SET_CONFIGURED_STATE_REMOTE 2541 +extern enum clnt_stat qcsapi_wps_set_configured_state_remote_1(qcsapi_wps_set_configured_state_rpcdata *, qcsapi_wps_set_configured_state_rpcdata *, CLIENT *); +extern bool_t qcsapi_wps_set_configured_state_remote_1_svc(qcsapi_wps_set_configured_state_rpcdata *, qcsapi_wps_set_configured_state_rpcdata *, struct svc_req *); +#define QCSAPI_WPS_GET_PARAM_REMOTE 2551 +extern enum clnt_stat qcsapi_wps_get_param_remote_1(qcsapi_wps_get_param_rpcdata *, qcsapi_wps_get_param_rpcdata *, CLIENT *); +extern bool_t qcsapi_wps_get_param_remote_1_svc(qcsapi_wps_get_param_rpcdata *, qcsapi_wps_get_param_rpcdata *, struct svc_req *); +#define QCSAPI_WPS_SET_TIMEOUT_REMOTE 2561 +extern enum clnt_stat qcsapi_wps_set_timeout_remote_1(qcsapi_wps_set_timeout_rpcdata *, qcsapi_wps_set_timeout_rpcdata *, CLIENT *); +extern bool_t qcsapi_wps_set_timeout_remote_1_svc(qcsapi_wps_set_timeout_rpcdata *, qcsapi_wps_set_timeout_rpcdata *, struct svc_req *); +#define QCSAPI_WPS_ON_HIDDEN_SSID_REMOTE 2571 +extern enum clnt_stat qcsapi_wps_on_hidden_ssid_remote_1(qcsapi_wps_on_hidden_ssid_rpcdata *, qcsapi_wps_on_hidden_ssid_rpcdata *, CLIENT *); +extern bool_t qcsapi_wps_on_hidden_ssid_remote_1_svc(qcsapi_wps_on_hidden_ssid_rpcdata *, qcsapi_wps_on_hidden_ssid_rpcdata *, struct svc_req *); +#define QCSAPI_WPS_ON_HIDDEN_SSID_STATUS_REMOTE 2581 +extern enum clnt_stat qcsapi_wps_on_hidden_ssid_status_remote_1(qcsapi_wps_on_hidden_ssid_status_rpcdata *, qcsapi_wps_on_hidden_ssid_status_rpcdata *, CLIENT *); +extern bool_t qcsapi_wps_on_hidden_ssid_status_remote_1_svc(qcsapi_wps_on_hidden_ssid_status_rpcdata *, qcsapi_wps_on_hidden_ssid_status_rpcdata *, struct svc_req *); +#define QCSAPI_WPS_UPNP_ENABLE_REMOTE 2591 +extern enum clnt_stat qcsapi_wps_upnp_enable_remote_1(qcsapi_wps_upnp_enable_rpcdata *, qcsapi_wps_upnp_enable_rpcdata *, CLIENT *); +extern bool_t qcsapi_wps_upnp_enable_remote_1_svc(qcsapi_wps_upnp_enable_rpcdata *, qcsapi_wps_upnp_enable_rpcdata *, struct svc_req *); +#define QCSAPI_WPS_UPNP_STATUS_REMOTE 2601 +extern enum clnt_stat qcsapi_wps_upnp_status_remote_1(qcsapi_wps_upnp_status_rpcdata *, qcsapi_wps_upnp_status_rpcdata *, CLIENT *); +extern bool_t qcsapi_wps_upnp_status_remote_1_svc(qcsapi_wps_upnp_status_rpcdata *, qcsapi_wps_upnp_status_rpcdata *, struct svc_req *); +#define QCSAPI_WPS_ALLOW_PBC_OVERLAP_REMOTE 2611 +extern enum clnt_stat qcsapi_wps_allow_pbc_overlap_remote_1(qcsapi_wps_allow_pbc_overlap_rpcdata *, qcsapi_wps_allow_pbc_overlap_rpcdata *, CLIENT *); +extern bool_t qcsapi_wps_allow_pbc_overlap_remote_1_svc(qcsapi_wps_allow_pbc_overlap_rpcdata *, qcsapi_wps_allow_pbc_overlap_rpcdata *, struct svc_req *); +#define QCSAPI_WPS_GET_ALLOW_PBC_OVERLAP_STATUS_REMOTE 2621 +extern enum clnt_stat qcsapi_wps_get_allow_pbc_overlap_status_remote_1(qcsapi_wps_get_allow_pbc_overlap_status_rpcdata *, qcsapi_wps_get_allow_pbc_overlap_status_rpcdata *, CLIENT *); +extern bool_t qcsapi_wps_get_allow_pbc_overlap_status_remote_1_svc(qcsapi_wps_get_allow_pbc_overlap_status_rpcdata *, qcsapi_wps_get_allow_pbc_overlap_status_rpcdata *, struct svc_req *); +#define QCSAPI_WPS_SET_ACCESS_CONTROL_REMOTE 2631 +extern enum clnt_stat qcsapi_wps_set_access_control_remote_1(qcsapi_wps_set_access_control_rpcdata *, qcsapi_wps_set_access_control_rpcdata *, CLIENT *); +extern bool_t qcsapi_wps_set_access_control_remote_1_svc(qcsapi_wps_set_access_control_rpcdata *, qcsapi_wps_set_access_control_rpcdata *, struct svc_req *); +#define QCSAPI_WPS_GET_ACCESS_CONTROL_REMOTE 2641 +extern enum clnt_stat qcsapi_wps_get_access_control_remote_1(qcsapi_wps_get_access_control_rpcdata *, qcsapi_wps_get_access_control_rpcdata *, CLIENT *); +extern bool_t qcsapi_wps_get_access_control_remote_1_svc(qcsapi_wps_get_access_control_rpcdata *, qcsapi_wps_get_access_control_rpcdata *, struct svc_req *); +#define QCSAPI_WPS_SET_PARAM_REMOTE 2651 +extern enum clnt_stat qcsapi_wps_set_param_remote_1(qcsapi_wps_set_param_rpcdata *, qcsapi_wps_set_param_rpcdata *, CLIENT *); +extern bool_t qcsapi_wps_set_param_remote_1_svc(qcsapi_wps_set_param_rpcdata *, qcsapi_wps_set_param_rpcdata *, struct svc_req *); +#define QCSAPI_WPS_CANCEL_REMOTE 2661 +extern enum clnt_stat qcsapi_wps_cancel_remote_1(qcsapi_wps_cancel_rpcdata *, qcsapi_wps_cancel_rpcdata *, CLIENT *); +extern bool_t qcsapi_wps_cancel_remote_1_svc(qcsapi_wps_cancel_rpcdata *, qcsapi_wps_cancel_rpcdata *, struct svc_req *); +#define QCSAPI_WPS_SET_PBC_IN_SRCM_REMOTE 2671 +extern enum clnt_stat qcsapi_wps_set_pbc_in_srcm_remote_1(qcsapi_wps_set_pbc_in_srcm_rpcdata *, qcsapi_wps_set_pbc_in_srcm_rpcdata *, CLIENT *); +extern bool_t qcsapi_wps_set_pbc_in_srcm_remote_1_svc(qcsapi_wps_set_pbc_in_srcm_rpcdata *, qcsapi_wps_set_pbc_in_srcm_rpcdata *, struct svc_req *); +#define QCSAPI_WPS_GET_PBC_IN_SRCM_REMOTE 2681 +extern enum clnt_stat qcsapi_wps_get_pbc_in_srcm_remote_1(qcsapi_wps_get_pbc_in_srcm_rpcdata *, qcsapi_wps_get_pbc_in_srcm_rpcdata *, CLIENT *); +extern bool_t qcsapi_wps_get_pbc_in_srcm_remote_1_svc(qcsapi_wps_get_pbc_in_srcm_rpcdata *, qcsapi_wps_get_pbc_in_srcm_rpcdata *, struct svc_req *); +#define QCSAPI_REGISTRAR_SET_DEFAULT_PBC_BSS_REMOTE 2691 +extern enum clnt_stat qcsapi_registrar_set_default_pbc_bss_remote_1(qcsapi_registrar_set_default_pbc_bss_rpcdata *, qcsapi_registrar_set_default_pbc_bss_rpcdata *, CLIENT *); +extern bool_t qcsapi_registrar_set_default_pbc_bss_remote_1_svc(qcsapi_registrar_set_default_pbc_bss_rpcdata *, qcsapi_registrar_set_default_pbc_bss_rpcdata *, struct svc_req *); +#define QCSAPI_REGISTRAR_GET_DEFAULT_PBC_BSS_REMOTE 2701 +extern enum clnt_stat qcsapi_registrar_get_default_pbc_bss_remote_1(qcsapi_registrar_get_default_pbc_bss_rpcdata *, qcsapi_registrar_get_default_pbc_bss_rpcdata *, CLIENT *); +extern bool_t qcsapi_registrar_get_default_pbc_bss_remote_1_svc(qcsapi_registrar_get_default_pbc_bss_rpcdata *, qcsapi_registrar_get_default_pbc_bss_rpcdata *, struct svc_req *); +#define QCSAPI_GPIO_SET_CONFIG_REMOTE 2711 +extern enum clnt_stat qcsapi_gpio_set_config_remote_1(qcsapi_gpio_set_config_rpcdata *, qcsapi_gpio_set_config_rpcdata *, CLIENT *); +extern bool_t qcsapi_gpio_set_config_remote_1_svc(qcsapi_gpio_set_config_rpcdata *, qcsapi_gpio_set_config_rpcdata *, struct svc_req *); +#define QCSAPI_GPIO_GET_CONFIG_REMOTE 2721 +extern enum clnt_stat qcsapi_gpio_get_config_remote_1(qcsapi_gpio_get_config_rpcdata *, qcsapi_gpio_get_config_rpcdata *, CLIENT *); +extern bool_t qcsapi_gpio_get_config_remote_1_svc(qcsapi_gpio_get_config_rpcdata *, qcsapi_gpio_get_config_rpcdata *, struct svc_req *); +#define QCSAPI_LED_GET_REMOTE 2731 +extern enum clnt_stat qcsapi_led_get_remote_1(qcsapi_led_get_rpcdata *, qcsapi_led_get_rpcdata *, CLIENT *); +extern bool_t qcsapi_led_get_remote_1_svc(qcsapi_led_get_rpcdata *, qcsapi_led_get_rpcdata *, struct svc_req *); +#define QCSAPI_LED_SET_REMOTE 2741 +extern enum clnt_stat qcsapi_led_set_remote_1(qcsapi_led_set_rpcdata *, qcsapi_led_set_rpcdata *, CLIENT *); +extern bool_t qcsapi_led_set_remote_1_svc(qcsapi_led_set_rpcdata *, qcsapi_led_set_rpcdata *, struct svc_req *); +#define QCSAPI_LED_PWM_ENABLE_REMOTE 2751 +extern enum clnt_stat qcsapi_led_pwm_enable_remote_1(qcsapi_led_pwm_enable_rpcdata *, qcsapi_led_pwm_enable_rpcdata *, CLIENT *); +extern bool_t qcsapi_led_pwm_enable_remote_1_svc(qcsapi_led_pwm_enable_rpcdata *, qcsapi_led_pwm_enable_rpcdata *, struct svc_req *); +#define QCSAPI_LED_BRIGHTNESS_REMOTE 2761 +extern enum clnt_stat qcsapi_led_brightness_remote_1(qcsapi_led_brightness_rpcdata *, qcsapi_led_brightness_rpcdata *, CLIENT *); +extern bool_t qcsapi_led_brightness_remote_1_svc(qcsapi_led_brightness_rpcdata *, qcsapi_led_brightness_rpcdata *, struct svc_req *); +#define QCSAPI_GPIO_ENABLE_WPS_PUSH_BUTTON_REMOTE 2781 +extern enum clnt_stat qcsapi_gpio_enable_wps_push_button_remote_1(qcsapi_gpio_enable_wps_push_button_rpcdata *, qcsapi_gpio_enable_wps_push_button_rpcdata *, CLIENT *); +extern bool_t qcsapi_gpio_enable_wps_push_button_remote_1_svc(qcsapi_gpio_enable_wps_push_button_rpcdata *, qcsapi_gpio_enable_wps_push_button_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_GET_COUNT_ASSOCIATIONS_REMOTE 2791 +extern enum clnt_stat qcsapi_wifi_get_count_associations_remote_1(qcsapi_wifi_get_count_associations_rpcdata *, qcsapi_wifi_get_count_associations_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_get_count_associations_remote_1_svc(qcsapi_wifi_get_count_associations_rpcdata *, qcsapi_wifi_get_count_associations_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_GET_ASSOCIATED_DEVICE_MAC_ADDR_REMOTE 2801 +extern enum clnt_stat qcsapi_wifi_get_associated_device_mac_addr_remote_1(qcsapi_wifi_get_associated_device_mac_addr_rpcdata *, qcsapi_wifi_get_associated_device_mac_addr_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_get_associated_device_mac_addr_remote_1_svc(qcsapi_wifi_get_associated_device_mac_addr_rpcdata *, qcsapi_wifi_get_associated_device_mac_addr_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_GET_ASSOCIATED_DEVICE_IP_ADDR_REMOTE 2811 +extern enum clnt_stat qcsapi_wifi_get_associated_device_ip_addr_remote_1(qcsapi_wifi_get_associated_device_ip_addr_rpcdata *, qcsapi_wifi_get_associated_device_ip_addr_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_get_associated_device_ip_addr_remote_1_svc(qcsapi_wifi_get_associated_device_ip_addr_rpcdata *, qcsapi_wifi_get_associated_device_ip_addr_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_GET_LINK_QUALITY_REMOTE 2821 +extern enum clnt_stat qcsapi_wifi_get_link_quality_remote_1(qcsapi_wifi_get_link_quality_rpcdata *, qcsapi_wifi_get_link_quality_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_get_link_quality_remote_1_svc(qcsapi_wifi_get_link_quality_rpcdata *, qcsapi_wifi_get_link_quality_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_GET_LINK_QUALITY_MAX_REMOTE 5851 +extern enum clnt_stat qcsapi_wifi_get_link_quality_max_remote_1(qcsapi_wifi_get_link_quality_max_rpcdata *, qcsapi_wifi_get_link_quality_max_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_get_link_quality_max_remote_1_svc(qcsapi_wifi_get_link_quality_max_rpcdata *, qcsapi_wifi_get_link_quality_max_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_GET_RX_BYTES_PER_ASSOCIATION_REMOTE 2831 +extern enum clnt_stat qcsapi_wifi_get_rx_bytes_per_association_remote_1(qcsapi_wifi_get_rx_bytes_per_association_rpcdata *, qcsapi_wifi_get_rx_bytes_per_association_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_get_rx_bytes_per_association_remote_1_svc(qcsapi_wifi_get_rx_bytes_per_association_rpcdata *, qcsapi_wifi_get_rx_bytes_per_association_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_GET_TX_BYTES_PER_ASSOCIATION_REMOTE 2841 +extern enum clnt_stat qcsapi_wifi_get_tx_bytes_per_association_remote_1(qcsapi_wifi_get_tx_bytes_per_association_rpcdata *, qcsapi_wifi_get_tx_bytes_per_association_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_get_tx_bytes_per_association_remote_1_svc(qcsapi_wifi_get_tx_bytes_per_association_rpcdata *, qcsapi_wifi_get_tx_bytes_per_association_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_GET_RX_PACKETS_PER_ASSOCIATION_REMOTE 2851 +extern enum clnt_stat qcsapi_wifi_get_rx_packets_per_association_remote_1(qcsapi_wifi_get_rx_packets_per_association_rpcdata *, qcsapi_wifi_get_rx_packets_per_association_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_get_rx_packets_per_association_remote_1_svc(qcsapi_wifi_get_rx_packets_per_association_rpcdata *, qcsapi_wifi_get_rx_packets_per_association_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_GET_TX_PACKETS_PER_ASSOCIATION_REMOTE 2861 +extern enum clnt_stat qcsapi_wifi_get_tx_packets_per_association_remote_1(qcsapi_wifi_get_tx_packets_per_association_rpcdata *, qcsapi_wifi_get_tx_packets_per_association_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_get_tx_packets_per_association_remote_1_svc(qcsapi_wifi_get_tx_packets_per_association_rpcdata *, qcsapi_wifi_get_tx_packets_per_association_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_GET_TX_ERR_PACKETS_PER_ASSOCIATION_REMOTE 2871 +extern enum clnt_stat qcsapi_wifi_get_tx_err_packets_per_association_remote_1(qcsapi_wifi_get_tx_err_packets_per_association_rpcdata *, qcsapi_wifi_get_tx_err_packets_per_association_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_get_tx_err_packets_per_association_remote_1_svc(qcsapi_wifi_get_tx_err_packets_per_association_rpcdata *, qcsapi_wifi_get_tx_err_packets_per_association_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_GET_RSSI_PER_ASSOCIATION_REMOTE 2881 +extern enum clnt_stat qcsapi_wifi_get_rssi_per_association_remote_1(qcsapi_wifi_get_rssi_per_association_rpcdata *, qcsapi_wifi_get_rssi_per_association_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_get_rssi_per_association_remote_1_svc(qcsapi_wifi_get_rssi_per_association_rpcdata *, qcsapi_wifi_get_rssi_per_association_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_GET_RSSI_IN_DBM_PER_ASSOCIATION_REMOTE 2891 +extern enum clnt_stat qcsapi_wifi_get_rssi_in_dbm_per_association_remote_1(qcsapi_wifi_get_rssi_in_dbm_per_association_rpcdata *, qcsapi_wifi_get_rssi_in_dbm_per_association_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_get_rssi_in_dbm_per_association_remote_1_svc(qcsapi_wifi_get_rssi_in_dbm_per_association_rpcdata *, qcsapi_wifi_get_rssi_in_dbm_per_association_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_GET_BW_PER_ASSOCIATION_REMOTE 2901 +extern enum clnt_stat qcsapi_wifi_get_bw_per_association_remote_1(qcsapi_wifi_get_bw_per_association_rpcdata *, qcsapi_wifi_get_bw_per_association_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_get_bw_per_association_remote_1_svc(qcsapi_wifi_get_bw_per_association_rpcdata *, qcsapi_wifi_get_bw_per_association_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_GET_TX_PHY_RATE_PER_ASSOCIATION_REMOTE 2911 +extern enum clnt_stat qcsapi_wifi_get_tx_phy_rate_per_association_remote_1(qcsapi_wifi_get_tx_phy_rate_per_association_rpcdata *, qcsapi_wifi_get_tx_phy_rate_per_association_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_get_tx_phy_rate_per_association_remote_1_svc(qcsapi_wifi_get_tx_phy_rate_per_association_rpcdata *, qcsapi_wifi_get_tx_phy_rate_per_association_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_GET_RX_PHY_RATE_PER_ASSOCIATION_REMOTE 2921 +extern enum clnt_stat qcsapi_wifi_get_rx_phy_rate_per_association_remote_1(qcsapi_wifi_get_rx_phy_rate_per_association_rpcdata *, qcsapi_wifi_get_rx_phy_rate_per_association_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_get_rx_phy_rate_per_association_remote_1_svc(qcsapi_wifi_get_rx_phy_rate_per_association_rpcdata *, qcsapi_wifi_get_rx_phy_rate_per_association_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_GET_TX_MCS_PER_ASSOCIATION_REMOTE 2931 +extern enum clnt_stat qcsapi_wifi_get_tx_mcs_per_association_remote_1(qcsapi_wifi_get_tx_mcs_per_association_rpcdata *, qcsapi_wifi_get_tx_mcs_per_association_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_get_tx_mcs_per_association_remote_1_svc(qcsapi_wifi_get_tx_mcs_per_association_rpcdata *, qcsapi_wifi_get_tx_mcs_per_association_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_GET_RX_MCS_PER_ASSOCIATION_REMOTE 2941 +extern enum clnt_stat qcsapi_wifi_get_rx_mcs_per_association_remote_1(qcsapi_wifi_get_rx_mcs_per_association_rpcdata *, qcsapi_wifi_get_rx_mcs_per_association_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_get_rx_mcs_per_association_remote_1_svc(qcsapi_wifi_get_rx_mcs_per_association_rpcdata *, qcsapi_wifi_get_rx_mcs_per_association_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_GET_ACHIEVABLE_TX_PHY_RATE_PER_ASSOCIATION_REMOTE 2951 +extern enum clnt_stat qcsapi_wifi_get_achievable_tx_phy_rate_per_association_remote_1(qcsapi_wifi_get_achievable_tx_phy_rate_per_association_rpcdata *, qcsapi_wifi_get_achievable_tx_phy_rate_per_association_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_get_achievable_tx_phy_rate_per_association_remote_1_svc(qcsapi_wifi_get_achievable_tx_phy_rate_per_association_rpcdata *, qcsapi_wifi_get_achievable_tx_phy_rate_per_association_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_GET_ACHIEVABLE_RX_PHY_RATE_PER_ASSOCIATION_REMOTE 2961 +extern enum clnt_stat qcsapi_wifi_get_achievable_rx_phy_rate_per_association_remote_1(qcsapi_wifi_get_achievable_rx_phy_rate_per_association_rpcdata *, qcsapi_wifi_get_achievable_rx_phy_rate_per_association_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_get_achievable_rx_phy_rate_per_association_remote_1_svc(qcsapi_wifi_get_achievable_rx_phy_rate_per_association_rpcdata *, qcsapi_wifi_get_achievable_rx_phy_rate_per_association_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_GET_AUTH_ENC_PER_ASSOCIATION_REMOTE 2971 +extern enum clnt_stat qcsapi_wifi_get_auth_enc_per_association_remote_1(qcsapi_wifi_get_auth_enc_per_association_rpcdata *, qcsapi_wifi_get_auth_enc_per_association_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_get_auth_enc_per_association_remote_1_svc(qcsapi_wifi_get_auth_enc_per_association_rpcdata *, qcsapi_wifi_get_auth_enc_per_association_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_GET_TPUT_CAPS_REMOTE 2981 +extern enum clnt_stat qcsapi_wifi_get_tput_caps_remote_1(qcsapi_wifi_get_tput_caps_rpcdata *, qcsapi_wifi_get_tput_caps_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_get_tput_caps_remote_1_svc(qcsapi_wifi_get_tput_caps_rpcdata *, qcsapi_wifi_get_tput_caps_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_GET_CONNECTION_MODE_REMOTE 2991 +extern enum clnt_stat qcsapi_wifi_get_connection_mode_remote_1(qcsapi_wifi_get_connection_mode_rpcdata *, qcsapi_wifi_get_connection_mode_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_get_connection_mode_remote_1_svc(qcsapi_wifi_get_connection_mode_rpcdata *, qcsapi_wifi_get_connection_mode_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_GET_VENDOR_PER_ASSOCIATION_REMOTE 3001 +extern enum clnt_stat qcsapi_wifi_get_vendor_per_association_remote_1(qcsapi_wifi_get_vendor_per_association_rpcdata *, qcsapi_wifi_get_vendor_per_association_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_get_vendor_per_association_remote_1_svc(qcsapi_wifi_get_vendor_per_association_rpcdata *, qcsapi_wifi_get_vendor_per_association_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_GET_MAX_MIMO_REMOTE 4461 +extern enum clnt_stat qcsapi_wifi_get_max_mimo_remote_1(qcsapi_wifi_get_max_mimo_rpcdata *, qcsapi_wifi_get_max_mimo_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_get_max_mimo_remote_1_svc(qcsapi_wifi_get_max_mimo_rpcdata *, qcsapi_wifi_get_max_mimo_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_GET_SNR_PER_ASSOCIATION_REMOTE 3011 +extern enum clnt_stat qcsapi_wifi_get_snr_per_association_remote_1(qcsapi_wifi_get_snr_per_association_rpcdata *, qcsapi_wifi_get_snr_per_association_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_get_snr_per_association_remote_1_svc(qcsapi_wifi_get_snr_per_association_rpcdata *, qcsapi_wifi_get_snr_per_association_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_GET_TIME_ASSOCIATED_PER_ASSOCIATION_REMOTE 3021 +extern enum clnt_stat qcsapi_wifi_get_time_associated_per_association_remote_1(qcsapi_wifi_get_time_associated_per_association_rpcdata *, qcsapi_wifi_get_time_associated_per_association_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_get_time_associated_per_association_remote_1_svc(qcsapi_wifi_get_time_associated_per_association_rpcdata *, qcsapi_wifi_get_time_associated_per_association_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_GET_NODE_PARAM_REMOTE 3031 +extern enum clnt_stat qcsapi_wifi_get_node_param_remote_1(qcsapi_wifi_get_node_param_rpcdata *, qcsapi_wifi_get_node_param_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_get_node_param_remote_1_svc(qcsapi_wifi_get_node_param_rpcdata *, qcsapi_wifi_get_node_param_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_GET_NODE_COUNTER_REMOTE 3041 +extern enum clnt_stat qcsapi_wifi_get_node_counter_remote_1(qcsapi_wifi_get_node_counter_rpcdata *, qcsapi_wifi_get_node_counter_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_get_node_counter_remote_1_svc(qcsapi_wifi_get_node_counter_rpcdata *, qcsapi_wifi_get_node_counter_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_GET_NODE_STATS_REMOTE 3051 +extern enum clnt_stat qcsapi_wifi_get_node_stats_remote_1(qcsapi_wifi_get_node_stats_rpcdata *, qcsapi_wifi_get_node_stats_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_get_node_stats_remote_1_svc(qcsapi_wifi_get_node_stats_rpcdata *, qcsapi_wifi_get_node_stats_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_GET_MAX_QUEUED_REMOTE 3061 +extern enum clnt_stat qcsapi_wifi_get_max_queued_remote_1(qcsapi_wifi_get_max_queued_rpcdata *, qcsapi_wifi_get_max_queued_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_get_max_queued_remote_1_svc(qcsapi_wifi_get_max_queued_rpcdata *, qcsapi_wifi_get_max_queued_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_GET_HW_NOISE_PER_ASSOCIATION_REMOTE 3071 +extern enum clnt_stat qcsapi_wifi_get_hw_noise_per_association_remote_1(qcsapi_wifi_get_hw_noise_per_association_rpcdata *, qcsapi_wifi_get_hw_noise_per_association_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_get_hw_noise_per_association_remote_1_svc(qcsapi_wifi_get_hw_noise_per_association_rpcdata *, qcsapi_wifi_get_hw_noise_per_association_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_GET_MLME_STATS_PER_MAC_REMOTE 3591 +extern enum clnt_stat qcsapi_wifi_get_mlme_stats_per_mac_remote_1(qcsapi_wifi_get_mlme_stats_per_mac_rpcdata *, qcsapi_wifi_get_mlme_stats_per_mac_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_get_mlme_stats_per_mac_remote_1_svc(qcsapi_wifi_get_mlme_stats_per_mac_rpcdata *, qcsapi_wifi_get_mlme_stats_per_mac_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_GET_MLME_STATS_PER_ASSOCIATION_REMOTE 3601 +extern enum clnt_stat qcsapi_wifi_get_mlme_stats_per_association_remote_1(qcsapi_wifi_get_mlme_stats_per_association_rpcdata *, qcsapi_wifi_get_mlme_stats_per_association_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_get_mlme_stats_per_association_remote_1_svc(qcsapi_wifi_get_mlme_stats_per_association_rpcdata *, qcsapi_wifi_get_mlme_stats_per_association_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_GET_MLME_STATS_MACS_LIST_REMOTE 3611 +extern enum clnt_stat qcsapi_wifi_get_mlme_stats_macs_list_remote_1(qcsapi_wifi_get_mlme_stats_macs_list_rpcdata *, qcsapi_wifi_get_mlme_stats_macs_list_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_get_mlme_stats_macs_list_remote_1_svc(qcsapi_wifi_get_mlme_stats_macs_list_rpcdata *, qcsapi_wifi_get_mlme_stats_macs_list_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_GET_LIST_REGULATORY_REGIONS_REMOTE 3081 +extern enum clnt_stat qcsapi_wifi_get_list_regulatory_regions_remote_1(qcsapi_wifi_get_list_regulatory_regions_rpcdata *, qcsapi_wifi_get_list_regulatory_regions_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_get_list_regulatory_regions_remote_1_svc(qcsapi_wifi_get_list_regulatory_regions_rpcdata *, qcsapi_wifi_get_list_regulatory_regions_rpcdata *, struct svc_req *); +#define QCSAPI_REGULATORY_GET_LIST_REGULATORY_REGIONS_REMOTE 3091 +extern enum clnt_stat qcsapi_regulatory_get_list_regulatory_regions_remote_1(qcsapi_regulatory_get_list_regulatory_regions_rpcdata *, qcsapi_regulatory_get_list_regulatory_regions_rpcdata *, CLIENT *); +extern bool_t qcsapi_regulatory_get_list_regulatory_regions_remote_1_svc(qcsapi_regulatory_get_list_regulatory_regions_rpcdata *, qcsapi_regulatory_get_list_regulatory_regions_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_GET_LIST_REGULATORY_CHANNELS_REMOTE 3101 +extern enum clnt_stat qcsapi_wifi_get_list_regulatory_channels_remote_1(qcsapi_wifi_get_list_regulatory_channels_rpcdata *, qcsapi_wifi_get_list_regulatory_channels_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_get_list_regulatory_channels_remote_1_svc(qcsapi_wifi_get_list_regulatory_channels_rpcdata *, qcsapi_wifi_get_list_regulatory_channels_rpcdata *, struct svc_req *); +#define QCSAPI_REGULATORY_GET_LIST_REGULATORY_CHANNELS_REMOTE 3111 +extern enum clnt_stat qcsapi_regulatory_get_list_regulatory_channels_remote_1(qcsapi_regulatory_get_list_regulatory_channels_rpcdata *, qcsapi_regulatory_get_list_regulatory_channels_rpcdata *, CLIENT *); +extern bool_t qcsapi_regulatory_get_list_regulatory_channels_remote_1_svc(qcsapi_regulatory_get_list_regulatory_channels_rpcdata *, qcsapi_regulatory_get_list_regulatory_channels_rpcdata *, struct svc_req *); +#define QCSAPI_REGULATORY_GET_LIST_REGULATORY_BANDS_REMOTE 3121 +extern enum clnt_stat qcsapi_regulatory_get_list_regulatory_bands_remote_1(qcsapi_regulatory_get_list_regulatory_bands_rpcdata *, qcsapi_regulatory_get_list_regulatory_bands_rpcdata *, CLIENT *); +extern bool_t qcsapi_regulatory_get_list_regulatory_bands_remote_1_svc(qcsapi_regulatory_get_list_regulatory_bands_rpcdata *, qcsapi_regulatory_get_list_regulatory_bands_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_GET_REGULATORY_TX_POWER_REMOTE 3131 +extern enum clnt_stat qcsapi_wifi_get_regulatory_tx_power_remote_1(qcsapi_wifi_get_regulatory_tx_power_rpcdata *, qcsapi_wifi_get_regulatory_tx_power_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_get_regulatory_tx_power_remote_1_svc(qcsapi_wifi_get_regulatory_tx_power_rpcdata *, qcsapi_wifi_get_regulatory_tx_power_rpcdata *, struct svc_req *); +#define QCSAPI_REGULATORY_GET_REGULATORY_TX_POWER_REMOTE 3141 +extern enum clnt_stat qcsapi_regulatory_get_regulatory_tx_power_remote_1(qcsapi_regulatory_get_regulatory_tx_power_rpcdata *, qcsapi_regulatory_get_regulatory_tx_power_rpcdata *, CLIENT *); +extern bool_t qcsapi_regulatory_get_regulatory_tx_power_remote_1_svc(qcsapi_regulatory_get_regulatory_tx_power_rpcdata *, qcsapi_regulatory_get_regulatory_tx_power_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_GET_CONFIGURED_TX_POWER_REMOTE 3151 +extern enum clnt_stat qcsapi_wifi_get_configured_tx_power_remote_1(qcsapi_wifi_get_configured_tx_power_rpcdata *, qcsapi_wifi_get_configured_tx_power_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_get_configured_tx_power_remote_1_svc(qcsapi_wifi_get_configured_tx_power_rpcdata *, qcsapi_wifi_get_configured_tx_power_rpcdata *, struct svc_req *); +#define QCSAPI_REGULATORY_GET_CONFIGURED_TX_POWER_REMOTE 3161 +extern enum clnt_stat qcsapi_regulatory_get_configured_tx_power_remote_1(qcsapi_regulatory_get_configured_tx_power_rpcdata *, qcsapi_regulatory_get_configured_tx_power_rpcdata *, CLIENT *); +extern bool_t qcsapi_regulatory_get_configured_tx_power_remote_1_svc(qcsapi_regulatory_get_configured_tx_power_rpcdata *, qcsapi_regulatory_get_configured_tx_power_rpcdata *, struct svc_req *); +#define QCSAPI_REGULATORY_GET_CONFIGURED_TX_POWER_EXT_REMOTE 5681 +extern enum clnt_stat qcsapi_regulatory_get_configured_tx_power_ext_remote_1(qcsapi_regulatory_get_configured_tx_power_ext_rpcdata *, qcsapi_regulatory_get_configured_tx_power_ext_rpcdata *, CLIENT *); +extern bool_t qcsapi_regulatory_get_configured_tx_power_ext_remote_1_svc(qcsapi_regulatory_get_configured_tx_power_ext_rpcdata *, qcsapi_regulatory_get_configured_tx_power_ext_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_SET_REGULATORY_REGION_REMOTE 3171 +extern enum clnt_stat qcsapi_wifi_set_regulatory_region_remote_1(qcsapi_wifi_set_regulatory_region_rpcdata *, qcsapi_wifi_set_regulatory_region_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_set_regulatory_region_remote_1_svc(qcsapi_wifi_set_regulatory_region_rpcdata *, qcsapi_wifi_set_regulatory_region_rpcdata *, struct svc_req *); +#define QCSAPI_REGULATORY_SET_REGULATORY_REGION_REMOTE 3181 +extern enum clnt_stat qcsapi_regulatory_set_regulatory_region_remote_1(qcsapi_regulatory_set_regulatory_region_rpcdata *, qcsapi_regulatory_set_regulatory_region_rpcdata *, CLIENT *); +extern bool_t qcsapi_regulatory_set_regulatory_region_remote_1_svc(qcsapi_regulatory_set_regulatory_region_rpcdata *, qcsapi_regulatory_set_regulatory_region_rpcdata *, struct svc_req *); +#define QCSAPI_REGULATORY_RESTORE_REGULATORY_TX_POWER_REMOTE 3191 +extern enum clnt_stat qcsapi_regulatory_restore_regulatory_tx_power_remote_1(qcsapi_regulatory_restore_regulatory_tx_power_rpcdata *, qcsapi_regulatory_restore_regulatory_tx_power_rpcdata *, CLIENT *); +extern bool_t qcsapi_regulatory_restore_regulatory_tx_power_remote_1_svc(qcsapi_regulatory_restore_regulatory_tx_power_rpcdata *, qcsapi_regulatory_restore_regulatory_tx_power_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_GET_REGULATORY_REGION_REMOTE 3201 +extern enum clnt_stat qcsapi_wifi_get_regulatory_region_remote_1(qcsapi_wifi_get_regulatory_region_rpcdata *, qcsapi_wifi_get_regulatory_region_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_get_regulatory_region_remote_1_svc(qcsapi_wifi_get_regulatory_region_rpcdata *, qcsapi_wifi_get_regulatory_region_rpcdata *, struct svc_req *); +#define QCSAPI_REGULATORY_OVERWRITE_COUNTRY_CODE_REMOTE 3211 +extern enum clnt_stat qcsapi_regulatory_overwrite_country_code_remote_1(qcsapi_regulatory_overwrite_country_code_rpcdata *, qcsapi_regulatory_overwrite_country_code_rpcdata *, CLIENT *); +extern bool_t qcsapi_regulatory_overwrite_country_code_remote_1_svc(qcsapi_regulatory_overwrite_country_code_rpcdata *, qcsapi_regulatory_overwrite_country_code_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_SET_REGULATORY_CHANNEL_REMOTE 3221 +extern enum clnt_stat qcsapi_wifi_set_regulatory_channel_remote_1(qcsapi_wifi_set_regulatory_channel_rpcdata *, qcsapi_wifi_set_regulatory_channel_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_set_regulatory_channel_remote_1_svc(qcsapi_wifi_set_regulatory_channel_rpcdata *, qcsapi_wifi_set_regulatory_channel_rpcdata *, struct svc_req *); +#define QCSAPI_REGULATORY_SET_REGULATORY_CHANNEL_REMOTE 3231 +extern enum clnt_stat qcsapi_regulatory_set_regulatory_channel_remote_1(qcsapi_regulatory_set_regulatory_channel_rpcdata *, qcsapi_regulatory_set_regulatory_channel_rpcdata *, CLIENT *); +extern bool_t qcsapi_regulatory_set_regulatory_channel_remote_1_svc(qcsapi_regulatory_set_regulatory_channel_rpcdata *, qcsapi_regulatory_set_regulatory_channel_rpcdata *, struct svc_req *); +#define QCSAPI_REGULATORY_GET_DB_VERSION_REMOTE 3241 +extern enum clnt_stat qcsapi_regulatory_get_db_version_remote_1(qcsapi_regulatory_get_db_version_rpcdata *, qcsapi_regulatory_get_db_version_rpcdata *, CLIENT *); +extern bool_t qcsapi_regulatory_get_db_version_remote_1_svc(qcsapi_regulatory_get_db_version_rpcdata *, qcsapi_regulatory_get_db_version_rpcdata *, struct svc_req *); +#define QCSAPI_REGULATORY_APPLY_TX_POWER_CAP_REMOTE 3251 +extern enum clnt_stat qcsapi_regulatory_apply_tx_power_cap_remote_1(qcsapi_regulatory_apply_tx_power_cap_rpcdata *, qcsapi_regulatory_apply_tx_power_cap_rpcdata *, CLIENT *); +extern bool_t qcsapi_regulatory_apply_tx_power_cap_remote_1_svc(qcsapi_regulatory_apply_tx_power_cap_rpcdata *, qcsapi_regulatory_apply_tx_power_cap_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_GET_LIST_DFS_CHANNELS_REMOTE 3261 +extern enum clnt_stat qcsapi_wifi_get_list_dfs_channels_remote_1(qcsapi_wifi_get_list_DFS_channels_rpcdata *, qcsapi_wifi_get_list_DFS_channels_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_get_list_dfs_channels_remote_1_svc(qcsapi_wifi_get_list_DFS_channels_rpcdata *, qcsapi_wifi_get_list_DFS_channels_rpcdata *, struct svc_req *); +#define QCSAPI_REGULATORY_GET_LIST_DFS_CHANNELS_REMOTE 3271 +extern enum clnt_stat qcsapi_regulatory_get_list_dfs_channels_remote_1(qcsapi_regulatory_get_list_DFS_channels_rpcdata *, qcsapi_regulatory_get_list_DFS_channels_rpcdata *, CLIENT *); +extern bool_t qcsapi_regulatory_get_list_dfs_channels_remote_1_svc(qcsapi_regulatory_get_list_DFS_channels_rpcdata *, qcsapi_regulatory_get_list_DFS_channels_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_IS_CHANNEL_DFS_REMOTE 3281 +extern enum clnt_stat qcsapi_wifi_is_channel_dfs_remote_1(qcsapi_wifi_is_channel_DFS_rpcdata *, qcsapi_wifi_is_channel_DFS_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_is_channel_dfs_remote_1_svc(qcsapi_wifi_is_channel_DFS_rpcdata *, qcsapi_wifi_is_channel_DFS_rpcdata *, struct svc_req *); +#define QCSAPI_REGULATORY_IS_CHANNEL_DFS_REMOTE 3291 +extern enum clnt_stat qcsapi_regulatory_is_channel_dfs_remote_1(qcsapi_regulatory_is_channel_DFS_rpcdata *, qcsapi_regulatory_is_channel_DFS_rpcdata *, CLIENT *); +extern bool_t qcsapi_regulatory_is_channel_dfs_remote_1_svc(qcsapi_regulatory_is_channel_DFS_rpcdata *, qcsapi_regulatory_is_channel_DFS_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_GET_DFS_CCE_CHANNELS_REMOTE 3301 +extern enum clnt_stat qcsapi_wifi_get_dfs_cce_channels_remote_1(qcsapi_wifi_get_dfs_cce_channels_rpcdata *, qcsapi_wifi_get_dfs_cce_channels_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_get_dfs_cce_channels_remote_1_svc(qcsapi_wifi_get_dfs_cce_channels_rpcdata *, qcsapi_wifi_get_dfs_cce_channels_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_GET_DFS_ALT_CHANNEL_REMOTE 3311 +extern enum clnt_stat qcsapi_wifi_get_dfs_alt_channel_remote_1(qcsapi_wifi_get_DFS_alt_channel_rpcdata *, qcsapi_wifi_get_DFS_alt_channel_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_get_dfs_alt_channel_remote_1_svc(qcsapi_wifi_get_DFS_alt_channel_rpcdata *, qcsapi_wifi_get_DFS_alt_channel_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_SET_DFS_ALT_CHANNEL_REMOTE 3321 +extern enum clnt_stat qcsapi_wifi_set_dfs_alt_channel_remote_1(qcsapi_wifi_set_DFS_alt_channel_rpcdata *, qcsapi_wifi_set_DFS_alt_channel_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_set_dfs_alt_channel_remote_1_svc(qcsapi_wifi_set_DFS_alt_channel_rpcdata *, qcsapi_wifi_set_DFS_alt_channel_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_START_DFS_REENTRY_REMOTE 3331 +extern enum clnt_stat qcsapi_wifi_start_dfs_reentry_remote_1(qcsapi_wifi_start_dfs_reentry_rpcdata *, qcsapi_wifi_start_dfs_reentry_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_start_dfs_reentry_remote_1_svc(qcsapi_wifi_start_dfs_reentry_rpcdata *, qcsapi_wifi_start_dfs_reentry_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_START_SCAN_EXT_REMOTE 3341 +extern enum clnt_stat qcsapi_wifi_start_scan_ext_remote_1(qcsapi_wifi_start_scan_ext_rpcdata *, qcsapi_wifi_start_scan_ext_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_start_scan_ext_remote_1_svc(qcsapi_wifi_start_scan_ext_rpcdata *, qcsapi_wifi_start_scan_ext_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_GET_CSW_RECORDS_REMOTE 3351 +extern enum clnt_stat qcsapi_wifi_get_csw_records_remote_1(qcsapi_wifi_get_csw_records_rpcdata *, qcsapi_wifi_get_csw_records_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_get_csw_records_remote_1_svc(qcsapi_wifi_get_csw_records_rpcdata *, qcsapi_wifi_get_csw_records_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_GET_RADAR_STATUS_REMOTE 3361 +extern enum clnt_stat qcsapi_wifi_get_radar_status_remote_1(qcsapi_wifi_get_radar_status_rpcdata *, qcsapi_wifi_get_radar_status_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_get_radar_status_remote_1_svc(qcsapi_wifi_get_radar_status_rpcdata *, qcsapi_wifi_get_radar_status_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_GET_CAC_STATUS_REMOTE 1191 +extern enum clnt_stat qcsapi_wifi_get_cac_status_remote_1(qcsapi_wifi_get_cac_status_rpcdata *, qcsapi_wifi_get_cac_status_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_get_cac_status_remote_1_svc(qcsapi_wifi_get_cac_status_rpcdata *, qcsapi_wifi_get_cac_status_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_GET_RESULTS_AP_SCAN_REMOTE 3371 +extern enum clnt_stat qcsapi_wifi_get_results_ap_scan_remote_1(qcsapi_wifi_get_results_AP_scan_rpcdata *, qcsapi_wifi_get_results_AP_scan_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_get_results_ap_scan_remote_1_svc(qcsapi_wifi_get_results_AP_scan_rpcdata *, qcsapi_wifi_get_results_AP_scan_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_GET_COUNT_APS_SCANNED_REMOTE 3381 +extern enum clnt_stat qcsapi_wifi_get_count_aps_scanned_remote_1(qcsapi_wifi_get_count_APs_scanned_rpcdata *, qcsapi_wifi_get_count_APs_scanned_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_get_count_aps_scanned_remote_1_svc(qcsapi_wifi_get_count_APs_scanned_rpcdata *, qcsapi_wifi_get_count_APs_scanned_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_GET_PROPERTIES_AP_REMOTE 3391 +extern enum clnt_stat qcsapi_wifi_get_properties_ap_remote_1(qcsapi_wifi_get_properties_AP_rpcdata *, qcsapi_wifi_get_properties_AP_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_get_properties_ap_remote_1_svc(qcsapi_wifi_get_properties_AP_rpcdata *, qcsapi_wifi_get_properties_AP_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_SET_SCAN_CHK_INV_REMOTE 4491 +extern enum clnt_stat qcsapi_wifi_set_scan_chk_inv_remote_1(qcsapi_wifi_set_scan_chk_inv_rpcdata *, qcsapi_wifi_set_scan_chk_inv_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_set_scan_chk_inv_remote_1_svc(qcsapi_wifi_set_scan_chk_inv_rpcdata *, qcsapi_wifi_set_scan_chk_inv_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_GET_SCAN_CHK_INV_REMOTE 4501 +extern enum clnt_stat qcsapi_wifi_get_scan_chk_inv_remote_1(qcsapi_wifi_get_scan_chk_inv_rpcdata *, qcsapi_wifi_get_scan_chk_inv_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_get_scan_chk_inv_remote_1_svc(qcsapi_wifi_get_scan_chk_inv_rpcdata *, qcsapi_wifi_get_scan_chk_inv_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_SET_SCAN_BUF_MAX_SIZE_REMOTE 4301 +extern enum clnt_stat qcsapi_wifi_set_scan_buf_max_size_remote_1(qcsapi_wifi_set_scan_buf_max_size_rpcdata *, qcsapi_wifi_set_scan_buf_max_size_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_set_scan_buf_max_size_remote_1_svc(qcsapi_wifi_set_scan_buf_max_size_rpcdata *, qcsapi_wifi_set_scan_buf_max_size_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_GET_SCAN_BUF_MAX_SIZE_REMOTE 4311 +extern enum clnt_stat qcsapi_wifi_get_scan_buf_max_size_remote_1(qcsapi_wifi_get_scan_buf_max_size_rpcdata *, qcsapi_wifi_get_scan_buf_max_size_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_get_scan_buf_max_size_remote_1_svc(qcsapi_wifi_get_scan_buf_max_size_rpcdata *, qcsapi_wifi_get_scan_buf_max_size_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_SET_SCAN_TABLE_MAX_LEN_REMOTE 4321 +extern enum clnt_stat qcsapi_wifi_set_scan_table_max_len_remote_1(qcsapi_wifi_set_scan_table_max_len_rpcdata *, qcsapi_wifi_set_scan_table_max_len_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_set_scan_table_max_len_remote_1_svc(qcsapi_wifi_set_scan_table_max_len_rpcdata *, qcsapi_wifi_set_scan_table_max_len_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_GET_SCAN_TABLE_MAX_LEN_REMOTE 4331 +extern enum clnt_stat qcsapi_wifi_get_scan_table_max_len_remote_1(qcsapi_wifi_get_scan_table_max_len_rpcdata *, qcsapi_wifi_get_scan_table_max_len_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_get_scan_table_max_len_remote_1_svc(qcsapi_wifi_get_scan_table_max_len_rpcdata *, qcsapi_wifi_get_scan_table_max_len_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_SET_DWELL_TIMES_REMOTE 1121 +extern enum clnt_stat qcsapi_wifi_set_dwell_times_remote_1(qcsapi_wifi_set_dwell_times_rpcdata *, qcsapi_wifi_set_dwell_times_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_set_dwell_times_remote_1_svc(qcsapi_wifi_set_dwell_times_rpcdata *, qcsapi_wifi_set_dwell_times_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_GET_DWELL_TIMES_REMOTE 1131 +extern enum clnt_stat qcsapi_wifi_get_dwell_times_remote_1(qcsapi_wifi_get_dwell_times_rpcdata *, qcsapi_wifi_get_dwell_times_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_get_dwell_times_remote_1_svc(qcsapi_wifi_get_dwell_times_rpcdata *, qcsapi_wifi_get_dwell_times_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_SET_BGSCAN_DWELL_TIMES_REMOTE 1141 +extern enum clnt_stat qcsapi_wifi_set_bgscan_dwell_times_remote_1(qcsapi_wifi_set_bgscan_dwell_times_rpcdata *, qcsapi_wifi_set_bgscan_dwell_times_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_set_bgscan_dwell_times_remote_1_svc(qcsapi_wifi_set_bgscan_dwell_times_rpcdata *, qcsapi_wifi_set_bgscan_dwell_times_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_GET_BGSCAN_DWELL_TIMES_REMOTE 1151 +extern enum clnt_stat qcsapi_wifi_get_bgscan_dwell_times_remote_1(qcsapi_wifi_get_bgscan_dwell_times_rpcdata *, qcsapi_wifi_get_bgscan_dwell_times_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_get_bgscan_dwell_times_remote_1_svc(qcsapi_wifi_get_bgscan_dwell_times_rpcdata *, qcsapi_wifi_get_bgscan_dwell_times_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_START_SCAN_REMOTE 1161 +extern enum clnt_stat qcsapi_wifi_start_scan_remote_1(qcsapi_wifi_start_scan_rpcdata *, qcsapi_wifi_start_scan_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_start_scan_remote_1_svc(qcsapi_wifi_start_scan_rpcdata *, qcsapi_wifi_start_scan_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_CANCEL_SCAN_REMOTE 1171 +extern enum clnt_stat qcsapi_wifi_cancel_scan_remote_1(qcsapi_wifi_cancel_scan_rpcdata *, qcsapi_wifi_cancel_scan_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_cancel_scan_remote_1_svc(qcsapi_wifi_cancel_scan_rpcdata *, qcsapi_wifi_cancel_scan_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_GET_SCAN_STATUS_REMOTE 1181 +extern enum clnt_stat qcsapi_wifi_get_scan_status_remote_1(qcsapi_wifi_get_scan_status_rpcdata *, qcsapi_wifi_get_scan_status_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_get_scan_status_remote_1_svc(qcsapi_wifi_get_scan_status_rpcdata *, qcsapi_wifi_get_scan_status_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_ENABLE_BGSCAN_REMOTE 1561 +extern enum clnt_stat qcsapi_wifi_enable_bgscan_remote_1(qcsapi_wifi_enable_bgscan_rpcdata *, qcsapi_wifi_enable_bgscan_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_enable_bgscan_remote_1_svc(qcsapi_wifi_enable_bgscan_rpcdata *, qcsapi_wifi_enable_bgscan_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_GET_BGSCAN_STATUS_REMOTE 1571 +extern enum clnt_stat qcsapi_wifi_get_bgscan_status_remote_1(qcsapi_wifi_get_bgscan_status_rpcdata *, qcsapi_wifi_get_bgscan_status_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_get_bgscan_status_remote_1_svc(qcsapi_wifi_get_bgscan_status_rpcdata *, qcsapi_wifi_get_bgscan_status_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_WAIT_SCAN_COMPLETES_REMOTE 1201 +extern enum clnt_stat qcsapi_wifi_wait_scan_completes_remote_1(qcsapi_wifi_wait_scan_completes_rpcdata *, qcsapi_wifi_wait_scan_completes_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_wait_scan_completes_remote_1_svc(qcsapi_wifi_wait_scan_completes_rpcdata *, qcsapi_wifi_wait_scan_completes_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_BACKOFF_FAIL_MAX_REMOTE 3401 +extern enum clnt_stat qcsapi_wifi_backoff_fail_max_remote_1(qcsapi_wifi_backoff_fail_max_rpcdata *, qcsapi_wifi_backoff_fail_max_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_backoff_fail_max_remote_1_svc(qcsapi_wifi_backoff_fail_max_rpcdata *, qcsapi_wifi_backoff_fail_max_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_BACKOFF_TIMEOUT_REMOTE 3411 +extern enum clnt_stat qcsapi_wifi_backoff_timeout_remote_1(qcsapi_wifi_backoff_timeout_rpcdata *, qcsapi_wifi_backoff_timeout_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_backoff_timeout_remote_1_svc(qcsapi_wifi_backoff_timeout_rpcdata *, qcsapi_wifi_backoff_timeout_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_GET_MCS_RATE_REMOTE 3421 +extern enum clnt_stat qcsapi_wifi_get_mcs_rate_remote_1(qcsapi_wifi_get_mcs_rate_rpcdata *, qcsapi_wifi_get_mcs_rate_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_get_mcs_rate_remote_1_svc(qcsapi_wifi_get_mcs_rate_rpcdata *, qcsapi_wifi_get_mcs_rate_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_SET_MCS_RATE_REMOTE 3431 +extern enum clnt_stat qcsapi_wifi_set_mcs_rate_remote_1(qcsapi_wifi_set_mcs_rate_rpcdata *, qcsapi_wifi_set_mcs_rate_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_set_mcs_rate_remote_1_svc(qcsapi_wifi_set_mcs_rate_rpcdata *, qcsapi_wifi_set_mcs_rate_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_SET_PAIRING_ID_REMOTE 3441 +extern enum clnt_stat qcsapi_wifi_set_pairing_id_remote_1(qcsapi_wifi_set_pairing_id_rpcdata *, qcsapi_wifi_set_pairing_id_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_set_pairing_id_remote_1_svc(qcsapi_wifi_set_pairing_id_rpcdata *, qcsapi_wifi_set_pairing_id_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_GET_PAIRING_ID_REMOTE 3451 +extern enum clnt_stat qcsapi_wifi_get_pairing_id_remote_1(qcsapi_wifi_get_pairing_id_rpcdata *, qcsapi_wifi_get_pairing_id_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_get_pairing_id_remote_1_svc(qcsapi_wifi_get_pairing_id_rpcdata *, qcsapi_wifi_get_pairing_id_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_SET_PAIRING_ENABLE_REMOTE 3461 +extern enum clnt_stat qcsapi_wifi_set_pairing_enable_remote_1(qcsapi_wifi_set_pairing_enable_rpcdata *, qcsapi_wifi_set_pairing_enable_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_set_pairing_enable_remote_1_svc(qcsapi_wifi_set_pairing_enable_rpcdata *, qcsapi_wifi_set_pairing_enable_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_GET_PAIRING_ENABLE_REMOTE 3471 +extern enum clnt_stat qcsapi_wifi_get_pairing_enable_remote_1(qcsapi_wifi_get_pairing_enable_rpcdata *, qcsapi_wifi_get_pairing_enable_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_get_pairing_enable_remote_1_svc(qcsapi_wifi_get_pairing_enable_rpcdata *, qcsapi_wifi_get_pairing_enable_rpcdata *, struct svc_req *); +#define QCSAPI_NON_WPS_SET_PP_ENABLE_REMOTE 3481 +extern enum clnt_stat qcsapi_non_wps_set_pp_enable_remote_1(qcsapi_non_wps_set_pp_enable_rpcdata *, qcsapi_non_wps_set_pp_enable_rpcdata *, CLIENT *); +extern bool_t qcsapi_non_wps_set_pp_enable_remote_1_svc(qcsapi_non_wps_set_pp_enable_rpcdata *, qcsapi_non_wps_set_pp_enable_rpcdata *, struct svc_req *); +#define QCSAPI_NON_WPS_GET_PP_ENABLE_REMOTE 3491 +extern enum clnt_stat qcsapi_non_wps_get_pp_enable_remote_1(qcsapi_non_wps_get_pp_enable_rpcdata *, qcsapi_non_wps_get_pp_enable_rpcdata *, CLIENT *); +extern bool_t qcsapi_non_wps_get_pp_enable_remote_1_svc(qcsapi_non_wps_get_pp_enable_rpcdata *, qcsapi_non_wps_get_pp_enable_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_SET_VENDOR_FIX_REMOTE 3501 +extern enum clnt_stat qcsapi_wifi_set_vendor_fix_remote_1(qcsapi_wifi_set_vendor_fix_rpcdata *, qcsapi_wifi_set_vendor_fix_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_set_vendor_fix_remote_1_svc(qcsapi_wifi_set_vendor_fix_rpcdata *, qcsapi_wifi_set_vendor_fix_rpcdata *, struct svc_req *); +#define QCSAPI_ERRNO_GET_MESSAGE_REMOTE 3511 +extern enum clnt_stat qcsapi_errno_get_message_remote_1(qcsapi_errno_get_message_rpcdata *, qcsapi_errno_get_message_rpcdata *, CLIENT *); +extern bool_t qcsapi_errno_get_message_remote_1_svc(qcsapi_errno_get_message_rpcdata *, qcsapi_errno_get_message_rpcdata *, struct svc_req *); +#define QCSAPI_GET_INTERFACE_STATS_REMOTE 3521 +extern enum clnt_stat qcsapi_get_interface_stats_remote_1(qcsapi_get_interface_stats_rpcdata *, qcsapi_get_interface_stats_rpcdata *, CLIENT *); +extern bool_t qcsapi_get_interface_stats_remote_1_svc(qcsapi_get_interface_stats_rpcdata *, qcsapi_get_interface_stats_rpcdata *, struct svc_req *); +#define QCSAPI_GET_PHY_STATS_REMOTE 3531 +extern enum clnt_stat qcsapi_get_phy_stats_remote_1(qcsapi_get_phy_stats_rpcdata *, qcsapi_get_phy_stats_rpcdata *, CLIENT *); +extern bool_t qcsapi_get_phy_stats_remote_1_svc(qcsapi_get_phy_stats_rpcdata *, qcsapi_get_phy_stats_rpcdata *, struct svc_req *); +#define QCSAPI_RESET_ALL_COUNTERS_REMOTE 3541 +extern enum clnt_stat qcsapi_reset_all_counters_remote_1(qcsapi_reset_all_counters_rpcdata *, qcsapi_reset_all_counters_rpcdata *, CLIENT *); +extern bool_t qcsapi_reset_all_counters_remote_1_svc(qcsapi_reset_all_counters_rpcdata *, qcsapi_reset_all_counters_rpcdata *, struct svc_req *); +#define QCSAPI_GET_UBOOT_INFO_REMOTE 661 +extern enum clnt_stat qcsapi_get_uboot_info_remote_1(qcsapi_get_uboot_info_rpcdata *, qcsapi_get_uboot_info_rpcdata *, CLIENT *); +extern bool_t qcsapi_get_uboot_info_remote_1_svc(qcsapi_get_uboot_info_rpcdata *, qcsapi_get_uboot_info_rpcdata *, struct svc_req *); +#define QCSAPI_FIRMWARE_GET_VERSION_REMOTE 3551 +extern enum clnt_stat qcsapi_firmware_get_version_remote_1(qcsapi_firmware_get_version_rpcdata *, qcsapi_firmware_get_version_rpcdata *, CLIENT *); +extern bool_t qcsapi_firmware_get_version_remote_1_svc(qcsapi_firmware_get_version_rpcdata *, qcsapi_firmware_get_version_rpcdata *, struct svc_req *); +#define QCSAPI_FLASH_IMAGE_UPDATE_REMOTE 3561 +extern enum clnt_stat qcsapi_flash_image_update_remote_1(qcsapi_flash_image_update_rpcdata *, qcsapi_flash_image_update_rpcdata *, CLIENT *); +extern bool_t qcsapi_flash_image_update_remote_1_svc(qcsapi_flash_image_update_rpcdata *, qcsapi_flash_image_update_rpcdata *, struct svc_req *); +#define QCSAPI_SEND_FILE_REMOTE 5961 +extern enum clnt_stat qcsapi_send_file_remote_1(qcsapi_send_file_rpcdata *, qcsapi_send_file_rpcdata *, CLIENT *); +extern bool_t qcsapi_send_file_remote_1_svc(qcsapi_send_file_rpcdata *, qcsapi_send_file_rpcdata *, struct svc_req *); +#define QCSAPI_PM_SET_MODE_REMOTE 3621 +extern enum clnt_stat qcsapi_pm_set_mode_remote_1(qcsapi_pm_set_mode_rpcdata *, qcsapi_pm_set_mode_rpcdata *, CLIENT *); +extern bool_t qcsapi_pm_set_mode_remote_1_svc(qcsapi_pm_set_mode_rpcdata *, qcsapi_pm_set_mode_rpcdata *, struct svc_req *); +#define QCSAPI_PM_GET_MODE_REMOTE 3631 +extern enum clnt_stat qcsapi_pm_get_mode_remote_1(qcsapi_pm_get_mode_rpcdata *, qcsapi_pm_get_mode_rpcdata *, CLIENT *); +extern bool_t qcsapi_pm_get_mode_remote_1_svc(qcsapi_pm_get_mode_rpcdata *, qcsapi_pm_get_mode_rpcdata *, struct svc_req *); +#define QCSAPI_GET_QPM_LEVEL_REMOTE 3641 +extern enum clnt_stat qcsapi_get_qpm_level_remote_1(qcsapi_get_qpm_level_rpcdata *, qcsapi_get_qpm_level_rpcdata *, CLIENT *); +extern bool_t qcsapi_get_qpm_level_remote_1_svc(qcsapi_get_qpm_level_rpcdata *, qcsapi_get_qpm_level_rpcdata *, struct svc_req *); +#define QCSAPI_SET_HOST_STATE_REMOTE 4151 +extern enum clnt_stat qcsapi_set_host_state_remote_1(qcsapi_set_host_state_rpcdata *, qcsapi_set_host_state_rpcdata *, CLIENT *); +extern bool_t qcsapi_set_host_state_remote_1_svc(qcsapi_set_host_state_rpcdata *, qcsapi_set_host_state_rpcdata *, struct svc_req *); +#define QCSAPI_QTM_GET_STATE_REMOTE 3651 +extern enum clnt_stat qcsapi_qtm_get_state_remote_1(qcsapi_qtm_get_state_rpcdata *, qcsapi_qtm_get_state_rpcdata *, CLIENT *); +extern bool_t qcsapi_qtm_get_state_remote_1_svc(qcsapi_qtm_get_state_rpcdata *, qcsapi_qtm_get_state_rpcdata *, struct svc_req *); +#define QCSAPI_QTM_GET_STATE_ALL_REMOTE 3661 +extern enum clnt_stat qcsapi_qtm_get_state_all_remote_1(qcsapi_qtm_get_state_all_rpcdata *, qcsapi_qtm_get_state_all_rpcdata *, CLIENT *); +extern bool_t qcsapi_qtm_get_state_all_remote_1_svc(qcsapi_qtm_get_state_all_rpcdata *, qcsapi_qtm_get_state_all_rpcdata *, struct svc_req *); +#define QCSAPI_QTM_SET_STATE_REMOTE 3671 +extern enum clnt_stat qcsapi_qtm_set_state_remote_1(qcsapi_qtm_set_state_rpcdata *, qcsapi_qtm_set_state_rpcdata *, CLIENT *); +extern bool_t qcsapi_qtm_set_state_remote_1_svc(qcsapi_qtm_set_state_rpcdata *, qcsapi_qtm_set_state_rpcdata *, struct svc_req *); +#define QCSAPI_QTM_GET_CONFIG_REMOTE 3681 +extern enum clnt_stat qcsapi_qtm_get_config_remote_1(qcsapi_qtm_get_config_rpcdata *, qcsapi_qtm_get_config_rpcdata *, CLIENT *); +extern bool_t qcsapi_qtm_get_config_remote_1_svc(qcsapi_qtm_get_config_rpcdata *, qcsapi_qtm_get_config_rpcdata *, struct svc_req *); +#define QCSAPI_QTM_GET_CONFIG_ALL_REMOTE 3691 +extern enum clnt_stat qcsapi_qtm_get_config_all_remote_1(qcsapi_qtm_get_config_all_rpcdata *, qcsapi_qtm_get_config_all_rpcdata *, CLIENT *); +extern bool_t qcsapi_qtm_get_config_all_remote_1_svc(qcsapi_qtm_get_config_all_rpcdata *, qcsapi_qtm_get_config_all_rpcdata *, struct svc_req *); +#define QCSAPI_QTM_SET_CONFIG_REMOTE 3701 +extern enum clnt_stat qcsapi_qtm_set_config_remote_1(qcsapi_qtm_set_config_rpcdata *, qcsapi_qtm_set_config_rpcdata *, CLIENT *); +extern bool_t qcsapi_qtm_set_config_remote_1_svc(qcsapi_qtm_set_config_rpcdata *, qcsapi_qtm_set_config_rpcdata *, struct svc_req *); +#define QCSAPI_QTM_ADD_RULE_REMOTE 3751 +extern enum clnt_stat qcsapi_qtm_add_rule_remote_1(qcsapi_qtm_add_rule_rpcdata *, qcsapi_qtm_add_rule_rpcdata *, CLIENT *); +extern bool_t qcsapi_qtm_add_rule_remote_1_svc(qcsapi_qtm_add_rule_rpcdata *, qcsapi_qtm_add_rule_rpcdata *, struct svc_req *); +#define QCSAPI_QTM_DEL_RULE_REMOTE 3761 +extern enum clnt_stat qcsapi_qtm_del_rule_remote_1(qcsapi_qtm_del_rule_rpcdata *, qcsapi_qtm_del_rule_rpcdata *, CLIENT *); +extern bool_t qcsapi_qtm_del_rule_remote_1_svc(qcsapi_qtm_del_rule_rpcdata *, qcsapi_qtm_del_rule_rpcdata *, struct svc_req *); +#define QCSAPI_QTM_DEL_RULE_INDEX_REMOTE 3771 +extern enum clnt_stat qcsapi_qtm_del_rule_index_remote_1(qcsapi_qtm_del_rule_index_rpcdata *, qcsapi_qtm_del_rule_index_rpcdata *, CLIENT *); +extern bool_t qcsapi_qtm_del_rule_index_remote_1_svc(qcsapi_qtm_del_rule_index_rpcdata *, qcsapi_qtm_del_rule_index_rpcdata *, struct svc_req *); +#define QCSAPI_QTM_GET_RULE_REMOTE 3781 +extern enum clnt_stat qcsapi_qtm_get_rule_remote_1(qcsapi_qtm_get_rule_rpcdata *, qcsapi_qtm_get_rule_rpcdata *, CLIENT *); +extern bool_t qcsapi_qtm_get_rule_remote_1_svc(qcsapi_qtm_get_rule_rpcdata *, qcsapi_qtm_get_rule_rpcdata *, struct svc_req *); +#define QCSAPI_QTM_GET_STRM_REMOTE 3791 +extern enum clnt_stat qcsapi_qtm_get_strm_remote_1(qcsapi_qtm_get_strm_rpcdata *, qcsapi_qtm_get_strm_rpcdata *, CLIENT *); +extern bool_t qcsapi_qtm_get_strm_remote_1_svc(qcsapi_qtm_get_strm_rpcdata *, qcsapi_qtm_get_strm_rpcdata *, struct svc_req *); +#define QCSAPI_QTM_GET_STATS_REMOTE 3801 +extern enum clnt_stat qcsapi_qtm_get_stats_remote_1(qcsapi_qtm_get_stats_rpcdata *, qcsapi_qtm_get_stats_rpcdata *, CLIENT *); +extern bool_t qcsapi_qtm_get_stats_remote_1_svc(qcsapi_qtm_get_stats_rpcdata *, qcsapi_qtm_get_stats_rpcdata *, struct svc_req *); +#define QCSAPI_QTM_GET_INACTIVE_FLAGS_REMOTE 3811 +extern enum clnt_stat qcsapi_qtm_get_inactive_flags_remote_1(qcsapi_qtm_get_inactive_flags_rpcdata *, qcsapi_qtm_get_inactive_flags_rpcdata *, CLIENT *); +extern bool_t qcsapi_qtm_get_inactive_flags_remote_1_svc(qcsapi_qtm_get_inactive_flags_rpcdata *, qcsapi_qtm_get_inactive_flags_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_RUN_SCRIPT_REMOTE 3821 +extern enum clnt_stat qcsapi_wifi_run_script_remote_1(qcsapi_wifi_run_script_rpcdata *, qcsapi_wifi_run_script_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_run_script_remote_1_svc(qcsapi_wifi_run_script_rpcdata *, qcsapi_wifi_run_script_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_TEST_TRAFFIC_REMOTE 3831 +extern enum clnt_stat qcsapi_wifi_test_traffic_remote_1(qcsapi_wifi_test_traffic_rpcdata *, qcsapi_wifi_test_traffic_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_test_traffic_remote_1_svc(qcsapi_wifi_test_traffic_rpcdata *, qcsapi_wifi_test_traffic_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_ADD_IPFF_REMOTE 3841 +extern enum clnt_stat qcsapi_wifi_add_ipff_remote_1(qcsapi_wifi_add_ipff_rpcdata *, qcsapi_wifi_add_ipff_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_add_ipff_remote_1_svc(qcsapi_wifi_add_ipff_rpcdata *, qcsapi_wifi_add_ipff_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_DEL_IPFF_REMOTE 3851 +extern enum clnt_stat qcsapi_wifi_del_ipff_remote_1(qcsapi_wifi_del_ipff_rpcdata *, qcsapi_wifi_del_ipff_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_del_ipff_remote_1_svc(qcsapi_wifi_del_ipff_rpcdata *, qcsapi_wifi_del_ipff_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_GET_IPFF_REMOTE 3861 +extern enum clnt_stat qcsapi_wifi_get_ipff_remote_1(qcsapi_wifi_get_ipff_rpcdata *, qcsapi_wifi_get_ipff_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_get_ipff_remote_1_svc(qcsapi_wifi_get_ipff_rpcdata *, qcsapi_wifi_get_ipff_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_GET_RTS_THRESHOLD_REMOTE 3871 +extern enum clnt_stat qcsapi_wifi_get_rts_threshold_remote_1(qcsapi_wifi_get_rts_threshold_rpcdata *, qcsapi_wifi_get_rts_threshold_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_get_rts_threshold_remote_1_svc(qcsapi_wifi_get_rts_threshold_rpcdata *, qcsapi_wifi_get_rts_threshold_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_SET_RTS_THRESHOLD_REMOTE 3881 +extern enum clnt_stat qcsapi_wifi_set_rts_threshold_remote_1(qcsapi_wifi_set_rts_threshold_rpcdata *, qcsapi_wifi_set_rts_threshold_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_set_rts_threshold_remote_1_svc(qcsapi_wifi_set_rts_threshold_rpcdata *, qcsapi_wifi_set_rts_threshold_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_SET_NSS_CAP_REMOTE 4131 +extern enum clnt_stat qcsapi_wifi_set_nss_cap_remote_1(qcsapi_wifi_set_nss_cap_rpcdata *, qcsapi_wifi_set_nss_cap_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_set_nss_cap_remote_1_svc(qcsapi_wifi_set_nss_cap_rpcdata *, qcsapi_wifi_set_nss_cap_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_GET_NSS_CAP_REMOTE 4141 +extern enum clnt_stat qcsapi_wifi_get_nss_cap_remote_1(qcsapi_wifi_get_nss_cap_rpcdata *, qcsapi_wifi_get_nss_cap_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_get_nss_cap_remote_1_svc(qcsapi_wifi_get_nss_cap_rpcdata *, qcsapi_wifi_get_nss_cap_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_GET_TX_AMSDU_REMOTE 4171 +extern enum clnt_stat qcsapi_wifi_get_tx_amsdu_remote_1(qcsapi_wifi_get_tx_amsdu_rpcdata *, qcsapi_wifi_get_tx_amsdu_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_get_tx_amsdu_remote_1_svc(qcsapi_wifi_get_tx_amsdu_rpcdata *, qcsapi_wifi_get_tx_amsdu_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_SET_TX_AMSDU_REMOTE 4181 +extern enum clnt_stat qcsapi_wifi_set_tx_amsdu_remote_1(qcsapi_wifi_set_tx_amsdu_rpcdata *, qcsapi_wifi_set_tx_amsdu_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_set_tx_amsdu_remote_1_svc(qcsapi_wifi_set_tx_amsdu_rpcdata *, qcsapi_wifi_set_tx_amsdu_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_GET_DISASSOC_REASON_REMOTE 4271 +extern enum clnt_stat qcsapi_wifi_get_disassoc_reason_remote_1(qcsapi_wifi_get_disassoc_reason_rpcdata *, qcsapi_wifi_get_disassoc_reason_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_get_disassoc_reason_remote_1_svc(qcsapi_wifi_get_disassoc_reason_rpcdata *, qcsapi_wifi_get_disassoc_reason_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_BLOCK_BSS_REMOTE 6201 +extern enum clnt_stat qcsapi_wifi_block_bss_remote_1(qcsapi_wifi_block_bss_rpcdata *, qcsapi_wifi_block_bss_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_block_bss_remote_1_svc(qcsapi_wifi_block_bss_rpcdata *, qcsapi_wifi_block_bss_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_VERIFY_REPEATER_MODE_REMOTE 6171 +extern enum clnt_stat qcsapi_wifi_verify_repeater_mode_remote_1(qcsapi_wifi_verify_repeater_mode_rpcdata *, qcsapi_wifi_verify_repeater_mode_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_verify_repeater_mode_remote_1_svc(qcsapi_wifi_verify_repeater_mode_rpcdata *, qcsapi_wifi_verify_repeater_mode_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_SET_AP_INTERFACE_NAME_REMOTE 6181 +extern enum clnt_stat qcsapi_wifi_set_ap_interface_name_remote_1(qcsapi_wifi_set_ap_interface_name_rpcdata *, qcsapi_wifi_set_ap_interface_name_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_set_ap_interface_name_remote_1_svc(qcsapi_wifi_set_ap_interface_name_rpcdata *, qcsapi_wifi_set_ap_interface_name_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_GET_AP_INTERFACE_NAME_REMOTE 6191 +extern enum clnt_stat qcsapi_wifi_get_ap_interface_name_remote_1(qcsapi_wifi_get_ap_interface_name_rpcdata *, qcsapi_wifi_get_ap_interface_name_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_get_ap_interface_name_remote_1_svc(qcsapi_wifi_get_ap_interface_name_rpcdata *, qcsapi_wifi_get_ap_interface_name_rpcdata *, struct svc_req *); +#define QCSAPI_GET_TEMPERATURE_INFO_REMOTE 3892 +extern enum clnt_stat qcsapi_get_temperature_info_remote_1(qcsapi_get_temperature_info_rpcdata *, qcsapi_get_temperature_info_rpcdata *, CLIENT *); +extern bool_t qcsapi_get_temperature_info_remote_1_svc(qcsapi_get_temperature_info_rpcdata *, qcsapi_get_temperature_info_rpcdata *, struct svc_req *); +#define QCSAPI_CALCMD_SET_TEST_MODE_REMOTE 3901 +extern enum clnt_stat qcsapi_calcmd_set_test_mode_remote_1(qcsapi_calcmd_set_test_mode_rpcdata *, qcsapi_calcmd_set_test_mode_rpcdata *, CLIENT *); +extern bool_t qcsapi_calcmd_set_test_mode_remote_1_svc(qcsapi_calcmd_set_test_mode_rpcdata *, qcsapi_calcmd_set_test_mode_rpcdata *, struct svc_req *); +#define QCSAPI_CALCMD_SHOW_TEST_PACKET_REMOTE 3911 +extern enum clnt_stat qcsapi_calcmd_show_test_packet_remote_1(qcsapi_calcmd_show_test_packet_rpcdata *, qcsapi_calcmd_show_test_packet_rpcdata *, CLIENT *); +extern bool_t qcsapi_calcmd_show_test_packet_remote_1_svc(qcsapi_calcmd_show_test_packet_rpcdata *, qcsapi_calcmd_show_test_packet_rpcdata *, struct svc_req *); +#define QCSAPI_CALCMD_SEND_TEST_PACKET_REMOTE 3921 +extern enum clnt_stat qcsapi_calcmd_send_test_packet_remote_1(qcsapi_calcmd_send_test_packet_rpcdata *, qcsapi_calcmd_send_test_packet_rpcdata *, CLIENT *); +extern bool_t qcsapi_calcmd_send_test_packet_remote_1_svc(qcsapi_calcmd_send_test_packet_rpcdata *, qcsapi_calcmd_send_test_packet_rpcdata *, struct svc_req *); +#define QCSAPI_CALCMD_STOP_TEST_PACKET_REMOTE 3931 +extern enum clnt_stat qcsapi_calcmd_stop_test_packet_remote_1(qcsapi_calcmd_stop_test_packet_rpcdata *, qcsapi_calcmd_stop_test_packet_rpcdata *, CLIENT *); +extern bool_t qcsapi_calcmd_stop_test_packet_remote_1_svc(qcsapi_calcmd_stop_test_packet_rpcdata *, qcsapi_calcmd_stop_test_packet_rpcdata *, struct svc_req *); +#define QCSAPI_CALCMD_SEND_DC_CW_SIGNAL_REMOTE 3941 +extern enum clnt_stat qcsapi_calcmd_send_dc_cw_signal_remote_1(qcsapi_calcmd_send_dc_cw_signal_rpcdata *, qcsapi_calcmd_send_dc_cw_signal_rpcdata *, CLIENT *); +extern bool_t qcsapi_calcmd_send_dc_cw_signal_remote_1_svc(qcsapi_calcmd_send_dc_cw_signal_rpcdata *, qcsapi_calcmd_send_dc_cw_signal_rpcdata *, struct svc_req *); +#define QCSAPI_CALCMD_STOP_DC_CW_SIGNAL_REMOTE 3951 +extern enum clnt_stat qcsapi_calcmd_stop_dc_cw_signal_remote_1(qcsapi_calcmd_stop_dc_cw_signal_rpcdata *, qcsapi_calcmd_stop_dc_cw_signal_rpcdata *, CLIENT *); +extern bool_t qcsapi_calcmd_stop_dc_cw_signal_remote_1_svc(qcsapi_calcmd_stop_dc_cw_signal_rpcdata *, qcsapi_calcmd_stop_dc_cw_signal_rpcdata *, struct svc_req *); +#define QCSAPI_CALCMD_GET_TEST_MODE_ANTENNA_SEL_REMOTE 3961 +extern enum clnt_stat qcsapi_calcmd_get_test_mode_antenna_sel_remote_1(qcsapi_calcmd_get_test_mode_antenna_sel_rpcdata *, qcsapi_calcmd_get_test_mode_antenna_sel_rpcdata *, CLIENT *); +extern bool_t qcsapi_calcmd_get_test_mode_antenna_sel_remote_1_svc(qcsapi_calcmd_get_test_mode_antenna_sel_rpcdata *, qcsapi_calcmd_get_test_mode_antenna_sel_rpcdata *, struct svc_req *); +#define QCSAPI_CALCMD_GET_TEST_MODE_MCS_REMOTE 3971 +extern enum clnt_stat qcsapi_calcmd_get_test_mode_mcs_remote_1(qcsapi_calcmd_get_test_mode_mcs_rpcdata *, qcsapi_calcmd_get_test_mode_mcs_rpcdata *, CLIENT *); +extern bool_t qcsapi_calcmd_get_test_mode_mcs_remote_1_svc(qcsapi_calcmd_get_test_mode_mcs_rpcdata *, qcsapi_calcmd_get_test_mode_mcs_rpcdata *, struct svc_req *); +#define QCSAPI_CALCMD_GET_TEST_MODE_BW_REMOTE 3981 +extern enum clnt_stat qcsapi_calcmd_get_test_mode_bw_remote_1(qcsapi_calcmd_get_test_mode_bw_rpcdata *, qcsapi_calcmd_get_test_mode_bw_rpcdata *, CLIENT *); +extern bool_t qcsapi_calcmd_get_test_mode_bw_remote_1_svc(qcsapi_calcmd_get_test_mode_bw_rpcdata *, qcsapi_calcmd_get_test_mode_bw_rpcdata *, struct svc_req *); +#define QCSAPI_CALCMD_GET_TX_POWER_REMOTE 3991 +extern enum clnt_stat qcsapi_calcmd_get_tx_power_remote_1(qcsapi_calcmd_get_tx_power_rpcdata *, qcsapi_calcmd_get_tx_power_rpcdata *, CLIENT *); +extern bool_t qcsapi_calcmd_get_tx_power_remote_1_svc(qcsapi_calcmd_get_tx_power_rpcdata *, qcsapi_calcmd_get_tx_power_rpcdata *, struct svc_req *); +#define QCSAPI_CALCMD_SET_TX_POWER_REMOTE 4001 +extern enum clnt_stat qcsapi_calcmd_set_tx_power_remote_1(qcsapi_calcmd_set_tx_power_rpcdata *, qcsapi_calcmd_set_tx_power_rpcdata *, CLIENT *); +extern bool_t qcsapi_calcmd_set_tx_power_remote_1_svc(qcsapi_calcmd_set_tx_power_rpcdata *, qcsapi_calcmd_set_tx_power_rpcdata *, struct svc_req *); +#define QCSAPI_CALCMD_GET_TEST_MODE_RSSI_REMOTE 4011 +extern enum clnt_stat qcsapi_calcmd_get_test_mode_rssi_remote_1(qcsapi_calcmd_get_test_mode_rssi_rpcdata *, qcsapi_calcmd_get_test_mode_rssi_rpcdata *, CLIENT *); +extern bool_t qcsapi_calcmd_get_test_mode_rssi_remote_1_svc(qcsapi_calcmd_get_test_mode_rssi_rpcdata *, qcsapi_calcmd_get_test_mode_rssi_rpcdata *, struct svc_req *); +#define QCSAPI_CALCMD_SET_MAC_FILTER_REMOTE 4021 +extern enum clnt_stat qcsapi_calcmd_set_mac_filter_remote_1(qcsapi_calcmd_set_mac_filter_rpcdata *, qcsapi_calcmd_set_mac_filter_rpcdata *, CLIENT *); +extern bool_t qcsapi_calcmd_set_mac_filter_remote_1_svc(qcsapi_calcmd_set_mac_filter_rpcdata *, qcsapi_calcmd_set_mac_filter_rpcdata *, struct svc_req *); +#define QCSAPI_CALCMD_GET_ANTENNA_COUNT_REMOTE 4031 +extern enum clnt_stat qcsapi_calcmd_get_antenna_count_remote_1(qcsapi_calcmd_get_antenna_count_rpcdata *, qcsapi_calcmd_get_antenna_count_rpcdata *, CLIENT *); +extern bool_t qcsapi_calcmd_get_antenna_count_remote_1_svc(qcsapi_calcmd_get_antenna_count_rpcdata *, qcsapi_calcmd_get_antenna_count_rpcdata *, struct svc_req *); +#define QCSAPI_CALCMD_CLEAR_COUNTER_REMOTE 4041 +extern enum clnt_stat qcsapi_calcmd_clear_counter_remote_1(qcsapi_calcmd_clear_counter_rpcdata *, qcsapi_calcmd_clear_counter_rpcdata *, CLIENT *); +extern bool_t qcsapi_calcmd_clear_counter_remote_1_svc(qcsapi_calcmd_clear_counter_rpcdata *, qcsapi_calcmd_clear_counter_rpcdata *, struct svc_req *); +#define QCSAPI_CALCMD_GET_INFO_REMOTE 4051 +extern enum clnt_stat qcsapi_calcmd_get_info_remote_1(qcsapi_calcmd_get_info_rpcdata *, qcsapi_calcmd_get_info_rpcdata *, CLIENT *); +extern bool_t qcsapi_calcmd_get_info_remote_1_svc(qcsapi_calcmd_get_info_rpcdata *, qcsapi_calcmd_get_info_rpcdata *, struct svc_req *); +#define QCSAPI_WOWLAN_SET_MATCH_TYPE_REMOTE 4161 +extern enum clnt_stat qcsapi_wowlan_set_match_type_remote_1(qcsapi_wowlan_set_match_type_rpcdata *, qcsapi_wowlan_set_match_type_rpcdata *, CLIENT *); +extern bool_t qcsapi_wowlan_set_match_type_remote_1_svc(qcsapi_wowlan_set_match_type_rpcdata *, qcsapi_wowlan_set_match_type_rpcdata *, struct svc_req *); +#define QCSAPI_WOWLAN_SET_L2_TYPE_REMOTE 4191 +extern enum clnt_stat qcsapi_wowlan_set_l2_type_remote_1(qcsapi_wowlan_set_L2_type_rpcdata *, qcsapi_wowlan_set_L2_type_rpcdata *, CLIENT *); +extern bool_t qcsapi_wowlan_set_l2_type_remote_1_svc(qcsapi_wowlan_set_L2_type_rpcdata *, qcsapi_wowlan_set_L2_type_rpcdata *, struct svc_req *); +#define QCSAPI_WOWLAN_SET_UDP_PORT_REMOTE 4201 +extern enum clnt_stat qcsapi_wowlan_set_udp_port_remote_1(qcsapi_wowlan_set_udp_port_rpcdata *, qcsapi_wowlan_set_udp_port_rpcdata *, CLIENT *); +extern bool_t qcsapi_wowlan_set_udp_port_remote_1_svc(qcsapi_wowlan_set_udp_port_rpcdata *, qcsapi_wowlan_set_udp_port_rpcdata *, struct svc_req *); +#define QCSAPI_WOWLAN_SET_MAGIC_PATTERN_REMOTE 4211 +extern enum clnt_stat qcsapi_wowlan_set_magic_pattern_remote_1(qcsapi_wowlan_set_magic_pattern_rpcdata *, qcsapi_wowlan_set_magic_pattern_rpcdata *, CLIENT *); +extern bool_t qcsapi_wowlan_set_magic_pattern_remote_1_svc(qcsapi_wowlan_set_magic_pattern_rpcdata *, qcsapi_wowlan_set_magic_pattern_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_WOWLAN_GET_HOST_STATE_REMOTE 4221 +extern enum clnt_stat qcsapi_wifi_wowlan_get_host_state_remote_1(qcsapi_wifi_wowlan_get_host_state_rpcdata *, qcsapi_wifi_wowlan_get_host_state_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_wowlan_get_host_state_remote_1_svc(qcsapi_wifi_wowlan_get_host_state_rpcdata *, qcsapi_wifi_wowlan_get_host_state_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_WOWLAN_GET_MATCH_TYPE_REMOTE 4231 +extern enum clnt_stat qcsapi_wifi_wowlan_get_match_type_remote_1(qcsapi_wifi_wowlan_get_match_type_rpcdata *, qcsapi_wifi_wowlan_get_match_type_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_wowlan_get_match_type_remote_1_svc(qcsapi_wifi_wowlan_get_match_type_rpcdata *, qcsapi_wifi_wowlan_get_match_type_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_WOWLAN_GET_L2_TYPE_REMOTE 4241 +extern enum clnt_stat qcsapi_wifi_wowlan_get_l2_type_remote_1(qcsapi_wifi_wowlan_get_l2_type_rpcdata *, qcsapi_wifi_wowlan_get_l2_type_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_wowlan_get_l2_type_remote_1_svc(qcsapi_wifi_wowlan_get_l2_type_rpcdata *, qcsapi_wifi_wowlan_get_l2_type_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_WOWLAN_GET_UDP_PORT_REMOTE 4251 +extern enum clnt_stat qcsapi_wifi_wowlan_get_udp_port_remote_1(qcsapi_wifi_wowlan_get_udp_port_rpcdata *, qcsapi_wifi_wowlan_get_udp_port_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_wowlan_get_udp_port_remote_1_svc(qcsapi_wifi_wowlan_get_udp_port_rpcdata *, qcsapi_wifi_wowlan_get_udp_port_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_WOWLAN_GET_MAGIC_PATTERN_REMOTE 4261 +extern enum clnt_stat qcsapi_wifi_wowlan_get_magic_pattern_remote_1(qcsapi_wifi_wowlan_get_magic_pattern_rpcdata *, qcsapi_wifi_wowlan_get_magic_pattern_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_wowlan_get_magic_pattern_remote_1_svc(qcsapi_wifi_wowlan_get_magic_pattern_rpcdata *, qcsapi_wifi_wowlan_get_magic_pattern_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_SET_ENABLE_MU_REMOTE 5861 +extern enum clnt_stat qcsapi_wifi_set_enable_mu_remote_1(qcsapi_wifi_set_enable_mu_rpcdata *, qcsapi_wifi_set_enable_mu_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_set_enable_mu_remote_1_svc(qcsapi_wifi_set_enable_mu_rpcdata *, qcsapi_wifi_set_enable_mu_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_GET_ENABLE_MU_REMOTE 5871 +extern enum clnt_stat qcsapi_wifi_get_enable_mu_remote_1(qcsapi_wifi_get_enable_mu_rpcdata *, qcsapi_wifi_get_enable_mu_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_get_enable_mu_remote_1_svc(qcsapi_wifi_get_enable_mu_rpcdata *, qcsapi_wifi_get_enable_mu_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_SET_MU_USE_PRECODE_REMOTE 5881 +extern enum clnt_stat qcsapi_wifi_set_mu_use_precode_remote_1(qcsapi_wifi_set_mu_use_precode_rpcdata *, qcsapi_wifi_set_mu_use_precode_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_set_mu_use_precode_remote_1_svc(qcsapi_wifi_set_mu_use_precode_rpcdata *, qcsapi_wifi_set_mu_use_precode_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_GET_MU_USE_PRECODE_REMOTE 5891 +extern enum clnt_stat qcsapi_wifi_get_mu_use_precode_remote_1(qcsapi_wifi_get_mu_use_precode_rpcdata *, qcsapi_wifi_get_mu_use_precode_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_get_mu_use_precode_remote_1_svc(qcsapi_wifi_get_mu_use_precode_rpcdata *, qcsapi_wifi_get_mu_use_precode_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_SET_MU_USE_EQ_REMOTE 5901 +extern enum clnt_stat qcsapi_wifi_set_mu_use_eq_remote_1(qcsapi_wifi_set_mu_use_eq_rpcdata *, qcsapi_wifi_set_mu_use_eq_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_set_mu_use_eq_remote_1_svc(qcsapi_wifi_set_mu_use_eq_rpcdata *, qcsapi_wifi_set_mu_use_eq_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_GET_MU_USE_EQ_REMOTE 5911 +extern enum clnt_stat qcsapi_wifi_get_mu_use_eq_remote_1(qcsapi_wifi_get_mu_use_eq_rpcdata *, qcsapi_wifi_get_mu_use_eq_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_get_mu_use_eq_remote_1_svc(qcsapi_wifi_get_mu_use_eq_rpcdata *, qcsapi_wifi_get_mu_use_eq_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_GET_MU_GROUPS_REMOTE 5921 +extern enum clnt_stat qcsapi_wifi_get_mu_groups_remote_1(qcsapi_wifi_get_mu_groups_rpcdata *, qcsapi_wifi_get_mu_groups_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_get_mu_groups_remote_1_svc(qcsapi_wifi_get_mu_groups_rpcdata *, qcsapi_wifi_get_mu_groups_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_ENABLE_TDLS_REMOTE 4111 +extern enum clnt_stat qcsapi_wifi_enable_tdls_remote_1(qcsapi_wifi_enable_tdls_rpcdata *, qcsapi_wifi_enable_tdls_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_enable_tdls_remote_1_svc(qcsapi_wifi_enable_tdls_rpcdata *, qcsapi_wifi_enable_tdls_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_ENABLE_TDLS_OVER_QHOP_REMOTE 4381 +extern enum clnt_stat qcsapi_wifi_enable_tdls_over_qhop_remote_1(qcsapi_wifi_enable_tdls_over_qhop_rpcdata *, qcsapi_wifi_enable_tdls_over_qhop_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_enable_tdls_over_qhop_remote_1_svc(qcsapi_wifi_enable_tdls_over_qhop_rpcdata *, qcsapi_wifi_enable_tdls_over_qhop_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_GET_TDLS_STATUS_REMOTE 4341 +extern enum clnt_stat qcsapi_wifi_get_tdls_status_remote_1(qcsapi_wifi_get_tdls_status_rpcdata *, qcsapi_wifi_get_tdls_status_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_get_tdls_status_remote_1_svc(qcsapi_wifi_get_tdls_status_rpcdata *, qcsapi_wifi_get_tdls_status_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_SET_TDLS_PARAMS_REMOTE 4351 +extern enum clnt_stat qcsapi_wifi_set_tdls_params_remote_1(qcsapi_wifi_set_tdls_params_rpcdata *, qcsapi_wifi_set_tdls_params_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_set_tdls_params_remote_1_svc(qcsapi_wifi_set_tdls_params_rpcdata *, qcsapi_wifi_set_tdls_params_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_GET_TDLS_PARAMS_REMOTE 4361 +extern enum clnt_stat qcsapi_wifi_get_tdls_params_remote_1(qcsapi_wifi_get_tdls_params_rpcdata *, qcsapi_wifi_get_tdls_params_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_get_tdls_params_remote_1_svc(qcsapi_wifi_get_tdls_params_rpcdata *, qcsapi_wifi_get_tdls_params_rpcdata *, struct svc_req *); +#define QCSAPI_WIFI_TDLS_OPERATE_REMOTE 4371 +extern enum clnt_stat qcsapi_wifi_tdls_operate_remote_1(qcsapi_wifi_tdls_operate_rpcdata *, qcsapi_wifi_tdls_operate_rpcdata *, CLIENT *); +extern bool_t qcsapi_wifi_tdls_operate_remote_1_svc(qcsapi_wifi_tdls_operate_rpcdata *, qcsapi_wifi_tdls_operate_rpcdata *, struct svc_req *); +extern int qcsapi_prog_1_freeresult (SVCXPRT *, xdrproc_t, caddr_t); + +#else /* K&R C */ +#define QCSAPI_BOOTCFG_GET_PARAMETER_REMOTE 1 +extern enum clnt_stat qcsapi_bootcfg_get_parameter_remote_1(); +extern bool_t qcsapi_bootcfg_get_parameter_remote_1_svc(); +#define QCSAPI_BOOTCFG_UPDATE_PARAMETER_REMOTE 11 +extern enum clnt_stat qcsapi_bootcfg_update_parameter_remote_1(); +extern bool_t qcsapi_bootcfg_update_parameter_remote_1_svc(); +#define QCSAPI_BOOTCFG_COMMIT_REMOTE 21 +extern enum clnt_stat qcsapi_bootcfg_commit_remote_1(); +extern bool_t qcsapi_bootcfg_commit_remote_1_svc(); +#define QCSAPI_TELNET_ENABLE_REMOTE 31 +extern enum clnt_stat qcsapi_telnet_enable_remote_1(); +extern bool_t qcsapi_telnet_enable_remote_1_svc(); +#define QCSAPI_GET_SERVICE_NAME_ENUM_REMOTE 5651 +extern enum clnt_stat qcsapi_get_service_name_enum_remote_1(); +extern bool_t qcsapi_get_service_name_enum_remote_1_svc(); +#define QCSAPI_GET_SERVICE_ACTION_ENUM_REMOTE 5661 +extern enum clnt_stat qcsapi_get_service_action_enum_remote_1(); +extern bool_t qcsapi_get_service_action_enum_remote_1_svc(); +#define QCSAPI_SERVICE_CONTROL_REMOTE 5671 +extern enum clnt_stat qcsapi_service_control_remote_1(); +extern bool_t qcsapi_service_control_remote_1_svc(); +#define QCSAPI_WFA_CERT_MODE_ENABLE_REMOTE 5931 +extern enum clnt_stat qcsapi_wfa_cert_mode_enable_remote_1(); +extern bool_t qcsapi_wfa_cert_mode_enable_remote_1_svc(); +#define QCSAPI_WIFI_GET_SCS_CCE_CHANNELS_REMOTE 41 +extern enum clnt_stat qcsapi_wifi_get_scs_cce_channels_remote_1(); +extern bool_t qcsapi_wifi_get_scs_cce_channels_remote_1_svc(); +#define QCSAPI_WIFI_SCS_ENABLE_REMOTE 51 +extern enum clnt_stat qcsapi_wifi_scs_enable_remote_1(); +extern bool_t qcsapi_wifi_scs_enable_remote_1_svc(); +#define QCSAPI_WIFI_SCS_SWITCH_CHANNEL_REMOTE 61 +extern enum clnt_stat qcsapi_wifi_scs_switch_channel_remote_1(); +extern bool_t qcsapi_wifi_scs_switch_channel_remote_1_svc(); +#define QCSAPI_WIFI_SET_SCS_VERBOSE_REMOTE 71 +extern enum clnt_stat qcsapi_wifi_set_scs_verbose_remote_1(); +extern bool_t qcsapi_wifi_set_scs_verbose_remote_1_svc(); +#define QCSAPI_WIFI_GET_SCS_STATUS_REMOTE 81 +extern enum clnt_stat qcsapi_wifi_get_scs_status_remote_1(); +extern bool_t qcsapi_wifi_get_scs_status_remote_1_svc(); +#define QCSAPI_WIFI_SET_SCS_SMPL_ENABLE_REMOTE 91 +extern enum clnt_stat qcsapi_wifi_set_scs_smpl_enable_remote_1(); +extern bool_t qcsapi_wifi_set_scs_smpl_enable_remote_1_svc(); +#define QCSAPI_WIFI_SET_SCS_SMPL_DWELL_TIME_REMOTE 101 +extern enum clnt_stat qcsapi_wifi_set_scs_smpl_dwell_time_remote_1(); +extern bool_t qcsapi_wifi_set_scs_smpl_dwell_time_remote_1_svc(); +#define QCSAPI_WIFI_SET_SCS_SAMPLE_INTV_REMOTE 111 +extern enum clnt_stat qcsapi_wifi_set_scs_sample_intv_remote_1(); +extern bool_t qcsapi_wifi_set_scs_sample_intv_remote_1_svc(); +#define QCSAPI_WIFI_SET_SCS_INTF_DETECT_INTV_REMOTE 121 +extern enum clnt_stat qcsapi_wifi_set_scs_intf_detect_intv_remote_1(); +extern bool_t qcsapi_wifi_set_scs_intf_detect_intv_remote_1_svc(); +#define QCSAPI_WIFI_SET_SCS_THRSHLD_REMOTE 131 +extern enum clnt_stat qcsapi_wifi_set_scs_thrshld_remote_1(); +extern bool_t qcsapi_wifi_set_scs_thrshld_remote_1_svc(); +#define QCSAPI_WIFI_SET_SCS_REPORT_ONLY_REMOTE 141 +extern enum clnt_stat qcsapi_wifi_set_scs_report_only_remote_1(); +extern bool_t qcsapi_wifi_set_scs_report_only_remote_1_svc(); +#define QCSAPI_WIFI_GET_SCS_STAT_REPORT_REMOTE 151 +extern enum clnt_stat qcsapi_wifi_get_scs_stat_report_remote_1(); +extern bool_t qcsapi_wifi_get_scs_stat_report_remote_1_svc(); +#define QCSAPI_WIFI_GET_SCS_SCORE_REPORT_REMOTE 152 +extern enum clnt_stat qcsapi_wifi_get_scs_score_report_remote_1(); +extern bool_t qcsapi_wifi_get_scs_score_report_remote_1_svc(); +#define QCSAPI_WIFI_GET_SCS_CURRCHAN_REPORT_REMOTE 161 +extern enum clnt_stat qcsapi_wifi_get_scs_currchan_report_remote_1(); +extern bool_t qcsapi_wifi_get_scs_currchan_report_remote_1_svc(); +#define QCSAPI_WIFI_SET_SCS_STATS_REMOTE 171 +extern enum clnt_stat qcsapi_wifi_set_scs_stats_remote_1(); +extern bool_t qcsapi_wifi_set_scs_stats_remote_1_svc(); +#define QCSAPI_WIFI_GET_AUTOCHAN_REPORT_REMOTE 181 +extern enum clnt_stat qcsapi_wifi_get_autochan_report_remote_1(); +extern bool_t qcsapi_wifi_get_autochan_report_remote_1_svc(); +#define QCSAPI_WIFI_SET_SCS_CCA_INTF_SMTH_FCTR_REMOTE 191 +extern enum clnt_stat qcsapi_wifi_set_scs_cca_intf_smth_fctr_remote_1(); +extern bool_t qcsapi_wifi_set_scs_cca_intf_smth_fctr_remote_1_svc(); +#define QCSAPI_WIFI_SET_SCS_CHAN_MTRC_MRGN_REMOTE 201 +extern enum clnt_stat qcsapi_wifi_set_scs_chan_mtrc_mrgn_remote_1(); +extern bool_t qcsapi_wifi_set_scs_chan_mtrc_mrgn_remote_1_svc(); +#define QCSAPI_WIFI_GET_SCS_CCA_INTF_REMOTE 211 +extern enum clnt_stat qcsapi_wifi_get_scs_cca_intf_remote_1(); +extern bool_t qcsapi_wifi_get_scs_cca_intf_remote_1_svc(); +#define QCSAPI_WIFI_GET_SCS_PARAM_REPORT_REMOTE 221 +extern enum clnt_stat qcsapi_wifi_get_scs_param_report_remote_1(); +extern bool_t qcsapi_wifi_get_scs_param_report_remote_1_svc(); +#define QCSAPI_WIFI_GET_SCS_DFS_REENTRY_REQUEST_REMOTE 231 +extern enum clnt_stat qcsapi_wifi_get_scs_dfs_reentry_request_remote_1(); +extern bool_t qcsapi_wifi_get_scs_dfs_reentry_request_remote_1_svc(); +#define QCSAPI_WIFI_START_OCAC_REMOTE 241 +extern enum clnt_stat qcsapi_wifi_start_ocac_remote_1(); +extern bool_t qcsapi_wifi_start_ocac_remote_1_svc(); +#define QCSAPI_WIFI_STOP_OCAC_REMOTE 251 +extern enum clnt_stat qcsapi_wifi_stop_ocac_remote_1(); +extern bool_t qcsapi_wifi_stop_ocac_remote_1_svc(); +#define QCSAPI_WIFI_GET_OCAC_STATUS_REMOTE 261 +extern enum clnt_stat qcsapi_wifi_get_ocac_status_remote_1(); +extern bool_t qcsapi_wifi_get_ocac_status_remote_1_svc(); +#define QCSAPI_WIFI_SET_OCAC_DWELL_TIME_REMOTE 271 +extern enum clnt_stat qcsapi_wifi_set_ocac_dwell_time_remote_1(); +extern bool_t qcsapi_wifi_set_ocac_dwell_time_remote_1_svc(); +#define QCSAPI_WIFI_SET_OCAC_DURATION_REMOTE 281 +extern enum clnt_stat qcsapi_wifi_set_ocac_duration_remote_1(); +extern bool_t qcsapi_wifi_set_ocac_duration_remote_1_svc(); +#define QCSAPI_WIFI_SET_OCAC_CAC_TIME_REMOTE 291 +extern enum clnt_stat qcsapi_wifi_set_ocac_cac_time_remote_1(); +extern bool_t qcsapi_wifi_set_ocac_cac_time_remote_1_svc(); +#define QCSAPI_WIFI_SET_OCAC_REPORT_ONLY_REMOTE 301 +extern enum clnt_stat qcsapi_wifi_set_ocac_report_only_remote_1(); +extern bool_t qcsapi_wifi_set_ocac_report_only_remote_1_svc(); +#define QCSAPI_WIFI_SET_OCAC_THRSHLD_REMOTE 311 +extern enum clnt_stat qcsapi_wifi_set_ocac_thrshld_remote_1(); +extern bool_t qcsapi_wifi_set_ocac_thrshld_remote_1_svc(); +#define QCSAPI_WIFI_START_DFS_S_RADIO_REMOTE 242 +extern enum clnt_stat qcsapi_wifi_start_dfs_s_radio_remote_1(); +extern bool_t qcsapi_wifi_start_dfs_s_radio_remote_1_svc(); +#define QCSAPI_WIFI_STOP_DFS_S_RADIO_REMOTE 252 +extern enum clnt_stat qcsapi_wifi_stop_dfs_s_radio_remote_1(); +extern bool_t qcsapi_wifi_stop_dfs_s_radio_remote_1_svc(); +#define QCSAPI_WIFI_GET_DFS_S_RADIO_STATUS_REMOTE 262 +extern enum clnt_stat qcsapi_wifi_get_dfs_s_radio_status_remote_1(); +extern bool_t qcsapi_wifi_get_dfs_s_radio_status_remote_1_svc(); +#define QCSAPI_WIFI_GET_DFS_S_RADIO_AVAILABILITY_REMOTE 263 +extern enum clnt_stat qcsapi_wifi_get_dfs_s_radio_availability_remote_1(); +extern bool_t qcsapi_wifi_get_dfs_s_radio_availability_remote_1_svc(); +#define QCSAPI_WIFI_SET_DFS_S_RADIO_DWELL_TIME_REMOTE 272 +extern enum clnt_stat qcsapi_wifi_set_dfs_s_radio_dwell_time_remote_1(); +extern bool_t qcsapi_wifi_set_dfs_s_radio_dwell_time_remote_1_svc(); +#define QCSAPI_WIFI_SET_DFS_S_RADIO_DURATION_REMOTE 282 +extern enum clnt_stat qcsapi_wifi_set_dfs_s_radio_duration_remote_1(); +extern bool_t qcsapi_wifi_set_dfs_s_radio_duration_remote_1_svc(); +#define QCSAPI_WIFI_SET_DFS_S_RADIO_WEA_DURATION_REMOTE 283 +extern enum clnt_stat qcsapi_wifi_set_dfs_s_radio_wea_duration_remote_1(); +extern bool_t qcsapi_wifi_set_dfs_s_radio_wea_duration_remote_1_svc(); +#define QCSAPI_WIFI_SET_DFS_S_RADIO_CAC_TIME_REMOTE 292 +extern enum clnt_stat qcsapi_wifi_set_dfs_s_radio_cac_time_remote_1(); +extern bool_t qcsapi_wifi_set_dfs_s_radio_cac_time_remote_1_svc(); +#define QCSAPI_WIFI_SET_DFS_S_RADIO_WEA_CAC_TIME_REMOTE 293 +extern enum clnt_stat qcsapi_wifi_set_dfs_s_radio_wea_cac_time_remote_1(); +extern bool_t qcsapi_wifi_set_dfs_s_radio_wea_cac_time_remote_1_svc(); +#define QCSAPI_WIFI_SET_DFS_S_RADIO_REPORT_ONLY_REMOTE 302 +extern enum clnt_stat qcsapi_wifi_set_dfs_s_radio_report_only_remote_1(); +extern bool_t qcsapi_wifi_set_dfs_s_radio_report_only_remote_1_svc(); +#define QCSAPI_WIFI_SET_DFS_S_RADIO_THRSHLD_REMOTE 312 +extern enum clnt_stat qcsapi_wifi_set_dfs_s_radio_thrshld_remote_1(); +extern bool_t qcsapi_wifi_set_dfs_s_radio_thrshld_remote_1_svc(); +#define QCSAPI_INIT_REMOTE 321 +extern enum clnt_stat qcsapi_init_remote_1(); +extern bool_t qcsapi_init_remote_1_svc(); +#define QCSAPI_CONSOLE_DISCONNECT_REMOTE 331 +extern enum clnt_stat qcsapi_console_disconnect_remote_1(); +extern bool_t qcsapi_console_disconnect_remote_1_svc(); +#define QCSAPI_WIFI_STARTPROD_REMOTE 611 +extern enum clnt_stat qcsapi_wifi_startprod_remote_1(); +extern bool_t qcsapi_wifi_startprod_remote_1_svc(); +#define QCSAPI_IS_STARTPROD_DONE_REMOTE 621 +extern enum clnt_stat qcsapi_is_startprod_done_remote_1(); +extern bool_t qcsapi_is_startprod_done_remote_1_svc(); +#define QCSAPI_SYSTEM_GET_TIME_SINCE_START_REMOTE 341 +extern enum clnt_stat qcsapi_system_get_time_since_start_remote_1(); +extern bool_t qcsapi_system_get_time_since_start_remote_1_svc(); +#define QCSAPI_GET_SYSTEM_STATUS_REMOTE 351 +extern enum clnt_stat qcsapi_get_system_status_remote_1(); +extern bool_t qcsapi_get_system_status_remote_1_svc(); +#define QCSAPI_GET_RANDOM_SEED_REMOTE 5831 +extern enum clnt_stat qcsapi_get_random_seed_remote_1(); +extern bool_t qcsapi_get_random_seed_remote_1_svc(); +#define QCSAPI_SET_RANDOM_SEED_REMOTE 5841 +extern enum clnt_stat qcsapi_set_random_seed_remote_1(); +extern bool_t qcsapi_set_random_seed_remote_1_svc(); +#define QCSAPI_GET_CARRIER_ID_REMOTE 4071 +extern enum clnt_stat qcsapi_get_carrier_id_remote_1(); +extern bool_t qcsapi_get_carrier_id_remote_1_svc(); +#define QCSAPI_SET_CARRIER_ID_REMOTE 4081 +extern enum clnt_stat qcsapi_set_carrier_id_remote_1(); +extern bool_t qcsapi_set_carrier_id_remote_1_svc(); +#define QCSAPI_WIFI_GET_SPINOR_JEDECID_REMOTE 4121 +extern enum clnt_stat qcsapi_wifi_get_spinor_jedecid_remote_1(); +extern bool_t qcsapi_wifi_get_spinor_jedecid_remote_1_svc(); +#define QCSAPI_WIFI_GET_BB_PARAM_REMOTE 4281 +extern enum clnt_stat qcsapi_wifi_get_bb_param_remote_1(); +extern bool_t qcsapi_wifi_get_bb_param_remote_1_svc(); +#define QCSAPI_WIFI_SET_BB_PARAM_REMOTE 4291 +extern enum clnt_stat qcsapi_wifi_set_bb_param_remote_1(); +extern bool_t qcsapi_wifi_set_bb_param_remote_1_svc(); +#define QCSAPI_WIFI_SET_OPTIM_STATS_REMOTE 6001 +extern enum clnt_stat qcsapi_wifi_set_optim_stats_remote_1(); +extern bool_t qcsapi_wifi_set_optim_stats_remote_1_svc(); +#define QCSAPI_WIFI_SET_SYS_TIME_REMOTE 6101 +extern enum clnt_stat qcsapi_wifi_set_sys_time_remote_1(); +extern bool_t qcsapi_wifi_set_sys_time_remote_1_svc(); +#define QCSAPI_WIFI_GET_SYS_TIME_REMOTE 6111 +extern enum clnt_stat qcsapi_wifi_get_sys_time_remote_1(); +extern bool_t qcsapi_wifi_get_sys_time_remote_1_svc(); +#define QCSAPI_SET_SOC_MAC_ADDR_REMOTE 3571 +extern enum clnt_stat qcsapi_set_soc_mac_addr_remote_1(); +extern bool_t qcsapi_set_soc_mac_addr_remote_1_svc(); +#define QCSAPI_GET_CUSTOM_VALUE_REMOTE 3581 +extern enum clnt_stat qcsapi_get_custom_value_remote_1(); +extern bool_t qcsapi_get_custom_value_remote_1_svc(); +#define QCSAPI_CONFIG_GET_PARAMETER_REMOTE 361 +extern enum clnt_stat qcsapi_config_get_parameter_remote_1(); +extern bool_t qcsapi_config_get_parameter_remote_1_svc(); +#define QCSAPI_CONFIG_UPDATE_PARAMETER_REMOTE 371 +extern enum clnt_stat qcsapi_config_update_parameter_remote_1(); +extern bool_t qcsapi_config_update_parameter_remote_1_svc(); +#define QCSAPI_CONFIG_GET_SSID_PARAMETER_REMOTE 381 +extern enum clnt_stat qcsapi_config_get_ssid_parameter_remote_1(); +extern bool_t qcsapi_config_get_ssid_parameter_remote_1_svc(); +#define QCSAPI_CONFIG_UPDATE_SSID_PARAMETER_REMOTE 391 +extern enum clnt_stat qcsapi_config_update_ssid_parameter_remote_1(); +extern bool_t qcsapi_config_update_ssid_parameter_remote_1_svc(); +#define QCSAPI_FILE_PATH_GET_CONFIG_REMOTE 401 +extern enum clnt_stat qcsapi_file_path_get_config_remote_1(); +extern bool_t qcsapi_file_path_get_config_remote_1_svc(); +#define QCSAPI_FILE_PATH_SET_CONFIG_REMOTE 411 +extern enum clnt_stat qcsapi_file_path_set_config_remote_1(); +extern bool_t qcsapi_file_path_set_config_remote_1_svc(); +#define QCSAPI_RESTORE_DEFAULT_CONFIG_REMOTE 421 +extern enum clnt_stat qcsapi_restore_default_config_remote_1(); +extern bool_t qcsapi_restore_default_config_remote_1_svc(); +#define QCSAPI_STORE_IPADDR_REMOTE 431 +extern enum clnt_stat qcsapi_store_ipaddr_remote_1(); +extern bool_t qcsapi_store_ipaddr_remote_1_svc(); +#define QCSAPI_INTERFACE_ENABLE_REMOTE 441 +extern enum clnt_stat qcsapi_interface_enable_remote_1(); +extern bool_t qcsapi_interface_enable_remote_1_svc(); +#define QCSAPI_INTERFACE_GET_STATUS_REMOTE 451 +extern enum clnt_stat qcsapi_interface_get_status_remote_1(); +extern bool_t qcsapi_interface_get_status_remote_1_svc(); +#define QCSAPI_INTERFACE_SET_IP4_REMOTE 5691 +extern enum clnt_stat qcsapi_interface_set_ip4_remote_1(); +extern bool_t qcsapi_interface_set_ip4_remote_1_svc(); +#define QCSAPI_INTERFACE_GET_IP4_REMOTE 5701 +extern enum clnt_stat qcsapi_interface_get_ip4_remote_1(); +extern bool_t qcsapi_interface_get_ip4_remote_1_svc(); +#define QCSAPI_INTERFACE_GET_COUNTER_REMOTE 461 +extern enum clnt_stat qcsapi_interface_get_counter_remote_1(); +extern bool_t qcsapi_interface_get_counter_remote_1_svc(); +#define QCSAPI_INTERFACE_GET_COUNTER64_REMOTE 471 +extern enum clnt_stat qcsapi_interface_get_counter64_remote_1(); +extern bool_t qcsapi_interface_get_counter64_remote_1_svc(); +#define QCSAPI_INTERFACE_GET_MAC_ADDR_REMOTE 481 +extern enum clnt_stat qcsapi_interface_get_mac_addr_remote_1(); +extern bool_t qcsapi_interface_get_mac_addr_remote_1_svc(); +#define QCSAPI_INTERFACE_SET_MAC_ADDR_REMOTE 491 +extern enum clnt_stat qcsapi_interface_set_mac_addr_remote_1(); +extern bool_t qcsapi_interface_set_mac_addr_remote_1_svc(); +#define QCSAPI_PM_GET_COUNTER_REMOTE 501 +extern enum clnt_stat qcsapi_pm_get_counter_remote_1(); +extern bool_t qcsapi_pm_get_counter_remote_1_svc(); +#define QCSAPI_SET_ASPM_L1_REMOTE 511 +extern enum clnt_stat qcsapi_set_aspm_l1_remote_1(); +extern bool_t qcsapi_set_aspm_l1_remote_1_svc(); +#define QCSAPI_SET_L1_REMOTE 521 +extern enum clnt_stat qcsapi_set_l1_remote_1(); +extern bool_t qcsapi_set_l1_remote_1_svc(); +#define QCSAPI_PM_GET_ELAPSED_TIME_REMOTE 531 +extern enum clnt_stat qcsapi_pm_get_elapsed_time_remote_1(); +extern bool_t qcsapi_pm_get_elapsed_time_remote_1_svc(); +#define QCSAPI_ETH_PHY_POWER_CONTROL_REMOTE 541 +extern enum clnt_stat qcsapi_eth_phy_power_control_remote_1(); +extern bool_t qcsapi_eth_phy_power_control_remote_1_svc(); +#define QCSAPI_GET_EMAC_SWITCH_REMOTE 5971 +extern enum clnt_stat qcsapi_get_emac_switch_remote_1(); +extern bool_t qcsapi_get_emac_switch_remote_1_svc(); +#define QCSAPI_SET_EMAC_SWITCH_REMOTE 5981 +extern enum clnt_stat qcsapi_set_emac_switch_remote_1(); +extern bool_t qcsapi_set_emac_switch_remote_1_svc(); +#define QCSAPI_ETH_DSCP_MAP_REMOTE 5991 +extern enum clnt_stat qcsapi_eth_dscp_map_remote_1(); +extern bool_t qcsapi_eth_dscp_map_remote_1_svc(); +#define QCSAPI_GET_ETH_INFO_REMOTE 6121 +extern enum clnt_stat qcsapi_get_eth_info_remote_1(); +extern bool_t qcsapi_get_eth_info_remote_1_svc(); +#define QCSAPI_WIFI_GET_MODE_REMOTE 551 +extern enum clnt_stat qcsapi_wifi_get_mode_remote_1(); +extern bool_t qcsapi_wifi_get_mode_remote_1_svc(); +#define QCSAPI_WIFI_SET_MODE_REMOTE 561 +extern enum clnt_stat qcsapi_wifi_set_mode_remote_1(); +extern bool_t qcsapi_wifi_set_mode_remote_1_svc(); +#define QCSAPI_WIFI_GET_PHY_MODE_REMOTE 571 +extern enum clnt_stat qcsapi_wifi_get_phy_mode_remote_1(); +extern bool_t qcsapi_wifi_get_phy_mode_remote_1_svc(); +#define QCSAPI_WIFI_SET_PHY_MODE_REMOTE 581 +extern enum clnt_stat qcsapi_wifi_set_phy_mode_remote_1(); +extern bool_t qcsapi_wifi_set_phy_mode_remote_1_svc(); +#define QCSAPI_WIFI_RELOAD_IN_MODE_REMOTE 591 +extern enum clnt_stat qcsapi_wifi_reload_in_mode_remote_1(); +extern bool_t qcsapi_wifi_reload_in_mode_remote_1_svc(); +#define QCSAPI_WIFI_RFENABLE_REMOTE 601 +extern enum clnt_stat qcsapi_wifi_rfenable_remote_1(); +extern bool_t qcsapi_wifi_rfenable_remote_1_svc(); +#define QCSAPI_WIFI_RFSTATUS_REMOTE 631 +extern enum clnt_stat qcsapi_wifi_rfstatus_remote_1(); +extern bool_t qcsapi_wifi_rfstatus_remote_1_svc(); +#define QCSAPI_WIFI_GET_BW_REMOTE 641 +extern enum clnt_stat qcsapi_wifi_get_bw_remote_1(); +extern bool_t qcsapi_wifi_get_bw_remote_1_svc(); +#define QCSAPI_WIFI_SET_BW_REMOTE 651 +extern enum clnt_stat qcsapi_wifi_set_bw_remote_1(); +extern bool_t qcsapi_wifi_set_bw_remote_1_svc(); +#define QCSAPI_WIFI_SET_VHT_REMOTE 4091 +extern enum clnt_stat qcsapi_wifi_set_vht_remote_1(); +extern bool_t qcsapi_wifi_set_vht_remote_1_svc(); +#define QCSAPI_WIFI_GET_VHT_REMOTE 4101 +extern enum clnt_stat qcsapi_wifi_get_vht_remote_1(); +extern bool_t qcsapi_wifi_get_vht_remote_1_svc(); +#define QCSAPI_WIFI_GET_CHANNEL_REMOTE 671 +extern enum clnt_stat qcsapi_wifi_get_channel_remote_1(); +extern bool_t qcsapi_wifi_get_channel_remote_1_svc(); +#define QCSAPI_WIFI_SET_CHANNEL_REMOTE 681 +extern enum clnt_stat qcsapi_wifi_set_channel_remote_1(); +extern bool_t qcsapi_wifi_set_channel_remote_1_svc(); +#define QCSAPI_WIFI_SET_CHAN_PRI_INACTIVE_REMOTE 691 +extern enum clnt_stat qcsapi_wifi_set_chan_pri_inactive_remote_1(); +extern bool_t qcsapi_wifi_set_chan_pri_inactive_remote_1_svc(); +#define QCSAPI_WIFI_CHAN_CONTROL_REMOTE 6211 +extern enum clnt_stat qcsapi_wifi_chan_control_remote_1(); +extern bool_t qcsapi_wifi_chan_control_remote_1_svc(); +#define QCSAPI_WIFI_GET_CHAN_DISABLED_REMOTE 6221 +extern enum clnt_stat qcsapi_wifi_get_chan_disabled_remote_1(); +extern bool_t qcsapi_wifi_get_chan_disabled_remote_1_svc(); +#define QCSAPI_WIFI_GET_BEACON_INTERVAL_REMOTE 701 +extern enum clnt_stat qcsapi_wifi_get_beacon_interval_remote_1(); +extern bool_t qcsapi_wifi_get_beacon_interval_remote_1_svc(); +#define QCSAPI_WIFI_SET_BEACON_INTERVAL_REMOTE 711 +extern enum clnt_stat qcsapi_wifi_set_beacon_interval_remote_1(); +extern bool_t qcsapi_wifi_set_beacon_interval_remote_1_svc(); +#define QCSAPI_WIFI_GET_DTIM_REMOTE 721 +extern enum clnt_stat qcsapi_wifi_get_dtim_remote_1(); +extern bool_t qcsapi_wifi_get_dtim_remote_1_svc(); +#define QCSAPI_WIFI_SET_DTIM_REMOTE 731 +extern enum clnt_stat qcsapi_wifi_set_dtim_remote_1(); +extern bool_t qcsapi_wifi_set_dtim_remote_1_svc(); +#define QCSAPI_WIFI_GET_ASSOC_LIMIT_REMOTE 741 +extern enum clnt_stat qcsapi_wifi_get_assoc_limit_remote_1(); +extern bool_t qcsapi_wifi_get_assoc_limit_remote_1_svc(); +#define QCSAPI_WIFI_GET_BSS_ASSOC_LIMIT_REMOTE 5721 +extern enum clnt_stat qcsapi_wifi_get_bss_assoc_limit_remote_1(); +extern bool_t qcsapi_wifi_get_bss_assoc_limit_remote_1_svc(); +#define QCSAPI_WIFI_SET_ASSOC_LIMIT_REMOTE 751 +extern enum clnt_stat qcsapi_wifi_set_assoc_limit_remote_1(); +extern bool_t qcsapi_wifi_set_assoc_limit_remote_1_svc(); +#define QCSAPI_WIFI_SET_BSS_ASSOC_LIMIT_REMOTE 5711 +extern enum clnt_stat qcsapi_wifi_set_bss_assoc_limit_remote_1(); +extern bool_t qcsapi_wifi_set_bss_assoc_limit_remote_1_svc(); +#define QCSAPI_WIFI_GET_BSSID_REMOTE 761 +extern enum clnt_stat qcsapi_wifi_get_bssid_remote_1(); +extern bool_t qcsapi_wifi_get_bssid_remote_1_svc(); +#define QCSAPI_WIFI_GET_CONFIG_BSSID_REMOTE 771 +extern enum clnt_stat qcsapi_wifi_get_config_bssid_remote_1(); +extern bool_t qcsapi_wifi_get_config_bssid_remote_1_svc(); +#define QCSAPI_WIFI_SSID_GET_BSSID_REMOTE 6131 +extern enum clnt_stat qcsapi_wifi_ssid_get_bssid_remote_1(); +extern bool_t qcsapi_wifi_ssid_get_bssid_remote_1_svc(); +#define QCSAPI_WIFI_SSID_SET_BSSID_REMOTE 6141 +extern enum clnt_stat qcsapi_wifi_ssid_set_bssid_remote_1(); +extern bool_t qcsapi_wifi_ssid_set_bssid_remote_1_svc(); +#define QCSAPI_WIFI_GET_SSID_REMOTE 781 +extern enum clnt_stat qcsapi_wifi_get_ssid_remote_1(); +extern bool_t qcsapi_wifi_get_ssid_remote_1_svc(); +#define QCSAPI_WIFI_SET_SSID_REMOTE 791 +extern enum clnt_stat qcsapi_wifi_set_ssid_remote_1(); +extern bool_t qcsapi_wifi_set_ssid_remote_1_svc(); +#define QCSAPI_WIFI_GET_IEEE_802_11_STANDARD_REMOTE 801 +extern enum clnt_stat qcsapi_wifi_get_ieee_802_11_standard_remote_1(); +extern bool_t qcsapi_wifi_get_ieee_802_11_standard_remote_1_svc(); +#define QCSAPI_WIFI_GET_LIST_CHANNELS_REMOTE 811 +extern enum clnt_stat qcsapi_wifi_get_list_channels_remote_1(); +extern bool_t qcsapi_wifi_get_list_channels_remote_1_svc(); +#define QCSAPI_WIFI_GET_MODE_SWITCH_REMOTE 821 +extern enum clnt_stat qcsapi_wifi_get_mode_switch_remote_1(); +extern bool_t qcsapi_wifi_get_mode_switch_remote_1_svc(); +#define QCSAPI_WIFI_DISASSOCIATE_REMOTE 831 +extern enum clnt_stat qcsapi_wifi_disassociate_remote_1(); +extern bool_t qcsapi_wifi_disassociate_remote_1_svc(); +#define QCSAPI_WIFI_DISASSOCIATE_STA_REMOTE 841 +extern enum clnt_stat qcsapi_wifi_disassociate_sta_remote_1(); +extern bool_t qcsapi_wifi_disassociate_sta_remote_1_svc(); +#define QCSAPI_WIFI_REASSOCIATE_REMOTE 4441 +extern enum clnt_stat qcsapi_wifi_reassociate_remote_1(); +extern bool_t qcsapi_wifi_reassociate_remote_1_svc(); +#define QCSAPI_WIFI_GET_DISCONN_INFO_REMOTE 851 +extern enum clnt_stat qcsapi_wifi_get_disconn_info_remote_1(); +extern bool_t qcsapi_wifi_get_disconn_info_remote_1_svc(); +#define QCSAPI_WIFI_DISABLE_WPS_REMOTE 861 +extern enum clnt_stat qcsapi_wifi_disable_wps_remote_1(); +extern bool_t qcsapi_wifi_disable_wps_remote_1_svc(); +#define QCSAPI_WIFI_ASSOCIATE_REMOTE 871 +extern enum clnt_stat qcsapi_wifi_associate_remote_1(); +extern bool_t qcsapi_wifi_associate_remote_1_svc(); +#define QCSAPI_WIFI_START_CCA_REMOTE 881 +extern enum clnt_stat qcsapi_wifi_start_cca_remote_1(); +extern bool_t qcsapi_wifi_start_cca_remote_1_svc(); +#define QCSAPI_WIFI_GET_NOISE_REMOTE 891 +extern enum clnt_stat qcsapi_wifi_get_noise_remote_1(); +extern bool_t qcsapi_wifi_get_noise_remote_1_svc(); +#define QCSAPI_WIFI_GET_RSSI_BY_CHAIN_REMOTE 901 +extern enum clnt_stat qcsapi_wifi_get_rssi_by_chain_remote_1(); +extern bool_t qcsapi_wifi_get_rssi_by_chain_remote_1_svc(); +#define QCSAPI_WIFI_GET_AVG_SNR_REMOTE 911 +extern enum clnt_stat qcsapi_wifi_get_avg_snr_remote_1(); +extern bool_t qcsapi_wifi_get_avg_snr_remote_1_svc(); +#define QCSAPI_GET_PRIMARY_INTERFACE_REMOTE 921 +extern enum clnt_stat qcsapi_get_primary_interface_remote_1(); +extern bool_t qcsapi_get_primary_interface_remote_1_svc(); +#define QCSAPI_GET_INTERFACE_BY_INDEX_REMOTE 931 +extern enum clnt_stat qcsapi_get_interface_by_index_remote_1(); +extern bool_t qcsapi_get_interface_by_index_remote_1_svc(); +#define QCSAPI_WIFI_SET_WIFI_MACADDR_REMOTE 941 +extern enum clnt_stat qcsapi_wifi_set_wifi_macaddr_remote_1(); +extern bool_t qcsapi_wifi_set_wifi_macaddr_remote_1_svc(); +#define QCSAPI_INTERFACE_GET_BSSID_REMOTE 951 +extern enum clnt_stat qcsapi_interface_get_bssid_remote_1(); +extern bool_t qcsapi_interface_get_bssid_remote_1_svc(); +#define QCSAPI_WIFI_GET_RATES_REMOTE 961 +extern enum clnt_stat qcsapi_wifi_get_rates_remote_1(); +extern bool_t qcsapi_wifi_get_rates_remote_1_svc(); +#define QCSAPI_WIFI_SET_RATES_REMOTE 971 +extern enum clnt_stat qcsapi_wifi_set_rates_remote_1(); +extern bool_t qcsapi_wifi_set_rates_remote_1_svc(); +#define QCSAPI_GET_MAX_BITRATE_REMOTE 981 +extern enum clnt_stat qcsapi_get_max_bitrate_remote_1(); +extern bool_t qcsapi_get_max_bitrate_remote_1_svc(); +#define QCSAPI_SET_MAX_BITRATE_REMOTE 991 +extern enum clnt_stat qcsapi_set_max_bitrate_remote_1(); +extern bool_t qcsapi_set_max_bitrate_remote_1_svc(); +#define QCSAPI_WIFI_QOS_GET_PARAM_REMOTE 1001 +extern enum clnt_stat qcsapi_wifi_qos_get_param_remote_1(); +extern bool_t qcsapi_wifi_qos_get_param_remote_1_svc(); +#define QCSAPI_WIFI_QOS_SET_PARAM_REMOTE 1011 +extern enum clnt_stat qcsapi_wifi_qos_set_param_remote_1(); +extern bool_t qcsapi_wifi_qos_set_param_remote_1_svc(); +#define QCSAPI_WIFI_GET_WMM_AC_MAP_REMOTE 1021 +extern enum clnt_stat qcsapi_wifi_get_wmm_ac_map_remote_1(); +extern bool_t qcsapi_wifi_get_wmm_ac_map_remote_1_svc(); +#define QCSAPI_WIFI_SET_WMM_AC_MAP_REMOTE 1031 +extern enum clnt_stat qcsapi_wifi_set_wmm_ac_map_remote_1(); +extern bool_t qcsapi_wifi_set_wmm_ac_map_remote_1_svc(); +#define QCSAPI_WIFI_GET_DSCP_8021P_MAP_REMOTE 1041 +extern enum clnt_stat qcsapi_wifi_get_dscp_8021p_map_remote_1(); +extern bool_t qcsapi_wifi_get_dscp_8021p_map_remote_1_svc(); +#define QCSAPI_WIFI_GET_DSCP_AC_MAP_REMOTE 1051 +extern enum clnt_stat qcsapi_wifi_get_dscp_ac_map_remote_1(); +extern bool_t qcsapi_wifi_get_dscp_ac_map_remote_1_svc(); +#define QCSAPI_WIFI_SET_DSCP_8021P_MAP_REMOTE 1061 +extern enum clnt_stat qcsapi_wifi_set_dscp_8021p_map_remote_1(); +extern bool_t qcsapi_wifi_set_dscp_8021p_map_remote_1_svc(); +#define QCSAPI_WIFI_SET_DSCP_AC_MAP_REMOTE 1071 +extern enum clnt_stat qcsapi_wifi_set_dscp_ac_map_remote_1(); +extern bool_t qcsapi_wifi_set_dscp_ac_map_remote_1_svc(); +#define QCSAPI_WIFI_GET_PRIORITY_REMOTE 1081 +extern enum clnt_stat qcsapi_wifi_get_priority_remote_1(); +extern bool_t qcsapi_wifi_get_priority_remote_1_svc(); +#define QCSAPI_WIFI_SET_PRIORITY_REMOTE 1091 +extern enum clnt_stat qcsapi_wifi_set_priority_remote_1(); +extern bool_t qcsapi_wifi_set_priority_remote_1_svc(); +#define QCSAPI_WIFI_GET_AIRFAIR_REMOTE 1101 +extern enum clnt_stat qcsapi_wifi_get_airfair_remote_1(); +extern bool_t qcsapi_wifi_get_airfair_remote_1_svc(); +#define QCSAPI_WIFI_SET_AIRFAIR_REMOTE 1111 +extern enum clnt_stat qcsapi_wifi_set_airfair_remote_1(); +extern bool_t qcsapi_wifi_set_airfair_remote_1_svc(); +#define QCSAPI_WIFI_GET_TX_POWER_REMOTE 1211 +extern enum clnt_stat qcsapi_wifi_get_tx_power_remote_1(); +extern bool_t qcsapi_wifi_get_tx_power_remote_1_svc(); +#define QCSAPI_WIFI_SET_TX_POWER_REMOTE 1221 +extern enum clnt_stat qcsapi_wifi_set_tx_power_remote_1(); +extern bool_t qcsapi_wifi_set_tx_power_remote_1_svc(); +#define QCSAPI_WIFI_GET_BW_POWER_REMOTE 1231 +extern enum clnt_stat qcsapi_wifi_get_bw_power_remote_1(); +extern bool_t qcsapi_wifi_get_bw_power_remote_1_svc(); +#define QCSAPI_WIFI_SET_BW_POWER_REMOTE 1241 +extern enum clnt_stat qcsapi_wifi_set_bw_power_remote_1(); +extern bool_t qcsapi_wifi_set_bw_power_remote_1_svc(); +#define QCSAPI_WIFI_GET_BF_POWER_REMOTE 1261 +extern enum clnt_stat qcsapi_wifi_get_bf_power_remote_1(); +extern bool_t qcsapi_wifi_get_bf_power_remote_1_svc(); +#define QCSAPI_WIFI_SET_BF_POWER_REMOTE 1271 +extern enum clnt_stat qcsapi_wifi_set_bf_power_remote_1(); +extern bool_t qcsapi_wifi_set_bf_power_remote_1_svc(); +#define QCSAPI_WIFI_GET_TX_POWER_EXT_REMOTE 4541 +extern enum clnt_stat qcsapi_wifi_get_tx_power_ext_remote_1(); +extern bool_t qcsapi_wifi_get_tx_power_ext_remote_1_svc(); +#define QCSAPI_WIFI_SET_TX_POWER_EXT_REMOTE 4551 +extern enum clnt_stat qcsapi_wifi_set_tx_power_ext_remote_1(); +extern bool_t qcsapi_wifi_set_tx_power_ext_remote_1_svc(); +#define QCSAPI_WIFI_GET_CHAN_POWER_TABLE_REMOTE 6151 +extern enum clnt_stat qcsapi_wifi_get_chan_power_table_remote_1(); +extern bool_t qcsapi_wifi_get_chan_power_table_remote_1_svc(); +#define QCSAPI_WIFI_SET_CHAN_POWER_TABLE_REMOTE 6161 +extern enum clnt_stat qcsapi_wifi_set_chan_power_table_remote_1(); +extern bool_t qcsapi_wifi_set_chan_power_table_remote_1_svc(); +#define QCSAPI_WIFI_GET_POWER_SELECTION_REMOTE 4471 +extern enum clnt_stat qcsapi_wifi_get_power_selection_remote_1(); +extern bool_t qcsapi_wifi_get_power_selection_remote_1_svc(); +#define QCSAPI_WIFI_SET_POWER_SELECTION_REMOTE 4481 +extern enum clnt_stat qcsapi_wifi_set_power_selection_remote_1(); +extern bool_t qcsapi_wifi_set_power_selection_remote_1_svc(); +#define QCSAPI_WIFI_GET_CARRIER_INTERFERENCE_REMOTE 1291 +extern enum clnt_stat qcsapi_wifi_get_carrier_interference_remote_1(); +extern bool_t qcsapi_wifi_get_carrier_interference_remote_1_svc(); +#define QCSAPI_WIFI_GET_CONGESTION_INDEX_REMOTE 1301 +extern enum clnt_stat qcsapi_wifi_get_congestion_index_remote_1(); +extern bool_t qcsapi_wifi_get_congestion_index_remote_1_svc(); +#define QCSAPI_WIFI_GET_SUPPORTED_TX_POWER_LEVELS_REMOTE 1311 +extern enum clnt_stat qcsapi_wifi_get_supported_tx_power_levels_remote_1(); +extern bool_t qcsapi_wifi_get_supported_tx_power_levels_remote_1_svc(); +#define QCSAPI_WIFI_GET_CURRENT_TX_POWER_LEVEL_REMOTE 1321 +extern enum clnt_stat qcsapi_wifi_get_current_tx_power_level_remote_1(); +extern bool_t qcsapi_wifi_get_current_tx_power_level_remote_1_svc(); +#define QCSAPI_WIFI_SET_POWER_CONSTRAINT_REMOTE 1331 +extern enum clnt_stat qcsapi_wifi_set_power_constraint_remote_1(); +extern bool_t qcsapi_wifi_set_power_constraint_remote_1_svc(); +#define QCSAPI_WIFI_GET_POWER_CONSTRAINT_REMOTE 1341 +extern enum clnt_stat qcsapi_wifi_get_power_constraint_remote_1(); +extern bool_t qcsapi_wifi_get_power_constraint_remote_1_svc(); +#define QCSAPI_WIFI_SET_TPC_INTERVAL_REMOTE 1351 +extern enum clnt_stat qcsapi_wifi_set_tpc_interval_remote_1(); +extern bool_t qcsapi_wifi_set_tpc_interval_remote_1_svc(); +#define QCSAPI_WIFI_GET_TPC_INTERVAL_REMOTE 1361 +extern enum clnt_stat qcsapi_wifi_get_tpc_interval_remote_1(); +extern bool_t qcsapi_wifi_get_tpc_interval_remote_1_svc(); +#define QCSAPI_WIFI_GET_ASSOC_RECORDS_REMOTE 1371 +extern enum clnt_stat qcsapi_wifi_get_assoc_records_remote_1(); +extern bool_t qcsapi_wifi_get_assoc_records_remote_1_svc(); +#define QCSAPI_WIFI_GET_AP_ISOLATE_REMOTE 1381 +extern enum clnt_stat qcsapi_wifi_get_ap_isolate_remote_1(); +extern bool_t qcsapi_wifi_get_ap_isolate_remote_1_svc(); +#define QCSAPI_WIFI_SET_AP_ISOLATE_REMOTE 1391 +extern enum clnt_stat qcsapi_wifi_set_ap_isolate_remote_1(); +extern bool_t qcsapi_wifi_set_ap_isolate_remote_1_svc(); +#define QCSAPI_WIFI_GET_INTRA_BSS_ISOLATE_REMOTE 1401 +extern enum clnt_stat qcsapi_wifi_get_intra_bss_isolate_remote_1(); +extern bool_t qcsapi_wifi_get_intra_bss_isolate_remote_1_svc(); +#define QCSAPI_WIFI_SET_INTRA_BSS_ISOLATE_REMOTE 1411 +extern enum clnt_stat qcsapi_wifi_set_intra_bss_isolate_remote_1(); +extern bool_t qcsapi_wifi_set_intra_bss_isolate_remote_1_svc(); +#define QCSAPI_WIFI_GET_BSS_ISOLATE_REMOTE 1421 +extern enum clnt_stat qcsapi_wifi_get_bss_isolate_remote_1(); +extern bool_t qcsapi_wifi_get_bss_isolate_remote_1_svc(); +#define QCSAPI_WIFI_SET_BSS_ISOLATE_REMOTE 1431 +extern enum clnt_stat qcsapi_wifi_set_bss_isolate_remote_1(); +extern bool_t qcsapi_wifi_set_bss_isolate_remote_1_svc(); +#define QCSAPI_WIFI_DISABLE_DFS_CHANNELS_REMOTE 4061 +extern enum clnt_stat qcsapi_wifi_disable_dfs_channels_remote_1(); +extern bool_t qcsapi_wifi_disable_dfs_channels_remote_1_svc(); +#define QCSAPI_WIFI_CREATE_RESTRICTED_BSS_REMOTE 1441 +extern enum clnt_stat qcsapi_wifi_create_restricted_bss_remote_1(); +extern bool_t qcsapi_wifi_create_restricted_bss_remote_1_svc(); +#define QCSAPI_WIFI_CREATE_BSS_REMOTE 1451 +extern enum clnt_stat qcsapi_wifi_create_bss_remote_1(); +extern bool_t qcsapi_wifi_create_bss_remote_1_svc(); +#define QCSAPI_WIFI_REMOVE_BSS_REMOTE 1461 +extern enum clnt_stat qcsapi_wifi_remove_bss_remote_1(); +extern bool_t qcsapi_wifi_remove_bss_remote_1_svc(); +#define QCSAPI_WDS_ADD_PEER_REMOTE 1471 +extern enum clnt_stat qcsapi_wds_add_peer_remote_1(); +extern bool_t qcsapi_wds_add_peer_remote_1_svc(); +#define QCSAPI_WDS_ADD_PEER_ENCRYPT_REMOTE 1481 +extern enum clnt_stat qcsapi_wds_add_peer_encrypt_remote_1(); +extern bool_t qcsapi_wds_add_peer_encrypt_remote_1_svc(); +#define QCSAPI_WDS_REMOVE_PEER_REMOTE 1491 +extern enum clnt_stat qcsapi_wds_remove_peer_remote_1(); +extern bool_t qcsapi_wds_remove_peer_remote_1_svc(); +#define QCSAPI_WDS_GET_PEER_ADDRESS_REMOTE 1501 +extern enum clnt_stat qcsapi_wds_get_peer_address_remote_1(); +extern bool_t qcsapi_wds_get_peer_address_remote_1_svc(); +#define QCSAPI_WDS_SET_PSK_REMOTE 1511 +extern enum clnt_stat qcsapi_wds_set_psk_remote_1(); +extern bool_t qcsapi_wds_set_psk_remote_1_svc(); +#define QCSAPI_WDS_SET_MODE_REMOTE 1521 +extern enum clnt_stat qcsapi_wds_set_mode_remote_1(); +extern bool_t qcsapi_wds_set_mode_remote_1_svc(); +#define QCSAPI_WDS_GET_MODE_REMOTE 1531 +extern enum clnt_stat qcsapi_wds_get_mode_remote_1(); +extern bool_t qcsapi_wds_get_mode_remote_1_svc(); +#define QCSAPI_WIFI_SET_EXTENDER_PARAMS_REMOTE 1541 +extern enum clnt_stat qcsapi_wifi_set_extender_params_remote_1(); +extern bool_t qcsapi_wifi_set_extender_params_remote_1_svc(); +#define QCSAPI_WIFI_GET_EXTENDER_PARAMS_REMOTE 1551 +extern enum clnt_stat qcsapi_wifi_get_extender_params_remote_1(); +extern bool_t qcsapi_wifi_get_extender_params_remote_1_svc(); +#define QCSAPI_WIFI_GET_BEACON_TYPE_REMOTE 1581 +extern enum clnt_stat qcsapi_wifi_get_beacon_type_remote_1(); +extern bool_t qcsapi_wifi_get_beacon_type_remote_1_svc(); +#define QCSAPI_WIFI_SET_BEACON_TYPE_REMOTE 1591 +extern enum clnt_stat qcsapi_wifi_set_beacon_type_remote_1(); +extern bool_t qcsapi_wifi_set_beacon_type_remote_1_svc(); +#define QCSAPI_WIFI_GET_WEP_KEY_INDEX_REMOTE 1601 +extern enum clnt_stat qcsapi_wifi_get_wep_key_index_remote_1(); +extern bool_t qcsapi_wifi_get_wep_key_index_remote_1_svc(); +#define QCSAPI_WIFI_SET_WEP_KEY_INDEX_REMOTE 1611 +extern enum clnt_stat qcsapi_wifi_set_wep_key_index_remote_1(); +extern bool_t qcsapi_wifi_set_wep_key_index_remote_1_svc(); +#define QCSAPI_WIFI_GET_WEP_KEY_PASSPHRASE_REMOTE 1621 +extern enum clnt_stat qcsapi_wifi_get_wep_key_passphrase_remote_1(); +extern bool_t qcsapi_wifi_get_wep_key_passphrase_remote_1_svc(); +#define QCSAPI_WIFI_SET_WEP_KEY_PASSPHRASE_REMOTE 1631 +extern enum clnt_stat qcsapi_wifi_set_wep_key_passphrase_remote_1(); +extern bool_t qcsapi_wifi_set_wep_key_passphrase_remote_1_svc(); +#define QCSAPI_WIFI_GET_WEP_ENCRYPTION_LEVEL_REMOTE 1641 +extern enum clnt_stat qcsapi_wifi_get_wep_encryption_level_remote_1(); +extern bool_t qcsapi_wifi_get_wep_encryption_level_remote_1_svc(); +#define QCSAPI_WIFI_GET_BASIC_ENCRYPTION_MODES_REMOTE 1651 +extern enum clnt_stat qcsapi_wifi_get_basic_encryption_modes_remote_1(); +extern bool_t qcsapi_wifi_get_basic_encryption_modes_remote_1_svc(); +#define QCSAPI_WIFI_SET_BASIC_ENCRYPTION_MODES_REMOTE 1661 +extern enum clnt_stat qcsapi_wifi_set_basic_encryption_modes_remote_1(); +extern bool_t qcsapi_wifi_set_basic_encryption_modes_remote_1_svc(); +#define QCSAPI_WIFI_GET_BASIC_AUTHENTICATION_MODE_REMOTE 1671 +extern enum clnt_stat qcsapi_wifi_get_basic_authentication_mode_remote_1(); +extern bool_t qcsapi_wifi_get_basic_authentication_mode_remote_1_svc(); +#define QCSAPI_WIFI_SET_BASIC_AUTHENTICATION_MODE_REMOTE 1681 +extern enum clnt_stat qcsapi_wifi_set_basic_authentication_mode_remote_1(); +extern bool_t qcsapi_wifi_set_basic_authentication_mode_remote_1_svc(); +#define QCSAPI_WIFI_GET_WEP_KEY_REMOTE 1691 +extern enum clnt_stat qcsapi_wifi_get_wep_key_remote_1(); +extern bool_t qcsapi_wifi_get_wep_key_remote_1_svc(); +#define QCSAPI_WIFI_SET_WEP_KEY_REMOTE 1701 +extern enum clnt_stat qcsapi_wifi_set_wep_key_remote_1(); +extern bool_t qcsapi_wifi_set_wep_key_remote_1_svc(); +#define QCSAPI_WIFI_GET_WPA_ENCRYPTION_MODES_REMOTE 1711 +extern enum clnt_stat qcsapi_wifi_get_wpa_encryption_modes_remote_1(); +extern bool_t qcsapi_wifi_get_wpa_encryption_modes_remote_1_svc(); +#define QCSAPI_WIFI_SET_WPA_ENCRYPTION_MODES_REMOTE 1721 +extern enum clnt_stat qcsapi_wifi_set_wpa_encryption_modes_remote_1(); +extern bool_t qcsapi_wifi_set_wpa_encryption_modes_remote_1_svc(); +#define QCSAPI_WIFI_GET_WPA_AUTHENTICATION_MODE_REMOTE 1731 +extern enum clnt_stat qcsapi_wifi_get_wpa_authentication_mode_remote_1(); +extern bool_t qcsapi_wifi_get_wpa_authentication_mode_remote_1_svc(); +#define QCSAPI_WIFI_SET_WPA_AUTHENTICATION_MODE_REMOTE 1741 +extern enum clnt_stat qcsapi_wifi_set_wpa_authentication_mode_remote_1(); +extern bool_t qcsapi_wifi_set_wpa_authentication_mode_remote_1_svc(); +#define QCSAPI_WIFI_GET_INTERWORKING_REMOTE 5451 +extern enum clnt_stat qcsapi_wifi_get_interworking_remote_1(); +extern bool_t qcsapi_wifi_get_interworking_remote_1_svc(); +#define QCSAPI_WIFI_SET_INTERWORKING_REMOTE 5461 +extern enum clnt_stat qcsapi_wifi_set_interworking_remote_1(); +extern bool_t qcsapi_wifi_set_interworking_remote_1_svc(); +#define QCSAPI_WIFI_GET_80211U_PARAMS_REMOTE 5471 +extern enum clnt_stat qcsapi_wifi_get_80211u_params_remote_1(); +extern bool_t qcsapi_wifi_get_80211u_params_remote_1_svc(); +#define QCSAPI_WIFI_SET_80211U_PARAMS_REMOTE 5481 +extern enum clnt_stat qcsapi_wifi_set_80211u_params_remote_1(); +extern bool_t qcsapi_wifi_set_80211u_params_remote_1_svc(); +#define QCSAPI_SECURITY_GET_NAI_REALMS_REMOTE 5491 +extern enum clnt_stat qcsapi_security_get_nai_realms_remote_1(); +extern bool_t qcsapi_security_get_nai_realms_remote_1_svc(); +#define QCSAPI_SECURITY_ADD_NAI_REALM_REMOTE 5501 +extern enum clnt_stat qcsapi_security_add_nai_realm_remote_1(); +extern bool_t qcsapi_security_add_nai_realm_remote_1_svc(); +#define QCSAPI_SECURITY_DEL_NAI_REALM_REMOTE 5511 +extern enum clnt_stat qcsapi_security_del_nai_realm_remote_1(); +extern bool_t qcsapi_security_del_nai_realm_remote_1_svc(); +#define QCSAPI_SECURITY_GET_ROAMING_CONSORTIUM_REMOTE 5521 +extern enum clnt_stat qcsapi_security_get_roaming_consortium_remote_1(); +extern bool_t qcsapi_security_get_roaming_consortium_remote_1_svc(); +#define QCSAPI_SECURITY_ADD_ROAMING_CONSORTIUM_REMOTE 5531 +extern enum clnt_stat qcsapi_security_add_roaming_consortium_remote_1(); +extern bool_t qcsapi_security_add_roaming_consortium_remote_1_svc(); +#define QCSAPI_SECURITY_DEL_ROAMING_CONSORTIUM_REMOTE 5541 +extern enum clnt_stat qcsapi_security_del_roaming_consortium_remote_1(); +extern bool_t qcsapi_security_del_roaming_consortium_remote_1_svc(); +#define QCSAPI_SECURITY_GET_VENUE_NAME_REMOTE 5551 +extern enum clnt_stat qcsapi_security_get_venue_name_remote_1(); +extern bool_t qcsapi_security_get_venue_name_remote_1_svc(); +#define QCSAPI_SECURITY_ADD_VENUE_NAME_REMOTE 5561 +extern enum clnt_stat qcsapi_security_add_venue_name_remote_1(); +extern bool_t qcsapi_security_add_venue_name_remote_1_svc(); +#define QCSAPI_SECURITY_DEL_VENUE_NAME_REMOTE 5731 +extern enum clnt_stat qcsapi_security_del_venue_name_remote_1(); +extern bool_t qcsapi_security_del_venue_name_remote_1_svc(); +#define QCSAPI_SECURITY_GET_OPER_FRIENDLY_NAME_REMOTE 5741 +extern enum clnt_stat qcsapi_security_get_oper_friendly_name_remote_1(); +extern bool_t qcsapi_security_get_oper_friendly_name_remote_1_svc(); +#define QCSAPI_SECURITY_ADD_OPER_FRIENDLY_NAME_REMOTE 5751 +extern enum clnt_stat qcsapi_security_add_oper_friendly_name_remote_1(); +extern bool_t qcsapi_security_add_oper_friendly_name_remote_1_svc(); +#define QCSAPI_SECURITY_DEL_OPER_FRIENDLY_NAME_REMOTE 5761 +extern enum clnt_stat qcsapi_security_del_oper_friendly_name_remote_1(); +extern bool_t qcsapi_security_del_oper_friendly_name_remote_1_svc(); +#define QCSAPI_SECURITY_GET_HS20_CONN_CAPAB_REMOTE 5771 +extern enum clnt_stat qcsapi_security_get_hs20_conn_capab_remote_1(); +extern bool_t qcsapi_security_get_hs20_conn_capab_remote_1_svc(); +#define QCSAPI_SECURITY_ADD_HS20_CONN_CAPAB_REMOTE 5781 +extern enum clnt_stat qcsapi_security_add_hs20_conn_capab_remote_1(); +extern bool_t qcsapi_security_add_hs20_conn_capab_remote_1_svc(); +#define QCSAPI_SECURITY_DEL_HS20_CONN_CAPAB_REMOTE 5791 +extern enum clnt_stat qcsapi_security_del_hs20_conn_capab_remote_1(); +extern bool_t qcsapi_security_del_hs20_conn_capab_remote_1_svc(); +#define QCSAPI_WIFI_GET_HS20_STATUS_REMOTE 5571 +extern enum clnt_stat qcsapi_wifi_get_hs20_status_remote_1(); +extern bool_t qcsapi_wifi_get_hs20_status_remote_1_svc(); +#define QCSAPI_WIFI_SET_HS20_STATUS_REMOTE 5581 +extern enum clnt_stat qcsapi_wifi_set_hs20_status_remote_1(); +extern bool_t qcsapi_wifi_set_hs20_status_remote_1_svc(); +#define QCSAPI_WIFI_GET_PROXY_ARP_REMOTE 5641 +extern enum clnt_stat qcsapi_wifi_get_proxy_arp_remote_1(); +extern bool_t qcsapi_wifi_get_proxy_arp_remote_1_svc(); +#define QCSAPI_WIFI_SET_PROXY_ARP_REMOTE 5631 +extern enum clnt_stat qcsapi_wifi_set_proxy_arp_remote_1(); +extern bool_t qcsapi_wifi_set_proxy_arp_remote_1_svc(); +#define QCSAPI_WIFI_GET_L2_EXT_FILTER_REMOTE 5941 +extern enum clnt_stat qcsapi_wifi_get_l2_ext_filter_remote_1(); +extern bool_t qcsapi_wifi_get_l2_ext_filter_remote_1_svc(); +#define QCSAPI_WIFI_SET_L2_EXT_FILTER_REMOTE 5951 +extern enum clnt_stat qcsapi_wifi_set_l2_ext_filter_remote_1(); +extern bool_t qcsapi_wifi_set_l2_ext_filter_remote_1_svc(); +#define QCSAPI_WIFI_GET_HS20_PARAMS_REMOTE 5591 +extern enum clnt_stat qcsapi_wifi_get_hs20_params_remote_1(); +extern bool_t qcsapi_wifi_get_hs20_params_remote_1_svc(); +#define QCSAPI_WIFI_SET_HS20_PARAMS_REMOTE 5601 +extern enum clnt_stat qcsapi_wifi_set_hs20_params_remote_1(); +extern bool_t qcsapi_wifi_set_hs20_params_remote_1_svc(); +#define QCSAPI_REMOVE_11U_PARAM_REMOTE 5611 +extern enum clnt_stat qcsapi_remove_11u_param_remote_1(); +extern bool_t qcsapi_remove_11u_param_remote_1_svc(); +#define QCSAPI_REMOVE_HS20_PARAM_REMOTE 5621 +extern enum clnt_stat qcsapi_remove_hs20_param_remote_1(); +extern bool_t qcsapi_remove_hs20_param_remote_1_svc(); +#define QCSAPI_WIFI_GET_IEEE11I_ENCRYPTION_MODES_REMOTE 1751 +extern enum clnt_stat qcsapi_wifi_get_ieee11i_encryption_modes_remote_1(); +extern bool_t qcsapi_wifi_get_ieee11i_encryption_modes_remote_1_svc(); +#define QCSAPI_WIFI_SET_IEEE11I_ENCRYPTION_MODES_REMOTE 1761 +extern enum clnt_stat qcsapi_wifi_set_ieee11i_encryption_modes_remote_1(); +extern bool_t qcsapi_wifi_set_ieee11i_encryption_modes_remote_1_svc(); +#define QCSAPI_WIFI_GET_IEEE11I_AUTHENTICATION_MODE_REMOTE 1771 +extern enum clnt_stat qcsapi_wifi_get_ieee11i_authentication_mode_remote_1(); +extern bool_t qcsapi_wifi_get_ieee11i_authentication_mode_remote_1_svc(); +#define QCSAPI_WIFI_SET_IEEE11I_AUTHENTICATION_MODE_REMOTE 1781 +extern enum clnt_stat qcsapi_wifi_set_ieee11i_authentication_mode_remote_1(); +extern bool_t qcsapi_wifi_set_ieee11i_authentication_mode_remote_1_svc(); +#define QCSAPI_WIFI_GET_MICHAEL_ERRCNT_REMOTE 1791 +extern enum clnt_stat qcsapi_wifi_get_michael_errcnt_remote_1(); +extern bool_t qcsapi_wifi_get_michael_errcnt_remote_1_svc(); +#define QCSAPI_WIFI_GET_PRE_SHARED_KEY_REMOTE 1801 +extern enum clnt_stat qcsapi_wifi_get_pre_shared_key_remote_1(); +extern bool_t qcsapi_wifi_get_pre_shared_key_remote_1_svc(); +#define QCSAPI_WIFI_SET_PRE_SHARED_KEY_REMOTE 1811 +extern enum clnt_stat qcsapi_wifi_set_pre_shared_key_remote_1(); +extern bool_t qcsapi_wifi_set_pre_shared_key_remote_1_svc(); +#define QCSAPI_WIFI_ADD_RADIUS_AUTH_SERVER_CFG_REMOTE 5801 +extern enum clnt_stat qcsapi_wifi_add_radius_auth_server_cfg_remote_1(); +extern bool_t qcsapi_wifi_add_radius_auth_server_cfg_remote_1_svc(); +#define QCSAPI_WIFI_DEL_RADIUS_AUTH_SERVER_CFG_REMOTE 5811 +extern enum clnt_stat qcsapi_wifi_del_radius_auth_server_cfg_remote_1(); +extern bool_t qcsapi_wifi_del_radius_auth_server_cfg_remote_1_svc(); +#define QCSAPI_WIFI_GET_RADIUS_AUTH_SERVER_CFG_REMOTE 5821 +extern enum clnt_stat qcsapi_wifi_get_radius_auth_server_cfg_remote_1(); +extern bool_t qcsapi_wifi_get_radius_auth_server_cfg_remote_1_svc(); +#define QCSAPI_WIFI_SET_OWN_IP_ADDR_REMOTE 1881 +extern enum clnt_stat qcsapi_wifi_set_own_ip_addr_remote_1(); +extern bool_t qcsapi_wifi_set_own_ip_addr_remote_1_svc(); +#define QCSAPI_WIFI_GET_KEY_PASSPHRASE_REMOTE 1891 +extern enum clnt_stat qcsapi_wifi_get_key_passphrase_remote_1(); +extern bool_t qcsapi_wifi_get_key_passphrase_remote_1_svc(); +#define QCSAPI_WIFI_SET_KEY_PASSPHRASE_REMOTE 1901 +extern enum clnt_stat qcsapi_wifi_set_key_passphrase_remote_1(); +extern bool_t qcsapi_wifi_set_key_passphrase_remote_1_svc(); +#define QCSAPI_WIFI_GET_GROUP_KEY_INTERVAL_REMOTE 1911 +extern enum clnt_stat qcsapi_wifi_get_group_key_interval_remote_1(); +extern bool_t qcsapi_wifi_get_group_key_interval_remote_1_svc(); +#define QCSAPI_WIFI_SET_GROUP_KEY_INTERVAL_REMOTE 1921 +extern enum clnt_stat qcsapi_wifi_set_group_key_interval_remote_1(); +extern bool_t qcsapi_wifi_set_group_key_interval_remote_1_svc(); +#define QCSAPI_WIFI_GET_PMF_REMOTE 1931 +extern enum clnt_stat qcsapi_wifi_get_pmf_remote_1(); +extern bool_t qcsapi_wifi_get_pmf_remote_1_svc(); +#define QCSAPI_WIFI_SET_PMF_REMOTE 1941 +extern enum clnt_stat qcsapi_wifi_set_pmf_remote_1(); +extern bool_t qcsapi_wifi_set_pmf_remote_1_svc(); +#define QCSAPI_WIFI_GET_WPA_STATUS_REMOTE 1951 +extern enum clnt_stat qcsapi_wifi_get_wpa_status_remote_1(); +extern bool_t qcsapi_wifi_get_wpa_status_remote_1_svc(); +#define QCSAPI_WIFI_GET_PSK_AUTH_FAILURES_REMOTE 1961 +extern enum clnt_stat qcsapi_wifi_get_psk_auth_failures_remote_1(); +extern bool_t qcsapi_wifi_get_psk_auth_failures_remote_1_svc(); +#define QCSAPI_WIFI_GET_AUTH_STATE_REMOTE 1971 +extern enum clnt_stat qcsapi_wifi_get_auth_state_remote_1(); +extern bool_t qcsapi_wifi_get_auth_state_remote_1_svc(); +#define QCSAPI_WIFI_SET_SECURITY_DEFER_MODE_REMOTE 1981 +extern enum clnt_stat qcsapi_wifi_set_security_defer_mode_remote_1(); +extern bool_t qcsapi_wifi_set_security_defer_mode_remote_1_svc(); +#define QCSAPI_WIFI_GET_SECURITY_DEFER_MODE_REMOTE 1991 +extern enum clnt_stat qcsapi_wifi_get_security_defer_mode_remote_1(); +extern bool_t qcsapi_wifi_get_security_defer_mode_remote_1_svc(); +#define QCSAPI_WIFI_APPLY_SECURITY_CONFIG_REMOTE 2001 +extern enum clnt_stat qcsapi_wifi_apply_security_config_remote_1(); +extern bool_t qcsapi_wifi_apply_security_config_remote_1_svc(); +#define QCSAPI_WIFI_SET_MAC_ADDRESS_FILTERING_REMOTE 2011 +extern enum clnt_stat qcsapi_wifi_set_mac_address_filtering_remote_1(); +extern bool_t qcsapi_wifi_set_mac_address_filtering_remote_1_svc(); +#define QCSAPI_WIFI_GET_MAC_ADDRESS_FILTERING_REMOTE 2021 +extern enum clnt_stat qcsapi_wifi_get_mac_address_filtering_remote_1(); +extern bool_t qcsapi_wifi_get_mac_address_filtering_remote_1_svc(); +#define QCSAPI_WIFI_AUTHORIZE_MAC_ADDRESS_REMOTE 2031 +extern enum clnt_stat qcsapi_wifi_authorize_mac_address_remote_1(); +extern bool_t qcsapi_wifi_authorize_mac_address_remote_1_svc(); +#define QCSAPI_WIFI_DENY_MAC_ADDRESS_REMOTE 2041 +extern enum clnt_stat qcsapi_wifi_deny_mac_address_remote_1(); +extern bool_t qcsapi_wifi_deny_mac_address_remote_1_svc(); +#define QCSAPI_WIFI_REMOVE_MAC_ADDRESS_REMOTE 2051 +extern enum clnt_stat qcsapi_wifi_remove_mac_address_remote_1(); +extern bool_t qcsapi_wifi_remove_mac_address_remote_1_svc(); +#define QCSAPI_WIFI_IS_MAC_ADDRESS_AUTHORIZED_REMOTE 2061 +extern enum clnt_stat qcsapi_wifi_is_mac_address_authorized_remote_1(); +extern bool_t qcsapi_wifi_is_mac_address_authorized_remote_1_svc(); +#define QCSAPI_WIFI_GET_AUTHORIZED_MAC_ADDRESSES_REMOTE 2071 +extern enum clnt_stat qcsapi_wifi_get_authorized_mac_addresses_remote_1(); +extern bool_t qcsapi_wifi_get_authorized_mac_addresses_remote_1_svc(); +#define QCSAPI_WIFI_GET_DENIED_MAC_ADDRESSES_REMOTE 2081 +extern enum clnt_stat qcsapi_wifi_get_denied_mac_addresses_remote_1(); +extern bool_t qcsapi_wifi_get_denied_mac_addresses_remote_1_svc(); +#define QCSAPI_WIFI_SET_ACCEPT_OUI_FILTER_REMOTE 2091 +extern enum clnt_stat qcsapi_wifi_set_accept_oui_filter_remote_1(); +extern bool_t qcsapi_wifi_set_accept_oui_filter_remote_1_svc(); +#define QCSAPI_WIFI_GET_ACCEPT_OUI_FILTER_REMOTE 2101 +extern enum clnt_stat qcsapi_wifi_get_accept_oui_filter_remote_1(); +extern bool_t qcsapi_wifi_get_accept_oui_filter_remote_1_svc(); +#define QCSAPI_WIFI_CLEAR_MAC_ADDRESS_FILTERS_REMOTE 2111 +extern enum clnt_stat qcsapi_wifi_clear_mac_address_filters_remote_1(); +extern bool_t qcsapi_wifi_clear_mac_address_filters_remote_1_svc(); +#define QCSAPI_WIFI_SET_MAC_ADDRESS_RESERVE_REMOTE 6011 +extern enum clnt_stat qcsapi_wifi_set_mac_address_reserve_remote_1(); +extern bool_t qcsapi_wifi_set_mac_address_reserve_remote_1_svc(); +#define QCSAPI_WIFI_GET_MAC_ADDRESS_RESERVE_REMOTE 6021 +extern enum clnt_stat qcsapi_wifi_get_mac_address_reserve_remote_1(); +extern bool_t qcsapi_wifi_get_mac_address_reserve_remote_1_svc(); +#define QCSAPI_WIFI_CLEAR_MAC_ADDRESS_RESERVE_REMOTE 6031 +extern enum clnt_stat qcsapi_wifi_clear_mac_address_reserve_remote_1(); +extern bool_t qcsapi_wifi_clear_mac_address_reserve_remote_1_svc(); +#define QCSAPI_WIFI_GET_OPTION_REMOTE 2121 +extern enum clnt_stat qcsapi_wifi_get_option_remote_1(); +extern bool_t qcsapi_wifi_get_option_remote_1_svc(); +#define QCSAPI_WIFI_SET_OPTION_REMOTE 2131 +extern enum clnt_stat qcsapi_wifi_set_option_remote_1(); +extern bool_t qcsapi_wifi_set_option_remote_1_svc(); +#define QCSAPI_GET_BOARD_PARAMETER_REMOTE 2141 +extern enum clnt_stat qcsapi_get_board_parameter_remote_1(); +extern bool_t qcsapi_get_board_parameter_remote_1_svc(); +#define QCSAPI_GET_SWFEAT_LIST_REMOTE 4451 +extern enum clnt_stat qcsapi_get_swfeat_list_remote_1(); +extern bool_t qcsapi_get_swfeat_list_remote_1_svc(); +#define QCSAPI_SSID_CREATE_SSID_REMOTE 2151 +extern enum clnt_stat qcsapi_ssid_create_ssid_remote_1(); +extern bool_t qcsapi_ssid_create_ssid_remote_1_svc(); +#define QCSAPI_SSID_REMOVE_SSID_REMOTE 2161 +extern enum clnt_stat qcsapi_ssid_remove_ssid_remote_1(); +extern bool_t qcsapi_ssid_remove_ssid_remote_1_svc(); +#define QCSAPI_SSID_VERIFY_SSID_REMOTE 2171 +extern enum clnt_stat qcsapi_ssid_verify_ssid_remote_1(); +extern bool_t qcsapi_ssid_verify_ssid_remote_1_svc(); +#define QCSAPI_SSID_RENAME_SSID_REMOTE 2181 +extern enum clnt_stat qcsapi_ssid_rename_ssid_remote_1(); +extern bool_t qcsapi_ssid_rename_ssid_remote_1_svc(); +#define QCSAPI_SSID_GET_SSID_LIST_REMOTE 2191 +extern enum clnt_stat qcsapi_ssid_get_ssid_list_remote_1(); +extern bool_t qcsapi_ssid_get_ssid_list_remote_1_svc(); +#define QCSAPI_SSID_SET_PROTOCOL_REMOTE 2201 +extern enum clnt_stat qcsapi_ssid_set_protocol_remote_1(); +extern bool_t qcsapi_ssid_set_protocol_remote_1_svc(); +#define QCSAPI_SSID_GET_PROTOCOL_REMOTE 2211 +extern enum clnt_stat qcsapi_ssid_get_protocol_remote_1(); +extern bool_t qcsapi_ssid_get_protocol_remote_1_svc(); +#define QCSAPI_SSID_GET_ENCRYPTION_MODES_REMOTE 2221 +extern enum clnt_stat qcsapi_ssid_get_encryption_modes_remote_1(); +extern bool_t qcsapi_ssid_get_encryption_modes_remote_1_svc(); +#define QCSAPI_SSID_SET_ENCRYPTION_MODES_REMOTE 2231 +extern enum clnt_stat qcsapi_ssid_set_encryption_modes_remote_1(); +extern bool_t qcsapi_ssid_set_encryption_modes_remote_1_svc(); +#define QCSAPI_SSID_GET_GROUP_ENCRYPTION_REMOTE 2241 +extern enum clnt_stat qcsapi_ssid_get_group_encryption_remote_1(); +extern bool_t qcsapi_ssid_get_group_encryption_remote_1_svc(); +#define QCSAPI_SSID_SET_GROUP_ENCRYPTION_REMOTE 2251 +extern enum clnt_stat qcsapi_ssid_set_group_encryption_remote_1(); +extern bool_t qcsapi_ssid_set_group_encryption_remote_1_svc(); +#define QCSAPI_SSID_GET_AUTHENTICATION_MODE_REMOTE 2261 +extern enum clnt_stat qcsapi_ssid_get_authentication_mode_remote_1(); +extern bool_t qcsapi_ssid_get_authentication_mode_remote_1_svc(); +#define QCSAPI_SSID_SET_AUTHENTICATION_MODE_REMOTE 2271 +extern enum clnt_stat qcsapi_ssid_set_authentication_mode_remote_1(); +extern bool_t qcsapi_ssid_set_authentication_mode_remote_1_svc(); +#define QCSAPI_SSID_GET_PRE_SHARED_KEY_REMOTE 2281 +extern enum clnt_stat qcsapi_ssid_get_pre_shared_key_remote_1(); +extern bool_t qcsapi_ssid_get_pre_shared_key_remote_1_svc(); +#define QCSAPI_SSID_SET_PRE_SHARED_KEY_REMOTE 2291 +extern enum clnt_stat qcsapi_ssid_set_pre_shared_key_remote_1(); +extern bool_t qcsapi_ssid_set_pre_shared_key_remote_1_svc(); +#define QCSAPI_SSID_GET_KEY_PASSPHRASE_REMOTE 2301 +extern enum clnt_stat qcsapi_ssid_get_key_passphrase_remote_1(); +extern bool_t qcsapi_ssid_get_key_passphrase_remote_1_svc(); +#define QCSAPI_SSID_SET_KEY_PASSPHRASE_REMOTE 2311 +extern enum clnt_stat qcsapi_ssid_set_key_passphrase_remote_1(); +extern bool_t qcsapi_ssid_set_key_passphrase_remote_1_svc(); +#define QCSAPI_SSID_GET_PMF_REMOTE 2321 +extern enum clnt_stat qcsapi_ssid_get_pmf_remote_1(); +extern bool_t qcsapi_ssid_get_pmf_remote_1_svc(); +#define QCSAPI_SSID_SET_PMF_REMOTE 2331 +extern enum clnt_stat qcsapi_ssid_set_pmf_remote_1(); +extern bool_t qcsapi_ssid_set_pmf_remote_1_svc(); +#define QCSAPI_SSID_GET_WPS_SSID_REMOTE 2341 +extern enum clnt_stat qcsapi_ssid_get_wps_ssid_remote_1(); +extern bool_t qcsapi_ssid_get_wps_ssid_remote_1_svc(); +#define QCSAPI_WIFI_VLAN_CONFIG_REMOTE 2351 +extern enum clnt_stat qcsapi_wifi_vlan_config_remote_1(); +extern bool_t qcsapi_wifi_vlan_config_remote_1_svc(); +#define QCSAPI_WIFI_SHOW_VLAN_CONFIG_REMOTE 2361 +extern enum clnt_stat qcsapi_wifi_show_vlan_config_remote_1(); +extern bool_t qcsapi_wifi_show_vlan_config_remote_1_svc(); +#define QCSAPI_ENABLE_VLAN_PASS_THROUGH_REMOTE 2371 +extern enum clnt_stat qcsapi_enable_vlan_pass_through_remote_1(); +extern bool_t qcsapi_enable_vlan_pass_through_remote_1_svc(); +#define QCSAPI_WIFI_SET_VLAN_PROMISC_REMOTE 2381 +extern enum clnt_stat qcsapi_wifi_set_vlan_promisc_remote_1(); +extern bool_t qcsapi_wifi_set_vlan_promisc_remote_1_svc(); +#define QCSAPI_WPS_REGISTRAR_REPORT_BUTTON_PRESS_REMOTE 2391 +extern enum clnt_stat qcsapi_wps_registrar_report_button_press_remote_1(); +extern bool_t qcsapi_wps_registrar_report_button_press_remote_1_svc(); +#define QCSAPI_WPS_REGISTRAR_REPORT_PIN_REMOTE 2401 +extern enum clnt_stat qcsapi_wps_registrar_report_pin_remote_1(); +extern bool_t qcsapi_wps_registrar_report_pin_remote_1_svc(); +#define QCSAPI_WPS_REGISTRAR_GET_PP_DEVNAME_REMOTE 2411 +extern enum clnt_stat qcsapi_wps_registrar_get_pp_devname_remote_1(); +extern bool_t qcsapi_wps_registrar_get_pp_devname_remote_1_svc(); +#define QCSAPI_WPS_REGISTRAR_SET_PP_DEVNAME_REMOTE 2421 +extern enum clnt_stat qcsapi_wps_registrar_set_pp_devname_remote_1(); +extern bool_t qcsapi_wps_registrar_set_pp_devname_remote_1_svc(); +#define QCSAPI_WPS_ENROLLEE_REPORT_BUTTON_PRESS_REMOTE 2431 +extern enum clnt_stat qcsapi_wps_enrollee_report_button_press_remote_1(); +extern bool_t qcsapi_wps_enrollee_report_button_press_remote_1_svc(); +#define QCSAPI_WPS_ENROLLEE_REPORT_PIN_REMOTE 2441 +extern enum clnt_stat qcsapi_wps_enrollee_report_pin_remote_1(); +extern bool_t qcsapi_wps_enrollee_report_pin_remote_1_svc(); +#define QCSAPI_WPS_ENROLLEE_GENERATE_PIN_REMOTE 2451 +extern enum clnt_stat qcsapi_wps_enrollee_generate_pin_remote_1(); +extern bool_t qcsapi_wps_enrollee_generate_pin_remote_1_svc(); +#define QCSAPI_WPS_GET_AP_PIN_REMOTE 2461 +extern enum clnt_stat qcsapi_wps_get_ap_pin_remote_1(); +extern bool_t qcsapi_wps_get_ap_pin_remote_1_svc(); +#define QCSAPI_WPS_SET_AP_PIN_REMOTE 2471 +extern enum clnt_stat qcsapi_wps_set_ap_pin_remote_1(); +extern bool_t qcsapi_wps_set_ap_pin_remote_1_svc(); +#define QCSAPI_WPS_SAVE_AP_PIN_REMOTE 2481 +extern enum clnt_stat qcsapi_wps_save_ap_pin_remote_1(); +extern bool_t qcsapi_wps_save_ap_pin_remote_1_svc(); +#define QCSAPI_WPS_ENABLE_AP_PIN_REMOTE 2491 +extern enum clnt_stat qcsapi_wps_enable_ap_pin_remote_1(); +extern bool_t qcsapi_wps_enable_ap_pin_remote_1_svc(); +#define QCSAPI_WPS_GET_STA_PIN_REMOTE 2501 +extern enum clnt_stat qcsapi_wps_get_sta_pin_remote_1(); +extern bool_t qcsapi_wps_get_sta_pin_remote_1_svc(); +#define QCSAPI_WPS_GET_STATE_REMOTE 2511 +extern enum clnt_stat qcsapi_wps_get_state_remote_1(); +extern bool_t qcsapi_wps_get_state_remote_1_svc(); +#define QCSAPI_WPS_GET_CONFIGURED_STATE_REMOTE 2521 +extern enum clnt_stat qcsapi_wps_get_configured_state_remote_1(); +extern bool_t qcsapi_wps_get_configured_state_remote_1_svc(); +#define QCSAPI_WPS_GET_RUNTIME_STATE_REMOTE 2531 +extern enum clnt_stat qcsapi_wps_get_runtime_state_remote_1(); +extern bool_t qcsapi_wps_get_runtime_state_remote_1_svc(); +#define QCSAPI_WPS_SET_CONFIGURED_STATE_REMOTE 2541 +extern enum clnt_stat qcsapi_wps_set_configured_state_remote_1(); +extern bool_t qcsapi_wps_set_configured_state_remote_1_svc(); +#define QCSAPI_WPS_GET_PARAM_REMOTE 2551 +extern enum clnt_stat qcsapi_wps_get_param_remote_1(); +extern bool_t qcsapi_wps_get_param_remote_1_svc(); +#define QCSAPI_WPS_SET_TIMEOUT_REMOTE 2561 +extern enum clnt_stat qcsapi_wps_set_timeout_remote_1(); +extern bool_t qcsapi_wps_set_timeout_remote_1_svc(); +#define QCSAPI_WPS_ON_HIDDEN_SSID_REMOTE 2571 +extern enum clnt_stat qcsapi_wps_on_hidden_ssid_remote_1(); +extern bool_t qcsapi_wps_on_hidden_ssid_remote_1_svc(); +#define QCSAPI_WPS_ON_HIDDEN_SSID_STATUS_REMOTE 2581 +extern enum clnt_stat qcsapi_wps_on_hidden_ssid_status_remote_1(); +extern bool_t qcsapi_wps_on_hidden_ssid_status_remote_1_svc(); +#define QCSAPI_WPS_UPNP_ENABLE_REMOTE 2591 +extern enum clnt_stat qcsapi_wps_upnp_enable_remote_1(); +extern bool_t qcsapi_wps_upnp_enable_remote_1_svc(); +#define QCSAPI_WPS_UPNP_STATUS_REMOTE 2601 +extern enum clnt_stat qcsapi_wps_upnp_status_remote_1(); +extern bool_t qcsapi_wps_upnp_status_remote_1_svc(); +#define QCSAPI_WPS_ALLOW_PBC_OVERLAP_REMOTE 2611 +extern enum clnt_stat qcsapi_wps_allow_pbc_overlap_remote_1(); +extern bool_t qcsapi_wps_allow_pbc_overlap_remote_1_svc(); +#define QCSAPI_WPS_GET_ALLOW_PBC_OVERLAP_STATUS_REMOTE 2621 +extern enum clnt_stat qcsapi_wps_get_allow_pbc_overlap_status_remote_1(); +extern bool_t qcsapi_wps_get_allow_pbc_overlap_status_remote_1_svc(); +#define QCSAPI_WPS_SET_ACCESS_CONTROL_REMOTE 2631 +extern enum clnt_stat qcsapi_wps_set_access_control_remote_1(); +extern bool_t qcsapi_wps_set_access_control_remote_1_svc(); +#define QCSAPI_WPS_GET_ACCESS_CONTROL_REMOTE 2641 +extern enum clnt_stat qcsapi_wps_get_access_control_remote_1(); +extern bool_t qcsapi_wps_get_access_control_remote_1_svc(); +#define QCSAPI_WPS_SET_PARAM_REMOTE 2651 +extern enum clnt_stat qcsapi_wps_set_param_remote_1(); +extern bool_t qcsapi_wps_set_param_remote_1_svc(); +#define QCSAPI_WPS_CANCEL_REMOTE 2661 +extern enum clnt_stat qcsapi_wps_cancel_remote_1(); +extern bool_t qcsapi_wps_cancel_remote_1_svc(); +#define QCSAPI_WPS_SET_PBC_IN_SRCM_REMOTE 2671 +extern enum clnt_stat qcsapi_wps_set_pbc_in_srcm_remote_1(); +extern bool_t qcsapi_wps_set_pbc_in_srcm_remote_1_svc(); +#define QCSAPI_WPS_GET_PBC_IN_SRCM_REMOTE 2681 +extern enum clnt_stat qcsapi_wps_get_pbc_in_srcm_remote_1(); +extern bool_t qcsapi_wps_get_pbc_in_srcm_remote_1_svc(); +#define QCSAPI_REGISTRAR_SET_DEFAULT_PBC_BSS_REMOTE 2691 +extern enum clnt_stat qcsapi_registrar_set_default_pbc_bss_remote_1(); +extern bool_t qcsapi_registrar_set_default_pbc_bss_remote_1_svc(); +#define QCSAPI_REGISTRAR_GET_DEFAULT_PBC_BSS_REMOTE 2701 +extern enum clnt_stat qcsapi_registrar_get_default_pbc_bss_remote_1(); +extern bool_t qcsapi_registrar_get_default_pbc_bss_remote_1_svc(); +#define QCSAPI_GPIO_SET_CONFIG_REMOTE 2711 +extern enum clnt_stat qcsapi_gpio_set_config_remote_1(); +extern bool_t qcsapi_gpio_set_config_remote_1_svc(); +#define QCSAPI_GPIO_GET_CONFIG_REMOTE 2721 +extern enum clnt_stat qcsapi_gpio_get_config_remote_1(); +extern bool_t qcsapi_gpio_get_config_remote_1_svc(); +#define QCSAPI_LED_GET_REMOTE 2731 +extern enum clnt_stat qcsapi_led_get_remote_1(); +extern bool_t qcsapi_led_get_remote_1_svc(); +#define QCSAPI_LED_SET_REMOTE 2741 +extern enum clnt_stat qcsapi_led_set_remote_1(); +extern bool_t qcsapi_led_set_remote_1_svc(); +#define QCSAPI_LED_PWM_ENABLE_REMOTE 2751 +extern enum clnt_stat qcsapi_led_pwm_enable_remote_1(); +extern bool_t qcsapi_led_pwm_enable_remote_1_svc(); +#define QCSAPI_LED_BRIGHTNESS_REMOTE 2761 +extern enum clnt_stat qcsapi_led_brightness_remote_1(); +extern bool_t qcsapi_led_brightness_remote_1_svc(); +#define QCSAPI_GPIO_ENABLE_WPS_PUSH_BUTTON_REMOTE 2781 +extern enum clnt_stat qcsapi_gpio_enable_wps_push_button_remote_1(); +extern bool_t qcsapi_gpio_enable_wps_push_button_remote_1_svc(); +#define QCSAPI_WIFI_GET_COUNT_ASSOCIATIONS_REMOTE 2791 +extern enum clnt_stat qcsapi_wifi_get_count_associations_remote_1(); +extern bool_t qcsapi_wifi_get_count_associations_remote_1_svc(); +#define QCSAPI_WIFI_GET_ASSOCIATED_DEVICE_MAC_ADDR_REMOTE 2801 +extern enum clnt_stat qcsapi_wifi_get_associated_device_mac_addr_remote_1(); +extern bool_t qcsapi_wifi_get_associated_device_mac_addr_remote_1_svc(); +#define QCSAPI_WIFI_GET_ASSOCIATED_DEVICE_IP_ADDR_REMOTE 2811 +extern enum clnt_stat qcsapi_wifi_get_associated_device_ip_addr_remote_1(); +extern bool_t qcsapi_wifi_get_associated_device_ip_addr_remote_1_svc(); +#define QCSAPI_WIFI_GET_LINK_QUALITY_REMOTE 2821 +extern enum clnt_stat qcsapi_wifi_get_link_quality_remote_1(); +extern bool_t qcsapi_wifi_get_link_quality_remote_1_svc(); +#define QCSAPI_WIFI_GET_LINK_QUALITY_MAX_REMOTE 5851 +extern enum clnt_stat qcsapi_wifi_get_link_quality_max_remote_1(); +extern bool_t qcsapi_wifi_get_link_quality_max_remote_1_svc(); +#define QCSAPI_WIFI_GET_RX_BYTES_PER_ASSOCIATION_REMOTE 2831 +extern enum clnt_stat qcsapi_wifi_get_rx_bytes_per_association_remote_1(); +extern bool_t qcsapi_wifi_get_rx_bytes_per_association_remote_1_svc(); +#define QCSAPI_WIFI_GET_TX_BYTES_PER_ASSOCIATION_REMOTE 2841 +extern enum clnt_stat qcsapi_wifi_get_tx_bytes_per_association_remote_1(); +extern bool_t qcsapi_wifi_get_tx_bytes_per_association_remote_1_svc(); +#define QCSAPI_WIFI_GET_RX_PACKETS_PER_ASSOCIATION_REMOTE 2851 +extern enum clnt_stat qcsapi_wifi_get_rx_packets_per_association_remote_1(); +extern bool_t qcsapi_wifi_get_rx_packets_per_association_remote_1_svc(); +#define QCSAPI_WIFI_GET_TX_PACKETS_PER_ASSOCIATION_REMOTE 2861 +extern enum clnt_stat qcsapi_wifi_get_tx_packets_per_association_remote_1(); +extern bool_t qcsapi_wifi_get_tx_packets_per_association_remote_1_svc(); +#define QCSAPI_WIFI_GET_TX_ERR_PACKETS_PER_ASSOCIATION_REMOTE 2871 +extern enum clnt_stat qcsapi_wifi_get_tx_err_packets_per_association_remote_1(); +extern bool_t qcsapi_wifi_get_tx_err_packets_per_association_remote_1_svc(); +#define QCSAPI_WIFI_GET_RSSI_PER_ASSOCIATION_REMOTE 2881 +extern enum clnt_stat qcsapi_wifi_get_rssi_per_association_remote_1(); +extern bool_t qcsapi_wifi_get_rssi_per_association_remote_1_svc(); +#define QCSAPI_WIFI_GET_RSSI_IN_DBM_PER_ASSOCIATION_REMOTE 2891 +extern enum clnt_stat qcsapi_wifi_get_rssi_in_dbm_per_association_remote_1(); +extern bool_t qcsapi_wifi_get_rssi_in_dbm_per_association_remote_1_svc(); +#define QCSAPI_WIFI_GET_BW_PER_ASSOCIATION_REMOTE 2901 +extern enum clnt_stat qcsapi_wifi_get_bw_per_association_remote_1(); +extern bool_t qcsapi_wifi_get_bw_per_association_remote_1_svc(); +#define QCSAPI_WIFI_GET_TX_PHY_RATE_PER_ASSOCIATION_REMOTE 2911 +extern enum clnt_stat qcsapi_wifi_get_tx_phy_rate_per_association_remote_1(); +extern bool_t qcsapi_wifi_get_tx_phy_rate_per_association_remote_1_svc(); +#define QCSAPI_WIFI_GET_RX_PHY_RATE_PER_ASSOCIATION_REMOTE 2921 +extern enum clnt_stat qcsapi_wifi_get_rx_phy_rate_per_association_remote_1(); +extern bool_t qcsapi_wifi_get_rx_phy_rate_per_association_remote_1_svc(); +#define QCSAPI_WIFI_GET_TX_MCS_PER_ASSOCIATION_REMOTE 2931 +extern enum clnt_stat qcsapi_wifi_get_tx_mcs_per_association_remote_1(); +extern bool_t qcsapi_wifi_get_tx_mcs_per_association_remote_1_svc(); +#define QCSAPI_WIFI_GET_RX_MCS_PER_ASSOCIATION_REMOTE 2941 +extern enum clnt_stat qcsapi_wifi_get_rx_mcs_per_association_remote_1(); +extern bool_t qcsapi_wifi_get_rx_mcs_per_association_remote_1_svc(); +#define QCSAPI_WIFI_GET_ACHIEVABLE_TX_PHY_RATE_PER_ASSOCIATION_REMOTE 2951 +extern enum clnt_stat qcsapi_wifi_get_achievable_tx_phy_rate_per_association_remote_1(); +extern bool_t qcsapi_wifi_get_achievable_tx_phy_rate_per_association_remote_1_svc(); +#define QCSAPI_WIFI_GET_ACHIEVABLE_RX_PHY_RATE_PER_ASSOCIATION_REMOTE 2961 +extern enum clnt_stat qcsapi_wifi_get_achievable_rx_phy_rate_per_association_remote_1(); +extern bool_t qcsapi_wifi_get_achievable_rx_phy_rate_per_association_remote_1_svc(); +#define QCSAPI_WIFI_GET_AUTH_ENC_PER_ASSOCIATION_REMOTE 2971 +extern enum clnt_stat qcsapi_wifi_get_auth_enc_per_association_remote_1(); +extern bool_t qcsapi_wifi_get_auth_enc_per_association_remote_1_svc(); +#define QCSAPI_WIFI_GET_TPUT_CAPS_REMOTE 2981 +extern enum clnt_stat qcsapi_wifi_get_tput_caps_remote_1(); +extern bool_t qcsapi_wifi_get_tput_caps_remote_1_svc(); +#define QCSAPI_WIFI_GET_CONNECTION_MODE_REMOTE 2991 +extern enum clnt_stat qcsapi_wifi_get_connection_mode_remote_1(); +extern bool_t qcsapi_wifi_get_connection_mode_remote_1_svc(); +#define QCSAPI_WIFI_GET_VENDOR_PER_ASSOCIATION_REMOTE 3001 +extern enum clnt_stat qcsapi_wifi_get_vendor_per_association_remote_1(); +extern bool_t qcsapi_wifi_get_vendor_per_association_remote_1_svc(); +#define QCSAPI_WIFI_GET_MAX_MIMO_REMOTE 4461 +extern enum clnt_stat qcsapi_wifi_get_max_mimo_remote_1(); +extern bool_t qcsapi_wifi_get_max_mimo_remote_1_svc(); +#define QCSAPI_WIFI_GET_SNR_PER_ASSOCIATION_REMOTE 3011 +extern enum clnt_stat qcsapi_wifi_get_snr_per_association_remote_1(); +extern bool_t qcsapi_wifi_get_snr_per_association_remote_1_svc(); +#define QCSAPI_WIFI_GET_TIME_ASSOCIATED_PER_ASSOCIATION_REMOTE 3021 +extern enum clnt_stat qcsapi_wifi_get_time_associated_per_association_remote_1(); +extern bool_t qcsapi_wifi_get_time_associated_per_association_remote_1_svc(); +#define QCSAPI_WIFI_GET_NODE_PARAM_REMOTE 3031 +extern enum clnt_stat qcsapi_wifi_get_node_param_remote_1(); +extern bool_t qcsapi_wifi_get_node_param_remote_1_svc(); +#define QCSAPI_WIFI_GET_NODE_COUNTER_REMOTE 3041 +extern enum clnt_stat qcsapi_wifi_get_node_counter_remote_1(); +extern bool_t qcsapi_wifi_get_node_counter_remote_1_svc(); +#define QCSAPI_WIFI_GET_NODE_STATS_REMOTE 3051 +extern enum clnt_stat qcsapi_wifi_get_node_stats_remote_1(); +extern bool_t qcsapi_wifi_get_node_stats_remote_1_svc(); +#define QCSAPI_WIFI_GET_MAX_QUEUED_REMOTE 3061 +extern enum clnt_stat qcsapi_wifi_get_max_queued_remote_1(); +extern bool_t qcsapi_wifi_get_max_queued_remote_1_svc(); +#define QCSAPI_WIFI_GET_HW_NOISE_PER_ASSOCIATION_REMOTE 3071 +extern enum clnt_stat qcsapi_wifi_get_hw_noise_per_association_remote_1(); +extern bool_t qcsapi_wifi_get_hw_noise_per_association_remote_1_svc(); +#define QCSAPI_WIFI_GET_MLME_STATS_PER_MAC_REMOTE 3591 +extern enum clnt_stat qcsapi_wifi_get_mlme_stats_per_mac_remote_1(); +extern bool_t qcsapi_wifi_get_mlme_stats_per_mac_remote_1_svc(); +#define QCSAPI_WIFI_GET_MLME_STATS_PER_ASSOCIATION_REMOTE 3601 +extern enum clnt_stat qcsapi_wifi_get_mlme_stats_per_association_remote_1(); +extern bool_t qcsapi_wifi_get_mlme_stats_per_association_remote_1_svc(); +#define QCSAPI_WIFI_GET_MLME_STATS_MACS_LIST_REMOTE 3611 +extern enum clnt_stat qcsapi_wifi_get_mlme_stats_macs_list_remote_1(); +extern bool_t qcsapi_wifi_get_mlme_stats_macs_list_remote_1_svc(); +#define QCSAPI_WIFI_GET_LIST_REGULATORY_REGIONS_REMOTE 3081 +extern enum clnt_stat qcsapi_wifi_get_list_regulatory_regions_remote_1(); +extern bool_t qcsapi_wifi_get_list_regulatory_regions_remote_1_svc(); +#define QCSAPI_REGULATORY_GET_LIST_REGULATORY_REGIONS_REMOTE 3091 +extern enum clnt_stat qcsapi_regulatory_get_list_regulatory_regions_remote_1(); +extern bool_t qcsapi_regulatory_get_list_regulatory_regions_remote_1_svc(); +#define QCSAPI_WIFI_GET_LIST_REGULATORY_CHANNELS_REMOTE 3101 +extern enum clnt_stat qcsapi_wifi_get_list_regulatory_channels_remote_1(); +extern bool_t qcsapi_wifi_get_list_regulatory_channels_remote_1_svc(); +#define QCSAPI_REGULATORY_GET_LIST_REGULATORY_CHANNELS_REMOTE 3111 +extern enum clnt_stat qcsapi_regulatory_get_list_regulatory_channels_remote_1(); +extern bool_t qcsapi_regulatory_get_list_regulatory_channels_remote_1_svc(); +#define QCSAPI_REGULATORY_GET_LIST_REGULATORY_BANDS_REMOTE 3121 +extern enum clnt_stat qcsapi_regulatory_get_list_regulatory_bands_remote_1(); +extern bool_t qcsapi_regulatory_get_list_regulatory_bands_remote_1_svc(); +#define QCSAPI_WIFI_GET_REGULATORY_TX_POWER_REMOTE 3131 +extern enum clnt_stat qcsapi_wifi_get_regulatory_tx_power_remote_1(); +extern bool_t qcsapi_wifi_get_regulatory_tx_power_remote_1_svc(); +#define QCSAPI_REGULATORY_GET_REGULATORY_TX_POWER_REMOTE 3141 +extern enum clnt_stat qcsapi_regulatory_get_regulatory_tx_power_remote_1(); +extern bool_t qcsapi_regulatory_get_regulatory_tx_power_remote_1_svc(); +#define QCSAPI_WIFI_GET_CONFIGURED_TX_POWER_REMOTE 3151 +extern enum clnt_stat qcsapi_wifi_get_configured_tx_power_remote_1(); +extern bool_t qcsapi_wifi_get_configured_tx_power_remote_1_svc(); +#define QCSAPI_REGULATORY_GET_CONFIGURED_TX_POWER_REMOTE 3161 +extern enum clnt_stat qcsapi_regulatory_get_configured_tx_power_remote_1(); +extern bool_t qcsapi_regulatory_get_configured_tx_power_remote_1_svc(); +#define QCSAPI_REGULATORY_GET_CONFIGURED_TX_POWER_EXT_REMOTE 5681 +extern enum clnt_stat qcsapi_regulatory_get_configured_tx_power_ext_remote_1(); +extern bool_t qcsapi_regulatory_get_configured_tx_power_ext_remote_1_svc(); +#define QCSAPI_WIFI_SET_REGULATORY_REGION_REMOTE 3171 +extern enum clnt_stat qcsapi_wifi_set_regulatory_region_remote_1(); +extern bool_t qcsapi_wifi_set_regulatory_region_remote_1_svc(); +#define QCSAPI_REGULATORY_SET_REGULATORY_REGION_REMOTE 3181 +extern enum clnt_stat qcsapi_regulatory_set_regulatory_region_remote_1(); +extern bool_t qcsapi_regulatory_set_regulatory_region_remote_1_svc(); +#define QCSAPI_REGULATORY_RESTORE_REGULATORY_TX_POWER_REMOTE 3191 +extern enum clnt_stat qcsapi_regulatory_restore_regulatory_tx_power_remote_1(); +extern bool_t qcsapi_regulatory_restore_regulatory_tx_power_remote_1_svc(); +#define QCSAPI_WIFI_GET_REGULATORY_REGION_REMOTE 3201 +extern enum clnt_stat qcsapi_wifi_get_regulatory_region_remote_1(); +extern bool_t qcsapi_wifi_get_regulatory_region_remote_1_svc(); +#define QCSAPI_REGULATORY_OVERWRITE_COUNTRY_CODE_REMOTE 3211 +extern enum clnt_stat qcsapi_regulatory_overwrite_country_code_remote_1(); +extern bool_t qcsapi_regulatory_overwrite_country_code_remote_1_svc(); +#define QCSAPI_WIFI_SET_REGULATORY_CHANNEL_REMOTE 3221 +extern enum clnt_stat qcsapi_wifi_set_regulatory_channel_remote_1(); +extern bool_t qcsapi_wifi_set_regulatory_channel_remote_1_svc(); +#define QCSAPI_REGULATORY_SET_REGULATORY_CHANNEL_REMOTE 3231 +extern enum clnt_stat qcsapi_regulatory_set_regulatory_channel_remote_1(); +extern bool_t qcsapi_regulatory_set_regulatory_channel_remote_1_svc(); +#define QCSAPI_REGULATORY_GET_DB_VERSION_REMOTE 3241 +extern enum clnt_stat qcsapi_regulatory_get_db_version_remote_1(); +extern bool_t qcsapi_regulatory_get_db_version_remote_1_svc(); +#define QCSAPI_REGULATORY_APPLY_TX_POWER_CAP_REMOTE 3251 +extern enum clnt_stat qcsapi_regulatory_apply_tx_power_cap_remote_1(); +extern bool_t qcsapi_regulatory_apply_tx_power_cap_remote_1_svc(); +#define QCSAPI_WIFI_GET_LIST_DFS_CHANNELS_REMOTE 3261 +extern enum clnt_stat qcsapi_wifi_get_list_dfs_channels_remote_1(); +extern bool_t qcsapi_wifi_get_list_dfs_channels_remote_1_svc(); +#define QCSAPI_REGULATORY_GET_LIST_DFS_CHANNELS_REMOTE 3271 +extern enum clnt_stat qcsapi_regulatory_get_list_dfs_channels_remote_1(); +extern bool_t qcsapi_regulatory_get_list_dfs_channels_remote_1_svc(); +#define QCSAPI_WIFI_IS_CHANNEL_DFS_REMOTE 3281 +extern enum clnt_stat qcsapi_wifi_is_channel_dfs_remote_1(); +extern bool_t qcsapi_wifi_is_channel_dfs_remote_1_svc(); +#define QCSAPI_REGULATORY_IS_CHANNEL_DFS_REMOTE 3291 +extern enum clnt_stat qcsapi_regulatory_is_channel_dfs_remote_1(); +extern bool_t qcsapi_regulatory_is_channel_dfs_remote_1_svc(); +#define QCSAPI_WIFI_GET_DFS_CCE_CHANNELS_REMOTE 3301 +extern enum clnt_stat qcsapi_wifi_get_dfs_cce_channels_remote_1(); +extern bool_t qcsapi_wifi_get_dfs_cce_channels_remote_1_svc(); +#define QCSAPI_WIFI_GET_DFS_ALT_CHANNEL_REMOTE 3311 +extern enum clnt_stat qcsapi_wifi_get_dfs_alt_channel_remote_1(); +extern bool_t qcsapi_wifi_get_dfs_alt_channel_remote_1_svc(); +#define QCSAPI_WIFI_SET_DFS_ALT_CHANNEL_REMOTE 3321 +extern enum clnt_stat qcsapi_wifi_set_dfs_alt_channel_remote_1(); +extern bool_t qcsapi_wifi_set_dfs_alt_channel_remote_1_svc(); +#define QCSAPI_WIFI_START_DFS_REENTRY_REMOTE 3331 +extern enum clnt_stat qcsapi_wifi_start_dfs_reentry_remote_1(); +extern bool_t qcsapi_wifi_start_dfs_reentry_remote_1_svc(); +#define QCSAPI_WIFI_START_SCAN_EXT_REMOTE 3341 +extern enum clnt_stat qcsapi_wifi_start_scan_ext_remote_1(); +extern bool_t qcsapi_wifi_start_scan_ext_remote_1_svc(); +#define QCSAPI_WIFI_GET_CSW_RECORDS_REMOTE 3351 +extern enum clnt_stat qcsapi_wifi_get_csw_records_remote_1(); +extern bool_t qcsapi_wifi_get_csw_records_remote_1_svc(); +#define QCSAPI_WIFI_GET_RADAR_STATUS_REMOTE 3361 +extern enum clnt_stat qcsapi_wifi_get_radar_status_remote_1(); +extern bool_t qcsapi_wifi_get_radar_status_remote_1_svc(); +#define QCSAPI_WIFI_GET_CAC_STATUS_REMOTE 1191 +extern enum clnt_stat qcsapi_wifi_get_cac_status_remote_1(); +extern bool_t qcsapi_wifi_get_cac_status_remote_1_svc(); +#define QCSAPI_WIFI_GET_RESULTS_AP_SCAN_REMOTE 3371 +extern enum clnt_stat qcsapi_wifi_get_results_ap_scan_remote_1(); +extern bool_t qcsapi_wifi_get_results_ap_scan_remote_1_svc(); +#define QCSAPI_WIFI_GET_COUNT_APS_SCANNED_REMOTE 3381 +extern enum clnt_stat qcsapi_wifi_get_count_aps_scanned_remote_1(); +extern bool_t qcsapi_wifi_get_count_aps_scanned_remote_1_svc(); +#define QCSAPI_WIFI_GET_PROPERTIES_AP_REMOTE 3391 +extern enum clnt_stat qcsapi_wifi_get_properties_ap_remote_1(); +extern bool_t qcsapi_wifi_get_properties_ap_remote_1_svc(); +#define QCSAPI_WIFI_SET_SCAN_CHK_INV_REMOTE 4491 +extern enum clnt_stat qcsapi_wifi_set_scan_chk_inv_remote_1(); +extern bool_t qcsapi_wifi_set_scan_chk_inv_remote_1_svc(); +#define QCSAPI_WIFI_GET_SCAN_CHK_INV_REMOTE 4501 +extern enum clnt_stat qcsapi_wifi_get_scan_chk_inv_remote_1(); +extern bool_t qcsapi_wifi_get_scan_chk_inv_remote_1_svc(); +#define QCSAPI_WIFI_SET_SCAN_BUF_MAX_SIZE_REMOTE 4301 +extern enum clnt_stat qcsapi_wifi_set_scan_buf_max_size_remote_1(); +extern bool_t qcsapi_wifi_set_scan_buf_max_size_remote_1_svc(); +#define QCSAPI_WIFI_GET_SCAN_BUF_MAX_SIZE_REMOTE 4311 +extern enum clnt_stat qcsapi_wifi_get_scan_buf_max_size_remote_1(); +extern bool_t qcsapi_wifi_get_scan_buf_max_size_remote_1_svc(); +#define QCSAPI_WIFI_SET_SCAN_TABLE_MAX_LEN_REMOTE 4321 +extern enum clnt_stat qcsapi_wifi_set_scan_table_max_len_remote_1(); +extern bool_t qcsapi_wifi_set_scan_table_max_len_remote_1_svc(); +#define QCSAPI_WIFI_GET_SCAN_TABLE_MAX_LEN_REMOTE 4331 +extern enum clnt_stat qcsapi_wifi_get_scan_table_max_len_remote_1(); +extern bool_t qcsapi_wifi_get_scan_table_max_len_remote_1_svc(); +#define QCSAPI_WIFI_SET_DWELL_TIMES_REMOTE 1121 +extern enum clnt_stat qcsapi_wifi_set_dwell_times_remote_1(); +extern bool_t qcsapi_wifi_set_dwell_times_remote_1_svc(); +#define QCSAPI_WIFI_GET_DWELL_TIMES_REMOTE 1131 +extern enum clnt_stat qcsapi_wifi_get_dwell_times_remote_1(); +extern bool_t qcsapi_wifi_get_dwell_times_remote_1_svc(); +#define QCSAPI_WIFI_SET_BGSCAN_DWELL_TIMES_REMOTE 1141 +extern enum clnt_stat qcsapi_wifi_set_bgscan_dwell_times_remote_1(); +extern bool_t qcsapi_wifi_set_bgscan_dwell_times_remote_1_svc(); +#define QCSAPI_WIFI_GET_BGSCAN_DWELL_TIMES_REMOTE 1151 +extern enum clnt_stat qcsapi_wifi_get_bgscan_dwell_times_remote_1(); +extern bool_t qcsapi_wifi_get_bgscan_dwell_times_remote_1_svc(); +#define QCSAPI_WIFI_START_SCAN_REMOTE 1161 +extern enum clnt_stat qcsapi_wifi_start_scan_remote_1(); +extern bool_t qcsapi_wifi_start_scan_remote_1_svc(); +#define QCSAPI_WIFI_CANCEL_SCAN_REMOTE 1171 +extern enum clnt_stat qcsapi_wifi_cancel_scan_remote_1(); +extern bool_t qcsapi_wifi_cancel_scan_remote_1_svc(); +#define QCSAPI_WIFI_GET_SCAN_STATUS_REMOTE 1181 +extern enum clnt_stat qcsapi_wifi_get_scan_status_remote_1(); +extern bool_t qcsapi_wifi_get_scan_status_remote_1_svc(); +#define QCSAPI_WIFI_ENABLE_BGSCAN_REMOTE 1561 +extern enum clnt_stat qcsapi_wifi_enable_bgscan_remote_1(); +extern bool_t qcsapi_wifi_enable_bgscan_remote_1_svc(); +#define QCSAPI_WIFI_GET_BGSCAN_STATUS_REMOTE 1571 +extern enum clnt_stat qcsapi_wifi_get_bgscan_status_remote_1(); +extern bool_t qcsapi_wifi_get_bgscan_status_remote_1_svc(); +#define QCSAPI_WIFI_WAIT_SCAN_COMPLETES_REMOTE 1201 +extern enum clnt_stat qcsapi_wifi_wait_scan_completes_remote_1(); +extern bool_t qcsapi_wifi_wait_scan_completes_remote_1_svc(); +#define QCSAPI_WIFI_BACKOFF_FAIL_MAX_REMOTE 3401 +extern enum clnt_stat qcsapi_wifi_backoff_fail_max_remote_1(); +extern bool_t qcsapi_wifi_backoff_fail_max_remote_1_svc(); +#define QCSAPI_WIFI_BACKOFF_TIMEOUT_REMOTE 3411 +extern enum clnt_stat qcsapi_wifi_backoff_timeout_remote_1(); +extern bool_t qcsapi_wifi_backoff_timeout_remote_1_svc(); +#define QCSAPI_WIFI_GET_MCS_RATE_REMOTE 3421 +extern enum clnt_stat qcsapi_wifi_get_mcs_rate_remote_1(); +extern bool_t qcsapi_wifi_get_mcs_rate_remote_1_svc(); +#define QCSAPI_WIFI_SET_MCS_RATE_REMOTE 3431 +extern enum clnt_stat qcsapi_wifi_set_mcs_rate_remote_1(); +extern bool_t qcsapi_wifi_set_mcs_rate_remote_1_svc(); +#define QCSAPI_WIFI_SET_PAIRING_ID_REMOTE 3441 +extern enum clnt_stat qcsapi_wifi_set_pairing_id_remote_1(); +extern bool_t qcsapi_wifi_set_pairing_id_remote_1_svc(); +#define QCSAPI_WIFI_GET_PAIRING_ID_REMOTE 3451 +extern enum clnt_stat qcsapi_wifi_get_pairing_id_remote_1(); +extern bool_t qcsapi_wifi_get_pairing_id_remote_1_svc(); +#define QCSAPI_WIFI_SET_PAIRING_ENABLE_REMOTE 3461 +extern enum clnt_stat qcsapi_wifi_set_pairing_enable_remote_1(); +extern bool_t qcsapi_wifi_set_pairing_enable_remote_1_svc(); +#define QCSAPI_WIFI_GET_PAIRING_ENABLE_REMOTE 3471 +extern enum clnt_stat qcsapi_wifi_get_pairing_enable_remote_1(); +extern bool_t qcsapi_wifi_get_pairing_enable_remote_1_svc(); +#define QCSAPI_NON_WPS_SET_PP_ENABLE_REMOTE 3481 +extern enum clnt_stat qcsapi_non_wps_set_pp_enable_remote_1(); +extern bool_t qcsapi_non_wps_set_pp_enable_remote_1_svc(); +#define QCSAPI_NON_WPS_GET_PP_ENABLE_REMOTE 3491 +extern enum clnt_stat qcsapi_non_wps_get_pp_enable_remote_1(); +extern bool_t qcsapi_non_wps_get_pp_enable_remote_1_svc(); +#define QCSAPI_WIFI_SET_VENDOR_FIX_REMOTE 3501 +extern enum clnt_stat qcsapi_wifi_set_vendor_fix_remote_1(); +extern bool_t qcsapi_wifi_set_vendor_fix_remote_1_svc(); +#define QCSAPI_ERRNO_GET_MESSAGE_REMOTE 3511 +extern enum clnt_stat qcsapi_errno_get_message_remote_1(); +extern bool_t qcsapi_errno_get_message_remote_1_svc(); +#define QCSAPI_GET_INTERFACE_STATS_REMOTE 3521 +extern enum clnt_stat qcsapi_get_interface_stats_remote_1(); +extern bool_t qcsapi_get_interface_stats_remote_1_svc(); +#define QCSAPI_GET_PHY_STATS_REMOTE 3531 +extern enum clnt_stat qcsapi_get_phy_stats_remote_1(); +extern bool_t qcsapi_get_phy_stats_remote_1_svc(); +#define QCSAPI_RESET_ALL_COUNTERS_REMOTE 3541 +extern enum clnt_stat qcsapi_reset_all_counters_remote_1(); +extern bool_t qcsapi_reset_all_counters_remote_1_svc(); +#define QCSAPI_GET_UBOOT_INFO_REMOTE 661 +extern enum clnt_stat qcsapi_get_uboot_info_remote_1(); +extern bool_t qcsapi_get_uboot_info_remote_1_svc(); +#define QCSAPI_FIRMWARE_GET_VERSION_REMOTE 3551 +extern enum clnt_stat qcsapi_firmware_get_version_remote_1(); +extern bool_t qcsapi_firmware_get_version_remote_1_svc(); +#define QCSAPI_FLASH_IMAGE_UPDATE_REMOTE 3561 +extern enum clnt_stat qcsapi_flash_image_update_remote_1(); +extern bool_t qcsapi_flash_image_update_remote_1_svc(); +#define QCSAPI_SEND_FILE_REMOTE 5961 +extern enum clnt_stat qcsapi_send_file_remote_1(); +extern bool_t qcsapi_send_file_remote_1_svc(); +#define QCSAPI_PM_SET_MODE_REMOTE 3621 +extern enum clnt_stat qcsapi_pm_set_mode_remote_1(); +extern bool_t qcsapi_pm_set_mode_remote_1_svc(); +#define QCSAPI_PM_GET_MODE_REMOTE 3631 +extern enum clnt_stat qcsapi_pm_get_mode_remote_1(); +extern bool_t qcsapi_pm_get_mode_remote_1_svc(); +#define QCSAPI_GET_QPM_LEVEL_REMOTE 3641 +extern enum clnt_stat qcsapi_get_qpm_level_remote_1(); +extern bool_t qcsapi_get_qpm_level_remote_1_svc(); +#define QCSAPI_SET_HOST_STATE_REMOTE 4151 +extern enum clnt_stat qcsapi_set_host_state_remote_1(); +extern bool_t qcsapi_set_host_state_remote_1_svc(); +#define QCSAPI_QTM_GET_STATE_REMOTE 3651 +extern enum clnt_stat qcsapi_qtm_get_state_remote_1(); +extern bool_t qcsapi_qtm_get_state_remote_1_svc(); +#define QCSAPI_QTM_GET_STATE_ALL_REMOTE 3661 +extern enum clnt_stat qcsapi_qtm_get_state_all_remote_1(); +extern bool_t qcsapi_qtm_get_state_all_remote_1_svc(); +#define QCSAPI_QTM_SET_STATE_REMOTE 3671 +extern enum clnt_stat qcsapi_qtm_set_state_remote_1(); +extern bool_t qcsapi_qtm_set_state_remote_1_svc(); +#define QCSAPI_QTM_GET_CONFIG_REMOTE 3681 +extern enum clnt_stat qcsapi_qtm_get_config_remote_1(); +extern bool_t qcsapi_qtm_get_config_remote_1_svc(); +#define QCSAPI_QTM_GET_CONFIG_ALL_REMOTE 3691 +extern enum clnt_stat qcsapi_qtm_get_config_all_remote_1(); +extern bool_t qcsapi_qtm_get_config_all_remote_1_svc(); +#define QCSAPI_QTM_SET_CONFIG_REMOTE 3701 +extern enum clnt_stat qcsapi_qtm_set_config_remote_1(); +extern bool_t qcsapi_qtm_set_config_remote_1_svc(); +#define QCSAPI_QTM_ADD_RULE_REMOTE 3751 +extern enum clnt_stat qcsapi_qtm_add_rule_remote_1(); +extern bool_t qcsapi_qtm_add_rule_remote_1_svc(); +#define QCSAPI_QTM_DEL_RULE_REMOTE 3761 +extern enum clnt_stat qcsapi_qtm_del_rule_remote_1(); +extern bool_t qcsapi_qtm_del_rule_remote_1_svc(); +#define QCSAPI_QTM_DEL_RULE_INDEX_REMOTE 3771 +extern enum clnt_stat qcsapi_qtm_del_rule_index_remote_1(); +extern bool_t qcsapi_qtm_del_rule_index_remote_1_svc(); +#define QCSAPI_QTM_GET_RULE_REMOTE 3781 +extern enum clnt_stat qcsapi_qtm_get_rule_remote_1(); +extern bool_t qcsapi_qtm_get_rule_remote_1_svc(); +#define QCSAPI_QTM_GET_STRM_REMOTE 3791 +extern enum clnt_stat qcsapi_qtm_get_strm_remote_1(); +extern bool_t qcsapi_qtm_get_strm_remote_1_svc(); +#define QCSAPI_QTM_GET_STATS_REMOTE 3801 +extern enum clnt_stat qcsapi_qtm_get_stats_remote_1(); +extern bool_t qcsapi_qtm_get_stats_remote_1_svc(); +#define QCSAPI_QTM_GET_INACTIVE_FLAGS_REMOTE 3811 +extern enum clnt_stat qcsapi_qtm_get_inactive_flags_remote_1(); +extern bool_t qcsapi_qtm_get_inactive_flags_remote_1_svc(); +#define QCSAPI_WIFI_RUN_SCRIPT_REMOTE 3821 +extern enum clnt_stat qcsapi_wifi_run_script_remote_1(); +extern bool_t qcsapi_wifi_run_script_remote_1_svc(); +#define QCSAPI_WIFI_TEST_TRAFFIC_REMOTE 3831 +extern enum clnt_stat qcsapi_wifi_test_traffic_remote_1(); +extern bool_t qcsapi_wifi_test_traffic_remote_1_svc(); +#define QCSAPI_WIFI_ADD_IPFF_REMOTE 3841 +extern enum clnt_stat qcsapi_wifi_add_ipff_remote_1(); +extern bool_t qcsapi_wifi_add_ipff_remote_1_svc(); +#define QCSAPI_WIFI_DEL_IPFF_REMOTE 3851 +extern enum clnt_stat qcsapi_wifi_del_ipff_remote_1(); +extern bool_t qcsapi_wifi_del_ipff_remote_1_svc(); +#define QCSAPI_WIFI_GET_IPFF_REMOTE 3861 +extern enum clnt_stat qcsapi_wifi_get_ipff_remote_1(); +extern bool_t qcsapi_wifi_get_ipff_remote_1_svc(); +#define QCSAPI_WIFI_GET_RTS_THRESHOLD_REMOTE 3871 +extern enum clnt_stat qcsapi_wifi_get_rts_threshold_remote_1(); +extern bool_t qcsapi_wifi_get_rts_threshold_remote_1_svc(); +#define QCSAPI_WIFI_SET_RTS_THRESHOLD_REMOTE 3881 +extern enum clnt_stat qcsapi_wifi_set_rts_threshold_remote_1(); +extern bool_t qcsapi_wifi_set_rts_threshold_remote_1_svc(); +#define QCSAPI_WIFI_SET_NSS_CAP_REMOTE 4131 +extern enum clnt_stat qcsapi_wifi_set_nss_cap_remote_1(); +extern bool_t qcsapi_wifi_set_nss_cap_remote_1_svc(); +#define QCSAPI_WIFI_GET_NSS_CAP_REMOTE 4141 +extern enum clnt_stat qcsapi_wifi_get_nss_cap_remote_1(); +extern bool_t qcsapi_wifi_get_nss_cap_remote_1_svc(); +#define QCSAPI_WIFI_GET_TX_AMSDU_REMOTE 4171 +extern enum clnt_stat qcsapi_wifi_get_tx_amsdu_remote_1(); +extern bool_t qcsapi_wifi_get_tx_amsdu_remote_1_svc(); +#define QCSAPI_WIFI_SET_TX_AMSDU_REMOTE 4181 +extern enum clnt_stat qcsapi_wifi_set_tx_amsdu_remote_1(); +extern bool_t qcsapi_wifi_set_tx_amsdu_remote_1_svc(); +#define QCSAPI_WIFI_GET_DISASSOC_REASON_REMOTE 4271 +extern enum clnt_stat qcsapi_wifi_get_disassoc_reason_remote_1(); +extern bool_t qcsapi_wifi_get_disassoc_reason_remote_1_svc(); +#define QCSAPI_WIFI_BLOCK_BSS_REMOTE 6201 +extern enum clnt_stat qcsapi_wifi_block_bss_remote_1(); +extern bool_t qcsapi_wifi_block_bss_remote_1_svc(); +#define QCSAPI_WIFI_VERIFY_REPEATER_MODE_REMOTE 6171 +extern enum clnt_stat qcsapi_wifi_verify_repeater_mode_remote_1(); +extern bool_t qcsapi_wifi_verify_repeater_mode_remote_1_svc(); +#define QCSAPI_WIFI_SET_AP_INTERFACE_NAME_REMOTE 6181 +extern enum clnt_stat qcsapi_wifi_set_ap_interface_name_remote_1(); +extern bool_t qcsapi_wifi_set_ap_interface_name_remote_1_svc(); +#define QCSAPI_WIFI_GET_AP_INTERFACE_NAME_REMOTE 6191 +extern enum clnt_stat qcsapi_wifi_get_ap_interface_name_remote_1(); +extern bool_t qcsapi_wifi_get_ap_interface_name_remote_1_svc(); +#define QCSAPI_GET_TEMPERATURE_INFO_REMOTE 3892 +extern enum clnt_stat qcsapi_get_temperature_info_remote_1(); +extern bool_t qcsapi_get_temperature_info_remote_1_svc(); +#define QCSAPI_CALCMD_SET_TEST_MODE_REMOTE 3901 +extern enum clnt_stat qcsapi_calcmd_set_test_mode_remote_1(); +extern bool_t qcsapi_calcmd_set_test_mode_remote_1_svc(); +#define QCSAPI_CALCMD_SHOW_TEST_PACKET_REMOTE 3911 +extern enum clnt_stat qcsapi_calcmd_show_test_packet_remote_1(); +extern bool_t qcsapi_calcmd_show_test_packet_remote_1_svc(); +#define QCSAPI_CALCMD_SEND_TEST_PACKET_REMOTE 3921 +extern enum clnt_stat qcsapi_calcmd_send_test_packet_remote_1(); +extern bool_t qcsapi_calcmd_send_test_packet_remote_1_svc(); +#define QCSAPI_CALCMD_STOP_TEST_PACKET_REMOTE 3931 +extern enum clnt_stat qcsapi_calcmd_stop_test_packet_remote_1(); +extern bool_t qcsapi_calcmd_stop_test_packet_remote_1_svc(); +#define QCSAPI_CALCMD_SEND_DC_CW_SIGNAL_REMOTE 3941 +extern enum clnt_stat qcsapi_calcmd_send_dc_cw_signal_remote_1(); +extern bool_t qcsapi_calcmd_send_dc_cw_signal_remote_1_svc(); +#define QCSAPI_CALCMD_STOP_DC_CW_SIGNAL_REMOTE 3951 +extern enum clnt_stat qcsapi_calcmd_stop_dc_cw_signal_remote_1(); +extern bool_t qcsapi_calcmd_stop_dc_cw_signal_remote_1_svc(); +#define QCSAPI_CALCMD_GET_TEST_MODE_ANTENNA_SEL_REMOTE 3961 +extern enum clnt_stat qcsapi_calcmd_get_test_mode_antenna_sel_remote_1(); +extern bool_t qcsapi_calcmd_get_test_mode_antenna_sel_remote_1_svc(); +#define QCSAPI_CALCMD_GET_TEST_MODE_MCS_REMOTE 3971 +extern enum clnt_stat qcsapi_calcmd_get_test_mode_mcs_remote_1(); +extern bool_t qcsapi_calcmd_get_test_mode_mcs_remote_1_svc(); +#define QCSAPI_CALCMD_GET_TEST_MODE_BW_REMOTE 3981 +extern enum clnt_stat qcsapi_calcmd_get_test_mode_bw_remote_1(); +extern bool_t qcsapi_calcmd_get_test_mode_bw_remote_1_svc(); +#define QCSAPI_CALCMD_GET_TX_POWER_REMOTE 3991 +extern enum clnt_stat qcsapi_calcmd_get_tx_power_remote_1(); +extern bool_t qcsapi_calcmd_get_tx_power_remote_1_svc(); +#define QCSAPI_CALCMD_SET_TX_POWER_REMOTE 4001 +extern enum clnt_stat qcsapi_calcmd_set_tx_power_remote_1(); +extern bool_t qcsapi_calcmd_set_tx_power_remote_1_svc(); +#define QCSAPI_CALCMD_GET_TEST_MODE_RSSI_REMOTE 4011 +extern enum clnt_stat qcsapi_calcmd_get_test_mode_rssi_remote_1(); +extern bool_t qcsapi_calcmd_get_test_mode_rssi_remote_1_svc(); +#define QCSAPI_CALCMD_SET_MAC_FILTER_REMOTE 4021 +extern enum clnt_stat qcsapi_calcmd_set_mac_filter_remote_1(); +extern bool_t qcsapi_calcmd_set_mac_filter_remote_1_svc(); +#define QCSAPI_CALCMD_GET_ANTENNA_COUNT_REMOTE 4031 +extern enum clnt_stat qcsapi_calcmd_get_antenna_count_remote_1(); +extern bool_t qcsapi_calcmd_get_antenna_count_remote_1_svc(); +#define QCSAPI_CALCMD_CLEAR_COUNTER_REMOTE 4041 +extern enum clnt_stat qcsapi_calcmd_clear_counter_remote_1(); +extern bool_t qcsapi_calcmd_clear_counter_remote_1_svc(); +#define QCSAPI_CALCMD_GET_INFO_REMOTE 4051 +extern enum clnt_stat qcsapi_calcmd_get_info_remote_1(); +extern bool_t qcsapi_calcmd_get_info_remote_1_svc(); +#define QCSAPI_WOWLAN_SET_MATCH_TYPE_REMOTE 4161 +extern enum clnt_stat qcsapi_wowlan_set_match_type_remote_1(); +extern bool_t qcsapi_wowlan_set_match_type_remote_1_svc(); +#define QCSAPI_WOWLAN_SET_L2_TYPE_REMOTE 4191 +extern enum clnt_stat qcsapi_wowlan_set_l2_type_remote_1(); +extern bool_t qcsapi_wowlan_set_l2_type_remote_1_svc(); +#define QCSAPI_WOWLAN_SET_UDP_PORT_REMOTE 4201 +extern enum clnt_stat qcsapi_wowlan_set_udp_port_remote_1(); +extern bool_t qcsapi_wowlan_set_udp_port_remote_1_svc(); +#define QCSAPI_WOWLAN_SET_MAGIC_PATTERN_REMOTE 4211 +extern enum clnt_stat qcsapi_wowlan_set_magic_pattern_remote_1(); +extern bool_t qcsapi_wowlan_set_magic_pattern_remote_1_svc(); +#define QCSAPI_WIFI_WOWLAN_GET_HOST_STATE_REMOTE 4221 +extern enum clnt_stat qcsapi_wifi_wowlan_get_host_state_remote_1(); +extern bool_t qcsapi_wifi_wowlan_get_host_state_remote_1_svc(); +#define QCSAPI_WIFI_WOWLAN_GET_MATCH_TYPE_REMOTE 4231 +extern enum clnt_stat qcsapi_wifi_wowlan_get_match_type_remote_1(); +extern bool_t qcsapi_wifi_wowlan_get_match_type_remote_1_svc(); +#define QCSAPI_WIFI_WOWLAN_GET_L2_TYPE_REMOTE 4241 +extern enum clnt_stat qcsapi_wifi_wowlan_get_l2_type_remote_1(); +extern bool_t qcsapi_wifi_wowlan_get_l2_type_remote_1_svc(); +#define QCSAPI_WIFI_WOWLAN_GET_UDP_PORT_REMOTE 4251 +extern enum clnt_stat qcsapi_wifi_wowlan_get_udp_port_remote_1(); +extern bool_t qcsapi_wifi_wowlan_get_udp_port_remote_1_svc(); +#define QCSAPI_WIFI_WOWLAN_GET_MAGIC_PATTERN_REMOTE 4261 +extern enum clnt_stat qcsapi_wifi_wowlan_get_magic_pattern_remote_1(); +extern bool_t qcsapi_wifi_wowlan_get_magic_pattern_remote_1_svc(); +#define QCSAPI_WIFI_SET_ENABLE_MU_REMOTE 5861 +extern enum clnt_stat qcsapi_wifi_set_enable_mu_remote_1(); +extern bool_t qcsapi_wifi_set_enable_mu_remote_1_svc(); +#define QCSAPI_WIFI_GET_ENABLE_MU_REMOTE 5871 +extern enum clnt_stat qcsapi_wifi_get_enable_mu_remote_1(); +extern bool_t qcsapi_wifi_get_enable_mu_remote_1_svc(); +#define QCSAPI_WIFI_SET_MU_USE_PRECODE_REMOTE 5881 +extern enum clnt_stat qcsapi_wifi_set_mu_use_precode_remote_1(); +extern bool_t qcsapi_wifi_set_mu_use_precode_remote_1_svc(); +#define QCSAPI_WIFI_GET_MU_USE_PRECODE_REMOTE 5891 +extern enum clnt_stat qcsapi_wifi_get_mu_use_precode_remote_1(); +extern bool_t qcsapi_wifi_get_mu_use_precode_remote_1_svc(); +#define QCSAPI_WIFI_SET_MU_USE_EQ_REMOTE 5901 +extern enum clnt_stat qcsapi_wifi_set_mu_use_eq_remote_1(); +extern bool_t qcsapi_wifi_set_mu_use_eq_remote_1_svc(); +#define QCSAPI_WIFI_GET_MU_USE_EQ_REMOTE 5911 +extern enum clnt_stat qcsapi_wifi_get_mu_use_eq_remote_1(); +extern bool_t qcsapi_wifi_get_mu_use_eq_remote_1_svc(); +#define QCSAPI_WIFI_GET_MU_GROUPS_REMOTE 5921 +extern enum clnt_stat qcsapi_wifi_get_mu_groups_remote_1(); +extern bool_t qcsapi_wifi_get_mu_groups_remote_1_svc(); +#define QCSAPI_WIFI_ENABLE_TDLS_REMOTE 4111 +extern enum clnt_stat qcsapi_wifi_enable_tdls_remote_1(); +extern bool_t qcsapi_wifi_enable_tdls_remote_1_svc(); +#define QCSAPI_WIFI_ENABLE_TDLS_OVER_QHOP_REMOTE 4381 +extern enum clnt_stat qcsapi_wifi_enable_tdls_over_qhop_remote_1(); +extern bool_t qcsapi_wifi_enable_tdls_over_qhop_remote_1_svc(); +#define QCSAPI_WIFI_GET_TDLS_STATUS_REMOTE 4341 +extern enum clnt_stat qcsapi_wifi_get_tdls_status_remote_1(); +extern bool_t qcsapi_wifi_get_tdls_status_remote_1_svc(); +#define QCSAPI_WIFI_SET_TDLS_PARAMS_REMOTE 4351 +extern enum clnt_stat qcsapi_wifi_set_tdls_params_remote_1(); +extern bool_t qcsapi_wifi_set_tdls_params_remote_1_svc(); +#define QCSAPI_WIFI_GET_TDLS_PARAMS_REMOTE 4361 +extern enum clnt_stat qcsapi_wifi_get_tdls_params_remote_1(); +extern bool_t qcsapi_wifi_get_tdls_params_remote_1_svc(); +#define QCSAPI_WIFI_TDLS_OPERATE_REMOTE 4371 +extern enum clnt_stat qcsapi_wifi_tdls_operate_remote_1(); +extern bool_t qcsapi_wifi_tdls_operate_remote_1_svc(); +extern int qcsapi_prog_1_freeresult (); +#endif /* K&R C */ + +/* the xdr functions */ + +#if defined(__STDC__) || defined(__cplusplus) +extern bool_t xdr_str (XDR *, str*); +extern bool_t xdr___rpc_string (XDR *, __rpc_string*); +extern bool_t xdr___rpc_string_p (XDR *, __rpc_string_p*); +extern bool_t xdr___rpc_qcsapi_mac_addr (XDR *, __rpc_qcsapi_mac_addr*); +extern bool_t xdr___rpc_qcsapi_mac_addr_p (XDR *, __rpc_qcsapi_mac_addr_p*); +extern bool_t xdr___rpc_qcsapi_int_a32 (XDR *, __rpc_qcsapi_int_a32*); +extern bool_t xdr___rpc_qcsapi_int_a32_p (XDR *, __rpc_qcsapi_int_a32_p*); +extern bool_t xdr___rpc_qcsapi_SSID (XDR *, __rpc_qcsapi_SSID*); +extern bool_t xdr___rpc_qcsapi_scs_ranking_rpt (XDR *, __rpc_qcsapi_scs_ranking_rpt*); +extern bool_t xdr___rpc_qcsapi_scs_score_rpt (XDR *, __rpc_qcsapi_scs_score_rpt*); +extern bool_t xdr___rpc_qcsapi_scs_currchan_rpt (XDR *, __rpc_qcsapi_scs_currchan_rpt*); +extern bool_t xdr___rpc_qcsapi_autochan_rpt (XDR *, __rpc_qcsapi_autochan_rpt*); +extern bool_t xdr___rpc_qcsapi_scs_param_rpt (XDR *, __rpc_qcsapi_scs_param_rpt*); +extern bool_t xdr___rpc_qcsapi_data_512bytes (XDR *, __rpc_qcsapi_data_512bytes*); +extern bool_t xdr___rpc_qcsapi_data_256bytes (XDR *, __rpc_qcsapi_data_256bytes*); +extern bool_t xdr___rpc_qcsapi_disconn_info (XDR *, __rpc_qcsapi_disconn_info*); +extern bool_t xdr___rpc_qcsapi_data_64bytes (XDR *, __rpc_qcsapi_data_64bytes*); +extern bool_t xdr___rpc_qcsapi_channel_power_table (XDR *, __rpc_qcsapi_channel_power_table*); +extern bool_t xdr___rpc_qcsapi_assoc_records (XDR *, __rpc_qcsapi_assoc_records*); +extern bool_t xdr___rpc_ieee8011req_sta_tput_caps (XDR *, __rpc_ieee8011req_sta_tput_caps*); +extern bool_t xdr___rpc_qcsapi_measure_report_result (XDR *, __rpc_qcsapi_measure_report_result*); +extern bool_t xdr___rpc_qcsapi_node_stats (XDR *, __rpc_qcsapi_node_stats*); +extern bool_t xdr___rpc_qcsapi_mlme_stats (XDR *, __rpc_qcsapi_mlme_stats*); +extern bool_t xdr___rpc_qcsapi_mlme_stats_macs (XDR *, __rpc_qcsapi_mlme_stats_macs*); +extern bool_t xdr___rpc_qcsapi_csw_record (XDR *, __rpc_qcsapi_csw_record*); +extern bool_t xdr___rpc_qcsapi_radar_status (XDR *, __rpc_qcsapi_radar_status*); +extern bool_t xdr___rpc_qcsapi_ap_properties (XDR *, __rpc_qcsapi_ap_properties*); +extern bool_t xdr___rpc_qcsapi_interface_stats (XDR *, __rpc_qcsapi_interface_stats*); +extern bool_t xdr___rpc_qcsapi_phy_stats (XDR *, __rpc_qcsapi_phy_stats*); +extern bool_t xdr___rpc_early_flash_config (XDR *, __rpc_early_flash_config*); +extern bool_t xdr___rpc_qcsapi_data_128bytes (XDR *, __rpc_qcsapi_data_128bytes*); +extern bool_t xdr___rpc_qcsapi_data_1Kbytes (XDR *, __rpc_qcsapi_data_1Kbytes*); +extern bool_t xdr___rpc_qcsapi_data_3Kbytes (XDR *, __rpc_qcsapi_data_3Kbytes*); +extern bool_t xdr___rpc_qcsapi_data_4Kbytes (XDR *, __rpc_qcsapi_data_4Kbytes*); +extern bool_t xdr___rpc_qcsapi_calcmd_tx_power_rsp (XDR *, __rpc_qcsapi_calcmd_tx_power_rsp*); +extern bool_t xdr___rpc_qcsapi_calcmd_rssi_rsp (XDR *, __rpc_qcsapi_calcmd_rssi_rsp*); +extern bool_t xdr_qcsapi_bootcfg_get_parameter_rpcdata (XDR *, qcsapi_bootcfg_get_parameter_rpcdata*); +extern bool_t xdr_qcsapi_bootcfg_update_parameter_rpcdata (XDR *, qcsapi_bootcfg_update_parameter_rpcdata*); +extern bool_t xdr_qcsapi_bootcfg_commit_rpcdata (XDR *, qcsapi_bootcfg_commit_rpcdata*); +extern bool_t xdr_qcsapi_telnet_enable_rpcdata (XDR *, qcsapi_telnet_enable_rpcdata*); +extern bool_t xdr_qcsapi_get_service_name_enum_rpcdata (XDR *, qcsapi_get_service_name_enum_rpcdata*); +extern bool_t xdr_qcsapi_get_service_action_enum_rpcdata (XDR *, qcsapi_get_service_action_enum_rpcdata*); +extern bool_t xdr_qcsapi_service_control_rpcdata (XDR *, qcsapi_service_control_rpcdata*); +extern bool_t xdr_qcsapi_wfa_cert_mode_enable_rpcdata (XDR *, qcsapi_wfa_cert_mode_enable_rpcdata*); +extern bool_t xdr_qcsapi_wifi_get_scs_cce_channels_rpcdata (XDR *, qcsapi_wifi_get_scs_cce_channels_rpcdata*); +extern bool_t xdr_qcsapi_wifi_scs_enable_rpcdata (XDR *, qcsapi_wifi_scs_enable_rpcdata*); +extern bool_t xdr_qcsapi_wifi_scs_switch_channel_rpcdata (XDR *, qcsapi_wifi_scs_switch_channel_rpcdata*); +extern bool_t xdr_qcsapi_wifi_set_scs_verbose_rpcdata (XDR *, qcsapi_wifi_set_scs_verbose_rpcdata*); +extern bool_t xdr_qcsapi_wifi_get_scs_status_rpcdata (XDR *, qcsapi_wifi_get_scs_status_rpcdata*); +extern bool_t xdr_qcsapi_wifi_set_scs_smpl_enable_rpcdata (XDR *, qcsapi_wifi_set_scs_smpl_enable_rpcdata*); +extern bool_t xdr_qcsapi_wifi_set_scs_smpl_dwell_time_rpcdata (XDR *, qcsapi_wifi_set_scs_smpl_dwell_time_rpcdata*); +extern bool_t xdr_qcsapi_wifi_set_scs_sample_intv_rpcdata (XDR *, qcsapi_wifi_set_scs_sample_intv_rpcdata*); +extern bool_t xdr_qcsapi_wifi_set_scs_intf_detect_intv_rpcdata (XDR *, qcsapi_wifi_set_scs_intf_detect_intv_rpcdata*); +extern bool_t xdr_qcsapi_wifi_set_scs_thrshld_rpcdata (XDR *, qcsapi_wifi_set_scs_thrshld_rpcdata*); +extern bool_t xdr_qcsapi_wifi_set_scs_report_only_rpcdata (XDR *, qcsapi_wifi_set_scs_report_only_rpcdata*); +extern bool_t xdr_qcsapi_wifi_get_scs_stat_report_rpcdata (XDR *, qcsapi_wifi_get_scs_stat_report_rpcdata*); +extern bool_t xdr_qcsapi_wifi_get_scs_score_report_rpcdata (XDR *, qcsapi_wifi_get_scs_score_report_rpcdata*); +extern bool_t xdr_qcsapi_wifi_get_scs_currchan_report_rpcdata (XDR *, qcsapi_wifi_get_scs_currchan_report_rpcdata*); +extern bool_t xdr_qcsapi_wifi_set_scs_stats_rpcdata (XDR *, qcsapi_wifi_set_scs_stats_rpcdata*); +extern bool_t xdr_qcsapi_wifi_get_autochan_report_rpcdata (XDR *, qcsapi_wifi_get_autochan_report_rpcdata*); +extern bool_t xdr_qcsapi_wifi_set_scs_cca_intf_smth_fctr_rpcdata (XDR *, qcsapi_wifi_set_scs_cca_intf_smth_fctr_rpcdata*); +extern bool_t xdr_qcsapi_wifi_set_scs_chan_mtrc_mrgn_rpcdata (XDR *, qcsapi_wifi_set_scs_chan_mtrc_mrgn_rpcdata*); +extern bool_t xdr_qcsapi_wifi_get_scs_cca_intf_rpcdata (XDR *, qcsapi_wifi_get_scs_cca_intf_rpcdata*); +extern bool_t xdr_qcsapi_wifi_get_scs_param_report_rpcdata (XDR *, qcsapi_wifi_get_scs_param_report_rpcdata*); +extern bool_t xdr_qcsapi_wifi_get_scs_dfs_reentry_request_rpcdata (XDR *, qcsapi_wifi_get_scs_dfs_reentry_request_rpcdata*); +extern bool_t xdr_qcsapi_wifi_start_ocac_rpcdata (XDR *, qcsapi_wifi_start_ocac_rpcdata*); +extern bool_t xdr_qcsapi_wifi_stop_ocac_rpcdata (XDR *, qcsapi_wifi_stop_ocac_rpcdata*); +extern bool_t xdr_qcsapi_wifi_get_ocac_status_rpcdata (XDR *, qcsapi_wifi_get_ocac_status_rpcdata*); +extern bool_t xdr_qcsapi_wifi_set_ocac_dwell_time_rpcdata (XDR *, qcsapi_wifi_set_ocac_dwell_time_rpcdata*); +extern bool_t xdr_qcsapi_wifi_set_ocac_duration_rpcdata (XDR *, qcsapi_wifi_set_ocac_duration_rpcdata*); +extern bool_t xdr_qcsapi_wifi_set_ocac_cac_time_rpcdata (XDR *, qcsapi_wifi_set_ocac_cac_time_rpcdata*); +extern bool_t xdr_qcsapi_wifi_set_ocac_report_only_rpcdata (XDR *, qcsapi_wifi_set_ocac_report_only_rpcdata*); +extern bool_t xdr_qcsapi_wifi_set_ocac_thrshld_rpcdata (XDR *, qcsapi_wifi_set_ocac_thrshld_rpcdata*); +extern bool_t xdr_qcsapi_wifi_start_dfs_s_radio_rpcdata (XDR *, qcsapi_wifi_start_dfs_s_radio_rpcdata*); +extern bool_t xdr_qcsapi_wifi_stop_dfs_s_radio_rpcdata (XDR *, qcsapi_wifi_stop_dfs_s_radio_rpcdata*); +extern bool_t xdr_qcsapi_wifi_get_dfs_s_radio_status_rpcdata (XDR *, qcsapi_wifi_get_dfs_s_radio_status_rpcdata*); +extern bool_t xdr_qcsapi_wifi_get_dfs_s_radio_availability_rpcdata (XDR *, qcsapi_wifi_get_dfs_s_radio_availability_rpcdata*); +extern bool_t xdr_qcsapi_wifi_set_dfs_s_radio_dwell_time_rpcdata (XDR *, qcsapi_wifi_set_dfs_s_radio_dwell_time_rpcdata*); +extern bool_t xdr_qcsapi_wifi_set_dfs_s_radio_duration_rpcdata (XDR *, qcsapi_wifi_set_dfs_s_radio_duration_rpcdata*); +extern bool_t xdr_qcsapi_wifi_set_dfs_s_radio_wea_duration_rpcdata (XDR *, qcsapi_wifi_set_dfs_s_radio_wea_duration_rpcdata*); +extern bool_t xdr_qcsapi_wifi_set_dfs_s_radio_cac_time_rpcdata (XDR *, qcsapi_wifi_set_dfs_s_radio_cac_time_rpcdata*); +extern bool_t xdr_qcsapi_wifi_set_dfs_s_radio_wea_cac_time_rpcdata (XDR *, qcsapi_wifi_set_dfs_s_radio_wea_cac_time_rpcdata*); +extern bool_t xdr_qcsapi_wifi_set_dfs_s_radio_report_only_rpcdata (XDR *, qcsapi_wifi_set_dfs_s_radio_report_only_rpcdata*); +extern bool_t xdr_qcsapi_wifi_set_dfs_s_radio_thrshld_rpcdata (XDR *, qcsapi_wifi_set_dfs_s_radio_thrshld_rpcdata*); +extern bool_t xdr_qcsapi_init_rpcdata (XDR *, qcsapi_init_rpcdata*); +extern bool_t xdr_qcsapi_console_disconnect_rpcdata (XDR *, qcsapi_console_disconnect_rpcdata*); +extern bool_t xdr_qcsapi_wifi_startprod_rpcdata (XDR *, qcsapi_wifi_startprod_rpcdata*); +extern bool_t xdr_qcsapi_is_startprod_done_rpcdata (XDR *, qcsapi_is_startprod_done_rpcdata*); +extern bool_t xdr_qcsapi_system_get_time_since_start_rpcdata (XDR *, qcsapi_system_get_time_since_start_rpcdata*); +extern bool_t xdr_qcsapi_get_system_status_rpcdata (XDR *, qcsapi_get_system_status_rpcdata*); +extern bool_t xdr_qcsapi_get_random_seed_rpcdata (XDR *, qcsapi_get_random_seed_rpcdata*); +extern bool_t xdr_qcsapi_set_random_seed_rpcdata (XDR *, qcsapi_set_random_seed_rpcdata*); +extern bool_t xdr_qcsapi_get_carrier_id_rpcdata (XDR *, qcsapi_get_carrier_id_rpcdata*); +extern bool_t xdr_qcsapi_set_carrier_id_rpcdata (XDR *, qcsapi_set_carrier_id_rpcdata*); +extern bool_t xdr_qcsapi_wifi_get_spinor_jedecid_rpcdata (XDR *, qcsapi_wifi_get_spinor_jedecid_rpcdata*); +extern bool_t xdr_qcsapi_wifi_get_bb_param_rpcdata (XDR *, qcsapi_wifi_get_bb_param_rpcdata*); +extern bool_t xdr_qcsapi_wifi_set_bb_param_rpcdata (XDR *, qcsapi_wifi_set_bb_param_rpcdata*); +extern bool_t xdr_qcsapi_wifi_set_optim_stats_rpcdata (XDR *, qcsapi_wifi_set_optim_stats_rpcdata*); +extern bool_t xdr_qcsapi_wifi_set_sys_time_rpcdata (XDR *, qcsapi_wifi_set_sys_time_rpcdata*); +extern bool_t xdr_qcsapi_wifi_get_sys_time_rpcdata (XDR *, qcsapi_wifi_get_sys_time_rpcdata*); +extern bool_t xdr_qcsapi_set_soc_mac_addr_rpcdata (XDR *, qcsapi_set_soc_mac_addr_rpcdata*); +extern bool_t xdr_qcsapi_get_custom_value_rpcdata (XDR *, qcsapi_get_custom_value_rpcdata*); +extern bool_t xdr_qcsapi_config_get_parameter_rpcdata (XDR *, qcsapi_config_get_parameter_rpcdata*); +extern bool_t xdr_qcsapi_config_update_parameter_rpcdata (XDR *, qcsapi_config_update_parameter_rpcdata*); +extern bool_t xdr_qcsapi_config_get_ssid_parameter_rpcdata (XDR *, qcsapi_config_get_ssid_parameter_rpcdata*); +extern bool_t xdr_qcsapi_config_update_ssid_parameter_rpcdata (XDR *, qcsapi_config_update_ssid_parameter_rpcdata*); +extern bool_t xdr_qcsapi_file_path_get_config_rpcdata (XDR *, qcsapi_file_path_get_config_rpcdata*); +extern bool_t xdr_qcsapi_file_path_set_config_rpcdata (XDR *, qcsapi_file_path_set_config_rpcdata*); +extern bool_t xdr_qcsapi_restore_default_config_rpcdata (XDR *, qcsapi_restore_default_config_rpcdata*); +extern bool_t xdr_qcsapi_store_ipaddr_rpcdata (XDR *, qcsapi_store_ipaddr_rpcdata*); +extern bool_t xdr_qcsapi_interface_enable_rpcdata (XDR *, qcsapi_interface_enable_rpcdata*); +extern bool_t xdr_qcsapi_interface_get_status_rpcdata (XDR *, qcsapi_interface_get_status_rpcdata*); +extern bool_t xdr_qcsapi_interface_set_ip4_rpcdata (XDR *, qcsapi_interface_set_ip4_rpcdata*); +extern bool_t xdr_qcsapi_interface_get_ip4_rpcdata (XDR *, qcsapi_interface_get_ip4_rpcdata*); +extern bool_t xdr_qcsapi_interface_get_counter_rpcdata (XDR *, qcsapi_interface_get_counter_rpcdata*); +extern bool_t xdr_qcsapi_interface_get_counter64_rpcdata (XDR *, qcsapi_interface_get_counter64_rpcdata*); +extern bool_t xdr_qcsapi_interface_get_mac_addr_rpcdata (XDR *, qcsapi_interface_get_mac_addr_rpcdata*); +extern bool_t xdr_qcsapi_interface_set_mac_addr_rpcdata (XDR *, qcsapi_interface_set_mac_addr_rpcdata*); +extern bool_t xdr_qcsapi_pm_get_counter_rpcdata (XDR *, qcsapi_pm_get_counter_rpcdata*); +extern bool_t xdr_qcsapi_set_aspm_l1_rpcdata (XDR *, qcsapi_set_aspm_l1_rpcdata*); +extern bool_t xdr_qcsapi_set_l1_rpcdata (XDR *, qcsapi_set_l1_rpcdata*); +extern bool_t xdr_qcsapi_pm_get_elapsed_time_rpcdata (XDR *, qcsapi_pm_get_elapsed_time_rpcdata*); +extern bool_t xdr_qcsapi_eth_phy_power_control_rpcdata (XDR *, qcsapi_eth_phy_power_control_rpcdata*); +extern bool_t xdr_qcsapi_get_emac_switch_rpcdata (XDR *, qcsapi_get_emac_switch_rpcdata*); +extern bool_t xdr_qcsapi_set_emac_switch_rpcdata (XDR *, qcsapi_set_emac_switch_rpcdata*); +extern bool_t xdr_qcsapi_eth_dscp_map_rpcdata (XDR *, qcsapi_eth_dscp_map_rpcdata*); +extern bool_t xdr_qcsapi_get_eth_info_rpcdata (XDR *, qcsapi_get_eth_info_rpcdata*); +extern bool_t xdr_qcsapi_wifi_get_mode_rpcdata (XDR *, qcsapi_wifi_get_mode_rpcdata*); +extern bool_t xdr_qcsapi_wifi_set_mode_rpcdata (XDR *, qcsapi_wifi_set_mode_rpcdata*); +extern bool_t xdr_qcsapi_wifi_get_phy_mode_rpcdata (XDR *, qcsapi_wifi_get_phy_mode_rpcdata*); +extern bool_t xdr_qcsapi_wifi_set_phy_mode_rpcdata (XDR *, qcsapi_wifi_set_phy_mode_rpcdata*); +extern bool_t xdr_qcsapi_wifi_reload_in_mode_rpcdata (XDR *, qcsapi_wifi_reload_in_mode_rpcdata*); +extern bool_t xdr_qcsapi_wifi_rfenable_rpcdata (XDR *, qcsapi_wifi_rfenable_rpcdata*); +extern bool_t xdr_qcsapi_wifi_rfstatus_rpcdata (XDR *, qcsapi_wifi_rfstatus_rpcdata*); +extern bool_t xdr_qcsapi_wifi_get_bw_rpcdata (XDR *, qcsapi_wifi_get_bw_rpcdata*); +extern bool_t xdr_qcsapi_wifi_set_bw_rpcdata (XDR *, qcsapi_wifi_set_bw_rpcdata*); +extern bool_t xdr_qcsapi_wifi_set_vht_rpcdata (XDR *, qcsapi_wifi_set_vht_rpcdata*); +extern bool_t xdr_qcsapi_wifi_get_vht_rpcdata (XDR *, qcsapi_wifi_get_vht_rpcdata*); +extern bool_t xdr_qcsapi_wifi_get_channel_rpcdata (XDR *, qcsapi_wifi_get_channel_rpcdata*); +extern bool_t xdr_qcsapi_wifi_set_channel_rpcdata (XDR *, qcsapi_wifi_set_channel_rpcdata*); +extern bool_t xdr_qcsapi_wifi_set_chan_pri_inactive_rpcdata (XDR *, qcsapi_wifi_set_chan_pri_inactive_rpcdata*); +extern bool_t xdr_qcsapi_wifi_chan_control_rpcdata (XDR *, qcsapi_wifi_chan_control_rpcdata*); +extern bool_t xdr_qcsapi_wifi_get_chan_disabled_rpcdata (XDR *, qcsapi_wifi_get_chan_disabled_rpcdata*); +extern bool_t xdr_qcsapi_wifi_get_beacon_interval_rpcdata (XDR *, qcsapi_wifi_get_beacon_interval_rpcdata*); +extern bool_t xdr_qcsapi_wifi_set_beacon_interval_rpcdata (XDR *, qcsapi_wifi_set_beacon_interval_rpcdata*); +extern bool_t xdr_qcsapi_wifi_get_dtim_rpcdata (XDR *, qcsapi_wifi_get_dtim_rpcdata*); +extern bool_t xdr_qcsapi_wifi_set_dtim_rpcdata (XDR *, qcsapi_wifi_set_dtim_rpcdata*); +extern bool_t xdr_qcsapi_wifi_get_assoc_limit_rpcdata (XDR *, qcsapi_wifi_get_assoc_limit_rpcdata*); +extern bool_t xdr_qcsapi_wifi_get_bss_assoc_limit_rpcdata (XDR *, qcsapi_wifi_get_bss_assoc_limit_rpcdata*); +extern bool_t xdr_qcsapi_wifi_set_assoc_limit_rpcdata (XDR *, qcsapi_wifi_set_assoc_limit_rpcdata*); +extern bool_t xdr_qcsapi_wifi_set_bss_assoc_limit_rpcdata (XDR *, qcsapi_wifi_set_bss_assoc_limit_rpcdata*); +extern bool_t xdr_qcsapi_wifi_get_BSSID_rpcdata (XDR *, qcsapi_wifi_get_BSSID_rpcdata*); +extern bool_t xdr_qcsapi_wifi_get_config_BSSID_rpcdata (XDR *, qcsapi_wifi_get_config_BSSID_rpcdata*); +extern bool_t xdr_qcsapi_wifi_ssid_get_bssid_rpcdata (XDR *, qcsapi_wifi_ssid_get_bssid_rpcdata*); +extern bool_t xdr_qcsapi_wifi_ssid_set_bssid_rpcdata (XDR *, qcsapi_wifi_ssid_set_bssid_rpcdata*); +extern bool_t xdr_qcsapi_wifi_get_SSID_rpcdata (XDR *, qcsapi_wifi_get_SSID_rpcdata*); +extern bool_t xdr_qcsapi_wifi_set_SSID_rpcdata (XDR *, qcsapi_wifi_set_SSID_rpcdata*); +extern bool_t xdr_qcsapi_wifi_get_IEEE_802_11_standard_rpcdata (XDR *, qcsapi_wifi_get_IEEE_802_11_standard_rpcdata*); +extern bool_t xdr_qcsapi_wifi_get_list_channels_rpcdata (XDR *, qcsapi_wifi_get_list_channels_rpcdata*); +extern bool_t xdr_qcsapi_wifi_get_mode_switch_rpcdata (XDR *, qcsapi_wifi_get_mode_switch_rpcdata*); +extern bool_t xdr_qcsapi_wifi_disassociate_rpcdata (XDR *, qcsapi_wifi_disassociate_rpcdata*); +extern bool_t xdr_qcsapi_wifi_disassociate_sta_rpcdata (XDR *, qcsapi_wifi_disassociate_sta_rpcdata*); +extern bool_t xdr_qcsapi_wifi_reassociate_rpcdata (XDR *, qcsapi_wifi_reassociate_rpcdata*); +extern bool_t xdr_qcsapi_wifi_get_disconn_info_rpcdata (XDR *, qcsapi_wifi_get_disconn_info_rpcdata*); +extern bool_t xdr_qcsapi_wifi_disable_wps_rpcdata (XDR *, qcsapi_wifi_disable_wps_rpcdata*); +extern bool_t xdr_qcsapi_wifi_associate_rpcdata (XDR *, qcsapi_wifi_associate_rpcdata*); +extern bool_t xdr_qcsapi_wifi_start_cca_rpcdata (XDR *, qcsapi_wifi_start_cca_rpcdata*); +extern bool_t xdr_qcsapi_wifi_get_noise_rpcdata (XDR *, qcsapi_wifi_get_noise_rpcdata*); +extern bool_t xdr_qcsapi_wifi_get_rssi_by_chain_rpcdata (XDR *, qcsapi_wifi_get_rssi_by_chain_rpcdata*); +extern bool_t xdr_qcsapi_wifi_get_avg_snr_rpcdata (XDR *, qcsapi_wifi_get_avg_snr_rpcdata*); +extern bool_t xdr_qcsapi_get_primary_interface_rpcdata (XDR *, qcsapi_get_primary_interface_rpcdata*); +extern bool_t xdr_qcsapi_get_interface_by_index_rpcdata (XDR *, qcsapi_get_interface_by_index_rpcdata*); +extern bool_t xdr_qcsapi_wifi_set_wifi_macaddr_rpcdata (XDR *, qcsapi_wifi_set_wifi_macaddr_rpcdata*); +extern bool_t xdr_qcsapi_interface_get_BSSID_rpcdata (XDR *, qcsapi_interface_get_BSSID_rpcdata*); +extern bool_t xdr_qcsapi_wifi_get_rates_rpcdata (XDR *, qcsapi_wifi_get_rates_rpcdata*); +extern bool_t xdr_qcsapi_wifi_set_rates_rpcdata (XDR *, qcsapi_wifi_set_rates_rpcdata*); +extern bool_t xdr_qcsapi_get_max_bitrate_rpcdata (XDR *, qcsapi_get_max_bitrate_rpcdata*); +extern bool_t xdr_qcsapi_set_max_bitrate_rpcdata (XDR *, qcsapi_set_max_bitrate_rpcdata*); +extern bool_t xdr_qcsapi_wifi_qos_get_param_rpcdata (XDR *, qcsapi_wifi_qos_get_param_rpcdata*); +extern bool_t xdr_qcsapi_wifi_qos_set_param_rpcdata (XDR *, qcsapi_wifi_qos_set_param_rpcdata*); +extern bool_t xdr_qcsapi_wifi_get_wmm_ac_map_rpcdata (XDR *, qcsapi_wifi_get_wmm_ac_map_rpcdata*); +extern bool_t xdr_qcsapi_wifi_set_wmm_ac_map_rpcdata (XDR *, qcsapi_wifi_set_wmm_ac_map_rpcdata*); +extern bool_t xdr_qcsapi_wifi_get_dscp_8021p_map_rpcdata (XDR *, qcsapi_wifi_get_dscp_8021p_map_rpcdata*); +extern bool_t xdr_qcsapi_wifi_get_dscp_ac_map_rpcdata (XDR *, qcsapi_wifi_get_dscp_ac_map_rpcdata*); +extern bool_t xdr_qcsapi_wifi_set_dscp_8021p_map_rpcdata (XDR *, qcsapi_wifi_set_dscp_8021p_map_rpcdata*); +extern bool_t xdr_qcsapi_wifi_set_dscp_ac_map_rpcdata (XDR *, qcsapi_wifi_set_dscp_ac_map_rpcdata*); +extern bool_t xdr_qcsapi_wifi_get_priority_rpcdata (XDR *, qcsapi_wifi_get_priority_rpcdata*); +extern bool_t xdr_qcsapi_wifi_set_priority_rpcdata (XDR *, qcsapi_wifi_set_priority_rpcdata*); +extern bool_t xdr_qcsapi_wifi_get_airfair_rpcdata (XDR *, qcsapi_wifi_get_airfair_rpcdata*); +extern bool_t xdr_qcsapi_wifi_set_airfair_rpcdata (XDR *, qcsapi_wifi_set_airfair_rpcdata*); +extern bool_t xdr_qcsapi_wifi_get_tx_power_rpcdata (XDR *, qcsapi_wifi_get_tx_power_rpcdata*); +extern bool_t xdr_qcsapi_wifi_set_tx_power_rpcdata (XDR *, qcsapi_wifi_set_tx_power_rpcdata*); +extern bool_t xdr_qcsapi_wifi_get_bw_power_rpcdata (XDR *, qcsapi_wifi_get_bw_power_rpcdata*); +extern bool_t xdr_qcsapi_wifi_set_bw_power_rpcdata (XDR *, qcsapi_wifi_set_bw_power_rpcdata*); +extern bool_t xdr_qcsapi_wifi_get_bf_power_rpcdata (XDR *, qcsapi_wifi_get_bf_power_rpcdata*); +extern bool_t xdr_qcsapi_wifi_set_bf_power_rpcdata (XDR *, qcsapi_wifi_set_bf_power_rpcdata*); +extern bool_t xdr_qcsapi_wifi_get_tx_power_ext_rpcdata (XDR *, qcsapi_wifi_get_tx_power_ext_rpcdata*); +extern bool_t xdr_qcsapi_wifi_set_tx_power_ext_rpcdata (XDR *, qcsapi_wifi_set_tx_power_ext_rpcdata*); +extern bool_t xdr_qcsapi_wifi_get_chan_power_table_rpcdata (XDR *, qcsapi_wifi_get_chan_power_table_rpcdata*); +extern bool_t xdr_qcsapi_wifi_set_chan_power_table_rpcdata (XDR *, qcsapi_wifi_set_chan_power_table_rpcdata*); +extern bool_t xdr_qcsapi_wifi_get_power_selection_rpcdata (XDR *, qcsapi_wifi_get_power_selection_rpcdata*); +extern bool_t xdr_qcsapi_wifi_set_power_selection_rpcdata (XDR *, qcsapi_wifi_set_power_selection_rpcdata*); +extern bool_t xdr_qcsapi_wifi_get_carrier_interference_rpcdata (XDR *, qcsapi_wifi_get_carrier_interference_rpcdata*); +extern bool_t xdr_qcsapi_wifi_get_congestion_index_rpcdata (XDR *, qcsapi_wifi_get_congestion_index_rpcdata*); +extern bool_t xdr_qcsapi_wifi_get_supported_tx_power_levels_rpcdata (XDR *, qcsapi_wifi_get_supported_tx_power_levels_rpcdata*); +extern bool_t xdr_qcsapi_wifi_get_current_tx_power_level_rpcdata (XDR *, qcsapi_wifi_get_current_tx_power_level_rpcdata*); +extern bool_t xdr_qcsapi_wifi_set_power_constraint_rpcdata (XDR *, qcsapi_wifi_set_power_constraint_rpcdata*); +extern bool_t xdr_qcsapi_wifi_get_power_constraint_rpcdata (XDR *, qcsapi_wifi_get_power_constraint_rpcdata*); +extern bool_t xdr_qcsapi_wifi_set_tpc_interval_rpcdata (XDR *, qcsapi_wifi_set_tpc_interval_rpcdata*); +extern bool_t xdr_qcsapi_wifi_get_tpc_interval_rpcdata (XDR *, qcsapi_wifi_get_tpc_interval_rpcdata*); +extern bool_t xdr_qcsapi_wifi_get_assoc_records_rpcdata (XDR *, qcsapi_wifi_get_assoc_records_rpcdata*); +extern bool_t xdr_qcsapi_wifi_get_ap_isolate_rpcdata (XDR *, qcsapi_wifi_get_ap_isolate_rpcdata*); +extern bool_t xdr_qcsapi_wifi_set_ap_isolate_rpcdata (XDR *, qcsapi_wifi_set_ap_isolate_rpcdata*); +extern bool_t xdr_qcsapi_wifi_get_intra_bss_isolate_rpcdata (XDR *, qcsapi_wifi_get_intra_bss_isolate_rpcdata*); +extern bool_t xdr_qcsapi_wifi_set_intra_bss_isolate_rpcdata (XDR *, qcsapi_wifi_set_intra_bss_isolate_rpcdata*); +extern bool_t xdr_qcsapi_wifi_get_bss_isolate_rpcdata (XDR *, qcsapi_wifi_get_bss_isolate_rpcdata*); +extern bool_t xdr_qcsapi_wifi_set_bss_isolate_rpcdata (XDR *, qcsapi_wifi_set_bss_isolate_rpcdata*); +extern bool_t xdr_qcsapi_wifi_disable_dfs_channels_rpcdata (XDR *, qcsapi_wifi_disable_dfs_channels_rpcdata*); +extern bool_t xdr_qcsapi_wifi_create_restricted_bss_rpcdata (XDR *, qcsapi_wifi_create_restricted_bss_rpcdata*); +extern bool_t xdr_qcsapi_wifi_create_bss_rpcdata (XDR *, qcsapi_wifi_create_bss_rpcdata*); +extern bool_t xdr_qcsapi_wifi_remove_bss_rpcdata (XDR *, qcsapi_wifi_remove_bss_rpcdata*); +extern bool_t xdr_qcsapi_wds_add_peer_rpcdata (XDR *, qcsapi_wds_add_peer_rpcdata*); +extern bool_t xdr_qcsapi_wds_add_peer_encrypt_rpcdata (XDR *, qcsapi_wds_add_peer_encrypt_rpcdata*); +extern bool_t xdr_qcsapi_wds_remove_peer_rpcdata (XDR *, qcsapi_wds_remove_peer_rpcdata*); +extern bool_t xdr_qcsapi_wds_get_peer_address_rpcdata (XDR *, qcsapi_wds_get_peer_address_rpcdata*); +extern bool_t xdr_qcsapi_wds_set_psk_rpcdata (XDR *, qcsapi_wds_set_psk_rpcdata*); +extern bool_t xdr_qcsapi_wds_set_mode_rpcdata (XDR *, qcsapi_wds_set_mode_rpcdata*); +extern bool_t xdr_qcsapi_wds_get_mode_rpcdata (XDR *, qcsapi_wds_get_mode_rpcdata*); +extern bool_t xdr_qcsapi_wifi_set_extender_params_rpcdata (XDR *, qcsapi_wifi_set_extender_params_rpcdata*); +extern bool_t xdr_qcsapi_wifi_get_extender_params_rpcdata (XDR *, qcsapi_wifi_get_extender_params_rpcdata*); +extern bool_t xdr_qcsapi_wifi_get_beacon_type_rpcdata (XDR *, qcsapi_wifi_get_beacon_type_rpcdata*); +extern bool_t xdr_qcsapi_wifi_set_beacon_type_rpcdata (XDR *, qcsapi_wifi_set_beacon_type_rpcdata*); +extern bool_t xdr_qcsapi_wifi_get_WEP_key_index_rpcdata (XDR *, qcsapi_wifi_get_WEP_key_index_rpcdata*); +extern bool_t xdr_qcsapi_wifi_set_WEP_key_index_rpcdata (XDR *, qcsapi_wifi_set_WEP_key_index_rpcdata*); +extern bool_t xdr_qcsapi_wifi_get_WEP_key_passphrase_rpcdata (XDR *, qcsapi_wifi_get_WEP_key_passphrase_rpcdata*); +extern bool_t xdr_qcsapi_wifi_set_WEP_key_passphrase_rpcdata (XDR *, qcsapi_wifi_set_WEP_key_passphrase_rpcdata*); +extern bool_t xdr_qcsapi_wifi_get_WEP_encryption_level_rpcdata (XDR *, qcsapi_wifi_get_WEP_encryption_level_rpcdata*); +extern bool_t xdr_qcsapi_wifi_get_basic_encryption_modes_rpcdata (XDR *, qcsapi_wifi_get_basic_encryption_modes_rpcdata*); +extern bool_t xdr_qcsapi_wifi_set_basic_encryption_modes_rpcdata (XDR *, qcsapi_wifi_set_basic_encryption_modes_rpcdata*); +extern bool_t xdr_qcsapi_wifi_get_basic_authentication_mode_rpcdata (XDR *, qcsapi_wifi_get_basic_authentication_mode_rpcdata*); +extern bool_t xdr_qcsapi_wifi_set_basic_authentication_mode_rpcdata (XDR *, qcsapi_wifi_set_basic_authentication_mode_rpcdata*); +extern bool_t xdr_qcsapi_wifi_get_WEP_key_rpcdata (XDR *, qcsapi_wifi_get_WEP_key_rpcdata*); +extern bool_t xdr_qcsapi_wifi_set_WEP_key_rpcdata (XDR *, qcsapi_wifi_set_WEP_key_rpcdata*); +extern bool_t xdr_qcsapi_wifi_get_WPA_encryption_modes_rpcdata (XDR *, qcsapi_wifi_get_WPA_encryption_modes_rpcdata*); +extern bool_t xdr_qcsapi_wifi_set_WPA_encryption_modes_rpcdata (XDR *, qcsapi_wifi_set_WPA_encryption_modes_rpcdata*); +extern bool_t xdr_qcsapi_wifi_get_WPA_authentication_mode_rpcdata (XDR *, qcsapi_wifi_get_WPA_authentication_mode_rpcdata*); +extern bool_t xdr_qcsapi_wifi_set_WPA_authentication_mode_rpcdata (XDR *, qcsapi_wifi_set_WPA_authentication_mode_rpcdata*); +extern bool_t xdr_qcsapi_wifi_get_interworking_rpcdata (XDR *, qcsapi_wifi_get_interworking_rpcdata*); +extern bool_t xdr_qcsapi_wifi_set_interworking_rpcdata (XDR *, qcsapi_wifi_set_interworking_rpcdata*); +extern bool_t xdr_qcsapi_wifi_get_80211u_params_rpcdata (XDR *, qcsapi_wifi_get_80211u_params_rpcdata*); +extern bool_t xdr_qcsapi_wifi_set_80211u_params_rpcdata (XDR *, qcsapi_wifi_set_80211u_params_rpcdata*); +extern bool_t xdr_qcsapi_security_get_nai_realms_rpcdata (XDR *, qcsapi_security_get_nai_realms_rpcdata*); +extern bool_t xdr_qcsapi_security_add_nai_realm_rpcdata (XDR *, qcsapi_security_add_nai_realm_rpcdata*); +extern bool_t xdr_qcsapi_security_del_nai_realm_rpcdata (XDR *, qcsapi_security_del_nai_realm_rpcdata*); +extern bool_t xdr_qcsapi_security_get_roaming_consortium_rpcdata (XDR *, qcsapi_security_get_roaming_consortium_rpcdata*); +extern bool_t xdr_qcsapi_security_add_roaming_consortium_rpcdata (XDR *, qcsapi_security_add_roaming_consortium_rpcdata*); +extern bool_t xdr_qcsapi_security_del_roaming_consortium_rpcdata (XDR *, qcsapi_security_del_roaming_consortium_rpcdata*); +extern bool_t xdr_qcsapi_security_get_venue_name_rpcdata (XDR *, qcsapi_security_get_venue_name_rpcdata*); +extern bool_t xdr_qcsapi_security_add_venue_name_rpcdata (XDR *, qcsapi_security_add_venue_name_rpcdata*); +extern bool_t xdr_qcsapi_security_del_venue_name_rpcdata (XDR *, qcsapi_security_del_venue_name_rpcdata*); +extern bool_t xdr_qcsapi_security_get_oper_friendly_name_rpcdata (XDR *, qcsapi_security_get_oper_friendly_name_rpcdata*); +extern bool_t xdr_qcsapi_security_add_oper_friendly_name_rpcdata (XDR *, qcsapi_security_add_oper_friendly_name_rpcdata*); +extern bool_t xdr_qcsapi_security_del_oper_friendly_name_rpcdata (XDR *, qcsapi_security_del_oper_friendly_name_rpcdata*); +extern bool_t xdr_qcsapi_security_get_hs20_conn_capab_rpcdata (XDR *, qcsapi_security_get_hs20_conn_capab_rpcdata*); +extern bool_t xdr_qcsapi_security_add_hs20_conn_capab_rpcdata (XDR *, qcsapi_security_add_hs20_conn_capab_rpcdata*); +extern bool_t xdr_qcsapi_security_del_hs20_conn_capab_rpcdata (XDR *, qcsapi_security_del_hs20_conn_capab_rpcdata*); +extern bool_t xdr_qcsapi_wifi_get_hs20_status_rpcdata (XDR *, qcsapi_wifi_get_hs20_status_rpcdata*); +extern bool_t xdr_qcsapi_wifi_set_hs20_status_rpcdata (XDR *, qcsapi_wifi_set_hs20_status_rpcdata*); +extern bool_t xdr_qcsapi_wifi_get_proxy_arp_rpcdata (XDR *, qcsapi_wifi_get_proxy_arp_rpcdata*); +extern bool_t xdr_qcsapi_wifi_set_proxy_arp_rpcdata (XDR *, qcsapi_wifi_set_proxy_arp_rpcdata*); +extern bool_t xdr_qcsapi_wifi_get_l2_ext_filter_rpcdata (XDR *, qcsapi_wifi_get_l2_ext_filter_rpcdata*); +extern bool_t xdr_qcsapi_wifi_set_l2_ext_filter_rpcdata (XDR *, qcsapi_wifi_set_l2_ext_filter_rpcdata*); +extern bool_t xdr_qcsapi_wifi_get_hs20_params_rpcdata (XDR *, qcsapi_wifi_get_hs20_params_rpcdata*); +extern bool_t xdr_qcsapi_wifi_set_hs20_params_rpcdata (XDR *, qcsapi_wifi_set_hs20_params_rpcdata*); +extern bool_t xdr_qcsapi_remove_11u_param_rpcdata (XDR *, qcsapi_remove_11u_param_rpcdata*); +extern bool_t xdr_qcsapi_remove_hs20_param_rpcdata (XDR *, qcsapi_remove_hs20_param_rpcdata*); +extern bool_t xdr_qcsapi_wifi_get_IEEE11i_encryption_modes_rpcdata (XDR *, qcsapi_wifi_get_IEEE11i_encryption_modes_rpcdata*); +extern bool_t xdr_qcsapi_wifi_set_IEEE11i_encryption_modes_rpcdata (XDR *, qcsapi_wifi_set_IEEE11i_encryption_modes_rpcdata*); +extern bool_t xdr_qcsapi_wifi_get_IEEE11i_authentication_mode_rpcdata (XDR *, qcsapi_wifi_get_IEEE11i_authentication_mode_rpcdata*); +extern bool_t xdr_qcsapi_wifi_set_IEEE11i_authentication_mode_rpcdata (XDR *, qcsapi_wifi_set_IEEE11i_authentication_mode_rpcdata*); +extern bool_t xdr_qcsapi_wifi_get_michael_errcnt_rpcdata (XDR *, qcsapi_wifi_get_michael_errcnt_rpcdata*); +extern bool_t xdr_qcsapi_wifi_get_pre_shared_key_rpcdata (XDR *, qcsapi_wifi_get_pre_shared_key_rpcdata*); +extern bool_t xdr_qcsapi_wifi_set_pre_shared_key_rpcdata (XDR *, qcsapi_wifi_set_pre_shared_key_rpcdata*); +extern bool_t xdr_qcsapi_wifi_add_radius_auth_server_cfg_rpcdata (XDR *, qcsapi_wifi_add_radius_auth_server_cfg_rpcdata*); +extern bool_t xdr_qcsapi_wifi_del_radius_auth_server_cfg_rpcdata (XDR *, qcsapi_wifi_del_radius_auth_server_cfg_rpcdata*); +extern bool_t xdr_qcsapi_wifi_get_radius_auth_server_cfg_rpcdata (XDR *, qcsapi_wifi_get_radius_auth_server_cfg_rpcdata*); +extern bool_t xdr_qcsapi_wifi_set_own_ip_addr_rpcdata (XDR *, qcsapi_wifi_set_own_ip_addr_rpcdata*); +extern bool_t xdr_qcsapi_wifi_get_key_passphrase_rpcdata (XDR *, qcsapi_wifi_get_key_passphrase_rpcdata*); +extern bool_t xdr_qcsapi_wifi_set_key_passphrase_rpcdata (XDR *, qcsapi_wifi_set_key_passphrase_rpcdata*); +extern bool_t xdr_qcsapi_wifi_get_group_key_interval_rpcdata (XDR *, qcsapi_wifi_get_group_key_interval_rpcdata*); +extern bool_t xdr_qcsapi_wifi_set_group_key_interval_rpcdata (XDR *, qcsapi_wifi_set_group_key_interval_rpcdata*); +extern bool_t xdr_qcsapi_wifi_get_pmf_rpcdata (XDR *, qcsapi_wifi_get_pmf_rpcdata*); +extern bool_t xdr_qcsapi_wifi_set_pmf_rpcdata (XDR *, qcsapi_wifi_set_pmf_rpcdata*); +extern bool_t xdr_qcsapi_wifi_get_wpa_status_rpcdata (XDR *, qcsapi_wifi_get_wpa_status_rpcdata*); +extern bool_t xdr_qcsapi_wifi_get_psk_auth_failures_rpcdata (XDR *, qcsapi_wifi_get_psk_auth_failures_rpcdata*); +extern bool_t xdr_qcsapi_wifi_get_auth_state_rpcdata (XDR *, qcsapi_wifi_get_auth_state_rpcdata*); +extern bool_t xdr_qcsapi_wifi_set_security_defer_mode_rpcdata (XDR *, qcsapi_wifi_set_security_defer_mode_rpcdata*); +extern bool_t xdr_qcsapi_wifi_get_security_defer_mode_rpcdata (XDR *, qcsapi_wifi_get_security_defer_mode_rpcdata*); +extern bool_t xdr_qcsapi_wifi_apply_security_config_rpcdata (XDR *, qcsapi_wifi_apply_security_config_rpcdata*); +extern bool_t xdr_qcsapi_wifi_set_mac_address_filtering_rpcdata (XDR *, qcsapi_wifi_set_mac_address_filtering_rpcdata*); +extern bool_t xdr_qcsapi_wifi_get_mac_address_filtering_rpcdata (XDR *, qcsapi_wifi_get_mac_address_filtering_rpcdata*); +extern bool_t xdr_qcsapi_wifi_authorize_mac_address_rpcdata (XDR *, qcsapi_wifi_authorize_mac_address_rpcdata*); +extern bool_t xdr_qcsapi_wifi_deny_mac_address_rpcdata (XDR *, qcsapi_wifi_deny_mac_address_rpcdata*); +extern bool_t xdr_qcsapi_wifi_remove_mac_address_rpcdata (XDR *, qcsapi_wifi_remove_mac_address_rpcdata*); +extern bool_t xdr_qcsapi_wifi_is_mac_address_authorized_rpcdata (XDR *, qcsapi_wifi_is_mac_address_authorized_rpcdata*); +extern bool_t xdr_qcsapi_wifi_get_authorized_mac_addresses_rpcdata (XDR *, qcsapi_wifi_get_authorized_mac_addresses_rpcdata*); +extern bool_t xdr_qcsapi_wifi_get_denied_mac_addresses_rpcdata (XDR *, qcsapi_wifi_get_denied_mac_addresses_rpcdata*); +extern bool_t xdr_qcsapi_wifi_set_accept_oui_filter_rpcdata (XDR *, qcsapi_wifi_set_accept_oui_filter_rpcdata*); +extern bool_t xdr_qcsapi_wifi_get_accept_oui_filter_rpcdata (XDR *, qcsapi_wifi_get_accept_oui_filter_rpcdata*); +extern bool_t xdr_qcsapi_wifi_clear_mac_address_filters_rpcdata (XDR *, qcsapi_wifi_clear_mac_address_filters_rpcdata*); +extern bool_t xdr_qcsapi_wifi_set_mac_address_reserve_rpcdata (XDR *, qcsapi_wifi_set_mac_address_reserve_rpcdata*); +extern bool_t xdr_qcsapi_wifi_get_mac_address_reserve_rpcdata (XDR *, qcsapi_wifi_get_mac_address_reserve_rpcdata*); +extern bool_t xdr_qcsapi_wifi_clear_mac_address_reserve_rpcdata (XDR *, qcsapi_wifi_clear_mac_address_reserve_rpcdata*); +extern bool_t xdr_qcsapi_wifi_get_option_rpcdata (XDR *, qcsapi_wifi_get_option_rpcdata*); +extern bool_t xdr_qcsapi_wifi_set_option_rpcdata (XDR *, qcsapi_wifi_set_option_rpcdata*); +extern bool_t xdr_qcsapi_get_board_parameter_rpcdata (XDR *, qcsapi_get_board_parameter_rpcdata*); +extern bool_t xdr_qcsapi_get_swfeat_list_rpcdata (XDR *, qcsapi_get_swfeat_list_rpcdata*); +extern bool_t xdr_qcsapi_SSID_create_SSID_rpcdata (XDR *, qcsapi_SSID_create_SSID_rpcdata*); +extern bool_t xdr_qcsapi_SSID_remove_SSID_rpcdata (XDR *, qcsapi_SSID_remove_SSID_rpcdata*); +extern bool_t xdr_qcsapi_SSID_verify_SSID_rpcdata (XDR *, qcsapi_SSID_verify_SSID_rpcdata*); +extern bool_t xdr_qcsapi_SSID_rename_SSID_rpcdata (XDR *, qcsapi_SSID_rename_SSID_rpcdata*); +extern bool_t xdr_qcsapi_SSID_get_SSID_list_rpcdata (XDR *, qcsapi_SSID_get_SSID_list_rpcdata*); +extern bool_t xdr_qcsapi_SSID_set_protocol_rpcdata (XDR *, qcsapi_SSID_set_protocol_rpcdata*); +extern bool_t xdr_qcsapi_SSID_get_protocol_rpcdata (XDR *, qcsapi_SSID_get_protocol_rpcdata*); +extern bool_t xdr_qcsapi_SSID_get_encryption_modes_rpcdata (XDR *, qcsapi_SSID_get_encryption_modes_rpcdata*); +extern bool_t xdr_qcsapi_SSID_set_encryption_modes_rpcdata (XDR *, qcsapi_SSID_set_encryption_modes_rpcdata*); +extern bool_t xdr_qcsapi_SSID_get_group_encryption_rpcdata (XDR *, qcsapi_SSID_get_group_encryption_rpcdata*); +extern bool_t xdr_qcsapi_SSID_set_group_encryption_rpcdata (XDR *, qcsapi_SSID_set_group_encryption_rpcdata*); +extern bool_t xdr_qcsapi_SSID_get_authentication_mode_rpcdata (XDR *, qcsapi_SSID_get_authentication_mode_rpcdata*); +extern bool_t xdr_qcsapi_SSID_set_authentication_mode_rpcdata (XDR *, qcsapi_SSID_set_authentication_mode_rpcdata*); +extern bool_t xdr_qcsapi_SSID_get_pre_shared_key_rpcdata (XDR *, qcsapi_SSID_get_pre_shared_key_rpcdata*); +extern bool_t xdr_qcsapi_SSID_set_pre_shared_key_rpcdata (XDR *, qcsapi_SSID_set_pre_shared_key_rpcdata*); +extern bool_t xdr_qcsapi_SSID_get_key_passphrase_rpcdata (XDR *, qcsapi_SSID_get_key_passphrase_rpcdata*); +extern bool_t xdr_qcsapi_SSID_set_key_passphrase_rpcdata (XDR *, qcsapi_SSID_set_key_passphrase_rpcdata*); +extern bool_t xdr_qcsapi_SSID_get_pmf_rpcdata (XDR *, qcsapi_SSID_get_pmf_rpcdata*); +extern bool_t xdr_qcsapi_SSID_set_pmf_rpcdata (XDR *, qcsapi_SSID_set_pmf_rpcdata*); +extern bool_t xdr_qcsapi_SSID_get_wps_SSID_rpcdata (XDR *, qcsapi_SSID_get_wps_SSID_rpcdata*); +extern bool_t xdr_qcsapi_wifi_vlan_config_rpcdata (XDR *, qcsapi_wifi_vlan_config_rpcdata*); +extern bool_t xdr_qcsapi_wifi_show_vlan_config_rpcdata (XDR *, qcsapi_wifi_show_vlan_config_rpcdata*); +extern bool_t xdr_qcsapi_enable_vlan_pass_through_rpcdata (XDR *, qcsapi_enable_vlan_pass_through_rpcdata*); +extern bool_t xdr_qcsapi_wifi_set_vlan_promisc_rpcdata (XDR *, qcsapi_wifi_set_vlan_promisc_rpcdata*); +extern bool_t xdr_qcsapi_wps_registrar_report_button_press_rpcdata (XDR *, qcsapi_wps_registrar_report_button_press_rpcdata*); +extern bool_t xdr_qcsapi_wps_registrar_report_pin_rpcdata (XDR *, qcsapi_wps_registrar_report_pin_rpcdata*); +extern bool_t xdr_qcsapi_wps_registrar_get_pp_devname_rpcdata (XDR *, qcsapi_wps_registrar_get_pp_devname_rpcdata*); +extern bool_t xdr_qcsapi_wps_registrar_set_pp_devname_rpcdata (XDR *, qcsapi_wps_registrar_set_pp_devname_rpcdata*); +extern bool_t xdr_qcsapi_wps_enrollee_report_button_press_rpcdata (XDR *, qcsapi_wps_enrollee_report_button_press_rpcdata*); +extern bool_t xdr_qcsapi_wps_enrollee_report_pin_rpcdata (XDR *, qcsapi_wps_enrollee_report_pin_rpcdata*); +extern bool_t xdr_qcsapi_wps_enrollee_generate_pin_rpcdata (XDR *, qcsapi_wps_enrollee_generate_pin_rpcdata*); +extern bool_t xdr_qcsapi_wps_get_ap_pin_rpcdata (XDR *, qcsapi_wps_get_ap_pin_rpcdata*); +extern bool_t xdr_qcsapi_wps_set_ap_pin_rpcdata (XDR *, qcsapi_wps_set_ap_pin_rpcdata*); +extern bool_t xdr_qcsapi_wps_save_ap_pin_rpcdata (XDR *, qcsapi_wps_save_ap_pin_rpcdata*); +extern bool_t xdr_qcsapi_wps_enable_ap_pin_rpcdata (XDR *, qcsapi_wps_enable_ap_pin_rpcdata*); +extern bool_t xdr_qcsapi_wps_get_sta_pin_rpcdata (XDR *, qcsapi_wps_get_sta_pin_rpcdata*); +extern bool_t xdr_qcsapi_wps_get_state_rpcdata (XDR *, qcsapi_wps_get_state_rpcdata*); +extern bool_t xdr_qcsapi_wps_get_configured_state_rpcdata (XDR *, qcsapi_wps_get_configured_state_rpcdata*); +extern bool_t xdr_qcsapi_wps_get_runtime_state_rpcdata (XDR *, qcsapi_wps_get_runtime_state_rpcdata*); +extern bool_t xdr_qcsapi_wps_set_configured_state_rpcdata (XDR *, qcsapi_wps_set_configured_state_rpcdata*); +extern bool_t xdr_qcsapi_wps_get_param_rpcdata (XDR *, qcsapi_wps_get_param_rpcdata*); +extern bool_t xdr_qcsapi_wps_set_timeout_rpcdata (XDR *, qcsapi_wps_set_timeout_rpcdata*); +extern bool_t xdr_qcsapi_wps_on_hidden_ssid_rpcdata (XDR *, qcsapi_wps_on_hidden_ssid_rpcdata*); +extern bool_t xdr_qcsapi_wps_on_hidden_ssid_status_rpcdata (XDR *, qcsapi_wps_on_hidden_ssid_status_rpcdata*); +extern bool_t xdr_qcsapi_wps_upnp_enable_rpcdata (XDR *, qcsapi_wps_upnp_enable_rpcdata*); +extern bool_t xdr_qcsapi_wps_upnp_status_rpcdata (XDR *, qcsapi_wps_upnp_status_rpcdata*); +extern bool_t xdr_qcsapi_wps_allow_pbc_overlap_rpcdata (XDR *, qcsapi_wps_allow_pbc_overlap_rpcdata*); +extern bool_t xdr_qcsapi_wps_get_allow_pbc_overlap_status_rpcdata (XDR *, qcsapi_wps_get_allow_pbc_overlap_status_rpcdata*); +extern bool_t xdr_qcsapi_wps_set_access_control_rpcdata (XDR *, qcsapi_wps_set_access_control_rpcdata*); +extern bool_t xdr_qcsapi_wps_get_access_control_rpcdata (XDR *, qcsapi_wps_get_access_control_rpcdata*); +extern bool_t xdr_qcsapi_wps_set_param_rpcdata (XDR *, qcsapi_wps_set_param_rpcdata*); +extern bool_t xdr_qcsapi_wps_cancel_rpcdata (XDR *, qcsapi_wps_cancel_rpcdata*); +extern bool_t xdr_qcsapi_wps_set_pbc_in_srcm_rpcdata (XDR *, qcsapi_wps_set_pbc_in_srcm_rpcdata*); +extern bool_t xdr_qcsapi_wps_get_pbc_in_srcm_rpcdata (XDR *, qcsapi_wps_get_pbc_in_srcm_rpcdata*); +extern bool_t xdr_qcsapi_registrar_set_default_pbc_bss_rpcdata (XDR *, qcsapi_registrar_set_default_pbc_bss_rpcdata*); +extern bool_t xdr_qcsapi_registrar_get_default_pbc_bss_rpcdata (XDR *, qcsapi_registrar_get_default_pbc_bss_rpcdata*); +extern bool_t xdr_qcsapi_gpio_set_config_rpcdata (XDR *, qcsapi_gpio_set_config_rpcdata*); +extern bool_t xdr_qcsapi_gpio_get_config_rpcdata (XDR *, qcsapi_gpio_get_config_rpcdata*); +extern bool_t xdr_qcsapi_led_get_rpcdata (XDR *, qcsapi_led_get_rpcdata*); +extern bool_t xdr_qcsapi_led_set_rpcdata (XDR *, qcsapi_led_set_rpcdata*); +extern bool_t xdr_qcsapi_led_pwm_enable_rpcdata (XDR *, qcsapi_led_pwm_enable_rpcdata*); +extern bool_t xdr_qcsapi_led_brightness_rpcdata (XDR *, qcsapi_led_brightness_rpcdata*); +extern bool_t xdr_qcsapi_gpio_enable_wps_push_button_rpcdata (XDR *, qcsapi_gpio_enable_wps_push_button_rpcdata*); +extern bool_t xdr_qcsapi_wifi_get_count_associations_rpcdata (XDR *, qcsapi_wifi_get_count_associations_rpcdata*); +extern bool_t xdr_qcsapi_wifi_get_associated_device_mac_addr_rpcdata (XDR *, qcsapi_wifi_get_associated_device_mac_addr_rpcdata*); +extern bool_t xdr_qcsapi_wifi_get_associated_device_ip_addr_rpcdata (XDR *, qcsapi_wifi_get_associated_device_ip_addr_rpcdata*); +extern bool_t xdr_qcsapi_wifi_get_link_quality_rpcdata (XDR *, qcsapi_wifi_get_link_quality_rpcdata*); +extern bool_t xdr_qcsapi_wifi_get_link_quality_max_rpcdata (XDR *, qcsapi_wifi_get_link_quality_max_rpcdata*); +extern bool_t xdr_qcsapi_wifi_get_rx_bytes_per_association_rpcdata (XDR *, qcsapi_wifi_get_rx_bytes_per_association_rpcdata*); +extern bool_t xdr_qcsapi_wifi_get_tx_bytes_per_association_rpcdata (XDR *, qcsapi_wifi_get_tx_bytes_per_association_rpcdata*); +extern bool_t xdr_qcsapi_wifi_get_rx_packets_per_association_rpcdata (XDR *, qcsapi_wifi_get_rx_packets_per_association_rpcdata*); +extern bool_t xdr_qcsapi_wifi_get_tx_packets_per_association_rpcdata (XDR *, qcsapi_wifi_get_tx_packets_per_association_rpcdata*); +extern bool_t xdr_qcsapi_wifi_get_tx_err_packets_per_association_rpcdata (XDR *, qcsapi_wifi_get_tx_err_packets_per_association_rpcdata*); +extern bool_t xdr_qcsapi_wifi_get_rssi_per_association_rpcdata (XDR *, qcsapi_wifi_get_rssi_per_association_rpcdata*); +extern bool_t xdr_qcsapi_wifi_get_rssi_in_dbm_per_association_rpcdata (XDR *, qcsapi_wifi_get_rssi_in_dbm_per_association_rpcdata*); +extern bool_t xdr_qcsapi_wifi_get_bw_per_association_rpcdata (XDR *, qcsapi_wifi_get_bw_per_association_rpcdata*); +extern bool_t xdr_qcsapi_wifi_get_tx_phy_rate_per_association_rpcdata (XDR *, qcsapi_wifi_get_tx_phy_rate_per_association_rpcdata*); +extern bool_t xdr_qcsapi_wifi_get_rx_phy_rate_per_association_rpcdata (XDR *, qcsapi_wifi_get_rx_phy_rate_per_association_rpcdata*); +extern bool_t xdr_qcsapi_wifi_get_tx_mcs_per_association_rpcdata (XDR *, qcsapi_wifi_get_tx_mcs_per_association_rpcdata*); +extern bool_t xdr_qcsapi_wifi_get_rx_mcs_per_association_rpcdata (XDR *, qcsapi_wifi_get_rx_mcs_per_association_rpcdata*); +extern bool_t xdr_qcsapi_wifi_get_achievable_tx_phy_rate_per_association_rpcdata (XDR *, qcsapi_wifi_get_achievable_tx_phy_rate_per_association_rpcdata*); +extern bool_t xdr_qcsapi_wifi_get_achievable_rx_phy_rate_per_association_rpcdata (XDR *, qcsapi_wifi_get_achievable_rx_phy_rate_per_association_rpcdata*); +extern bool_t xdr_qcsapi_wifi_get_auth_enc_per_association_rpcdata (XDR *, qcsapi_wifi_get_auth_enc_per_association_rpcdata*); +extern bool_t xdr_qcsapi_wifi_get_tput_caps_rpcdata (XDR *, qcsapi_wifi_get_tput_caps_rpcdata*); +extern bool_t xdr_qcsapi_wifi_get_connection_mode_rpcdata (XDR *, qcsapi_wifi_get_connection_mode_rpcdata*); +extern bool_t xdr_qcsapi_wifi_get_vendor_per_association_rpcdata (XDR *, qcsapi_wifi_get_vendor_per_association_rpcdata*); +extern bool_t xdr_qcsapi_wifi_get_max_mimo_rpcdata (XDR *, qcsapi_wifi_get_max_mimo_rpcdata*); +extern bool_t xdr_qcsapi_wifi_get_snr_per_association_rpcdata (XDR *, qcsapi_wifi_get_snr_per_association_rpcdata*); +extern bool_t xdr_qcsapi_wifi_get_time_associated_per_association_rpcdata (XDR *, qcsapi_wifi_get_time_associated_per_association_rpcdata*); +extern bool_t xdr_qcsapi_wifi_get_node_param_rpcdata (XDR *, qcsapi_wifi_get_node_param_rpcdata*); +extern bool_t xdr_qcsapi_wifi_get_node_counter_rpcdata (XDR *, qcsapi_wifi_get_node_counter_rpcdata*); +extern bool_t xdr_qcsapi_wifi_get_node_stats_rpcdata (XDR *, qcsapi_wifi_get_node_stats_rpcdata*); +extern bool_t xdr_qcsapi_wifi_get_max_queued_rpcdata (XDR *, qcsapi_wifi_get_max_queued_rpcdata*); +extern bool_t xdr_qcsapi_wifi_get_hw_noise_per_association_rpcdata (XDR *, qcsapi_wifi_get_hw_noise_per_association_rpcdata*); +extern bool_t xdr_qcsapi_wifi_get_mlme_stats_per_mac_rpcdata (XDR *, qcsapi_wifi_get_mlme_stats_per_mac_rpcdata*); +extern bool_t xdr_qcsapi_wifi_get_mlme_stats_per_association_rpcdata (XDR *, qcsapi_wifi_get_mlme_stats_per_association_rpcdata*); +extern bool_t xdr_qcsapi_wifi_get_mlme_stats_macs_list_rpcdata (XDR *, qcsapi_wifi_get_mlme_stats_macs_list_rpcdata*); +extern bool_t xdr_qcsapi_wifi_get_list_regulatory_regions_rpcdata (XDR *, qcsapi_wifi_get_list_regulatory_regions_rpcdata*); +extern bool_t xdr_qcsapi_regulatory_get_list_regulatory_regions_rpcdata (XDR *, qcsapi_regulatory_get_list_regulatory_regions_rpcdata*); +extern bool_t xdr_qcsapi_wifi_get_list_regulatory_channels_rpcdata (XDR *, qcsapi_wifi_get_list_regulatory_channels_rpcdata*); +extern bool_t xdr_qcsapi_regulatory_get_list_regulatory_channels_rpcdata (XDR *, qcsapi_regulatory_get_list_regulatory_channels_rpcdata*); +extern bool_t xdr_qcsapi_regulatory_get_list_regulatory_bands_rpcdata (XDR *, qcsapi_regulatory_get_list_regulatory_bands_rpcdata*); +extern bool_t xdr_qcsapi_wifi_get_regulatory_tx_power_rpcdata (XDR *, qcsapi_wifi_get_regulatory_tx_power_rpcdata*); +extern bool_t xdr_qcsapi_regulatory_get_regulatory_tx_power_rpcdata (XDR *, qcsapi_regulatory_get_regulatory_tx_power_rpcdata*); +extern bool_t xdr_qcsapi_wifi_get_configured_tx_power_rpcdata (XDR *, qcsapi_wifi_get_configured_tx_power_rpcdata*); +extern bool_t xdr_qcsapi_regulatory_get_configured_tx_power_rpcdata (XDR *, qcsapi_regulatory_get_configured_tx_power_rpcdata*); +extern bool_t xdr_qcsapi_regulatory_get_configured_tx_power_ext_rpcdata (XDR *, qcsapi_regulatory_get_configured_tx_power_ext_rpcdata*); +extern bool_t xdr_qcsapi_wifi_set_regulatory_region_rpcdata (XDR *, qcsapi_wifi_set_regulatory_region_rpcdata*); +extern bool_t xdr_qcsapi_regulatory_set_regulatory_region_rpcdata (XDR *, qcsapi_regulatory_set_regulatory_region_rpcdata*); +extern bool_t xdr_qcsapi_regulatory_restore_regulatory_tx_power_rpcdata (XDR *, qcsapi_regulatory_restore_regulatory_tx_power_rpcdata*); +extern bool_t xdr_qcsapi_wifi_get_regulatory_region_rpcdata (XDR *, qcsapi_wifi_get_regulatory_region_rpcdata*); +extern bool_t xdr_qcsapi_regulatory_overwrite_country_code_rpcdata (XDR *, qcsapi_regulatory_overwrite_country_code_rpcdata*); +extern bool_t xdr_qcsapi_wifi_set_regulatory_channel_rpcdata (XDR *, qcsapi_wifi_set_regulatory_channel_rpcdata*); +extern bool_t xdr_qcsapi_regulatory_set_regulatory_channel_rpcdata (XDR *, qcsapi_regulatory_set_regulatory_channel_rpcdata*); +extern bool_t xdr_qcsapi_regulatory_get_db_version_rpcdata (XDR *, qcsapi_regulatory_get_db_version_rpcdata*); +extern bool_t xdr_qcsapi_regulatory_apply_tx_power_cap_rpcdata (XDR *, qcsapi_regulatory_apply_tx_power_cap_rpcdata*); +extern bool_t xdr_qcsapi_wifi_get_list_DFS_channels_rpcdata (XDR *, qcsapi_wifi_get_list_DFS_channels_rpcdata*); +extern bool_t xdr_qcsapi_regulatory_get_list_DFS_channels_rpcdata (XDR *, qcsapi_regulatory_get_list_DFS_channels_rpcdata*); +extern bool_t xdr_qcsapi_wifi_is_channel_DFS_rpcdata (XDR *, qcsapi_wifi_is_channel_DFS_rpcdata*); +extern bool_t xdr_qcsapi_regulatory_is_channel_DFS_rpcdata (XDR *, qcsapi_regulatory_is_channel_DFS_rpcdata*); +extern bool_t xdr_qcsapi_wifi_get_dfs_cce_channels_rpcdata (XDR *, qcsapi_wifi_get_dfs_cce_channels_rpcdata*); +extern bool_t xdr_qcsapi_wifi_get_DFS_alt_channel_rpcdata (XDR *, qcsapi_wifi_get_DFS_alt_channel_rpcdata*); +extern bool_t xdr_qcsapi_wifi_set_DFS_alt_channel_rpcdata (XDR *, qcsapi_wifi_set_DFS_alt_channel_rpcdata*); +extern bool_t xdr_qcsapi_wifi_start_dfs_reentry_rpcdata (XDR *, qcsapi_wifi_start_dfs_reentry_rpcdata*); +extern bool_t xdr_qcsapi_wifi_start_scan_ext_rpcdata (XDR *, qcsapi_wifi_start_scan_ext_rpcdata*); +extern bool_t xdr_qcsapi_wifi_get_csw_records_rpcdata (XDR *, qcsapi_wifi_get_csw_records_rpcdata*); +extern bool_t xdr_qcsapi_wifi_get_radar_status_rpcdata (XDR *, qcsapi_wifi_get_radar_status_rpcdata*); +extern bool_t xdr_qcsapi_wifi_get_cac_status_rpcdata (XDR *, qcsapi_wifi_get_cac_status_rpcdata*); +extern bool_t xdr_qcsapi_wifi_get_results_AP_scan_rpcdata (XDR *, qcsapi_wifi_get_results_AP_scan_rpcdata*); +extern bool_t xdr_qcsapi_wifi_get_count_APs_scanned_rpcdata (XDR *, qcsapi_wifi_get_count_APs_scanned_rpcdata*); +extern bool_t xdr_qcsapi_wifi_get_properties_AP_rpcdata (XDR *, qcsapi_wifi_get_properties_AP_rpcdata*); +extern bool_t xdr_qcsapi_wifi_set_scan_chk_inv_rpcdata (XDR *, qcsapi_wifi_set_scan_chk_inv_rpcdata*); +extern bool_t xdr_qcsapi_wifi_get_scan_chk_inv_rpcdata (XDR *, qcsapi_wifi_get_scan_chk_inv_rpcdata*); +extern bool_t xdr_qcsapi_wifi_set_scan_buf_max_size_rpcdata (XDR *, qcsapi_wifi_set_scan_buf_max_size_rpcdata*); +extern bool_t xdr_qcsapi_wifi_get_scan_buf_max_size_rpcdata (XDR *, qcsapi_wifi_get_scan_buf_max_size_rpcdata*); +extern bool_t xdr_qcsapi_wifi_set_scan_table_max_len_rpcdata (XDR *, qcsapi_wifi_set_scan_table_max_len_rpcdata*); +extern bool_t xdr_qcsapi_wifi_get_scan_table_max_len_rpcdata (XDR *, qcsapi_wifi_get_scan_table_max_len_rpcdata*); +extern bool_t xdr_qcsapi_wifi_set_dwell_times_rpcdata (XDR *, qcsapi_wifi_set_dwell_times_rpcdata*); +extern bool_t xdr_qcsapi_wifi_get_dwell_times_rpcdata (XDR *, qcsapi_wifi_get_dwell_times_rpcdata*); +extern bool_t xdr_qcsapi_wifi_set_bgscan_dwell_times_rpcdata (XDR *, qcsapi_wifi_set_bgscan_dwell_times_rpcdata*); +extern bool_t xdr_qcsapi_wifi_get_bgscan_dwell_times_rpcdata (XDR *, qcsapi_wifi_get_bgscan_dwell_times_rpcdata*); +extern bool_t xdr_qcsapi_wifi_start_scan_rpcdata (XDR *, qcsapi_wifi_start_scan_rpcdata*); +extern bool_t xdr_qcsapi_wifi_cancel_scan_rpcdata (XDR *, qcsapi_wifi_cancel_scan_rpcdata*); +extern bool_t xdr_qcsapi_wifi_get_scan_status_rpcdata (XDR *, qcsapi_wifi_get_scan_status_rpcdata*); +extern bool_t xdr_qcsapi_wifi_enable_bgscan_rpcdata (XDR *, qcsapi_wifi_enable_bgscan_rpcdata*); +extern bool_t xdr_qcsapi_wifi_get_bgscan_status_rpcdata (XDR *, qcsapi_wifi_get_bgscan_status_rpcdata*); +extern bool_t xdr_qcsapi_wifi_wait_scan_completes_rpcdata (XDR *, qcsapi_wifi_wait_scan_completes_rpcdata*); +extern bool_t xdr_qcsapi_wifi_backoff_fail_max_rpcdata (XDR *, qcsapi_wifi_backoff_fail_max_rpcdata*); +extern bool_t xdr_qcsapi_wifi_backoff_timeout_rpcdata (XDR *, qcsapi_wifi_backoff_timeout_rpcdata*); +extern bool_t xdr_qcsapi_wifi_get_mcs_rate_rpcdata (XDR *, qcsapi_wifi_get_mcs_rate_rpcdata*); +extern bool_t xdr_qcsapi_wifi_set_mcs_rate_rpcdata (XDR *, qcsapi_wifi_set_mcs_rate_rpcdata*); +extern bool_t xdr_qcsapi_wifi_set_pairing_id_rpcdata (XDR *, qcsapi_wifi_set_pairing_id_rpcdata*); +extern bool_t xdr_qcsapi_wifi_get_pairing_id_rpcdata (XDR *, qcsapi_wifi_get_pairing_id_rpcdata*); +extern bool_t xdr_qcsapi_wifi_set_pairing_enable_rpcdata (XDR *, qcsapi_wifi_set_pairing_enable_rpcdata*); +extern bool_t xdr_qcsapi_wifi_get_pairing_enable_rpcdata (XDR *, qcsapi_wifi_get_pairing_enable_rpcdata*); +extern bool_t xdr_qcsapi_non_wps_set_pp_enable_rpcdata (XDR *, qcsapi_non_wps_set_pp_enable_rpcdata*); +extern bool_t xdr_qcsapi_non_wps_get_pp_enable_rpcdata (XDR *, qcsapi_non_wps_get_pp_enable_rpcdata*); +extern bool_t xdr_qcsapi_wifi_set_vendor_fix_rpcdata (XDR *, qcsapi_wifi_set_vendor_fix_rpcdata*); +extern bool_t xdr_qcsapi_errno_get_message_rpcdata (XDR *, qcsapi_errno_get_message_rpcdata*); +extern bool_t xdr_qcsapi_get_interface_stats_rpcdata (XDR *, qcsapi_get_interface_stats_rpcdata*); +extern bool_t xdr_qcsapi_get_phy_stats_rpcdata (XDR *, qcsapi_get_phy_stats_rpcdata*); +extern bool_t xdr_qcsapi_reset_all_counters_rpcdata (XDR *, qcsapi_reset_all_counters_rpcdata*); +extern bool_t xdr_qcsapi_get_uboot_info_rpcdata (XDR *, qcsapi_get_uboot_info_rpcdata*); +extern bool_t xdr_qcsapi_firmware_get_version_rpcdata (XDR *, qcsapi_firmware_get_version_rpcdata*); +extern bool_t xdr_qcsapi_flash_image_update_rpcdata (XDR *, qcsapi_flash_image_update_rpcdata*); +extern bool_t xdr_qcsapi_send_file_rpcdata (XDR *, qcsapi_send_file_rpcdata*); +extern bool_t xdr_qcsapi_pm_set_mode_rpcdata (XDR *, qcsapi_pm_set_mode_rpcdata*); +extern bool_t xdr_qcsapi_pm_get_mode_rpcdata (XDR *, qcsapi_pm_get_mode_rpcdata*); +extern bool_t xdr_qcsapi_get_qpm_level_rpcdata (XDR *, qcsapi_get_qpm_level_rpcdata*); +extern bool_t xdr_qcsapi_set_host_state_rpcdata (XDR *, qcsapi_set_host_state_rpcdata*); +extern bool_t xdr_qcsapi_qtm_get_state_rpcdata (XDR *, qcsapi_qtm_get_state_rpcdata*); +extern bool_t xdr_qcsapi_qtm_get_state_all_rpcdata (XDR *, qcsapi_qtm_get_state_all_rpcdata*); +extern bool_t xdr_qcsapi_qtm_set_state_rpcdata (XDR *, qcsapi_qtm_set_state_rpcdata*); +extern bool_t xdr_qcsapi_qtm_get_config_rpcdata (XDR *, qcsapi_qtm_get_config_rpcdata*); +extern bool_t xdr_qcsapi_qtm_get_config_all_rpcdata (XDR *, qcsapi_qtm_get_config_all_rpcdata*); +extern bool_t xdr_qcsapi_qtm_set_config_rpcdata (XDR *, qcsapi_qtm_set_config_rpcdata*); +extern bool_t xdr_qcsapi_qtm_add_rule_rpcdata (XDR *, qcsapi_qtm_add_rule_rpcdata*); +extern bool_t xdr_qcsapi_qtm_del_rule_rpcdata (XDR *, qcsapi_qtm_del_rule_rpcdata*); +extern bool_t xdr_qcsapi_qtm_del_rule_index_rpcdata (XDR *, qcsapi_qtm_del_rule_index_rpcdata*); +extern bool_t xdr_qcsapi_qtm_get_rule_rpcdata (XDR *, qcsapi_qtm_get_rule_rpcdata*); +extern bool_t xdr_qcsapi_qtm_get_strm_rpcdata (XDR *, qcsapi_qtm_get_strm_rpcdata*); +extern bool_t xdr_qcsapi_qtm_get_stats_rpcdata (XDR *, qcsapi_qtm_get_stats_rpcdata*); +extern bool_t xdr_qcsapi_qtm_get_inactive_flags_rpcdata (XDR *, qcsapi_qtm_get_inactive_flags_rpcdata*); +extern bool_t xdr_qcsapi_wifi_run_script_rpcdata (XDR *, qcsapi_wifi_run_script_rpcdata*); +extern bool_t xdr_qcsapi_wifi_test_traffic_rpcdata (XDR *, qcsapi_wifi_test_traffic_rpcdata*); +extern bool_t xdr_qcsapi_wifi_add_ipff_rpcdata (XDR *, qcsapi_wifi_add_ipff_rpcdata*); +extern bool_t xdr_qcsapi_wifi_del_ipff_rpcdata (XDR *, qcsapi_wifi_del_ipff_rpcdata*); +extern bool_t xdr_qcsapi_wifi_get_ipff_rpcdata (XDR *, qcsapi_wifi_get_ipff_rpcdata*); +extern bool_t xdr_qcsapi_wifi_get_rts_threshold_rpcdata (XDR *, qcsapi_wifi_get_rts_threshold_rpcdata*); +extern bool_t xdr_qcsapi_wifi_set_rts_threshold_rpcdata (XDR *, qcsapi_wifi_set_rts_threshold_rpcdata*); +extern bool_t xdr_qcsapi_wifi_set_nss_cap_rpcdata (XDR *, qcsapi_wifi_set_nss_cap_rpcdata*); +extern bool_t xdr_qcsapi_wifi_get_nss_cap_rpcdata (XDR *, qcsapi_wifi_get_nss_cap_rpcdata*); +extern bool_t xdr_qcsapi_wifi_get_tx_amsdu_rpcdata (XDR *, qcsapi_wifi_get_tx_amsdu_rpcdata*); +extern bool_t xdr_qcsapi_wifi_set_tx_amsdu_rpcdata (XDR *, qcsapi_wifi_set_tx_amsdu_rpcdata*); +extern bool_t xdr_qcsapi_wifi_get_disassoc_reason_rpcdata (XDR *, qcsapi_wifi_get_disassoc_reason_rpcdata*); +extern bool_t xdr_qcsapi_wifi_block_bss_rpcdata (XDR *, qcsapi_wifi_block_bss_rpcdata*); +extern bool_t xdr_qcsapi_wifi_verify_repeater_mode_rpcdata (XDR *, qcsapi_wifi_verify_repeater_mode_rpcdata*); +extern bool_t xdr_qcsapi_wifi_set_ap_interface_name_rpcdata (XDR *, qcsapi_wifi_set_ap_interface_name_rpcdata*); +extern bool_t xdr_qcsapi_wifi_get_ap_interface_name_rpcdata (XDR *, qcsapi_wifi_get_ap_interface_name_rpcdata*); +extern bool_t xdr_qcsapi_get_temperature_info_rpcdata (XDR *, qcsapi_get_temperature_info_rpcdata*); +extern bool_t xdr_qcsapi_calcmd_set_test_mode_rpcdata (XDR *, qcsapi_calcmd_set_test_mode_rpcdata*); +extern bool_t xdr_qcsapi_calcmd_show_test_packet_rpcdata (XDR *, qcsapi_calcmd_show_test_packet_rpcdata*); +extern bool_t xdr_qcsapi_calcmd_send_test_packet_rpcdata (XDR *, qcsapi_calcmd_send_test_packet_rpcdata*); +extern bool_t xdr_qcsapi_calcmd_stop_test_packet_rpcdata (XDR *, qcsapi_calcmd_stop_test_packet_rpcdata*); +extern bool_t xdr_qcsapi_calcmd_send_dc_cw_signal_rpcdata (XDR *, qcsapi_calcmd_send_dc_cw_signal_rpcdata*); +extern bool_t xdr_qcsapi_calcmd_stop_dc_cw_signal_rpcdata (XDR *, qcsapi_calcmd_stop_dc_cw_signal_rpcdata*); +extern bool_t xdr_qcsapi_calcmd_get_test_mode_antenna_sel_rpcdata (XDR *, qcsapi_calcmd_get_test_mode_antenna_sel_rpcdata*); +extern bool_t xdr_qcsapi_calcmd_get_test_mode_mcs_rpcdata (XDR *, qcsapi_calcmd_get_test_mode_mcs_rpcdata*); +extern bool_t xdr_qcsapi_calcmd_get_test_mode_bw_rpcdata (XDR *, qcsapi_calcmd_get_test_mode_bw_rpcdata*); +extern bool_t xdr_qcsapi_calcmd_get_tx_power_rpcdata (XDR *, qcsapi_calcmd_get_tx_power_rpcdata*); +extern bool_t xdr_qcsapi_calcmd_set_tx_power_rpcdata (XDR *, qcsapi_calcmd_set_tx_power_rpcdata*); +extern bool_t xdr_qcsapi_calcmd_get_test_mode_rssi_rpcdata (XDR *, qcsapi_calcmd_get_test_mode_rssi_rpcdata*); +extern bool_t xdr_qcsapi_calcmd_set_mac_filter_rpcdata (XDR *, qcsapi_calcmd_set_mac_filter_rpcdata*); +extern bool_t xdr_qcsapi_calcmd_get_antenna_count_rpcdata (XDR *, qcsapi_calcmd_get_antenna_count_rpcdata*); +extern bool_t xdr_qcsapi_calcmd_clear_counter_rpcdata (XDR *, qcsapi_calcmd_clear_counter_rpcdata*); +extern bool_t xdr_qcsapi_calcmd_get_info_rpcdata (XDR *, qcsapi_calcmd_get_info_rpcdata*); +extern bool_t xdr_qcsapi_wowlan_set_match_type_rpcdata (XDR *, qcsapi_wowlan_set_match_type_rpcdata*); +extern bool_t xdr_qcsapi_wowlan_set_L2_type_rpcdata (XDR *, qcsapi_wowlan_set_L2_type_rpcdata*); +extern bool_t xdr_qcsapi_wowlan_set_udp_port_rpcdata (XDR *, qcsapi_wowlan_set_udp_port_rpcdata*); +extern bool_t xdr_qcsapi_wowlan_set_magic_pattern_rpcdata (XDR *, qcsapi_wowlan_set_magic_pattern_rpcdata*); +extern bool_t xdr_qcsapi_wifi_wowlan_get_host_state_rpcdata (XDR *, qcsapi_wifi_wowlan_get_host_state_rpcdata*); +extern bool_t xdr_qcsapi_wifi_wowlan_get_match_type_rpcdata (XDR *, qcsapi_wifi_wowlan_get_match_type_rpcdata*); +extern bool_t xdr_qcsapi_wifi_wowlan_get_l2_type_rpcdata (XDR *, qcsapi_wifi_wowlan_get_l2_type_rpcdata*); +extern bool_t xdr_qcsapi_wifi_wowlan_get_udp_port_rpcdata (XDR *, qcsapi_wifi_wowlan_get_udp_port_rpcdata*); +extern bool_t xdr_qcsapi_wifi_wowlan_get_magic_pattern_rpcdata (XDR *, qcsapi_wifi_wowlan_get_magic_pattern_rpcdata*); +extern bool_t xdr_qcsapi_wifi_set_enable_mu_rpcdata (XDR *, qcsapi_wifi_set_enable_mu_rpcdata*); +extern bool_t xdr_qcsapi_wifi_get_enable_mu_rpcdata (XDR *, qcsapi_wifi_get_enable_mu_rpcdata*); +extern bool_t xdr_qcsapi_wifi_set_mu_use_precode_rpcdata (XDR *, qcsapi_wifi_set_mu_use_precode_rpcdata*); +extern bool_t xdr_qcsapi_wifi_get_mu_use_precode_rpcdata (XDR *, qcsapi_wifi_get_mu_use_precode_rpcdata*); +extern bool_t xdr_qcsapi_wifi_set_mu_use_eq_rpcdata (XDR *, qcsapi_wifi_set_mu_use_eq_rpcdata*); +extern bool_t xdr_qcsapi_wifi_get_mu_use_eq_rpcdata (XDR *, qcsapi_wifi_get_mu_use_eq_rpcdata*); +extern bool_t xdr_qcsapi_wifi_get_mu_groups_rpcdata (XDR *, qcsapi_wifi_get_mu_groups_rpcdata*); +extern bool_t xdr_qcsapi_wifi_enable_tdls_rpcdata (XDR *, qcsapi_wifi_enable_tdls_rpcdata*); +extern bool_t xdr_qcsapi_wifi_enable_tdls_over_qhop_rpcdata (XDR *, qcsapi_wifi_enable_tdls_over_qhop_rpcdata*); +extern bool_t xdr_qcsapi_wifi_get_tdls_status_rpcdata (XDR *, qcsapi_wifi_get_tdls_status_rpcdata*); +extern bool_t xdr_qcsapi_wifi_set_tdls_params_rpcdata (XDR *, qcsapi_wifi_set_tdls_params_rpcdata*); +extern bool_t xdr_qcsapi_wifi_get_tdls_params_rpcdata (XDR *, qcsapi_wifi_get_tdls_params_rpcdata*); +extern bool_t xdr_qcsapi_wifi_tdls_operate_rpcdata (XDR *, qcsapi_wifi_tdls_operate_rpcdata*); + +#else /* K&R C */ +extern bool_t xdr_str (); +extern bool_t xdr___rpc_string (); +extern bool_t xdr___rpc_string_p (); +extern bool_t xdr___rpc_qcsapi_mac_addr (); +extern bool_t xdr___rpc_qcsapi_mac_addr_p (); +extern bool_t xdr___rpc_qcsapi_int_a32 (); +extern bool_t xdr___rpc_qcsapi_int_a32_p (); +extern bool_t xdr___rpc_qcsapi_SSID (); +extern bool_t xdr___rpc_qcsapi_scs_ranking_rpt (); +extern bool_t xdr___rpc_qcsapi_scs_score_rpt (); +extern bool_t xdr___rpc_qcsapi_scs_currchan_rpt (); +extern bool_t xdr___rpc_qcsapi_autochan_rpt (); +extern bool_t xdr___rpc_qcsapi_scs_param_rpt (); +extern bool_t xdr___rpc_qcsapi_data_512bytes (); +extern bool_t xdr___rpc_qcsapi_data_256bytes (); +extern bool_t xdr___rpc_qcsapi_disconn_info (); +extern bool_t xdr___rpc_qcsapi_data_64bytes (); +extern bool_t xdr___rpc_qcsapi_channel_power_table (); +extern bool_t xdr___rpc_qcsapi_assoc_records (); +extern bool_t xdr___rpc_ieee8011req_sta_tput_caps (); +extern bool_t xdr___rpc_qcsapi_measure_report_result (); +extern bool_t xdr___rpc_qcsapi_node_stats (); +extern bool_t xdr___rpc_qcsapi_mlme_stats (); +extern bool_t xdr___rpc_qcsapi_mlme_stats_macs (); +extern bool_t xdr___rpc_qcsapi_csw_record (); +extern bool_t xdr___rpc_qcsapi_radar_status (); +extern bool_t xdr___rpc_qcsapi_ap_properties (); +extern bool_t xdr___rpc_qcsapi_interface_stats (); +extern bool_t xdr___rpc_qcsapi_phy_stats (); +extern bool_t xdr___rpc_early_flash_config (); +extern bool_t xdr___rpc_qcsapi_data_128bytes (); +extern bool_t xdr___rpc_qcsapi_data_1Kbytes (); +extern bool_t xdr___rpc_qcsapi_data_3Kbytes (); +extern bool_t xdr___rpc_qcsapi_data_4Kbytes (); +extern bool_t xdr___rpc_qcsapi_calcmd_tx_power_rsp (); +extern bool_t xdr___rpc_qcsapi_calcmd_rssi_rsp (); +extern bool_t xdr_qcsapi_bootcfg_get_parameter_rpcdata (); +extern bool_t xdr_qcsapi_bootcfg_update_parameter_rpcdata (); +extern bool_t xdr_qcsapi_bootcfg_commit_rpcdata (); +extern bool_t xdr_qcsapi_telnet_enable_rpcdata (); +extern bool_t xdr_qcsapi_get_service_name_enum_rpcdata (); +extern bool_t xdr_qcsapi_get_service_action_enum_rpcdata (); +extern bool_t xdr_qcsapi_service_control_rpcdata (); +extern bool_t xdr_qcsapi_wfa_cert_mode_enable_rpcdata (); +extern bool_t xdr_qcsapi_wifi_get_scs_cce_channels_rpcdata (); +extern bool_t xdr_qcsapi_wifi_scs_enable_rpcdata (); +extern bool_t xdr_qcsapi_wifi_scs_switch_channel_rpcdata (); +extern bool_t xdr_qcsapi_wifi_set_scs_verbose_rpcdata (); +extern bool_t xdr_qcsapi_wifi_get_scs_status_rpcdata (); +extern bool_t xdr_qcsapi_wifi_set_scs_smpl_enable_rpcdata (); +extern bool_t xdr_qcsapi_wifi_set_scs_smpl_dwell_time_rpcdata (); +extern bool_t xdr_qcsapi_wifi_set_scs_sample_intv_rpcdata (); +extern bool_t xdr_qcsapi_wifi_set_scs_intf_detect_intv_rpcdata (); +extern bool_t xdr_qcsapi_wifi_set_scs_thrshld_rpcdata (); +extern bool_t xdr_qcsapi_wifi_set_scs_report_only_rpcdata (); +extern bool_t xdr_qcsapi_wifi_get_scs_stat_report_rpcdata (); +extern bool_t xdr_qcsapi_wifi_get_scs_score_report_rpcdata (); +extern bool_t xdr_qcsapi_wifi_get_scs_currchan_report_rpcdata (); +extern bool_t xdr_qcsapi_wifi_set_scs_stats_rpcdata (); +extern bool_t xdr_qcsapi_wifi_get_autochan_report_rpcdata (); +extern bool_t xdr_qcsapi_wifi_set_scs_cca_intf_smth_fctr_rpcdata (); +extern bool_t xdr_qcsapi_wifi_set_scs_chan_mtrc_mrgn_rpcdata (); +extern bool_t xdr_qcsapi_wifi_get_scs_cca_intf_rpcdata (); +extern bool_t xdr_qcsapi_wifi_get_scs_param_report_rpcdata (); +extern bool_t xdr_qcsapi_wifi_get_scs_dfs_reentry_request_rpcdata (); +extern bool_t xdr_qcsapi_wifi_start_ocac_rpcdata (); +extern bool_t xdr_qcsapi_wifi_stop_ocac_rpcdata (); +extern bool_t xdr_qcsapi_wifi_get_ocac_status_rpcdata (); +extern bool_t xdr_qcsapi_wifi_set_ocac_dwell_time_rpcdata (); +extern bool_t xdr_qcsapi_wifi_set_ocac_duration_rpcdata (); +extern bool_t xdr_qcsapi_wifi_set_ocac_cac_time_rpcdata (); +extern bool_t xdr_qcsapi_wifi_set_ocac_report_only_rpcdata (); +extern bool_t xdr_qcsapi_wifi_set_ocac_thrshld_rpcdata (); +extern bool_t xdr_qcsapi_wifi_start_dfs_s_radio_rpcdata (); +extern bool_t xdr_qcsapi_wifi_stop_dfs_s_radio_rpcdata (); +extern bool_t xdr_qcsapi_wifi_get_dfs_s_radio_status_rpcdata (); +extern bool_t xdr_qcsapi_wifi_get_dfs_s_radio_availability_rpcdata (); +extern bool_t xdr_qcsapi_wifi_set_dfs_s_radio_dwell_time_rpcdata (); +extern bool_t xdr_qcsapi_wifi_set_dfs_s_radio_duration_rpcdata (); +extern bool_t xdr_qcsapi_wifi_set_dfs_s_radio_wea_duration_rpcdata (); +extern bool_t xdr_qcsapi_wifi_set_dfs_s_radio_cac_time_rpcdata (); +extern bool_t xdr_qcsapi_wifi_set_dfs_s_radio_wea_cac_time_rpcdata (); +extern bool_t xdr_qcsapi_wifi_set_dfs_s_radio_report_only_rpcdata (); +extern bool_t xdr_qcsapi_wifi_set_dfs_s_radio_thrshld_rpcdata (); +extern bool_t xdr_qcsapi_init_rpcdata (); +extern bool_t xdr_qcsapi_console_disconnect_rpcdata (); +extern bool_t xdr_qcsapi_wifi_startprod_rpcdata (); +extern bool_t xdr_qcsapi_is_startprod_done_rpcdata (); +extern bool_t xdr_qcsapi_system_get_time_since_start_rpcdata (); +extern bool_t xdr_qcsapi_get_system_status_rpcdata (); +extern bool_t xdr_qcsapi_get_random_seed_rpcdata (); +extern bool_t xdr_qcsapi_set_random_seed_rpcdata (); +extern bool_t xdr_qcsapi_get_carrier_id_rpcdata (); +extern bool_t xdr_qcsapi_set_carrier_id_rpcdata (); +extern bool_t xdr_qcsapi_wifi_get_spinor_jedecid_rpcdata (); +extern bool_t xdr_qcsapi_wifi_get_bb_param_rpcdata (); +extern bool_t xdr_qcsapi_wifi_set_bb_param_rpcdata (); +extern bool_t xdr_qcsapi_wifi_set_optim_stats_rpcdata (); +extern bool_t xdr_qcsapi_wifi_set_sys_time_rpcdata (); +extern bool_t xdr_qcsapi_wifi_get_sys_time_rpcdata (); +extern bool_t xdr_qcsapi_set_soc_mac_addr_rpcdata (); +extern bool_t xdr_qcsapi_get_custom_value_rpcdata (); +extern bool_t xdr_qcsapi_config_get_parameter_rpcdata (); +extern bool_t xdr_qcsapi_config_update_parameter_rpcdata (); +extern bool_t xdr_qcsapi_config_get_ssid_parameter_rpcdata (); +extern bool_t xdr_qcsapi_config_update_ssid_parameter_rpcdata (); +extern bool_t xdr_qcsapi_file_path_get_config_rpcdata (); +extern bool_t xdr_qcsapi_file_path_set_config_rpcdata (); +extern bool_t xdr_qcsapi_restore_default_config_rpcdata (); +extern bool_t xdr_qcsapi_store_ipaddr_rpcdata (); +extern bool_t xdr_qcsapi_interface_enable_rpcdata (); +extern bool_t xdr_qcsapi_interface_get_status_rpcdata (); +extern bool_t xdr_qcsapi_interface_set_ip4_rpcdata (); +extern bool_t xdr_qcsapi_interface_get_ip4_rpcdata (); +extern bool_t xdr_qcsapi_interface_get_counter_rpcdata (); +extern bool_t xdr_qcsapi_interface_get_counter64_rpcdata (); +extern bool_t xdr_qcsapi_interface_get_mac_addr_rpcdata (); +extern bool_t xdr_qcsapi_interface_set_mac_addr_rpcdata (); +extern bool_t xdr_qcsapi_pm_get_counter_rpcdata (); +extern bool_t xdr_qcsapi_set_aspm_l1_rpcdata (); +extern bool_t xdr_qcsapi_set_l1_rpcdata (); +extern bool_t xdr_qcsapi_pm_get_elapsed_time_rpcdata (); +extern bool_t xdr_qcsapi_eth_phy_power_control_rpcdata (); +extern bool_t xdr_qcsapi_get_emac_switch_rpcdata (); +extern bool_t xdr_qcsapi_set_emac_switch_rpcdata (); +extern bool_t xdr_qcsapi_eth_dscp_map_rpcdata (); +extern bool_t xdr_qcsapi_get_eth_info_rpcdata (); +extern bool_t xdr_qcsapi_wifi_get_mode_rpcdata (); +extern bool_t xdr_qcsapi_wifi_set_mode_rpcdata (); +extern bool_t xdr_qcsapi_wifi_get_phy_mode_rpcdata (); +extern bool_t xdr_qcsapi_wifi_set_phy_mode_rpcdata (); +extern bool_t xdr_qcsapi_wifi_reload_in_mode_rpcdata (); +extern bool_t xdr_qcsapi_wifi_rfenable_rpcdata (); +extern bool_t xdr_qcsapi_wifi_rfstatus_rpcdata (); +extern bool_t xdr_qcsapi_wifi_get_bw_rpcdata (); +extern bool_t xdr_qcsapi_wifi_set_bw_rpcdata (); +extern bool_t xdr_qcsapi_wifi_set_vht_rpcdata (); +extern bool_t xdr_qcsapi_wifi_get_vht_rpcdata (); +extern bool_t xdr_qcsapi_wifi_get_channel_rpcdata (); +extern bool_t xdr_qcsapi_wifi_set_channel_rpcdata (); +extern bool_t xdr_qcsapi_wifi_set_chan_pri_inactive_rpcdata (); +extern bool_t xdr_qcsapi_wifi_chan_control_rpcdata (); +extern bool_t xdr_qcsapi_wifi_get_chan_disabled_rpcdata (); +extern bool_t xdr_qcsapi_wifi_get_beacon_interval_rpcdata (); +extern bool_t xdr_qcsapi_wifi_set_beacon_interval_rpcdata (); +extern bool_t xdr_qcsapi_wifi_get_dtim_rpcdata (); +extern bool_t xdr_qcsapi_wifi_set_dtim_rpcdata (); +extern bool_t xdr_qcsapi_wifi_get_assoc_limit_rpcdata (); +extern bool_t xdr_qcsapi_wifi_get_bss_assoc_limit_rpcdata (); +extern bool_t xdr_qcsapi_wifi_set_assoc_limit_rpcdata (); +extern bool_t xdr_qcsapi_wifi_set_bss_assoc_limit_rpcdata (); +extern bool_t xdr_qcsapi_wifi_get_BSSID_rpcdata (); +extern bool_t xdr_qcsapi_wifi_get_config_BSSID_rpcdata (); +extern bool_t xdr_qcsapi_wifi_ssid_get_bssid_rpcdata (); +extern bool_t xdr_qcsapi_wifi_ssid_set_bssid_rpcdata (); +extern bool_t xdr_qcsapi_wifi_get_SSID_rpcdata (); +extern bool_t xdr_qcsapi_wifi_set_SSID_rpcdata (); +extern bool_t xdr_qcsapi_wifi_get_IEEE_802_11_standard_rpcdata (); +extern bool_t xdr_qcsapi_wifi_get_list_channels_rpcdata (); +extern bool_t xdr_qcsapi_wifi_get_mode_switch_rpcdata (); +extern bool_t xdr_qcsapi_wifi_disassociate_rpcdata (); +extern bool_t xdr_qcsapi_wifi_disassociate_sta_rpcdata (); +extern bool_t xdr_qcsapi_wifi_reassociate_rpcdata (); +extern bool_t xdr_qcsapi_wifi_get_disconn_info_rpcdata (); +extern bool_t xdr_qcsapi_wifi_disable_wps_rpcdata (); +extern bool_t xdr_qcsapi_wifi_associate_rpcdata (); +extern bool_t xdr_qcsapi_wifi_start_cca_rpcdata (); +extern bool_t xdr_qcsapi_wifi_get_noise_rpcdata (); +extern bool_t xdr_qcsapi_wifi_get_rssi_by_chain_rpcdata (); +extern bool_t xdr_qcsapi_wifi_get_avg_snr_rpcdata (); +extern bool_t xdr_qcsapi_get_primary_interface_rpcdata (); +extern bool_t xdr_qcsapi_get_interface_by_index_rpcdata (); +extern bool_t xdr_qcsapi_wifi_set_wifi_macaddr_rpcdata (); +extern bool_t xdr_qcsapi_interface_get_BSSID_rpcdata (); +extern bool_t xdr_qcsapi_wifi_get_rates_rpcdata (); +extern bool_t xdr_qcsapi_wifi_set_rates_rpcdata (); +extern bool_t xdr_qcsapi_get_max_bitrate_rpcdata (); +extern bool_t xdr_qcsapi_set_max_bitrate_rpcdata (); +extern bool_t xdr_qcsapi_wifi_qos_get_param_rpcdata (); +extern bool_t xdr_qcsapi_wifi_qos_set_param_rpcdata (); +extern bool_t xdr_qcsapi_wifi_get_wmm_ac_map_rpcdata (); +extern bool_t xdr_qcsapi_wifi_set_wmm_ac_map_rpcdata (); +extern bool_t xdr_qcsapi_wifi_get_dscp_8021p_map_rpcdata (); +extern bool_t xdr_qcsapi_wifi_get_dscp_ac_map_rpcdata (); +extern bool_t xdr_qcsapi_wifi_set_dscp_8021p_map_rpcdata (); +extern bool_t xdr_qcsapi_wifi_set_dscp_ac_map_rpcdata (); +extern bool_t xdr_qcsapi_wifi_get_priority_rpcdata (); +extern bool_t xdr_qcsapi_wifi_set_priority_rpcdata (); +extern bool_t xdr_qcsapi_wifi_get_airfair_rpcdata (); +extern bool_t xdr_qcsapi_wifi_set_airfair_rpcdata (); +extern bool_t xdr_qcsapi_wifi_get_tx_power_rpcdata (); +extern bool_t xdr_qcsapi_wifi_set_tx_power_rpcdata (); +extern bool_t xdr_qcsapi_wifi_get_bw_power_rpcdata (); +extern bool_t xdr_qcsapi_wifi_set_bw_power_rpcdata (); +extern bool_t xdr_qcsapi_wifi_get_bf_power_rpcdata (); +extern bool_t xdr_qcsapi_wifi_set_bf_power_rpcdata (); +extern bool_t xdr_qcsapi_wifi_get_tx_power_ext_rpcdata (); +extern bool_t xdr_qcsapi_wifi_set_tx_power_ext_rpcdata (); +extern bool_t xdr_qcsapi_wifi_get_chan_power_table_rpcdata (); +extern bool_t xdr_qcsapi_wifi_set_chan_power_table_rpcdata (); +extern bool_t xdr_qcsapi_wifi_get_power_selection_rpcdata (); +extern bool_t xdr_qcsapi_wifi_set_power_selection_rpcdata (); +extern bool_t xdr_qcsapi_wifi_get_carrier_interference_rpcdata (); +extern bool_t xdr_qcsapi_wifi_get_congestion_index_rpcdata (); +extern bool_t xdr_qcsapi_wifi_get_supported_tx_power_levels_rpcdata (); +extern bool_t xdr_qcsapi_wifi_get_current_tx_power_level_rpcdata (); +extern bool_t xdr_qcsapi_wifi_set_power_constraint_rpcdata (); +extern bool_t xdr_qcsapi_wifi_get_power_constraint_rpcdata (); +extern bool_t xdr_qcsapi_wifi_set_tpc_interval_rpcdata (); +extern bool_t xdr_qcsapi_wifi_get_tpc_interval_rpcdata (); +extern bool_t xdr_qcsapi_wifi_get_assoc_records_rpcdata (); +extern bool_t xdr_qcsapi_wifi_get_ap_isolate_rpcdata (); +extern bool_t xdr_qcsapi_wifi_set_ap_isolate_rpcdata (); +extern bool_t xdr_qcsapi_wifi_get_intra_bss_isolate_rpcdata (); +extern bool_t xdr_qcsapi_wifi_set_intra_bss_isolate_rpcdata (); +extern bool_t xdr_qcsapi_wifi_get_bss_isolate_rpcdata (); +extern bool_t xdr_qcsapi_wifi_set_bss_isolate_rpcdata (); +extern bool_t xdr_qcsapi_wifi_disable_dfs_channels_rpcdata (); +extern bool_t xdr_qcsapi_wifi_create_restricted_bss_rpcdata (); +extern bool_t xdr_qcsapi_wifi_create_bss_rpcdata (); +extern bool_t xdr_qcsapi_wifi_remove_bss_rpcdata (); +extern bool_t xdr_qcsapi_wds_add_peer_rpcdata (); +extern bool_t xdr_qcsapi_wds_add_peer_encrypt_rpcdata (); +extern bool_t xdr_qcsapi_wds_remove_peer_rpcdata (); +extern bool_t xdr_qcsapi_wds_get_peer_address_rpcdata (); +extern bool_t xdr_qcsapi_wds_set_psk_rpcdata (); +extern bool_t xdr_qcsapi_wds_set_mode_rpcdata (); +extern bool_t xdr_qcsapi_wds_get_mode_rpcdata (); +extern bool_t xdr_qcsapi_wifi_set_extender_params_rpcdata (); +extern bool_t xdr_qcsapi_wifi_get_extender_params_rpcdata (); +extern bool_t xdr_qcsapi_wifi_get_beacon_type_rpcdata (); +extern bool_t xdr_qcsapi_wifi_set_beacon_type_rpcdata (); +extern bool_t xdr_qcsapi_wifi_get_WEP_key_index_rpcdata (); +extern bool_t xdr_qcsapi_wifi_set_WEP_key_index_rpcdata (); +extern bool_t xdr_qcsapi_wifi_get_WEP_key_passphrase_rpcdata (); +extern bool_t xdr_qcsapi_wifi_set_WEP_key_passphrase_rpcdata (); +extern bool_t xdr_qcsapi_wifi_get_WEP_encryption_level_rpcdata (); +extern bool_t xdr_qcsapi_wifi_get_basic_encryption_modes_rpcdata (); +extern bool_t xdr_qcsapi_wifi_set_basic_encryption_modes_rpcdata (); +extern bool_t xdr_qcsapi_wifi_get_basic_authentication_mode_rpcdata (); +extern bool_t xdr_qcsapi_wifi_set_basic_authentication_mode_rpcdata (); +extern bool_t xdr_qcsapi_wifi_get_WEP_key_rpcdata (); +extern bool_t xdr_qcsapi_wifi_set_WEP_key_rpcdata (); +extern bool_t xdr_qcsapi_wifi_get_WPA_encryption_modes_rpcdata (); +extern bool_t xdr_qcsapi_wifi_set_WPA_encryption_modes_rpcdata (); +extern bool_t xdr_qcsapi_wifi_get_WPA_authentication_mode_rpcdata (); +extern bool_t xdr_qcsapi_wifi_set_WPA_authentication_mode_rpcdata (); +extern bool_t xdr_qcsapi_wifi_get_interworking_rpcdata (); +extern bool_t xdr_qcsapi_wifi_set_interworking_rpcdata (); +extern bool_t xdr_qcsapi_wifi_get_80211u_params_rpcdata (); +extern bool_t xdr_qcsapi_wifi_set_80211u_params_rpcdata (); +extern bool_t xdr_qcsapi_security_get_nai_realms_rpcdata (); +extern bool_t xdr_qcsapi_security_add_nai_realm_rpcdata (); +extern bool_t xdr_qcsapi_security_del_nai_realm_rpcdata (); +extern bool_t xdr_qcsapi_security_get_roaming_consortium_rpcdata (); +extern bool_t xdr_qcsapi_security_add_roaming_consortium_rpcdata (); +extern bool_t xdr_qcsapi_security_del_roaming_consortium_rpcdata (); +extern bool_t xdr_qcsapi_security_get_venue_name_rpcdata (); +extern bool_t xdr_qcsapi_security_add_venue_name_rpcdata (); +extern bool_t xdr_qcsapi_security_del_venue_name_rpcdata (); +extern bool_t xdr_qcsapi_security_get_oper_friendly_name_rpcdata (); +extern bool_t xdr_qcsapi_security_add_oper_friendly_name_rpcdata (); +extern bool_t xdr_qcsapi_security_del_oper_friendly_name_rpcdata (); +extern bool_t xdr_qcsapi_security_get_hs20_conn_capab_rpcdata (); +extern bool_t xdr_qcsapi_security_add_hs20_conn_capab_rpcdata (); +extern bool_t xdr_qcsapi_security_del_hs20_conn_capab_rpcdata (); +extern bool_t xdr_qcsapi_wifi_get_hs20_status_rpcdata (); +extern bool_t xdr_qcsapi_wifi_set_hs20_status_rpcdata (); +extern bool_t xdr_qcsapi_wifi_get_proxy_arp_rpcdata (); +extern bool_t xdr_qcsapi_wifi_set_proxy_arp_rpcdata (); +extern bool_t xdr_qcsapi_wifi_get_l2_ext_filter_rpcdata (); +extern bool_t xdr_qcsapi_wifi_set_l2_ext_filter_rpcdata (); +extern bool_t xdr_qcsapi_wifi_get_hs20_params_rpcdata (); +extern bool_t xdr_qcsapi_wifi_set_hs20_params_rpcdata (); +extern bool_t xdr_qcsapi_remove_11u_param_rpcdata (); +extern bool_t xdr_qcsapi_remove_hs20_param_rpcdata (); +extern bool_t xdr_qcsapi_wifi_get_IEEE11i_encryption_modes_rpcdata (); +extern bool_t xdr_qcsapi_wifi_set_IEEE11i_encryption_modes_rpcdata (); +extern bool_t xdr_qcsapi_wifi_get_IEEE11i_authentication_mode_rpcdata (); +extern bool_t xdr_qcsapi_wifi_set_IEEE11i_authentication_mode_rpcdata (); +extern bool_t xdr_qcsapi_wifi_get_michael_errcnt_rpcdata (); +extern bool_t xdr_qcsapi_wifi_get_pre_shared_key_rpcdata (); +extern bool_t xdr_qcsapi_wifi_set_pre_shared_key_rpcdata (); +extern bool_t xdr_qcsapi_wifi_add_radius_auth_server_cfg_rpcdata (); +extern bool_t xdr_qcsapi_wifi_del_radius_auth_server_cfg_rpcdata (); +extern bool_t xdr_qcsapi_wifi_get_radius_auth_server_cfg_rpcdata (); +extern bool_t xdr_qcsapi_wifi_set_own_ip_addr_rpcdata (); +extern bool_t xdr_qcsapi_wifi_get_key_passphrase_rpcdata (); +extern bool_t xdr_qcsapi_wifi_set_key_passphrase_rpcdata (); +extern bool_t xdr_qcsapi_wifi_get_group_key_interval_rpcdata (); +extern bool_t xdr_qcsapi_wifi_set_group_key_interval_rpcdata (); +extern bool_t xdr_qcsapi_wifi_get_pmf_rpcdata (); +extern bool_t xdr_qcsapi_wifi_set_pmf_rpcdata (); +extern bool_t xdr_qcsapi_wifi_get_wpa_status_rpcdata (); +extern bool_t xdr_qcsapi_wifi_get_psk_auth_failures_rpcdata (); +extern bool_t xdr_qcsapi_wifi_get_auth_state_rpcdata (); +extern bool_t xdr_qcsapi_wifi_set_security_defer_mode_rpcdata (); +extern bool_t xdr_qcsapi_wifi_get_security_defer_mode_rpcdata (); +extern bool_t xdr_qcsapi_wifi_apply_security_config_rpcdata (); +extern bool_t xdr_qcsapi_wifi_set_mac_address_filtering_rpcdata (); +extern bool_t xdr_qcsapi_wifi_get_mac_address_filtering_rpcdata (); +extern bool_t xdr_qcsapi_wifi_authorize_mac_address_rpcdata (); +extern bool_t xdr_qcsapi_wifi_deny_mac_address_rpcdata (); +extern bool_t xdr_qcsapi_wifi_remove_mac_address_rpcdata (); +extern bool_t xdr_qcsapi_wifi_is_mac_address_authorized_rpcdata (); +extern bool_t xdr_qcsapi_wifi_get_authorized_mac_addresses_rpcdata (); +extern bool_t xdr_qcsapi_wifi_get_denied_mac_addresses_rpcdata (); +extern bool_t xdr_qcsapi_wifi_set_accept_oui_filter_rpcdata (); +extern bool_t xdr_qcsapi_wifi_get_accept_oui_filter_rpcdata (); +extern bool_t xdr_qcsapi_wifi_clear_mac_address_filters_rpcdata (); +extern bool_t xdr_qcsapi_wifi_set_mac_address_reserve_rpcdata (); +extern bool_t xdr_qcsapi_wifi_get_mac_address_reserve_rpcdata (); +extern bool_t xdr_qcsapi_wifi_clear_mac_address_reserve_rpcdata (); +extern bool_t xdr_qcsapi_wifi_get_option_rpcdata (); +extern bool_t xdr_qcsapi_wifi_set_option_rpcdata (); +extern bool_t xdr_qcsapi_get_board_parameter_rpcdata (); +extern bool_t xdr_qcsapi_get_swfeat_list_rpcdata (); +extern bool_t xdr_qcsapi_SSID_create_SSID_rpcdata (); +extern bool_t xdr_qcsapi_SSID_remove_SSID_rpcdata (); +extern bool_t xdr_qcsapi_SSID_verify_SSID_rpcdata (); +extern bool_t xdr_qcsapi_SSID_rename_SSID_rpcdata (); +extern bool_t xdr_qcsapi_SSID_get_SSID_list_rpcdata (); +extern bool_t xdr_qcsapi_SSID_set_protocol_rpcdata (); +extern bool_t xdr_qcsapi_SSID_get_protocol_rpcdata (); +extern bool_t xdr_qcsapi_SSID_get_encryption_modes_rpcdata (); +extern bool_t xdr_qcsapi_SSID_set_encryption_modes_rpcdata (); +extern bool_t xdr_qcsapi_SSID_get_group_encryption_rpcdata (); +extern bool_t xdr_qcsapi_SSID_set_group_encryption_rpcdata (); +extern bool_t xdr_qcsapi_SSID_get_authentication_mode_rpcdata (); +extern bool_t xdr_qcsapi_SSID_set_authentication_mode_rpcdata (); +extern bool_t xdr_qcsapi_SSID_get_pre_shared_key_rpcdata (); +extern bool_t xdr_qcsapi_SSID_set_pre_shared_key_rpcdata (); +extern bool_t xdr_qcsapi_SSID_get_key_passphrase_rpcdata (); +extern bool_t xdr_qcsapi_SSID_set_key_passphrase_rpcdata (); +extern bool_t xdr_qcsapi_SSID_get_pmf_rpcdata (); +extern bool_t xdr_qcsapi_SSID_set_pmf_rpcdata (); +extern bool_t xdr_qcsapi_SSID_get_wps_SSID_rpcdata (); +extern bool_t xdr_qcsapi_wifi_vlan_config_rpcdata (); +extern bool_t xdr_qcsapi_wifi_show_vlan_config_rpcdata (); +extern bool_t xdr_qcsapi_enable_vlan_pass_through_rpcdata (); +extern bool_t xdr_qcsapi_wifi_set_vlan_promisc_rpcdata (); +extern bool_t xdr_qcsapi_wps_registrar_report_button_press_rpcdata (); +extern bool_t xdr_qcsapi_wps_registrar_report_pin_rpcdata (); +extern bool_t xdr_qcsapi_wps_registrar_get_pp_devname_rpcdata (); +extern bool_t xdr_qcsapi_wps_registrar_set_pp_devname_rpcdata (); +extern bool_t xdr_qcsapi_wps_enrollee_report_button_press_rpcdata (); +extern bool_t xdr_qcsapi_wps_enrollee_report_pin_rpcdata (); +extern bool_t xdr_qcsapi_wps_enrollee_generate_pin_rpcdata (); +extern bool_t xdr_qcsapi_wps_get_ap_pin_rpcdata (); +extern bool_t xdr_qcsapi_wps_set_ap_pin_rpcdata (); +extern bool_t xdr_qcsapi_wps_save_ap_pin_rpcdata (); +extern bool_t xdr_qcsapi_wps_enable_ap_pin_rpcdata (); +extern bool_t xdr_qcsapi_wps_get_sta_pin_rpcdata (); +extern bool_t xdr_qcsapi_wps_get_state_rpcdata (); +extern bool_t xdr_qcsapi_wps_get_configured_state_rpcdata (); +extern bool_t xdr_qcsapi_wps_get_runtime_state_rpcdata (); +extern bool_t xdr_qcsapi_wps_set_configured_state_rpcdata (); +extern bool_t xdr_qcsapi_wps_get_param_rpcdata (); +extern bool_t xdr_qcsapi_wps_set_timeout_rpcdata (); +extern bool_t xdr_qcsapi_wps_on_hidden_ssid_rpcdata (); +extern bool_t xdr_qcsapi_wps_on_hidden_ssid_status_rpcdata (); +extern bool_t xdr_qcsapi_wps_upnp_enable_rpcdata (); +extern bool_t xdr_qcsapi_wps_upnp_status_rpcdata (); +extern bool_t xdr_qcsapi_wps_allow_pbc_overlap_rpcdata (); +extern bool_t xdr_qcsapi_wps_get_allow_pbc_overlap_status_rpcdata (); +extern bool_t xdr_qcsapi_wps_set_access_control_rpcdata (); +extern bool_t xdr_qcsapi_wps_get_access_control_rpcdata (); +extern bool_t xdr_qcsapi_wps_set_param_rpcdata (); +extern bool_t xdr_qcsapi_wps_cancel_rpcdata (); +extern bool_t xdr_qcsapi_wps_set_pbc_in_srcm_rpcdata (); +extern bool_t xdr_qcsapi_wps_get_pbc_in_srcm_rpcdata (); +extern bool_t xdr_qcsapi_registrar_set_default_pbc_bss_rpcdata (); +extern bool_t xdr_qcsapi_registrar_get_default_pbc_bss_rpcdata (); +extern bool_t xdr_qcsapi_gpio_set_config_rpcdata (); +extern bool_t xdr_qcsapi_gpio_get_config_rpcdata (); +extern bool_t xdr_qcsapi_led_get_rpcdata (); +extern bool_t xdr_qcsapi_led_set_rpcdata (); +extern bool_t xdr_qcsapi_led_pwm_enable_rpcdata (); +extern bool_t xdr_qcsapi_led_brightness_rpcdata (); +extern bool_t xdr_qcsapi_gpio_enable_wps_push_button_rpcdata (); +extern bool_t xdr_qcsapi_wifi_get_count_associations_rpcdata (); +extern bool_t xdr_qcsapi_wifi_get_associated_device_mac_addr_rpcdata (); +extern bool_t xdr_qcsapi_wifi_get_associated_device_ip_addr_rpcdata (); +extern bool_t xdr_qcsapi_wifi_get_link_quality_rpcdata (); +extern bool_t xdr_qcsapi_wifi_get_link_quality_max_rpcdata (); +extern bool_t xdr_qcsapi_wifi_get_rx_bytes_per_association_rpcdata (); +extern bool_t xdr_qcsapi_wifi_get_tx_bytes_per_association_rpcdata (); +extern bool_t xdr_qcsapi_wifi_get_rx_packets_per_association_rpcdata (); +extern bool_t xdr_qcsapi_wifi_get_tx_packets_per_association_rpcdata (); +extern bool_t xdr_qcsapi_wifi_get_tx_err_packets_per_association_rpcdata (); +extern bool_t xdr_qcsapi_wifi_get_rssi_per_association_rpcdata (); +extern bool_t xdr_qcsapi_wifi_get_rssi_in_dbm_per_association_rpcdata (); +extern bool_t xdr_qcsapi_wifi_get_bw_per_association_rpcdata (); +extern bool_t xdr_qcsapi_wifi_get_tx_phy_rate_per_association_rpcdata (); +extern bool_t xdr_qcsapi_wifi_get_rx_phy_rate_per_association_rpcdata (); +extern bool_t xdr_qcsapi_wifi_get_tx_mcs_per_association_rpcdata (); +extern bool_t xdr_qcsapi_wifi_get_rx_mcs_per_association_rpcdata (); +extern bool_t xdr_qcsapi_wifi_get_achievable_tx_phy_rate_per_association_rpcdata (); +extern bool_t xdr_qcsapi_wifi_get_achievable_rx_phy_rate_per_association_rpcdata (); +extern bool_t xdr_qcsapi_wifi_get_auth_enc_per_association_rpcdata (); +extern bool_t xdr_qcsapi_wifi_get_tput_caps_rpcdata (); +extern bool_t xdr_qcsapi_wifi_get_connection_mode_rpcdata (); +extern bool_t xdr_qcsapi_wifi_get_vendor_per_association_rpcdata (); +extern bool_t xdr_qcsapi_wifi_get_max_mimo_rpcdata (); +extern bool_t xdr_qcsapi_wifi_get_snr_per_association_rpcdata (); +extern bool_t xdr_qcsapi_wifi_get_time_associated_per_association_rpcdata (); +extern bool_t xdr_qcsapi_wifi_get_node_param_rpcdata (); +extern bool_t xdr_qcsapi_wifi_get_node_counter_rpcdata (); +extern bool_t xdr_qcsapi_wifi_get_node_stats_rpcdata (); +extern bool_t xdr_qcsapi_wifi_get_max_queued_rpcdata (); +extern bool_t xdr_qcsapi_wifi_get_hw_noise_per_association_rpcdata (); +extern bool_t xdr_qcsapi_wifi_get_mlme_stats_per_mac_rpcdata (); +extern bool_t xdr_qcsapi_wifi_get_mlme_stats_per_association_rpcdata (); +extern bool_t xdr_qcsapi_wifi_get_mlme_stats_macs_list_rpcdata (); +extern bool_t xdr_qcsapi_wifi_get_list_regulatory_regions_rpcdata (); +extern bool_t xdr_qcsapi_regulatory_get_list_regulatory_regions_rpcdata (); +extern bool_t xdr_qcsapi_wifi_get_list_regulatory_channels_rpcdata (); +extern bool_t xdr_qcsapi_regulatory_get_list_regulatory_channels_rpcdata (); +extern bool_t xdr_qcsapi_regulatory_get_list_regulatory_bands_rpcdata (); +extern bool_t xdr_qcsapi_wifi_get_regulatory_tx_power_rpcdata (); +extern bool_t xdr_qcsapi_regulatory_get_regulatory_tx_power_rpcdata (); +extern bool_t xdr_qcsapi_wifi_get_configured_tx_power_rpcdata (); +extern bool_t xdr_qcsapi_regulatory_get_configured_tx_power_rpcdata (); +extern bool_t xdr_qcsapi_regulatory_get_configured_tx_power_ext_rpcdata (); +extern bool_t xdr_qcsapi_wifi_set_regulatory_region_rpcdata (); +extern bool_t xdr_qcsapi_regulatory_set_regulatory_region_rpcdata (); +extern bool_t xdr_qcsapi_regulatory_restore_regulatory_tx_power_rpcdata (); +extern bool_t xdr_qcsapi_wifi_get_regulatory_region_rpcdata (); +extern bool_t xdr_qcsapi_regulatory_overwrite_country_code_rpcdata (); +extern bool_t xdr_qcsapi_wifi_set_regulatory_channel_rpcdata (); +extern bool_t xdr_qcsapi_regulatory_set_regulatory_channel_rpcdata (); +extern bool_t xdr_qcsapi_regulatory_get_db_version_rpcdata (); +extern bool_t xdr_qcsapi_regulatory_apply_tx_power_cap_rpcdata (); +extern bool_t xdr_qcsapi_wifi_get_list_DFS_channels_rpcdata (); +extern bool_t xdr_qcsapi_regulatory_get_list_DFS_channels_rpcdata (); +extern bool_t xdr_qcsapi_wifi_is_channel_DFS_rpcdata (); +extern bool_t xdr_qcsapi_regulatory_is_channel_DFS_rpcdata (); +extern bool_t xdr_qcsapi_wifi_get_dfs_cce_channels_rpcdata (); +extern bool_t xdr_qcsapi_wifi_get_DFS_alt_channel_rpcdata (); +extern bool_t xdr_qcsapi_wifi_set_DFS_alt_channel_rpcdata (); +extern bool_t xdr_qcsapi_wifi_start_dfs_reentry_rpcdata (); +extern bool_t xdr_qcsapi_wifi_start_scan_ext_rpcdata (); +extern bool_t xdr_qcsapi_wifi_get_csw_records_rpcdata (); +extern bool_t xdr_qcsapi_wifi_get_radar_status_rpcdata (); +extern bool_t xdr_qcsapi_wifi_get_cac_status_rpcdata (); +extern bool_t xdr_qcsapi_wifi_get_results_AP_scan_rpcdata (); +extern bool_t xdr_qcsapi_wifi_get_count_APs_scanned_rpcdata (); +extern bool_t xdr_qcsapi_wifi_get_properties_AP_rpcdata (); +extern bool_t xdr_qcsapi_wifi_set_scan_chk_inv_rpcdata (); +extern bool_t xdr_qcsapi_wifi_get_scan_chk_inv_rpcdata (); +extern bool_t xdr_qcsapi_wifi_set_scan_buf_max_size_rpcdata (); +extern bool_t xdr_qcsapi_wifi_get_scan_buf_max_size_rpcdata (); +extern bool_t xdr_qcsapi_wifi_set_scan_table_max_len_rpcdata (); +extern bool_t xdr_qcsapi_wifi_get_scan_table_max_len_rpcdata (); +extern bool_t xdr_qcsapi_wifi_set_dwell_times_rpcdata (); +extern bool_t xdr_qcsapi_wifi_get_dwell_times_rpcdata (); +extern bool_t xdr_qcsapi_wifi_set_bgscan_dwell_times_rpcdata (); +extern bool_t xdr_qcsapi_wifi_get_bgscan_dwell_times_rpcdata (); +extern bool_t xdr_qcsapi_wifi_start_scan_rpcdata (); +extern bool_t xdr_qcsapi_wifi_cancel_scan_rpcdata (); +extern bool_t xdr_qcsapi_wifi_get_scan_status_rpcdata (); +extern bool_t xdr_qcsapi_wifi_enable_bgscan_rpcdata (); +extern bool_t xdr_qcsapi_wifi_get_bgscan_status_rpcdata (); +extern bool_t xdr_qcsapi_wifi_wait_scan_completes_rpcdata (); +extern bool_t xdr_qcsapi_wifi_backoff_fail_max_rpcdata (); +extern bool_t xdr_qcsapi_wifi_backoff_timeout_rpcdata (); +extern bool_t xdr_qcsapi_wifi_get_mcs_rate_rpcdata (); +extern bool_t xdr_qcsapi_wifi_set_mcs_rate_rpcdata (); +extern bool_t xdr_qcsapi_wifi_set_pairing_id_rpcdata (); +extern bool_t xdr_qcsapi_wifi_get_pairing_id_rpcdata (); +extern bool_t xdr_qcsapi_wifi_set_pairing_enable_rpcdata (); +extern bool_t xdr_qcsapi_wifi_get_pairing_enable_rpcdata (); +extern bool_t xdr_qcsapi_non_wps_set_pp_enable_rpcdata (); +extern bool_t xdr_qcsapi_non_wps_get_pp_enable_rpcdata (); +extern bool_t xdr_qcsapi_wifi_set_vendor_fix_rpcdata (); +extern bool_t xdr_qcsapi_errno_get_message_rpcdata (); +extern bool_t xdr_qcsapi_get_interface_stats_rpcdata (); +extern bool_t xdr_qcsapi_get_phy_stats_rpcdata (); +extern bool_t xdr_qcsapi_reset_all_counters_rpcdata (); +extern bool_t xdr_qcsapi_get_uboot_info_rpcdata (); +extern bool_t xdr_qcsapi_firmware_get_version_rpcdata (); +extern bool_t xdr_qcsapi_flash_image_update_rpcdata (); +extern bool_t xdr_qcsapi_send_file_rpcdata (); +extern bool_t xdr_qcsapi_pm_set_mode_rpcdata (); +extern bool_t xdr_qcsapi_pm_get_mode_rpcdata (); +extern bool_t xdr_qcsapi_get_qpm_level_rpcdata (); +extern bool_t xdr_qcsapi_set_host_state_rpcdata (); +extern bool_t xdr_qcsapi_qtm_get_state_rpcdata (); +extern bool_t xdr_qcsapi_qtm_get_state_all_rpcdata (); +extern bool_t xdr_qcsapi_qtm_set_state_rpcdata (); +extern bool_t xdr_qcsapi_qtm_get_config_rpcdata (); +extern bool_t xdr_qcsapi_qtm_get_config_all_rpcdata (); +extern bool_t xdr_qcsapi_qtm_set_config_rpcdata (); +extern bool_t xdr_qcsapi_qtm_add_rule_rpcdata (); +extern bool_t xdr_qcsapi_qtm_del_rule_rpcdata (); +extern bool_t xdr_qcsapi_qtm_del_rule_index_rpcdata (); +extern bool_t xdr_qcsapi_qtm_get_rule_rpcdata (); +extern bool_t xdr_qcsapi_qtm_get_strm_rpcdata (); +extern bool_t xdr_qcsapi_qtm_get_stats_rpcdata (); +extern bool_t xdr_qcsapi_qtm_get_inactive_flags_rpcdata (); +extern bool_t xdr_qcsapi_wifi_run_script_rpcdata (); +extern bool_t xdr_qcsapi_wifi_test_traffic_rpcdata (); +extern bool_t xdr_qcsapi_wifi_add_ipff_rpcdata (); +extern bool_t xdr_qcsapi_wifi_del_ipff_rpcdata (); +extern bool_t xdr_qcsapi_wifi_get_ipff_rpcdata (); +extern bool_t xdr_qcsapi_wifi_get_rts_threshold_rpcdata (); +extern bool_t xdr_qcsapi_wifi_set_rts_threshold_rpcdata (); +extern bool_t xdr_qcsapi_wifi_set_nss_cap_rpcdata (); +extern bool_t xdr_qcsapi_wifi_get_nss_cap_rpcdata (); +extern bool_t xdr_qcsapi_wifi_get_tx_amsdu_rpcdata (); +extern bool_t xdr_qcsapi_wifi_set_tx_amsdu_rpcdata (); +extern bool_t xdr_qcsapi_wifi_get_disassoc_reason_rpcdata (); +extern bool_t xdr_qcsapi_wifi_block_bss_rpcdata (); +extern bool_t xdr_qcsapi_wifi_verify_repeater_mode_rpcdata (); +extern bool_t xdr_qcsapi_wifi_set_ap_interface_name_rpcdata (); +extern bool_t xdr_qcsapi_wifi_get_ap_interface_name_rpcdata (); +extern bool_t xdr_qcsapi_get_temperature_info_rpcdata (); +extern bool_t xdr_qcsapi_calcmd_set_test_mode_rpcdata (); +extern bool_t xdr_qcsapi_calcmd_show_test_packet_rpcdata (); +extern bool_t xdr_qcsapi_calcmd_send_test_packet_rpcdata (); +extern bool_t xdr_qcsapi_calcmd_stop_test_packet_rpcdata (); +extern bool_t xdr_qcsapi_calcmd_send_dc_cw_signal_rpcdata (); +extern bool_t xdr_qcsapi_calcmd_stop_dc_cw_signal_rpcdata (); +extern bool_t xdr_qcsapi_calcmd_get_test_mode_antenna_sel_rpcdata (); +extern bool_t xdr_qcsapi_calcmd_get_test_mode_mcs_rpcdata (); +extern bool_t xdr_qcsapi_calcmd_get_test_mode_bw_rpcdata (); +extern bool_t xdr_qcsapi_calcmd_get_tx_power_rpcdata (); +extern bool_t xdr_qcsapi_calcmd_set_tx_power_rpcdata (); +extern bool_t xdr_qcsapi_calcmd_get_test_mode_rssi_rpcdata (); +extern bool_t xdr_qcsapi_calcmd_set_mac_filter_rpcdata (); +extern bool_t xdr_qcsapi_calcmd_get_antenna_count_rpcdata (); +extern bool_t xdr_qcsapi_calcmd_clear_counter_rpcdata (); +extern bool_t xdr_qcsapi_calcmd_get_info_rpcdata (); +extern bool_t xdr_qcsapi_wowlan_set_match_type_rpcdata (); +extern bool_t xdr_qcsapi_wowlan_set_L2_type_rpcdata (); +extern bool_t xdr_qcsapi_wowlan_set_udp_port_rpcdata (); +extern bool_t xdr_qcsapi_wowlan_set_magic_pattern_rpcdata (); +extern bool_t xdr_qcsapi_wifi_wowlan_get_host_state_rpcdata (); +extern bool_t xdr_qcsapi_wifi_wowlan_get_match_type_rpcdata (); +extern bool_t xdr_qcsapi_wifi_wowlan_get_l2_type_rpcdata (); +extern bool_t xdr_qcsapi_wifi_wowlan_get_udp_port_rpcdata (); +extern bool_t xdr_qcsapi_wifi_wowlan_get_magic_pattern_rpcdata (); +extern bool_t xdr_qcsapi_wifi_set_enable_mu_rpcdata (); +extern bool_t xdr_qcsapi_wifi_get_enable_mu_rpcdata (); +extern bool_t xdr_qcsapi_wifi_set_mu_use_precode_rpcdata (); +extern bool_t xdr_qcsapi_wifi_get_mu_use_precode_rpcdata (); +extern bool_t xdr_qcsapi_wifi_set_mu_use_eq_rpcdata (); +extern bool_t xdr_qcsapi_wifi_get_mu_use_eq_rpcdata (); +extern bool_t xdr_qcsapi_wifi_get_mu_groups_rpcdata (); +extern bool_t xdr_qcsapi_wifi_enable_tdls_rpcdata (); +extern bool_t xdr_qcsapi_wifi_enable_tdls_over_qhop_rpcdata (); +extern bool_t xdr_qcsapi_wifi_get_tdls_status_rpcdata (); +extern bool_t xdr_qcsapi_wifi_set_tdls_params_rpcdata (); +extern bool_t xdr_qcsapi_wifi_get_tdls_params_rpcdata (); +extern bool_t xdr_qcsapi_wifi_tdls_operate_rpcdata (); + +#endif /* K&R C */ + +#ifdef __cplusplus +} +#endif + +#endif /* !_QCSAPI_RPC_H_RPCGEN */ diff --git a/package/firmware/quantenna/src/qcsapi_rpc/generated/qcsapi_rpc_clnt_adapter.c b/package/firmware/quantenna/src/qcsapi_rpc/generated/qcsapi_rpc_clnt_adapter.c new file mode 100644 index 000000000..4d91c919b --- /dev/null +++ b/package/firmware/quantenna/src/qcsapi_rpc/generated/qcsapi_rpc_clnt_adapter.c @@ -0,0 +1,27019 @@ + +/* +* ########## DO NOT EDIT ########### + +Automatically generated on Tue, 19 Dec 2017 22:57:40 -0800 + +* +* Adapter from qcsapi.h functions +* to RPC client functions. +*/ + +#include +#include +#include + +#include +#include "qcsapi_rpc.h" +#include + +static int retries_limit = 3; + +/* Default timeout can be changed using clnt_control() */ +static struct timeval __timeout = { 25, 0 }; + +static CLIENT *__clnt = NULL; + +static const int debug = 0; + +static CLIENT *qcsapi_adapter_get_client(void) +{ + if (__clnt == NULL) { + fprintf(stderr, "%s: client is null!\n", __FUNCTION__); + exit (1); + } + + return __clnt; +} + +void client_qcsapi_set_rpcclient(CLIENT * clnt) +{ + __clnt = clnt; +} + +static client_qcsapi_callback_pre_t __pre_callback = NULL; +static client_qcsapi_callback_post_t __post_callback = NULL; +static client_qcsapi_callback_reconnect_t __reconnect_callback = NULL; + +void client_qcsapi_set_callbacks(client_qcsapi_callback_pre_t pre, + client_qcsapi_callback_post_t post, + client_qcsapi_callback_reconnect_t reconnect) +{ + __pre_callback = pre; + __post_callback = post; + __reconnect_callback = reconnect; +} + +#define client_qcsapi_pre() __client_qcsapi_pre(__FUNCTION__) +static void __client_qcsapi_pre(const char *func) +{ + if (__pre_callback) { + __pre_callback(func); + } +} + +#define client_qcsapi_post(x) __client_qcsapi_post(__FUNCTION__, (x)) +static void __client_qcsapi_post(const char *func, int was_error) +{ + if (__post_callback) { + __post_callback(func, was_error); + } +} + +#define client_qcsapi_reconnect() __client_qcsapi_reconnect(__FUNCTION__) +static void __client_qcsapi_reconnect(const char *func) +{ + if (__reconnect_callback) { + __reconnect_callback(func); + } +} + +int qcsapi_bootcfg_get_parameter(const char * param_name, char * param_value, const size_t max_param_len) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_bootcfg_get_parameter_rpcdata __req; + struct qcsapi_bootcfg_get_parameter_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcparam_name = {(char *)param_name}; + __rpc_string *p__rpcparam_name = (param_name) ? &__rpcparam_name : NULL; + __req.param_name = p__rpcparam_name; + + __rpc_string __rpcparam_value = {(char *)param_value}; + __rpc_string *p__rpcparam_value = (param_value) ? &__rpcparam_value : NULL; + __req.param_value = p__rpcparam_value; + + __req.max_param_len = (uint32_t)max_param_len; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_BOOTCFG_GET_PARAMETER_REMOTE, + (xdrproc_t)xdr_qcsapi_bootcfg_get_parameter_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_bootcfg_get_parameter_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_bootcfg_get_parameter call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_bootcfg_get_parameter_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (param_value && __resp.param_value) + strcpy(param_value, __resp.param_value->data); + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_bootcfg_get_parameter_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_bootcfg_update_parameter(const char * param_name, const char * param_value) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_bootcfg_update_parameter_rpcdata __req; + struct qcsapi_bootcfg_update_parameter_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcparam_name = {(char *)param_name}; + __rpc_string *p__rpcparam_name = (param_name) ? &__rpcparam_name : NULL; + __req.param_name = p__rpcparam_name; + + __rpc_string __rpcparam_value = {(char *)param_value}; + __rpc_string *p__rpcparam_value = (param_value) ? &__rpcparam_value : NULL; + __req.param_value = p__rpcparam_value; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_BOOTCFG_UPDATE_PARAMETER_REMOTE, + (xdrproc_t)xdr_qcsapi_bootcfg_update_parameter_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_bootcfg_update_parameter_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_bootcfg_update_parameter call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_bootcfg_update_parameter_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_bootcfg_update_parameter_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_bootcfg_commit() +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_bootcfg_commit_rpcdata __req; + struct qcsapi_bootcfg_commit_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_BOOTCFG_COMMIT_REMOTE, + (xdrproc_t)xdr_qcsapi_bootcfg_commit_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_bootcfg_commit_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_bootcfg_commit call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_bootcfg_commit_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_bootcfg_commit_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_telnet_enable(const qcsapi_unsigned_int onoff) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_telnet_enable_rpcdata __req; + struct qcsapi_telnet_enable_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __req.onoff = (unsigned int)onoff; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_TELNET_ENABLE_REMOTE, + (xdrproc_t)xdr_qcsapi_telnet_enable_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_telnet_enable_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_telnet_enable call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_telnet_enable_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_telnet_enable_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_get_service_name_enum(const char * lookup_service, qcsapi_service_name * serv_name) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_get_service_name_enum_rpcdata __req; + struct qcsapi_get_service_name_enum_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpclookup_service = {(char *)lookup_service}; + __rpc_string *p__rpclookup_service = (lookup_service) ? &__rpclookup_service : NULL; + __req.lookup_service = p__rpclookup_service; + + __req.serv_name = (int *)serv_name; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_GET_SERVICE_NAME_ENUM_REMOTE, + (xdrproc_t)xdr_qcsapi_get_service_name_enum_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_get_service_name_enum_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_get_service_name_enum call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_get_service_name_enum_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (serv_name) + *serv_name = *__resp.serv_name; + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_get_service_name_enum_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_get_service_action_enum(const char * lookup_action, qcsapi_service_action * serv_action) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_get_service_action_enum_rpcdata __req; + struct qcsapi_get_service_action_enum_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpclookup_action = {(char *)lookup_action}; + __rpc_string *p__rpclookup_action = (lookup_action) ? &__rpclookup_action : NULL; + __req.lookup_action = p__rpclookup_action; + + __req.serv_action = (int *)serv_action; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_GET_SERVICE_ACTION_ENUM_REMOTE, + (xdrproc_t)xdr_qcsapi_get_service_action_enum_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_get_service_action_enum_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_get_service_action_enum call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_get_service_action_enum_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (serv_action) + *serv_action = *__resp.serv_action; + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_get_service_action_enum_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_service_control(qcsapi_service_name service, qcsapi_service_action action) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_service_control_rpcdata __req; + struct qcsapi_service_control_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __req.service = (int)service; + + __req.action = (int)action; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_SERVICE_CONTROL_REMOTE, + (xdrproc_t)xdr_qcsapi_service_control_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_service_control_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_service_control call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_service_control_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_service_control_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wfa_cert_mode_enable(uint16_t enable) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wfa_cert_mode_enable_rpcdata __req; + struct qcsapi_wfa_cert_mode_enable_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __req.enable = (uint16_t)enable; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WFA_CERT_MODE_ENABLE_REMOTE, + (xdrproc_t)xdr_qcsapi_wfa_cert_mode_enable_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wfa_cert_mode_enable_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wfa_cert_mode_enable call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wfa_cert_mode_enable_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wfa_cert_mode_enable_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_get_scs_cce_channels(const char * ifname, qcsapi_unsigned_int * p_prev_channel, qcsapi_unsigned_int * p_cur_channel) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_get_scs_cce_channels_rpcdata __req; + struct qcsapi_wifi_get_scs_cce_channels_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.p_prev_channel = (unsigned int *)p_prev_channel; + + __req.p_cur_channel = (unsigned int *)p_cur_channel; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_GET_SCS_CCE_CHANNELS_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_get_scs_cce_channels_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_get_scs_cce_channels_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_get_scs_cce_channels call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_scs_cce_channels_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (p_prev_channel) + *p_prev_channel = *__resp.p_prev_channel; + } + if (__resp.return_code >= 0) { + if (p_cur_channel) + *p_cur_channel = *__resp.p_cur_channel; + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_scs_cce_channels_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_scs_enable(const char * ifname, uint16_t enable_val) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_scs_enable_rpcdata __req; + struct qcsapi_wifi_scs_enable_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.enable_val = (uint16_t)enable_val; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_SCS_ENABLE_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_scs_enable_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_scs_enable_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_scs_enable call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_scs_enable_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_scs_enable_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_scs_switch_channel(const char * ifname) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_scs_switch_channel_rpcdata __req; + struct qcsapi_wifi_scs_switch_channel_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_SCS_SWITCH_CHANNEL_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_scs_switch_channel_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_scs_switch_channel_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_scs_switch_channel call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_scs_switch_channel_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_scs_switch_channel_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_set_scs_verbose(const char * ifname, uint16_t enable_val) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_set_scs_verbose_rpcdata __req; + struct qcsapi_wifi_set_scs_verbose_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.enable_val = (uint16_t)enable_val; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_SET_SCS_VERBOSE_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_set_scs_verbose_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_set_scs_verbose_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_set_scs_verbose call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_set_scs_verbose_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_set_scs_verbose_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_get_scs_status(const char * ifname, qcsapi_unsigned_int * p_scs_status) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_get_scs_status_rpcdata __req; + struct qcsapi_wifi_get_scs_status_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.p_scs_status = (unsigned int *)p_scs_status; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_GET_SCS_STATUS_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_get_scs_status_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_get_scs_status_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_get_scs_status call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_scs_status_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (p_scs_status) + *p_scs_status = *__resp.p_scs_status; + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_scs_status_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_set_scs_smpl_enable(const char * ifname, uint16_t enable_val) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_set_scs_smpl_enable_rpcdata __req; + struct qcsapi_wifi_set_scs_smpl_enable_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.enable_val = (uint16_t)enable_val; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_SET_SCS_SMPL_ENABLE_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_set_scs_smpl_enable_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_set_scs_smpl_enable_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_set_scs_smpl_enable call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_set_scs_smpl_enable_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_set_scs_smpl_enable_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_set_scs_smpl_dwell_time(const char * ifname, uint16_t scs_sample_time) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_set_scs_smpl_dwell_time_rpcdata __req; + struct qcsapi_wifi_set_scs_smpl_dwell_time_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.scs_sample_time = (uint16_t)scs_sample_time; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_SET_SCS_SMPL_DWELL_TIME_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_set_scs_smpl_dwell_time_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_set_scs_smpl_dwell_time_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_set_scs_smpl_dwell_time call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_set_scs_smpl_dwell_time_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_set_scs_smpl_dwell_time_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_set_scs_sample_intv(const char * ifname, uint16_t scs_sample_intv) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_set_scs_sample_intv_rpcdata __req; + struct qcsapi_wifi_set_scs_sample_intv_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.scs_sample_intv = (uint16_t)scs_sample_intv; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_SET_SCS_SAMPLE_INTV_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_set_scs_sample_intv_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_set_scs_sample_intv_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_set_scs_sample_intv call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_set_scs_sample_intv_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_set_scs_sample_intv_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_set_scs_intf_detect_intv(const char * ifname, uint16_t scs_intf_detect_intv) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_set_scs_intf_detect_intv_rpcdata __req; + struct qcsapi_wifi_set_scs_intf_detect_intv_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.scs_intf_detect_intv = (uint16_t)scs_intf_detect_intv; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_SET_SCS_INTF_DETECT_INTV_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_set_scs_intf_detect_intv_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_set_scs_intf_detect_intv_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_set_scs_intf_detect_intv call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_set_scs_intf_detect_intv_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_set_scs_intf_detect_intv_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_set_scs_thrshld(const char * ifname, const char * scs_param_name, uint16_t scs_threshold) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_set_scs_thrshld_rpcdata __req; + struct qcsapi_wifi_set_scs_thrshld_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __rpc_string __rpcscs_param_name = {(char *)scs_param_name}; + __rpc_string *p__rpcscs_param_name = (scs_param_name) ? &__rpcscs_param_name : NULL; + __req.scs_param_name = p__rpcscs_param_name; + + __req.scs_threshold = (uint16_t)scs_threshold; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_SET_SCS_THRSHLD_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_set_scs_thrshld_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_set_scs_thrshld_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_set_scs_thrshld call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_set_scs_thrshld_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_set_scs_thrshld_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_set_scs_report_only(const char * ifname, uint16_t scs_report_only) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_set_scs_report_only_rpcdata __req; + struct qcsapi_wifi_set_scs_report_only_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.scs_report_only = (uint16_t)scs_report_only; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_SET_SCS_REPORT_ONLY_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_set_scs_report_only_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_set_scs_report_only_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_set_scs_report_only call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_set_scs_report_only_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_set_scs_report_only_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_get_scs_stat_report(const char * ifname, struct qcsapi_scs_ranking_rpt * scs_rpt) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_get_scs_stat_report_rpcdata __req; + struct qcsapi_wifi_get_scs_stat_report_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.scs_rpt = (__rpc_qcsapi_scs_ranking_rpt*)scs_rpt; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_GET_SCS_STAT_REPORT_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_get_scs_stat_report_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_get_scs_stat_report_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_get_scs_stat_report call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_scs_stat_report_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (__resp.scs_rpt && scs_rpt) + memcpy(scs_rpt, __resp.scs_rpt, sizeof(*scs_rpt)); + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_scs_stat_report_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_get_scs_score_report(const char * ifname, struct qcsapi_scs_score_rpt * scs_rpt) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_get_scs_score_report_rpcdata __req; + struct qcsapi_wifi_get_scs_score_report_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.scs_rpt = (__rpc_qcsapi_scs_score_rpt*)scs_rpt; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_GET_SCS_SCORE_REPORT_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_get_scs_score_report_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_get_scs_score_report_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_get_scs_score_report call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_scs_score_report_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (__resp.scs_rpt && scs_rpt) + memcpy(scs_rpt, __resp.scs_rpt, sizeof(*scs_rpt)); + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_scs_score_report_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_get_scs_currchan_report(const char * ifname, struct qcsapi_scs_currchan_rpt * scs_currchan_rpt) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_get_scs_currchan_report_rpcdata __req; + struct qcsapi_wifi_get_scs_currchan_report_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.scs_currchan_rpt = (__rpc_qcsapi_scs_currchan_rpt*)scs_currchan_rpt; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_GET_SCS_CURRCHAN_REPORT_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_get_scs_currchan_report_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_get_scs_currchan_report_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_get_scs_currchan_report call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_scs_currchan_report_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (__resp.scs_currchan_rpt && scs_currchan_rpt) + memcpy(scs_currchan_rpt, __resp.scs_currchan_rpt, sizeof(*scs_currchan_rpt)); + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_scs_currchan_report_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_set_scs_stats(const char * ifname, uint16_t start) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_set_scs_stats_rpcdata __req; + struct qcsapi_wifi_set_scs_stats_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.start = (uint16_t)start; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_SET_SCS_STATS_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_set_scs_stats_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_set_scs_stats_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_set_scs_stats call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_set_scs_stats_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_set_scs_stats_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_get_autochan_report(const char * ifname, struct qcsapi_autochan_rpt * autochan_rpt) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_get_autochan_report_rpcdata __req; + struct qcsapi_wifi_get_autochan_report_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.autochan_rpt = (__rpc_qcsapi_autochan_rpt*)autochan_rpt; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_GET_AUTOCHAN_REPORT_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_get_autochan_report_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_get_autochan_report_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_get_autochan_report call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_autochan_report_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (__resp.autochan_rpt && autochan_rpt) + memcpy(autochan_rpt, __resp.autochan_rpt, sizeof(*autochan_rpt)); + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_autochan_report_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_set_scs_cca_intf_smth_fctr(const char * ifname, uint8_t smth_fctr_noxp, uint8_t smth_fctr_xped) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_set_scs_cca_intf_smth_fctr_rpcdata __req; + struct qcsapi_wifi_set_scs_cca_intf_smth_fctr_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.smth_fctr_noxp = (uint8_t)smth_fctr_noxp; + + __req.smth_fctr_xped = (uint8_t)smth_fctr_xped; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_SET_SCS_CCA_INTF_SMTH_FCTR_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_set_scs_cca_intf_smth_fctr_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_set_scs_cca_intf_smth_fctr_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_set_scs_cca_intf_smth_fctr call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_set_scs_cca_intf_smth_fctr_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_set_scs_cca_intf_smth_fctr_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_set_scs_chan_mtrc_mrgn(const char * ifname, uint8_t chan_mtrc_mrgn) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_set_scs_chan_mtrc_mrgn_rpcdata __req; + struct qcsapi_wifi_set_scs_chan_mtrc_mrgn_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.chan_mtrc_mrgn = (uint8_t)chan_mtrc_mrgn; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_SET_SCS_CHAN_MTRC_MRGN_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_set_scs_chan_mtrc_mrgn_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_set_scs_chan_mtrc_mrgn_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_set_scs_chan_mtrc_mrgn call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_set_scs_chan_mtrc_mrgn_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_set_scs_chan_mtrc_mrgn_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_get_scs_cca_intf(const char * ifname, const qcsapi_unsigned_int the_channel, int * p_cca_intf) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_get_scs_cca_intf_rpcdata __req; + struct qcsapi_wifi_get_scs_cca_intf_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.the_channel = (unsigned int)the_channel; + + __req.p_cca_intf = (int *)p_cca_intf; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_GET_SCS_CCA_INTF_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_get_scs_cca_intf_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_get_scs_cca_intf_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_get_scs_cca_intf call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_scs_cca_intf_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (p_cca_intf) + *p_cca_intf = *__resp.p_cca_intf; + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_scs_cca_intf_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_get_scs_param_report(const char * ifname, struct qcsapi_scs_param_rpt * p_scs_param_rpt, uint32_t param_num) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_get_scs_param_report_rpcdata __req; + struct qcsapi_wifi_get_scs_param_report_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.p_scs_param_rpt = (__rpc_qcsapi_scs_param_rpt*)p_scs_param_rpt; + + __req.param_num = (uint32_t)param_num; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_GET_SCS_PARAM_REPORT_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_get_scs_param_report_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_get_scs_param_report_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_get_scs_param_report call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_scs_param_report_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (__resp.p_scs_param_rpt && p_scs_param_rpt) + memcpy(p_scs_param_rpt, __resp.p_scs_param_rpt, sizeof(*p_scs_param_rpt)); + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_scs_param_report_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_get_scs_dfs_reentry_request(const char * ifname, qcsapi_unsigned_int * p_scs_dfs_reentry_request) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_get_scs_dfs_reentry_request_rpcdata __req; + struct qcsapi_wifi_get_scs_dfs_reentry_request_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.p_scs_dfs_reentry_request = (unsigned int *)p_scs_dfs_reentry_request; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_GET_SCS_DFS_REENTRY_REQUEST_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_get_scs_dfs_reentry_request_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_get_scs_dfs_reentry_request_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_get_scs_dfs_reentry_request call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_scs_dfs_reentry_request_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (p_scs_dfs_reentry_request) + *p_scs_dfs_reentry_request = *__resp.p_scs_dfs_reentry_request; + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_scs_dfs_reentry_request_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_start_ocac(const char * ifname, uint16_t channel) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_start_ocac_rpcdata __req; + struct qcsapi_wifi_start_ocac_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.channel = (uint16_t)channel; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_START_OCAC_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_start_ocac_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_start_ocac_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_start_ocac call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_start_ocac_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_start_ocac_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_stop_ocac(const char * ifname) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_stop_ocac_rpcdata __req; + struct qcsapi_wifi_stop_ocac_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_STOP_OCAC_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_stop_ocac_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_stop_ocac_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_stop_ocac call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_stop_ocac_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_stop_ocac_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_get_ocac_status(const char * ifname, qcsapi_unsigned_int * status) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_get_ocac_status_rpcdata __req; + struct qcsapi_wifi_get_ocac_status_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.status = (unsigned int *)status; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_GET_OCAC_STATUS_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_get_ocac_status_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_get_ocac_status_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_get_ocac_status call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_ocac_status_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (status) + *status = *__resp.status; + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_ocac_status_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_set_ocac_dwell_time(const char * ifname, uint16_t dwell_time) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_set_ocac_dwell_time_rpcdata __req; + struct qcsapi_wifi_set_ocac_dwell_time_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.dwell_time = (uint16_t)dwell_time; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_SET_OCAC_DWELL_TIME_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_set_ocac_dwell_time_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_set_ocac_dwell_time_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_set_ocac_dwell_time call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_set_ocac_dwell_time_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_set_ocac_dwell_time_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_set_ocac_duration(const char * ifname, uint16_t duration) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_set_ocac_duration_rpcdata __req; + struct qcsapi_wifi_set_ocac_duration_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.duration = (uint16_t)duration; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_SET_OCAC_DURATION_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_set_ocac_duration_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_set_ocac_duration_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_set_ocac_duration call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_set_ocac_duration_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_set_ocac_duration_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_set_ocac_cac_time(const char * ifname, uint16_t cac_time) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_set_ocac_cac_time_rpcdata __req; + struct qcsapi_wifi_set_ocac_cac_time_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.cac_time = (uint16_t)cac_time; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_SET_OCAC_CAC_TIME_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_set_ocac_cac_time_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_set_ocac_cac_time_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_set_ocac_cac_time call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_set_ocac_cac_time_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_set_ocac_cac_time_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_set_ocac_report_only(const char * ifname, uint16_t enable) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_set_ocac_report_only_rpcdata __req; + struct qcsapi_wifi_set_ocac_report_only_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.enable = (uint16_t)enable; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_SET_OCAC_REPORT_ONLY_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_set_ocac_report_only_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_set_ocac_report_only_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_set_ocac_report_only call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_set_ocac_report_only_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_set_ocac_report_only_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_set_ocac_thrshld(const char * ifname, const char * param_name, uint16_t threshold) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_set_ocac_thrshld_rpcdata __req; + struct qcsapi_wifi_set_ocac_thrshld_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __rpc_string __rpcparam_name = {(char *)param_name}; + __rpc_string *p__rpcparam_name = (param_name) ? &__rpcparam_name : NULL; + __req.param_name = p__rpcparam_name; + + __req.threshold = (uint16_t)threshold; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_SET_OCAC_THRSHLD_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_set_ocac_thrshld_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_set_ocac_thrshld_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_set_ocac_thrshld call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_set_ocac_thrshld_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_set_ocac_thrshld_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_start_dfs_s_radio(const char * ifname, uint16_t channel) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_start_dfs_s_radio_rpcdata __req; + struct qcsapi_wifi_start_dfs_s_radio_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.channel = (uint16_t)channel; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_START_DFS_S_RADIO_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_start_dfs_s_radio_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_start_dfs_s_radio_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_start_dfs_s_radio call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_start_dfs_s_radio_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_start_dfs_s_radio_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_stop_dfs_s_radio(const char * ifname) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_stop_dfs_s_radio_rpcdata __req; + struct qcsapi_wifi_stop_dfs_s_radio_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_STOP_DFS_S_RADIO_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_stop_dfs_s_radio_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_stop_dfs_s_radio_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_stop_dfs_s_radio call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_stop_dfs_s_radio_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_stop_dfs_s_radio_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_get_dfs_s_radio_status(const char * ifname, qcsapi_unsigned_int * status) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_get_dfs_s_radio_status_rpcdata __req; + struct qcsapi_wifi_get_dfs_s_radio_status_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.status = (unsigned int *)status; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_GET_DFS_S_RADIO_STATUS_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_get_dfs_s_radio_status_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_get_dfs_s_radio_status_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_get_dfs_s_radio_status call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_dfs_s_radio_status_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (status) + *status = *__resp.status; + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_dfs_s_radio_status_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_get_dfs_s_radio_availability(const char * ifname, qcsapi_unsigned_int * available) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_get_dfs_s_radio_availability_rpcdata __req; + struct qcsapi_wifi_get_dfs_s_radio_availability_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.available = (unsigned int *)available; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_GET_DFS_S_RADIO_AVAILABILITY_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_get_dfs_s_radio_availability_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_get_dfs_s_radio_availability_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_get_dfs_s_radio_availability call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_dfs_s_radio_availability_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (available) + *available = *__resp.available; + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_dfs_s_radio_availability_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_set_dfs_s_radio_dwell_time(const char * ifname, uint16_t dwell_time) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_set_dfs_s_radio_dwell_time_rpcdata __req; + struct qcsapi_wifi_set_dfs_s_radio_dwell_time_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.dwell_time = (uint16_t)dwell_time; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_SET_DFS_S_RADIO_DWELL_TIME_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_set_dfs_s_radio_dwell_time_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_set_dfs_s_radio_dwell_time_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_set_dfs_s_radio_dwell_time call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_set_dfs_s_radio_dwell_time_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_set_dfs_s_radio_dwell_time_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_set_dfs_s_radio_duration(const char * ifname, uint16_t duration) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_set_dfs_s_radio_duration_rpcdata __req; + struct qcsapi_wifi_set_dfs_s_radio_duration_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.duration = (uint16_t)duration; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_SET_DFS_S_RADIO_DURATION_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_set_dfs_s_radio_duration_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_set_dfs_s_radio_duration_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_set_dfs_s_radio_duration call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_set_dfs_s_radio_duration_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_set_dfs_s_radio_duration_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_set_dfs_s_radio_wea_duration(const char * ifname, uint32_t duration) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_set_dfs_s_radio_wea_duration_rpcdata __req; + struct qcsapi_wifi_set_dfs_s_radio_wea_duration_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.duration = (uint32_t)duration; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_SET_DFS_S_RADIO_WEA_DURATION_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_set_dfs_s_radio_wea_duration_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_set_dfs_s_radio_wea_duration_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_set_dfs_s_radio_wea_duration call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_set_dfs_s_radio_wea_duration_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_set_dfs_s_radio_wea_duration_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_set_dfs_s_radio_cac_time(const char * ifname, uint16_t cac_time) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_set_dfs_s_radio_cac_time_rpcdata __req; + struct qcsapi_wifi_set_dfs_s_radio_cac_time_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.cac_time = (uint16_t)cac_time; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_SET_DFS_S_RADIO_CAC_TIME_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_set_dfs_s_radio_cac_time_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_set_dfs_s_radio_cac_time_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_set_dfs_s_radio_cac_time call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_set_dfs_s_radio_cac_time_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_set_dfs_s_radio_cac_time_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_set_dfs_s_radio_wea_cac_time(const char * ifname, uint32_t cac_time) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_set_dfs_s_radio_wea_cac_time_rpcdata __req; + struct qcsapi_wifi_set_dfs_s_radio_wea_cac_time_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.cac_time = (uint32_t)cac_time; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_SET_DFS_S_RADIO_WEA_CAC_TIME_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_set_dfs_s_radio_wea_cac_time_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_set_dfs_s_radio_wea_cac_time_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_set_dfs_s_radio_wea_cac_time call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_set_dfs_s_radio_wea_cac_time_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_set_dfs_s_radio_wea_cac_time_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_set_dfs_s_radio_report_only(const char * ifname, uint16_t enable) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_set_dfs_s_radio_report_only_rpcdata __req; + struct qcsapi_wifi_set_dfs_s_radio_report_only_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.enable = (uint16_t)enable; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_SET_DFS_S_RADIO_REPORT_ONLY_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_set_dfs_s_radio_report_only_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_set_dfs_s_radio_report_only_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_set_dfs_s_radio_report_only call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_set_dfs_s_radio_report_only_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_set_dfs_s_radio_report_only_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_set_dfs_s_radio_thrshld(const char * ifname, const char * param_name, uint16_t threshold) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_set_dfs_s_radio_thrshld_rpcdata __req; + struct qcsapi_wifi_set_dfs_s_radio_thrshld_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __rpc_string __rpcparam_name = {(char *)param_name}; + __rpc_string *p__rpcparam_name = (param_name) ? &__rpcparam_name : NULL; + __req.param_name = p__rpcparam_name; + + __req.threshold = (uint16_t)threshold; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_SET_DFS_S_RADIO_THRSHLD_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_set_dfs_s_radio_thrshld_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_set_dfs_s_radio_thrshld_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_set_dfs_s_radio_thrshld call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_set_dfs_s_radio_thrshld_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_set_dfs_s_radio_thrshld_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_init() +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_init_rpcdata __req; + struct qcsapi_init_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_INIT_REMOTE, + (xdrproc_t)xdr_qcsapi_init_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_init_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_init call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_init_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_init_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_console_disconnect() +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_console_disconnect_rpcdata __req; + struct qcsapi_console_disconnect_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_CONSOLE_DISCONNECT_REMOTE, + (xdrproc_t)xdr_qcsapi_console_disconnect_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_console_disconnect_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_console_disconnect call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_console_disconnect_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_console_disconnect_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_startprod() +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_startprod_rpcdata __req; + struct qcsapi_wifi_startprod_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_STARTPROD_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_startprod_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_startprod_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_startprod call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_startprod_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_startprod_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_is_startprod_done(int * p_status) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_is_startprod_done_rpcdata __req; + struct qcsapi_is_startprod_done_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __req.p_status = (int *)p_status; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_IS_STARTPROD_DONE_REMOTE, + (xdrproc_t)xdr_qcsapi_is_startprod_done_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_is_startprod_done_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_is_startprod_done call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_is_startprod_done_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (p_status) + *p_status = *__resp.p_status; + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_is_startprod_done_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_system_get_time_since_start(qcsapi_unsigned_int * p_elapsed_time) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_system_get_time_since_start_rpcdata __req; + struct qcsapi_system_get_time_since_start_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __req.p_elapsed_time = (unsigned int *)p_elapsed_time; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_SYSTEM_GET_TIME_SINCE_START_REMOTE, + (xdrproc_t)xdr_qcsapi_system_get_time_since_start_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_system_get_time_since_start_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_system_get_time_since_start call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_system_get_time_since_start_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (p_elapsed_time) + *p_elapsed_time = *__resp.p_elapsed_time; + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_system_get_time_since_start_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_get_system_status(qcsapi_unsigned_int * p_status) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_get_system_status_rpcdata __req; + struct qcsapi_get_system_status_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __req.p_status = (unsigned int *)p_status; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_GET_SYSTEM_STATUS_REMOTE, + (xdrproc_t)xdr_qcsapi_get_system_status_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_get_system_status_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_get_system_status call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_get_system_status_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (p_status) + *p_status = *__resp.p_status; + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_get_system_status_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_get_random_seed(struct qcsapi_data_512bytes * random_buf) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_get_random_seed_rpcdata __req; + struct qcsapi_get_random_seed_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __req.random_buf = (__rpc_qcsapi_data_512bytes*)random_buf; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_GET_RANDOM_SEED_REMOTE, + (xdrproc_t)xdr_qcsapi_get_random_seed_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_get_random_seed_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_get_random_seed call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_get_random_seed_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (__resp.random_buf && random_buf) + memcpy(random_buf, __resp.random_buf, sizeof(*random_buf)); + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_get_random_seed_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_set_random_seed(const struct qcsapi_data_512bytes * random_buf, const qcsapi_unsigned_int entropy) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_set_random_seed_rpcdata __req; + struct qcsapi_set_random_seed_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __req.random_buf = (__rpc_qcsapi_data_512bytes*)random_buf; + + __req.entropy = (unsigned int)entropy; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_SET_RANDOM_SEED_REMOTE, + (xdrproc_t)xdr_qcsapi_set_random_seed_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_set_random_seed_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_set_random_seed call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_set_random_seed_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_set_random_seed_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_get_carrier_id(qcsapi_unsigned_int * p_carrier_id) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_get_carrier_id_rpcdata __req; + struct qcsapi_get_carrier_id_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __req.p_carrier_id = (unsigned int *)p_carrier_id; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_GET_CARRIER_ID_REMOTE, + (xdrproc_t)xdr_qcsapi_get_carrier_id_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_get_carrier_id_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_get_carrier_id call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_get_carrier_id_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (p_carrier_id) + *p_carrier_id = *__resp.p_carrier_id; + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_get_carrier_id_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_set_carrier_id(uint32_t carrier_id, uint32_t update_uboot) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_set_carrier_id_rpcdata __req; + struct qcsapi_set_carrier_id_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __req.carrier_id = (uint32_t)carrier_id; + + __req.update_uboot = (uint32_t)update_uboot; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_SET_CARRIER_ID_REMOTE, + (xdrproc_t)xdr_qcsapi_set_carrier_id_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_set_carrier_id_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_set_carrier_id call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_set_carrier_id_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_set_carrier_id_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_get_spinor_jedecid(const char * ifname, unsigned int * p_jedecid) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_get_spinor_jedecid_rpcdata __req; + struct qcsapi_wifi_get_spinor_jedecid_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.p_jedecid = (unsigned int *)p_jedecid; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_GET_SPINOR_JEDECID_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_get_spinor_jedecid_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_get_spinor_jedecid_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_get_spinor_jedecid call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_spinor_jedecid_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (p_jedecid) + *p_jedecid = *__resp.p_jedecid; + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_spinor_jedecid_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_get_bb_param(const char * ifname, unsigned int * p_jedecid) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_get_bb_param_rpcdata __req; + struct qcsapi_wifi_get_bb_param_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.p_jedecid = (unsigned int *)p_jedecid; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_GET_BB_PARAM_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_get_bb_param_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_get_bb_param_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_get_bb_param call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_bb_param_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (p_jedecid) + *p_jedecid = *__resp.p_jedecid; + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_bb_param_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_set_bb_param(const char * ifname, const qcsapi_unsigned_int p_jedecid) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_set_bb_param_rpcdata __req; + struct qcsapi_wifi_set_bb_param_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.p_jedecid = (unsigned int)p_jedecid; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_SET_BB_PARAM_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_set_bb_param_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_set_bb_param_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_set_bb_param call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_set_bb_param_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_set_bb_param_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_set_optim_stats(const char * ifname, const qcsapi_unsigned_int p_jedecid) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_set_optim_stats_rpcdata __req; + struct qcsapi_wifi_set_optim_stats_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.p_jedecid = (unsigned int)p_jedecid; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_SET_OPTIM_STATS_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_set_optim_stats_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_set_optim_stats_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_set_optim_stats call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_set_optim_stats_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_set_optim_stats_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_set_sys_time(const uint32_t timestamp) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_set_sys_time_rpcdata __req; + struct qcsapi_wifi_set_sys_time_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __req.timestamp = (uint32_t)timestamp; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_SET_SYS_TIME_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_set_sys_time_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_set_sys_time_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_set_sys_time call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_set_sys_time_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_set_sys_time_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_get_sys_time(uint32_t * timestamp) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_get_sys_time_rpcdata __req; + struct qcsapi_wifi_get_sys_time_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __req.timestamp = (uint32_t *)timestamp; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_GET_SYS_TIME_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_get_sys_time_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_get_sys_time_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_get_sys_time call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_sys_time_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (timestamp) + *timestamp = *__resp.timestamp; + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_sys_time_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_set_soc_mac_addr(const char * ifname, const qcsapi_mac_addr soc_mac_addr) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_set_soc_mac_addr_rpcdata __req; + struct qcsapi_set_soc_mac_addr_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + struct __rpc_qcsapi_mac_addr __rpcsoc_mac_addr; + if (soc_mac_addr) { + memcpy(__rpcsoc_mac_addr.data, soc_mac_addr, sizeof(__rpcsoc_mac_addr)); + __req.soc_mac_addr = &__rpcsoc_mac_addr; + } else { + __req.soc_mac_addr = NULL; + } + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_SET_SOC_MAC_ADDR_REMOTE, + (xdrproc_t)xdr_qcsapi_set_soc_mac_addr_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_set_soc_mac_addr_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_set_soc_mac_addr call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_set_soc_mac_addr_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_set_soc_mac_addr_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_get_custom_value(const char * custom_key, string_128 custom_value) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_get_custom_value_rpcdata __req; + struct qcsapi_get_custom_value_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpccustom_key = {(char *)custom_key}; + __rpc_string *p__rpccustom_key = (custom_key) ? &__rpccustom_key : NULL; + __req.custom_key = p__rpccustom_key; + + __rpc_string __rpccustom_value = {(char *)custom_value}; + __rpc_string *p__rpccustom_value = (custom_value) ? &__rpccustom_value : NULL; + __req.custom_value = p__rpccustom_value; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_GET_CUSTOM_VALUE_REMOTE, + (xdrproc_t)xdr_qcsapi_get_custom_value_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_get_custom_value_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_get_custom_value call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_get_custom_value_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (custom_value && __resp.custom_value) + strcpy(custom_value, __resp.custom_value->data); + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_get_custom_value_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_config_get_parameter(const char * ifname, const char * param_name, char * param_value, const size_t max_param_len) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_config_get_parameter_rpcdata __req; + struct qcsapi_config_get_parameter_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __rpc_string __rpcparam_name = {(char *)param_name}; + __rpc_string *p__rpcparam_name = (param_name) ? &__rpcparam_name : NULL; + __req.param_name = p__rpcparam_name; + + __rpc_string __rpcparam_value = {(char *)param_value}; + __rpc_string *p__rpcparam_value = (param_value) ? &__rpcparam_value : NULL; + __req.param_value = p__rpcparam_value; + + __req.max_param_len = (uint32_t)max_param_len; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_CONFIG_GET_PARAMETER_REMOTE, + (xdrproc_t)xdr_qcsapi_config_get_parameter_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_config_get_parameter_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_config_get_parameter call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_config_get_parameter_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (param_value && __resp.param_value) + strcpy(param_value, __resp.param_value->data); + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_config_get_parameter_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_config_update_parameter(const char * ifname, const char * param_name, const char * param_value) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_config_update_parameter_rpcdata __req; + struct qcsapi_config_update_parameter_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __rpc_string __rpcparam_name = {(char *)param_name}; + __rpc_string *p__rpcparam_name = (param_name) ? &__rpcparam_name : NULL; + __req.param_name = p__rpcparam_name; + + __rpc_string __rpcparam_value = {(char *)param_value}; + __rpc_string *p__rpcparam_value = (param_value) ? &__rpcparam_value : NULL; + __req.param_value = p__rpcparam_value; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_CONFIG_UPDATE_PARAMETER_REMOTE, + (xdrproc_t)xdr_qcsapi_config_update_parameter_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_config_update_parameter_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_config_update_parameter call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_config_update_parameter_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_config_update_parameter_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_config_get_ssid_parameter(const char * ifname, const char * param_name, char * param_value, const size_t max_param_len) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_config_get_ssid_parameter_rpcdata __req; + struct qcsapi_config_get_ssid_parameter_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __rpc_string __rpcparam_name = {(char *)param_name}; + __rpc_string *p__rpcparam_name = (param_name) ? &__rpcparam_name : NULL; + __req.param_name = p__rpcparam_name; + + __rpc_string __rpcparam_value = {(char *)param_value}; + __rpc_string *p__rpcparam_value = (param_value) ? &__rpcparam_value : NULL; + __req.param_value = p__rpcparam_value; + + __req.max_param_len = (uint32_t)max_param_len; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_CONFIG_GET_SSID_PARAMETER_REMOTE, + (xdrproc_t)xdr_qcsapi_config_get_ssid_parameter_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_config_get_ssid_parameter_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_config_get_ssid_parameter call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_config_get_ssid_parameter_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (param_value && __resp.param_value) + strcpy(param_value, __resp.param_value->data); + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_config_get_ssid_parameter_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_config_update_ssid_parameter(const char * ifname, const char * param_name, const char * param_value) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_config_update_ssid_parameter_rpcdata __req; + struct qcsapi_config_update_ssid_parameter_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __rpc_string __rpcparam_name = {(char *)param_name}; + __rpc_string *p__rpcparam_name = (param_name) ? &__rpcparam_name : NULL; + __req.param_name = p__rpcparam_name; + + __rpc_string __rpcparam_value = {(char *)param_value}; + __rpc_string *p__rpcparam_value = (param_value) ? &__rpcparam_value : NULL; + __req.param_value = p__rpcparam_value; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_CONFIG_UPDATE_SSID_PARAMETER_REMOTE, + (xdrproc_t)xdr_qcsapi_config_update_ssid_parameter_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_config_update_ssid_parameter_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_config_update_ssid_parameter call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_config_update_ssid_parameter_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_config_update_ssid_parameter_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_file_path_get_config(const qcsapi_file_path_config e_file_path, char * file_path, qcsapi_unsigned_int path_size) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_file_path_get_config_rpcdata __req; + struct qcsapi_file_path_get_config_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __req.e_file_path = (int)e_file_path; + + __rpc_string __rpcfile_path = {(char *)file_path}; + __rpc_string *p__rpcfile_path = (file_path) ? &__rpcfile_path : NULL; + __req.file_path = p__rpcfile_path; + + __req.path_size = (unsigned int)path_size; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_FILE_PATH_GET_CONFIG_REMOTE, + (xdrproc_t)xdr_qcsapi_file_path_get_config_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_file_path_get_config_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_file_path_get_config call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_file_path_get_config_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (file_path && __resp.file_path) + strcpy(file_path, __resp.file_path->data); + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_file_path_get_config_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_file_path_set_config(const qcsapi_file_path_config e_file_path, const char * new_path) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_file_path_set_config_rpcdata __req; + struct qcsapi_file_path_set_config_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __req.e_file_path = (int)e_file_path; + + __rpc_string __rpcnew_path = {(char *)new_path}; + __rpc_string *p__rpcnew_path = (new_path) ? &__rpcnew_path : NULL; + __req.new_path = p__rpcnew_path; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_FILE_PATH_SET_CONFIG_REMOTE, + (xdrproc_t)xdr_qcsapi_file_path_set_config_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_file_path_set_config_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_file_path_set_config call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_file_path_set_config_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_file_path_set_config_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_restore_default_config(int flag) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_restore_default_config_rpcdata __req; + struct qcsapi_restore_default_config_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __req.flag = (int)flag; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_RESTORE_DEFAULT_CONFIG_REMOTE, + (xdrproc_t)xdr_qcsapi_restore_default_config_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_restore_default_config_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_restore_default_config call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_restore_default_config_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_restore_default_config_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_store_ipaddr(qcsapi_unsigned_int ipaddr, qcsapi_unsigned_int netmask) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_store_ipaddr_rpcdata __req; + struct qcsapi_store_ipaddr_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __req.ipaddr = (unsigned int)ipaddr; + + __req.netmask = (unsigned int)netmask; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_STORE_IPADDR_REMOTE, + (xdrproc_t)xdr_qcsapi_store_ipaddr_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_store_ipaddr_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_store_ipaddr call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_store_ipaddr_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_store_ipaddr_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_interface_enable(const char * ifname, const int enable_flag) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_interface_enable_rpcdata __req; + struct qcsapi_interface_enable_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.enable_flag = (int)enable_flag; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_INTERFACE_ENABLE_REMOTE, + (xdrproc_t)xdr_qcsapi_interface_enable_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_interface_enable_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_interface_enable call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_interface_enable_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_interface_enable_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_interface_get_status(const char * ifname, char * interface_status) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_interface_get_status_rpcdata __req; + struct qcsapi_interface_get_status_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __rpc_string __rpcinterface_status = {(char *)interface_status}; + __rpc_string *p__rpcinterface_status = (interface_status) ? &__rpcinterface_status : NULL; + __req.interface_status = p__rpcinterface_status; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_INTERFACE_GET_STATUS_REMOTE, + (xdrproc_t)xdr_qcsapi_interface_get_status_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_interface_get_status_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_interface_get_status call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_interface_get_status_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (interface_status && __resp.interface_status) + strcpy(interface_status, __resp.interface_status->data); + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_interface_get_status_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_interface_set_ip4(const char * ifname, const char * if_param, uint32_t if_param_val) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_interface_set_ip4_rpcdata __req; + struct qcsapi_interface_set_ip4_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __rpc_string __rpcif_param = {(char *)if_param}; + __rpc_string *p__rpcif_param = (if_param) ? &__rpcif_param : NULL; + __req.if_param = p__rpcif_param; + + __req.if_param_val = (uint32_t)if_param_val; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_INTERFACE_SET_IP4_REMOTE, + (xdrproc_t)xdr_qcsapi_interface_set_ip4_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_interface_set_ip4_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_interface_set_ip4 call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_interface_set_ip4_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_interface_set_ip4_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_interface_get_ip4(const char * ifname, const char * if_param, string_64 if_param_val) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_interface_get_ip4_rpcdata __req; + struct qcsapi_interface_get_ip4_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __rpc_string __rpcif_param = {(char *)if_param}; + __rpc_string *p__rpcif_param = (if_param) ? &__rpcif_param : NULL; + __req.if_param = p__rpcif_param; + + __rpc_string __rpcif_param_val = {(char *)if_param_val}; + __rpc_string *p__rpcif_param_val = (if_param_val) ? &__rpcif_param_val : NULL; + __req.if_param_val = p__rpcif_param_val; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_INTERFACE_GET_IP4_REMOTE, + (xdrproc_t)xdr_qcsapi_interface_get_ip4_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_interface_get_ip4_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_interface_get_ip4 call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_interface_get_ip4_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (if_param_val && __resp.if_param_val) + strcpy(if_param_val, __resp.if_param_val->data); + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_interface_get_ip4_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_interface_get_counter(const char * ifname, qcsapi_counter_type qcsapi_counter, qcsapi_unsigned_int * p_counter_value) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_interface_get_counter_rpcdata __req; + struct qcsapi_interface_get_counter_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.qcsapi_counter = (int)qcsapi_counter; + + __req.p_counter_value = (unsigned int *)p_counter_value; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_INTERFACE_GET_COUNTER_REMOTE, + (xdrproc_t)xdr_qcsapi_interface_get_counter_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_interface_get_counter_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_interface_get_counter call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_interface_get_counter_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (p_counter_value) + *p_counter_value = *__resp.p_counter_value; + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_interface_get_counter_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_interface_get_counter64(const char * ifname, qcsapi_counter_type qcsapi_counter, uint64_t * p_counter_value) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_interface_get_counter64_rpcdata __req; + struct qcsapi_interface_get_counter64_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.qcsapi_counter = (int)qcsapi_counter; + + __req.p_counter_value = (uint64_t *)p_counter_value; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_INTERFACE_GET_COUNTER64_REMOTE, + (xdrproc_t)xdr_qcsapi_interface_get_counter64_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_interface_get_counter64_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_interface_get_counter64 call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_interface_get_counter64_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (p_counter_value) + *p_counter_value = *__resp.p_counter_value; + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_interface_get_counter64_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_interface_get_mac_addr(const char * ifname, qcsapi_mac_addr current_mac_addr) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_interface_get_mac_addr_rpcdata __req; + struct qcsapi_interface_get_mac_addr_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + struct __rpc_qcsapi_mac_addr __rpccurrent_mac_addr; + if (current_mac_addr) { + memcpy(__rpccurrent_mac_addr.data, current_mac_addr, sizeof(__rpccurrent_mac_addr)); + __req.current_mac_addr = &__rpccurrent_mac_addr; + } else { + __req.current_mac_addr = NULL; + } + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_INTERFACE_GET_MAC_ADDR_REMOTE, + (xdrproc_t)xdr_qcsapi_interface_get_mac_addr_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_interface_get_mac_addr_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_interface_get_mac_addr call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_interface_get_mac_addr_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (current_mac_addr && __resp.current_mac_addr) + memcpy(current_mac_addr, __resp.current_mac_addr->data, + sizeof(qcsapi_mac_addr)); + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_interface_get_mac_addr_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_interface_set_mac_addr(const char * ifname, const qcsapi_mac_addr interface_mac_addr) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_interface_set_mac_addr_rpcdata __req; + struct qcsapi_interface_set_mac_addr_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + struct __rpc_qcsapi_mac_addr __rpcinterface_mac_addr; + if (interface_mac_addr) { + memcpy(__rpcinterface_mac_addr.data, interface_mac_addr, sizeof(__rpcinterface_mac_addr)); + __req.interface_mac_addr = &__rpcinterface_mac_addr; + } else { + __req.interface_mac_addr = NULL; + } + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_INTERFACE_SET_MAC_ADDR_REMOTE, + (xdrproc_t)xdr_qcsapi_interface_set_mac_addr_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_interface_set_mac_addr_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_interface_set_mac_addr call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_interface_set_mac_addr_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_interface_set_mac_addr_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_pm_get_counter(const char * ifname, qcsapi_counter_type qcsapi_counter, const char * pm_interval, qcsapi_unsigned_int * p_counter_value) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_pm_get_counter_rpcdata __req; + struct qcsapi_pm_get_counter_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.qcsapi_counter = (int)qcsapi_counter; + + __rpc_string __rpcpm_interval = {(char *)pm_interval}; + __rpc_string *p__rpcpm_interval = (pm_interval) ? &__rpcpm_interval : NULL; + __req.pm_interval = p__rpcpm_interval; + + __req.p_counter_value = (unsigned int *)p_counter_value; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_PM_GET_COUNTER_REMOTE, + (xdrproc_t)xdr_qcsapi_pm_get_counter_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_pm_get_counter_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_pm_get_counter call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_pm_get_counter_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (p_counter_value) + *p_counter_value = *__resp.p_counter_value; + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_pm_get_counter_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_set_aspm_l1(int enable, int latency) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_set_aspm_l1_rpcdata __req; + struct qcsapi_set_aspm_l1_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __req.enable = (int)enable; + + __req.latency = (int)latency; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_SET_ASPM_L1_REMOTE, + (xdrproc_t)xdr_qcsapi_set_aspm_l1_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_set_aspm_l1_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_set_aspm_l1 call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_set_aspm_l1_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_set_aspm_l1_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_set_l1(int enter) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_set_l1_rpcdata __req; + struct qcsapi_set_l1_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __req.enter = (int)enter; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_SET_L1_REMOTE, + (xdrproc_t)xdr_qcsapi_set_l1_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_set_l1_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_set_l1 call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_set_l1_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_set_l1_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_pm_get_elapsed_time(const char * pm_interval, qcsapi_unsigned_int * p_elapsed_time) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_pm_get_elapsed_time_rpcdata __req; + struct qcsapi_pm_get_elapsed_time_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcpm_interval = {(char *)pm_interval}; + __rpc_string *p__rpcpm_interval = (pm_interval) ? &__rpcpm_interval : NULL; + __req.pm_interval = p__rpcpm_interval; + + __req.p_elapsed_time = (unsigned int *)p_elapsed_time; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_PM_GET_ELAPSED_TIME_REMOTE, + (xdrproc_t)xdr_qcsapi_pm_get_elapsed_time_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_pm_get_elapsed_time_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_pm_get_elapsed_time call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_pm_get_elapsed_time_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (p_elapsed_time) + *p_elapsed_time = *__resp.p_elapsed_time; + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_pm_get_elapsed_time_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_eth_phy_power_control(int on_off, const char * interface) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_eth_phy_power_control_rpcdata __req; + struct qcsapi_eth_phy_power_control_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __req.on_off = (int)on_off; + + __rpc_string __rpcinterface = {(char *)interface}; + __rpc_string *p__rpcinterface = (interface) ? &__rpcinterface : NULL; + __req.interface = p__rpcinterface; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_ETH_PHY_POWER_CONTROL_REMOTE, + (xdrproc_t)xdr_qcsapi_eth_phy_power_control_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_eth_phy_power_control_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_eth_phy_power_control call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_eth_phy_power_control_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_eth_phy_power_control_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_get_emac_switch(char * buf) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_get_emac_switch_rpcdata __req; + struct qcsapi_get_emac_switch_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcbuf = {(char *)buf}; + __rpc_string *p__rpcbuf = (buf) ? &__rpcbuf : NULL; + __req.buf = p__rpcbuf; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_GET_EMAC_SWITCH_REMOTE, + (xdrproc_t)xdr_qcsapi_get_emac_switch_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_get_emac_switch_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_get_emac_switch call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_get_emac_switch_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (buf && __resp.buf) + strcpy(buf, __resp.buf->data); + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_get_emac_switch_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_set_emac_switch(qcsapi_emac_switch value) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_set_emac_switch_rpcdata __req; + struct qcsapi_set_emac_switch_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __req.value = (int)value; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_SET_EMAC_SWITCH_REMOTE, + (xdrproc_t)xdr_qcsapi_set_emac_switch_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_set_emac_switch_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_set_emac_switch call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_set_emac_switch_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_set_emac_switch_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_eth_dscp_map(qcsapi_eth_dscp_oper oper, const char * eth_type, const char * level, const char * value, char * buf, const unsigned int size) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_eth_dscp_map_rpcdata __req; + struct qcsapi_eth_dscp_map_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __req.oper = (int)oper; + + __rpc_string __rpceth_type = {(char *)eth_type}; + __rpc_string *p__rpceth_type = (eth_type) ? &__rpceth_type : NULL; + __req.eth_type = p__rpceth_type; + + __rpc_string __rpclevel = {(char *)level}; + __rpc_string *p__rpclevel = (level) ? &__rpclevel : NULL; + __req.level = p__rpclevel; + + __rpc_string __rpcvalue = {(char *)value}; + __rpc_string *p__rpcvalue = (value) ? &__rpcvalue : NULL; + __req.value = p__rpcvalue; + + __rpc_string __rpcbuf = {(char *)buf}; + __rpc_string *p__rpcbuf = (buf) ? &__rpcbuf : NULL; + __req.buf = p__rpcbuf; + + __req.size = (unsigned int)size; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_ETH_DSCP_MAP_REMOTE, + (xdrproc_t)xdr_qcsapi_eth_dscp_map_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_eth_dscp_map_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_eth_dscp_map call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_eth_dscp_map_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (buf && __resp.buf) + strcpy(buf, __resp.buf->data); + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_eth_dscp_map_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_get_eth_info(const char * ifname, const qcsapi_eth_info_type eth_info_type) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_get_eth_info_rpcdata __req; + struct qcsapi_get_eth_info_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.eth_info_type = (int)eth_info_type; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_GET_ETH_INFO_REMOTE, + (xdrproc_t)xdr_qcsapi_get_eth_info_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_get_eth_info_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_get_eth_info call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_get_eth_info_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_get_eth_info_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_get_mode(const char * ifname, qcsapi_wifi_mode * p_wifi_mode) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_get_mode_rpcdata __req; + struct qcsapi_wifi_get_mode_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.p_wifi_mode = (int *)p_wifi_mode; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_GET_MODE_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_get_mode_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_get_mode_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_get_mode call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_mode_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (p_wifi_mode) + *p_wifi_mode = *__resp.p_wifi_mode; + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_mode_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_set_mode(const char * ifname, const qcsapi_wifi_mode new_wifi_mode) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_set_mode_rpcdata __req; + struct qcsapi_wifi_set_mode_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.new_wifi_mode = (int)new_wifi_mode; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_SET_MODE_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_set_mode_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_set_mode_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_set_mode call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_set_mode_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_set_mode_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_get_phy_mode(const char * ifname, char * p_wifi_phy_mode) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_get_phy_mode_rpcdata __req; + struct qcsapi_wifi_get_phy_mode_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __rpc_string __rpcp_wifi_phy_mode = {(char *)p_wifi_phy_mode}; + __rpc_string *p__rpcp_wifi_phy_mode = (p_wifi_phy_mode) ? &__rpcp_wifi_phy_mode : NULL; + __req.p_wifi_phy_mode = p__rpcp_wifi_phy_mode; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_GET_PHY_MODE_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_get_phy_mode_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_get_phy_mode_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_get_phy_mode call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_phy_mode_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (p_wifi_phy_mode && __resp.p_wifi_phy_mode) + strcpy(p_wifi_phy_mode, __resp.p_wifi_phy_mode->data); + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_phy_mode_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_set_phy_mode(const char * ifname, const char * new_phy_mode) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_set_phy_mode_rpcdata __req; + struct qcsapi_wifi_set_phy_mode_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __rpc_string __rpcnew_phy_mode = {(char *)new_phy_mode}; + __rpc_string *p__rpcnew_phy_mode = (new_phy_mode) ? &__rpcnew_phy_mode : NULL; + __req.new_phy_mode = p__rpcnew_phy_mode; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_SET_PHY_MODE_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_set_phy_mode_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_set_phy_mode_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_set_phy_mode call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_set_phy_mode_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_set_phy_mode_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_reload_in_mode(const char * ifname, const qcsapi_wifi_mode new_wifi_mode) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_reload_in_mode_rpcdata __req; + struct qcsapi_wifi_reload_in_mode_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.new_wifi_mode = (int)new_wifi_mode; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_RELOAD_IN_MODE_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_reload_in_mode_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_reload_in_mode_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_reload_in_mode call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_reload_in_mode_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_reload_in_mode_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_rfenable(const qcsapi_unsigned_int onoff) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_rfenable_rpcdata __req; + struct qcsapi_wifi_rfenable_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __req.onoff = (unsigned int)onoff; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_RFENABLE_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_rfenable_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_rfenable_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_rfenable call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_rfenable_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_rfenable_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_rfstatus(qcsapi_unsigned_int * rfstatus) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_rfstatus_rpcdata __req; + struct qcsapi_wifi_rfstatus_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __req.rfstatus = (unsigned int *)rfstatus; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_RFSTATUS_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_rfstatus_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_rfstatus_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_rfstatus call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_rfstatus_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (rfstatus) + *rfstatus = *__resp.rfstatus; + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_rfstatus_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_get_bw(const char * ifname, qcsapi_unsigned_int * p_bw) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_get_bw_rpcdata __req; + struct qcsapi_wifi_get_bw_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.p_bw = (unsigned int *)p_bw; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_GET_BW_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_get_bw_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_get_bw_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_get_bw call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_bw_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (p_bw) + *p_bw = *__resp.p_bw; + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_bw_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_set_bw(const char * ifname, const qcsapi_unsigned_int bw) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_set_bw_rpcdata __req; + struct qcsapi_wifi_set_bw_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.bw = (unsigned int)bw; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_SET_BW_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_set_bw_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_set_bw_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_set_bw call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_set_bw_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_set_bw_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_set_vht(const char * ifname, const qcsapi_unsigned_int the_vht) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_set_vht_rpcdata __req; + struct qcsapi_wifi_set_vht_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.the_vht = (unsigned int)the_vht; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_SET_VHT_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_set_vht_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_set_vht_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_set_vht call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_set_vht_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_set_vht_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_get_vht(const char * ifname, qcsapi_unsigned_int * vht) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_get_vht_rpcdata __req; + struct qcsapi_wifi_get_vht_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.vht = (unsigned int *)vht; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_GET_VHT_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_get_vht_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_get_vht_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_get_vht call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_vht_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (vht) + *vht = *__resp.vht; + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_vht_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_get_channel(const char * ifname, qcsapi_unsigned_int * p_current_channel) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_get_channel_rpcdata __req; + struct qcsapi_wifi_get_channel_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.p_current_channel = (unsigned int *)p_current_channel; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_GET_CHANNEL_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_get_channel_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_get_channel_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_get_channel call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_channel_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (p_current_channel) + *p_current_channel = *__resp.p_current_channel; + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_channel_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_set_channel(const char * ifname, const qcsapi_unsigned_int new_channel) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_set_channel_rpcdata __req; + struct qcsapi_wifi_set_channel_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.new_channel = (unsigned int)new_channel; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_SET_CHANNEL_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_set_channel_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_set_channel_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_set_channel call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_set_channel_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_set_channel_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_set_chan_pri_inactive(const char * ifname, const qcsapi_unsigned_int channel, const qcsapi_unsigned_int inactive) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_set_chan_pri_inactive_rpcdata __req; + struct qcsapi_wifi_set_chan_pri_inactive_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.channel = (unsigned int)channel; + + __req.inactive = (unsigned int)inactive; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_SET_CHAN_PRI_INACTIVE_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_set_chan_pri_inactive_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_set_chan_pri_inactive_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_set_chan_pri_inactive call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_set_chan_pri_inactive_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_set_chan_pri_inactive_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_chan_control(const char * ifname, const struct qcsapi_data_256bytes * chans, const uint32_t cnt, const uint8_t flag) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_chan_control_rpcdata __req; + struct qcsapi_wifi_chan_control_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.chans = (__rpc_qcsapi_data_256bytes*)chans; + + __req.cnt = (uint32_t)cnt; + + __req.flag = (uint8_t)flag; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_CHAN_CONTROL_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_chan_control_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_chan_control_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_chan_control call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_chan_control_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_chan_control_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_get_chan_disabled(const char * ifname, struct qcsapi_data_256bytes * p_chans, uint8_t * p_cnt) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_get_chan_disabled_rpcdata __req; + struct qcsapi_wifi_get_chan_disabled_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.p_chans = (__rpc_qcsapi_data_256bytes*)p_chans; + + __req.p_cnt = (uint8_t *)p_cnt; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_GET_CHAN_DISABLED_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_get_chan_disabled_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_get_chan_disabled_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_get_chan_disabled call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_chan_disabled_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (__resp.p_chans && p_chans) + memcpy(p_chans, __resp.p_chans, sizeof(*p_chans)); + } + if (__resp.return_code >= 0) { + if (p_cnt) + *p_cnt = *__resp.p_cnt; + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_chan_disabled_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_get_beacon_interval(const char * ifname, qcsapi_unsigned_int * p_current_intval) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_get_beacon_interval_rpcdata __req; + struct qcsapi_wifi_get_beacon_interval_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.p_current_intval = (unsigned int *)p_current_intval; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_GET_BEACON_INTERVAL_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_get_beacon_interval_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_get_beacon_interval_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_get_beacon_interval call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_beacon_interval_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (p_current_intval) + *p_current_intval = *__resp.p_current_intval; + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_beacon_interval_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_set_beacon_interval(const char * ifname, const qcsapi_unsigned_int new_intval) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_set_beacon_interval_rpcdata __req; + struct qcsapi_wifi_set_beacon_interval_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.new_intval = (unsigned int)new_intval; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_SET_BEACON_INTERVAL_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_set_beacon_interval_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_set_beacon_interval_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_set_beacon_interval call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_set_beacon_interval_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_set_beacon_interval_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_get_dtim(const char * ifname, qcsapi_unsigned_int * p_dtim) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_get_dtim_rpcdata __req; + struct qcsapi_wifi_get_dtim_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.p_dtim = (unsigned int *)p_dtim; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_GET_DTIM_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_get_dtim_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_get_dtim_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_get_dtim call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_dtim_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (p_dtim) + *p_dtim = *__resp.p_dtim; + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_dtim_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_set_dtim(const char * ifname, const qcsapi_unsigned_int new_dtim) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_set_dtim_rpcdata __req; + struct qcsapi_wifi_set_dtim_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.new_dtim = (unsigned int)new_dtim; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_SET_DTIM_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_set_dtim_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_set_dtim_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_set_dtim call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_set_dtim_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_set_dtim_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_get_assoc_limit(const char * ifname, qcsapi_unsigned_int * p_assoc_limit) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_get_assoc_limit_rpcdata __req; + struct qcsapi_wifi_get_assoc_limit_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.p_assoc_limit = (unsigned int *)p_assoc_limit; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_GET_ASSOC_LIMIT_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_get_assoc_limit_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_get_assoc_limit_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_get_assoc_limit call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_assoc_limit_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (p_assoc_limit) + *p_assoc_limit = *__resp.p_assoc_limit; + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_assoc_limit_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_get_bss_assoc_limit(const char * ifname, qcsapi_unsigned_int * p_bss_lim_pri) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_get_bss_assoc_limit_rpcdata __req; + struct qcsapi_wifi_get_bss_assoc_limit_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.p_bss_lim_pri = (unsigned int *)p_bss_lim_pri; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_GET_BSS_ASSOC_LIMIT_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_get_bss_assoc_limit_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_get_bss_assoc_limit_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_get_bss_assoc_limit call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_bss_assoc_limit_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (p_bss_lim_pri) + *p_bss_lim_pri = *__resp.p_bss_lim_pri; + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_bss_assoc_limit_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_set_assoc_limit(const char * ifname, const qcsapi_unsigned_int new_assoc_limit) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_set_assoc_limit_rpcdata __req; + struct qcsapi_wifi_set_assoc_limit_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.new_assoc_limit = (unsigned int)new_assoc_limit; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_SET_ASSOC_LIMIT_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_set_assoc_limit_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_set_assoc_limit_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_set_assoc_limit call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_set_assoc_limit_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_set_assoc_limit_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_set_bss_assoc_limit(const char * ifname, const qcsapi_unsigned_int bss_lim_pri) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_set_bss_assoc_limit_rpcdata __req; + struct qcsapi_wifi_set_bss_assoc_limit_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.bss_lim_pri = (unsigned int)bss_lim_pri; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_SET_BSS_ASSOC_LIMIT_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_set_bss_assoc_limit_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_set_bss_assoc_limit_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_set_bss_assoc_limit call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_set_bss_assoc_limit_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_set_bss_assoc_limit_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_get_BSSID(const char * ifname, qcsapi_mac_addr current_BSSID) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_get_BSSID_rpcdata __req; + struct qcsapi_wifi_get_BSSID_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + struct __rpc_qcsapi_mac_addr __rpccurrent_BSSID; + if (current_BSSID) { + memcpy(__rpccurrent_BSSID.data, current_BSSID, sizeof(__rpccurrent_BSSID)); + __req.current_BSSID = &__rpccurrent_BSSID; + } else { + __req.current_BSSID = NULL; + } + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_GET_BSSID_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_get_BSSID_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_get_BSSID_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_get_BSSID call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_BSSID_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (current_BSSID && __resp.current_BSSID) + memcpy(current_BSSID, __resp.current_BSSID->data, + sizeof(qcsapi_mac_addr)); + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_BSSID_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_get_config_BSSID(const char * ifname, qcsapi_mac_addr config_BSSID) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_get_config_BSSID_rpcdata __req; + struct qcsapi_wifi_get_config_BSSID_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + struct __rpc_qcsapi_mac_addr __rpcconfig_BSSID; + if (config_BSSID) { + memcpy(__rpcconfig_BSSID.data, config_BSSID, sizeof(__rpcconfig_BSSID)); + __req.config_BSSID = &__rpcconfig_BSSID; + } else { + __req.config_BSSID = NULL; + } + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_GET_CONFIG_BSSID_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_get_config_BSSID_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_get_config_BSSID_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_get_config_BSSID call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_config_BSSID_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (config_BSSID && __resp.config_BSSID) + memcpy(config_BSSID, __resp.config_BSSID->data, + sizeof(qcsapi_mac_addr)); + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_config_BSSID_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_ssid_get_bssid(const char * ifname, const qcsapi_SSID ssid_str, qcsapi_mac_addr bssid) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_ssid_get_bssid_rpcdata __req; + struct qcsapi_wifi_ssid_get_bssid_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __rpc_string __rpcssid_str = {(char *)ssid_str}; + __rpc_string *p__rpcssid_str = (ssid_str) ? &__rpcssid_str : NULL; + __req.ssid_str = p__rpcssid_str; + + struct __rpc_qcsapi_mac_addr __rpcbssid; + if (bssid) { + memcpy(__rpcbssid.data, bssid, sizeof(__rpcbssid)); + __req.bssid = &__rpcbssid; + } else { + __req.bssid = NULL; + } + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_SSID_GET_BSSID_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_ssid_get_bssid_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_ssid_get_bssid_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_ssid_get_bssid call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_ssid_get_bssid_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (bssid && __resp.bssid) + memcpy(bssid, __resp.bssid->data, + sizeof(qcsapi_mac_addr)); + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_ssid_get_bssid_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_ssid_set_bssid(const char * ifname, const qcsapi_SSID ssid_str, const qcsapi_mac_addr bssid) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_ssid_set_bssid_rpcdata __req; + struct qcsapi_wifi_ssid_set_bssid_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __rpc_string __rpcssid_str = {(char *)ssid_str}; + __rpc_string *p__rpcssid_str = (ssid_str) ? &__rpcssid_str : NULL; + __req.ssid_str = p__rpcssid_str; + + struct __rpc_qcsapi_mac_addr __rpcbssid; + if (bssid) { + memcpy(__rpcbssid.data, bssid, sizeof(__rpcbssid)); + __req.bssid = &__rpcbssid; + } else { + __req.bssid = NULL; + } + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_SSID_SET_BSSID_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_ssid_set_bssid_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_ssid_set_bssid_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_ssid_set_bssid call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_ssid_set_bssid_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_ssid_set_bssid_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_get_SSID(const char * ifname, qcsapi_SSID SSID_str) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_get_SSID_rpcdata __req; + struct qcsapi_wifi_get_SSID_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __rpc_string __rpcSSID_str = {(char *)SSID_str}; + __rpc_string *p__rpcSSID_str = (SSID_str) ? &__rpcSSID_str : NULL; + __req.SSID_str = p__rpcSSID_str; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_GET_SSID_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_get_SSID_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_get_SSID_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_get_SSID call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_SSID_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (SSID_str && __resp.SSID_str) + strcpy(SSID_str, __resp.SSID_str->data); + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_SSID_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_set_SSID(const char * ifname, const qcsapi_SSID SSID_str) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_set_SSID_rpcdata __req; + struct qcsapi_wifi_set_SSID_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __rpc_string __rpcSSID_str = {(char *)SSID_str}; + __rpc_string *p__rpcSSID_str = (SSID_str) ? &__rpcSSID_str : NULL; + __req.SSID_str = p__rpcSSID_str; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_SET_SSID_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_set_SSID_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_set_SSID_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_set_SSID call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_set_SSID_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_set_SSID_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_get_IEEE_802_11_standard(const char * ifname, char * IEEE_802_11_standard) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_get_IEEE_802_11_standard_rpcdata __req; + struct qcsapi_wifi_get_IEEE_802_11_standard_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __rpc_string __rpcIEEE_802_11_standard = {(char *)IEEE_802_11_standard}; + __rpc_string *p__rpcIEEE_802_11_standard = (IEEE_802_11_standard) ? &__rpcIEEE_802_11_standard : NULL; + __req.IEEE_802_11_standard = p__rpcIEEE_802_11_standard; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_GET_IEEE_802_11_STANDARD_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_get_IEEE_802_11_standard_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_get_IEEE_802_11_standard_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_get_IEEE_802_11_standard call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_IEEE_802_11_standard_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (IEEE_802_11_standard && __resp.IEEE_802_11_standard) + strcpy(IEEE_802_11_standard, __resp.IEEE_802_11_standard->data); + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_IEEE_802_11_standard_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_get_list_channels(const char * ifname, string_1024 list_of_channels) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_get_list_channels_rpcdata __req; + struct qcsapi_wifi_get_list_channels_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __rpc_string __rpclist_of_channels = {(char *)list_of_channels}; + __rpc_string *p__rpclist_of_channels = (list_of_channels) ? &__rpclist_of_channels : NULL; + __req.list_of_channels = p__rpclist_of_channels; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_GET_LIST_CHANNELS_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_get_list_channels_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_get_list_channels_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_get_list_channels call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_list_channels_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (list_of_channels && __resp.list_of_channels) + strcpy(list_of_channels, __resp.list_of_channels->data); + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_list_channels_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_get_mode_switch(uint8_t * p_wifi_mode_switch_setting) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_get_mode_switch_rpcdata __req; + struct qcsapi_wifi_get_mode_switch_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __req.p_wifi_mode_switch_setting = (uint8_t *)p_wifi_mode_switch_setting; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_GET_MODE_SWITCH_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_get_mode_switch_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_get_mode_switch_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_get_mode_switch call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_mode_switch_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (p_wifi_mode_switch_setting) + *p_wifi_mode_switch_setting = *__resp.p_wifi_mode_switch_setting; + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_mode_switch_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_disassociate(const char * ifname) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_disassociate_rpcdata __req; + struct qcsapi_wifi_disassociate_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_DISASSOCIATE_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_disassociate_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_disassociate_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_disassociate call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_disassociate_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_disassociate_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_disassociate_sta(const char * ifname, qcsapi_mac_addr mac) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_disassociate_sta_rpcdata __req; + struct qcsapi_wifi_disassociate_sta_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + struct __rpc_qcsapi_mac_addr __rpcmac; + if (mac) { + memcpy(__rpcmac.data, mac, sizeof(__rpcmac)); + __req.mac = &__rpcmac; + } else { + __req.mac = NULL; + } + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_DISASSOCIATE_STA_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_disassociate_sta_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_disassociate_sta_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_disassociate_sta call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_disassociate_sta_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (mac && __resp.mac) + memcpy(mac, __resp.mac->data, + sizeof(qcsapi_mac_addr)); + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_disassociate_sta_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_reassociate(const char * ifname) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_reassociate_rpcdata __req; + struct qcsapi_wifi_reassociate_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_REASSOCIATE_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_reassociate_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_reassociate_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_reassociate call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_reassociate_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_reassociate_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_get_disconn_info(const char * ifname, qcsapi_disconn_info * disconn_info) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_get_disconn_info_rpcdata __req; + struct qcsapi_wifi_get_disconn_info_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.disconn_info = (__rpc_qcsapi_disconn_info*)disconn_info; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_GET_DISCONN_INFO_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_get_disconn_info_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_get_disconn_info_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_get_disconn_info call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_disconn_info_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (__resp.disconn_info && disconn_info) + memcpy(disconn_info, __resp.disconn_info, sizeof(*disconn_info)); + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_disconn_info_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_disable_wps(const char * ifname, int disable_wps) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_disable_wps_rpcdata __req; + struct qcsapi_wifi_disable_wps_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.disable_wps = (int)disable_wps; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_DISABLE_WPS_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_disable_wps_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_disable_wps_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_disable_wps call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_disable_wps_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_disable_wps_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_associate(const char * ifname, const qcsapi_SSID join_ssid) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_associate_rpcdata __req; + struct qcsapi_wifi_associate_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __rpc_string __rpcjoin_ssid = {(char *)join_ssid}; + __rpc_string *p__rpcjoin_ssid = (join_ssid) ? &__rpcjoin_ssid : NULL; + __req.join_ssid = p__rpcjoin_ssid; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_ASSOCIATE_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_associate_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_associate_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_associate call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_associate_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_associate_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_start_cca(const char * ifname, int channel, int duration) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_start_cca_rpcdata __req; + struct qcsapi_wifi_start_cca_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.channel = (int)channel; + + __req.duration = (int)duration; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_START_CCA_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_start_cca_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_start_cca_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_start_cca call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_start_cca_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_start_cca_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_get_noise(const char * ifname, int * p_noise) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_get_noise_rpcdata __req; + struct qcsapi_wifi_get_noise_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.p_noise = (int *)p_noise; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_GET_NOISE_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_get_noise_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_get_noise_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_get_noise call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_noise_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (p_noise) + *p_noise = *__resp.p_noise; + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_noise_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_get_rssi_by_chain(const char * ifname, int rf_chain, int * p_rssi) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_get_rssi_by_chain_rpcdata __req; + struct qcsapi_wifi_get_rssi_by_chain_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.rf_chain = (int)rf_chain; + + __req.p_rssi = (int *)p_rssi; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_GET_RSSI_BY_CHAIN_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_get_rssi_by_chain_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_get_rssi_by_chain_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_get_rssi_by_chain call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_rssi_by_chain_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (p_rssi) + *p_rssi = *__resp.p_rssi; + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_rssi_by_chain_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_get_avg_snr(const char * ifname, int * p_snr) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_get_avg_snr_rpcdata __req; + struct qcsapi_wifi_get_avg_snr_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.p_snr = (int *)p_snr; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_GET_AVG_SNR_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_get_avg_snr_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_get_avg_snr_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_get_avg_snr call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_avg_snr_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (p_snr) + *p_snr = *__resp.p_snr; + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_avg_snr_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_get_primary_interface(char * ifname, size_t maxlen) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_get_primary_interface_rpcdata __req; + struct qcsapi_get_primary_interface_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.maxlen = (uint32_t)maxlen; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_GET_PRIMARY_INTERFACE_REMOTE, + (xdrproc_t)xdr_qcsapi_get_primary_interface_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_get_primary_interface_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_get_primary_interface call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_get_primary_interface_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (ifname && __resp.ifname) + strcpy(ifname, __resp.ifname->data); + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_get_primary_interface_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_get_interface_by_index(unsigned int if_index, char * ifname, size_t maxlen) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_get_interface_by_index_rpcdata __req; + struct qcsapi_get_interface_by_index_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __req.if_index = (unsigned int)if_index; + + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.maxlen = (uint32_t)maxlen; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_GET_INTERFACE_BY_INDEX_REMOTE, + (xdrproc_t)xdr_qcsapi_get_interface_by_index_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_get_interface_by_index_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_get_interface_by_index call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_get_interface_by_index_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (ifname && __resp.ifname) + strcpy(ifname, __resp.ifname->data); + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_get_interface_by_index_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_set_wifi_macaddr(const qcsapi_mac_addr new_mac_addr) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_set_wifi_macaddr_rpcdata __req; + struct qcsapi_wifi_set_wifi_macaddr_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + struct __rpc_qcsapi_mac_addr __rpcnew_mac_addr; + if (new_mac_addr) { + memcpy(__rpcnew_mac_addr.data, new_mac_addr, sizeof(__rpcnew_mac_addr)); + __req.new_mac_addr = &__rpcnew_mac_addr; + } else { + __req.new_mac_addr = NULL; + } + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_SET_WIFI_MACADDR_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_set_wifi_macaddr_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_set_wifi_macaddr_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_set_wifi_macaddr call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_set_wifi_macaddr_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_set_wifi_macaddr_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_interface_get_BSSID(const char * ifname, qcsapi_mac_addr current_BSSID) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_interface_get_BSSID_rpcdata __req; + struct qcsapi_interface_get_BSSID_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + struct __rpc_qcsapi_mac_addr __rpccurrent_BSSID; + if (current_BSSID) { + memcpy(__rpccurrent_BSSID.data, current_BSSID, sizeof(__rpccurrent_BSSID)); + __req.current_BSSID = &__rpccurrent_BSSID; + } else { + __req.current_BSSID = NULL; + } + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_INTERFACE_GET_BSSID_REMOTE, + (xdrproc_t)xdr_qcsapi_interface_get_BSSID_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_interface_get_BSSID_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_interface_get_BSSID call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_interface_get_BSSID_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (current_BSSID && __resp.current_BSSID) + memcpy(current_BSSID, __resp.current_BSSID->data, + sizeof(qcsapi_mac_addr)); + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_interface_get_BSSID_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_get_rates(const char * ifname, qcsapi_rate_type rate_type, string_1024 supported_rates) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_get_rates_rpcdata __req; + struct qcsapi_wifi_get_rates_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.rate_type = (int)rate_type; + + __rpc_string __rpcsupported_rates = {(char *)supported_rates}; + __rpc_string *p__rpcsupported_rates = (supported_rates) ? &__rpcsupported_rates : NULL; + __req.supported_rates = p__rpcsupported_rates; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_GET_RATES_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_get_rates_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_get_rates_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_get_rates call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_rates_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (supported_rates && __resp.supported_rates) + strcpy(supported_rates, __resp.supported_rates->data); + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_rates_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_set_rates(const char * ifname, qcsapi_rate_type rate_type, const string_256 current_rates, int num_rates) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_set_rates_rpcdata __req; + struct qcsapi_wifi_set_rates_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.rate_type = (int)rate_type; + + __rpc_string __rpccurrent_rates = {(char *)current_rates}; + __rpc_string *p__rpccurrent_rates = (current_rates) ? &__rpccurrent_rates : NULL; + __req.current_rates = p__rpccurrent_rates; + + __req.num_rates = (int)num_rates; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_SET_RATES_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_set_rates_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_set_rates_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_set_rates call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_set_rates_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_set_rates_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_get_max_bitrate(const char * ifname, char * max_bitrate, const int max_str_len) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_get_max_bitrate_rpcdata __req; + struct qcsapi_get_max_bitrate_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __rpc_string __rpcmax_bitrate = {(char *)max_bitrate}; + __rpc_string *p__rpcmax_bitrate = (max_bitrate) ? &__rpcmax_bitrate : NULL; + __req.max_bitrate = p__rpcmax_bitrate; + + __req.max_str_len = (int)max_str_len; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_GET_MAX_BITRATE_REMOTE, + (xdrproc_t)xdr_qcsapi_get_max_bitrate_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_get_max_bitrate_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_get_max_bitrate call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_get_max_bitrate_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (max_bitrate && __resp.max_bitrate) + strcpy(max_bitrate, __resp.max_bitrate->data); + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_get_max_bitrate_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_set_max_bitrate(const char * ifname, const char * max_bitrate) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_set_max_bitrate_rpcdata __req; + struct qcsapi_set_max_bitrate_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __rpc_string __rpcmax_bitrate = {(char *)max_bitrate}; + __rpc_string *p__rpcmax_bitrate = (max_bitrate) ? &__rpcmax_bitrate : NULL; + __req.max_bitrate = p__rpcmax_bitrate; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_SET_MAX_BITRATE_REMOTE, + (xdrproc_t)xdr_qcsapi_set_max_bitrate_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_set_max_bitrate_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_set_max_bitrate call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_set_max_bitrate_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_set_max_bitrate_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_qos_get_param(const char * ifname, int the_queue, int the_param, int ap_bss_flag, int * p_value) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_qos_get_param_rpcdata __req; + struct qcsapi_wifi_qos_get_param_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.the_queue = (int)the_queue; + + __req.the_param = (int)the_param; + + __req.ap_bss_flag = (int)ap_bss_flag; + + __req.p_value = (int *)p_value; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_QOS_GET_PARAM_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_qos_get_param_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_qos_get_param_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_qos_get_param call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_qos_get_param_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (p_value) + *p_value = *__resp.p_value; + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_qos_get_param_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_qos_set_param(const char * ifname, int the_queue, int the_param, int ap_bss_flag, int value) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_qos_set_param_rpcdata __req; + struct qcsapi_wifi_qos_set_param_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.the_queue = (int)the_queue; + + __req.the_param = (int)the_param; + + __req.ap_bss_flag = (int)ap_bss_flag; + + __req.value = (int)value; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_QOS_SET_PARAM_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_qos_set_param_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_qos_set_param_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_qos_set_param call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_qos_set_param_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_qos_set_param_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_get_wmm_ac_map(const char * ifname, string_64 mapping_table) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_get_wmm_ac_map_rpcdata __req; + struct qcsapi_wifi_get_wmm_ac_map_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __rpc_string __rpcmapping_table = {(char *)mapping_table}; + __rpc_string *p__rpcmapping_table = (mapping_table) ? &__rpcmapping_table : NULL; + __req.mapping_table = p__rpcmapping_table; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_GET_WMM_AC_MAP_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_get_wmm_ac_map_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_get_wmm_ac_map_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_get_wmm_ac_map call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_wmm_ac_map_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (mapping_table && __resp.mapping_table) + strcpy(mapping_table, __resp.mapping_table->data); + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_wmm_ac_map_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_set_wmm_ac_map(const char * ifname, int user_prio, int ac_index) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_set_wmm_ac_map_rpcdata __req; + struct qcsapi_wifi_set_wmm_ac_map_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.user_prio = (int)user_prio; + + __req.ac_index = (int)ac_index; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_SET_WMM_AC_MAP_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_set_wmm_ac_map_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_set_wmm_ac_map_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_set_wmm_ac_map call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_set_wmm_ac_map_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_set_wmm_ac_map_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_get_dscp_8021p_map(const char * ifname, string_64 mapping_table) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_get_dscp_8021p_map_rpcdata __req; + struct qcsapi_wifi_get_dscp_8021p_map_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __rpc_string __rpcmapping_table = {(char *)mapping_table}; + __rpc_string *p__rpcmapping_table = (mapping_table) ? &__rpcmapping_table : NULL; + __req.mapping_table = p__rpcmapping_table; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_GET_DSCP_8021P_MAP_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_get_dscp_8021p_map_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_get_dscp_8021p_map_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_get_dscp_8021p_map call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_dscp_8021p_map_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (mapping_table && __resp.mapping_table) + strcpy(mapping_table, __resp.mapping_table->data); + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_dscp_8021p_map_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_get_dscp_ac_map(const char * ifname, struct qcsapi_data_64bytes * mapping_table) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_get_dscp_ac_map_rpcdata __req; + struct qcsapi_wifi_get_dscp_ac_map_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.mapping_table = (__rpc_qcsapi_data_64bytes*)mapping_table; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_GET_DSCP_AC_MAP_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_get_dscp_ac_map_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_get_dscp_ac_map_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_get_dscp_ac_map call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_dscp_ac_map_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (__resp.mapping_table && mapping_table) + memcpy(mapping_table, __resp.mapping_table, sizeof(*mapping_table)); + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_dscp_ac_map_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_set_dscp_8021p_map(const char * ifname, const char * ip_dscp_list, uint8_t dot1p_up) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_set_dscp_8021p_map_rpcdata __req; + struct qcsapi_wifi_set_dscp_8021p_map_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __rpc_string __rpcip_dscp_list = {(char *)ip_dscp_list}; + __rpc_string *p__rpcip_dscp_list = (ip_dscp_list) ? &__rpcip_dscp_list : NULL; + __req.ip_dscp_list = p__rpcip_dscp_list; + + __req.dot1p_up = (uint8_t)dot1p_up; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_SET_DSCP_8021P_MAP_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_set_dscp_8021p_map_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_set_dscp_8021p_map_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_set_dscp_8021p_map call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_set_dscp_8021p_map_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_set_dscp_8021p_map_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_set_dscp_ac_map(const char * ifname, const struct qcsapi_data_64bytes * dscp_list, uint8_t dscp_list_len, uint8_t ac) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_set_dscp_ac_map_rpcdata __req; + struct qcsapi_wifi_set_dscp_ac_map_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.dscp_list = (__rpc_qcsapi_data_64bytes*)dscp_list; + + __req.dscp_list_len = (uint8_t)dscp_list_len; + + __req.ac = (uint8_t)ac; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_SET_DSCP_AC_MAP_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_set_dscp_ac_map_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_set_dscp_ac_map_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_set_dscp_ac_map call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_set_dscp_ac_map_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_set_dscp_ac_map_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_get_priority(const char * ifname, uint8_t * p_priority) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_get_priority_rpcdata __req; + struct qcsapi_wifi_get_priority_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.p_priority = (uint8_t *)p_priority; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_GET_PRIORITY_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_get_priority_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_get_priority_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_get_priority call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_priority_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (p_priority) + *p_priority = *__resp.p_priority; + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_priority_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_set_priority(const char * ifname, uint8_t priority) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_set_priority_rpcdata __req; + struct qcsapi_wifi_set_priority_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.priority = (uint8_t)priority; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_SET_PRIORITY_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_set_priority_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_set_priority_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_set_priority call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_set_priority_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_set_priority_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_get_airfair(const char * ifname, uint8_t * p_airfair) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_get_airfair_rpcdata __req; + struct qcsapi_wifi_get_airfair_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.p_airfair = (uint8_t *)p_airfair; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_GET_AIRFAIR_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_get_airfair_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_get_airfair_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_get_airfair call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_airfair_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (p_airfair) + *p_airfair = *__resp.p_airfair; + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_airfair_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_set_airfair(const char * ifname, uint8_t airfair) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_set_airfair_rpcdata __req; + struct qcsapi_wifi_set_airfair_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.airfair = (uint8_t)airfair; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_SET_AIRFAIR_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_set_airfair_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_set_airfair_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_set_airfair call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_set_airfair_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_set_airfair_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_get_tx_power(const char * ifname, const qcsapi_unsigned_int the_channel, int * p_tx_power) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_get_tx_power_rpcdata __req; + struct qcsapi_wifi_get_tx_power_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.the_channel = (unsigned int)the_channel; + + __req.p_tx_power = (int *)p_tx_power; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_GET_TX_POWER_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_get_tx_power_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_get_tx_power_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_get_tx_power call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_tx_power_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (p_tx_power) + *p_tx_power = *__resp.p_tx_power; + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_tx_power_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_set_tx_power(const char * ifname, const qcsapi_unsigned_int the_channel, const int tx_power) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_set_tx_power_rpcdata __req; + struct qcsapi_wifi_set_tx_power_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.the_channel = (unsigned int)the_channel; + + __req.tx_power = (int)tx_power; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_SET_TX_POWER_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_set_tx_power_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_set_tx_power_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_set_tx_power call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_set_tx_power_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_set_tx_power_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_get_bw_power(const char * ifname, const qcsapi_unsigned_int the_channel, int * p_power_20M, int * p_power_40M, int * p_power_80M) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_get_bw_power_rpcdata __req; + struct qcsapi_wifi_get_bw_power_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.the_channel = (unsigned int)the_channel; + + __req.p_power_20M = (int *)p_power_20M; + + __req.p_power_40M = (int *)p_power_40M; + + __req.p_power_80M = (int *)p_power_80M; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_GET_BW_POWER_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_get_bw_power_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_get_bw_power_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_get_bw_power call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_bw_power_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (p_power_20M) + *p_power_20M = *__resp.p_power_20M; + } + if (__resp.return_code >= 0) { + if (p_power_40M) + *p_power_40M = *__resp.p_power_40M; + } + if (__resp.return_code >= 0) { + if (p_power_80M) + *p_power_80M = *__resp.p_power_80M; + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_bw_power_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_set_bw_power(const char * ifname, const qcsapi_unsigned_int the_channel, const int power_20M, const int power_40M, const int power_80M) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_set_bw_power_rpcdata __req; + struct qcsapi_wifi_set_bw_power_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.the_channel = (unsigned int)the_channel; + + __req.power_20M = (int)power_20M; + + __req.power_40M = (int)power_40M; + + __req.power_80M = (int)power_80M; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_SET_BW_POWER_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_set_bw_power_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_set_bw_power_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_set_bw_power call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_set_bw_power_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_set_bw_power_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_get_bf_power(const char * ifname, const qcsapi_unsigned_int the_channel, const qcsapi_unsigned_int number_ss, int * p_power_20M, int * p_power_40M, int * p_power_80M) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_get_bf_power_rpcdata __req; + struct qcsapi_wifi_get_bf_power_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.the_channel = (unsigned int)the_channel; + + __req.number_ss = (unsigned int)number_ss; + + __req.p_power_20M = (int *)p_power_20M; + + __req.p_power_40M = (int *)p_power_40M; + + __req.p_power_80M = (int *)p_power_80M; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_GET_BF_POWER_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_get_bf_power_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_get_bf_power_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_get_bf_power call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_bf_power_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (p_power_20M) + *p_power_20M = *__resp.p_power_20M; + } + if (__resp.return_code >= 0) { + if (p_power_40M) + *p_power_40M = *__resp.p_power_40M; + } + if (__resp.return_code >= 0) { + if (p_power_80M) + *p_power_80M = *__resp.p_power_80M; + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_bf_power_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_set_bf_power(const char * ifname, const qcsapi_unsigned_int the_channel, const qcsapi_unsigned_int number_ss, const int power_20M, const int power_40M, const int power_80M) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_set_bf_power_rpcdata __req; + struct qcsapi_wifi_set_bf_power_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.the_channel = (unsigned int)the_channel; + + __req.number_ss = (unsigned int)number_ss; + + __req.power_20M = (int)power_20M; + + __req.power_40M = (int)power_40M; + + __req.power_80M = (int)power_80M; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_SET_BF_POWER_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_set_bf_power_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_set_bf_power_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_set_bf_power call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_set_bf_power_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_set_bf_power_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_get_tx_power_ext(const char * ifname, const qcsapi_unsigned_int the_channel, const qcsapi_unsigned_int bf_on, const qcsapi_unsigned_int number_ss, int * p_power_20M, int * p_power_40M, int * p_power_80M) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_get_tx_power_ext_rpcdata __req; + struct qcsapi_wifi_get_tx_power_ext_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.the_channel = (unsigned int)the_channel; + + __req.bf_on = (unsigned int)bf_on; + + __req.number_ss = (unsigned int)number_ss; + + __req.p_power_20M = (int *)p_power_20M; + + __req.p_power_40M = (int *)p_power_40M; + + __req.p_power_80M = (int *)p_power_80M; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_GET_TX_POWER_EXT_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_get_tx_power_ext_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_get_tx_power_ext_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_get_tx_power_ext call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_tx_power_ext_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (p_power_20M) + *p_power_20M = *__resp.p_power_20M; + } + if (__resp.return_code >= 0) { + if (p_power_40M) + *p_power_40M = *__resp.p_power_40M; + } + if (__resp.return_code >= 0) { + if (p_power_80M) + *p_power_80M = *__resp.p_power_80M; + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_tx_power_ext_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_set_tx_power_ext(const char * ifname, const qcsapi_unsigned_int the_channel, const qcsapi_unsigned_int bf_on, const qcsapi_unsigned_int number_ss, const int power_20M, const int power_40M, const int power_80M) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_set_tx_power_ext_rpcdata __req; + struct qcsapi_wifi_set_tx_power_ext_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.the_channel = (unsigned int)the_channel; + + __req.bf_on = (unsigned int)bf_on; + + __req.number_ss = (unsigned int)number_ss; + + __req.power_20M = (int)power_20M; + + __req.power_40M = (int)power_40M; + + __req.power_80M = (int)power_80M; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_SET_TX_POWER_EXT_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_set_tx_power_ext_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_set_tx_power_ext_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_set_tx_power_ext call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_set_tx_power_ext_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_set_tx_power_ext_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_get_chan_power_table(const char * ifname, qcsapi_channel_power_table * chan_power_table) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_get_chan_power_table_rpcdata __req; + struct qcsapi_wifi_get_chan_power_table_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.chan_power_table = (__rpc_qcsapi_channel_power_table*)chan_power_table; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_GET_CHAN_POWER_TABLE_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_get_chan_power_table_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_get_chan_power_table_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_get_chan_power_table call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_chan_power_table_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (__resp.chan_power_table && chan_power_table) + memcpy(chan_power_table, __resp.chan_power_table, sizeof(*chan_power_table)); + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_chan_power_table_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_set_chan_power_table(const char * ifname, qcsapi_channel_power_table * chan_power_table) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_set_chan_power_table_rpcdata __req; + struct qcsapi_wifi_set_chan_power_table_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.chan_power_table = (__rpc_qcsapi_channel_power_table*)chan_power_table; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_SET_CHAN_POWER_TABLE_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_set_chan_power_table_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_set_chan_power_table_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_set_chan_power_table call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_set_chan_power_table_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (__resp.chan_power_table && chan_power_table) + memcpy(chan_power_table, __resp.chan_power_table, sizeof(*chan_power_table)); + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_set_chan_power_table_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_get_power_selection(qcsapi_unsigned_int * p_power_selection) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_get_power_selection_rpcdata __req; + struct qcsapi_wifi_get_power_selection_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __req.p_power_selection = (unsigned int *)p_power_selection; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_GET_POWER_SELECTION_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_get_power_selection_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_get_power_selection_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_get_power_selection call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_power_selection_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (p_power_selection) + *p_power_selection = *__resp.p_power_selection; + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_power_selection_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_set_power_selection(const qcsapi_unsigned_int power_selection) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_set_power_selection_rpcdata __req; + struct qcsapi_wifi_set_power_selection_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __req.power_selection = (unsigned int)power_selection; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_SET_POWER_SELECTION_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_set_power_selection_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_set_power_selection_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_set_power_selection call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_set_power_selection_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_set_power_selection_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_get_carrier_interference(const char * ifname, int * ci) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_get_carrier_interference_rpcdata __req; + struct qcsapi_wifi_get_carrier_interference_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.ci = (int *)ci; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_GET_CARRIER_INTERFERENCE_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_get_carrier_interference_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_get_carrier_interference_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_get_carrier_interference call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_carrier_interference_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (ci) + *ci = *__resp.ci; + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_carrier_interference_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_get_congestion_index(const char * ifname, int * ci) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_get_congestion_index_rpcdata __req; + struct qcsapi_wifi_get_congestion_index_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.ci = (int *)ci; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_GET_CONGESTION_INDEX_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_get_congestion_index_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_get_congestion_index_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_get_congestion_index call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_congestion_index_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (ci) + *ci = *__resp.ci; + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_congestion_index_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_get_supported_tx_power_levels(const char * ifname, string_128 available_percentages) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_get_supported_tx_power_levels_rpcdata __req; + struct qcsapi_wifi_get_supported_tx_power_levels_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __rpc_string __rpcavailable_percentages = {(char *)available_percentages}; + __rpc_string *p__rpcavailable_percentages = (available_percentages) ? &__rpcavailable_percentages : NULL; + __req.available_percentages = p__rpcavailable_percentages; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_GET_SUPPORTED_TX_POWER_LEVELS_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_get_supported_tx_power_levels_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_get_supported_tx_power_levels_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_get_supported_tx_power_levels call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_supported_tx_power_levels_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (available_percentages && __resp.available_percentages) + strcpy(available_percentages, __resp.available_percentages->data); + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_supported_tx_power_levels_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_get_current_tx_power_level(const char * ifname, uint32_t * p_current_percentage) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_get_current_tx_power_level_rpcdata __req; + struct qcsapi_wifi_get_current_tx_power_level_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.p_current_percentage = (uint32_t *)p_current_percentage; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_GET_CURRENT_TX_POWER_LEVEL_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_get_current_tx_power_level_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_get_current_tx_power_level_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_get_current_tx_power_level call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_current_tx_power_level_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (p_current_percentage) + *p_current_percentage = *__resp.p_current_percentage; + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_current_tx_power_level_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_set_power_constraint(const char * ifname, uint32_t pwr_constraint) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_set_power_constraint_rpcdata __req; + struct qcsapi_wifi_set_power_constraint_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.pwr_constraint = (uint32_t)pwr_constraint; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_SET_POWER_CONSTRAINT_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_set_power_constraint_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_set_power_constraint_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_set_power_constraint call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_set_power_constraint_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_set_power_constraint_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_get_power_constraint(const char * ifname, uint32_t * p_pwr_constraint) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_get_power_constraint_rpcdata __req; + struct qcsapi_wifi_get_power_constraint_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.p_pwr_constraint = (uint32_t *)p_pwr_constraint; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_GET_POWER_CONSTRAINT_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_get_power_constraint_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_get_power_constraint_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_get_power_constraint call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_power_constraint_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (p_pwr_constraint) + *p_pwr_constraint = *__resp.p_pwr_constraint; + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_power_constraint_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_set_tpc_interval(const char * ifname, int32_t tpc_interval) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_set_tpc_interval_rpcdata __req; + struct qcsapi_wifi_set_tpc_interval_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.tpc_interval = (int32_t)tpc_interval; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_SET_TPC_INTERVAL_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_set_tpc_interval_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_set_tpc_interval_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_set_tpc_interval call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_set_tpc_interval_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_set_tpc_interval_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_get_tpc_interval(const char * ifname, uint32_t * p_tpc_interval) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_get_tpc_interval_rpcdata __req; + struct qcsapi_wifi_get_tpc_interval_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.p_tpc_interval = (uint32_t *)p_tpc_interval; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_GET_TPC_INTERVAL_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_get_tpc_interval_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_get_tpc_interval_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_get_tpc_interval call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_tpc_interval_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (p_tpc_interval) + *p_tpc_interval = *__resp.p_tpc_interval; + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_tpc_interval_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_get_assoc_records(const char * ifname, int reset, qcsapi_assoc_records * records) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_get_assoc_records_rpcdata __req; + struct qcsapi_wifi_get_assoc_records_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.reset = (int)reset; + + __req.records = (__rpc_qcsapi_assoc_records*)records; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_GET_ASSOC_RECORDS_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_get_assoc_records_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_get_assoc_records_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_get_assoc_records call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_assoc_records_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (__resp.records && records) + memcpy(records, __resp.records, sizeof(*records)); + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_assoc_records_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_get_ap_isolate(const char * ifname, int * p_ap_isolate) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_get_ap_isolate_rpcdata __req; + struct qcsapi_wifi_get_ap_isolate_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.p_ap_isolate = (int *)p_ap_isolate; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_GET_AP_ISOLATE_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_get_ap_isolate_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_get_ap_isolate_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_get_ap_isolate call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_ap_isolate_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (p_ap_isolate) + *p_ap_isolate = *__resp.p_ap_isolate; + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_ap_isolate_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_set_ap_isolate(const char * ifname, const int new_ap_isolate) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_set_ap_isolate_rpcdata __req; + struct qcsapi_wifi_set_ap_isolate_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.new_ap_isolate = (int)new_ap_isolate; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_SET_AP_ISOLATE_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_set_ap_isolate_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_set_ap_isolate_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_set_ap_isolate call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_set_ap_isolate_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_set_ap_isolate_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_get_intra_bss_isolate(const char * ifname, qcsapi_unsigned_int * p_ap_isolate) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_get_intra_bss_isolate_rpcdata __req; + struct qcsapi_wifi_get_intra_bss_isolate_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.p_ap_isolate = (unsigned int *)p_ap_isolate; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_GET_INTRA_BSS_ISOLATE_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_get_intra_bss_isolate_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_get_intra_bss_isolate_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_get_intra_bss_isolate call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_intra_bss_isolate_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (p_ap_isolate) + *p_ap_isolate = *__resp.p_ap_isolate; + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_intra_bss_isolate_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_set_intra_bss_isolate(const char * ifname, const qcsapi_unsigned_int new_ap_isolate) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_set_intra_bss_isolate_rpcdata __req; + struct qcsapi_wifi_set_intra_bss_isolate_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.new_ap_isolate = (unsigned int)new_ap_isolate; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_SET_INTRA_BSS_ISOLATE_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_set_intra_bss_isolate_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_set_intra_bss_isolate_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_set_intra_bss_isolate call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_set_intra_bss_isolate_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_set_intra_bss_isolate_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_get_bss_isolate(const char * ifname, qcsapi_unsigned_int * p_ap_isolate) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_get_bss_isolate_rpcdata __req; + struct qcsapi_wifi_get_bss_isolate_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.p_ap_isolate = (unsigned int *)p_ap_isolate; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_GET_BSS_ISOLATE_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_get_bss_isolate_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_get_bss_isolate_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_get_bss_isolate call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_bss_isolate_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (p_ap_isolate) + *p_ap_isolate = *__resp.p_ap_isolate; + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_bss_isolate_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_set_bss_isolate(const char * ifname, const qcsapi_unsigned_int new_ap_isolate) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_set_bss_isolate_rpcdata __req; + struct qcsapi_wifi_set_bss_isolate_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.new_ap_isolate = (unsigned int)new_ap_isolate; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_SET_BSS_ISOLATE_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_set_bss_isolate_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_set_bss_isolate_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_set_bss_isolate call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_set_bss_isolate_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_set_bss_isolate_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_disable_dfs_channels(const char * ifname, int disable_dfs, int channel) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_disable_dfs_channels_rpcdata __req; + struct qcsapi_wifi_disable_dfs_channels_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.disable_dfs = (int)disable_dfs; + + __req.channel = (int)channel; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_DISABLE_DFS_CHANNELS_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_disable_dfs_channels_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_disable_dfs_channels_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_disable_dfs_channels call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_disable_dfs_channels_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_disable_dfs_channels_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_create_restricted_bss(const char * ifname, const qcsapi_mac_addr mac_addr) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_create_restricted_bss_rpcdata __req; + struct qcsapi_wifi_create_restricted_bss_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + struct __rpc_qcsapi_mac_addr __rpcmac_addr; + if (mac_addr) { + memcpy(__rpcmac_addr.data, mac_addr, sizeof(__rpcmac_addr)); + __req.mac_addr = &__rpcmac_addr; + } else { + __req.mac_addr = NULL; + } + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_CREATE_RESTRICTED_BSS_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_create_restricted_bss_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_create_restricted_bss_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_create_restricted_bss call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_create_restricted_bss_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_create_restricted_bss_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_create_bss(const char * ifname, const qcsapi_mac_addr mac_addr) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_create_bss_rpcdata __req; + struct qcsapi_wifi_create_bss_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + struct __rpc_qcsapi_mac_addr __rpcmac_addr; + if (mac_addr) { + memcpy(__rpcmac_addr.data, mac_addr, sizeof(__rpcmac_addr)); + __req.mac_addr = &__rpcmac_addr; + } else { + __req.mac_addr = NULL; + } + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_CREATE_BSS_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_create_bss_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_create_bss_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_create_bss call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_create_bss_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_create_bss_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_remove_bss(const char * ifname) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_remove_bss_rpcdata __req; + struct qcsapi_wifi_remove_bss_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_REMOVE_BSS_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_remove_bss_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_remove_bss_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_remove_bss call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_remove_bss_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_remove_bss_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wds_add_peer(const char * ifname, const qcsapi_mac_addr peer_address) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wds_add_peer_rpcdata __req; + struct qcsapi_wds_add_peer_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + struct __rpc_qcsapi_mac_addr __rpcpeer_address; + if (peer_address) { + memcpy(__rpcpeer_address.data, peer_address, sizeof(__rpcpeer_address)); + __req.peer_address = &__rpcpeer_address; + } else { + __req.peer_address = NULL; + } + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WDS_ADD_PEER_REMOTE, + (xdrproc_t)xdr_qcsapi_wds_add_peer_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wds_add_peer_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wds_add_peer call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wds_add_peer_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wds_add_peer_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wds_add_peer_encrypt(const char * ifname, const qcsapi_mac_addr peer_address, const qcsapi_unsigned_int encryption) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wds_add_peer_encrypt_rpcdata __req; + struct qcsapi_wds_add_peer_encrypt_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + struct __rpc_qcsapi_mac_addr __rpcpeer_address; + if (peer_address) { + memcpy(__rpcpeer_address.data, peer_address, sizeof(__rpcpeer_address)); + __req.peer_address = &__rpcpeer_address; + } else { + __req.peer_address = NULL; + } + __req.encryption = (unsigned int)encryption; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WDS_ADD_PEER_ENCRYPT_REMOTE, + (xdrproc_t)xdr_qcsapi_wds_add_peer_encrypt_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wds_add_peer_encrypt_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wds_add_peer_encrypt call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wds_add_peer_encrypt_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wds_add_peer_encrypt_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wds_remove_peer(const char * ifname, const qcsapi_mac_addr peer_address) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wds_remove_peer_rpcdata __req; + struct qcsapi_wds_remove_peer_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + struct __rpc_qcsapi_mac_addr __rpcpeer_address; + if (peer_address) { + memcpy(__rpcpeer_address.data, peer_address, sizeof(__rpcpeer_address)); + __req.peer_address = &__rpcpeer_address; + } else { + __req.peer_address = NULL; + } + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WDS_REMOVE_PEER_REMOTE, + (xdrproc_t)xdr_qcsapi_wds_remove_peer_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wds_remove_peer_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wds_remove_peer call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wds_remove_peer_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wds_remove_peer_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wds_get_peer_address(const char * ifname, const int index, qcsapi_mac_addr peer_address) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wds_get_peer_address_rpcdata __req; + struct qcsapi_wds_get_peer_address_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.index = (int)index; + + struct __rpc_qcsapi_mac_addr __rpcpeer_address; + if (peer_address) { + memcpy(__rpcpeer_address.data, peer_address, sizeof(__rpcpeer_address)); + __req.peer_address = &__rpcpeer_address; + } else { + __req.peer_address = NULL; + } + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WDS_GET_PEER_ADDRESS_REMOTE, + (xdrproc_t)xdr_qcsapi_wds_get_peer_address_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wds_get_peer_address_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wds_get_peer_address call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wds_get_peer_address_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (peer_address && __resp.peer_address) + memcpy(peer_address, __resp.peer_address->data, + sizeof(qcsapi_mac_addr)); + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wds_get_peer_address_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wds_set_psk(const char * ifname, const qcsapi_mac_addr peer_address, const string_64 pre_shared_key) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wds_set_psk_rpcdata __req; + struct qcsapi_wds_set_psk_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + struct __rpc_qcsapi_mac_addr __rpcpeer_address; + if (peer_address) { + memcpy(__rpcpeer_address.data, peer_address, sizeof(__rpcpeer_address)); + __req.peer_address = &__rpcpeer_address; + } else { + __req.peer_address = NULL; + } + __rpc_string __rpcpre_shared_key = {(char *)pre_shared_key}; + __rpc_string *p__rpcpre_shared_key = (pre_shared_key) ? &__rpcpre_shared_key : NULL; + __req.pre_shared_key = p__rpcpre_shared_key; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WDS_SET_PSK_REMOTE, + (xdrproc_t)xdr_qcsapi_wds_set_psk_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wds_set_psk_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wds_set_psk call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wds_set_psk_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wds_set_psk_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wds_set_mode(const char * ifname, const qcsapi_mac_addr peer_address, const int mode) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wds_set_mode_rpcdata __req; + struct qcsapi_wds_set_mode_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + struct __rpc_qcsapi_mac_addr __rpcpeer_address; + if (peer_address) { + memcpy(__rpcpeer_address.data, peer_address, sizeof(__rpcpeer_address)); + __req.peer_address = &__rpcpeer_address; + } else { + __req.peer_address = NULL; + } + __req.mode = (int)mode; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WDS_SET_MODE_REMOTE, + (xdrproc_t)xdr_qcsapi_wds_set_mode_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wds_set_mode_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wds_set_mode call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wds_set_mode_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wds_set_mode_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wds_get_mode(const char * ifname, const int index, int * mode) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wds_get_mode_rpcdata __req; + struct qcsapi_wds_get_mode_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.index = (int)index; + + __req.mode = (int *)mode; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WDS_GET_MODE_REMOTE, + (xdrproc_t)xdr_qcsapi_wds_get_mode_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wds_get_mode_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wds_get_mode call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wds_get_mode_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (mode) + *mode = *__resp.mode; + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wds_get_mode_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_set_extender_params(const char * ifname, const qcsapi_extender_type type, const int param_value) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_set_extender_params_rpcdata __req; + struct qcsapi_wifi_set_extender_params_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.type = (int)type; + + __req.param_value = (int)param_value; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_SET_EXTENDER_PARAMS_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_set_extender_params_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_set_extender_params_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_set_extender_params call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_set_extender_params_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_set_extender_params_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_get_extender_params(const char * ifname, const qcsapi_extender_type type, int * p_value) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_get_extender_params_rpcdata __req; + struct qcsapi_wifi_get_extender_params_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.type = (int)type; + + __req.p_value = (int *)p_value; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_GET_EXTENDER_PARAMS_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_get_extender_params_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_get_extender_params_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_get_extender_params call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_extender_params_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (p_value) + *p_value = *__resp.p_value; + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_extender_params_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_get_beacon_type(const char * ifname, char * p_current_beacon) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_get_beacon_type_rpcdata __req; + struct qcsapi_wifi_get_beacon_type_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __rpc_string __rpcp_current_beacon = {(char *)p_current_beacon}; + __rpc_string *p__rpcp_current_beacon = (p_current_beacon) ? &__rpcp_current_beacon : NULL; + __req.p_current_beacon = p__rpcp_current_beacon; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_GET_BEACON_TYPE_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_get_beacon_type_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_get_beacon_type_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_get_beacon_type call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_beacon_type_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (p_current_beacon && __resp.p_current_beacon) + strcpy(p_current_beacon, __resp.p_current_beacon->data); + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_beacon_type_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_set_beacon_type(const char * ifname, const char * p_new_beacon) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_set_beacon_type_rpcdata __req; + struct qcsapi_wifi_set_beacon_type_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __rpc_string __rpcp_new_beacon = {(char *)p_new_beacon}; + __rpc_string *p__rpcp_new_beacon = (p_new_beacon) ? &__rpcp_new_beacon : NULL; + __req.p_new_beacon = p__rpcp_new_beacon; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_SET_BEACON_TYPE_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_set_beacon_type_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_set_beacon_type_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_set_beacon_type call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_set_beacon_type_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_set_beacon_type_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_get_WEP_key_index(const char * ifname, qcsapi_unsigned_int * p_key_index) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_get_WEP_key_index_rpcdata __req; + struct qcsapi_wifi_get_WEP_key_index_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.p_key_index = (unsigned int *)p_key_index; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_GET_WEP_KEY_INDEX_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_get_WEP_key_index_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_get_WEP_key_index_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_get_WEP_key_index call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_WEP_key_index_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (p_key_index) + *p_key_index = *__resp.p_key_index; + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_WEP_key_index_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_set_WEP_key_index(const char * ifname, const qcsapi_unsigned_int key_index) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_set_WEP_key_index_rpcdata __req; + struct qcsapi_wifi_set_WEP_key_index_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.key_index = (unsigned int)key_index; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_SET_WEP_KEY_INDEX_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_set_WEP_key_index_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_set_WEP_key_index_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_set_WEP_key_index call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_set_WEP_key_index_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_set_WEP_key_index_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_get_WEP_key_passphrase(const char * ifname, string_64 current_passphrase) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_get_WEP_key_passphrase_rpcdata __req; + struct qcsapi_wifi_get_WEP_key_passphrase_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __rpc_string __rpccurrent_passphrase = {(char *)current_passphrase}; + __rpc_string *p__rpccurrent_passphrase = (current_passphrase) ? &__rpccurrent_passphrase : NULL; + __req.current_passphrase = p__rpccurrent_passphrase; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_GET_WEP_KEY_PASSPHRASE_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_get_WEP_key_passphrase_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_get_WEP_key_passphrase_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_get_WEP_key_passphrase call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_WEP_key_passphrase_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (current_passphrase && __resp.current_passphrase) + strcpy(current_passphrase, __resp.current_passphrase->data); + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_WEP_key_passphrase_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_set_WEP_key_passphrase(const char * ifname, const string_64 new_passphrase) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_set_WEP_key_passphrase_rpcdata __req; + struct qcsapi_wifi_set_WEP_key_passphrase_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __rpc_string __rpcnew_passphrase = {(char *)new_passphrase}; + __rpc_string *p__rpcnew_passphrase = (new_passphrase) ? &__rpcnew_passphrase : NULL; + __req.new_passphrase = p__rpcnew_passphrase; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_SET_WEP_KEY_PASSPHRASE_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_set_WEP_key_passphrase_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_set_WEP_key_passphrase_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_set_WEP_key_passphrase call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_set_WEP_key_passphrase_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_set_WEP_key_passphrase_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_get_WEP_encryption_level(const char * ifname, string_64 current_encryption_level) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_get_WEP_encryption_level_rpcdata __req; + struct qcsapi_wifi_get_WEP_encryption_level_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __rpc_string __rpccurrent_encryption_level = {(char *)current_encryption_level}; + __rpc_string *p__rpccurrent_encryption_level = (current_encryption_level) ? &__rpccurrent_encryption_level : NULL; + __req.current_encryption_level = p__rpccurrent_encryption_level; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_GET_WEP_ENCRYPTION_LEVEL_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_get_WEP_encryption_level_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_get_WEP_encryption_level_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_get_WEP_encryption_level call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_WEP_encryption_level_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (current_encryption_level && __resp.current_encryption_level) + strcpy(current_encryption_level, __resp.current_encryption_level->data); + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_WEP_encryption_level_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_get_basic_encryption_modes(const char * ifname, string_32 encryption_modes) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_get_basic_encryption_modes_rpcdata __req; + struct qcsapi_wifi_get_basic_encryption_modes_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __rpc_string __rpcencryption_modes = {(char *)encryption_modes}; + __rpc_string *p__rpcencryption_modes = (encryption_modes) ? &__rpcencryption_modes : NULL; + __req.encryption_modes = p__rpcencryption_modes; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_GET_BASIC_ENCRYPTION_MODES_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_get_basic_encryption_modes_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_get_basic_encryption_modes_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_get_basic_encryption_modes call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_basic_encryption_modes_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (encryption_modes && __resp.encryption_modes) + strcpy(encryption_modes, __resp.encryption_modes->data); + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_basic_encryption_modes_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_set_basic_encryption_modes(const char * ifname, const string_32 encryption_modes) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_set_basic_encryption_modes_rpcdata __req; + struct qcsapi_wifi_set_basic_encryption_modes_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __rpc_string __rpcencryption_modes = {(char *)encryption_modes}; + __rpc_string *p__rpcencryption_modes = (encryption_modes) ? &__rpcencryption_modes : NULL; + __req.encryption_modes = p__rpcencryption_modes; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_SET_BASIC_ENCRYPTION_MODES_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_set_basic_encryption_modes_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_set_basic_encryption_modes_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_set_basic_encryption_modes call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_set_basic_encryption_modes_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_set_basic_encryption_modes_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_get_basic_authentication_mode(const char * ifname, string_32 authentication_mode) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_get_basic_authentication_mode_rpcdata __req; + struct qcsapi_wifi_get_basic_authentication_mode_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __rpc_string __rpcauthentication_mode = {(char *)authentication_mode}; + __rpc_string *p__rpcauthentication_mode = (authentication_mode) ? &__rpcauthentication_mode : NULL; + __req.authentication_mode = p__rpcauthentication_mode; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_GET_BASIC_AUTHENTICATION_MODE_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_get_basic_authentication_mode_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_get_basic_authentication_mode_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_get_basic_authentication_mode call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_basic_authentication_mode_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (authentication_mode && __resp.authentication_mode) + strcpy(authentication_mode, __resp.authentication_mode->data); + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_basic_authentication_mode_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_set_basic_authentication_mode(const char * ifname, const string_32 authentication_mode) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_set_basic_authentication_mode_rpcdata __req; + struct qcsapi_wifi_set_basic_authentication_mode_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __rpc_string __rpcauthentication_mode = {(char *)authentication_mode}; + __rpc_string *p__rpcauthentication_mode = (authentication_mode) ? &__rpcauthentication_mode : NULL; + __req.authentication_mode = p__rpcauthentication_mode; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_SET_BASIC_AUTHENTICATION_MODE_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_set_basic_authentication_mode_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_set_basic_authentication_mode_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_set_basic_authentication_mode call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_set_basic_authentication_mode_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_set_basic_authentication_mode_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_get_WEP_key(const char * ifname, qcsapi_unsigned_int key_index, string_64 current_passphrase) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_get_WEP_key_rpcdata __req; + struct qcsapi_wifi_get_WEP_key_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.key_index = (unsigned int)key_index; + + __rpc_string __rpccurrent_passphrase = {(char *)current_passphrase}; + __rpc_string *p__rpccurrent_passphrase = (current_passphrase) ? &__rpccurrent_passphrase : NULL; + __req.current_passphrase = p__rpccurrent_passphrase; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_GET_WEP_KEY_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_get_WEP_key_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_get_WEP_key_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_get_WEP_key call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_WEP_key_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (current_passphrase && __resp.current_passphrase) + strcpy(current_passphrase, __resp.current_passphrase->data); + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_WEP_key_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_set_WEP_key(const char * ifname, qcsapi_unsigned_int key_index, const string_64 new_passphrase) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_set_WEP_key_rpcdata __req; + struct qcsapi_wifi_set_WEP_key_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.key_index = (unsigned int)key_index; + + __rpc_string __rpcnew_passphrase = {(char *)new_passphrase}; + __rpc_string *p__rpcnew_passphrase = (new_passphrase) ? &__rpcnew_passphrase : NULL; + __req.new_passphrase = p__rpcnew_passphrase; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_SET_WEP_KEY_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_set_WEP_key_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_set_WEP_key_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_set_WEP_key call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_set_WEP_key_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_set_WEP_key_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_get_WPA_encryption_modes(const char * ifname, string_32 encryption_modes) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_get_WPA_encryption_modes_rpcdata __req; + struct qcsapi_wifi_get_WPA_encryption_modes_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __rpc_string __rpcencryption_modes = {(char *)encryption_modes}; + __rpc_string *p__rpcencryption_modes = (encryption_modes) ? &__rpcencryption_modes : NULL; + __req.encryption_modes = p__rpcencryption_modes; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_GET_WPA_ENCRYPTION_MODES_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_get_WPA_encryption_modes_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_get_WPA_encryption_modes_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_get_WPA_encryption_modes call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_WPA_encryption_modes_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (encryption_modes && __resp.encryption_modes) + strcpy(encryption_modes, __resp.encryption_modes->data); + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_WPA_encryption_modes_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_set_WPA_encryption_modes(const char * ifname, const string_32 encryption_modes) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_set_WPA_encryption_modes_rpcdata __req; + struct qcsapi_wifi_set_WPA_encryption_modes_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __rpc_string __rpcencryption_modes = {(char *)encryption_modes}; + __rpc_string *p__rpcencryption_modes = (encryption_modes) ? &__rpcencryption_modes : NULL; + __req.encryption_modes = p__rpcencryption_modes; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_SET_WPA_ENCRYPTION_MODES_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_set_WPA_encryption_modes_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_set_WPA_encryption_modes_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_set_WPA_encryption_modes call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_set_WPA_encryption_modes_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_set_WPA_encryption_modes_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_get_WPA_authentication_mode(const char * ifname, string_32 authentication_mode) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_get_WPA_authentication_mode_rpcdata __req; + struct qcsapi_wifi_get_WPA_authentication_mode_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __rpc_string __rpcauthentication_mode = {(char *)authentication_mode}; + __rpc_string *p__rpcauthentication_mode = (authentication_mode) ? &__rpcauthentication_mode : NULL; + __req.authentication_mode = p__rpcauthentication_mode; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_GET_WPA_AUTHENTICATION_MODE_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_get_WPA_authentication_mode_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_get_WPA_authentication_mode_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_get_WPA_authentication_mode call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_WPA_authentication_mode_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (authentication_mode && __resp.authentication_mode) + strcpy(authentication_mode, __resp.authentication_mode->data); + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_WPA_authentication_mode_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_set_WPA_authentication_mode(const char * ifname, const string_32 authentication_mode) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_set_WPA_authentication_mode_rpcdata __req; + struct qcsapi_wifi_set_WPA_authentication_mode_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __rpc_string __rpcauthentication_mode = {(char *)authentication_mode}; + __rpc_string *p__rpcauthentication_mode = (authentication_mode) ? &__rpcauthentication_mode : NULL; + __req.authentication_mode = p__rpcauthentication_mode; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_SET_WPA_AUTHENTICATION_MODE_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_set_WPA_authentication_mode_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_set_WPA_authentication_mode_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_set_WPA_authentication_mode call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_set_WPA_authentication_mode_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_set_WPA_authentication_mode_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_get_interworking(const char * ifname, string_32 interworking) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_get_interworking_rpcdata __req; + struct qcsapi_wifi_get_interworking_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __rpc_string __rpcinterworking = {(char *)interworking}; + __rpc_string *p__rpcinterworking = (interworking) ? &__rpcinterworking : NULL; + __req.interworking = p__rpcinterworking; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_GET_INTERWORKING_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_get_interworking_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_get_interworking_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_get_interworking call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_interworking_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (interworking && __resp.interworking) + strcpy(interworking, __resp.interworking->data); + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_interworking_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_set_interworking(const char * ifname, const string_32 interworking) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_set_interworking_rpcdata __req; + struct qcsapi_wifi_set_interworking_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __rpc_string __rpcinterworking = {(char *)interworking}; + __rpc_string *p__rpcinterworking = (interworking) ? &__rpcinterworking : NULL; + __req.interworking = p__rpcinterworking; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_SET_INTERWORKING_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_set_interworking_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_set_interworking_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_set_interworking call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_set_interworking_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_set_interworking_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_get_80211u_params(const char * ifname, const string_32 u_param, string_256 p_buffer) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_get_80211u_params_rpcdata __req; + struct qcsapi_wifi_get_80211u_params_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __rpc_string __rpcu_param = {(char *)u_param}; + __rpc_string *p__rpcu_param = (u_param) ? &__rpcu_param : NULL; + __req.u_param = p__rpcu_param; + + __rpc_string __rpcp_buffer = {(char *)p_buffer}; + __rpc_string *p__rpcp_buffer = (p_buffer) ? &__rpcp_buffer : NULL; + __req.p_buffer = p__rpcp_buffer; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_GET_80211U_PARAMS_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_get_80211u_params_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_get_80211u_params_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_get_80211u_params call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_80211u_params_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (p_buffer && __resp.p_buffer) + strcpy(p_buffer, __resp.p_buffer->data); + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_80211u_params_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_set_80211u_params(const char * ifname, const string_32 param, const string_256 value1, const string_32 value2) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_set_80211u_params_rpcdata __req; + struct qcsapi_wifi_set_80211u_params_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __rpc_string __rpcparam = {(char *)param}; + __rpc_string *p__rpcparam = (param) ? &__rpcparam : NULL; + __req.param = p__rpcparam; + + __rpc_string __rpcvalue1 = {(char *)value1}; + __rpc_string *p__rpcvalue1 = (value1) ? &__rpcvalue1 : NULL; + __req.value1 = p__rpcvalue1; + + __rpc_string __rpcvalue2 = {(char *)value2}; + __rpc_string *p__rpcvalue2 = (value2) ? &__rpcvalue2 : NULL; + __req.value2 = p__rpcvalue2; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_SET_80211U_PARAMS_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_set_80211u_params_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_set_80211u_params_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_set_80211u_params call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_set_80211u_params_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_set_80211u_params_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_security_get_nai_realms(const char * ifname, string_4096 p_value) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_security_get_nai_realms_rpcdata __req; + struct qcsapi_security_get_nai_realms_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __rpc_string __rpcp_value = {(char *)p_value}; + __rpc_string *p__rpcp_value = (p_value) ? &__rpcp_value : NULL; + __req.p_value = p__rpcp_value; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_SECURITY_GET_NAI_REALMS_REMOTE, + (xdrproc_t)xdr_qcsapi_security_get_nai_realms_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_security_get_nai_realms_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_security_get_nai_realms call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_security_get_nai_realms_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (p_value && __resp.p_value) + strcpy(p_value, __resp.p_value->data); + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_security_get_nai_realms_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_security_add_nai_realm(const char * ifname, const int encoding, const char * nai_realm, const char * eap_method) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_security_add_nai_realm_rpcdata __req; + struct qcsapi_security_add_nai_realm_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.encoding = (int)encoding; + + __rpc_string __rpcnai_realm = {(char *)nai_realm}; + __rpc_string *p__rpcnai_realm = (nai_realm) ? &__rpcnai_realm : NULL; + __req.nai_realm = p__rpcnai_realm; + + __rpc_string __rpceap_method = {(char *)eap_method}; + __rpc_string *p__rpceap_method = (eap_method) ? &__rpceap_method : NULL; + __req.eap_method = p__rpceap_method; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_SECURITY_ADD_NAI_REALM_REMOTE, + (xdrproc_t)xdr_qcsapi_security_add_nai_realm_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_security_add_nai_realm_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_security_add_nai_realm call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_security_add_nai_realm_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_security_add_nai_realm_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_security_del_nai_realm(const char * ifname, const char * nai_realm) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_security_del_nai_realm_rpcdata __req; + struct qcsapi_security_del_nai_realm_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __rpc_string __rpcnai_realm = {(char *)nai_realm}; + __rpc_string *p__rpcnai_realm = (nai_realm) ? &__rpcnai_realm : NULL; + __req.nai_realm = p__rpcnai_realm; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_SECURITY_DEL_NAI_REALM_REMOTE, + (xdrproc_t)xdr_qcsapi_security_del_nai_realm_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_security_del_nai_realm_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_security_del_nai_realm call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_security_del_nai_realm_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_security_del_nai_realm_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_security_get_roaming_consortium(const char * ifname, string_1024 p_value) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_security_get_roaming_consortium_rpcdata __req; + struct qcsapi_security_get_roaming_consortium_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __rpc_string __rpcp_value = {(char *)p_value}; + __rpc_string *p__rpcp_value = (p_value) ? &__rpcp_value : NULL; + __req.p_value = p__rpcp_value; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_SECURITY_GET_ROAMING_CONSORTIUM_REMOTE, + (xdrproc_t)xdr_qcsapi_security_get_roaming_consortium_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_security_get_roaming_consortium_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_security_get_roaming_consortium call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_security_get_roaming_consortium_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (p_value && __resp.p_value) + strcpy(p_value, __resp.p_value->data); + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_security_get_roaming_consortium_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_security_add_roaming_consortium(const char * ifname, const char * p_value) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_security_add_roaming_consortium_rpcdata __req; + struct qcsapi_security_add_roaming_consortium_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __rpc_string __rpcp_value = {(char *)p_value}; + __rpc_string *p__rpcp_value = (p_value) ? &__rpcp_value : NULL; + __req.p_value = p__rpcp_value; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_SECURITY_ADD_ROAMING_CONSORTIUM_REMOTE, + (xdrproc_t)xdr_qcsapi_security_add_roaming_consortium_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_security_add_roaming_consortium_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_security_add_roaming_consortium call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_security_add_roaming_consortium_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_security_add_roaming_consortium_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_security_del_roaming_consortium(const char * ifname, const char * p_value) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_security_del_roaming_consortium_rpcdata __req; + struct qcsapi_security_del_roaming_consortium_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __rpc_string __rpcp_value = {(char *)p_value}; + __rpc_string *p__rpcp_value = (p_value) ? &__rpcp_value : NULL; + __req.p_value = p__rpcp_value; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_SECURITY_DEL_ROAMING_CONSORTIUM_REMOTE, + (xdrproc_t)xdr_qcsapi_security_del_roaming_consortium_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_security_del_roaming_consortium_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_security_del_roaming_consortium call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_security_del_roaming_consortium_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_security_del_roaming_consortium_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_security_get_venue_name(const char * ifname, string_4096 p_value) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_security_get_venue_name_rpcdata __req; + struct qcsapi_security_get_venue_name_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __rpc_string __rpcp_value = {(char *)p_value}; + __rpc_string *p__rpcp_value = (p_value) ? &__rpcp_value : NULL; + __req.p_value = p__rpcp_value; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_SECURITY_GET_VENUE_NAME_REMOTE, + (xdrproc_t)xdr_qcsapi_security_get_venue_name_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_security_get_venue_name_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_security_get_venue_name call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_security_get_venue_name_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (p_value && __resp.p_value) + strcpy(p_value, __resp.p_value->data); + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_security_get_venue_name_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_security_add_venue_name(const char * ifname, const char * lang_code, const char * venue_name) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_security_add_venue_name_rpcdata __req; + struct qcsapi_security_add_venue_name_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __rpc_string __rpclang_code = {(char *)lang_code}; + __rpc_string *p__rpclang_code = (lang_code) ? &__rpclang_code : NULL; + __req.lang_code = p__rpclang_code; + + __rpc_string __rpcvenue_name = {(char *)venue_name}; + __rpc_string *p__rpcvenue_name = (venue_name) ? &__rpcvenue_name : NULL; + __req.venue_name = p__rpcvenue_name; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_SECURITY_ADD_VENUE_NAME_REMOTE, + (xdrproc_t)xdr_qcsapi_security_add_venue_name_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_security_add_venue_name_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_security_add_venue_name call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_security_add_venue_name_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_security_add_venue_name_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_security_del_venue_name(const char * ifname, const char * lang_code, const char * venue_name) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_security_del_venue_name_rpcdata __req; + struct qcsapi_security_del_venue_name_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __rpc_string __rpclang_code = {(char *)lang_code}; + __rpc_string *p__rpclang_code = (lang_code) ? &__rpclang_code : NULL; + __req.lang_code = p__rpclang_code; + + __rpc_string __rpcvenue_name = {(char *)venue_name}; + __rpc_string *p__rpcvenue_name = (venue_name) ? &__rpcvenue_name : NULL; + __req.venue_name = p__rpcvenue_name; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_SECURITY_DEL_VENUE_NAME_REMOTE, + (xdrproc_t)xdr_qcsapi_security_del_venue_name_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_security_del_venue_name_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_security_del_venue_name call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_security_del_venue_name_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_security_del_venue_name_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_security_get_oper_friendly_name(const char * ifname, string_4096 p_value) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_security_get_oper_friendly_name_rpcdata __req; + struct qcsapi_security_get_oper_friendly_name_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __rpc_string __rpcp_value = {(char *)p_value}; + __rpc_string *p__rpcp_value = (p_value) ? &__rpcp_value : NULL; + __req.p_value = p__rpcp_value; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_SECURITY_GET_OPER_FRIENDLY_NAME_REMOTE, + (xdrproc_t)xdr_qcsapi_security_get_oper_friendly_name_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_security_get_oper_friendly_name_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_security_get_oper_friendly_name call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_security_get_oper_friendly_name_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (p_value && __resp.p_value) + strcpy(p_value, __resp.p_value->data); + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_security_get_oper_friendly_name_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_security_add_oper_friendly_name(const char * ifname, const char * lang_code, const char * oper_friendly_name) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_security_add_oper_friendly_name_rpcdata __req; + struct qcsapi_security_add_oper_friendly_name_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __rpc_string __rpclang_code = {(char *)lang_code}; + __rpc_string *p__rpclang_code = (lang_code) ? &__rpclang_code : NULL; + __req.lang_code = p__rpclang_code; + + __rpc_string __rpcoper_friendly_name = {(char *)oper_friendly_name}; + __rpc_string *p__rpcoper_friendly_name = (oper_friendly_name) ? &__rpcoper_friendly_name : NULL; + __req.oper_friendly_name = p__rpcoper_friendly_name; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_SECURITY_ADD_OPER_FRIENDLY_NAME_REMOTE, + (xdrproc_t)xdr_qcsapi_security_add_oper_friendly_name_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_security_add_oper_friendly_name_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_security_add_oper_friendly_name call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_security_add_oper_friendly_name_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_security_add_oper_friendly_name_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_security_del_oper_friendly_name(const char * ifname, const char * lang_code, const char * oper_friendly_name) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_security_del_oper_friendly_name_rpcdata __req; + struct qcsapi_security_del_oper_friendly_name_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __rpc_string __rpclang_code = {(char *)lang_code}; + __rpc_string *p__rpclang_code = (lang_code) ? &__rpclang_code : NULL; + __req.lang_code = p__rpclang_code; + + __rpc_string __rpcoper_friendly_name = {(char *)oper_friendly_name}; + __rpc_string *p__rpcoper_friendly_name = (oper_friendly_name) ? &__rpcoper_friendly_name : NULL; + __req.oper_friendly_name = p__rpcoper_friendly_name; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_SECURITY_DEL_OPER_FRIENDLY_NAME_REMOTE, + (xdrproc_t)xdr_qcsapi_security_del_oper_friendly_name_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_security_del_oper_friendly_name_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_security_del_oper_friendly_name call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_security_del_oper_friendly_name_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_security_del_oper_friendly_name_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_security_get_hs20_conn_capab(const char * ifname, string_4096 p_value) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_security_get_hs20_conn_capab_rpcdata __req; + struct qcsapi_security_get_hs20_conn_capab_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __rpc_string __rpcp_value = {(char *)p_value}; + __rpc_string *p__rpcp_value = (p_value) ? &__rpcp_value : NULL; + __req.p_value = p__rpcp_value; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_SECURITY_GET_HS20_CONN_CAPAB_REMOTE, + (xdrproc_t)xdr_qcsapi_security_get_hs20_conn_capab_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_security_get_hs20_conn_capab_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_security_get_hs20_conn_capab call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_security_get_hs20_conn_capab_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (p_value && __resp.p_value) + strcpy(p_value, __resp.p_value->data); + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_security_get_hs20_conn_capab_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_security_add_hs20_conn_capab(const char * ifname, const char * ip_proto, const char * port_num, const char * status) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_security_add_hs20_conn_capab_rpcdata __req; + struct qcsapi_security_add_hs20_conn_capab_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __rpc_string __rpcip_proto = {(char *)ip_proto}; + __rpc_string *p__rpcip_proto = (ip_proto) ? &__rpcip_proto : NULL; + __req.ip_proto = p__rpcip_proto; + + __rpc_string __rpcport_num = {(char *)port_num}; + __rpc_string *p__rpcport_num = (port_num) ? &__rpcport_num : NULL; + __req.port_num = p__rpcport_num; + + __rpc_string __rpcstatus = {(char *)status}; + __rpc_string *p__rpcstatus = (status) ? &__rpcstatus : NULL; + __req.status = p__rpcstatus; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_SECURITY_ADD_HS20_CONN_CAPAB_REMOTE, + (xdrproc_t)xdr_qcsapi_security_add_hs20_conn_capab_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_security_add_hs20_conn_capab_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_security_add_hs20_conn_capab call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_security_add_hs20_conn_capab_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_security_add_hs20_conn_capab_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_security_del_hs20_conn_capab(const char * ifname, const char * ip_proto, const char * port_num, const char * status) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_security_del_hs20_conn_capab_rpcdata __req; + struct qcsapi_security_del_hs20_conn_capab_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __rpc_string __rpcip_proto = {(char *)ip_proto}; + __rpc_string *p__rpcip_proto = (ip_proto) ? &__rpcip_proto : NULL; + __req.ip_proto = p__rpcip_proto; + + __rpc_string __rpcport_num = {(char *)port_num}; + __rpc_string *p__rpcport_num = (port_num) ? &__rpcport_num : NULL; + __req.port_num = p__rpcport_num; + + __rpc_string __rpcstatus = {(char *)status}; + __rpc_string *p__rpcstatus = (status) ? &__rpcstatus : NULL; + __req.status = p__rpcstatus; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_SECURITY_DEL_HS20_CONN_CAPAB_REMOTE, + (xdrproc_t)xdr_qcsapi_security_del_hs20_conn_capab_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_security_del_hs20_conn_capab_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_security_del_hs20_conn_capab call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_security_del_hs20_conn_capab_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_security_del_hs20_conn_capab_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_get_hs20_status(const char * ifname, string_32 p_hs20) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_get_hs20_status_rpcdata __req; + struct qcsapi_wifi_get_hs20_status_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __rpc_string __rpcp_hs20 = {(char *)p_hs20}; + __rpc_string *p__rpcp_hs20 = (p_hs20) ? &__rpcp_hs20 : NULL; + __req.p_hs20 = p__rpcp_hs20; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_GET_HS20_STATUS_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_get_hs20_status_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_get_hs20_status_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_get_hs20_status call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_hs20_status_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (p_hs20 && __resp.p_hs20) + strcpy(p_hs20, __resp.p_hs20->data); + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_hs20_status_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_set_hs20_status(const char * ifname, const string_32 hs20_val) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_set_hs20_status_rpcdata __req; + struct qcsapi_wifi_set_hs20_status_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __rpc_string __rpchs20_val = {(char *)hs20_val}; + __rpc_string *p__rpchs20_val = (hs20_val) ? &__rpchs20_val : NULL; + __req.hs20_val = p__rpchs20_val; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_SET_HS20_STATUS_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_set_hs20_status_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_set_hs20_status_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_set_hs20_status call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_set_hs20_status_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_set_hs20_status_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_get_proxy_arp(const char * ifname, string_32 p_proxy_arp) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_get_proxy_arp_rpcdata __req; + struct qcsapi_wifi_get_proxy_arp_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __rpc_string __rpcp_proxy_arp = {(char *)p_proxy_arp}; + __rpc_string *p__rpcp_proxy_arp = (p_proxy_arp) ? &__rpcp_proxy_arp : NULL; + __req.p_proxy_arp = p__rpcp_proxy_arp; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_GET_PROXY_ARP_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_get_proxy_arp_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_get_proxy_arp_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_get_proxy_arp call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_proxy_arp_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (p_proxy_arp && __resp.p_proxy_arp) + strcpy(p_proxy_arp, __resp.p_proxy_arp->data); + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_proxy_arp_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_set_proxy_arp(const char * ifname, const string_32 proxy_arp_val) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_set_proxy_arp_rpcdata __req; + struct qcsapi_wifi_set_proxy_arp_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __rpc_string __rpcproxy_arp_val = {(char *)proxy_arp_val}; + __rpc_string *p__rpcproxy_arp_val = (proxy_arp_val) ? &__rpcproxy_arp_val : NULL; + __req.proxy_arp_val = p__rpcproxy_arp_val; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_SET_PROXY_ARP_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_set_proxy_arp_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_set_proxy_arp_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_set_proxy_arp call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_set_proxy_arp_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_set_proxy_arp_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_get_l2_ext_filter(const char * ifname, const string_32 param, string_32 value) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_get_l2_ext_filter_rpcdata __req; + struct qcsapi_wifi_get_l2_ext_filter_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __rpc_string __rpcparam = {(char *)param}; + __rpc_string *p__rpcparam = (param) ? &__rpcparam : NULL; + __req.param = p__rpcparam; + + __rpc_string __rpcvalue = {(char *)value}; + __rpc_string *p__rpcvalue = (value) ? &__rpcvalue : NULL; + __req.value = p__rpcvalue; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_GET_L2_EXT_FILTER_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_get_l2_ext_filter_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_get_l2_ext_filter_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_get_l2_ext_filter call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_l2_ext_filter_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (value && __resp.value) + strcpy(value, __resp.value->data); + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_l2_ext_filter_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_set_l2_ext_filter(const char * ifname, const string_32 param, const string_32 value) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_set_l2_ext_filter_rpcdata __req; + struct qcsapi_wifi_set_l2_ext_filter_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __rpc_string __rpcparam = {(char *)param}; + __rpc_string *p__rpcparam = (param) ? &__rpcparam : NULL; + __req.param = p__rpcparam; + + __rpc_string __rpcvalue = {(char *)value}; + __rpc_string *p__rpcvalue = (value) ? &__rpcvalue : NULL; + __req.value = p__rpcvalue; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_SET_L2_EXT_FILTER_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_set_l2_ext_filter_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_set_l2_ext_filter_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_set_l2_ext_filter call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_set_l2_ext_filter_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_set_l2_ext_filter_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_get_hs20_params(const char * ifname, const string_32 hs_param, string_32 p_buffer) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_get_hs20_params_rpcdata __req; + struct qcsapi_wifi_get_hs20_params_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __rpc_string __rpchs_param = {(char *)hs_param}; + __rpc_string *p__rpchs_param = (hs_param) ? &__rpchs_param : NULL; + __req.hs_param = p__rpchs_param; + + __rpc_string __rpcp_buffer = {(char *)p_buffer}; + __rpc_string *p__rpcp_buffer = (p_buffer) ? &__rpcp_buffer : NULL; + __req.p_buffer = p__rpcp_buffer; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_GET_HS20_PARAMS_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_get_hs20_params_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_get_hs20_params_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_get_hs20_params call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_hs20_params_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (p_buffer && __resp.p_buffer) + strcpy(p_buffer, __resp.p_buffer->data); + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_hs20_params_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_set_hs20_params(const char * ifname, const string_32 hs_param, const string_64 value1, const string_64 value2, const string_64 value3, const string_64 value4, const string_64 value5, const string_64 value6) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_set_hs20_params_rpcdata __req; + struct qcsapi_wifi_set_hs20_params_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __rpc_string __rpchs_param = {(char *)hs_param}; + __rpc_string *p__rpchs_param = (hs_param) ? &__rpchs_param : NULL; + __req.hs_param = p__rpchs_param; + + __rpc_string __rpcvalue1 = {(char *)value1}; + __rpc_string *p__rpcvalue1 = (value1) ? &__rpcvalue1 : NULL; + __req.value1 = p__rpcvalue1; + + __rpc_string __rpcvalue2 = {(char *)value2}; + __rpc_string *p__rpcvalue2 = (value2) ? &__rpcvalue2 : NULL; + __req.value2 = p__rpcvalue2; + + __rpc_string __rpcvalue3 = {(char *)value3}; + __rpc_string *p__rpcvalue3 = (value3) ? &__rpcvalue3 : NULL; + __req.value3 = p__rpcvalue3; + + __rpc_string __rpcvalue4 = {(char *)value4}; + __rpc_string *p__rpcvalue4 = (value4) ? &__rpcvalue4 : NULL; + __req.value4 = p__rpcvalue4; + + __rpc_string __rpcvalue5 = {(char *)value5}; + __rpc_string *p__rpcvalue5 = (value5) ? &__rpcvalue5 : NULL; + __req.value5 = p__rpcvalue5; + + __rpc_string __rpcvalue6 = {(char *)value6}; + __rpc_string *p__rpcvalue6 = (value6) ? &__rpcvalue6 : NULL; + __req.value6 = p__rpcvalue6; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_SET_HS20_PARAMS_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_set_hs20_params_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_set_hs20_params_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_set_hs20_params call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_set_hs20_params_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_set_hs20_params_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_remove_11u_param(const char * ifname, const string_64 param) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_remove_11u_param_rpcdata __req; + struct qcsapi_remove_11u_param_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __rpc_string __rpcparam = {(char *)param}; + __rpc_string *p__rpcparam = (param) ? &__rpcparam : NULL; + __req.param = p__rpcparam; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_REMOVE_11U_PARAM_REMOTE, + (xdrproc_t)xdr_qcsapi_remove_11u_param_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_remove_11u_param_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_remove_11u_param call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_remove_11u_param_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_remove_11u_param_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_remove_hs20_param(const char * ifname, const string_64 hs_param) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_remove_hs20_param_rpcdata __req; + struct qcsapi_remove_hs20_param_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __rpc_string __rpchs_param = {(char *)hs_param}; + __rpc_string *p__rpchs_param = (hs_param) ? &__rpchs_param : NULL; + __req.hs_param = p__rpchs_param; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_REMOVE_HS20_PARAM_REMOTE, + (xdrproc_t)xdr_qcsapi_remove_hs20_param_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_remove_hs20_param_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_remove_hs20_param call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_remove_hs20_param_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_remove_hs20_param_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_get_IEEE11i_encryption_modes(const char * ifname, string_32 encryption_modes) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_get_IEEE11i_encryption_modes_rpcdata __req; + struct qcsapi_wifi_get_IEEE11i_encryption_modes_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __rpc_string __rpcencryption_modes = {(char *)encryption_modes}; + __rpc_string *p__rpcencryption_modes = (encryption_modes) ? &__rpcencryption_modes : NULL; + __req.encryption_modes = p__rpcencryption_modes; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_GET_IEEE11I_ENCRYPTION_MODES_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_get_IEEE11i_encryption_modes_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_get_IEEE11i_encryption_modes_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_get_IEEE11i_encryption_modes call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_IEEE11i_encryption_modes_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (encryption_modes && __resp.encryption_modes) + strcpy(encryption_modes, __resp.encryption_modes->data); + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_IEEE11i_encryption_modes_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_set_IEEE11i_encryption_modes(const char * ifname, const string_32 encryption_modes) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_set_IEEE11i_encryption_modes_rpcdata __req; + struct qcsapi_wifi_set_IEEE11i_encryption_modes_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __rpc_string __rpcencryption_modes = {(char *)encryption_modes}; + __rpc_string *p__rpcencryption_modes = (encryption_modes) ? &__rpcencryption_modes : NULL; + __req.encryption_modes = p__rpcencryption_modes; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_SET_IEEE11I_ENCRYPTION_MODES_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_set_IEEE11i_encryption_modes_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_set_IEEE11i_encryption_modes_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_set_IEEE11i_encryption_modes call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_set_IEEE11i_encryption_modes_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_set_IEEE11i_encryption_modes_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_get_IEEE11i_authentication_mode(const char * ifname, string_32 authentication_mode) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_get_IEEE11i_authentication_mode_rpcdata __req; + struct qcsapi_wifi_get_IEEE11i_authentication_mode_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __rpc_string __rpcauthentication_mode = {(char *)authentication_mode}; + __rpc_string *p__rpcauthentication_mode = (authentication_mode) ? &__rpcauthentication_mode : NULL; + __req.authentication_mode = p__rpcauthentication_mode; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_GET_IEEE11I_AUTHENTICATION_MODE_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_get_IEEE11i_authentication_mode_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_get_IEEE11i_authentication_mode_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_get_IEEE11i_authentication_mode call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_IEEE11i_authentication_mode_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (authentication_mode && __resp.authentication_mode) + strcpy(authentication_mode, __resp.authentication_mode->data); + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_IEEE11i_authentication_mode_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_set_IEEE11i_authentication_mode(const char * ifname, const string_32 authentication_mode) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_set_IEEE11i_authentication_mode_rpcdata __req; + struct qcsapi_wifi_set_IEEE11i_authentication_mode_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __rpc_string __rpcauthentication_mode = {(char *)authentication_mode}; + __rpc_string *p__rpcauthentication_mode = (authentication_mode) ? &__rpcauthentication_mode : NULL; + __req.authentication_mode = p__rpcauthentication_mode; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_SET_IEEE11I_AUTHENTICATION_MODE_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_set_IEEE11i_authentication_mode_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_set_IEEE11i_authentication_mode_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_set_IEEE11i_authentication_mode call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_set_IEEE11i_authentication_mode_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_set_IEEE11i_authentication_mode_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_get_michael_errcnt(const char * ifname, uint32_t * errcount) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_get_michael_errcnt_rpcdata __req; + struct qcsapi_wifi_get_michael_errcnt_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.errcount = (uint32_t *)errcount; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_GET_MICHAEL_ERRCNT_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_get_michael_errcnt_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_get_michael_errcnt_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_get_michael_errcnt call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_michael_errcnt_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (errcount) + *errcount = *__resp.errcount; + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_michael_errcnt_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_get_pre_shared_key(const char * ifname, const qcsapi_unsigned_int key_index, string_64 pre_shared_key) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_get_pre_shared_key_rpcdata __req; + struct qcsapi_wifi_get_pre_shared_key_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.key_index = (unsigned int)key_index; + + __rpc_string __rpcpre_shared_key = {(char *)pre_shared_key}; + __rpc_string *p__rpcpre_shared_key = (pre_shared_key) ? &__rpcpre_shared_key : NULL; + __req.pre_shared_key = p__rpcpre_shared_key; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_GET_PRE_SHARED_KEY_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_get_pre_shared_key_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_get_pre_shared_key_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_get_pre_shared_key call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_pre_shared_key_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (pre_shared_key && __resp.pre_shared_key) + strcpy(pre_shared_key, __resp.pre_shared_key->data); + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_pre_shared_key_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_set_pre_shared_key(const char * ifname, const qcsapi_unsigned_int key_index, const string_64 pre_shared_key) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_set_pre_shared_key_rpcdata __req; + struct qcsapi_wifi_set_pre_shared_key_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.key_index = (unsigned int)key_index; + + __rpc_string __rpcpre_shared_key = {(char *)pre_shared_key}; + __rpc_string *p__rpcpre_shared_key = (pre_shared_key) ? &__rpcpre_shared_key : NULL; + __req.pre_shared_key = p__rpcpre_shared_key; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_SET_PRE_SHARED_KEY_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_set_pre_shared_key_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_set_pre_shared_key_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_set_pre_shared_key call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_set_pre_shared_key_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_set_pre_shared_key_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_add_radius_auth_server_cfg(const char * ifname, const char * radius_auth_server_ipaddr, const char * radius_auth_server_port, const char * radius_auth_server_sh_key) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_add_radius_auth_server_cfg_rpcdata __req; + struct qcsapi_wifi_add_radius_auth_server_cfg_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __rpc_string __rpcradius_auth_server_ipaddr = {(char *)radius_auth_server_ipaddr}; + __rpc_string *p__rpcradius_auth_server_ipaddr = (radius_auth_server_ipaddr) ? &__rpcradius_auth_server_ipaddr : NULL; + __req.radius_auth_server_ipaddr = p__rpcradius_auth_server_ipaddr; + + __rpc_string __rpcradius_auth_server_port = {(char *)radius_auth_server_port}; + __rpc_string *p__rpcradius_auth_server_port = (radius_auth_server_port) ? &__rpcradius_auth_server_port : NULL; + __req.radius_auth_server_port = p__rpcradius_auth_server_port; + + __rpc_string __rpcradius_auth_server_sh_key = {(char *)radius_auth_server_sh_key}; + __rpc_string *p__rpcradius_auth_server_sh_key = (radius_auth_server_sh_key) ? &__rpcradius_auth_server_sh_key : NULL; + __req.radius_auth_server_sh_key = p__rpcradius_auth_server_sh_key; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_ADD_RADIUS_AUTH_SERVER_CFG_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_add_radius_auth_server_cfg_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_add_radius_auth_server_cfg_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_add_radius_auth_server_cfg call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_add_radius_auth_server_cfg_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_add_radius_auth_server_cfg_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_del_radius_auth_server_cfg(const char * ifname, const char * radius_auth_server_ipaddr, const char * constp_radius_port) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_del_radius_auth_server_cfg_rpcdata __req; + struct qcsapi_wifi_del_radius_auth_server_cfg_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __rpc_string __rpcradius_auth_server_ipaddr = {(char *)radius_auth_server_ipaddr}; + __rpc_string *p__rpcradius_auth_server_ipaddr = (radius_auth_server_ipaddr) ? &__rpcradius_auth_server_ipaddr : NULL; + __req.radius_auth_server_ipaddr = p__rpcradius_auth_server_ipaddr; + + __rpc_string __rpcconstp_radius_port = {(char *)constp_radius_port}; + __rpc_string *p__rpcconstp_radius_port = (constp_radius_port) ? &__rpcconstp_radius_port : NULL; + __req.constp_radius_port = p__rpcconstp_radius_port; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_DEL_RADIUS_AUTH_SERVER_CFG_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_del_radius_auth_server_cfg_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_del_radius_auth_server_cfg_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_del_radius_auth_server_cfg call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_del_radius_auth_server_cfg_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_del_radius_auth_server_cfg_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_get_radius_auth_server_cfg(const char * ifname, string_1024 radius_auth_server_cfg) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_get_radius_auth_server_cfg_rpcdata __req; + struct qcsapi_wifi_get_radius_auth_server_cfg_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __rpc_string __rpcradius_auth_server_cfg = {(char *)radius_auth_server_cfg}; + __rpc_string *p__rpcradius_auth_server_cfg = (radius_auth_server_cfg) ? &__rpcradius_auth_server_cfg : NULL; + __req.radius_auth_server_cfg = p__rpcradius_auth_server_cfg; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_GET_RADIUS_AUTH_SERVER_CFG_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_get_radius_auth_server_cfg_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_get_radius_auth_server_cfg_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_get_radius_auth_server_cfg call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_radius_auth_server_cfg_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (radius_auth_server_cfg && __resp.radius_auth_server_cfg) + strcpy(radius_auth_server_cfg, __resp.radius_auth_server_cfg->data); + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_radius_auth_server_cfg_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_set_own_ip_addr(const char * ifname, const string_16 own_ip_addr) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_set_own_ip_addr_rpcdata __req; + struct qcsapi_wifi_set_own_ip_addr_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __rpc_string __rpcown_ip_addr = {(char *)own_ip_addr}; + __rpc_string *p__rpcown_ip_addr = (own_ip_addr) ? &__rpcown_ip_addr : NULL; + __req.own_ip_addr = p__rpcown_ip_addr; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_SET_OWN_IP_ADDR_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_set_own_ip_addr_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_set_own_ip_addr_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_set_own_ip_addr call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_set_own_ip_addr_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_set_own_ip_addr_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_get_key_passphrase(const char * ifname, const qcsapi_unsigned_int key_index, string_64 passphrase) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_get_key_passphrase_rpcdata __req; + struct qcsapi_wifi_get_key_passphrase_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.key_index = (unsigned int)key_index; + + __rpc_string __rpcpassphrase = {(char *)passphrase}; + __rpc_string *p__rpcpassphrase = (passphrase) ? &__rpcpassphrase : NULL; + __req.passphrase = p__rpcpassphrase; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_GET_KEY_PASSPHRASE_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_get_key_passphrase_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_get_key_passphrase_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_get_key_passphrase call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_key_passphrase_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (passphrase && __resp.passphrase) + strcpy(passphrase, __resp.passphrase->data); + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_key_passphrase_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_set_key_passphrase(const char * ifname, const qcsapi_unsigned_int key_index, const string_64 passphrase) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_set_key_passphrase_rpcdata __req; + struct qcsapi_wifi_set_key_passphrase_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.key_index = (unsigned int)key_index; + + __rpc_string __rpcpassphrase = {(char *)passphrase}; + __rpc_string *p__rpcpassphrase = (passphrase) ? &__rpcpassphrase : NULL; + __req.passphrase = p__rpcpassphrase; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_SET_KEY_PASSPHRASE_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_set_key_passphrase_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_set_key_passphrase_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_set_key_passphrase call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_set_key_passphrase_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_set_key_passphrase_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_get_group_key_interval(const char * ifname, string_16 group_key_interval) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_get_group_key_interval_rpcdata __req; + struct qcsapi_wifi_get_group_key_interval_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __rpc_string __rpcgroup_key_interval = {(char *)group_key_interval}; + __rpc_string *p__rpcgroup_key_interval = (group_key_interval) ? &__rpcgroup_key_interval : NULL; + __req.group_key_interval = p__rpcgroup_key_interval; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_GET_GROUP_KEY_INTERVAL_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_get_group_key_interval_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_get_group_key_interval_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_get_group_key_interval call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_group_key_interval_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (group_key_interval && __resp.group_key_interval) + strcpy(group_key_interval, __resp.group_key_interval->data); + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_group_key_interval_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_set_group_key_interval(const char * ifname, const string_16 group_key_interval) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_set_group_key_interval_rpcdata __req; + struct qcsapi_wifi_set_group_key_interval_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __rpc_string __rpcgroup_key_interval = {(char *)group_key_interval}; + __rpc_string *p__rpcgroup_key_interval = (group_key_interval) ? &__rpcgroup_key_interval : NULL; + __req.group_key_interval = p__rpcgroup_key_interval; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_SET_GROUP_KEY_INTERVAL_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_set_group_key_interval_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_set_group_key_interval_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_set_group_key_interval call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_set_group_key_interval_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_set_group_key_interval_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_get_pmf(const char * ifname, int * p_pmf_cap) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_get_pmf_rpcdata __req; + struct qcsapi_wifi_get_pmf_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.p_pmf_cap = (int *)p_pmf_cap; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_GET_PMF_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_get_pmf_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_get_pmf_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_get_pmf call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_pmf_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (p_pmf_cap) + *p_pmf_cap = *__resp.p_pmf_cap; + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_pmf_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_set_pmf(const char * ifname, int pmf_cap) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_set_pmf_rpcdata __req; + struct qcsapi_wifi_set_pmf_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.pmf_cap = (int)pmf_cap; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_SET_PMF_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_set_pmf_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_set_pmf_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_set_pmf call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_set_pmf_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_set_pmf_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_get_wpa_status(const char * ifname, char * wpa_status, const char * mac_addr, const qcsapi_unsigned_int max_len) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_get_wpa_status_rpcdata __req; + struct qcsapi_wifi_get_wpa_status_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __rpc_string __rpcwpa_status = {(char *)wpa_status}; + __rpc_string *p__rpcwpa_status = (wpa_status) ? &__rpcwpa_status : NULL; + __req.wpa_status = p__rpcwpa_status; + + __rpc_string __rpcmac_addr = {(char *)mac_addr}; + __rpc_string *p__rpcmac_addr = (mac_addr) ? &__rpcmac_addr : NULL; + __req.mac_addr = p__rpcmac_addr; + + __req.max_len = (unsigned int)max_len; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_GET_WPA_STATUS_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_get_wpa_status_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_get_wpa_status_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_get_wpa_status call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_wpa_status_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (wpa_status && __resp.wpa_status) + strcpy(wpa_status, __resp.wpa_status->data); + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_wpa_status_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_get_psk_auth_failures(const char * ifname, qcsapi_unsigned_int * count) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_get_psk_auth_failures_rpcdata __req; + struct qcsapi_wifi_get_psk_auth_failures_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.count = (unsigned int *)count; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_GET_PSK_AUTH_FAILURES_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_get_psk_auth_failures_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_get_psk_auth_failures_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_get_psk_auth_failures call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_psk_auth_failures_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (count) + *count = *__resp.count; + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_psk_auth_failures_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_get_auth_state(const char * ifname, const char * mac_addr, int * auth_state) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_get_auth_state_rpcdata __req; + struct qcsapi_wifi_get_auth_state_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __rpc_string __rpcmac_addr = {(char *)mac_addr}; + __rpc_string *p__rpcmac_addr = (mac_addr) ? &__rpcmac_addr : NULL; + __req.mac_addr = p__rpcmac_addr; + + __req.auth_state = (int *)auth_state; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_GET_AUTH_STATE_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_get_auth_state_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_get_auth_state_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_get_auth_state call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_auth_state_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (auth_state) + *auth_state = *__resp.auth_state; + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_auth_state_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_set_security_defer_mode(const char * ifname, int defer) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_set_security_defer_mode_rpcdata __req; + struct qcsapi_wifi_set_security_defer_mode_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.defer = (int)defer; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_SET_SECURITY_DEFER_MODE_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_set_security_defer_mode_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_set_security_defer_mode_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_set_security_defer_mode call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_set_security_defer_mode_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_set_security_defer_mode_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_get_security_defer_mode(const char * ifname, int * defer) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_get_security_defer_mode_rpcdata __req; + struct qcsapi_wifi_get_security_defer_mode_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.defer = (int *)defer; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_GET_SECURITY_DEFER_MODE_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_get_security_defer_mode_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_get_security_defer_mode_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_get_security_defer_mode call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_security_defer_mode_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (defer) + *defer = *__resp.defer; + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_security_defer_mode_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_apply_security_config(const char * ifname) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_apply_security_config_rpcdata __req; + struct qcsapi_wifi_apply_security_config_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_APPLY_SECURITY_CONFIG_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_apply_security_config_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_apply_security_config_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_apply_security_config call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_apply_security_config_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_apply_security_config_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_set_mac_address_filtering(const char * ifname, const qcsapi_mac_address_filtering new_mac_address_filtering) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_set_mac_address_filtering_rpcdata __req; + struct qcsapi_wifi_set_mac_address_filtering_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.new_mac_address_filtering = (int)new_mac_address_filtering; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_SET_MAC_ADDRESS_FILTERING_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_set_mac_address_filtering_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_set_mac_address_filtering_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_set_mac_address_filtering call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_set_mac_address_filtering_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_set_mac_address_filtering_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_get_mac_address_filtering(const char * ifname, qcsapi_mac_address_filtering * current_mac_address_filtering) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_get_mac_address_filtering_rpcdata __req; + struct qcsapi_wifi_get_mac_address_filtering_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.current_mac_address_filtering = (int *)current_mac_address_filtering; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_GET_MAC_ADDRESS_FILTERING_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_get_mac_address_filtering_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_get_mac_address_filtering_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_get_mac_address_filtering call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_mac_address_filtering_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (current_mac_address_filtering) + *current_mac_address_filtering = *__resp.current_mac_address_filtering; + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_mac_address_filtering_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_authorize_mac_address(const char * ifname, const qcsapi_mac_addr address_to_authorize) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_authorize_mac_address_rpcdata __req; + struct qcsapi_wifi_authorize_mac_address_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + struct __rpc_qcsapi_mac_addr __rpcaddress_to_authorize; + if (address_to_authorize) { + memcpy(__rpcaddress_to_authorize.data, address_to_authorize, sizeof(__rpcaddress_to_authorize)); + __req.address_to_authorize = &__rpcaddress_to_authorize; + } else { + __req.address_to_authorize = NULL; + } + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_AUTHORIZE_MAC_ADDRESS_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_authorize_mac_address_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_authorize_mac_address_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_authorize_mac_address call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_authorize_mac_address_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_authorize_mac_address_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_deny_mac_address(const char * ifname, const qcsapi_mac_addr address_to_deny) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_deny_mac_address_rpcdata __req; + struct qcsapi_wifi_deny_mac_address_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + struct __rpc_qcsapi_mac_addr __rpcaddress_to_deny; + if (address_to_deny) { + memcpy(__rpcaddress_to_deny.data, address_to_deny, sizeof(__rpcaddress_to_deny)); + __req.address_to_deny = &__rpcaddress_to_deny; + } else { + __req.address_to_deny = NULL; + } + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_DENY_MAC_ADDRESS_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_deny_mac_address_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_deny_mac_address_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_deny_mac_address call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_deny_mac_address_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_deny_mac_address_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_remove_mac_address(const char * ifname, const qcsapi_mac_addr address_to_remove) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_remove_mac_address_rpcdata __req; + struct qcsapi_wifi_remove_mac_address_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + struct __rpc_qcsapi_mac_addr __rpcaddress_to_remove; + if (address_to_remove) { + memcpy(__rpcaddress_to_remove.data, address_to_remove, sizeof(__rpcaddress_to_remove)); + __req.address_to_remove = &__rpcaddress_to_remove; + } else { + __req.address_to_remove = NULL; + } + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_REMOVE_MAC_ADDRESS_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_remove_mac_address_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_remove_mac_address_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_remove_mac_address call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_remove_mac_address_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_remove_mac_address_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_is_mac_address_authorized(const char * ifname, const qcsapi_mac_addr address_to_verify, int * p_mac_address_authorized) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_is_mac_address_authorized_rpcdata __req; + struct qcsapi_wifi_is_mac_address_authorized_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + struct __rpc_qcsapi_mac_addr __rpcaddress_to_verify; + if (address_to_verify) { + memcpy(__rpcaddress_to_verify.data, address_to_verify, sizeof(__rpcaddress_to_verify)); + __req.address_to_verify = &__rpcaddress_to_verify; + } else { + __req.address_to_verify = NULL; + } + __req.p_mac_address_authorized = (int *)p_mac_address_authorized; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_IS_MAC_ADDRESS_AUTHORIZED_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_is_mac_address_authorized_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_is_mac_address_authorized_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_is_mac_address_authorized call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_is_mac_address_authorized_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (p_mac_address_authorized) + *p_mac_address_authorized = *__resp.p_mac_address_authorized; + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_is_mac_address_authorized_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_get_authorized_mac_addresses(const char * ifname, char * list_mac_addresses, const unsigned int sizeof_list) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_get_authorized_mac_addresses_rpcdata __req; + struct qcsapi_wifi_get_authorized_mac_addresses_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __rpc_string __rpclist_mac_addresses = {(char *)list_mac_addresses}; + __rpc_string *p__rpclist_mac_addresses = (list_mac_addresses) ? &__rpclist_mac_addresses : NULL; + __req.list_mac_addresses = p__rpclist_mac_addresses; + + __req.sizeof_list = (unsigned int)sizeof_list; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_GET_AUTHORIZED_MAC_ADDRESSES_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_get_authorized_mac_addresses_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_get_authorized_mac_addresses_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_get_authorized_mac_addresses call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_authorized_mac_addresses_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (list_mac_addresses && __resp.list_mac_addresses) + strcpy(list_mac_addresses, __resp.list_mac_addresses->data); + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_authorized_mac_addresses_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_get_denied_mac_addresses(const char * ifname, char * list_mac_addresses, const unsigned int sizeof_list) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_get_denied_mac_addresses_rpcdata __req; + struct qcsapi_wifi_get_denied_mac_addresses_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __rpc_string __rpclist_mac_addresses = {(char *)list_mac_addresses}; + __rpc_string *p__rpclist_mac_addresses = (list_mac_addresses) ? &__rpclist_mac_addresses : NULL; + __req.list_mac_addresses = p__rpclist_mac_addresses; + + __req.sizeof_list = (unsigned int)sizeof_list; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_GET_DENIED_MAC_ADDRESSES_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_get_denied_mac_addresses_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_get_denied_mac_addresses_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_get_denied_mac_addresses call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_denied_mac_addresses_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (list_mac_addresses && __resp.list_mac_addresses) + strcpy(list_mac_addresses, __resp.list_mac_addresses->data); + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_denied_mac_addresses_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_set_accept_oui_filter(const char * ifname, const qcsapi_mac_addr oui, int flag) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_set_accept_oui_filter_rpcdata __req; + struct qcsapi_wifi_set_accept_oui_filter_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + struct __rpc_qcsapi_mac_addr __rpcoui; + if (oui) { + memcpy(__rpcoui.data, oui, sizeof(__rpcoui)); + __req.oui = &__rpcoui; + } else { + __req.oui = NULL; + } + __req.flag = (int)flag; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_SET_ACCEPT_OUI_FILTER_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_set_accept_oui_filter_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_set_accept_oui_filter_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_set_accept_oui_filter call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_set_accept_oui_filter_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_set_accept_oui_filter_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_get_accept_oui_filter(const char * ifname, char * oui_list, const unsigned int sizeof_list) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_get_accept_oui_filter_rpcdata __req; + struct qcsapi_wifi_get_accept_oui_filter_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __rpc_string __rpcoui_list = {(char *)oui_list}; + __rpc_string *p__rpcoui_list = (oui_list) ? &__rpcoui_list : NULL; + __req.oui_list = p__rpcoui_list; + + __req.sizeof_list = (unsigned int)sizeof_list; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_GET_ACCEPT_OUI_FILTER_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_get_accept_oui_filter_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_get_accept_oui_filter_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_get_accept_oui_filter call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_accept_oui_filter_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (oui_list && __resp.oui_list) + strcpy(oui_list, __resp.oui_list->data); + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_accept_oui_filter_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_clear_mac_address_filters(const char * ifname) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_clear_mac_address_filters_rpcdata __req; + struct qcsapi_wifi_clear_mac_address_filters_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_CLEAR_MAC_ADDRESS_FILTERS_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_clear_mac_address_filters_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_clear_mac_address_filters_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_clear_mac_address_filters call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_clear_mac_address_filters_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_clear_mac_address_filters_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_set_mac_address_reserve(const char * ifname, const char * addr, const char * mask) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_set_mac_address_reserve_rpcdata __req; + struct qcsapi_wifi_set_mac_address_reserve_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __rpc_string __rpcaddr = {(char *)addr}; + __rpc_string *p__rpcaddr = (addr) ? &__rpcaddr : NULL; + __req.addr = p__rpcaddr; + + __rpc_string __rpcmask = {(char *)mask}; + __rpc_string *p__rpcmask = (mask) ? &__rpcmask : NULL; + __req.mask = p__rpcmask; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_SET_MAC_ADDRESS_RESERVE_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_set_mac_address_reserve_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_set_mac_address_reserve_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_set_mac_address_reserve call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_set_mac_address_reserve_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_set_mac_address_reserve_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_get_mac_address_reserve(const char * ifname, string_256 buf) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_get_mac_address_reserve_rpcdata __req; + struct qcsapi_wifi_get_mac_address_reserve_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __rpc_string __rpcbuf = {(char *)buf}; + __rpc_string *p__rpcbuf = (buf) ? &__rpcbuf : NULL; + __req.buf = p__rpcbuf; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_GET_MAC_ADDRESS_RESERVE_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_get_mac_address_reserve_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_get_mac_address_reserve_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_get_mac_address_reserve call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_mac_address_reserve_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (buf && __resp.buf) + strcpy(buf, __resp.buf->data); + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_mac_address_reserve_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_clear_mac_address_reserve(const char * ifname) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_clear_mac_address_reserve_rpcdata __req; + struct qcsapi_wifi_clear_mac_address_reserve_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_CLEAR_MAC_ADDRESS_RESERVE_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_clear_mac_address_reserve_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_clear_mac_address_reserve_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_clear_mac_address_reserve call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_clear_mac_address_reserve_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_clear_mac_address_reserve_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_get_option(const char * ifname, qcsapi_option_type qcsapi_option, int * p_current_option) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_get_option_rpcdata __req; + struct qcsapi_wifi_get_option_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.qcsapi_option = (int)qcsapi_option; + + __req.p_current_option = (int *)p_current_option; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_GET_OPTION_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_get_option_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_get_option_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_get_option call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_option_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (p_current_option) + *p_current_option = *__resp.p_current_option; + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_option_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_set_option(const char * ifname, qcsapi_option_type qcsapi_option, int new_option) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_set_option_rpcdata __req; + struct qcsapi_wifi_set_option_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.qcsapi_option = (int)qcsapi_option; + + __req.new_option = (int)new_option; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_SET_OPTION_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_set_option_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_set_option_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_set_option call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_set_option_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_set_option_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_get_board_parameter(qcsapi_board_parameter_type board_param, string_64 p_buffer) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_get_board_parameter_rpcdata __req; + struct qcsapi_get_board_parameter_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __req.board_param = (int)board_param; + + __rpc_string __rpcp_buffer = {(char *)p_buffer}; + __rpc_string *p__rpcp_buffer = (p_buffer) ? &__rpcp_buffer : NULL; + __req.p_buffer = p__rpcp_buffer; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_GET_BOARD_PARAMETER_REMOTE, + (xdrproc_t)xdr_qcsapi_get_board_parameter_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_get_board_parameter_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_get_board_parameter call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_get_board_parameter_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (p_buffer && __resp.p_buffer) + strcpy(p_buffer, __resp.p_buffer->data); + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_get_board_parameter_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_get_swfeat_list(string_4096 p_buffer) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_get_swfeat_list_rpcdata __req; + struct qcsapi_get_swfeat_list_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcp_buffer = {(char *)p_buffer}; + __rpc_string *p__rpcp_buffer = (p_buffer) ? &__rpcp_buffer : NULL; + __req.p_buffer = p__rpcp_buffer; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_GET_SWFEAT_LIST_REMOTE, + (xdrproc_t)xdr_qcsapi_get_swfeat_list_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_get_swfeat_list_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_get_swfeat_list call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_get_swfeat_list_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (p_buffer && __resp.p_buffer) + strcpy(p_buffer, __resp.p_buffer->data); + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_get_swfeat_list_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_SSID_create_SSID(const char * ifname, const qcsapi_SSID new_SSID) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_SSID_create_SSID_rpcdata __req; + struct qcsapi_SSID_create_SSID_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __rpc_string __rpcnew_SSID = {(char *)new_SSID}; + __rpc_string *p__rpcnew_SSID = (new_SSID) ? &__rpcnew_SSID : NULL; + __req.new_SSID = p__rpcnew_SSID; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_SSID_CREATE_SSID_REMOTE, + (xdrproc_t)xdr_qcsapi_SSID_create_SSID_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_SSID_create_SSID_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_SSID_create_SSID call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_SSID_create_SSID_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_SSID_create_SSID_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_SSID_remove_SSID(const char * ifname, const qcsapi_SSID del_SSID) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_SSID_remove_SSID_rpcdata __req; + struct qcsapi_SSID_remove_SSID_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __rpc_string __rpcdel_SSID = {(char *)del_SSID}; + __rpc_string *p__rpcdel_SSID = (del_SSID) ? &__rpcdel_SSID : NULL; + __req.del_SSID = p__rpcdel_SSID; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_SSID_REMOVE_SSID_REMOTE, + (xdrproc_t)xdr_qcsapi_SSID_remove_SSID_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_SSID_remove_SSID_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_SSID_remove_SSID call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_SSID_remove_SSID_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_SSID_remove_SSID_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_SSID_verify_SSID(const char * ifname, const qcsapi_SSID current_SSID) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_SSID_verify_SSID_rpcdata __req; + struct qcsapi_SSID_verify_SSID_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __rpc_string __rpccurrent_SSID = {(char *)current_SSID}; + __rpc_string *p__rpccurrent_SSID = (current_SSID) ? &__rpccurrent_SSID : NULL; + __req.current_SSID = p__rpccurrent_SSID; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_SSID_VERIFY_SSID_REMOTE, + (xdrproc_t)xdr_qcsapi_SSID_verify_SSID_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_SSID_verify_SSID_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_SSID_verify_SSID call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_SSID_verify_SSID_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_SSID_verify_SSID_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_SSID_rename_SSID(const char * ifname, const qcsapi_SSID current_SSID, const qcsapi_SSID new_SSID) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_SSID_rename_SSID_rpcdata __req; + struct qcsapi_SSID_rename_SSID_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __rpc_string __rpccurrent_SSID = {(char *)current_SSID}; + __rpc_string *p__rpccurrent_SSID = (current_SSID) ? &__rpccurrent_SSID : NULL; + __req.current_SSID = p__rpccurrent_SSID; + + __rpc_string __rpcnew_SSID = {(char *)new_SSID}; + __rpc_string *p__rpcnew_SSID = (new_SSID) ? &__rpcnew_SSID : NULL; + __req.new_SSID = p__rpcnew_SSID; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_SSID_RENAME_SSID_REMOTE, + (xdrproc_t)xdr_qcsapi_SSID_rename_SSID_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_SSID_rename_SSID_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_SSID_rename_SSID call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_SSID_rename_SSID_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_SSID_rename_SSID_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_SSID_get_SSID_list(const char * ifname, const unsigned int arrayc, char ** list_SSID) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_SSID_get_SSID_list_rpcdata __req; + struct qcsapi_SSID_get_SSID_list_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + if (list_SSID == NULL) { + return -EFAULT; + } + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.arrayc = (unsigned int)arrayc; + + /* TODO: string array member - list_SSID */ + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_SSID_GET_SSID_LIST_REMOTE, + (xdrproc_t)xdr_qcsapi_SSID_get_SSID_list_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_SSID_get_SSID_list_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_SSID_get_SSID_list call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_SSID_get_SSID_list_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + unsigned int i; + for (i = 0; i < __resp.list_SSID.list_SSID_len; i++) { + strcpy(list_SSID[i], __resp.list_SSID.list_SSID_val[i]); + } + list_SSID[i] = NULL; + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_SSID_get_SSID_list_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_SSID_set_protocol(const char * ifname, const qcsapi_SSID current_SSID, const char * new_protocol) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_SSID_set_protocol_rpcdata __req; + struct qcsapi_SSID_set_protocol_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __rpc_string __rpccurrent_SSID = {(char *)current_SSID}; + __rpc_string *p__rpccurrent_SSID = (current_SSID) ? &__rpccurrent_SSID : NULL; + __req.current_SSID = p__rpccurrent_SSID; + + __rpc_string __rpcnew_protocol = {(char *)new_protocol}; + __rpc_string *p__rpcnew_protocol = (new_protocol) ? &__rpcnew_protocol : NULL; + __req.new_protocol = p__rpcnew_protocol; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_SSID_SET_PROTOCOL_REMOTE, + (xdrproc_t)xdr_qcsapi_SSID_set_protocol_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_SSID_set_protocol_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_SSID_set_protocol call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_SSID_set_protocol_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_SSID_set_protocol_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_SSID_get_protocol(const char * ifname, const qcsapi_SSID current_SSID, string_16 current_protocol) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_SSID_get_protocol_rpcdata __req; + struct qcsapi_SSID_get_protocol_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __rpc_string __rpccurrent_SSID = {(char *)current_SSID}; + __rpc_string *p__rpccurrent_SSID = (current_SSID) ? &__rpccurrent_SSID : NULL; + __req.current_SSID = p__rpccurrent_SSID; + + __rpc_string __rpccurrent_protocol = {(char *)current_protocol}; + __rpc_string *p__rpccurrent_protocol = (current_protocol) ? &__rpccurrent_protocol : NULL; + __req.current_protocol = p__rpccurrent_protocol; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_SSID_GET_PROTOCOL_REMOTE, + (xdrproc_t)xdr_qcsapi_SSID_get_protocol_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_SSID_get_protocol_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_SSID_get_protocol call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_SSID_get_protocol_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (current_protocol && __resp.current_protocol) + strcpy(current_protocol, __resp.current_protocol->data); + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_SSID_get_protocol_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_SSID_get_encryption_modes(const char * ifname, const qcsapi_SSID current_SSID, string_32 encryption_modes) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_SSID_get_encryption_modes_rpcdata __req; + struct qcsapi_SSID_get_encryption_modes_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __rpc_string __rpccurrent_SSID = {(char *)current_SSID}; + __rpc_string *p__rpccurrent_SSID = (current_SSID) ? &__rpccurrent_SSID : NULL; + __req.current_SSID = p__rpccurrent_SSID; + + __rpc_string __rpcencryption_modes = {(char *)encryption_modes}; + __rpc_string *p__rpcencryption_modes = (encryption_modes) ? &__rpcencryption_modes : NULL; + __req.encryption_modes = p__rpcencryption_modes; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_SSID_GET_ENCRYPTION_MODES_REMOTE, + (xdrproc_t)xdr_qcsapi_SSID_get_encryption_modes_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_SSID_get_encryption_modes_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_SSID_get_encryption_modes call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_SSID_get_encryption_modes_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (encryption_modes && __resp.encryption_modes) + strcpy(encryption_modes, __resp.encryption_modes->data); + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_SSID_get_encryption_modes_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_SSID_set_encryption_modes(const char * ifname, const qcsapi_SSID current_SSID, const string_32 encryption_modes) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_SSID_set_encryption_modes_rpcdata __req; + struct qcsapi_SSID_set_encryption_modes_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __rpc_string __rpccurrent_SSID = {(char *)current_SSID}; + __rpc_string *p__rpccurrent_SSID = (current_SSID) ? &__rpccurrent_SSID : NULL; + __req.current_SSID = p__rpccurrent_SSID; + + __rpc_string __rpcencryption_modes = {(char *)encryption_modes}; + __rpc_string *p__rpcencryption_modes = (encryption_modes) ? &__rpcencryption_modes : NULL; + __req.encryption_modes = p__rpcencryption_modes; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_SSID_SET_ENCRYPTION_MODES_REMOTE, + (xdrproc_t)xdr_qcsapi_SSID_set_encryption_modes_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_SSID_set_encryption_modes_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_SSID_set_encryption_modes call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_SSID_set_encryption_modes_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_SSID_set_encryption_modes_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_SSID_get_group_encryption(const char * ifname, const qcsapi_SSID current_SSID, string_32 encryption_mode) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_SSID_get_group_encryption_rpcdata __req; + struct qcsapi_SSID_get_group_encryption_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __rpc_string __rpccurrent_SSID = {(char *)current_SSID}; + __rpc_string *p__rpccurrent_SSID = (current_SSID) ? &__rpccurrent_SSID : NULL; + __req.current_SSID = p__rpccurrent_SSID; + + __rpc_string __rpcencryption_mode = {(char *)encryption_mode}; + __rpc_string *p__rpcencryption_mode = (encryption_mode) ? &__rpcencryption_mode : NULL; + __req.encryption_mode = p__rpcencryption_mode; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_SSID_GET_GROUP_ENCRYPTION_REMOTE, + (xdrproc_t)xdr_qcsapi_SSID_get_group_encryption_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_SSID_get_group_encryption_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_SSID_get_group_encryption call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_SSID_get_group_encryption_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (encryption_mode && __resp.encryption_mode) + strcpy(encryption_mode, __resp.encryption_mode->data); + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_SSID_get_group_encryption_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_SSID_set_group_encryption(const char * ifname, const qcsapi_SSID current_SSID, const string_32 encryption_mode) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_SSID_set_group_encryption_rpcdata __req; + struct qcsapi_SSID_set_group_encryption_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __rpc_string __rpccurrent_SSID = {(char *)current_SSID}; + __rpc_string *p__rpccurrent_SSID = (current_SSID) ? &__rpccurrent_SSID : NULL; + __req.current_SSID = p__rpccurrent_SSID; + + __rpc_string __rpcencryption_mode = {(char *)encryption_mode}; + __rpc_string *p__rpcencryption_mode = (encryption_mode) ? &__rpcencryption_mode : NULL; + __req.encryption_mode = p__rpcencryption_mode; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_SSID_SET_GROUP_ENCRYPTION_REMOTE, + (xdrproc_t)xdr_qcsapi_SSID_set_group_encryption_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_SSID_set_group_encryption_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_SSID_set_group_encryption call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_SSID_set_group_encryption_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_SSID_set_group_encryption_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_SSID_get_authentication_mode(const char * ifname, const qcsapi_SSID current_SSID, string_32 authentication_mode) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_SSID_get_authentication_mode_rpcdata __req; + struct qcsapi_SSID_get_authentication_mode_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __rpc_string __rpccurrent_SSID = {(char *)current_SSID}; + __rpc_string *p__rpccurrent_SSID = (current_SSID) ? &__rpccurrent_SSID : NULL; + __req.current_SSID = p__rpccurrent_SSID; + + __rpc_string __rpcauthentication_mode = {(char *)authentication_mode}; + __rpc_string *p__rpcauthentication_mode = (authentication_mode) ? &__rpcauthentication_mode : NULL; + __req.authentication_mode = p__rpcauthentication_mode; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_SSID_GET_AUTHENTICATION_MODE_REMOTE, + (xdrproc_t)xdr_qcsapi_SSID_get_authentication_mode_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_SSID_get_authentication_mode_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_SSID_get_authentication_mode call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_SSID_get_authentication_mode_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (authentication_mode && __resp.authentication_mode) + strcpy(authentication_mode, __resp.authentication_mode->data); + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_SSID_get_authentication_mode_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_SSID_set_authentication_mode(const char * ifname, const qcsapi_SSID current_SSID, const string_32 authentication_mode) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_SSID_set_authentication_mode_rpcdata __req; + struct qcsapi_SSID_set_authentication_mode_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __rpc_string __rpccurrent_SSID = {(char *)current_SSID}; + __rpc_string *p__rpccurrent_SSID = (current_SSID) ? &__rpccurrent_SSID : NULL; + __req.current_SSID = p__rpccurrent_SSID; + + __rpc_string __rpcauthentication_mode = {(char *)authentication_mode}; + __rpc_string *p__rpcauthentication_mode = (authentication_mode) ? &__rpcauthentication_mode : NULL; + __req.authentication_mode = p__rpcauthentication_mode; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_SSID_SET_AUTHENTICATION_MODE_REMOTE, + (xdrproc_t)xdr_qcsapi_SSID_set_authentication_mode_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_SSID_set_authentication_mode_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_SSID_set_authentication_mode call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_SSID_set_authentication_mode_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_SSID_set_authentication_mode_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_SSID_get_pre_shared_key(const char * ifname, const qcsapi_SSID current_SSID, const qcsapi_unsigned_int key_index, string_64 pre_shared_key) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_SSID_get_pre_shared_key_rpcdata __req; + struct qcsapi_SSID_get_pre_shared_key_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __rpc_string __rpccurrent_SSID = {(char *)current_SSID}; + __rpc_string *p__rpccurrent_SSID = (current_SSID) ? &__rpccurrent_SSID : NULL; + __req.current_SSID = p__rpccurrent_SSID; + + __req.key_index = (unsigned int)key_index; + + __rpc_string __rpcpre_shared_key = {(char *)pre_shared_key}; + __rpc_string *p__rpcpre_shared_key = (pre_shared_key) ? &__rpcpre_shared_key : NULL; + __req.pre_shared_key = p__rpcpre_shared_key; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_SSID_GET_PRE_SHARED_KEY_REMOTE, + (xdrproc_t)xdr_qcsapi_SSID_get_pre_shared_key_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_SSID_get_pre_shared_key_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_SSID_get_pre_shared_key call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_SSID_get_pre_shared_key_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (pre_shared_key && __resp.pre_shared_key) + strcpy(pre_shared_key, __resp.pre_shared_key->data); + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_SSID_get_pre_shared_key_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_SSID_set_pre_shared_key(const char * ifname, const qcsapi_SSID current_SSID, const qcsapi_unsigned_int key_index, const string_64 pre_shared_key) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_SSID_set_pre_shared_key_rpcdata __req; + struct qcsapi_SSID_set_pre_shared_key_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __rpc_string __rpccurrent_SSID = {(char *)current_SSID}; + __rpc_string *p__rpccurrent_SSID = (current_SSID) ? &__rpccurrent_SSID : NULL; + __req.current_SSID = p__rpccurrent_SSID; + + __req.key_index = (unsigned int)key_index; + + __rpc_string __rpcpre_shared_key = {(char *)pre_shared_key}; + __rpc_string *p__rpcpre_shared_key = (pre_shared_key) ? &__rpcpre_shared_key : NULL; + __req.pre_shared_key = p__rpcpre_shared_key; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_SSID_SET_PRE_SHARED_KEY_REMOTE, + (xdrproc_t)xdr_qcsapi_SSID_set_pre_shared_key_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_SSID_set_pre_shared_key_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_SSID_set_pre_shared_key call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_SSID_set_pre_shared_key_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_SSID_set_pre_shared_key_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_SSID_get_key_passphrase(const char * ifname, const qcsapi_SSID current_SSID, const qcsapi_unsigned_int key_index, string_64 passphrase) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_SSID_get_key_passphrase_rpcdata __req; + struct qcsapi_SSID_get_key_passphrase_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __rpc_string __rpccurrent_SSID = {(char *)current_SSID}; + __rpc_string *p__rpccurrent_SSID = (current_SSID) ? &__rpccurrent_SSID : NULL; + __req.current_SSID = p__rpccurrent_SSID; + + __req.key_index = (unsigned int)key_index; + + __rpc_string __rpcpassphrase = {(char *)passphrase}; + __rpc_string *p__rpcpassphrase = (passphrase) ? &__rpcpassphrase : NULL; + __req.passphrase = p__rpcpassphrase; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_SSID_GET_KEY_PASSPHRASE_REMOTE, + (xdrproc_t)xdr_qcsapi_SSID_get_key_passphrase_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_SSID_get_key_passphrase_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_SSID_get_key_passphrase call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_SSID_get_key_passphrase_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (passphrase && __resp.passphrase) + strcpy(passphrase, __resp.passphrase->data); + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_SSID_get_key_passphrase_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_SSID_set_key_passphrase(const char * ifname, const qcsapi_SSID current_SSID, const qcsapi_unsigned_int key_index, const string_64 passphrase) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_SSID_set_key_passphrase_rpcdata __req; + struct qcsapi_SSID_set_key_passphrase_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __rpc_string __rpccurrent_SSID = {(char *)current_SSID}; + __rpc_string *p__rpccurrent_SSID = (current_SSID) ? &__rpccurrent_SSID : NULL; + __req.current_SSID = p__rpccurrent_SSID; + + __req.key_index = (unsigned int)key_index; + + __rpc_string __rpcpassphrase = {(char *)passphrase}; + __rpc_string *p__rpcpassphrase = (passphrase) ? &__rpcpassphrase : NULL; + __req.passphrase = p__rpcpassphrase; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_SSID_SET_KEY_PASSPHRASE_REMOTE, + (xdrproc_t)xdr_qcsapi_SSID_set_key_passphrase_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_SSID_set_key_passphrase_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_SSID_set_key_passphrase call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_SSID_set_key_passphrase_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_SSID_set_key_passphrase_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_SSID_get_pmf(const char * ifname, const qcsapi_SSID current_SSID, int * p_pmf_cap) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_SSID_get_pmf_rpcdata __req; + struct qcsapi_SSID_get_pmf_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __rpc_string __rpccurrent_SSID = {(char *)current_SSID}; + __rpc_string *p__rpccurrent_SSID = (current_SSID) ? &__rpccurrent_SSID : NULL; + __req.current_SSID = p__rpccurrent_SSID; + + __req.p_pmf_cap = (int *)p_pmf_cap; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_SSID_GET_PMF_REMOTE, + (xdrproc_t)xdr_qcsapi_SSID_get_pmf_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_SSID_get_pmf_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_SSID_get_pmf call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_SSID_get_pmf_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (p_pmf_cap) + *p_pmf_cap = *__resp.p_pmf_cap; + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_SSID_get_pmf_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_SSID_set_pmf(const char * ifname, const qcsapi_SSID SSID_str, int pmf_cap) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_SSID_set_pmf_rpcdata __req; + struct qcsapi_SSID_set_pmf_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __rpc_string __rpcSSID_str = {(char *)SSID_str}; + __rpc_string *p__rpcSSID_str = (SSID_str) ? &__rpcSSID_str : NULL; + __req.SSID_str = p__rpcSSID_str; + + __req.pmf_cap = (int)pmf_cap; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_SSID_SET_PMF_REMOTE, + (xdrproc_t)xdr_qcsapi_SSID_set_pmf_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_SSID_set_pmf_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_SSID_set_pmf call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_SSID_set_pmf_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_SSID_set_pmf_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_SSID_get_wps_SSID(const char * ifname, qcsapi_SSID wps_SSID) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_SSID_get_wps_SSID_rpcdata __req; + struct qcsapi_SSID_get_wps_SSID_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __rpc_string __rpcwps_SSID = {(char *)wps_SSID}; + __rpc_string *p__rpcwps_SSID = (wps_SSID) ? &__rpcwps_SSID : NULL; + __req.wps_SSID = p__rpcwps_SSID; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_SSID_GET_WPS_SSID_REMOTE, + (xdrproc_t)xdr_qcsapi_SSID_get_wps_SSID_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_SSID_get_wps_SSID_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_SSID_get_wps_SSID call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_SSID_get_wps_SSID_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (wps_SSID && __resp.wps_SSID) + strcpy(wps_SSID, __resp.wps_SSID->data); + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_SSID_get_wps_SSID_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_vlan_config(const char * ifname, qcsapi_vlan_cmd cmd, uint32_t vlanid, uint32_t flags) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_vlan_config_rpcdata __req; + struct qcsapi_wifi_vlan_config_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.cmd = (int)cmd; + + __req.vlanid = (uint32_t)vlanid; + + __req.flags = (uint32_t)flags; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_VLAN_CONFIG_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_vlan_config_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_vlan_config_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_vlan_config call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_vlan_config_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_vlan_config_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_show_vlan_config(const char * ifname, string_1024 vcfg) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_show_vlan_config_rpcdata __req; + struct qcsapi_wifi_show_vlan_config_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __rpc_string __rpcvcfg = {(char *)vcfg}; + __rpc_string *p__rpcvcfg = (vcfg) ? &__rpcvcfg : NULL; + __req.vcfg = p__rpcvcfg; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_SHOW_VLAN_CONFIG_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_show_vlan_config_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_show_vlan_config_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_show_vlan_config call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_show_vlan_config_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (vcfg && __resp.vcfg) + strcpy(vcfg, __resp.vcfg->data); + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_show_vlan_config_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_enable_vlan_pass_through(const char * ifname, int enabled) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_enable_vlan_pass_through_rpcdata __req; + struct qcsapi_enable_vlan_pass_through_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.enabled = (int)enabled; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_ENABLE_VLAN_PASS_THROUGH_REMOTE, + (xdrproc_t)xdr_qcsapi_enable_vlan_pass_through_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_enable_vlan_pass_through_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_enable_vlan_pass_through call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_enable_vlan_pass_through_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_enable_vlan_pass_through_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_set_vlan_promisc(int enable) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_set_vlan_promisc_rpcdata __req; + struct qcsapi_wifi_set_vlan_promisc_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __req.enable = (int)enable; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_SET_VLAN_PROMISC_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_set_vlan_promisc_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_set_vlan_promisc_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_set_vlan_promisc call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_set_vlan_promisc_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_set_vlan_promisc_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wps_registrar_report_button_press(const char * ifname) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wps_registrar_report_button_press_rpcdata __req; + struct qcsapi_wps_registrar_report_button_press_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WPS_REGISTRAR_REPORT_BUTTON_PRESS_REMOTE, + (xdrproc_t)xdr_qcsapi_wps_registrar_report_button_press_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wps_registrar_report_button_press_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wps_registrar_report_button_press call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wps_registrar_report_button_press_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wps_registrar_report_button_press_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wps_registrar_report_pin(const char * ifname, const char * wps_pin) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wps_registrar_report_pin_rpcdata __req; + struct qcsapi_wps_registrar_report_pin_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __rpc_string __rpcwps_pin = {(char *)wps_pin}; + __rpc_string *p__rpcwps_pin = (wps_pin) ? &__rpcwps_pin : NULL; + __req.wps_pin = p__rpcwps_pin; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WPS_REGISTRAR_REPORT_PIN_REMOTE, + (xdrproc_t)xdr_qcsapi_wps_registrar_report_pin_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wps_registrar_report_pin_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wps_registrar_report_pin call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wps_registrar_report_pin_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wps_registrar_report_pin_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wps_registrar_get_pp_devname(const char * ifname, int blacklist, string_128 pp_devname) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wps_registrar_get_pp_devname_rpcdata __req; + struct qcsapi_wps_registrar_get_pp_devname_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.blacklist = (int)blacklist; + + __rpc_string __rpcpp_devname = {(char *)pp_devname}; + __rpc_string *p__rpcpp_devname = (pp_devname) ? &__rpcpp_devname : NULL; + __req.pp_devname = p__rpcpp_devname; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WPS_REGISTRAR_GET_PP_DEVNAME_REMOTE, + (xdrproc_t)xdr_qcsapi_wps_registrar_get_pp_devname_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wps_registrar_get_pp_devname_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wps_registrar_get_pp_devname call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wps_registrar_get_pp_devname_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (pp_devname && __resp.pp_devname) + strcpy(pp_devname, __resp.pp_devname->data); + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wps_registrar_get_pp_devname_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wps_registrar_set_pp_devname(const char * ifname, int update_blacklist, const string_256 pp_devname) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wps_registrar_set_pp_devname_rpcdata __req; + struct qcsapi_wps_registrar_set_pp_devname_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.update_blacklist = (int)update_blacklist; + + __rpc_string __rpcpp_devname = {(char *)pp_devname}; + __rpc_string *p__rpcpp_devname = (pp_devname) ? &__rpcpp_devname : NULL; + __req.pp_devname = p__rpcpp_devname; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WPS_REGISTRAR_SET_PP_DEVNAME_REMOTE, + (xdrproc_t)xdr_qcsapi_wps_registrar_set_pp_devname_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wps_registrar_set_pp_devname_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wps_registrar_set_pp_devname call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wps_registrar_set_pp_devname_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wps_registrar_set_pp_devname_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wps_enrollee_report_button_press(const char * ifname, const qcsapi_mac_addr bssid) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wps_enrollee_report_button_press_rpcdata __req; + struct qcsapi_wps_enrollee_report_button_press_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + struct __rpc_qcsapi_mac_addr __rpcbssid; + if (bssid) { + memcpy(__rpcbssid.data, bssid, sizeof(__rpcbssid)); + __req.bssid = &__rpcbssid; + } else { + __req.bssid = NULL; + } + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WPS_ENROLLEE_REPORT_BUTTON_PRESS_REMOTE, + (xdrproc_t)xdr_qcsapi_wps_enrollee_report_button_press_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wps_enrollee_report_button_press_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wps_enrollee_report_button_press call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wps_enrollee_report_button_press_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wps_enrollee_report_button_press_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wps_enrollee_report_pin(const char * ifname, const qcsapi_mac_addr bssid, const char * wps_pin) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wps_enrollee_report_pin_rpcdata __req; + struct qcsapi_wps_enrollee_report_pin_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + struct __rpc_qcsapi_mac_addr __rpcbssid; + if (bssid) { + memcpy(__rpcbssid.data, bssid, sizeof(__rpcbssid)); + __req.bssid = &__rpcbssid; + } else { + __req.bssid = NULL; + } + __rpc_string __rpcwps_pin = {(char *)wps_pin}; + __rpc_string *p__rpcwps_pin = (wps_pin) ? &__rpcwps_pin : NULL; + __req.wps_pin = p__rpcwps_pin; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WPS_ENROLLEE_REPORT_PIN_REMOTE, + (xdrproc_t)xdr_qcsapi_wps_enrollee_report_pin_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wps_enrollee_report_pin_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wps_enrollee_report_pin call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wps_enrollee_report_pin_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wps_enrollee_report_pin_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wps_enrollee_generate_pin(const char * ifname, const qcsapi_mac_addr bssid, char * wps_pin) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wps_enrollee_generate_pin_rpcdata __req; + struct qcsapi_wps_enrollee_generate_pin_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + struct __rpc_qcsapi_mac_addr __rpcbssid; + if (bssid) { + memcpy(__rpcbssid.data, bssid, sizeof(__rpcbssid)); + __req.bssid = &__rpcbssid; + } else { + __req.bssid = NULL; + } + __rpc_string __rpcwps_pin = {(char *)wps_pin}; + __rpc_string *p__rpcwps_pin = (wps_pin) ? &__rpcwps_pin : NULL; + __req.wps_pin = p__rpcwps_pin; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WPS_ENROLLEE_GENERATE_PIN_REMOTE, + (xdrproc_t)xdr_qcsapi_wps_enrollee_generate_pin_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wps_enrollee_generate_pin_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wps_enrollee_generate_pin call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wps_enrollee_generate_pin_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (wps_pin && __resp.wps_pin) + strcpy(wps_pin, __resp.wps_pin->data); + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wps_enrollee_generate_pin_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wps_get_ap_pin(const char * ifname, char * wps_pin, int force_regenerate) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wps_get_ap_pin_rpcdata __req; + struct qcsapi_wps_get_ap_pin_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __rpc_string __rpcwps_pin = {(char *)wps_pin}; + __rpc_string *p__rpcwps_pin = (wps_pin) ? &__rpcwps_pin : NULL; + __req.wps_pin = p__rpcwps_pin; + + __req.force_regenerate = (int)force_regenerate; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WPS_GET_AP_PIN_REMOTE, + (xdrproc_t)xdr_qcsapi_wps_get_ap_pin_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wps_get_ap_pin_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wps_get_ap_pin call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wps_get_ap_pin_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (wps_pin && __resp.wps_pin) + strcpy(wps_pin, __resp.wps_pin->data); + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wps_get_ap_pin_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wps_set_ap_pin(const char * ifname, const char * wps_pin) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wps_set_ap_pin_rpcdata __req; + struct qcsapi_wps_set_ap_pin_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __rpc_string __rpcwps_pin = {(char *)wps_pin}; + __rpc_string *p__rpcwps_pin = (wps_pin) ? &__rpcwps_pin : NULL; + __req.wps_pin = p__rpcwps_pin; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WPS_SET_AP_PIN_REMOTE, + (xdrproc_t)xdr_qcsapi_wps_set_ap_pin_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wps_set_ap_pin_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wps_set_ap_pin call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wps_set_ap_pin_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wps_set_ap_pin_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wps_save_ap_pin(const char * ifname) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wps_save_ap_pin_rpcdata __req; + struct qcsapi_wps_save_ap_pin_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WPS_SAVE_AP_PIN_REMOTE, + (xdrproc_t)xdr_qcsapi_wps_save_ap_pin_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wps_save_ap_pin_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wps_save_ap_pin call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wps_save_ap_pin_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wps_save_ap_pin_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wps_enable_ap_pin(const char * ifname, int enable) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wps_enable_ap_pin_rpcdata __req; + struct qcsapi_wps_enable_ap_pin_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.enable = (int)enable; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WPS_ENABLE_AP_PIN_REMOTE, + (xdrproc_t)xdr_qcsapi_wps_enable_ap_pin_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wps_enable_ap_pin_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wps_enable_ap_pin call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wps_enable_ap_pin_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wps_enable_ap_pin_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wps_get_sta_pin(const char * ifname, char * wps_pin) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wps_get_sta_pin_rpcdata __req; + struct qcsapi_wps_get_sta_pin_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __rpc_string __rpcwps_pin = {(char *)wps_pin}; + __rpc_string *p__rpcwps_pin = (wps_pin) ? &__rpcwps_pin : NULL; + __req.wps_pin = p__rpcwps_pin; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WPS_GET_STA_PIN_REMOTE, + (xdrproc_t)xdr_qcsapi_wps_get_sta_pin_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wps_get_sta_pin_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wps_get_sta_pin call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wps_get_sta_pin_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (wps_pin && __resp.wps_pin) + strcpy(wps_pin, __resp.wps_pin->data); + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wps_get_sta_pin_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wps_get_state(const char * ifname, char * wps_state, const qcsapi_unsigned_int max_len) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wps_get_state_rpcdata __req; + struct qcsapi_wps_get_state_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __rpc_string __rpcwps_state = {(char *)wps_state}; + __rpc_string *p__rpcwps_state = (wps_state) ? &__rpcwps_state : NULL; + __req.wps_state = p__rpcwps_state; + + __req.max_len = (unsigned int)max_len; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WPS_GET_STATE_REMOTE, + (xdrproc_t)xdr_qcsapi_wps_get_state_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wps_get_state_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wps_get_state call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wps_get_state_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (wps_state && __resp.wps_state) + strcpy(wps_state, __resp.wps_state->data); + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wps_get_state_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wps_get_configured_state(const char * ifname, char * wps_state, const qcsapi_unsigned_int max_len) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wps_get_configured_state_rpcdata __req; + struct qcsapi_wps_get_configured_state_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __rpc_string __rpcwps_state = {(char *)wps_state}; + __rpc_string *p__rpcwps_state = (wps_state) ? &__rpcwps_state : NULL; + __req.wps_state = p__rpcwps_state; + + __req.max_len = (unsigned int)max_len; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WPS_GET_CONFIGURED_STATE_REMOTE, + (xdrproc_t)xdr_qcsapi_wps_get_configured_state_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wps_get_configured_state_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wps_get_configured_state call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wps_get_configured_state_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (wps_state && __resp.wps_state) + strcpy(wps_state, __resp.wps_state->data); + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wps_get_configured_state_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wps_get_runtime_state(const char * ifname, char * state, int max_len) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wps_get_runtime_state_rpcdata __req; + struct qcsapi_wps_get_runtime_state_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __rpc_string __rpcstate = {(char *)state}; + __rpc_string *p__rpcstate = (state) ? &__rpcstate : NULL; + __req.state = p__rpcstate; + + __req.max_len = (int)max_len; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WPS_GET_RUNTIME_STATE_REMOTE, + (xdrproc_t)xdr_qcsapi_wps_get_runtime_state_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wps_get_runtime_state_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wps_get_runtime_state call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wps_get_runtime_state_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (state && __resp.state) + strcpy(state, __resp.state->data); + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wps_get_runtime_state_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wps_set_configured_state(const char * ifname, const qcsapi_unsigned_int state) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wps_set_configured_state_rpcdata __req; + struct qcsapi_wps_set_configured_state_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.state = (unsigned int)state; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WPS_SET_CONFIGURED_STATE_REMOTE, + (xdrproc_t)xdr_qcsapi_wps_set_configured_state_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wps_set_configured_state_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wps_set_configured_state call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wps_set_configured_state_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wps_set_configured_state_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wps_get_param(const char * ifname, qcsapi_wps_param_type wps_type, char * wps_str, const qcsapi_unsigned_int max_len) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wps_get_param_rpcdata __req; + struct qcsapi_wps_get_param_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.wps_type = (int)wps_type; + + __rpc_string __rpcwps_str = {(char *)wps_str}; + __rpc_string *p__rpcwps_str = (wps_str) ? &__rpcwps_str : NULL; + __req.wps_str = p__rpcwps_str; + + __req.max_len = (unsigned int)max_len; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WPS_GET_PARAM_REMOTE, + (xdrproc_t)xdr_qcsapi_wps_get_param_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wps_get_param_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wps_get_param call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wps_get_param_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (wps_str && __resp.wps_str) + strcpy(wps_str, __resp.wps_str->data); + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wps_get_param_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wps_set_timeout(const char * ifname, const int value) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wps_set_timeout_rpcdata __req; + struct qcsapi_wps_set_timeout_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.value = (int)value; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WPS_SET_TIMEOUT_REMOTE, + (xdrproc_t)xdr_qcsapi_wps_set_timeout_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wps_set_timeout_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wps_set_timeout call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wps_set_timeout_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wps_set_timeout_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wps_on_hidden_ssid(const char * ifname, const int value) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wps_on_hidden_ssid_rpcdata __req; + struct qcsapi_wps_on_hidden_ssid_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.value = (int)value; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WPS_ON_HIDDEN_SSID_REMOTE, + (xdrproc_t)xdr_qcsapi_wps_on_hidden_ssid_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wps_on_hidden_ssid_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wps_on_hidden_ssid call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wps_on_hidden_ssid_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wps_on_hidden_ssid_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wps_on_hidden_ssid_status(const char * ifname, char * state, int max_len) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wps_on_hidden_ssid_status_rpcdata __req; + struct qcsapi_wps_on_hidden_ssid_status_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __rpc_string __rpcstate = {(char *)state}; + __rpc_string *p__rpcstate = (state) ? &__rpcstate : NULL; + __req.state = p__rpcstate; + + __req.max_len = (int)max_len; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WPS_ON_HIDDEN_SSID_STATUS_REMOTE, + (xdrproc_t)xdr_qcsapi_wps_on_hidden_ssid_status_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wps_on_hidden_ssid_status_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wps_on_hidden_ssid_status call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wps_on_hidden_ssid_status_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (state && __resp.state) + strcpy(state, __resp.state->data); + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wps_on_hidden_ssid_status_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wps_upnp_enable(const char * ifname, const int value) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wps_upnp_enable_rpcdata __req; + struct qcsapi_wps_upnp_enable_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.value = (int)value; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WPS_UPNP_ENABLE_REMOTE, + (xdrproc_t)xdr_qcsapi_wps_upnp_enable_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wps_upnp_enable_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wps_upnp_enable call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wps_upnp_enable_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wps_upnp_enable_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wps_upnp_status(const char * ifname, char * reply, int reply_len) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wps_upnp_status_rpcdata __req; + struct qcsapi_wps_upnp_status_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __rpc_string __rpcreply = {(char *)reply}; + __rpc_string *p__rpcreply = (reply) ? &__rpcreply : NULL; + __req.reply = p__rpcreply; + + __req.reply_len = (int)reply_len; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WPS_UPNP_STATUS_REMOTE, + (xdrproc_t)xdr_qcsapi_wps_upnp_status_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wps_upnp_status_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wps_upnp_status call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wps_upnp_status_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (reply && __resp.reply) + strcpy(reply, __resp.reply->data); + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wps_upnp_status_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wps_allow_pbc_overlap(const char * ifname, const qcsapi_unsigned_int allow) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wps_allow_pbc_overlap_rpcdata __req; + struct qcsapi_wps_allow_pbc_overlap_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.allow = (unsigned int)allow; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WPS_ALLOW_PBC_OVERLAP_REMOTE, + (xdrproc_t)xdr_qcsapi_wps_allow_pbc_overlap_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wps_allow_pbc_overlap_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wps_allow_pbc_overlap call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wps_allow_pbc_overlap_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wps_allow_pbc_overlap_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wps_get_allow_pbc_overlap_status(const char * ifname, int * status) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wps_get_allow_pbc_overlap_status_rpcdata __req; + struct qcsapi_wps_get_allow_pbc_overlap_status_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.status = (int *)status; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WPS_GET_ALLOW_PBC_OVERLAP_STATUS_REMOTE, + (xdrproc_t)xdr_qcsapi_wps_get_allow_pbc_overlap_status_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wps_get_allow_pbc_overlap_status_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wps_get_allow_pbc_overlap_status call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wps_get_allow_pbc_overlap_status_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (status) + *status = *__resp.status; + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wps_get_allow_pbc_overlap_status_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wps_set_access_control(const char * ifname, uint32_t ctrl_state) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wps_set_access_control_rpcdata __req; + struct qcsapi_wps_set_access_control_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.ctrl_state = (uint32_t)ctrl_state; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WPS_SET_ACCESS_CONTROL_REMOTE, + (xdrproc_t)xdr_qcsapi_wps_set_access_control_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wps_set_access_control_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wps_set_access_control call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wps_set_access_control_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wps_set_access_control_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wps_get_access_control(const char * ifname, uint32_t * ctrl_state) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wps_get_access_control_rpcdata __req; + struct qcsapi_wps_get_access_control_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.ctrl_state = (uint32_t *)ctrl_state; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WPS_GET_ACCESS_CONTROL_REMOTE, + (xdrproc_t)xdr_qcsapi_wps_get_access_control_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wps_get_access_control_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wps_get_access_control call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wps_get_access_control_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (ctrl_state) + *ctrl_state = *__resp.ctrl_state; + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wps_get_access_control_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wps_set_param(const char * ifname, const qcsapi_wps_param_type param_type, const char * param_value) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wps_set_param_rpcdata __req; + struct qcsapi_wps_set_param_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.param_type = (int)param_type; + + __rpc_string __rpcparam_value = {(char *)param_value}; + __rpc_string *p__rpcparam_value = (param_value) ? &__rpcparam_value : NULL; + __req.param_value = p__rpcparam_value; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WPS_SET_PARAM_REMOTE, + (xdrproc_t)xdr_qcsapi_wps_set_param_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wps_set_param_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wps_set_param call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wps_set_param_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wps_set_param_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wps_cancel(const char * ifname) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wps_cancel_rpcdata __req; + struct qcsapi_wps_cancel_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WPS_CANCEL_REMOTE, + (xdrproc_t)xdr_qcsapi_wps_cancel_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wps_cancel_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wps_cancel call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wps_cancel_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wps_cancel_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wps_set_pbc_in_srcm(const char * ifname, const qcsapi_unsigned_int enabled) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wps_set_pbc_in_srcm_rpcdata __req; + struct qcsapi_wps_set_pbc_in_srcm_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.enabled = (unsigned int)enabled; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WPS_SET_PBC_IN_SRCM_REMOTE, + (xdrproc_t)xdr_qcsapi_wps_set_pbc_in_srcm_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wps_set_pbc_in_srcm_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wps_set_pbc_in_srcm call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wps_set_pbc_in_srcm_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wps_set_pbc_in_srcm_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wps_get_pbc_in_srcm(const char * ifname, qcsapi_unsigned_int * p_enabled) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wps_get_pbc_in_srcm_rpcdata __req; + struct qcsapi_wps_get_pbc_in_srcm_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.p_enabled = (unsigned int *)p_enabled; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WPS_GET_PBC_IN_SRCM_REMOTE, + (xdrproc_t)xdr_qcsapi_wps_get_pbc_in_srcm_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wps_get_pbc_in_srcm_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wps_get_pbc_in_srcm call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wps_get_pbc_in_srcm_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (p_enabled) + *p_enabled = *__resp.p_enabled; + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wps_get_pbc_in_srcm_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_registrar_set_default_pbc_bss(const char * ifname) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_registrar_set_default_pbc_bss_rpcdata __req; + struct qcsapi_registrar_set_default_pbc_bss_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_REGISTRAR_SET_DEFAULT_PBC_BSS_REMOTE, + (xdrproc_t)xdr_qcsapi_registrar_set_default_pbc_bss_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_registrar_set_default_pbc_bss_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_registrar_set_default_pbc_bss call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_registrar_set_default_pbc_bss_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_registrar_set_default_pbc_bss_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_registrar_get_default_pbc_bss(char * default_bss, int len) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_registrar_get_default_pbc_bss_rpcdata __req; + struct qcsapi_registrar_get_default_pbc_bss_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcdefault_bss = {(char *)default_bss}; + __rpc_string *p__rpcdefault_bss = (default_bss) ? &__rpcdefault_bss : NULL; + __req.default_bss = p__rpcdefault_bss; + + __req.len = (int)len; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_REGISTRAR_GET_DEFAULT_PBC_BSS_REMOTE, + (xdrproc_t)xdr_qcsapi_registrar_get_default_pbc_bss_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_registrar_get_default_pbc_bss_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_registrar_get_default_pbc_bss call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_registrar_get_default_pbc_bss_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (default_bss && __resp.default_bss) + strcpy(default_bss, __resp.default_bss->data); + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_registrar_get_default_pbc_bss_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_gpio_set_config(const uint8_t gpio_pin, const qcsapi_gpio_config new_gpio_config) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_gpio_set_config_rpcdata __req; + struct qcsapi_gpio_set_config_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __req.gpio_pin = (uint8_t)gpio_pin; + + __req.new_gpio_config = (int)new_gpio_config; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_GPIO_SET_CONFIG_REMOTE, + (xdrproc_t)xdr_qcsapi_gpio_set_config_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_gpio_set_config_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_gpio_set_config call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_gpio_set_config_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_gpio_set_config_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_gpio_get_config(const uint8_t gpio_pin, qcsapi_gpio_config * p_gpio_config) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_gpio_get_config_rpcdata __req; + struct qcsapi_gpio_get_config_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __req.gpio_pin = (uint8_t)gpio_pin; + + __req.p_gpio_config = (int *)p_gpio_config; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_GPIO_GET_CONFIG_REMOTE, + (xdrproc_t)xdr_qcsapi_gpio_get_config_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_gpio_get_config_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_gpio_get_config call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_gpio_get_config_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (p_gpio_config) + *p_gpio_config = *__resp.p_gpio_config; + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_gpio_get_config_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_led_get(const uint8_t led_ident, uint8_t * p_led_setting) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_led_get_rpcdata __req; + struct qcsapi_led_get_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __req.led_ident = (uint8_t)led_ident; + + __req.p_led_setting = (uint8_t *)p_led_setting; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_LED_GET_REMOTE, + (xdrproc_t)xdr_qcsapi_led_get_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_led_get_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_led_get call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_led_get_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (p_led_setting) + *p_led_setting = *__resp.p_led_setting; + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_led_get_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_led_set(const uint8_t led_ident, const uint8_t new_led_setting) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_led_set_rpcdata __req; + struct qcsapi_led_set_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __req.led_ident = (uint8_t)led_ident; + + __req.new_led_setting = (uint8_t)new_led_setting; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_LED_SET_REMOTE, + (xdrproc_t)xdr_qcsapi_led_set_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_led_set_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_led_set call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_led_set_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_led_set_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_led_pwm_enable(const uint8_t led_ident, const uint8_t onoff, const qcsapi_unsigned_int high_count, const qcsapi_unsigned_int low_count) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_led_pwm_enable_rpcdata __req; + struct qcsapi_led_pwm_enable_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __req.led_ident = (uint8_t)led_ident; + + __req.onoff = (uint8_t)onoff; + + __req.high_count = (unsigned int)high_count; + + __req.low_count = (unsigned int)low_count; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_LED_PWM_ENABLE_REMOTE, + (xdrproc_t)xdr_qcsapi_led_pwm_enable_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_led_pwm_enable_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_led_pwm_enable call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_led_pwm_enable_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_led_pwm_enable_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_led_brightness(const uint8_t led_ident, const qcsapi_unsigned_int level) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_led_brightness_rpcdata __req; + struct qcsapi_led_brightness_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __req.led_ident = (uint8_t)led_ident; + + __req.level = (unsigned int)level; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_LED_BRIGHTNESS_REMOTE, + (xdrproc_t)xdr_qcsapi_led_brightness_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_led_brightness_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_led_brightness call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_led_brightness_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_led_brightness_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_gpio_monitor_reset_device(const uint8_t reset_device_pin, const uint8_t active_logic, const int blocking_flag, reset_device_callback respond_reset_device) +{ + /* stubbed, not implemented */ + fprintf(stderr, "%s not implemented\n", "qcsapi_gpio_monitor_reset_device"); + return -qcsapi_programming_error; +} +int qcsapi_gpio_enable_wps_push_button(const uint8_t wps_push_button, const uint8_t active_logic, const uint8_t use_interrupt_flag) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_gpio_enable_wps_push_button_rpcdata __req; + struct qcsapi_gpio_enable_wps_push_button_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __req.wps_push_button = (uint8_t)wps_push_button; + + __req.active_logic = (uint8_t)active_logic; + + __req.use_interrupt_flag = (uint8_t)use_interrupt_flag; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_GPIO_ENABLE_WPS_PUSH_BUTTON_REMOTE, + (xdrproc_t)xdr_qcsapi_gpio_enable_wps_push_button_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_gpio_enable_wps_push_button_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_gpio_enable_wps_push_button call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_gpio_enable_wps_push_button_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_gpio_enable_wps_push_button_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_get_count_associations(const char * ifname, qcsapi_unsigned_int * p_association_count) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_get_count_associations_rpcdata __req; + struct qcsapi_wifi_get_count_associations_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.p_association_count = (unsigned int *)p_association_count; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_GET_COUNT_ASSOCIATIONS_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_get_count_associations_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_get_count_associations_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_get_count_associations call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_count_associations_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (p_association_count) + *p_association_count = *__resp.p_association_count; + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_count_associations_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_get_associated_device_mac_addr(const char * ifname, const qcsapi_unsigned_int device_index, qcsapi_mac_addr device_mac_addr) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_get_associated_device_mac_addr_rpcdata __req; + struct qcsapi_wifi_get_associated_device_mac_addr_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.device_index = (unsigned int)device_index; + + struct __rpc_qcsapi_mac_addr __rpcdevice_mac_addr; + if (device_mac_addr) { + memcpy(__rpcdevice_mac_addr.data, device_mac_addr, sizeof(__rpcdevice_mac_addr)); + __req.device_mac_addr = &__rpcdevice_mac_addr; + } else { + __req.device_mac_addr = NULL; + } + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_GET_ASSOCIATED_DEVICE_MAC_ADDR_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_get_associated_device_mac_addr_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_get_associated_device_mac_addr_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_get_associated_device_mac_addr call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_associated_device_mac_addr_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (device_mac_addr && __resp.device_mac_addr) + memcpy(device_mac_addr, __resp.device_mac_addr->data, + sizeof(qcsapi_mac_addr)); + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_associated_device_mac_addr_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_get_associated_device_ip_addr(const char * ifname, const qcsapi_unsigned_int device_index, unsigned int * ip_addr) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_get_associated_device_ip_addr_rpcdata __req; + struct qcsapi_wifi_get_associated_device_ip_addr_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.device_index = (unsigned int)device_index; + + __req.ip_addr = (unsigned int *)ip_addr; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_GET_ASSOCIATED_DEVICE_IP_ADDR_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_get_associated_device_ip_addr_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_get_associated_device_ip_addr_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_get_associated_device_ip_addr call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_associated_device_ip_addr_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (ip_addr) + *ip_addr = *__resp.ip_addr; + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_associated_device_ip_addr_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_get_link_quality(const char * ifname, const qcsapi_unsigned_int association_index, qcsapi_unsigned_int * p_link_quality) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_get_link_quality_rpcdata __req; + struct qcsapi_wifi_get_link_quality_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.association_index = (unsigned int)association_index; + + __req.p_link_quality = (unsigned int *)p_link_quality; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_GET_LINK_QUALITY_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_get_link_quality_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_get_link_quality_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_get_link_quality call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_link_quality_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (p_link_quality) + *p_link_quality = *__resp.p_link_quality; + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_link_quality_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_get_link_quality_max(const char * ifname, qcsapi_unsigned_int * p_max_quality) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_get_link_quality_max_rpcdata __req; + struct qcsapi_wifi_get_link_quality_max_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.p_max_quality = (unsigned int *)p_max_quality; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_GET_LINK_QUALITY_MAX_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_get_link_quality_max_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_get_link_quality_max_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_get_link_quality_max call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_link_quality_max_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (p_max_quality) + *p_max_quality = *__resp.p_max_quality; + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_link_quality_max_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_get_rx_bytes_per_association(const char * ifname, const qcsapi_unsigned_int association_index, u_int64_t * p_rx_bytes) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_get_rx_bytes_per_association_rpcdata __req; + struct qcsapi_wifi_get_rx_bytes_per_association_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.association_index = (unsigned int)association_index; + + __req.p_rx_bytes = (uint64_t *)p_rx_bytes; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_GET_RX_BYTES_PER_ASSOCIATION_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_get_rx_bytes_per_association_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_get_rx_bytes_per_association_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_get_rx_bytes_per_association call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_rx_bytes_per_association_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (p_rx_bytes) + *p_rx_bytes = *__resp.p_rx_bytes; + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_rx_bytes_per_association_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_get_tx_bytes_per_association(const char * ifname, const qcsapi_unsigned_int association_index, u_int64_t * p_tx_bytes) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_get_tx_bytes_per_association_rpcdata __req; + struct qcsapi_wifi_get_tx_bytes_per_association_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.association_index = (unsigned int)association_index; + + __req.p_tx_bytes = (uint64_t *)p_tx_bytes; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_GET_TX_BYTES_PER_ASSOCIATION_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_get_tx_bytes_per_association_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_get_tx_bytes_per_association_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_get_tx_bytes_per_association call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_tx_bytes_per_association_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (p_tx_bytes) + *p_tx_bytes = *__resp.p_tx_bytes; + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_tx_bytes_per_association_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_get_rx_packets_per_association(const char * ifname, const qcsapi_unsigned_int association_index, qcsapi_unsigned_int * p_rx_packets) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_get_rx_packets_per_association_rpcdata __req; + struct qcsapi_wifi_get_rx_packets_per_association_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.association_index = (unsigned int)association_index; + + __req.p_rx_packets = (unsigned int *)p_rx_packets; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_GET_RX_PACKETS_PER_ASSOCIATION_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_get_rx_packets_per_association_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_get_rx_packets_per_association_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_get_rx_packets_per_association call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_rx_packets_per_association_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (p_rx_packets) + *p_rx_packets = *__resp.p_rx_packets; + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_rx_packets_per_association_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_get_tx_packets_per_association(const char * ifname, const qcsapi_unsigned_int association_index, qcsapi_unsigned_int * p_tx_packets) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_get_tx_packets_per_association_rpcdata __req; + struct qcsapi_wifi_get_tx_packets_per_association_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.association_index = (unsigned int)association_index; + + __req.p_tx_packets = (unsigned int *)p_tx_packets; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_GET_TX_PACKETS_PER_ASSOCIATION_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_get_tx_packets_per_association_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_get_tx_packets_per_association_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_get_tx_packets_per_association call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_tx_packets_per_association_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (p_tx_packets) + *p_tx_packets = *__resp.p_tx_packets; + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_tx_packets_per_association_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_get_tx_err_packets_per_association(const char * ifname, const qcsapi_unsigned_int association_index, qcsapi_unsigned_int * p_tx_err_packets) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_get_tx_err_packets_per_association_rpcdata __req; + struct qcsapi_wifi_get_tx_err_packets_per_association_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.association_index = (unsigned int)association_index; + + __req.p_tx_err_packets = (unsigned int *)p_tx_err_packets; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_GET_TX_ERR_PACKETS_PER_ASSOCIATION_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_get_tx_err_packets_per_association_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_get_tx_err_packets_per_association_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_get_tx_err_packets_per_association call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_tx_err_packets_per_association_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (p_tx_err_packets) + *p_tx_err_packets = *__resp.p_tx_err_packets; + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_tx_err_packets_per_association_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_get_rssi_per_association(const char * ifname, const qcsapi_unsigned_int association_index, qcsapi_unsigned_int * p_rssi) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_get_rssi_per_association_rpcdata __req; + struct qcsapi_wifi_get_rssi_per_association_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.association_index = (unsigned int)association_index; + + __req.p_rssi = (unsigned int *)p_rssi; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_GET_RSSI_PER_ASSOCIATION_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_get_rssi_per_association_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_get_rssi_per_association_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_get_rssi_per_association call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_rssi_per_association_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (p_rssi) + *p_rssi = *__resp.p_rssi; + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_rssi_per_association_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_get_rssi_in_dbm_per_association(const char * ifname, const qcsapi_unsigned_int association_index, int * p_rssi) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_get_rssi_in_dbm_per_association_rpcdata __req; + struct qcsapi_wifi_get_rssi_in_dbm_per_association_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.association_index = (unsigned int)association_index; + + __req.p_rssi = (int *)p_rssi; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_GET_RSSI_IN_DBM_PER_ASSOCIATION_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_get_rssi_in_dbm_per_association_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_get_rssi_in_dbm_per_association_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_get_rssi_in_dbm_per_association call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_rssi_in_dbm_per_association_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (p_rssi) + *p_rssi = *__resp.p_rssi; + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_rssi_in_dbm_per_association_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_get_bw_per_association(const char * ifname, const qcsapi_unsigned_int association_index, qcsapi_unsigned_int * p_bw) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_get_bw_per_association_rpcdata __req; + struct qcsapi_wifi_get_bw_per_association_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.association_index = (unsigned int)association_index; + + __req.p_bw = (unsigned int *)p_bw; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_GET_BW_PER_ASSOCIATION_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_get_bw_per_association_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_get_bw_per_association_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_get_bw_per_association call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_bw_per_association_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (p_bw) + *p_bw = *__resp.p_bw; + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_bw_per_association_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_get_tx_phy_rate_per_association(const char * ifname, const qcsapi_unsigned_int association_index, qcsapi_unsigned_int * p_tx_phy_rate) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_get_tx_phy_rate_per_association_rpcdata __req; + struct qcsapi_wifi_get_tx_phy_rate_per_association_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.association_index = (unsigned int)association_index; + + __req.p_tx_phy_rate = (unsigned int *)p_tx_phy_rate; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_GET_TX_PHY_RATE_PER_ASSOCIATION_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_get_tx_phy_rate_per_association_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_get_tx_phy_rate_per_association_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_get_tx_phy_rate_per_association call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_tx_phy_rate_per_association_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (p_tx_phy_rate) + *p_tx_phy_rate = *__resp.p_tx_phy_rate; + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_tx_phy_rate_per_association_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_get_rx_phy_rate_per_association(const char * ifname, const qcsapi_unsigned_int association_index, qcsapi_unsigned_int * p_rx_phy_rate) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_get_rx_phy_rate_per_association_rpcdata __req; + struct qcsapi_wifi_get_rx_phy_rate_per_association_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.association_index = (unsigned int)association_index; + + __req.p_rx_phy_rate = (unsigned int *)p_rx_phy_rate; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_GET_RX_PHY_RATE_PER_ASSOCIATION_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_get_rx_phy_rate_per_association_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_get_rx_phy_rate_per_association_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_get_rx_phy_rate_per_association call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_rx_phy_rate_per_association_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (p_rx_phy_rate) + *p_rx_phy_rate = *__resp.p_rx_phy_rate; + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_rx_phy_rate_per_association_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_get_tx_mcs_per_association(const char * ifname, const qcsapi_unsigned_int association_index, qcsapi_unsigned_int * p_mcs) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_get_tx_mcs_per_association_rpcdata __req; + struct qcsapi_wifi_get_tx_mcs_per_association_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.association_index = (unsigned int)association_index; + + __req.p_mcs = (unsigned int *)p_mcs; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_GET_TX_MCS_PER_ASSOCIATION_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_get_tx_mcs_per_association_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_get_tx_mcs_per_association_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_get_tx_mcs_per_association call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_tx_mcs_per_association_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (p_mcs) + *p_mcs = *__resp.p_mcs; + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_tx_mcs_per_association_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_get_rx_mcs_per_association(const char * ifname, const qcsapi_unsigned_int association_index, qcsapi_unsigned_int * p_mcs) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_get_rx_mcs_per_association_rpcdata __req; + struct qcsapi_wifi_get_rx_mcs_per_association_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.association_index = (unsigned int)association_index; + + __req.p_mcs = (unsigned int *)p_mcs; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_GET_RX_MCS_PER_ASSOCIATION_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_get_rx_mcs_per_association_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_get_rx_mcs_per_association_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_get_rx_mcs_per_association call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_rx_mcs_per_association_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (p_mcs) + *p_mcs = *__resp.p_mcs; + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_rx_mcs_per_association_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_get_achievable_tx_phy_rate_per_association(const char * ifname, const qcsapi_unsigned_int association_index, qcsapi_unsigned_int * p_achievable_tx_phy_rate) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_get_achievable_tx_phy_rate_per_association_rpcdata __req; + struct qcsapi_wifi_get_achievable_tx_phy_rate_per_association_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.association_index = (unsigned int)association_index; + + __req.p_achievable_tx_phy_rate = (unsigned int *)p_achievable_tx_phy_rate; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_GET_ACHIEVABLE_TX_PHY_RATE_PER_ASSOCIATION_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_get_achievable_tx_phy_rate_per_association_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_get_achievable_tx_phy_rate_per_association_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_get_achievable_tx_phy_rate_per_association call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_achievable_tx_phy_rate_per_association_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (p_achievable_tx_phy_rate) + *p_achievable_tx_phy_rate = *__resp.p_achievable_tx_phy_rate; + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_achievable_tx_phy_rate_per_association_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_get_achievable_rx_phy_rate_per_association(const char * ifname, const qcsapi_unsigned_int association_index, qcsapi_unsigned_int * p_achievable_rx_phy_rate) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_get_achievable_rx_phy_rate_per_association_rpcdata __req; + struct qcsapi_wifi_get_achievable_rx_phy_rate_per_association_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.association_index = (unsigned int)association_index; + + __req.p_achievable_rx_phy_rate = (unsigned int *)p_achievable_rx_phy_rate; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_GET_ACHIEVABLE_RX_PHY_RATE_PER_ASSOCIATION_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_get_achievable_rx_phy_rate_per_association_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_get_achievable_rx_phy_rate_per_association_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_get_achievable_rx_phy_rate_per_association call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_achievable_rx_phy_rate_per_association_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (p_achievable_rx_phy_rate) + *p_achievable_rx_phy_rate = *__resp.p_achievable_rx_phy_rate; + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_achievable_rx_phy_rate_per_association_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_get_auth_enc_per_association(const char * ifname, const qcsapi_unsigned_int association_index, qcsapi_unsigned_int * p_auth_enc) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_get_auth_enc_per_association_rpcdata __req; + struct qcsapi_wifi_get_auth_enc_per_association_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.association_index = (unsigned int)association_index; + + __req.p_auth_enc = (unsigned int *)p_auth_enc; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_GET_AUTH_ENC_PER_ASSOCIATION_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_get_auth_enc_per_association_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_get_auth_enc_per_association_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_get_auth_enc_per_association call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_auth_enc_per_association_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (p_auth_enc) + *p_auth_enc = *__resp.p_auth_enc; + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_auth_enc_per_association_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_get_tput_caps(const char * ifname, const qcsapi_unsigned_int association_index, struct ieee8011req_sta_tput_caps * tput_caps) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_get_tput_caps_rpcdata __req; + struct qcsapi_wifi_get_tput_caps_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.association_index = (unsigned int)association_index; + + __req.tput_caps = (__rpc_ieee8011req_sta_tput_caps*)tput_caps; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_GET_TPUT_CAPS_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_get_tput_caps_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_get_tput_caps_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_get_tput_caps call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_tput_caps_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (__resp.tput_caps && tput_caps) + memcpy(tput_caps, __resp.tput_caps, sizeof(*tput_caps)); + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_tput_caps_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_get_connection_mode(const char * ifname, const qcsapi_unsigned_int association_index, qcsapi_unsigned_int * connection_mode) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_get_connection_mode_rpcdata __req; + struct qcsapi_wifi_get_connection_mode_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.association_index = (unsigned int)association_index; + + __req.connection_mode = (unsigned int *)connection_mode; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_GET_CONNECTION_MODE_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_get_connection_mode_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_get_connection_mode_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_get_connection_mode call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_connection_mode_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (connection_mode) + *connection_mode = *__resp.connection_mode; + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_connection_mode_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_get_vendor_per_association(const char * ifname, const qcsapi_unsigned_int association_index, qcsapi_unsigned_int * p_vendor) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_get_vendor_per_association_rpcdata __req; + struct qcsapi_wifi_get_vendor_per_association_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.association_index = (unsigned int)association_index; + + __req.p_vendor = (unsigned int *)p_vendor; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_GET_VENDOR_PER_ASSOCIATION_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_get_vendor_per_association_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_get_vendor_per_association_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_get_vendor_per_association call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_vendor_per_association_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (p_vendor) + *p_vendor = *__resp.p_vendor; + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_vendor_per_association_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_get_max_mimo(const char * ifname, const qcsapi_unsigned_int association_index, string_16 p_max_mimo) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_get_max_mimo_rpcdata __req; + struct qcsapi_wifi_get_max_mimo_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.association_index = (unsigned int)association_index; + + __rpc_string __rpcp_max_mimo = {(char *)p_max_mimo}; + __rpc_string *p__rpcp_max_mimo = (p_max_mimo) ? &__rpcp_max_mimo : NULL; + __req.p_max_mimo = p__rpcp_max_mimo; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_GET_MAX_MIMO_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_get_max_mimo_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_get_max_mimo_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_get_max_mimo call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_max_mimo_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (p_max_mimo && __resp.p_max_mimo) + strcpy(p_max_mimo, __resp.p_max_mimo->data); + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_max_mimo_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_get_snr_per_association(const char * ifname, const qcsapi_unsigned_int association_index, int * p_snr) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_get_snr_per_association_rpcdata __req; + struct qcsapi_wifi_get_snr_per_association_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.association_index = (unsigned int)association_index; + + __req.p_snr = (int *)p_snr; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_GET_SNR_PER_ASSOCIATION_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_get_snr_per_association_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_get_snr_per_association_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_get_snr_per_association call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_snr_per_association_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (p_snr) + *p_snr = *__resp.p_snr; + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_snr_per_association_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_get_time_associated_per_association(const char * ifname, const qcsapi_unsigned_int association_index, qcsapi_unsigned_int * time_associated) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_get_time_associated_per_association_rpcdata __req; + struct qcsapi_wifi_get_time_associated_per_association_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.association_index = (unsigned int)association_index; + + __req.time_associated = (unsigned int *)time_associated; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_GET_TIME_ASSOCIATED_PER_ASSOCIATION_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_get_time_associated_per_association_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_get_time_associated_per_association_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_get_time_associated_per_association call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_time_associated_per_association_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (time_associated) + *time_associated = *__resp.time_associated; + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_time_associated_per_association_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_get_node_param(const char * ifname, const uint32_t node_index, qcsapi_per_assoc_param param_type, int local_remote_flag, string_128 input_param_str, qcsapi_measure_report_result * report_result) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_get_node_param_rpcdata __req; + struct qcsapi_wifi_get_node_param_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.node_index = (uint32_t)node_index; + + __req.param_type = (int)param_type; + + __req.local_remote_flag = (int)local_remote_flag; + + __rpc_string __rpcinput_param_str = {(char *)input_param_str}; + __rpc_string *p__rpcinput_param_str = (input_param_str) ? &__rpcinput_param_str : NULL; + __req.input_param_str = p__rpcinput_param_str; + + __req.report_result = (__rpc_qcsapi_measure_report_result*)report_result; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_GET_NODE_PARAM_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_get_node_param_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_get_node_param_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_get_node_param call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_node_param_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (input_param_str && __resp.input_param_str) + strcpy(input_param_str, __resp.input_param_str->data); + } + if (__resp.return_code >= 0) { + if (__resp.report_result && report_result) + memcpy(report_result, __resp.report_result, sizeof(*report_result)); + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_node_param_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_get_node_counter(const char * ifname, const uint32_t node_index, qcsapi_counter_type counter_type, int local_remote_flag, uint64_t * p_value) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_get_node_counter_rpcdata __req; + struct qcsapi_wifi_get_node_counter_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.node_index = (uint32_t)node_index; + + __req.counter_type = (int)counter_type; + + __req.local_remote_flag = (int)local_remote_flag; + + __req.p_value = (uint64_t *)p_value; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_GET_NODE_COUNTER_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_get_node_counter_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_get_node_counter_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_get_node_counter call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_node_counter_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (p_value) + *p_value = *__resp.p_value; + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_node_counter_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_get_node_stats(const char * ifname, const uint32_t node_index, int local_remote_flag, struct qcsapi_node_stats * p_stats) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_get_node_stats_rpcdata __req; + struct qcsapi_wifi_get_node_stats_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.node_index = (uint32_t)node_index; + + __req.local_remote_flag = (int)local_remote_flag; + + __req.p_stats = (__rpc_qcsapi_node_stats*)p_stats; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_GET_NODE_STATS_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_get_node_stats_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_get_node_stats_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_get_node_stats call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_node_stats_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (__resp.p_stats && p_stats) + memcpy(p_stats, __resp.p_stats, sizeof(*p_stats)); + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_node_stats_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_get_max_queued(const char * ifname, const uint32_t node_index, int local_remote_flag, int reset_flag, uint32_t * max_queued) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_get_max_queued_rpcdata __req; + struct qcsapi_wifi_get_max_queued_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.node_index = (uint32_t)node_index; + + __req.local_remote_flag = (int)local_remote_flag; + + __req.reset_flag = (int)reset_flag; + + __req.max_queued = (uint32_t *)max_queued; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_GET_MAX_QUEUED_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_get_max_queued_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_get_max_queued_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_get_max_queued call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_max_queued_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (max_queued) + *max_queued = *__resp.max_queued; + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_max_queued_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_get_hw_noise_per_association(const char * ifname, const qcsapi_unsigned_int association_index, int * p_hw_noise) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_get_hw_noise_per_association_rpcdata __req; + struct qcsapi_wifi_get_hw_noise_per_association_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.association_index = (unsigned int)association_index; + + __req.p_hw_noise = (int *)p_hw_noise; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_GET_HW_NOISE_PER_ASSOCIATION_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_get_hw_noise_per_association_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_get_hw_noise_per_association_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_get_hw_noise_per_association call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_hw_noise_per_association_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (p_hw_noise) + *p_hw_noise = *__resp.p_hw_noise; + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_hw_noise_per_association_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_get_mlme_stats_per_mac(const qcsapi_mac_addr client_mac_addr, qcsapi_mlme_stats * stats) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_get_mlme_stats_per_mac_rpcdata __req; + struct qcsapi_wifi_get_mlme_stats_per_mac_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + struct __rpc_qcsapi_mac_addr __rpcclient_mac_addr; + if (client_mac_addr) { + memcpy(__rpcclient_mac_addr.data, client_mac_addr, sizeof(__rpcclient_mac_addr)); + __req.client_mac_addr = &__rpcclient_mac_addr; + } else { + __req.client_mac_addr = NULL; + } + __req.stats = (__rpc_qcsapi_mlme_stats*)stats; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_GET_MLME_STATS_PER_MAC_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_get_mlme_stats_per_mac_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_get_mlme_stats_per_mac_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_get_mlme_stats_per_mac call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_mlme_stats_per_mac_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (__resp.stats && stats) + memcpy(stats, __resp.stats, sizeof(*stats)); + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_mlme_stats_per_mac_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_get_mlme_stats_per_association(const char * ifname, const qcsapi_unsigned_int association_index, qcsapi_mlme_stats * stats) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_get_mlme_stats_per_association_rpcdata __req; + struct qcsapi_wifi_get_mlme_stats_per_association_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.association_index = (unsigned int)association_index; + + __req.stats = (__rpc_qcsapi_mlme_stats*)stats; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_GET_MLME_STATS_PER_ASSOCIATION_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_get_mlme_stats_per_association_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_get_mlme_stats_per_association_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_get_mlme_stats_per_association call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_mlme_stats_per_association_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (__resp.stats && stats) + memcpy(stats, __resp.stats, sizeof(*stats)); + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_mlme_stats_per_association_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_get_mlme_stats_macs_list(qcsapi_mlme_stats_macs * macs_list) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_get_mlme_stats_macs_list_rpcdata __req; + struct qcsapi_wifi_get_mlme_stats_macs_list_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __req.macs_list = (__rpc_qcsapi_mlme_stats_macs*)macs_list; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_GET_MLME_STATS_MACS_LIST_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_get_mlme_stats_macs_list_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_get_mlme_stats_macs_list_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_get_mlme_stats_macs_list call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_mlme_stats_macs_list_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (__resp.macs_list && macs_list) + memcpy(macs_list, __resp.macs_list, sizeof(*macs_list)); + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_mlme_stats_macs_list_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_get_list_regulatory_regions(string_256 list_regulatory_regions) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_get_list_regulatory_regions_rpcdata __req; + struct qcsapi_wifi_get_list_regulatory_regions_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpclist_regulatory_regions = {(char *)list_regulatory_regions}; + __rpc_string *p__rpclist_regulatory_regions = (list_regulatory_regions) ? &__rpclist_regulatory_regions : NULL; + __req.list_regulatory_regions = p__rpclist_regulatory_regions; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_GET_LIST_REGULATORY_REGIONS_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_get_list_regulatory_regions_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_get_list_regulatory_regions_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_get_list_regulatory_regions call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_list_regulatory_regions_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (list_regulatory_regions && __resp.list_regulatory_regions) + strcpy(list_regulatory_regions, __resp.list_regulatory_regions->data); + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_list_regulatory_regions_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_regulatory_get_list_regulatory_regions(string_256 list_regulatory_regions) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_regulatory_get_list_regulatory_regions_rpcdata __req; + struct qcsapi_regulatory_get_list_regulatory_regions_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpclist_regulatory_regions = {(char *)list_regulatory_regions}; + __rpc_string *p__rpclist_regulatory_regions = (list_regulatory_regions) ? &__rpclist_regulatory_regions : NULL; + __req.list_regulatory_regions = p__rpclist_regulatory_regions; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_REGULATORY_GET_LIST_REGULATORY_REGIONS_REMOTE, + (xdrproc_t)xdr_qcsapi_regulatory_get_list_regulatory_regions_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_regulatory_get_list_regulatory_regions_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_regulatory_get_list_regulatory_regions call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_regulatory_get_list_regulatory_regions_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (list_regulatory_regions && __resp.list_regulatory_regions) + strcpy(list_regulatory_regions, __resp.list_regulatory_regions->data); + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_regulatory_get_list_regulatory_regions_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_get_list_regulatory_channels(const char * region_by_name, const qcsapi_unsigned_int bw, string_1024 list_of_channels) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_get_list_regulatory_channels_rpcdata __req; + struct qcsapi_wifi_get_list_regulatory_channels_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcregion_by_name = {(char *)region_by_name}; + __rpc_string *p__rpcregion_by_name = (region_by_name) ? &__rpcregion_by_name : NULL; + __req.region_by_name = p__rpcregion_by_name; + + __req.bw = (unsigned int)bw; + + __rpc_string __rpclist_of_channels = {(char *)list_of_channels}; + __rpc_string *p__rpclist_of_channels = (list_of_channels) ? &__rpclist_of_channels : NULL; + __req.list_of_channels = p__rpclist_of_channels; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_GET_LIST_REGULATORY_CHANNELS_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_get_list_regulatory_channels_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_get_list_regulatory_channels_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_get_list_regulatory_channels call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_list_regulatory_channels_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (list_of_channels && __resp.list_of_channels) + strcpy(list_of_channels, __resp.list_of_channels->data); + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_list_regulatory_channels_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_regulatory_get_list_regulatory_channels(const char * region_by_name, const qcsapi_unsigned_int bw, string_1024 list_of_channels) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_regulatory_get_list_regulatory_channels_rpcdata __req; + struct qcsapi_regulatory_get_list_regulatory_channels_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcregion_by_name = {(char *)region_by_name}; + __rpc_string *p__rpcregion_by_name = (region_by_name) ? &__rpcregion_by_name : NULL; + __req.region_by_name = p__rpcregion_by_name; + + __req.bw = (unsigned int)bw; + + __rpc_string __rpclist_of_channels = {(char *)list_of_channels}; + __rpc_string *p__rpclist_of_channels = (list_of_channels) ? &__rpclist_of_channels : NULL; + __req.list_of_channels = p__rpclist_of_channels; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_REGULATORY_GET_LIST_REGULATORY_CHANNELS_REMOTE, + (xdrproc_t)xdr_qcsapi_regulatory_get_list_regulatory_channels_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_regulatory_get_list_regulatory_channels_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_regulatory_get_list_regulatory_channels call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_regulatory_get_list_regulatory_channels_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (list_of_channels && __resp.list_of_channels) + strcpy(list_of_channels, __resp.list_of_channels->data); + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_regulatory_get_list_regulatory_channels_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_regulatory_get_list_regulatory_bands(const char * region_by_name, string_128 list_of_bands) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_regulatory_get_list_regulatory_bands_rpcdata __req; + struct qcsapi_regulatory_get_list_regulatory_bands_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcregion_by_name = {(char *)region_by_name}; + __rpc_string *p__rpcregion_by_name = (region_by_name) ? &__rpcregion_by_name : NULL; + __req.region_by_name = p__rpcregion_by_name; + + __rpc_string __rpclist_of_bands = {(char *)list_of_bands}; + __rpc_string *p__rpclist_of_bands = (list_of_bands) ? &__rpclist_of_bands : NULL; + __req.list_of_bands = p__rpclist_of_bands; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_REGULATORY_GET_LIST_REGULATORY_BANDS_REMOTE, + (xdrproc_t)xdr_qcsapi_regulatory_get_list_regulatory_bands_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_regulatory_get_list_regulatory_bands_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_regulatory_get_list_regulatory_bands call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_regulatory_get_list_regulatory_bands_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (list_of_bands && __resp.list_of_bands) + strcpy(list_of_bands, __resp.list_of_bands->data); + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_regulatory_get_list_regulatory_bands_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_get_regulatory_tx_power(const char * ifname, const qcsapi_unsigned_int the_channel, const char * region_by_name, int * p_tx_power) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_get_regulatory_tx_power_rpcdata __req; + struct qcsapi_wifi_get_regulatory_tx_power_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.the_channel = (unsigned int)the_channel; + + __rpc_string __rpcregion_by_name = {(char *)region_by_name}; + __rpc_string *p__rpcregion_by_name = (region_by_name) ? &__rpcregion_by_name : NULL; + __req.region_by_name = p__rpcregion_by_name; + + __req.p_tx_power = (int *)p_tx_power; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_GET_REGULATORY_TX_POWER_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_get_regulatory_tx_power_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_get_regulatory_tx_power_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_get_regulatory_tx_power call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_regulatory_tx_power_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (p_tx_power) + *p_tx_power = *__resp.p_tx_power; + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_regulatory_tx_power_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_regulatory_get_regulatory_tx_power(const char * ifname, const qcsapi_unsigned_int the_channel, const char * region_by_name, int * p_tx_power) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_regulatory_get_regulatory_tx_power_rpcdata __req; + struct qcsapi_regulatory_get_regulatory_tx_power_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.the_channel = (unsigned int)the_channel; + + __rpc_string __rpcregion_by_name = {(char *)region_by_name}; + __rpc_string *p__rpcregion_by_name = (region_by_name) ? &__rpcregion_by_name : NULL; + __req.region_by_name = p__rpcregion_by_name; + + __req.p_tx_power = (int *)p_tx_power; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_REGULATORY_GET_REGULATORY_TX_POWER_REMOTE, + (xdrproc_t)xdr_qcsapi_regulatory_get_regulatory_tx_power_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_regulatory_get_regulatory_tx_power_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_regulatory_get_regulatory_tx_power call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_regulatory_get_regulatory_tx_power_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (p_tx_power) + *p_tx_power = *__resp.p_tx_power; + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_regulatory_get_regulatory_tx_power_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_get_configured_tx_power(const char * ifname, const qcsapi_unsigned_int the_channel, const char * region_by_name, const qcsapi_unsigned_int bw, int * p_tx_power) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_get_configured_tx_power_rpcdata __req; + struct qcsapi_wifi_get_configured_tx_power_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.the_channel = (unsigned int)the_channel; + + __rpc_string __rpcregion_by_name = {(char *)region_by_name}; + __rpc_string *p__rpcregion_by_name = (region_by_name) ? &__rpcregion_by_name : NULL; + __req.region_by_name = p__rpcregion_by_name; + + __req.bw = (unsigned int)bw; + + __req.p_tx_power = (int *)p_tx_power; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_GET_CONFIGURED_TX_POWER_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_get_configured_tx_power_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_get_configured_tx_power_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_get_configured_tx_power call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_configured_tx_power_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (p_tx_power) + *p_tx_power = *__resp.p_tx_power; + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_configured_tx_power_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_regulatory_get_configured_tx_power(const char * ifname, const qcsapi_unsigned_int the_channel, const char * region_by_name, const qcsapi_unsigned_int bw, int * p_tx_power) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_regulatory_get_configured_tx_power_rpcdata __req; + struct qcsapi_regulatory_get_configured_tx_power_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.the_channel = (unsigned int)the_channel; + + __rpc_string __rpcregion_by_name = {(char *)region_by_name}; + __rpc_string *p__rpcregion_by_name = (region_by_name) ? &__rpcregion_by_name : NULL; + __req.region_by_name = p__rpcregion_by_name; + + __req.bw = (unsigned int)bw; + + __req.p_tx_power = (int *)p_tx_power; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_REGULATORY_GET_CONFIGURED_TX_POWER_REMOTE, + (xdrproc_t)xdr_qcsapi_regulatory_get_configured_tx_power_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_regulatory_get_configured_tx_power_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_regulatory_get_configured_tx_power call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_regulatory_get_configured_tx_power_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (p_tx_power) + *p_tx_power = *__resp.p_tx_power; + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_regulatory_get_configured_tx_power_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_regulatory_get_configured_tx_power_ext(const char * ifname, const qcsapi_unsigned_int the_channel, const char * region_by_name, const qcsapi_bw the_bw, const qcsapi_unsigned_int bf_on, const qcsapi_unsigned_int number_ss, int * p_tx_power) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_regulatory_get_configured_tx_power_ext_rpcdata __req; + struct qcsapi_regulatory_get_configured_tx_power_ext_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.the_channel = (unsigned int)the_channel; + + __rpc_string __rpcregion_by_name = {(char *)region_by_name}; + __rpc_string *p__rpcregion_by_name = (region_by_name) ? &__rpcregion_by_name : NULL; + __req.region_by_name = p__rpcregion_by_name; + + __req.the_bw = (int)the_bw; + + __req.bf_on = (unsigned int)bf_on; + + __req.number_ss = (unsigned int)number_ss; + + __req.p_tx_power = (int *)p_tx_power; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_REGULATORY_GET_CONFIGURED_TX_POWER_EXT_REMOTE, + (xdrproc_t)xdr_qcsapi_regulatory_get_configured_tx_power_ext_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_regulatory_get_configured_tx_power_ext_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_regulatory_get_configured_tx_power_ext call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_regulatory_get_configured_tx_power_ext_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (p_tx_power) + *p_tx_power = *__resp.p_tx_power; + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_regulatory_get_configured_tx_power_ext_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_set_regulatory_region(const char * ifname, const char * region_by_name) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_set_regulatory_region_rpcdata __req; + struct qcsapi_wifi_set_regulatory_region_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __rpc_string __rpcregion_by_name = {(char *)region_by_name}; + __rpc_string *p__rpcregion_by_name = (region_by_name) ? &__rpcregion_by_name : NULL; + __req.region_by_name = p__rpcregion_by_name; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_SET_REGULATORY_REGION_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_set_regulatory_region_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_set_regulatory_region_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_set_regulatory_region call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_set_regulatory_region_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_set_regulatory_region_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_regulatory_set_regulatory_region(const char * ifname, const char * region_by_name) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_regulatory_set_regulatory_region_rpcdata __req; + struct qcsapi_regulatory_set_regulatory_region_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __rpc_string __rpcregion_by_name = {(char *)region_by_name}; + __rpc_string *p__rpcregion_by_name = (region_by_name) ? &__rpcregion_by_name : NULL; + __req.region_by_name = p__rpcregion_by_name; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_REGULATORY_SET_REGULATORY_REGION_REMOTE, + (xdrproc_t)xdr_qcsapi_regulatory_set_regulatory_region_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_regulatory_set_regulatory_region_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_regulatory_set_regulatory_region call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_regulatory_set_regulatory_region_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_regulatory_set_regulatory_region_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_regulatory_restore_regulatory_tx_power(const char * ifname) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_regulatory_restore_regulatory_tx_power_rpcdata __req; + struct qcsapi_regulatory_restore_regulatory_tx_power_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_REGULATORY_RESTORE_REGULATORY_TX_POWER_REMOTE, + (xdrproc_t)xdr_qcsapi_regulatory_restore_regulatory_tx_power_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_regulatory_restore_regulatory_tx_power_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_regulatory_restore_regulatory_tx_power call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_regulatory_restore_regulatory_tx_power_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_regulatory_restore_regulatory_tx_power_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_get_regulatory_region(const char * ifname, char * region_by_name) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_get_regulatory_region_rpcdata __req; + struct qcsapi_wifi_get_regulatory_region_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __rpc_string __rpcregion_by_name = {(char *)region_by_name}; + __rpc_string *p__rpcregion_by_name = (region_by_name) ? &__rpcregion_by_name : NULL; + __req.region_by_name = p__rpcregion_by_name; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_GET_REGULATORY_REGION_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_get_regulatory_region_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_get_regulatory_region_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_get_regulatory_region call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_regulatory_region_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (region_by_name && __resp.region_by_name) + strcpy(region_by_name, __resp.region_by_name->data); + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_regulatory_region_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_regulatory_overwrite_country_code(const char * ifname, const char * curr_country_name, const char * new_country_name) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_regulatory_overwrite_country_code_rpcdata __req; + struct qcsapi_regulatory_overwrite_country_code_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __rpc_string __rpccurr_country_name = {(char *)curr_country_name}; + __rpc_string *p__rpccurr_country_name = (curr_country_name) ? &__rpccurr_country_name : NULL; + __req.curr_country_name = p__rpccurr_country_name; + + __rpc_string __rpcnew_country_name = {(char *)new_country_name}; + __rpc_string *p__rpcnew_country_name = (new_country_name) ? &__rpcnew_country_name : NULL; + __req.new_country_name = p__rpcnew_country_name; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_REGULATORY_OVERWRITE_COUNTRY_CODE_REMOTE, + (xdrproc_t)xdr_qcsapi_regulatory_overwrite_country_code_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_regulatory_overwrite_country_code_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_regulatory_overwrite_country_code call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_regulatory_overwrite_country_code_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_regulatory_overwrite_country_code_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_set_regulatory_channel(const char * ifname, const qcsapi_unsigned_int the_channel, const char * region_by_name, const qcsapi_unsigned_int tx_power_offset) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_set_regulatory_channel_rpcdata __req; + struct qcsapi_wifi_set_regulatory_channel_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.the_channel = (unsigned int)the_channel; + + __rpc_string __rpcregion_by_name = {(char *)region_by_name}; + __rpc_string *p__rpcregion_by_name = (region_by_name) ? &__rpcregion_by_name : NULL; + __req.region_by_name = p__rpcregion_by_name; + + __req.tx_power_offset = (unsigned int)tx_power_offset; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_SET_REGULATORY_CHANNEL_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_set_regulatory_channel_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_set_regulatory_channel_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_set_regulatory_channel call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_set_regulatory_channel_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_set_regulatory_channel_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_regulatory_set_regulatory_channel(const char * ifname, const qcsapi_unsigned_int the_channel, const char * region_by_name, const qcsapi_unsigned_int tx_power_offset) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_regulatory_set_regulatory_channel_rpcdata __req; + struct qcsapi_regulatory_set_regulatory_channel_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.the_channel = (unsigned int)the_channel; + + __rpc_string __rpcregion_by_name = {(char *)region_by_name}; + __rpc_string *p__rpcregion_by_name = (region_by_name) ? &__rpcregion_by_name : NULL; + __req.region_by_name = p__rpcregion_by_name; + + __req.tx_power_offset = (unsigned int)tx_power_offset; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_REGULATORY_SET_REGULATORY_CHANNEL_REMOTE, + (xdrproc_t)xdr_qcsapi_regulatory_set_regulatory_channel_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_regulatory_set_regulatory_channel_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_regulatory_set_regulatory_channel call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_regulatory_set_regulatory_channel_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_regulatory_set_regulatory_channel_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_regulatory_get_db_version(int * p_version, const int index) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_regulatory_get_db_version_rpcdata __req; + struct qcsapi_regulatory_get_db_version_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __req.p_version = (int *)p_version; + + __req.index = (int)index; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_REGULATORY_GET_DB_VERSION_REMOTE, + (xdrproc_t)xdr_qcsapi_regulatory_get_db_version_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_regulatory_get_db_version_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_regulatory_get_db_version call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_regulatory_get_db_version_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (p_version) + *p_version = *__resp.p_version; + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_regulatory_get_db_version_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_regulatory_apply_tx_power_cap(int capped) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_regulatory_apply_tx_power_cap_rpcdata __req; + struct qcsapi_regulatory_apply_tx_power_cap_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __req.capped = (int)capped; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_REGULATORY_APPLY_TX_POWER_CAP_REMOTE, + (xdrproc_t)xdr_qcsapi_regulatory_apply_tx_power_cap_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_regulatory_apply_tx_power_cap_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_regulatory_apply_tx_power_cap call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_regulatory_apply_tx_power_cap_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_regulatory_apply_tx_power_cap_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_get_list_DFS_channels(const char * region_by_name, const int DFS_flag, const qcsapi_unsigned_int bw, string_1024 list_of_channels) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_get_list_DFS_channels_rpcdata __req; + struct qcsapi_wifi_get_list_DFS_channels_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcregion_by_name = {(char *)region_by_name}; + __rpc_string *p__rpcregion_by_name = (region_by_name) ? &__rpcregion_by_name : NULL; + __req.region_by_name = p__rpcregion_by_name; + + __req.DFS_flag = (int)DFS_flag; + + __req.bw = (unsigned int)bw; + + __rpc_string __rpclist_of_channels = {(char *)list_of_channels}; + __rpc_string *p__rpclist_of_channels = (list_of_channels) ? &__rpclist_of_channels : NULL; + __req.list_of_channels = p__rpclist_of_channels; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_GET_LIST_DFS_CHANNELS_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_get_list_DFS_channels_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_get_list_DFS_channels_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_get_list_DFS_channels call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_list_DFS_channels_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (list_of_channels && __resp.list_of_channels) + strcpy(list_of_channels, __resp.list_of_channels->data); + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_list_DFS_channels_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_regulatory_get_list_DFS_channels(const char * region_by_name, const int DFS_flag, const qcsapi_unsigned_int bw, string_1024 list_of_channels) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_regulatory_get_list_DFS_channels_rpcdata __req; + struct qcsapi_regulatory_get_list_DFS_channels_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcregion_by_name = {(char *)region_by_name}; + __rpc_string *p__rpcregion_by_name = (region_by_name) ? &__rpcregion_by_name : NULL; + __req.region_by_name = p__rpcregion_by_name; + + __req.DFS_flag = (int)DFS_flag; + + __req.bw = (unsigned int)bw; + + __rpc_string __rpclist_of_channels = {(char *)list_of_channels}; + __rpc_string *p__rpclist_of_channels = (list_of_channels) ? &__rpclist_of_channels : NULL; + __req.list_of_channels = p__rpclist_of_channels; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_REGULATORY_GET_LIST_DFS_CHANNELS_REMOTE, + (xdrproc_t)xdr_qcsapi_regulatory_get_list_DFS_channels_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_regulatory_get_list_DFS_channels_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_regulatory_get_list_DFS_channels call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_regulatory_get_list_DFS_channels_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (list_of_channels && __resp.list_of_channels) + strcpy(list_of_channels, __resp.list_of_channels->data); + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_regulatory_get_list_DFS_channels_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_is_channel_DFS(const char * region_by_name, const qcsapi_unsigned_int the_channel, int * p_channel_is_DFS) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_is_channel_DFS_rpcdata __req; + struct qcsapi_wifi_is_channel_DFS_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcregion_by_name = {(char *)region_by_name}; + __rpc_string *p__rpcregion_by_name = (region_by_name) ? &__rpcregion_by_name : NULL; + __req.region_by_name = p__rpcregion_by_name; + + __req.the_channel = (unsigned int)the_channel; + + __req.p_channel_is_DFS = (int *)p_channel_is_DFS; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_IS_CHANNEL_DFS_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_is_channel_DFS_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_is_channel_DFS_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_is_channel_DFS call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_is_channel_DFS_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (p_channel_is_DFS) + *p_channel_is_DFS = *__resp.p_channel_is_DFS; + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_is_channel_DFS_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_regulatory_is_channel_DFS(const char * region_by_name, const qcsapi_unsigned_int the_channel, int * p_channel_is_DFS) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_regulatory_is_channel_DFS_rpcdata __req; + struct qcsapi_regulatory_is_channel_DFS_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcregion_by_name = {(char *)region_by_name}; + __rpc_string *p__rpcregion_by_name = (region_by_name) ? &__rpcregion_by_name : NULL; + __req.region_by_name = p__rpcregion_by_name; + + __req.the_channel = (unsigned int)the_channel; + + __req.p_channel_is_DFS = (int *)p_channel_is_DFS; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_REGULATORY_IS_CHANNEL_DFS_REMOTE, + (xdrproc_t)xdr_qcsapi_regulatory_is_channel_DFS_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_regulatory_is_channel_DFS_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_regulatory_is_channel_DFS call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_regulatory_is_channel_DFS_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (p_channel_is_DFS) + *p_channel_is_DFS = *__resp.p_channel_is_DFS; + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_regulatory_is_channel_DFS_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_get_dfs_cce_channels(const char * ifname, qcsapi_unsigned_int * p_prev_channel, qcsapi_unsigned_int * p_cur_channel) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_get_dfs_cce_channels_rpcdata __req; + struct qcsapi_wifi_get_dfs_cce_channels_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.p_prev_channel = (unsigned int *)p_prev_channel; + + __req.p_cur_channel = (unsigned int *)p_cur_channel; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_GET_DFS_CCE_CHANNELS_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_get_dfs_cce_channels_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_get_dfs_cce_channels_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_get_dfs_cce_channels call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_dfs_cce_channels_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (p_prev_channel) + *p_prev_channel = *__resp.p_prev_channel; + } + if (__resp.return_code >= 0) { + if (p_cur_channel) + *p_cur_channel = *__resp.p_cur_channel; + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_dfs_cce_channels_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_get_DFS_alt_channel(const char * ifname, qcsapi_unsigned_int * p_dfs_alt_chan) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_get_DFS_alt_channel_rpcdata __req; + struct qcsapi_wifi_get_DFS_alt_channel_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.p_dfs_alt_chan = (unsigned int *)p_dfs_alt_chan; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_GET_DFS_ALT_CHANNEL_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_get_DFS_alt_channel_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_get_DFS_alt_channel_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_get_DFS_alt_channel call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_DFS_alt_channel_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (p_dfs_alt_chan) + *p_dfs_alt_chan = *__resp.p_dfs_alt_chan; + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_DFS_alt_channel_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_set_DFS_alt_channel(const char * ifname, const qcsapi_unsigned_int dfs_alt_chan) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_set_DFS_alt_channel_rpcdata __req; + struct qcsapi_wifi_set_DFS_alt_channel_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.dfs_alt_chan = (unsigned int)dfs_alt_chan; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_SET_DFS_ALT_CHANNEL_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_set_DFS_alt_channel_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_set_DFS_alt_channel_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_set_DFS_alt_channel call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_set_DFS_alt_channel_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_set_DFS_alt_channel_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_start_dfs_reentry(const char * ifname) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_start_dfs_reentry_rpcdata __req; + struct qcsapi_wifi_start_dfs_reentry_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_START_DFS_REENTRY_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_start_dfs_reentry_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_start_dfs_reentry_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_start_dfs_reentry call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_start_dfs_reentry_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_start_dfs_reentry_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_start_scan_ext(const char * ifname, const int scan_flag) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_start_scan_ext_rpcdata __req; + struct qcsapi_wifi_start_scan_ext_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.scan_flag = (int)scan_flag; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_START_SCAN_EXT_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_start_scan_ext_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_start_scan_ext_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_start_scan_ext call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_start_scan_ext_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_start_scan_ext_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_get_csw_records(const char * ifname, int reset, qcsapi_csw_record * record) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_get_csw_records_rpcdata __req; + struct qcsapi_wifi_get_csw_records_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.reset = (int)reset; + + __req.record = (__rpc_qcsapi_csw_record*)record; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_GET_CSW_RECORDS_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_get_csw_records_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_get_csw_records_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_get_csw_records call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_csw_records_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (__resp.record && record) + memcpy(record, __resp.record, sizeof(*record)); + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_csw_records_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_get_radar_status(const char * ifname, qcsapi_radar_status * rdstatus) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_get_radar_status_rpcdata __req; + struct qcsapi_wifi_get_radar_status_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.rdstatus = (__rpc_qcsapi_radar_status*)rdstatus; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_GET_RADAR_STATUS_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_get_radar_status_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_get_radar_status_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_get_radar_status call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_radar_status_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (__resp.rdstatus && rdstatus) + memcpy(rdstatus, __resp.rdstatus, sizeof(*rdstatus)); + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_radar_status_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_get_cac_status(const char * ifname, int * cacstatus) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_get_cac_status_rpcdata __req; + struct qcsapi_wifi_get_cac_status_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.cacstatus = (int *)cacstatus; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_GET_CAC_STATUS_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_get_cac_status_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_get_cac_status_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_get_cac_status call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_cac_status_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (cacstatus) + *cacstatus = *__resp.cacstatus; + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_cac_status_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_get_results_AP_scan(const char * ifname, qcsapi_unsigned_int * p_count_APs) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_get_results_AP_scan_rpcdata __req; + struct qcsapi_wifi_get_results_AP_scan_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.p_count_APs = (unsigned int *)p_count_APs; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_GET_RESULTS_AP_SCAN_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_get_results_AP_scan_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_get_results_AP_scan_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_get_results_AP_scan call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_results_AP_scan_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (p_count_APs) + *p_count_APs = *__resp.p_count_APs; + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_results_AP_scan_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_get_count_APs_scanned(const char * ifname, qcsapi_unsigned_int * p_count_APs) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_get_count_APs_scanned_rpcdata __req; + struct qcsapi_wifi_get_count_APs_scanned_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.p_count_APs = (unsigned int *)p_count_APs; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_GET_COUNT_APS_SCANNED_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_get_count_APs_scanned_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_get_count_APs_scanned_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_get_count_APs_scanned call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_count_APs_scanned_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (p_count_APs) + *p_count_APs = *__resp.p_count_APs; + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_count_APs_scanned_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_get_properties_AP(const char * ifname, const qcsapi_unsigned_int index_AP, qcsapi_ap_properties * p_ap_properties) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_get_properties_AP_rpcdata __req; + struct qcsapi_wifi_get_properties_AP_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.index_AP = (unsigned int)index_AP; + + __req.p_ap_properties = (__rpc_qcsapi_ap_properties*)p_ap_properties; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_GET_PROPERTIES_AP_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_get_properties_AP_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_get_properties_AP_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_get_properties_AP call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_properties_AP_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (__resp.p_ap_properties && p_ap_properties) + memcpy(p_ap_properties, __resp.p_ap_properties, sizeof(*p_ap_properties)); + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_properties_AP_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_set_scan_chk_inv(const char * ifname, int scan_chk_inv) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_set_scan_chk_inv_rpcdata __req; + struct qcsapi_wifi_set_scan_chk_inv_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.scan_chk_inv = (int)scan_chk_inv; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_SET_SCAN_CHK_INV_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_set_scan_chk_inv_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_set_scan_chk_inv_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_set_scan_chk_inv call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_set_scan_chk_inv_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_set_scan_chk_inv_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_get_scan_chk_inv(const char * ifname, int * p) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_get_scan_chk_inv_rpcdata __req; + struct qcsapi_wifi_get_scan_chk_inv_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.p = (int *)p; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_GET_SCAN_CHK_INV_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_get_scan_chk_inv_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_get_scan_chk_inv_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_get_scan_chk_inv call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_scan_chk_inv_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (p) + *p = *__resp.p; + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_scan_chk_inv_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_set_scan_buf_max_size(const char * ifname, const unsigned int max_buf_size) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_set_scan_buf_max_size_rpcdata __req; + struct qcsapi_wifi_set_scan_buf_max_size_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.max_buf_size = (unsigned int)max_buf_size; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_SET_SCAN_BUF_MAX_SIZE_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_set_scan_buf_max_size_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_set_scan_buf_max_size_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_set_scan_buf_max_size call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_set_scan_buf_max_size_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_set_scan_buf_max_size_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_get_scan_buf_max_size(const char * ifname, unsigned int * max_buf_size) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_get_scan_buf_max_size_rpcdata __req; + struct qcsapi_wifi_get_scan_buf_max_size_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.max_buf_size = (unsigned int *)max_buf_size; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_GET_SCAN_BUF_MAX_SIZE_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_get_scan_buf_max_size_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_get_scan_buf_max_size_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_get_scan_buf_max_size call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_scan_buf_max_size_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (max_buf_size) + *max_buf_size = *__resp.max_buf_size; + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_scan_buf_max_size_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_set_scan_table_max_len(const char * ifname, const unsigned int max_table_len) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_set_scan_table_max_len_rpcdata __req; + struct qcsapi_wifi_set_scan_table_max_len_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.max_table_len = (unsigned int)max_table_len; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_SET_SCAN_TABLE_MAX_LEN_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_set_scan_table_max_len_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_set_scan_table_max_len_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_set_scan_table_max_len call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_set_scan_table_max_len_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_set_scan_table_max_len_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_get_scan_table_max_len(const char * ifname, unsigned int * max_table_len) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_get_scan_table_max_len_rpcdata __req; + struct qcsapi_wifi_get_scan_table_max_len_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.max_table_len = (unsigned int *)max_table_len; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_GET_SCAN_TABLE_MAX_LEN_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_get_scan_table_max_len_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_get_scan_table_max_len_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_get_scan_table_max_len call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_scan_table_max_len_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (max_table_len) + *max_table_len = *__resp.max_table_len; + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_scan_table_max_len_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_set_dwell_times(const char * ifname, const unsigned int max_dwell_time_active_chan, const unsigned int min_dwell_time_active_chan, const unsigned int max_dwell_time_passive_chan, const unsigned int min_dwell_time_passive_chan) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_set_dwell_times_rpcdata __req; + struct qcsapi_wifi_set_dwell_times_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.max_dwell_time_active_chan = (unsigned int)max_dwell_time_active_chan; + + __req.min_dwell_time_active_chan = (unsigned int)min_dwell_time_active_chan; + + __req.max_dwell_time_passive_chan = (unsigned int)max_dwell_time_passive_chan; + + __req.min_dwell_time_passive_chan = (unsigned int)min_dwell_time_passive_chan; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_SET_DWELL_TIMES_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_set_dwell_times_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_set_dwell_times_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_set_dwell_times call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_set_dwell_times_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_set_dwell_times_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_get_dwell_times(const char * ifname, unsigned int * p_max_dwell_time_active_chan, unsigned int * p_min_dwell_time_active_chan, unsigned int * p_max_dwell_time_passive_chan, unsigned int * p_min_dwell_time_passive_chan) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_get_dwell_times_rpcdata __req; + struct qcsapi_wifi_get_dwell_times_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.p_max_dwell_time_active_chan = (unsigned int *)p_max_dwell_time_active_chan; + + __req.p_min_dwell_time_active_chan = (unsigned int *)p_min_dwell_time_active_chan; + + __req.p_max_dwell_time_passive_chan = (unsigned int *)p_max_dwell_time_passive_chan; + + __req.p_min_dwell_time_passive_chan = (unsigned int *)p_min_dwell_time_passive_chan; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_GET_DWELL_TIMES_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_get_dwell_times_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_get_dwell_times_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_get_dwell_times call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_dwell_times_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (p_max_dwell_time_active_chan) + *p_max_dwell_time_active_chan = *__resp.p_max_dwell_time_active_chan; + } + if (__resp.return_code >= 0) { + if (p_min_dwell_time_active_chan) + *p_min_dwell_time_active_chan = *__resp.p_min_dwell_time_active_chan; + } + if (__resp.return_code >= 0) { + if (p_max_dwell_time_passive_chan) + *p_max_dwell_time_passive_chan = *__resp.p_max_dwell_time_passive_chan; + } + if (__resp.return_code >= 0) { + if (p_min_dwell_time_passive_chan) + *p_min_dwell_time_passive_chan = *__resp.p_min_dwell_time_passive_chan; + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_dwell_times_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_set_bgscan_dwell_times(const char * ifname, const unsigned int dwell_time_active_chan, const unsigned int dwell_time_passive_chan) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_set_bgscan_dwell_times_rpcdata __req; + struct qcsapi_wifi_set_bgscan_dwell_times_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.dwell_time_active_chan = (unsigned int)dwell_time_active_chan; + + __req.dwell_time_passive_chan = (unsigned int)dwell_time_passive_chan; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_SET_BGSCAN_DWELL_TIMES_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_set_bgscan_dwell_times_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_set_bgscan_dwell_times_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_set_bgscan_dwell_times call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_set_bgscan_dwell_times_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_set_bgscan_dwell_times_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_get_bgscan_dwell_times(const char * ifname, unsigned int * p_dwell_time_active_chan, unsigned int * p_dwell_time_passive_chan) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_get_bgscan_dwell_times_rpcdata __req; + struct qcsapi_wifi_get_bgscan_dwell_times_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.p_dwell_time_active_chan = (unsigned int *)p_dwell_time_active_chan; + + __req.p_dwell_time_passive_chan = (unsigned int *)p_dwell_time_passive_chan; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_GET_BGSCAN_DWELL_TIMES_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_get_bgscan_dwell_times_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_get_bgscan_dwell_times_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_get_bgscan_dwell_times call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_bgscan_dwell_times_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (p_dwell_time_active_chan) + *p_dwell_time_active_chan = *__resp.p_dwell_time_active_chan; + } + if (__resp.return_code >= 0) { + if (p_dwell_time_passive_chan) + *p_dwell_time_passive_chan = *__resp.p_dwell_time_passive_chan; + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_bgscan_dwell_times_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_start_scan(const char * ifname) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_start_scan_rpcdata __req; + struct qcsapi_wifi_start_scan_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_START_SCAN_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_start_scan_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_start_scan_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_start_scan call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_start_scan_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_start_scan_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_cancel_scan(const char * ifname, int force) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_cancel_scan_rpcdata __req; + struct qcsapi_wifi_cancel_scan_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.force = (int)force; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_CANCEL_SCAN_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_cancel_scan_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_cancel_scan_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_cancel_scan call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_cancel_scan_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_cancel_scan_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_get_scan_status(const char * ifname, int * scanstatus) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_get_scan_status_rpcdata __req; + struct qcsapi_wifi_get_scan_status_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.scanstatus = (int *)scanstatus; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_GET_SCAN_STATUS_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_get_scan_status_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_get_scan_status_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_get_scan_status call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_scan_status_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (scanstatus) + *scanstatus = *__resp.scanstatus; + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_scan_status_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_enable_bgscan(const char * ifname, const int enable) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_enable_bgscan_rpcdata __req; + struct qcsapi_wifi_enable_bgscan_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.enable = (int)enable; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_ENABLE_BGSCAN_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_enable_bgscan_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_enable_bgscan_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_enable_bgscan call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_enable_bgscan_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_enable_bgscan_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_get_bgscan_status(const char * ifname, int * enable) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_get_bgscan_status_rpcdata __req; + struct qcsapi_wifi_get_bgscan_status_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.enable = (int *)enable; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_GET_BGSCAN_STATUS_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_get_bgscan_status_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_get_bgscan_status_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_get_bgscan_status call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_bgscan_status_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (enable) + *enable = *__resp.enable; + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_bgscan_status_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_wait_scan_completes(const char * ifname, time_t timeout) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_wait_scan_completes_rpcdata __req; + struct qcsapi_wifi_wait_scan_completes_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.timeout = (uint32_t)timeout; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_WAIT_SCAN_COMPLETES_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_wait_scan_completes_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_wait_scan_completes_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_wait_scan_completes call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_wait_scan_completes_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_wait_scan_completes_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_backoff_fail_max(const char * ifname, const int fail_max) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_backoff_fail_max_rpcdata __req; + struct qcsapi_wifi_backoff_fail_max_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.fail_max = (int)fail_max; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_BACKOFF_FAIL_MAX_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_backoff_fail_max_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_backoff_fail_max_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_backoff_fail_max call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_backoff_fail_max_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_backoff_fail_max_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_backoff_timeout(const char * ifname, const int timeout) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_backoff_timeout_rpcdata __req; + struct qcsapi_wifi_backoff_timeout_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.timeout = (int)timeout; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_BACKOFF_TIMEOUT_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_backoff_timeout_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_backoff_timeout_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_backoff_timeout call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_backoff_timeout_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_backoff_timeout_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_get_mcs_rate(const char * ifname, qcsapi_mcs_rate current_mcs_rate) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_get_mcs_rate_rpcdata __req; + struct qcsapi_wifi_get_mcs_rate_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __rpc_string __rpccurrent_mcs_rate = {(char *)current_mcs_rate}; + __rpc_string *p__rpccurrent_mcs_rate = (current_mcs_rate) ? &__rpccurrent_mcs_rate : NULL; + __req.current_mcs_rate = p__rpccurrent_mcs_rate; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_GET_MCS_RATE_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_get_mcs_rate_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_get_mcs_rate_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_get_mcs_rate call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_mcs_rate_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (current_mcs_rate && __resp.current_mcs_rate) + strcpy(current_mcs_rate, __resp.current_mcs_rate->data); + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_mcs_rate_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_set_mcs_rate(const char * ifname, const qcsapi_mcs_rate new_mcs_rate) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_set_mcs_rate_rpcdata __req; + struct qcsapi_wifi_set_mcs_rate_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __rpc_string __rpcnew_mcs_rate = {(char *)new_mcs_rate}; + __rpc_string *p__rpcnew_mcs_rate = (new_mcs_rate) ? &__rpcnew_mcs_rate : NULL; + __req.new_mcs_rate = p__rpcnew_mcs_rate; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_SET_MCS_RATE_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_set_mcs_rate_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_set_mcs_rate_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_set_mcs_rate call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_set_mcs_rate_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_set_mcs_rate_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_set_pairing_id(const char * ifname, const char * pairing_id) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_set_pairing_id_rpcdata __req; + struct qcsapi_wifi_set_pairing_id_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __rpc_string __rpcpairing_id = {(char *)pairing_id}; + __rpc_string *p__rpcpairing_id = (pairing_id) ? &__rpcpairing_id : NULL; + __req.pairing_id = p__rpcpairing_id; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_SET_PAIRING_ID_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_set_pairing_id_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_set_pairing_id_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_set_pairing_id call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_set_pairing_id_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_set_pairing_id_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_get_pairing_id(const char * ifname, char * pairing_id) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_get_pairing_id_rpcdata __req; + struct qcsapi_wifi_get_pairing_id_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __rpc_string __rpcpairing_id = {(char *)pairing_id}; + __rpc_string *p__rpcpairing_id = (pairing_id) ? &__rpcpairing_id : NULL; + __req.pairing_id = p__rpcpairing_id; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_GET_PAIRING_ID_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_get_pairing_id_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_get_pairing_id_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_get_pairing_id call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_pairing_id_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (pairing_id && __resp.pairing_id) + strcpy(pairing_id, __resp.pairing_id->data); + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_pairing_id_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_set_pairing_enable(const char * ifname, const char * enable) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_set_pairing_enable_rpcdata __req; + struct qcsapi_wifi_set_pairing_enable_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __rpc_string __rpcenable = {(char *)enable}; + __rpc_string *p__rpcenable = (enable) ? &__rpcenable : NULL; + __req.enable = p__rpcenable; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_SET_PAIRING_ENABLE_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_set_pairing_enable_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_set_pairing_enable_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_set_pairing_enable call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_set_pairing_enable_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_set_pairing_enable_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_get_pairing_enable(const char * ifname, char * enable) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_get_pairing_enable_rpcdata __req; + struct qcsapi_wifi_get_pairing_enable_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __rpc_string __rpcenable = {(char *)enable}; + __rpc_string *p__rpcenable = (enable) ? &__rpcenable : NULL; + __req.enable = p__rpcenable; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_GET_PAIRING_ENABLE_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_get_pairing_enable_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_get_pairing_enable_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_get_pairing_enable call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_pairing_enable_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (enable && __resp.enable) + strcpy(enable, __resp.enable->data); + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_pairing_enable_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_non_wps_set_pp_enable(const char * ifname, uint32_t ctrl_state) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_non_wps_set_pp_enable_rpcdata __req; + struct qcsapi_non_wps_set_pp_enable_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.ctrl_state = (uint32_t)ctrl_state; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_NON_WPS_SET_PP_ENABLE_REMOTE, + (xdrproc_t)xdr_qcsapi_non_wps_set_pp_enable_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_non_wps_set_pp_enable_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_non_wps_set_pp_enable call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_non_wps_set_pp_enable_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_non_wps_set_pp_enable_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_non_wps_get_pp_enable(const char * ifname, uint32_t * ctrl_state) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_non_wps_get_pp_enable_rpcdata __req; + struct qcsapi_non_wps_get_pp_enable_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.ctrl_state = (uint32_t *)ctrl_state; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_NON_WPS_GET_PP_ENABLE_REMOTE, + (xdrproc_t)xdr_qcsapi_non_wps_get_pp_enable_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_non_wps_get_pp_enable_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_non_wps_get_pp_enable call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_non_wps_get_pp_enable_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (ctrl_state) + *ctrl_state = *__resp.ctrl_state; + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_non_wps_get_pp_enable_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_set_vendor_fix(const char * ifname, int fix_param, int value) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_set_vendor_fix_rpcdata __req; + struct qcsapi_wifi_set_vendor_fix_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.fix_param = (int)fix_param; + + __req.value = (int)value; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_SET_VENDOR_FIX_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_set_vendor_fix_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_set_vendor_fix_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_set_vendor_fix call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_set_vendor_fix_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_set_vendor_fix_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_errno_get_message(const int qcsapi_retval, char * error_msg, unsigned int msglen) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_errno_get_message_rpcdata __req; + struct qcsapi_errno_get_message_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __req.qcsapi_retval = (int)qcsapi_retval; + + __rpc_string __rpcerror_msg = {(char *)error_msg}; + __rpc_string *p__rpcerror_msg = (error_msg) ? &__rpcerror_msg : NULL; + __req.error_msg = p__rpcerror_msg; + + __req.msglen = (unsigned int)msglen; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_ERRNO_GET_MESSAGE_REMOTE, + (xdrproc_t)xdr_qcsapi_errno_get_message_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_errno_get_message_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_errno_get_message call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_errno_get_message_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (error_msg && __resp.error_msg) + strcpy(error_msg, __resp.error_msg->data); + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_errno_get_message_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_get_interface_stats(const char * ifname, qcsapi_interface_stats * stats) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_get_interface_stats_rpcdata __req; + struct qcsapi_get_interface_stats_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.stats = (__rpc_qcsapi_interface_stats*)stats; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_GET_INTERFACE_STATS_REMOTE, + (xdrproc_t)xdr_qcsapi_get_interface_stats_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_get_interface_stats_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_get_interface_stats call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_get_interface_stats_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (__resp.stats && stats) + memcpy(stats, __resp.stats, sizeof(*stats)); + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_get_interface_stats_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_get_phy_stats(const char * ifname, qcsapi_phy_stats * stats) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_get_phy_stats_rpcdata __req; + struct qcsapi_get_phy_stats_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.stats = (__rpc_qcsapi_phy_stats*)stats; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_GET_PHY_STATS_REMOTE, + (xdrproc_t)xdr_qcsapi_get_phy_stats_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_get_phy_stats_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_get_phy_stats call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_get_phy_stats_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (__resp.stats && stats) + memcpy(stats, __resp.stats, sizeof(*stats)); + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_get_phy_stats_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_reset_all_counters(const char * ifname, const uint32_t node_index, int local_remote_flag) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_reset_all_counters_rpcdata __req; + struct qcsapi_reset_all_counters_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.node_index = (uint32_t)node_index; + + __req.local_remote_flag = (int)local_remote_flag; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_RESET_ALL_COUNTERS_REMOTE, + (xdrproc_t)xdr_qcsapi_reset_all_counters_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_reset_all_counters_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_reset_all_counters call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_reset_all_counters_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_reset_all_counters_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_get_uboot_info(string_32 uboot_version, struct early_flash_config * ef_config) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_get_uboot_info_rpcdata __req; + struct qcsapi_get_uboot_info_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcuboot_version = {(char *)uboot_version}; + __rpc_string *p__rpcuboot_version = (uboot_version) ? &__rpcuboot_version : NULL; + __req.uboot_version = p__rpcuboot_version; + + __req.ef_config = (__rpc_early_flash_config*)ef_config; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_GET_UBOOT_INFO_REMOTE, + (xdrproc_t)xdr_qcsapi_get_uboot_info_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_get_uboot_info_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_get_uboot_info call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_get_uboot_info_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (uboot_version && __resp.uboot_version) + strcpy(uboot_version, __resp.uboot_version->data); + } + if (__resp.return_code >= 0) { + if (__resp.ef_config && ef_config) + memcpy(ef_config, __resp.ef_config, sizeof(*ef_config)); + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_get_uboot_info_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_firmware_get_version(char * firmware_version, const qcsapi_unsigned_int version_size) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_firmware_get_version_rpcdata __req; + struct qcsapi_firmware_get_version_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcfirmware_version = {(char *)firmware_version}; + __rpc_string *p__rpcfirmware_version = (firmware_version) ? &__rpcfirmware_version : NULL; + __req.firmware_version = p__rpcfirmware_version; + + __req.version_size = (unsigned int)version_size; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_FIRMWARE_GET_VERSION_REMOTE, + (xdrproc_t)xdr_qcsapi_firmware_get_version_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_firmware_get_version_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_firmware_get_version call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_firmware_get_version_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (firmware_version && __resp.firmware_version) + strcpy(firmware_version, __resp.firmware_version->data); + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_firmware_get_version_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_flash_image_update(const char * image_file, qcsapi_flash_partiton_type partition_to_upgrade) +{ + int retries = retries_limit; + static struct timeval timeout = { 60, 0 }; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_flash_image_update_rpcdata __req; + struct qcsapi_flash_image_update_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcimage_file = {(char *)image_file}; + __rpc_string *p__rpcimage_file = (image_file) ? &__rpcimage_file : NULL; + __req.image_file = p__rpcimage_file; + + __req.partition_to_upgrade = (int)partition_to_upgrade; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_FLASH_IMAGE_UPDATE_REMOTE, + (xdrproc_t)xdr_qcsapi_flash_image_update_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_flash_image_update_rpcdata, (caddr_t)&__resp, + timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_flash_image_update call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_flash_image_update_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_flash_image_update_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_send_file(const char * image_file_path, const int image_flags) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_send_file_rpcdata __req; + struct qcsapi_send_file_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcimage_file_path = {(char *)image_file_path}; + __rpc_string *p__rpcimage_file_path = (image_file_path) ? &__rpcimage_file_path : NULL; + __req.image_file_path = p__rpcimage_file_path; + + __req.image_flags = (int)image_flags; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_SEND_FILE_REMOTE, + (xdrproc_t)xdr_qcsapi_send_file_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_send_file_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_send_file call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_send_file_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_send_file_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_pm_set_mode(int mode) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_pm_set_mode_rpcdata __req; + struct qcsapi_pm_set_mode_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __req.mode = (int)mode; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_PM_SET_MODE_REMOTE, + (xdrproc_t)xdr_qcsapi_pm_set_mode_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_pm_set_mode_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_pm_set_mode call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_pm_set_mode_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_pm_set_mode_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_pm_get_mode(int * mode) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_pm_get_mode_rpcdata __req; + struct qcsapi_pm_get_mode_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __req.mode = (int *)mode; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_PM_GET_MODE_REMOTE, + (xdrproc_t)xdr_qcsapi_pm_get_mode_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_pm_get_mode_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_pm_get_mode call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_pm_get_mode_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (mode) + *mode = *__resp.mode; + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_pm_get_mode_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_get_qpm_level(int * qpm_level) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_get_qpm_level_rpcdata __req; + struct qcsapi_get_qpm_level_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __req.qpm_level = (int *)qpm_level; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_GET_QPM_LEVEL_REMOTE, + (xdrproc_t)xdr_qcsapi_get_qpm_level_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_get_qpm_level_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_get_qpm_level call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_get_qpm_level_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (qpm_level) + *qpm_level = *__resp.qpm_level; + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_get_qpm_level_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_set_host_state(const char * ifname, const uint32_t host_state) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_set_host_state_rpcdata __req; + struct qcsapi_set_host_state_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.host_state = (uint32_t)host_state; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_SET_HOST_STATE_REMOTE, + (xdrproc_t)xdr_qcsapi_set_host_state_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_set_host_state_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_set_host_state call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_set_host_state_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_set_host_state_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_qtm_get_state(const char * ifname, unsigned int param, unsigned int * value) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_qtm_get_state_rpcdata __req; + struct qcsapi_qtm_get_state_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.param = (unsigned int)param; + + __req.value = (unsigned int *)value; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_QTM_GET_STATE_REMOTE, + (xdrproc_t)xdr_qcsapi_qtm_get_state_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_qtm_get_state_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_qtm_get_state call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_qtm_get_state_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (value) + *value = *__resp.value; + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_qtm_get_state_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_qtm_get_state_all(const char * ifname, struct qcsapi_data_128bytes * value, unsigned int max) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_qtm_get_state_all_rpcdata __req; + struct qcsapi_qtm_get_state_all_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.value = (__rpc_qcsapi_data_128bytes*)value; + + __req.max = (unsigned int)max; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_QTM_GET_STATE_ALL_REMOTE, + (xdrproc_t)xdr_qcsapi_qtm_get_state_all_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_qtm_get_state_all_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_qtm_get_state_all call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_qtm_get_state_all_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (__resp.value && value) + memcpy(value, __resp.value, sizeof(*value)); + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_qtm_get_state_all_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_qtm_set_state(const char * ifname, unsigned int param, unsigned int value) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_qtm_set_state_rpcdata __req; + struct qcsapi_qtm_set_state_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.param = (unsigned int)param; + + __req.value = (unsigned int)value; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_QTM_SET_STATE_REMOTE, + (xdrproc_t)xdr_qcsapi_qtm_set_state_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_qtm_set_state_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_qtm_set_state call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_qtm_set_state_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_qtm_set_state_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_qtm_get_config(const char * ifname, unsigned int param, unsigned int * value) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_qtm_get_config_rpcdata __req; + struct qcsapi_qtm_get_config_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.param = (unsigned int)param; + + __req.value = (unsigned int *)value; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_QTM_GET_CONFIG_REMOTE, + (xdrproc_t)xdr_qcsapi_qtm_get_config_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_qtm_get_config_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_qtm_get_config call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_qtm_get_config_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (value) + *value = *__resp.value; + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_qtm_get_config_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_qtm_get_config_all(const char * ifname, struct qcsapi_data_1Kbytes * value, unsigned int max) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_qtm_get_config_all_rpcdata __req; + struct qcsapi_qtm_get_config_all_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.value = (__rpc_qcsapi_data_1Kbytes*)value; + + __req.max = (unsigned int)max; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_QTM_GET_CONFIG_ALL_REMOTE, + (xdrproc_t)xdr_qcsapi_qtm_get_config_all_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_qtm_get_config_all_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_qtm_get_config_all call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_qtm_get_config_all_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (__resp.value && value) + memcpy(value, __resp.value, sizeof(*value)); + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_qtm_get_config_all_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_qtm_set_config(const char * ifname, unsigned int param, unsigned int value) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_qtm_set_config_rpcdata __req; + struct qcsapi_qtm_set_config_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.param = (unsigned int)param; + + __req.value = (unsigned int)value; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_QTM_SET_CONFIG_REMOTE, + (xdrproc_t)xdr_qcsapi_qtm_set_config_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_qtm_set_config_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_qtm_set_config call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_qtm_set_config_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_qtm_set_config_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_qtm_add_rule(const char * ifname, const struct qcsapi_data_128bytes * entry) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_qtm_add_rule_rpcdata __req; + struct qcsapi_qtm_add_rule_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.entry = (__rpc_qcsapi_data_128bytes*)entry; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_QTM_ADD_RULE_REMOTE, + (xdrproc_t)xdr_qcsapi_qtm_add_rule_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_qtm_add_rule_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_qtm_add_rule call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_qtm_add_rule_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_qtm_add_rule_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_qtm_del_rule(const char * ifname, const struct qcsapi_data_128bytes * entry) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_qtm_del_rule_rpcdata __req; + struct qcsapi_qtm_del_rule_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.entry = (__rpc_qcsapi_data_128bytes*)entry; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_QTM_DEL_RULE_REMOTE, + (xdrproc_t)xdr_qcsapi_qtm_del_rule_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_qtm_del_rule_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_qtm_del_rule call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_qtm_del_rule_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_qtm_del_rule_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_qtm_del_rule_index(const char * ifname, unsigned int index) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_qtm_del_rule_index_rpcdata __req; + struct qcsapi_qtm_del_rule_index_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.index = (unsigned int)index; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_QTM_DEL_RULE_INDEX_REMOTE, + (xdrproc_t)xdr_qcsapi_qtm_del_rule_index_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_qtm_del_rule_index_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_qtm_del_rule_index call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_qtm_del_rule_index_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_qtm_del_rule_index_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_qtm_get_rule(const char * ifname, struct qcsapi_data_3Kbytes * entries, unsigned int max_entries) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_qtm_get_rule_rpcdata __req; + struct qcsapi_qtm_get_rule_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.entries = (__rpc_qcsapi_data_3Kbytes*)entries; + + __req.max_entries = (unsigned int)max_entries; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_QTM_GET_RULE_REMOTE, + (xdrproc_t)xdr_qcsapi_qtm_get_rule_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_qtm_get_rule_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_qtm_get_rule call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_qtm_get_rule_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (__resp.entries && entries) + memcpy(entries, __resp.entries, sizeof(*entries)); + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_qtm_get_rule_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_qtm_get_strm(const char * ifname, struct qcsapi_data_4Kbytes * strms, unsigned int max_entries, int show_all) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_qtm_get_strm_rpcdata __req; + struct qcsapi_qtm_get_strm_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.strms = (__rpc_qcsapi_data_4Kbytes*)strms; + + __req.max_entries = (unsigned int)max_entries; + + __req.show_all = (int)show_all; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_QTM_GET_STRM_REMOTE, + (xdrproc_t)xdr_qcsapi_qtm_get_strm_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_qtm_get_strm_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_qtm_get_strm call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_qtm_get_strm_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (__resp.strms && strms) + memcpy(strms, __resp.strms, sizeof(*strms)); + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_qtm_get_strm_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_qtm_get_stats(const char * ifname, struct qcsapi_data_512bytes * stats) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_qtm_get_stats_rpcdata __req; + struct qcsapi_qtm_get_stats_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.stats = (__rpc_qcsapi_data_512bytes*)stats; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_QTM_GET_STATS_REMOTE, + (xdrproc_t)xdr_qcsapi_qtm_get_stats_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_qtm_get_stats_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_qtm_get_stats call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_qtm_get_stats_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (__resp.stats && stats) + memcpy(stats, __resp.stats, sizeof(*stats)); + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_qtm_get_stats_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_qtm_get_inactive_flags(const char * ifname, unsigned long * flags) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_qtm_get_inactive_flags_rpcdata __req; + struct qcsapi_qtm_get_inactive_flags_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.flags = (unsigned long *)flags; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_QTM_GET_INACTIVE_FLAGS_REMOTE, + (xdrproc_t)xdr_qcsapi_qtm_get_inactive_flags_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_qtm_get_inactive_flags_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_qtm_get_inactive_flags call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_qtm_get_inactive_flags_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (flags) + *flags = *__resp.flags; + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_qtm_get_inactive_flags_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_run_script(const char * scriptname, const char * param) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_run_script_rpcdata __req; + struct qcsapi_wifi_run_script_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcscriptname = {(char *)scriptname}; + __rpc_string *p__rpcscriptname = (scriptname) ? &__rpcscriptname : NULL; + __req.scriptname = p__rpcscriptname; + + __rpc_string __rpcparam = {(char *)param}; + __rpc_string *p__rpcparam = (param) ? &__rpcparam : NULL; + __req.param = p__rpcparam; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_RUN_SCRIPT_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_run_script_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_run_script_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_run_script call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_run_script_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_run_script_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_test_traffic(const char * ifname, uint32_t period) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_test_traffic_rpcdata __req; + struct qcsapi_wifi_test_traffic_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.period = (uint32_t)period; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_TEST_TRAFFIC_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_test_traffic_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_test_traffic_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_test_traffic call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_test_traffic_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_test_traffic_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_add_ipff(qcsapi_unsigned_int ipaddr) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_add_ipff_rpcdata __req; + struct qcsapi_wifi_add_ipff_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __req.ipaddr = (unsigned int)ipaddr; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_ADD_IPFF_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_add_ipff_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_add_ipff_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_add_ipff call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_add_ipff_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_add_ipff_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_del_ipff(qcsapi_unsigned_int ipaddr) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_del_ipff_rpcdata __req; + struct qcsapi_wifi_del_ipff_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __req.ipaddr = (unsigned int)ipaddr; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_DEL_IPFF_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_del_ipff_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_del_ipff_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_del_ipff call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_del_ipff_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_del_ipff_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_get_ipff(char * buf, int buflen) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_get_ipff_rpcdata __req; + struct qcsapi_wifi_get_ipff_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcbuf = {(char *)buf}; + __rpc_string *p__rpcbuf = (buf) ? &__rpcbuf : NULL; + __req.buf = p__rpcbuf; + + __req.buflen = (int)buflen; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_GET_IPFF_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_get_ipff_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_get_ipff_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_get_ipff call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_ipff_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (buf && __resp.buf) + strcpy(buf, __resp.buf->data); + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_ipff_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_get_rts_threshold(const char * ifname, qcsapi_unsigned_int * rts_threshold) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_get_rts_threshold_rpcdata __req; + struct qcsapi_wifi_get_rts_threshold_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.rts_threshold = (unsigned int *)rts_threshold; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_GET_RTS_THRESHOLD_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_get_rts_threshold_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_get_rts_threshold_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_get_rts_threshold call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_rts_threshold_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (rts_threshold) + *rts_threshold = *__resp.rts_threshold; + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_rts_threshold_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_set_rts_threshold(const char * ifname, qcsapi_unsigned_int rts_threshold) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_set_rts_threshold_rpcdata __req; + struct qcsapi_wifi_set_rts_threshold_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.rts_threshold = (unsigned int)rts_threshold; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_SET_RTS_THRESHOLD_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_set_rts_threshold_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_set_rts_threshold_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_set_rts_threshold call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_set_rts_threshold_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_set_rts_threshold_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_set_nss_cap(const char * ifname, const qcsapi_mimo_type modulation, const qcsapi_unsigned_int nss) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_set_nss_cap_rpcdata __req; + struct qcsapi_wifi_set_nss_cap_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.modulation = (int)modulation; + + __req.nss = (unsigned int)nss; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_SET_NSS_CAP_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_set_nss_cap_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_set_nss_cap_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_set_nss_cap call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_set_nss_cap_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_set_nss_cap_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_get_nss_cap(const char * ifname, const qcsapi_mimo_type modulation, qcsapi_unsigned_int * nss) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_get_nss_cap_rpcdata __req; + struct qcsapi_wifi_get_nss_cap_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.modulation = (int)modulation; + + __req.nss = (unsigned int *)nss; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_GET_NSS_CAP_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_get_nss_cap_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_get_nss_cap_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_get_nss_cap call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_nss_cap_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (nss) + *nss = *__resp.nss; + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_nss_cap_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_get_tx_amsdu(const char * ifname, int * enable) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_get_tx_amsdu_rpcdata __req; + struct qcsapi_wifi_get_tx_amsdu_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.enable = (int *)enable; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_GET_TX_AMSDU_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_get_tx_amsdu_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_get_tx_amsdu_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_get_tx_amsdu call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_tx_amsdu_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (enable) + *enable = *__resp.enable; + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_tx_amsdu_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_set_tx_amsdu(const char * ifname, int enable) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_set_tx_amsdu_rpcdata __req; + struct qcsapi_wifi_set_tx_amsdu_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.enable = (int)enable; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_SET_TX_AMSDU_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_set_tx_amsdu_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_set_tx_amsdu_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_set_tx_amsdu call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_set_tx_amsdu_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_set_tx_amsdu_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_get_disassoc_reason(const char * ifname, qcsapi_unsigned_int * reason) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_get_disassoc_reason_rpcdata __req; + struct qcsapi_wifi_get_disassoc_reason_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.reason = (unsigned int *)reason; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_GET_DISASSOC_REASON_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_get_disassoc_reason_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_get_disassoc_reason_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_get_disassoc_reason call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_disassoc_reason_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (reason) + *reason = *__resp.reason; + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_disassoc_reason_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_block_bss(const char * ifname, const qcsapi_unsigned_int flag) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_block_bss_rpcdata __req; + struct qcsapi_wifi_block_bss_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.flag = (unsigned int)flag; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_BLOCK_BSS_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_block_bss_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_block_bss_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_block_bss call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_block_bss_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_block_bss_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_verify_repeater_mode() +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_verify_repeater_mode_rpcdata __req; + struct qcsapi_wifi_verify_repeater_mode_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_VERIFY_REPEATER_MODE_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_verify_repeater_mode_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_verify_repeater_mode_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_verify_repeater_mode call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_verify_repeater_mode_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_verify_repeater_mode_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_set_ap_interface_name(const char * ifname) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_set_ap_interface_name_rpcdata __req; + struct qcsapi_wifi_set_ap_interface_name_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_SET_AP_INTERFACE_NAME_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_set_ap_interface_name_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_set_ap_interface_name_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_set_ap_interface_name call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_set_ap_interface_name_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_set_ap_interface_name_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_get_ap_interface_name(char * ifname) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_get_ap_interface_name_rpcdata __req; + struct qcsapi_wifi_get_ap_interface_name_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_GET_AP_INTERFACE_NAME_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_get_ap_interface_name_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_get_ap_interface_name_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_get_ap_interface_name call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_ap_interface_name_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (ifname && __resp.ifname) + strcpy(ifname, __resp.ifname->data); + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_ap_interface_name_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_get_temperature_info(int * temp_exter, int * temp_inter, int * temp_bbic) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_get_temperature_info_rpcdata __req; + struct qcsapi_get_temperature_info_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __req.temp_exter = (int *)temp_exter; + + __req.temp_inter = (int *)temp_inter; + + __req.temp_bbic = (int *)temp_bbic; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_GET_TEMPERATURE_INFO_REMOTE, + (xdrproc_t)xdr_qcsapi_get_temperature_info_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_get_temperature_info_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_get_temperature_info call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_get_temperature_info_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (temp_exter) + *temp_exter = *__resp.temp_exter; + } + if (__resp.return_code >= 0) { + if (temp_inter) + *temp_inter = *__resp.temp_inter; + } + if (__resp.return_code >= 0) { + if (temp_bbic) + *temp_bbic = *__resp.temp_bbic; + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_get_temperature_info_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_calcmd_set_test_mode(qcsapi_unsigned_int channel, qcsapi_unsigned_int antenna, qcsapi_unsigned_int mcs, qcsapi_unsigned_int bw, qcsapi_unsigned_int pkt_size, qcsapi_unsigned_int eleven_n, qcsapi_unsigned_int bf) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_calcmd_set_test_mode_rpcdata __req; + struct qcsapi_calcmd_set_test_mode_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __req.channel = (unsigned int)channel; + + __req.antenna = (unsigned int)antenna; + + __req.mcs = (unsigned int)mcs; + + __req.bw = (unsigned int)bw; + + __req.pkt_size = (unsigned int)pkt_size; + + __req.eleven_n = (unsigned int)eleven_n; + + __req.bf = (unsigned int)bf; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_CALCMD_SET_TEST_MODE_REMOTE, + (xdrproc_t)xdr_qcsapi_calcmd_set_test_mode_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_calcmd_set_test_mode_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_calcmd_set_test_mode call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_calcmd_set_test_mode_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_calcmd_set_test_mode_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_calcmd_show_test_packet(qcsapi_unsigned_int * tx_packet_num, qcsapi_unsigned_int * rx_packet_num, qcsapi_unsigned_int * crc_packet_num) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_calcmd_show_test_packet_rpcdata __req; + struct qcsapi_calcmd_show_test_packet_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __req.tx_packet_num = (unsigned int *)tx_packet_num; + + __req.rx_packet_num = (unsigned int *)rx_packet_num; + + __req.crc_packet_num = (unsigned int *)crc_packet_num; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_CALCMD_SHOW_TEST_PACKET_REMOTE, + (xdrproc_t)xdr_qcsapi_calcmd_show_test_packet_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_calcmd_show_test_packet_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_calcmd_show_test_packet call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_calcmd_show_test_packet_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (tx_packet_num) + *tx_packet_num = *__resp.tx_packet_num; + } + if (__resp.return_code >= 0) { + if (rx_packet_num) + *rx_packet_num = *__resp.rx_packet_num; + } + if (__resp.return_code >= 0) { + if (crc_packet_num) + *crc_packet_num = *__resp.crc_packet_num; + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_calcmd_show_test_packet_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_calcmd_send_test_packet(qcsapi_unsigned_int to_transmit_packet_num) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_calcmd_send_test_packet_rpcdata __req; + struct qcsapi_calcmd_send_test_packet_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __req.to_transmit_packet_num = (unsigned int)to_transmit_packet_num; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_CALCMD_SEND_TEST_PACKET_REMOTE, + (xdrproc_t)xdr_qcsapi_calcmd_send_test_packet_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_calcmd_send_test_packet_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_calcmd_send_test_packet call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_calcmd_send_test_packet_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_calcmd_send_test_packet_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_calcmd_stop_test_packet() +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_calcmd_stop_test_packet_rpcdata __req; + struct qcsapi_calcmd_stop_test_packet_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_CALCMD_STOP_TEST_PACKET_REMOTE, + (xdrproc_t)xdr_qcsapi_calcmd_stop_test_packet_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_calcmd_stop_test_packet_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_calcmd_stop_test_packet call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_calcmd_stop_test_packet_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_calcmd_stop_test_packet_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_calcmd_send_dc_cw_signal(qcsapi_unsigned_int channel) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_calcmd_send_dc_cw_signal_rpcdata __req; + struct qcsapi_calcmd_send_dc_cw_signal_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __req.channel = (unsigned int)channel; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_CALCMD_SEND_DC_CW_SIGNAL_REMOTE, + (xdrproc_t)xdr_qcsapi_calcmd_send_dc_cw_signal_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_calcmd_send_dc_cw_signal_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_calcmd_send_dc_cw_signal call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_calcmd_send_dc_cw_signal_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_calcmd_send_dc_cw_signal_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_calcmd_stop_dc_cw_signal() +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_calcmd_stop_dc_cw_signal_rpcdata __req; + struct qcsapi_calcmd_stop_dc_cw_signal_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_CALCMD_STOP_DC_CW_SIGNAL_REMOTE, + (xdrproc_t)xdr_qcsapi_calcmd_stop_dc_cw_signal_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_calcmd_stop_dc_cw_signal_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_calcmd_stop_dc_cw_signal call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_calcmd_stop_dc_cw_signal_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_calcmd_stop_dc_cw_signal_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_calcmd_get_test_mode_antenna_sel(qcsapi_unsigned_int * antenna_bit_mask) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_calcmd_get_test_mode_antenna_sel_rpcdata __req; + struct qcsapi_calcmd_get_test_mode_antenna_sel_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __req.antenna_bit_mask = (unsigned int *)antenna_bit_mask; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_CALCMD_GET_TEST_MODE_ANTENNA_SEL_REMOTE, + (xdrproc_t)xdr_qcsapi_calcmd_get_test_mode_antenna_sel_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_calcmd_get_test_mode_antenna_sel_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_calcmd_get_test_mode_antenna_sel call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_calcmd_get_test_mode_antenna_sel_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (antenna_bit_mask) + *antenna_bit_mask = *__resp.antenna_bit_mask; + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_calcmd_get_test_mode_antenna_sel_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_calcmd_get_test_mode_mcs(qcsapi_unsigned_int * test_mode_mcs) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_calcmd_get_test_mode_mcs_rpcdata __req; + struct qcsapi_calcmd_get_test_mode_mcs_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __req.test_mode_mcs = (unsigned int *)test_mode_mcs; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_CALCMD_GET_TEST_MODE_MCS_REMOTE, + (xdrproc_t)xdr_qcsapi_calcmd_get_test_mode_mcs_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_calcmd_get_test_mode_mcs_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_calcmd_get_test_mode_mcs call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_calcmd_get_test_mode_mcs_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (test_mode_mcs) + *test_mode_mcs = *__resp.test_mode_mcs; + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_calcmd_get_test_mode_mcs_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_calcmd_get_test_mode_bw(qcsapi_unsigned_int * test_mode_bw) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_calcmd_get_test_mode_bw_rpcdata __req; + struct qcsapi_calcmd_get_test_mode_bw_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __req.test_mode_bw = (unsigned int *)test_mode_bw; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_CALCMD_GET_TEST_MODE_BW_REMOTE, + (xdrproc_t)xdr_qcsapi_calcmd_get_test_mode_bw_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_calcmd_get_test_mode_bw_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_calcmd_get_test_mode_bw call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_calcmd_get_test_mode_bw_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (test_mode_bw) + *test_mode_bw = *__resp.test_mode_bw; + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_calcmd_get_test_mode_bw_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_calcmd_get_tx_power(qcsapi_calcmd_tx_power_rsp * tx_power) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_calcmd_get_tx_power_rpcdata __req; + struct qcsapi_calcmd_get_tx_power_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __req.tx_power = (__rpc_qcsapi_calcmd_tx_power_rsp*)tx_power; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_CALCMD_GET_TX_POWER_REMOTE, + (xdrproc_t)xdr_qcsapi_calcmd_get_tx_power_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_calcmd_get_tx_power_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_calcmd_get_tx_power call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_calcmd_get_tx_power_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (__resp.tx_power && tx_power) + memcpy(tx_power, __resp.tx_power, sizeof(*tx_power)); + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_calcmd_get_tx_power_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_calcmd_set_tx_power(qcsapi_unsigned_int tx_power) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_calcmd_set_tx_power_rpcdata __req; + struct qcsapi_calcmd_set_tx_power_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __req.tx_power = (unsigned int)tx_power; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_CALCMD_SET_TX_POWER_REMOTE, + (xdrproc_t)xdr_qcsapi_calcmd_set_tx_power_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_calcmd_set_tx_power_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_calcmd_set_tx_power call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_calcmd_set_tx_power_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_calcmd_set_tx_power_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_calcmd_get_test_mode_rssi(qcsapi_calcmd_rssi_rsp * test_mode_rssi) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_calcmd_get_test_mode_rssi_rpcdata __req; + struct qcsapi_calcmd_get_test_mode_rssi_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __req.test_mode_rssi = (__rpc_qcsapi_calcmd_rssi_rsp*)test_mode_rssi; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_CALCMD_GET_TEST_MODE_RSSI_REMOTE, + (xdrproc_t)xdr_qcsapi_calcmd_get_test_mode_rssi_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_calcmd_get_test_mode_rssi_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_calcmd_get_test_mode_rssi call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_calcmd_get_test_mode_rssi_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (__resp.test_mode_rssi && test_mode_rssi) + memcpy(test_mode_rssi, __resp.test_mode_rssi, sizeof(*test_mode_rssi)); + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_calcmd_get_test_mode_rssi_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_calcmd_set_mac_filter(int q_num, int sec_enable, const qcsapi_mac_addr mac_addr) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_calcmd_set_mac_filter_rpcdata __req; + struct qcsapi_calcmd_set_mac_filter_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __req.q_num = (int)q_num; + + __req.sec_enable = (int)sec_enable; + + struct __rpc_qcsapi_mac_addr __rpcmac_addr; + if (mac_addr) { + memcpy(__rpcmac_addr.data, mac_addr, sizeof(__rpcmac_addr)); + __req.mac_addr = &__rpcmac_addr; + } else { + __req.mac_addr = NULL; + } + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_CALCMD_SET_MAC_FILTER_REMOTE, + (xdrproc_t)xdr_qcsapi_calcmd_set_mac_filter_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_calcmd_set_mac_filter_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_calcmd_set_mac_filter call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_calcmd_set_mac_filter_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_calcmd_set_mac_filter_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_calcmd_get_antenna_count(qcsapi_unsigned_int * antenna_count) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_calcmd_get_antenna_count_rpcdata __req; + struct qcsapi_calcmd_get_antenna_count_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __req.antenna_count = (unsigned int *)antenna_count; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_CALCMD_GET_ANTENNA_COUNT_REMOTE, + (xdrproc_t)xdr_qcsapi_calcmd_get_antenna_count_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_calcmd_get_antenna_count_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_calcmd_get_antenna_count call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_calcmd_get_antenna_count_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (antenna_count) + *antenna_count = *__resp.antenna_count; + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_calcmd_get_antenna_count_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_calcmd_clear_counter() +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_calcmd_clear_counter_rpcdata __req; + struct qcsapi_calcmd_clear_counter_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_CALCMD_CLEAR_COUNTER_REMOTE, + (xdrproc_t)xdr_qcsapi_calcmd_clear_counter_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_calcmd_clear_counter_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_calcmd_clear_counter call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_calcmd_clear_counter_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_calcmd_clear_counter_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_calcmd_get_info(string_1024 output_info) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_calcmd_get_info_rpcdata __req; + struct qcsapi_calcmd_get_info_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcoutput_info = {(char *)output_info}; + __rpc_string *p__rpcoutput_info = (output_info) ? &__rpcoutput_info : NULL; + __req.output_info = p__rpcoutput_info; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_CALCMD_GET_INFO_REMOTE, + (xdrproc_t)xdr_qcsapi_calcmd_get_info_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_calcmd_get_info_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_calcmd_get_info call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_calcmd_get_info_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (output_info && __resp.output_info) + strcpy(output_info, __resp.output_info->data); + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_calcmd_get_info_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wowlan_set_match_type(const char * ifname, const uint32_t wowlan_match) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wowlan_set_match_type_rpcdata __req; + struct qcsapi_wowlan_set_match_type_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.wowlan_match = (uint32_t)wowlan_match; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WOWLAN_SET_MATCH_TYPE_REMOTE, + (xdrproc_t)xdr_qcsapi_wowlan_set_match_type_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wowlan_set_match_type_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wowlan_set_match_type call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wowlan_set_match_type_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wowlan_set_match_type_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wowlan_set_L2_type(const char * ifname, const uint32_t ether_type) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wowlan_set_L2_type_rpcdata __req; + struct qcsapi_wowlan_set_L2_type_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.ether_type = (uint32_t)ether_type; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WOWLAN_SET_L2_TYPE_REMOTE, + (xdrproc_t)xdr_qcsapi_wowlan_set_L2_type_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wowlan_set_L2_type_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wowlan_set_L2_type call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wowlan_set_L2_type_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wowlan_set_L2_type_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wowlan_set_udp_port(const char * ifname, const uint32_t udp_port) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wowlan_set_udp_port_rpcdata __req; + struct qcsapi_wowlan_set_udp_port_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.udp_port = (uint32_t)udp_port; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WOWLAN_SET_UDP_PORT_REMOTE, + (xdrproc_t)xdr_qcsapi_wowlan_set_udp_port_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wowlan_set_udp_port_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wowlan_set_udp_port call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wowlan_set_udp_port_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wowlan_set_udp_port_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wowlan_set_magic_pattern(const char * ifname, struct qcsapi_data_256bytes * pattern, uint32_t len) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wowlan_set_magic_pattern_rpcdata __req; + struct qcsapi_wowlan_set_magic_pattern_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.pattern = (__rpc_qcsapi_data_256bytes*)pattern; + + __req.len = (uint32_t)len; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WOWLAN_SET_MAGIC_PATTERN_REMOTE, + (xdrproc_t)xdr_qcsapi_wowlan_set_magic_pattern_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wowlan_set_magic_pattern_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wowlan_set_magic_pattern call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wowlan_set_magic_pattern_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (__resp.pattern && pattern) + memcpy(pattern, __resp.pattern, sizeof(*pattern)); + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wowlan_set_magic_pattern_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_wowlan_get_host_state(const char * ifname, uint16_t * p_value, uint32_t * len) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_wowlan_get_host_state_rpcdata __req; + struct qcsapi_wifi_wowlan_get_host_state_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.p_value = (uint16_t *)p_value; + + __req.len = (uint32_t *)len; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_WOWLAN_GET_HOST_STATE_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_wowlan_get_host_state_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_wowlan_get_host_state_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_wowlan_get_host_state call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_wowlan_get_host_state_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (p_value) + *p_value = *__resp.p_value; + } + if (__resp.return_code >= 0) { + if (len) + *len = *__resp.len; + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_wowlan_get_host_state_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_wowlan_get_match_type(const char * ifname, uint16_t * p_value, uint32_t * len) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_wowlan_get_match_type_rpcdata __req; + struct qcsapi_wifi_wowlan_get_match_type_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.p_value = (uint16_t *)p_value; + + __req.len = (uint32_t *)len; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_WOWLAN_GET_MATCH_TYPE_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_wowlan_get_match_type_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_wowlan_get_match_type_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_wowlan_get_match_type call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_wowlan_get_match_type_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (p_value) + *p_value = *__resp.p_value; + } + if (__resp.return_code >= 0) { + if (len) + *len = *__resp.len; + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_wowlan_get_match_type_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_wowlan_get_l2_type(const char * ifname, uint16_t * p_value, uint32_t * len) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_wowlan_get_l2_type_rpcdata __req; + struct qcsapi_wifi_wowlan_get_l2_type_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.p_value = (uint16_t *)p_value; + + __req.len = (uint32_t *)len; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_WOWLAN_GET_L2_TYPE_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_wowlan_get_l2_type_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_wowlan_get_l2_type_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_wowlan_get_l2_type call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_wowlan_get_l2_type_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (p_value) + *p_value = *__resp.p_value; + } + if (__resp.return_code >= 0) { + if (len) + *len = *__resp.len; + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_wowlan_get_l2_type_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_wowlan_get_udp_port(const char * ifname, uint16_t * p_value, uint32_t * len) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_wowlan_get_udp_port_rpcdata __req; + struct qcsapi_wifi_wowlan_get_udp_port_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.p_value = (uint16_t *)p_value; + + __req.len = (uint32_t *)len; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_WOWLAN_GET_UDP_PORT_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_wowlan_get_udp_port_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_wowlan_get_udp_port_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_wowlan_get_udp_port call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_wowlan_get_udp_port_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (p_value) + *p_value = *__resp.p_value; + } + if (__resp.return_code >= 0) { + if (len) + *len = *__resp.len; + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_wowlan_get_udp_port_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_wowlan_get_magic_pattern(const char * ifname, struct qcsapi_data_256bytes * p_value, uint32_t * len) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_wowlan_get_magic_pattern_rpcdata __req; + struct qcsapi_wifi_wowlan_get_magic_pattern_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.p_value = (__rpc_qcsapi_data_256bytes*)p_value; + + __req.len = (uint32_t *)len; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_WOWLAN_GET_MAGIC_PATTERN_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_wowlan_get_magic_pattern_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_wowlan_get_magic_pattern_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_wowlan_get_magic_pattern call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_wowlan_get_magic_pattern_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (__resp.p_value && p_value) + memcpy(p_value, __resp.p_value, sizeof(*p_value)); + } + if (__resp.return_code >= 0) { + if (len) + *len = *__resp.len; + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_wowlan_get_magic_pattern_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_set_enable_mu(const char * ifname, const unsigned int mu_enable) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_set_enable_mu_rpcdata __req; + struct qcsapi_wifi_set_enable_mu_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.mu_enable = (unsigned int)mu_enable; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_SET_ENABLE_MU_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_set_enable_mu_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_set_enable_mu_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_set_enable_mu call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_set_enable_mu_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_set_enable_mu_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_get_enable_mu(const char * ifname, unsigned int * mu_enable) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_get_enable_mu_rpcdata __req; + struct qcsapi_wifi_get_enable_mu_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.mu_enable = (unsigned int *)mu_enable; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_GET_ENABLE_MU_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_get_enable_mu_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_get_enable_mu_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_get_enable_mu call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_enable_mu_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (mu_enable) + *mu_enable = *__resp.mu_enable; + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_enable_mu_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_set_mu_use_precode(const char * ifname, const unsigned int grp, const unsigned int prec_enable) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_set_mu_use_precode_rpcdata __req; + struct qcsapi_wifi_set_mu_use_precode_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.grp = (unsigned int)grp; + + __req.prec_enable = (unsigned int)prec_enable; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_SET_MU_USE_PRECODE_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_set_mu_use_precode_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_set_mu_use_precode_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_set_mu_use_precode call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_set_mu_use_precode_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_set_mu_use_precode_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_get_mu_use_precode(const char * ifname, const unsigned int grp, unsigned int * prec_enable) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_get_mu_use_precode_rpcdata __req; + struct qcsapi_wifi_get_mu_use_precode_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.grp = (unsigned int)grp; + + __req.prec_enable = (unsigned int *)prec_enable; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_GET_MU_USE_PRECODE_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_get_mu_use_precode_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_get_mu_use_precode_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_get_mu_use_precode call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_mu_use_precode_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (prec_enable) + *prec_enable = *__resp.prec_enable; + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_mu_use_precode_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_set_mu_use_eq(const char * ifname, const unsigned int eq_enable) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_set_mu_use_eq_rpcdata __req; + struct qcsapi_wifi_set_mu_use_eq_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.eq_enable = (unsigned int)eq_enable; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_SET_MU_USE_EQ_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_set_mu_use_eq_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_set_mu_use_eq_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_set_mu_use_eq call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_set_mu_use_eq_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_set_mu_use_eq_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_get_mu_use_eq(const char * ifname, unsigned int * meq_enable) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_get_mu_use_eq_rpcdata __req; + struct qcsapi_wifi_get_mu_use_eq_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.meq_enable = (unsigned int *)meq_enable; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_GET_MU_USE_EQ_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_get_mu_use_eq_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_get_mu_use_eq_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_get_mu_use_eq call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_mu_use_eq_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (meq_enable) + *meq_enable = *__resp.meq_enable; + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_mu_use_eq_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_get_mu_groups(const char * ifname, char * buf, const unsigned int size) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_get_mu_groups_rpcdata __req; + struct qcsapi_wifi_get_mu_groups_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __rpc_string __rpcbuf = {(char *)buf}; + __rpc_string *p__rpcbuf = (buf) ? &__rpcbuf : NULL; + __req.buf = p__rpcbuf; + + __req.size = (unsigned int)size; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_GET_MU_GROUPS_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_get_mu_groups_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_get_mu_groups_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_get_mu_groups call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_mu_groups_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (buf && __resp.buf) + strcpy(buf, __resp.buf->data); + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_mu_groups_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_enable_tdls(const char * ifname, uint32_t enable_tdls) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_enable_tdls_rpcdata __req; + struct qcsapi_wifi_enable_tdls_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.enable_tdls = (uint32_t)enable_tdls; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_ENABLE_TDLS_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_enable_tdls_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_enable_tdls_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_enable_tdls call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_enable_tdls_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_enable_tdls_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_enable_tdls_over_qhop(const char * ifname, uint32_t tdls_over_qhop_en) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_enable_tdls_over_qhop_rpcdata __req; + struct qcsapi_wifi_enable_tdls_over_qhop_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.tdls_over_qhop_en = (uint32_t)tdls_over_qhop_en; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_ENABLE_TDLS_OVER_QHOP_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_enable_tdls_over_qhop_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_enable_tdls_over_qhop_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_enable_tdls_over_qhop call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_enable_tdls_over_qhop_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_enable_tdls_over_qhop_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_get_tdls_status(const char * ifname, uint32_t * p_tdls_status) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_get_tdls_status_rpcdata __req; + struct qcsapi_wifi_get_tdls_status_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.p_tdls_status = (uint32_t *)p_tdls_status; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_GET_TDLS_STATUS_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_get_tdls_status_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_get_tdls_status_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_get_tdls_status call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_tdls_status_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (p_tdls_status) + *p_tdls_status = *__resp.p_tdls_status; + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_tdls_status_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_set_tdls_params(const char * ifname, qcsapi_tdls_type type, int param_value) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_set_tdls_params_rpcdata __req; + struct qcsapi_wifi_set_tdls_params_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.type = (int)type; + + __req.param_value = (int)param_value; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_SET_TDLS_PARAMS_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_set_tdls_params_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_set_tdls_params_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_set_tdls_params call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_set_tdls_params_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_set_tdls_params_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_get_tdls_params(const char * ifname, qcsapi_tdls_type type, int * p_value) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_get_tdls_params_rpcdata __req; + struct qcsapi_wifi_get_tdls_params_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.type = (int)type; + + __req.p_value = (int *)p_value; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_GET_TDLS_PARAMS_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_get_tdls_params_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_get_tdls_params_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_get_tdls_params call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_tdls_params_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (__resp.return_code >= 0) { + if (p_value) + *p_value = *__resp.p_value; + } + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_get_tdls_params_rpcdata, (caddr_t)&__resp); + + return ret; +} + +int qcsapi_wifi_tdls_operate(const char * ifname, qcsapi_tdls_oper operate, const char * mac_addr_str, int cs_interval) +{ + int retries = 0; + int ret; + CLIENT *clnt = qcsapi_adapter_get_client(); + enum clnt_stat __rpcret; + struct qcsapi_wifi_tdls_operate_rpcdata __req; + struct qcsapi_wifi_tdls_operate_rpcdata __resp; + memset(&__req, 0, sizeof(__req)); + memset(&__resp, 0, sizeof(__resp)); + __rpc_string __rpcifname = {(char *)ifname}; + __rpc_string *p__rpcifname = (ifname) ? &__rpcifname : NULL; + __req.ifname = p__rpcifname; + + __req.operate = (int)operate; + + __rpc_string __rpcmac_addr_str = {(char *)mac_addr_str}; + __rpc_string *p__rpcmac_addr_str = (mac_addr_str) ? &__rpcmac_addr_str : NULL; + __req.mac_addr_str = p__rpcmac_addr_str; + + __req.cs_interval = (int)cs_interval; + + if (debug) { fprintf(stderr, "%s:%d %s pre\n", __FILE__, __LINE__, __FUNCTION__); } + client_qcsapi_pre(); + while (1) { + __rpcret = clnt_call(clnt, QCSAPI_WIFI_TDLS_OPERATE_REMOTE, + (xdrproc_t)xdr_qcsapi_wifi_tdls_operate_rpcdata, (caddr_t)&__req, + (xdrproc_t)xdr_qcsapi_wifi_tdls_operate_rpcdata, (caddr_t)&__resp, + __timeout); + if (__rpcret == RPC_SUCCESS) { + client_qcsapi_post(0); + break; + } else { + clnt_perror (clnt, "qcsapi_wifi_tdls_operate call failed"); + clnt_perrno (__rpcret); + if (retries >= retries_limit) { + client_qcsapi_post(1); + xdr_free((xdrproc_t)xdr_qcsapi_wifi_tdls_operate_rpcdata, (caddr_t)&__resp); + return -ENOLINK; + } + retries++; + client_qcsapi_reconnect(); + } + + } + + if (debug) { fprintf(stderr, "%s:%d %s post\n", __FILE__, __LINE__, __FUNCTION__); } + + ret = __resp.return_code; + xdr_free((xdrproc_t)xdr_qcsapi_wifi_tdls_operate_rpcdata, (caddr_t)&__resp); + + return ret; +} + diff --git a/package/firmware/quantenna/src/qcsapi_rpc/generated/qcsapi_rpc_xdr.c b/package/firmware/quantenna/src/qcsapi_rpc/generated/qcsapi_rpc_xdr.c new file mode 100644 index 000000000..458c69c68 --- /dev/null +++ b/package/firmware/quantenna/src/qcsapi_rpc/generated/qcsapi_rpc_xdr.c @@ -0,0 +1,9163 @@ +/* + * Please do not edit this file. + * It was generated using rpcgen. + */ + +#include "qcsapi_rpc.h" + +bool_t +xdr_str (XDR *xdrs, str *objp) +{ + register int32_t *buf; + + if (!xdr_string (xdrs, objp, ~0)) + return FALSE; + return TRUE; +} + +bool_t +xdr___rpc_string (XDR *xdrs, __rpc_string *objp) +{ + register int32_t *buf; + + if (!xdr_string (xdrs, &objp->data, ~0)) + return FALSE; + return TRUE; +} + +bool_t +xdr___rpc_string_p (XDR *xdrs, __rpc_string_p *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)objp, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + return TRUE; +} + +bool_t +xdr___rpc_qcsapi_mac_addr (XDR *xdrs, __rpc_qcsapi_mac_addr *objp) +{ + register int32_t *buf; + + int i; + if (!xdr_vector (xdrs, (char *)objp->data, 6, + sizeof (u_char), (xdrproc_t) xdr_u_char)) + return FALSE; + return TRUE; +} + +bool_t +xdr___rpc_qcsapi_mac_addr_p (XDR *xdrs, __rpc_qcsapi_mac_addr_p *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)objp, sizeof (__rpc_qcsapi_mac_addr), (xdrproc_t) xdr___rpc_qcsapi_mac_addr)) + return FALSE; + return TRUE; +} + +bool_t +xdr___rpc_qcsapi_int_a32 (XDR *xdrs, __rpc_qcsapi_int_a32 *objp) +{ + register int32_t *buf; + + int i; + + if (xdrs->x_op == XDR_ENCODE) { + buf = XDR_INLINE (xdrs, ( 32 ) * BYTES_PER_XDR_UNIT); + if (buf == NULL) { + if (!xdr_vector (xdrs, (char *)objp->data, 32, + sizeof (int), (xdrproc_t) xdr_int)) + return FALSE; + } else { + { + register int *genp; + + for (i = 0, genp = objp->data; + i < 32; ++i) { + IXDR_PUT_LONG(buf, *genp++); + } + } + } + return TRUE; + } else if (xdrs->x_op == XDR_DECODE) { + buf = XDR_INLINE (xdrs, ( 32 ) * BYTES_PER_XDR_UNIT); + if (buf == NULL) { + if (!xdr_vector (xdrs, (char *)objp->data, 32, + sizeof (int), (xdrproc_t) xdr_int)) + return FALSE; + } else { + { + register int *genp; + + for (i = 0, genp = objp->data; + i < 32; ++i) { + *genp++ = IXDR_GET_LONG(buf); + } + } + } + return TRUE; + } + + if (!xdr_vector (xdrs, (char *)objp->data, 32, + sizeof (int), (xdrproc_t) xdr_int)) + return FALSE; + return TRUE; +} + +bool_t +xdr___rpc_qcsapi_int_a32_p (XDR *xdrs, __rpc_qcsapi_int_a32_p *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)objp, sizeof (__rpc_qcsapi_int_a32), (xdrproc_t) xdr___rpc_qcsapi_int_a32)) + return FALSE; + return TRUE; +} + +bool_t +xdr___rpc_qcsapi_SSID (XDR *xdrs, __rpc_qcsapi_SSID *objp) +{ + register int32_t *buf; + + int i; + if (!xdr_vector (xdrs, (char *)objp->data, 33, + sizeof (u_char), (xdrproc_t) xdr_u_char)) + return FALSE; + return TRUE; +} + +bool_t +xdr___rpc_qcsapi_scs_ranking_rpt (XDR *xdrs, __rpc_qcsapi_scs_ranking_rpt *objp) +{ + register int32_t *buf; + + int i; + if (!xdr_uint8_t (xdrs, &objp->num)) + return FALSE; + if (!xdr_vector (xdrs, (char *)objp->chan, 32, + sizeof (uint8_t), (xdrproc_t) xdr_uint8_t)) + return FALSE; + if (!xdr_vector (xdrs, (char *)objp->dfs, 32, + sizeof (uint8_t), (xdrproc_t) xdr_uint8_t)) + return FALSE; + if (!xdr_vector (xdrs, (char *)objp->txpwr, 32, + sizeof (uint8_t), (xdrproc_t) xdr_uint8_t)) + return FALSE; + if (!xdr_vector (xdrs, (char *)objp->metric, 32, + sizeof (int32_t), (xdrproc_t) xdr_int32_t)) + return FALSE; + if (!xdr_vector (xdrs, (char *)objp->metric_age, 32, + sizeof (uint32_t), (xdrproc_t) xdr_uint32_t)) + return FALSE; + if (!xdr_vector (xdrs, (char *)objp->cca_intf, 32, + sizeof (uint16_t), (xdrproc_t) xdr_uint16_t)) + return FALSE; + if (!xdr_vector (xdrs, (char *)objp->pmbl_ap, 32, + sizeof (uint32_t), (xdrproc_t) xdr_uint32_t)) + return FALSE; + if (!xdr_vector (xdrs, (char *)objp->pmbl_sta, 32, + sizeof (uint32_t), (xdrproc_t) xdr_uint32_t)) + return FALSE; + if (!xdr_vector (xdrs, (char *)objp->duration, 32, + sizeof (uint32_t), (xdrproc_t) xdr_uint32_t)) + return FALSE; + if (!xdr_vector (xdrs, (char *)objp->times, 32, + sizeof (uint32_t), (xdrproc_t) xdr_uint32_t)) + return FALSE; + return TRUE; +} + +bool_t +xdr___rpc_qcsapi_scs_score_rpt (XDR *xdrs, __rpc_qcsapi_scs_score_rpt *objp) +{ + register int32_t *buf; + + int i; + if (!xdr_uint8_t (xdrs, &objp->num)) + return FALSE; + if (!xdr_vector (xdrs, (char *)objp->chan, 32, + sizeof (uint8_t), (xdrproc_t) xdr_uint8_t)) + return FALSE; + if (!xdr_vector (xdrs, (char *)objp->score, 32, + sizeof (uint8_t), (xdrproc_t) xdr_uint8_t)) + return FALSE; + return TRUE; +} + +bool_t +xdr___rpc_qcsapi_scs_currchan_rpt (XDR *xdrs, __rpc_qcsapi_scs_currchan_rpt *objp) +{ + register int32_t *buf; + + if (!xdr_uint8_t (xdrs, &objp->chan)) + return FALSE; + if (!xdr_uint16_t (xdrs, &objp->cca_try)) + return FALSE; + if (!xdr_uint16_t (xdrs, &objp->cca_idle)) + return FALSE; + if (!xdr_uint16_t (xdrs, &objp->cca_busy)) + return FALSE; + if (!xdr_uint16_t (xdrs, &objp->cca_intf)) + return FALSE; + if (!xdr_uint16_t (xdrs, &objp->cca_tx)) + return FALSE; + if (!xdr_uint16_t (xdrs, &objp->tx_ms)) + return FALSE; + if (!xdr_uint16_t (xdrs, &objp->rx_ms)) + return FALSE; + if (!xdr_uint32_t (xdrs, &objp->pmbl)) + return FALSE; + return TRUE; +} + +bool_t +xdr___rpc_qcsapi_autochan_rpt (XDR *xdrs, __rpc_qcsapi_autochan_rpt *objp) +{ + register int32_t *buf; + + int i; + if (!xdr_uint8_t (xdrs, &objp->num)) + return FALSE; + if (!xdr_vector (xdrs, (char *)objp->chan, 32, + sizeof (uint8_t), (xdrproc_t) xdr_uint8_t)) + return FALSE; + if (!xdr_vector (xdrs, (char *)objp->dfs, 32, + sizeof (uint8_t), (xdrproc_t) xdr_uint8_t)) + return FALSE; + if (!xdr_vector (xdrs, (char *)objp->txpwr, 32, + sizeof (uint8_t), (xdrproc_t) xdr_uint8_t)) + return FALSE; + if (!xdr_vector (xdrs, (char *)objp->metric, 32, + sizeof (int32_t), (xdrproc_t) xdr_int32_t)) + return FALSE; + if (!xdr_vector (xdrs, (char *)objp->numbeacons, 32, + sizeof (uint32_t), (xdrproc_t) xdr_uint32_t)) + return FALSE; + if (!xdr_vector (xdrs, (char *)objp->cci, 32, + sizeof (uint32_t), (xdrproc_t) xdr_uint32_t)) + return FALSE; + if (!xdr_vector (xdrs, (char *)objp->aci, 32, + sizeof (uint32_t), (xdrproc_t) xdr_uint32_t)) + return FALSE; + return TRUE; +} + +bool_t +xdr___rpc_qcsapi_scs_param_rpt (XDR *xdrs, __rpc_qcsapi_scs_param_rpt *objp) +{ + register int32_t *buf; + + if (!xdr_uint32_t (xdrs, &objp->scs_cfg_param)) + return FALSE; + if (!xdr_uint32_t (xdrs, &objp->scs_signed_param_flag)) + return FALSE; + return TRUE; +} + +bool_t +xdr___rpc_qcsapi_data_512bytes (XDR *xdrs, __rpc_qcsapi_data_512bytes *objp) +{ + register int32_t *buf; + + int i; + if (!xdr_vector (xdrs, (char *)objp->data, 512, + sizeof (uint8_t), (xdrproc_t) xdr_uint8_t)) + return FALSE; + return TRUE; +} + +bool_t +xdr___rpc_qcsapi_data_256bytes (XDR *xdrs, __rpc_qcsapi_data_256bytes *objp) +{ + register int32_t *buf; + + int i; + if (!xdr_vector (xdrs, (char *)objp->data, 256, + sizeof (uint8_t), (xdrproc_t) xdr_uint8_t)) + return FALSE; + return TRUE; +} + +bool_t +xdr___rpc_qcsapi_disconn_info (XDR *xdrs, __rpc_qcsapi_disconn_info *objp) +{ + register int32_t *buf; + + if (!xdr_uint32_t (xdrs, &objp->asso_sta_count)) + return FALSE; + if (!xdr_uint32_t (xdrs, &objp->disconn_count)) + return FALSE; + if (!xdr_uint32_t (xdrs, &objp->sequence)) + return FALSE; + if (!xdr_uint32_t (xdrs, &objp->up_time)) + return FALSE; + if (!xdr_uint32_t (xdrs, &objp->resetflag)) + return FALSE; + return TRUE; +} + +bool_t +xdr___rpc_qcsapi_data_64bytes (XDR *xdrs, __rpc_qcsapi_data_64bytes *objp) +{ + register int32_t *buf; + + int i; + if (!xdr_vector (xdrs, (char *)objp->data, 64, + sizeof (uint8_t), (xdrproc_t) xdr_uint8_t)) + return FALSE; + return TRUE; +} + +bool_t +xdr___rpc_qcsapi_channel_power_table (XDR *xdrs, __rpc_qcsapi_channel_power_table *objp) +{ + register int32_t *buf; + + int i; + + if (xdrs->x_op == XDR_ENCODE) { + if (!xdr_uint8_t (xdrs, &objp->channel)) + return FALSE; + buf = XDR_INLINE (xdrs, ( 8 + 8 + 8 ) * BYTES_PER_XDR_UNIT); + if (buf == NULL) { + if (!xdr_vector (xdrs, (char *)objp->power_20M, 8, + sizeof (int), (xdrproc_t) xdr_int)) + return FALSE; + if (!xdr_vector (xdrs, (char *)objp->power_40M, 8, + sizeof (int), (xdrproc_t) xdr_int)) + return FALSE; + if (!xdr_vector (xdrs, (char *)objp->power_80M, 8, + sizeof (int), (xdrproc_t) xdr_int)) + return FALSE; + } else { + { + register int *genp; + + for (i = 0, genp = objp->power_20M; + i < 8; ++i) { + IXDR_PUT_LONG(buf, *genp++); + } + } + { + register int *genp; + + for (i = 0, genp = objp->power_40M; + i < 8; ++i) { + IXDR_PUT_LONG(buf, *genp++); + } + } + { + register int *genp; + + for (i = 0, genp = objp->power_80M; + i < 8; ++i) { + IXDR_PUT_LONG(buf, *genp++); + } + } + } + return TRUE; + } else if (xdrs->x_op == XDR_DECODE) { + if (!xdr_uint8_t (xdrs, &objp->channel)) + return FALSE; + buf = XDR_INLINE (xdrs, ( 8 + 8 + 8 ) * BYTES_PER_XDR_UNIT); + if (buf == NULL) { + if (!xdr_vector (xdrs, (char *)objp->power_20M, 8, + sizeof (int), (xdrproc_t) xdr_int)) + return FALSE; + if (!xdr_vector (xdrs, (char *)objp->power_40M, 8, + sizeof (int), (xdrproc_t) xdr_int)) + return FALSE; + if (!xdr_vector (xdrs, (char *)objp->power_80M, 8, + sizeof (int), (xdrproc_t) xdr_int)) + return FALSE; + } else { + { + register int *genp; + + for (i = 0, genp = objp->power_20M; + i < 8; ++i) { + *genp++ = IXDR_GET_LONG(buf); + } + } + { + register int *genp; + + for (i = 0, genp = objp->power_40M; + i < 8; ++i) { + *genp++ = IXDR_GET_LONG(buf); + } + } + { + register int *genp; + + for (i = 0, genp = objp->power_80M; + i < 8; ++i) { + *genp++ = IXDR_GET_LONG(buf); + } + } + } + return TRUE; + } + + if (!xdr_uint8_t (xdrs, &objp->channel)) + return FALSE; + if (!xdr_vector (xdrs, (char *)objp->power_20M, 8, + sizeof (int), (xdrproc_t) xdr_int)) + return FALSE; + if (!xdr_vector (xdrs, (char *)objp->power_40M, 8, + sizeof (int), (xdrproc_t) xdr_int)) + return FALSE; + if (!xdr_vector (xdrs, (char *)objp->power_80M, 8, + sizeof (int), (xdrproc_t) xdr_int)) + return FALSE; + return TRUE; +} + +bool_t +xdr___rpc_qcsapi_assoc_records (XDR *xdrs, __rpc_qcsapi_assoc_records *objp) +{ + register int32_t *buf; + + int i; + if (!xdr_vector (xdrs, (char *)objp->addr, 32, + sizeof (__rpc_qcsapi_mac_addr), (xdrproc_t) xdr___rpc_qcsapi_mac_addr)) + return FALSE; + if (!xdr_vector (xdrs, (char *)objp->timestamp, 32, + sizeof (uint32_t), (xdrproc_t) xdr_uint32_t)) + return FALSE; + return TRUE; +} + +bool_t +xdr___rpc_ieee8011req_sta_tput_caps (XDR *xdrs, __rpc_ieee8011req_sta_tput_caps *objp) +{ + register int32_t *buf; + + int i; + if (!xdr_vector (xdrs, (char *)objp->macaddr, 6, + sizeof (uint8_t), (xdrproc_t) xdr_uint8_t)) + return FALSE; + if (!xdr_uint8_t (xdrs, &objp->mode)) + return FALSE; + if (!xdr_vector (xdrs, (char *)objp->htcap_ie, 28, + sizeof (uint8_t), (xdrproc_t) xdr_uint8_t)) + return FALSE; + if (!xdr_vector (xdrs, (char *)objp->vhtcap_ie, 14, + sizeof (uint8_t), (xdrproc_t) xdr_uint8_t)) + return FALSE; + return TRUE; +} + +bool_t +xdr___rpc_qcsapi_measure_report_result (XDR *xdrs, __rpc_qcsapi_measure_report_result *objp) +{ + register int32_t *buf; + + int i; + + if (xdrs->x_op == XDR_ENCODE) { + buf = XDR_INLINE (xdrs, ( 16 ) * BYTES_PER_XDR_UNIT); + if (buf == NULL) { + if (!xdr_vector (xdrs, (char *)objp->common, 16, + sizeof (int), (xdrproc_t) xdr_int)) + return FALSE; + + } else { + { + register int *genp; + + for (i = 0, genp = objp->common; + i < 16; ++i) { + IXDR_PUT_LONG(buf, *genp++); + } + } + } + if (!xdr_uint8_t (xdrs, &objp->basic)) + return FALSE; + if (!xdr_uint8_t (xdrs, &objp->cca)) + return FALSE; + if (!xdr_vector (xdrs, (char *)objp->rpi, 8, + sizeof (uint8_t), (xdrproc_t) xdr_uint8_t)) + return FALSE; + if (!xdr_uint8_t (xdrs, &objp->channel_load)) + return FALSE; + return TRUE; + } else if (xdrs->x_op == XDR_DECODE) { + buf = XDR_INLINE (xdrs, ( 16 ) * BYTES_PER_XDR_UNIT); + if (buf == NULL) { + if (!xdr_vector (xdrs, (char *)objp->common, 16, + sizeof (int), (xdrproc_t) xdr_int)) + return FALSE; + + } else { + { + register int *genp; + + for (i = 0, genp = objp->common; + i < 16; ++i) { + *genp++ = IXDR_GET_LONG(buf); + } + } + } + if (!xdr_uint8_t (xdrs, &objp->basic)) + return FALSE; + if (!xdr_uint8_t (xdrs, &objp->cca)) + return FALSE; + if (!xdr_vector (xdrs, (char *)objp->rpi, 8, + sizeof (uint8_t), (xdrproc_t) xdr_uint8_t)) + return FALSE; + if (!xdr_uint8_t (xdrs, &objp->channel_load)) + return FALSE; + return TRUE; + } + + if (!xdr_vector (xdrs, (char *)objp->common, 16, + sizeof (int), (xdrproc_t) xdr_int)) + return FALSE; + if (!xdr_uint8_t (xdrs, &objp->basic)) + return FALSE; + if (!xdr_uint8_t (xdrs, &objp->cca)) + return FALSE; + if (!xdr_vector (xdrs, (char *)objp->rpi, 8, + sizeof (uint8_t), (xdrproc_t) xdr_uint8_t)) + return FALSE; + if (!xdr_uint8_t (xdrs, &objp->channel_load)) + return FALSE; + return TRUE; +} + +bool_t +xdr___rpc_qcsapi_node_stats (XDR *xdrs, __rpc_qcsapi_node_stats *objp) +{ + register int32_t *buf; + + if (!xdr_uint64_t (xdrs, &objp->tx_bytes)) + return FALSE; + if (!xdr_uint32_t (xdrs, &objp->tx_pkts)) + return FALSE; + if (!xdr_uint32_t (xdrs, &objp->tx_discard)) + return FALSE; + if (!xdr_uint32_t (xdrs, &objp->tx_err)) + return FALSE; + if (!xdr_uint32_t (xdrs, &objp->tx_unicast)) + return FALSE; + if (!xdr_uint32_t (xdrs, &objp->tx_multicast)) + return FALSE; + if (!xdr_uint32_t (xdrs, &objp->tx_broadcast)) + return FALSE; + if (!xdr_uint32_t (xdrs, &objp->tx_phy_rate)) + return FALSE; + if (!xdr_uint64_t (xdrs, &objp->rx_bytes)) + return FALSE; + if (!xdr_uint32_t (xdrs, &objp->rx_pkts)) + return FALSE; + if (!xdr_uint32_t (xdrs, &objp->rx_discard)) + return FALSE; + if (!xdr_uint32_t (xdrs, &objp->rx_err)) + return FALSE; + if (!xdr_uint32_t (xdrs, &objp->rx_unicast)) + return FALSE; + if (!xdr_uint32_t (xdrs, &objp->rx_multicast)) + return FALSE; + if (!xdr_uint32_t (xdrs, &objp->rx_broadcast)) + return FALSE; + if (!xdr_uint32_t (xdrs, &objp->rx_unknown)) + return FALSE; + if (!xdr_uint32_t (xdrs, &objp->rx_phy_rate)) + return FALSE; + if (!xdr___rpc_qcsapi_mac_addr (xdrs, &objp->mac_addr)) + return FALSE; + if (!xdr_int32_t (xdrs, &objp->hw_noise)) + return FALSE; + if (!xdr_int32_t (xdrs, &objp->snr)) + return FALSE; + if (!xdr_int32_t (xdrs, &objp->rssi)) + return FALSE; + if (!xdr_int32_t (xdrs, &objp->bw)) + return FALSE; + return TRUE; +} + +bool_t +xdr___rpc_qcsapi_mlme_stats (XDR *xdrs, __rpc_qcsapi_mlme_stats *objp) +{ + register int32_t *buf; + + + if (xdrs->x_op == XDR_ENCODE) { + buf = XDR_INLINE (xdrs, 6 * BYTES_PER_XDR_UNIT); + if (buf == NULL) { + if (!xdr_u_int (xdrs, &objp->auth)) + return FALSE; + if (!xdr_u_int (xdrs, &objp->auth_fails)) + return FALSE; + if (!xdr_u_int (xdrs, &objp->assoc)) + return FALSE; + if (!xdr_u_int (xdrs, &objp->assoc_fails)) + return FALSE; + if (!xdr_u_int (xdrs, &objp->deauth)) + return FALSE; + if (!xdr_u_int (xdrs, &objp->diassoc)) + return FALSE; + } else { + IXDR_PUT_U_LONG(buf, objp->auth); + IXDR_PUT_U_LONG(buf, objp->auth_fails); + IXDR_PUT_U_LONG(buf, objp->assoc); + IXDR_PUT_U_LONG(buf, objp->assoc_fails); + IXDR_PUT_U_LONG(buf, objp->deauth); + IXDR_PUT_U_LONG(buf, objp->diassoc); + } + return TRUE; + } else if (xdrs->x_op == XDR_DECODE) { + buf = XDR_INLINE (xdrs, 6 * BYTES_PER_XDR_UNIT); + if (buf == NULL) { + if (!xdr_u_int (xdrs, &objp->auth)) + return FALSE; + if (!xdr_u_int (xdrs, &objp->auth_fails)) + return FALSE; + if (!xdr_u_int (xdrs, &objp->assoc)) + return FALSE; + if (!xdr_u_int (xdrs, &objp->assoc_fails)) + return FALSE; + if (!xdr_u_int (xdrs, &objp->deauth)) + return FALSE; + if (!xdr_u_int (xdrs, &objp->diassoc)) + return FALSE; + } else { + objp->auth = IXDR_GET_U_LONG(buf); + objp->auth_fails = IXDR_GET_U_LONG(buf); + objp->assoc = IXDR_GET_U_LONG(buf); + objp->assoc_fails = IXDR_GET_U_LONG(buf); + objp->deauth = IXDR_GET_U_LONG(buf); + objp->diassoc = IXDR_GET_U_LONG(buf); + } + return TRUE; + } + + if (!xdr_u_int (xdrs, &objp->auth)) + return FALSE; + if (!xdr_u_int (xdrs, &objp->auth_fails)) + return FALSE; + if (!xdr_u_int (xdrs, &objp->assoc)) + return FALSE; + if (!xdr_u_int (xdrs, &objp->assoc_fails)) + return FALSE; + if (!xdr_u_int (xdrs, &objp->deauth)) + return FALSE; + if (!xdr_u_int (xdrs, &objp->diassoc)) + return FALSE; + return TRUE; +} + +bool_t +xdr___rpc_qcsapi_mlme_stats_macs (XDR *xdrs, __rpc_qcsapi_mlme_stats_macs *objp) +{ + register int32_t *buf; + + int i; + if (!xdr_vector (xdrs, (char *)objp->addr, 128, + sizeof (__rpc_qcsapi_mac_addr), (xdrproc_t) xdr___rpc_qcsapi_mac_addr)) + return FALSE; + return TRUE; +} + +bool_t +xdr___rpc_qcsapi_csw_record (XDR *xdrs, __rpc_qcsapi_csw_record *objp) +{ + register int32_t *buf; + + int i; + if (!xdr_uint32_t (xdrs, &objp->cnt)) + return FALSE; + if (!xdr_int32_t (xdrs, &objp->index)) + return FALSE; + if (!xdr_vector (xdrs, (char *)objp->channel, 32, + sizeof (uint32_t), (xdrproc_t) xdr_uint32_t)) + return FALSE; + if (!xdr_vector (xdrs, (char *)objp->timestamp, 32, + sizeof (uint32_t), (xdrproc_t) xdr_uint32_t)) + return FALSE; + if (!xdr_vector (xdrs, (char *)objp->reason, 32, + sizeof (uint32_t), (xdrproc_t) xdr_uint32_t)) + return FALSE; + return TRUE; +} + +bool_t +xdr___rpc_qcsapi_radar_status (XDR *xdrs, __rpc_qcsapi_radar_status *objp) +{ + register int32_t *buf; + + if (!xdr_uint32_t (xdrs, &objp->channel)) + return FALSE; + if (!xdr_uint32_t (xdrs, &objp->flags)) + return FALSE; + if (!xdr_uint32_t (xdrs, &objp->ic_radardetected)) + return FALSE; + return TRUE; +} + +bool_t +xdr___rpc_qcsapi_ap_properties (XDR *xdrs, __rpc_qcsapi_ap_properties *objp) +{ + register int32_t *buf; + + + if (xdrs->x_op == XDR_ENCODE) { + if (!xdr___rpc_qcsapi_SSID (xdrs, &objp->ap_name_SSID)) + return FALSE; + if (!xdr___rpc_qcsapi_mac_addr (xdrs, &objp->ap_mac_addr)) + return FALSE; + buf = XDR_INLINE (xdrs, 10 * BYTES_PER_XDR_UNIT); + if (buf == NULL) { + if (!xdr_u_int (xdrs, &objp->ap_flags)) + return FALSE; + if (!xdr_int (xdrs, &objp->ap_channel)) + return FALSE; + if (!xdr_int (xdrs, &objp->ap_RSSI)) + return FALSE; + if (!xdr_int (xdrs, &objp->ap_protocol)) + return FALSE; + if (!xdr_int (xdrs, &objp->ap_encryption_modes)) + return FALSE; + if (!xdr_int (xdrs, &objp->ap_authentication_mode)) + return FALSE; + if (!xdr_int (xdrs, &objp->ap_best_data_rate)) + return FALSE; + if (!xdr_int (xdrs, &objp->ap_wps)) + return FALSE; + if (!xdr_int (xdrs, &objp->ap_80211_proto)) + return FALSE; + if (!xdr_int (xdrs, &objp->ap_qhop_role)) + return FALSE; + } else { + IXDR_PUT_U_LONG(buf, objp->ap_flags); + IXDR_PUT_LONG(buf, objp->ap_channel); + IXDR_PUT_LONG(buf, objp->ap_RSSI); + IXDR_PUT_LONG(buf, objp->ap_protocol); + IXDR_PUT_LONG(buf, objp->ap_encryption_modes); + IXDR_PUT_LONG(buf, objp->ap_authentication_mode); + IXDR_PUT_LONG(buf, objp->ap_best_data_rate); + IXDR_PUT_LONG(buf, objp->ap_wps); + IXDR_PUT_LONG(buf, objp->ap_80211_proto); + IXDR_PUT_LONG(buf, objp->ap_qhop_role); + } + return TRUE; + } else if (xdrs->x_op == XDR_DECODE) { + if (!xdr___rpc_qcsapi_SSID (xdrs, &objp->ap_name_SSID)) + return FALSE; + if (!xdr___rpc_qcsapi_mac_addr (xdrs, &objp->ap_mac_addr)) + return FALSE; + buf = XDR_INLINE (xdrs, 10 * BYTES_PER_XDR_UNIT); + if (buf == NULL) { + if (!xdr_u_int (xdrs, &objp->ap_flags)) + return FALSE; + if (!xdr_int (xdrs, &objp->ap_channel)) + return FALSE; + if (!xdr_int (xdrs, &objp->ap_RSSI)) + return FALSE; + if (!xdr_int (xdrs, &objp->ap_protocol)) + return FALSE; + if (!xdr_int (xdrs, &objp->ap_encryption_modes)) + return FALSE; + if (!xdr_int (xdrs, &objp->ap_authentication_mode)) + return FALSE; + if (!xdr_int (xdrs, &objp->ap_best_data_rate)) + return FALSE; + if (!xdr_int (xdrs, &objp->ap_wps)) + return FALSE; + if (!xdr_int (xdrs, &objp->ap_80211_proto)) + return FALSE; + if (!xdr_int (xdrs, &objp->ap_qhop_role)) + return FALSE; + } else { + objp->ap_flags = IXDR_GET_U_LONG(buf); + objp->ap_channel = IXDR_GET_LONG(buf); + objp->ap_RSSI = IXDR_GET_LONG(buf); + objp->ap_protocol = IXDR_GET_LONG(buf); + objp->ap_encryption_modes = IXDR_GET_LONG(buf); + objp->ap_authentication_mode = IXDR_GET_LONG(buf); + objp->ap_best_data_rate = IXDR_GET_LONG(buf); + objp->ap_wps = IXDR_GET_LONG(buf); + objp->ap_80211_proto = IXDR_GET_LONG(buf); + objp->ap_qhop_role = IXDR_GET_LONG(buf); + } + return TRUE; + } + + if (!xdr___rpc_qcsapi_SSID (xdrs, &objp->ap_name_SSID)) + return FALSE; + if (!xdr___rpc_qcsapi_mac_addr (xdrs, &objp->ap_mac_addr)) + return FALSE; + if (!xdr_u_int (xdrs, &objp->ap_flags)) + return FALSE; + if (!xdr_int (xdrs, &objp->ap_channel)) + return FALSE; + if (!xdr_int (xdrs, &objp->ap_RSSI)) + return FALSE; + if (!xdr_int (xdrs, &objp->ap_protocol)) + return FALSE; + if (!xdr_int (xdrs, &objp->ap_encryption_modes)) + return FALSE; + if (!xdr_int (xdrs, &objp->ap_authentication_mode)) + return FALSE; + if (!xdr_int (xdrs, &objp->ap_best_data_rate)) + return FALSE; + if (!xdr_int (xdrs, &objp->ap_wps)) + return FALSE; + if (!xdr_int (xdrs, &objp->ap_80211_proto)) + return FALSE; + if (!xdr_int (xdrs, &objp->ap_qhop_role)) + return FALSE; + return TRUE; +} + +bool_t +xdr___rpc_qcsapi_interface_stats (XDR *xdrs, __rpc_qcsapi_interface_stats *objp) +{ + register int32_t *buf; + + if (!xdr_uint64_t (xdrs, &objp->tx_bytes)) + return FALSE; + if (!xdr_uint32_t (xdrs, &objp->tx_pkts)) + return FALSE; + if (!xdr_uint32_t (xdrs, &objp->tx_discard)) + return FALSE; + if (!xdr_uint32_t (xdrs, &objp->tx_err)) + return FALSE; + if (!xdr_uint32_t (xdrs, &objp->tx_unicast)) + return FALSE; + if (!xdr_uint32_t (xdrs, &objp->tx_multicast)) + return FALSE; + if (!xdr_uint32_t (xdrs, &objp->tx_broadcast)) + return FALSE; + if (!xdr_uint64_t (xdrs, &objp->rx_bytes)) + return FALSE; + if (!xdr_uint32_t (xdrs, &objp->rx_pkts)) + return FALSE; + if (!xdr_uint32_t (xdrs, &objp->rx_discard)) + return FALSE; + if (!xdr_uint32_t (xdrs, &objp->rx_err)) + return FALSE; + if (!xdr_uint32_t (xdrs, &objp->rx_unicast)) + return FALSE; + if (!xdr_uint32_t (xdrs, &objp->rx_multicast)) + return FALSE; + if (!xdr_uint32_t (xdrs, &objp->rx_broadcast)) + return FALSE; + if (!xdr_uint32_t (xdrs, &objp->rx_unknown)) + return FALSE; + return TRUE; +} + +bool_t +xdr___rpc_qcsapi_phy_stats (XDR *xdrs, __rpc_qcsapi_phy_stats *objp) +{ + register int32_t *buf; + + int i; + if (!xdr_uint32_t (xdrs, &objp->tstamp)) + return FALSE; + if (!xdr_uint32_t (xdrs, &objp->assoc)) + return FALSE; + if (!xdr_uint32_t (xdrs, &objp->channel)) + return FALSE; + if (!xdr_uint32_t (xdrs, &objp->atten)) + return FALSE; + if (!xdr_uint32_t (xdrs, &objp->cca_total)) + return FALSE; + if (!xdr_uint32_t (xdrs, &objp->cca_tx)) + return FALSE; + if (!xdr_uint32_t (xdrs, &objp->cca_rx)) + return FALSE; + if (!xdr_uint32_t (xdrs, &objp->cca_int)) + return FALSE; + if (!xdr_uint32_t (xdrs, &objp->cca_idle)) + return FALSE; + if (!xdr_uint32_t (xdrs, &objp->rx_pkts)) + return FALSE; + if (!xdr_uint32_t (xdrs, &objp->rx_gain)) + return FALSE; + if (!xdr_uint32_t (xdrs, &objp->rx_cnt_crc)) + return FALSE; + if (!xdr_float (xdrs, &objp->rx_noise)) + return FALSE; + if (!xdr_uint32_t (xdrs, &objp->tx_pkts)) + return FALSE; + if (!xdr_uint32_t (xdrs, &objp->tx_defers)) + return FALSE; + if (!xdr_uint32_t (xdrs, &objp->tx_touts)) + return FALSE; + if (!xdr_uint32_t (xdrs, &objp->tx_retries)) + return FALSE; + if (!xdr_uint32_t (xdrs, &objp->cnt_sp_fail)) + return FALSE; + if (!xdr_uint32_t (xdrs, &objp->cnt_lp_fail)) + return FALSE; + if (!xdr_uint32_t (xdrs, &objp->last_rx_mcs)) + return FALSE; + if (!xdr_uint32_t (xdrs, &objp->last_tx_mcs)) + return FALSE; + if (!xdr_float (xdrs, &objp->last_rssi)) + return FALSE; + if (!xdr_vector (xdrs, (char *)objp->last_rssi_array, 4, + sizeof (float), (xdrproc_t) xdr_float)) + return FALSE; + if (!xdr_float (xdrs, &objp->last_rcpi)) + return FALSE; + if (!xdr_float (xdrs, &objp->last_evm)) + return FALSE; + if (!xdr_vector (xdrs, (char *)objp->last_evm_array, 4, + sizeof (float), (xdrproc_t) xdr_float)) + return FALSE; + return TRUE; +} + +bool_t +xdr___rpc_early_flash_config (XDR *xdrs, __rpc_early_flash_config *objp) +{ + register int32_t *buf; + + int i; + if (!xdr_uint32_t (xdrs, &objp->method)) + return FALSE; + if (!xdr_uint32_t (xdrs, &objp->ipaddr)) + return FALSE; + if (!xdr_uint32_t (xdrs, &objp->serverip)) + return FALSE; + if (!xdr_vector (xdrs, (char *)objp->built_time_utc_sec, 11, + sizeof (uint8_t), (xdrproc_t) xdr_uint8_t)) + return FALSE; + if (!xdr_uint8_t (xdrs, &objp->uboot_type)) + return FALSE; + return TRUE; +} + +bool_t +xdr___rpc_qcsapi_data_128bytes (XDR *xdrs, __rpc_qcsapi_data_128bytes *objp) +{ + register int32_t *buf; + + int i; + if (!xdr_vector (xdrs, (char *)objp->data, 128, + sizeof (uint8_t), (xdrproc_t) xdr_uint8_t)) + return FALSE; + return TRUE; +} + +bool_t +xdr___rpc_qcsapi_data_1Kbytes (XDR *xdrs, __rpc_qcsapi_data_1Kbytes *objp) +{ + register int32_t *buf; + + int i; + if (!xdr_vector (xdrs, (char *)objp->data, 1024, + sizeof (uint8_t), (xdrproc_t) xdr_uint8_t)) + return FALSE; + return TRUE; +} + +bool_t +xdr___rpc_qcsapi_data_3Kbytes (XDR *xdrs, __rpc_qcsapi_data_3Kbytes *objp) +{ + register int32_t *buf; + + int i; + if (!xdr_vector (xdrs, (char *)objp->data, 3072, + sizeof (uint8_t), (xdrproc_t) xdr_uint8_t)) + return FALSE; + return TRUE; +} + +bool_t +xdr___rpc_qcsapi_data_4Kbytes (XDR *xdrs, __rpc_qcsapi_data_4Kbytes *objp) +{ + register int32_t *buf; + + int i; + if (!xdr_vector (xdrs, (char *)objp->data, 4096, + sizeof (uint8_t), (xdrproc_t) xdr_uint8_t)) + return FALSE; + return TRUE; +} + +bool_t +xdr___rpc_qcsapi_calcmd_tx_power_rsp (XDR *xdrs, __rpc_qcsapi_calcmd_tx_power_rsp *objp) +{ + register int32_t *buf; + + int i; + if (!xdr_vector (xdrs, (char *)objp->value, 4, + sizeof (uint32_t), (xdrproc_t) xdr_uint32_t)) + return FALSE; + return TRUE; +} + +bool_t +xdr___rpc_qcsapi_calcmd_rssi_rsp (XDR *xdrs, __rpc_qcsapi_calcmd_rssi_rsp *objp) +{ + register int32_t *buf; + + int i; + if (!xdr_vector (xdrs, (char *)objp->value, 4, + sizeof (int32_t), (xdrproc_t) xdr_int32_t)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_bootcfg_get_parameter_rpcdata (XDR *xdrs, qcsapi_bootcfg_get_parameter_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->param_name, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_uint32_t (xdrs, &objp->max_param_len)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->param_value, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_bootcfg_update_parameter_rpcdata (XDR *xdrs, qcsapi_bootcfg_update_parameter_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->param_name, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->param_value, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_bootcfg_commit_rpcdata (XDR *xdrs, qcsapi_bootcfg_commit_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_telnet_enable_rpcdata (XDR *xdrs, qcsapi_telnet_enable_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_u_int (xdrs, &objp->onoff)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_get_service_name_enum_rpcdata (XDR *xdrs, qcsapi_get_service_name_enum_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->lookup_service, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->serv_name, sizeof (int), (xdrproc_t) xdr_int)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_get_service_action_enum_rpcdata (XDR *xdrs, qcsapi_get_service_action_enum_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->lookup_action, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->serv_action, sizeof (int), (xdrproc_t) xdr_int)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_service_control_rpcdata (XDR *xdrs, qcsapi_service_control_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_int (xdrs, &objp->service)) + return FALSE; + if (!xdr_int (xdrs, &objp->action)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wfa_cert_mode_enable_rpcdata (XDR *xdrs, qcsapi_wfa_cert_mode_enable_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_uint16_t (xdrs, &objp->enable)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_get_scs_cce_channels_rpcdata (XDR *xdrs, qcsapi_wifi_get_scs_cce_channels_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->p_prev_channel, sizeof (u_int), (xdrproc_t) xdr_u_int)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->p_cur_channel, sizeof (u_int), (xdrproc_t) xdr_u_int)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_scs_enable_rpcdata (XDR *xdrs, qcsapi_wifi_scs_enable_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_uint16_t (xdrs, &objp->enable_val)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_scs_switch_channel_rpcdata (XDR *xdrs, qcsapi_wifi_scs_switch_channel_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_set_scs_verbose_rpcdata (XDR *xdrs, qcsapi_wifi_set_scs_verbose_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_uint16_t (xdrs, &objp->enable_val)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_get_scs_status_rpcdata (XDR *xdrs, qcsapi_wifi_get_scs_status_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->p_scs_status, sizeof (u_int), (xdrproc_t) xdr_u_int)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_set_scs_smpl_enable_rpcdata (XDR *xdrs, qcsapi_wifi_set_scs_smpl_enable_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_uint16_t (xdrs, &objp->enable_val)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_set_scs_smpl_dwell_time_rpcdata (XDR *xdrs, qcsapi_wifi_set_scs_smpl_dwell_time_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_uint16_t (xdrs, &objp->scs_sample_time)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_set_scs_sample_intv_rpcdata (XDR *xdrs, qcsapi_wifi_set_scs_sample_intv_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_uint16_t (xdrs, &objp->scs_sample_intv)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_set_scs_intf_detect_intv_rpcdata (XDR *xdrs, qcsapi_wifi_set_scs_intf_detect_intv_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_uint16_t (xdrs, &objp->scs_intf_detect_intv)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_set_scs_thrshld_rpcdata (XDR *xdrs, qcsapi_wifi_set_scs_thrshld_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->scs_param_name, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_uint16_t (xdrs, &objp->scs_threshold)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_set_scs_report_only_rpcdata (XDR *xdrs, qcsapi_wifi_set_scs_report_only_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_uint16_t (xdrs, &objp->scs_report_only)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_get_scs_stat_report_rpcdata (XDR *xdrs, qcsapi_wifi_get_scs_stat_report_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->scs_rpt, sizeof (__rpc_qcsapi_scs_ranking_rpt), (xdrproc_t) xdr___rpc_qcsapi_scs_ranking_rpt)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_get_scs_score_report_rpcdata (XDR *xdrs, qcsapi_wifi_get_scs_score_report_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->scs_rpt, sizeof (__rpc_qcsapi_scs_score_rpt), (xdrproc_t) xdr___rpc_qcsapi_scs_score_rpt)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_get_scs_currchan_report_rpcdata (XDR *xdrs, qcsapi_wifi_get_scs_currchan_report_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->scs_currchan_rpt, sizeof (__rpc_qcsapi_scs_currchan_rpt), (xdrproc_t) xdr___rpc_qcsapi_scs_currchan_rpt)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_set_scs_stats_rpcdata (XDR *xdrs, qcsapi_wifi_set_scs_stats_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_uint16_t (xdrs, &objp->start)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_get_autochan_report_rpcdata (XDR *xdrs, qcsapi_wifi_get_autochan_report_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->autochan_rpt, sizeof (__rpc_qcsapi_autochan_rpt), (xdrproc_t) xdr___rpc_qcsapi_autochan_rpt)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_set_scs_cca_intf_smth_fctr_rpcdata (XDR *xdrs, qcsapi_wifi_set_scs_cca_intf_smth_fctr_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_uint8_t (xdrs, &objp->smth_fctr_noxp)) + return FALSE; + if (!xdr_uint8_t (xdrs, &objp->smth_fctr_xped)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_set_scs_chan_mtrc_mrgn_rpcdata (XDR *xdrs, qcsapi_wifi_set_scs_chan_mtrc_mrgn_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_uint8_t (xdrs, &objp->chan_mtrc_mrgn)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_get_scs_cca_intf_rpcdata (XDR *xdrs, qcsapi_wifi_get_scs_cca_intf_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_u_int (xdrs, &objp->the_channel)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->p_cca_intf, sizeof (int), (xdrproc_t) xdr_int)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_get_scs_param_report_rpcdata (XDR *xdrs, qcsapi_wifi_get_scs_param_report_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_uint32_t (xdrs, &objp->param_num)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->p_scs_param_rpt, sizeof (__rpc_qcsapi_scs_param_rpt), (xdrproc_t) xdr___rpc_qcsapi_scs_param_rpt)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_get_scs_dfs_reentry_request_rpcdata (XDR *xdrs, qcsapi_wifi_get_scs_dfs_reentry_request_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->p_scs_dfs_reentry_request, sizeof (u_int), (xdrproc_t) xdr_u_int)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_start_ocac_rpcdata (XDR *xdrs, qcsapi_wifi_start_ocac_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_uint16_t (xdrs, &objp->channel)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_stop_ocac_rpcdata (XDR *xdrs, qcsapi_wifi_stop_ocac_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_get_ocac_status_rpcdata (XDR *xdrs, qcsapi_wifi_get_ocac_status_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->status, sizeof (u_int), (xdrproc_t) xdr_u_int)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_set_ocac_dwell_time_rpcdata (XDR *xdrs, qcsapi_wifi_set_ocac_dwell_time_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_uint16_t (xdrs, &objp->dwell_time)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_set_ocac_duration_rpcdata (XDR *xdrs, qcsapi_wifi_set_ocac_duration_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_uint16_t (xdrs, &objp->duration)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_set_ocac_cac_time_rpcdata (XDR *xdrs, qcsapi_wifi_set_ocac_cac_time_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_uint16_t (xdrs, &objp->cac_time)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_set_ocac_report_only_rpcdata (XDR *xdrs, qcsapi_wifi_set_ocac_report_only_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_uint16_t (xdrs, &objp->enable)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_set_ocac_thrshld_rpcdata (XDR *xdrs, qcsapi_wifi_set_ocac_thrshld_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->param_name, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_uint16_t (xdrs, &objp->threshold)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_start_dfs_s_radio_rpcdata (XDR *xdrs, qcsapi_wifi_start_dfs_s_radio_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_uint16_t (xdrs, &objp->channel)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_stop_dfs_s_radio_rpcdata (XDR *xdrs, qcsapi_wifi_stop_dfs_s_radio_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_get_dfs_s_radio_status_rpcdata (XDR *xdrs, qcsapi_wifi_get_dfs_s_radio_status_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->status, sizeof (u_int), (xdrproc_t) xdr_u_int)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_get_dfs_s_radio_availability_rpcdata (XDR *xdrs, qcsapi_wifi_get_dfs_s_radio_availability_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->available, sizeof (u_int), (xdrproc_t) xdr_u_int)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_set_dfs_s_radio_dwell_time_rpcdata (XDR *xdrs, qcsapi_wifi_set_dfs_s_radio_dwell_time_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_uint16_t (xdrs, &objp->dwell_time)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_set_dfs_s_radio_duration_rpcdata (XDR *xdrs, qcsapi_wifi_set_dfs_s_radio_duration_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_uint16_t (xdrs, &objp->duration)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_set_dfs_s_radio_wea_duration_rpcdata (XDR *xdrs, qcsapi_wifi_set_dfs_s_radio_wea_duration_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_uint32_t (xdrs, &objp->duration)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_set_dfs_s_radio_cac_time_rpcdata (XDR *xdrs, qcsapi_wifi_set_dfs_s_radio_cac_time_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_uint16_t (xdrs, &objp->cac_time)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_set_dfs_s_radio_wea_cac_time_rpcdata (XDR *xdrs, qcsapi_wifi_set_dfs_s_radio_wea_cac_time_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_uint32_t (xdrs, &objp->cac_time)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_set_dfs_s_radio_report_only_rpcdata (XDR *xdrs, qcsapi_wifi_set_dfs_s_radio_report_only_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_uint16_t (xdrs, &objp->enable)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_set_dfs_s_radio_thrshld_rpcdata (XDR *xdrs, qcsapi_wifi_set_dfs_s_radio_thrshld_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->param_name, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_uint16_t (xdrs, &objp->threshold)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_init_rpcdata (XDR *xdrs, qcsapi_init_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_console_disconnect_rpcdata (XDR *xdrs, qcsapi_console_disconnect_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_startprod_rpcdata (XDR *xdrs, qcsapi_wifi_startprod_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_is_startprod_done_rpcdata (XDR *xdrs, qcsapi_is_startprod_done_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->p_status, sizeof (int), (xdrproc_t) xdr_int)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_system_get_time_since_start_rpcdata (XDR *xdrs, qcsapi_system_get_time_since_start_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->p_elapsed_time, sizeof (u_int), (xdrproc_t) xdr_u_int)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_get_system_status_rpcdata (XDR *xdrs, qcsapi_get_system_status_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->p_status, sizeof (u_int), (xdrproc_t) xdr_u_int)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_get_random_seed_rpcdata (XDR *xdrs, qcsapi_get_random_seed_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->random_buf, sizeof (__rpc_qcsapi_data_512bytes), (xdrproc_t) xdr___rpc_qcsapi_data_512bytes)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_set_random_seed_rpcdata (XDR *xdrs, qcsapi_set_random_seed_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->random_buf, sizeof (__rpc_qcsapi_data_512bytes), (xdrproc_t) xdr___rpc_qcsapi_data_512bytes)) + return FALSE; + if (!xdr_u_int (xdrs, &objp->entropy)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_get_carrier_id_rpcdata (XDR *xdrs, qcsapi_get_carrier_id_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->p_carrier_id, sizeof (u_int), (xdrproc_t) xdr_u_int)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_set_carrier_id_rpcdata (XDR *xdrs, qcsapi_set_carrier_id_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_uint32_t (xdrs, &objp->carrier_id)) + return FALSE; + if (!xdr_uint32_t (xdrs, &objp->update_uboot)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_get_spinor_jedecid_rpcdata (XDR *xdrs, qcsapi_wifi_get_spinor_jedecid_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->p_jedecid, sizeof (u_int), (xdrproc_t) xdr_u_int)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_get_bb_param_rpcdata (XDR *xdrs, qcsapi_wifi_get_bb_param_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->p_jedecid, sizeof (u_int), (xdrproc_t) xdr_u_int)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_set_bb_param_rpcdata (XDR *xdrs, qcsapi_wifi_set_bb_param_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_u_int (xdrs, &objp->p_jedecid)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_set_optim_stats_rpcdata (XDR *xdrs, qcsapi_wifi_set_optim_stats_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_u_int (xdrs, &objp->p_jedecid)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_set_sys_time_rpcdata (XDR *xdrs, qcsapi_wifi_set_sys_time_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_uint32_t (xdrs, &objp->timestamp)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_get_sys_time_rpcdata (XDR *xdrs, qcsapi_wifi_get_sys_time_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->timestamp, sizeof (uint32_t), (xdrproc_t) xdr_uint32_t)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_set_soc_mac_addr_rpcdata (XDR *xdrs, qcsapi_set_soc_mac_addr_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr___rpc_qcsapi_mac_addr_p (xdrs, &objp->soc_mac_addr)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_get_custom_value_rpcdata (XDR *xdrs, qcsapi_get_custom_value_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->custom_key, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->custom_value, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_config_get_parameter_rpcdata (XDR *xdrs, qcsapi_config_get_parameter_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->param_name, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_uint32_t (xdrs, &objp->max_param_len)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->param_value, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_config_update_parameter_rpcdata (XDR *xdrs, qcsapi_config_update_parameter_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->param_name, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->param_value, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_config_get_ssid_parameter_rpcdata (XDR *xdrs, qcsapi_config_get_ssid_parameter_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->param_name, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_uint32_t (xdrs, &objp->max_param_len)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->param_value, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_config_update_ssid_parameter_rpcdata (XDR *xdrs, qcsapi_config_update_ssid_parameter_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->param_name, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->param_value, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_file_path_get_config_rpcdata (XDR *xdrs, qcsapi_file_path_get_config_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_int (xdrs, &objp->e_file_path)) + return FALSE; + if (!xdr_u_int (xdrs, &objp->path_size)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->file_path, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_file_path_set_config_rpcdata (XDR *xdrs, qcsapi_file_path_set_config_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_int (xdrs, &objp->e_file_path)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->new_path, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_restore_default_config_rpcdata (XDR *xdrs, qcsapi_restore_default_config_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_int (xdrs, &objp->flag)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_store_ipaddr_rpcdata (XDR *xdrs, qcsapi_store_ipaddr_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_u_int (xdrs, &objp->ipaddr)) + return FALSE; + if (!xdr_u_int (xdrs, &objp->netmask)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_interface_enable_rpcdata (XDR *xdrs, qcsapi_interface_enable_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->enable_flag)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_interface_get_status_rpcdata (XDR *xdrs, qcsapi_interface_get_status_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->interface_status, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_interface_set_ip4_rpcdata (XDR *xdrs, qcsapi_interface_set_ip4_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->if_param, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_uint32_t (xdrs, &objp->if_param_val)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_interface_get_ip4_rpcdata (XDR *xdrs, qcsapi_interface_get_ip4_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->if_param, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->if_param_val, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_interface_get_counter_rpcdata (XDR *xdrs, qcsapi_interface_get_counter_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->qcsapi_counter)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->p_counter_value, sizeof (u_int), (xdrproc_t) xdr_u_int)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_interface_get_counter64_rpcdata (XDR *xdrs, qcsapi_interface_get_counter64_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->qcsapi_counter)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->p_counter_value, sizeof (uint64_t), (xdrproc_t) xdr_uint64_t)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_interface_get_mac_addr_rpcdata (XDR *xdrs, qcsapi_interface_get_mac_addr_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr___rpc_qcsapi_mac_addr_p (xdrs, &objp->current_mac_addr)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_interface_set_mac_addr_rpcdata (XDR *xdrs, qcsapi_interface_set_mac_addr_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr___rpc_qcsapi_mac_addr_p (xdrs, &objp->interface_mac_addr)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_pm_get_counter_rpcdata (XDR *xdrs, qcsapi_pm_get_counter_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->qcsapi_counter)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->pm_interval, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->p_counter_value, sizeof (u_int), (xdrproc_t) xdr_u_int)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_set_aspm_l1_rpcdata (XDR *xdrs, qcsapi_set_aspm_l1_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_int (xdrs, &objp->enable)) + return FALSE; + if (!xdr_int (xdrs, &objp->latency)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_set_l1_rpcdata (XDR *xdrs, qcsapi_set_l1_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_int (xdrs, &objp->enter)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_pm_get_elapsed_time_rpcdata (XDR *xdrs, qcsapi_pm_get_elapsed_time_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->pm_interval, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->p_elapsed_time, sizeof (u_int), (xdrproc_t) xdr_u_int)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_eth_phy_power_control_rpcdata (XDR *xdrs, qcsapi_eth_phy_power_control_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_int (xdrs, &objp->on_off)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->interface, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_get_emac_switch_rpcdata (XDR *xdrs, qcsapi_get_emac_switch_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->buf, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_set_emac_switch_rpcdata (XDR *xdrs, qcsapi_set_emac_switch_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_int (xdrs, &objp->value)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_eth_dscp_map_rpcdata (XDR *xdrs, qcsapi_eth_dscp_map_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_int (xdrs, &objp->oper)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->eth_type, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->level, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->value, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_u_int (xdrs, &objp->size)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->buf, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_get_eth_info_rpcdata (XDR *xdrs, qcsapi_get_eth_info_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->eth_info_type)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_get_mode_rpcdata (XDR *xdrs, qcsapi_wifi_get_mode_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->p_wifi_mode, sizeof (int), (xdrproc_t) xdr_int)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_set_mode_rpcdata (XDR *xdrs, qcsapi_wifi_set_mode_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->new_wifi_mode)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_get_phy_mode_rpcdata (XDR *xdrs, qcsapi_wifi_get_phy_mode_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->p_wifi_phy_mode, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_set_phy_mode_rpcdata (XDR *xdrs, qcsapi_wifi_set_phy_mode_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->new_phy_mode, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_reload_in_mode_rpcdata (XDR *xdrs, qcsapi_wifi_reload_in_mode_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->new_wifi_mode)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_rfenable_rpcdata (XDR *xdrs, qcsapi_wifi_rfenable_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_u_int (xdrs, &objp->onoff)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_rfstatus_rpcdata (XDR *xdrs, qcsapi_wifi_rfstatus_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->rfstatus, sizeof (u_int), (xdrproc_t) xdr_u_int)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_get_bw_rpcdata (XDR *xdrs, qcsapi_wifi_get_bw_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->p_bw, sizeof (u_int), (xdrproc_t) xdr_u_int)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_set_bw_rpcdata (XDR *xdrs, qcsapi_wifi_set_bw_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_u_int (xdrs, &objp->bw)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_set_vht_rpcdata (XDR *xdrs, qcsapi_wifi_set_vht_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_u_int (xdrs, &objp->the_vht)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_get_vht_rpcdata (XDR *xdrs, qcsapi_wifi_get_vht_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->vht, sizeof (u_int), (xdrproc_t) xdr_u_int)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_get_channel_rpcdata (XDR *xdrs, qcsapi_wifi_get_channel_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->p_current_channel, sizeof (u_int), (xdrproc_t) xdr_u_int)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_set_channel_rpcdata (XDR *xdrs, qcsapi_wifi_set_channel_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_u_int (xdrs, &objp->new_channel)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_set_chan_pri_inactive_rpcdata (XDR *xdrs, qcsapi_wifi_set_chan_pri_inactive_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_u_int (xdrs, &objp->channel)) + return FALSE; + if (!xdr_u_int (xdrs, &objp->inactive)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_chan_control_rpcdata (XDR *xdrs, qcsapi_wifi_chan_control_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->chans, sizeof (__rpc_qcsapi_data_256bytes), (xdrproc_t) xdr___rpc_qcsapi_data_256bytes)) + return FALSE; + if (!xdr_uint32_t (xdrs, &objp->cnt)) + return FALSE; + if (!xdr_uint8_t (xdrs, &objp->flag)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_get_chan_disabled_rpcdata (XDR *xdrs, qcsapi_wifi_get_chan_disabled_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->p_chans, sizeof (__rpc_qcsapi_data_256bytes), (xdrproc_t) xdr___rpc_qcsapi_data_256bytes)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->p_cnt, sizeof (uint8_t), (xdrproc_t) xdr_uint8_t)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_get_beacon_interval_rpcdata (XDR *xdrs, qcsapi_wifi_get_beacon_interval_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->p_current_intval, sizeof (u_int), (xdrproc_t) xdr_u_int)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_set_beacon_interval_rpcdata (XDR *xdrs, qcsapi_wifi_set_beacon_interval_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_u_int (xdrs, &objp->new_intval)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_get_dtim_rpcdata (XDR *xdrs, qcsapi_wifi_get_dtim_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->p_dtim, sizeof (u_int), (xdrproc_t) xdr_u_int)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_set_dtim_rpcdata (XDR *xdrs, qcsapi_wifi_set_dtim_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_u_int (xdrs, &objp->new_dtim)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_get_assoc_limit_rpcdata (XDR *xdrs, qcsapi_wifi_get_assoc_limit_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->p_assoc_limit, sizeof (u_int), (xdrproc_t) xdr_u_int)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_get_bss_assoc_limit_rpcdata (XDR *xdrs, qcsapi_wifi_get_bss_assoc_limit_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->p_bss_lim_pri, sizeof (u_int), (xdrproc_t) xdr_u_int)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_set_assoc_limit_rpcdata (XDR *xdrs, qcsapi_wifi_set_assoc_limit_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_u_int (xdrs, &objp->new_assoc_limit)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_set_bss_assoc_limit_rpcdata (XDR *xdrs, qcsapi_wifi_set_bss_assoc_limit_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_u_int (xdrs, &objp->bss_lim_pri)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_get_BSSID_rpcdata (XDR *xdrs, qcsapi_wifi_get_BSSID_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr___rpc_qcsapi_mac_addr_p (xdrs, &objp->current_BSSID)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_get_config_BSSID_rpcdata (XDR *xdrs, qcsapi_wifi_get_config_BSSID_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr___rpc_qcsapi_mac_addr_p (xdrs, &objp->config_BSSID)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_ssid_get_bssid_rpcdata (XDR *xdrs, qcsapi_wifi_ssid_get_bssid_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->ssid_str, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr___rpc_qcsapi_mac_addr_p (xdrs, &objp->bssid)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_ssid_set_bssid_rpcdata (XDR *xdrs, qcsapi_wifi_ssid_set_bssid_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->ssid_str, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr___rpc_qcsapi_mac_addr_p (xdrs, &objp->bssid)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_get_SSID_rpcdata (XDR *xdrs, qcsapi_wifi_get_SSID_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->SSID_str, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_set_SSID_rpcdata (XDR *xdrs, qcsapi_wifi_set_SSID_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->SSID_str, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_get_IEEE_802_11_standard_rpcdata (XDR *xdrs, qcsapi_wifi_get_IEEE_802_11_standard_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->IEEE_802_11_standard, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_get_list_channels_rpcdata (XDR *xdrs, qcsapi_wifi_get_list_channels_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->list_of_channels, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_get_mode_switch_rpcdata (XDR *xdrs, qcsapi_wifi_get_mode_switch_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->p_wifi_mode_switch_setting, sizeof (uint8_t), (xdrproc_t) xdr_uint8_t)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_disassociate_rpcdata (XDR *xdrs, qcsapi_wifi_disassociate_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_disassociate_sta_rpcdata (XDR *xdrs, qcsapi_wifi_disassociate_sta_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr___rpc_qcsapi_mac_addr_p (xdrs, &objp->mac)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_reassociate_rpcdata (XDR *xdrs, qcsapi_wifi_reassociate_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_get_disconn_info_rpcdata (XDR *xdrs, qcsapi_wifi_get_disconn_info_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->disconn_info, sizeof (__rpc_qcsapi_disconn_info), (xdrproc_t) xdr___rpc_qcsapi_disconn_info)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_disable_wps_rpcdata (XDR *xdrs, qcsapi_wifi_disable_wps_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->disable_wps)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_associate_rpcdata (XDR *xdrs, qcsapi_wifi_associate_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->join_ssid, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_start_cca_rpcdata (XDR *xdrs, qcsapi_wifi_start_cca_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->channel)) + return FALSE; + if (!xdr_int (xdrs, &objp->duration)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_get_noise_rpcdata (XDR *xdrs, qcsapi_wifi_get_noise_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->p_noise, sizeof (int), (xdrproc_t) xdr_int)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_get_rssi_by_chain_rpcdata (XDR *xdrs, qcsapi_wifi_get_rssi_by_chain_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->rf_chain)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->p_rssi, sizeof (int), (xdrproc_t) xdr_int)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_get_avg_snr_rpcdata (XDR *xdrs, qcsapi_wifi_get_avg_snr_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->p_snr, sizeof (int), (xdrproc_t) xdr_int)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_get_primary_interface_rpcdata (XDR *xdrs, qcsapi_get_primary_interface_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_uint32_t (xdrs, &objp->maxlen)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_get_interface_by_index_rpcdata (XDR *xdrs, qcsapi_get_interface_by_index_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_u_int (xdrs, &objp->if_index)) + return FALSE; + if (!xdr_uint32_t (xdrs, &objp->maxlen)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_set_wifi_macaddr_rpcdata (XDR *xdrs, qcsapi_wifi_set_wifi_macaddr_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr___rpc_qcsapi_mac_addr_p (xdrs, &objp->new_mac_addr)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_interface_get_BSSID_rpcdata (XDR *xdrs, qcsapi_interface_get_BSSID_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr___rpc_qcsapi_mac_addr_p (xdrs, &objp->current_BSSID)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_get_rates_rpcdata (XDR *xdrs, qcsapi_wifi_get_rates_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->rate_type)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->supported_rates, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_set_rates_rpcdata (XDR *xdrs, qcsapi_wifi_set_rates_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->rate_type)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->current_rates, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->num_rates)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_get_max_bitrate_rpcdata (XDR *xdrs, qcsapi_get_max_bitrate_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->max_str_len)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->max_bitrate, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_set_max_bitrate_rpcdata (XDR *xdrs, qcsapi_set_max_bitrate_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->max_bitrate, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_qos_get_param_rpcdata (XDR *xdrs, qcsapi_wifi_qos_get_param_rpcdata *objp) +{ + register int32_t *buf; + + + if (xdrs->x_op == XDR_ENCODE) { + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + buf = XDR_INLINE (xdrs, 3 * BYTES_PER_XDR_UNIT); + if (buf == NULL) { + if (!xdr_int (xdrs, &objp->the_queue)) + return FALSE; + if (!xdr_int (xdrs, &objp->the_param)) + return FALSE; + if (!xdr_int (xdrs, &objp->ap_bss_flag)) + return FALSE; + + } else { + IXDR_PUT_LONG(buf, objp->the_queue); + IXDR_PUT_LONG(buf, objp->the_param); + IXDR_PUT_LONG(buf, objp->ap_bss_flag); + } + if (!xdr_pointer (xdrs, (char **)&objp->p_value, sizeof (int), (xdrproc_t) xdr_int)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; + } else if (xdrs->x_op == XDR_DECODE) { + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + buf = XDR_INLINE (xdrs, 3 * BYTES_PER_XDR_UNIT); + if (buf == NULL) { + if (!xdr_int (xdrs, &objp->the_queue)) + return FALSE; + if (!xdr_int (xdrs, &objp->the_param)) + return FALSE; + if (!xdr_int (xdrs, &objp->ap_bss_flag)) + return FALSE; + + } else { + objp->the_queue = IXDR_GET_LONG(buf); + objp->the_param = IXDR_GET_LONG(buf); + objp->ap_bss_flag = IXDR_GET_LONG(buf); + } + if (!xdr_pointer (xdrs, (char **)&objp->p_value, sizeof (int), (xdrproc_t) xdr_int)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; + } + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->the_queue)) + return FALSE; + if (!xdr_int (xdrs, &objp->the_param)) + return FALSE; + if (!xdr_int (xdrs, &objp->ap_bss_flag)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->p_value, sizeof (int), (xdrproc_t) xdr_int)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_qos_set_param_rpcdata (XDR *xdrs, qcsapi_wifi_qos_set_param_rpcdata *objp) +{ + register int32_t *buf; + + + if (xdrs->x_op == XDR_ENCODE) { + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + buf = XDR_INLINE (xdrs, 5 * BYTES_PER_XDR_UNIT); + if (buf == NULL) { + if (!xdr_int (xdrs, &objp->the_queue)) + return FALSE; + if (!xdr_int (xdrs, &objp->the_param)) + return FALSE; + if (!xdr_int (xdrs, &objp->ap_bss_flag)) + return FALSE; + if (!xdr_int (xdrs, &objp->value)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + } else { + IXDR_PUT_LONG(buf, objp->the_queue); + IXDR_PUT_LONG(buf, objp->the_param); + IXDR_PUT_LONG(buf, objp->ap_bss_flag); + IXDR_PUT_LONG(buf, objp->value); + IXDR_PUT_LONG(buf, objp->return_code); + } + return TRUE; + } else if (xdrs->x_op == XDR_DECODE) { + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + buf = XDR_INLINE (xdrs, 5 * BYTES_PER_XDR_UNIT); + if (buf == NULL) { + if (!xdr_int (xdrs, &objp->the_queue)) + return FALSE; + if (!xdr_int (xdrs, &objp->the_param)) + return FALSE; + if (!xdr_int (xdrs, &objp->ap_bss_flag)) + return FALSE; + if (!xdr_int (xdrs, &objp->value)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + } else { + objp->the_queue = IXDR_GET_LONG(buf); + objp->the_param = IXDR_GET_LONG(buf); + objp->ap_bss_flag = IXDR_GET_LONG(buf); + objp->value = IXDR_GET_LONG(buf); + objp->return_code = IXDR_GET_LONG(buf); + } + return TRUE; + } + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->the_queue)) + return FALSE; + if (!xdr_int (xdrs, &objp->the_param)) + return FALSE; + if (!xdr_int (xdrs, &objp->ap_bss_flag)) + return FALSE; + if (!xdr_int (xdrs, &objp->value)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_get_wmm_ac_map_rpcdata (XDR *xdrs, qcsapi_wifi_get_wmm_ac_map_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->mapping_table, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_set_wmm_ac_map_rpcdata (XDR *xdrs, qcsapi_wifi_set_wmm_ac_map_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->user_prio)) + return FALSE; + if (!xdr_int (xdrs, &objp->ac_index)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_get_dscp_8021p_map_rpcdata (XDR *xdrs, qcsapi_wifi_get_dscp_8021p_map_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->mapping_table, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_get_dscp_ac_map_rpcdata (XDR *xdrs, qcsapi_wifi_get_dscp_ac_map_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->mapping_table, sizeof (__rpc_qcsapi_data_64bytes), (xdrproc_t) xdr___rpc_qcsapi_data_64bytes)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_set_dscp_8021p_map_rpcdata (XDR *xdrs, qcsapi_wifi_set_dscp_8021p_map_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->ip_dscp_list, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_uint8_t (xdrs, &objp->dot1p_up)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_set_dscp_ac_map_rpcdata (XDR *xdrs, qcsapi_wifi_set_dscp_ac_map_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->dscp_list, sizeof (__rpc_qcsapi_data_64bytes), (xdrproc_t) xdr___rpc_qcsapi_data_64bytes)) + return FALSE; + if (!xdr_uint8_t (xdrs, &objp->dscp_list_len)) + return FALSE; + if (!xdr_uint8_t (xdrs, &objp->ac)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_get_priority_rpcdata (XDR *xdrs, qcsapi_wifi_get_priority_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->p_priority, sizeof (uint8_t), (xdrproc_t) xdr_uint8_t)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_set_priority_rpcdata (XDR *xdrs, qcsapi_wifi_set_priority_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_uint8_t (xdrs, &objp->priority)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_get_airfair_rpcdata (XDR *xdrs, qcsapi_wifi_get_airfair_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->p_airfair, sizeof (uint8_t), (xdrproc_t) xdr_uint8_t)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_set_airfair_rpcdata (XDR *xdrs, qcsapi_wifi_set_airfair_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_uint8_t (xdrs, &objp->airfair)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_get_tx_power_rpcdata (XDR *xdrs, qcsapi_wifi_get_tx_power_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_u_int (xdrs, &objp->the_channel)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->p_tx_power, sizeof (int), (xdrproc_t) xdr_int)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_set_tx_power_rpcdata (XDR *xdrs, qcsapi_wifi_set_tx_power_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_u_int (xdrs, &objp->the_channel)) + return FALSE; + if (!xdr_int (xdrs, &objp->tx_power)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_get_bw_power_rpcdata (XDR *xdrs, qcsapi_wifi_get_bw_power_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_u_int (xdrs, &objp->the_channel)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->p_power_20M, sizeof (int), (xdrproc_t) xdr_int)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->p_power_40M, sizeof (int), (xdrproc_t) xdr_int)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->p_power_80M, sizeof (int), (xdrproc_t) xdr_int)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_set_bw_power_rpcdata (XDR *xdrs, qcsapi_wifi_set_bw_power_rpcdata *objp) +{ + register int32_t *buf; + + + if (xdrs->x_op == XDR_ENCODE) { + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + buf = XDR_INLINE (xdrs, 5 * BYTES_PER_XDR_UNIT); + if (buf == NULL) { + if (!xdr_u_int (xdrs, &objp->the_channel)) + return FALSE; + if (!xdr_int (xdrs, &objp->power_20M)) + return FALSE; + if (!xdr_int (xdrs, &objp->power_40M)) + return FALSE; + if (!xdr_int (xdrs, &objp->power_80M)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + } else { + IXDR_PUT_U_LONG(buf, objp->the_channel); + IXDR_PUT_LONG(buf, objp->power_20M); + IXDR_PUT_LONG(buf, objp->power_40M); + IXDR_PUT_LONG(buf, objp->power_80M); + IXDR_PUT_LONG(buf, objp->return_code); + } + return TRUE; + } else if (xdrs->x_op == XDR_DECODE) { + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + buf = XDR_INLINE (xdrs, 5 * BYTES_PER_XDR_UNIT); + if (buf == NULL) { + if (!xdr_u_int (xdrs, &objp->the_channel)) + return FALSE; + if (!xdr_int (xdrs, &objp->power_20M)) + return FALSE; + if (!xdr_int (xdrs, &objp->power_40M)) + return FALSE; + if (!xdr_int (xdrs, &objp->power_80M)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + } else { + objp->the_channel = IXDR_GET_U_LONG(buf); + objp->power_20M = IXDR_GET_LONG(buf); + objp->power_40M = IXDR_GET_LONG(buf); + objp->power_80M = IXDR_GET_LONG(buf); + objp->return_code = IXDR_GET_LONG(buf); + } + return TRUE; + } + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_u_int (xdrs, &objp->the_channel)) + return FALSE; + if (!xdr_int (xdrs, &objp->power_20M)) + return FALSE; + if (!xdr_int (xdrs, &objp->power_40M)) + return FALSE; + if (!xdr_int (xdrs, &objp->power_80M)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_get_bf_power_rpcdata (XDR *xdrs, qcsapi_wifi_get_bf_power_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_u_int (xdrs, &objp->the_channel)) + return FALSE; + if (!xdr_u_int (xdrs, &objp->number_ss)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->p_power_20M, sizeof (int), (xdrproc_t) xdr_int)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->p_power_40M, sizeof (int), (xdrproc_t) xdr_int)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->p_power_80M, sizeof (int), (xdrproc_t) xdr_int)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_set_bf_power_rpcdata (XDR *xdrs, qcsapi_wifi_set_bf_power_rpcdata *objp) +{ + register int32_t *buf; + + + if (xdrs->x_op == XDR_ENCODE) { + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + buf = XDR_INLINE (xdrs, 6 * BYTES_PER_XDR_UNIT); + if (buf == NULL) { + if (!xdr_u_int (xdrs, &objp->the_channel)) + return FALSE; + if (!xdr_u_int (xdrs, &objp->number_ss)) + return FALSE; + if (!xdr_int (xdrs, &objp->power_20M)) + return FALSE; + if (!xdr_int (xdrs, &objp->power_40M)) + return FALSE; + if (!xdr_int (xdrs, &objp->power_80M)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + } else { + IXDR_PUT_U_LONG(buf, objp->the_channel); + IXDR_PUT_U_LONG(buf, objp->number_ss); + IXDR_PUT_LONG(buf, objp->power_20M); + IXDR_PUT_LONG(buf, objp->power_40M); + IXDR_PUT_LONG(buf, objp->power_80M); + IXDR_PUT_LONG(buf, objp->return_code); + } + return TRUE; + } else if (xdrs->x_op == XDR_DECODE) { + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + buf = XDR_INLINE (xdrs, 6 * BYTES_PER_XDR_UNIT); + if (buf == NULL) { + if (!xdr_u_int (xdrs, &objp->the_channel)) + return FALSE; + if (!xdr_u_int (xdrs, &objp->number_ss)) + return FALSE; + if (!xdr_int (xdrs, &objp->power_20M)) + return FALSE; + if (!xdr_int (xdrs, &objp->power_40M)) + return FALSE; + if (!xdr_int (xdrs, &objp->power_80M)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + } else { + objp->the_channel = IXDR_GET_U_LONG(buf); + objp->number_ss = IXDR_GET_U_LONG(buf); + objp->power_20M = IXDR_GET_LONG(buf); + objp->power_40M = IXDR_GET_LONG(buf); + objp->power_80M = IXDR_GET_LONG(buf); + objp->return_code = IXDR_GET_LONG(buf); + } + return TRUE; + } + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_u_int (xdrs, &objp->the_channel)) + return FALSE; + if (!xdr_u_int (xdrs, &objp->number_ss)) + return FALSE; + if (!xdr_int (xdrs, &objp->power_20M)) + return FALSE; + if (!xdr_int (xdrs, &objp->power_40M)) + return FALSE; + if (!xdr_int (xdrs, &objp->power_80M)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_get_tx_power_ext_rpcdata (XDR *xdrs, qcsapi_wifi_get_tx_power_ext_rpcdata *objp) +{ + register int32_t *buf; + + + if (xdrs->x_op == XDR_ENCODE) { + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + buf = XDR_INLINE (xdrs, 3 * BYTES_PER_XDR_UNIT); + if (buf == NULL) { + if (!xdr_u_int (xdrs, &objp->the_channel)) + return FALSE; + if (!xdr_u_int (xdrs, &objp->bf_on)) + return FALSE; + if (!xdr_u_int (xdrs, &objp->number_ss)) + return FALSE; + + } else { + IXDR_PUT_U_LONG(buf, objp->the_channel); + IXDR_PUT_U_LONG(buf, objp->bf_on); + IXDR_PUT_U_LONG(buf, objp->number_ss); + } + if (!xdr_pointer (xdrs, (char **)&objp->p_power_20M, sizeof (int), (xdrproc_t) xdr_int)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->p_power_40M, sizeof (int), (xdrproc_t) xdr_int)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->p_power_80M, sizeof (int), (xdrproc_t) xdr_int)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; + } else if (xdrs->x_op == XDR_DECODE) { + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + buf = XDR_INLINE (xdrs, 3 * BYTES_PER_XDR_UNIT); + if (buf == NULL) { + if (!xdr_u_int (xdrs, &objp->the_channel)) + return FALSE; + if (!xdr_u_int (xdrs, &objp->bf_on)) + return FALSE; + if (!xdr_u_int (xdrs, &objp->number_ss)) + return FALSE; + + } else { + objp->the_channel = IXDR_GET_U_LONG(buf); + objp->bf_on = IXDR_GET_U_LONG(buf); + objp->number_ss = IXDR_GET_U_LONG(buf); + } + if (!xdr_pointer (xdrs, (char **)&objp->p_power_20M, sizeof (int), (xdrproc_t) xdr_int)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->p_power_40M, sizeof (int), (xdrproc_t) xdr_int)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->p_power_80M, sizeof (int), (xdrproc_t) xdr_int)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; + } + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_u_int (xdrs, &objp->the_channel)) + return FALSE; + if (!xdr_u_int (xdrs, &objp->bf_on)) + return FALSE; + if (!xdr_u_int (xdrs, &objp->number_ss)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->p_power_20M, sizeof (int), (xdrproc_t) xdr_int)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->p_power_40M, sizeof (int), (xdrproc_t) xdr_int)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->p_power_80M, sizeof (int), (xdrproc_t) xdr_int)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_set_tx_power_ext_rpcdata (XDR *xdrs, qcsapi_wifi_set_tx_power_ext_rpcdata *objp) +{ + register int32_t *buf; + + + if (xdrs->x_op == XDR_ENCODE) { + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + buf = XDR_INLINE (xdrs, 7 * BYTES_PER_XDR_UNIT); + if (buf == NULL) { + if (!xdr_u_int (xdrs, &objp->the_channel)) + return FALSE; + if (!xdr_u_int (xdrs, &objp->bf_on)) + return FALSE; + if (!xdr_u_int (xdrs, &objp->number_ss)) + return FALSE; + if (!xdr_int (xdrs, &objp->power_20M)) + return FALSE; + if (!xdr_int (xdrs, &objp->power_40M)) + return FALSE; + if (!xdr_int (xdrs, &objp->power_80M)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + } else { + IXDR_PUT_U_LONG(buf, objp->the_channel); + IXDR_PUT_U_LONG(buf, objp->bf_on); + IXDR_PUT_U_LONG(buf, objp->number_ss); + IXDR_PUT_LONG(buf, objp->power_20M); + IXDR_PUT_LONG(buf, objp->power_40M); + IXDR_PUT_LONG(buf, objp->power_80M); + IXDR_PUT_LONG(buf, objp->return_code); + } + return TRUE; + } else if (xdrs->x_op == XDR_DECODE) { + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + buf = XDR_INLINE (xdrs, 7 * BYTES_PER_XDR_UNIT); + if (buf == NULL) { + if (!xdr_u_int (xdrs, &objp->the_channel)) + return FALSE; + if (!xdr_u_int (xdrs, &objp->bf_on)) + return FALSE; + if (!xdr_u_int (xdrs, &objp->number_ss)) + return FALSE; + if (!xdr_int (xdrs, &objp->power_20M)) + return FALSE; + if (!xdr_int (xdrs, &objp->power_40M)) + return FALSE; + if (!xdr_int (xdrs, &objp->power_80M)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + } else { + objp->the_channel = IXDR_GET_U_LONG(buf); + objp->bf_on = IXDR_GET_U_LONG(buf); + objp->number_ss = IXDR_GET_U_LONG(buf); + objp->power_20M = IXDR_GET_LONG(buf); + objp->power_40M = IXDR_GET_LONG(buf); + objp->power_80M = IXDR_GET_LONG(buf); + objp->return_code = IXDR_GET_LONG(buf); + } + return TRUE; + } + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_u_int (xdrs, &objp->the_channel)) + return FALSE; + if (!xdr_u_int (xdrs, &objp->bf_on)) + return FALSE; + if (!xdr_u_int (xdrs, &objp->number_ss)) + return FALSE; + if (!xdr_int (xdrs, &objp->power_20M)) + return FALSE; + if (!xdr_int (xdrs, &objp->power_40M)) + return FALSE; + if (!xdr_int (xdrs, &objp->power_80M)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_get_chan_power_table_rpcdata (XDR *xdrs, qcsapi_wifi_get_chan_power_table_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->chan_power_table, sizeof (__rpc_qcsapi_channel_power_table), (xdrproc_t) xdr___rpc_qcsapi_channel_power_table)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_set_chan_power_table_rpcdata (XDR *xdrs, qcsapi_wifi_set_chan_power_table_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->chan_power_table, sizeof (__rpc_qcsapi_channel_power_table), (xdrproc_t) xdr___rpc_qcsapi_channel_power_table)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_get_power_selection_rpcdata (XDR *xdrs, qcsapi_wifi_get_power_selection_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->p_power_selection, sizeof (u_int), (xdrproc_t) xdr_u_int)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_set_power_selection_rpcdata (XDR *xdrs, qcsapi_wifi_set_power_selection_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_u_int (xdrs, &objp->power_selection)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_get_carrier_interference_rpcdata (XDR *xdrs, qcsapi_wifi_get_carrier_interference_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->ci, sizeof (int), (xdrproc_t) xdr_int)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_get_congestion_index_rpcdata (XDR *xdrs, qcsapi_wifi_get_congestion_index_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->ci, sizeof (int), (xdrproc_t) xdr_int)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_get_supported_tx_power_levels_rpcdata (XDR *xdrs, qcsapi_wifi_get_supported_tx_power_levels_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->available_percentages, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_get_current_tx_power_level_rpcdata (XDR *xdrs, qcsapi_wifi_get_current_tx_power_level_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->p_current_percentage, sizeof (uint32_t), (xdrproc_t) xdr_uint32_t)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_set_power_constraint_rpcdata (XDR *xdrs, qcsapi_wifi_set_power_constraint_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_uint32_t (xdrs, &objp->pwr_constraint)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_get_power_constraint_rpcdata (XDR *xdrs, qcsapi_wifi_get_power_constraint_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->p_pwr_constraint, sizeof (uint32_t), (xdrproc_t) xdr_uint32_t)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_set_tpc_interval_rpcdata (XDR *xdrs, qcsapi_wifi_set_tpc_interval_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int32_t (xdrs, &objp->tpc_interval)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_get_tpc_interval_rpcdata (XDR *xdrs, qcsapi_wifi_get_tpc_interval_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->p_tpc_interval, sizeof (uint32_t), (xdrproc_t) xdr_uint32_t)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_get_assoc_records_rpcdata (XDR *xdrs, qcsapi_wifi_get_assoc_records_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->reset)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->records, sizeof (__rpc_qcsapi_assoc_records), (xdrproc_t) xdr___rpc_qcsapi_assoc_records)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_get_ap_isolate_rpcdata (XDR *xdrs, qcsapi_wifi_get_ap_isolate_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->p_ap_isolate, sizeof (int), (xdrproc_t) xdr_int)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_set_ap_isolate_rpcdata (XDR *xdrs, qcsapi_wifi_set_ap_isolate_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->new_ap_isolate)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_get_intra_bss_isolate_rpcdata (XDR *xdrs, qcsapi_wifi_get_intra_bss_isolate_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->p_ap_isolate, sizeof (u_int), (xdrproc_t) xdr_u_int)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_set_intra_bss_isolate_rpcdata (XDR *xdrs, qcsapi_wifi_set_intra_bss_isolate_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_u_int (xdrs, &objp->new_ap_isolate)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_get_bss_isolate_rpcdata (XDR *xdrs, qcsapi_wifi_get_bss_isolate_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->p_ap_isolate, sizeof (u_int), (xdrproc_t) xdr_u_int)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_set_bss_isolate_rpcdata (XDR *xdrs, qcsapi_wifi_set_bss_isolate_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_u_int (xdrs, &objp->new_ap_isolate)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_disable_dfs_channels_rpcdata (XDR *xdrs, qcsapi_wifi_disable_dfs_channels_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->disable_dfs)) + return FALSE; + if (!xdr_int (xdrs, &objp->channel)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_create_restricted_bss_rpcdata (XDR *xdrs, qcsapi_wifi_create_restricted_bss_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr___rpc_qcsapi_mac_addr_p (xdrs, &objp->mac_addr)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_create_bss_rpcdata (XDR *xdrs, qcsapi_wifi_create_bss_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr___rpc_qcsapi_mac_addr_p (xdrs, &objp->mac_addr)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_remove_bss_rpcdata (XDR *xdrs, qcsapi_wifi_remove_bss_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wds_add_peer_rpcdata (XDR *xdrs, qcsapi_wds_add_peer_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr___rpc_qcsapi_mac_addr_p (xdrs, &objp->peer_address)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wds_add_peer_encrypt_rpcdata (XDR *xdrs, qcsapi_wds_add_peer_encrypt_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr___rpc_qcsapi_mac_addr_p (xdrs, &objp->peer_address)) + return FALSE; + if (!xdr_u_int (xdrs, &objp->encryption)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wds_remove_peer_rpcdata (XDR *xdrs, qcsapi_wds_remove_peer_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr___rpc_qcsapi_mac_addr_p (xdrs, &objp->peer_address)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wds_get_peer_address_rpcdata (XDR *xdrs, qcsapi_wds_get_peer_address_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->index)) + return FALSE; + if (!xdr___rpc_qcsapi_mac_addr_p (xdrs, &objp->peer_address)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wds_set_psk_rpcdata (XDR *xdrs, qcsapi_wds_set_psk_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr___rpc_qcsapi_mac_addr_p (xdrs, &objp->peer_address)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->pre_shared_key, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wds_set_mode_rpcdata (XDR *xdrs, qcsapi_wds_set_mode_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr___rpc_qcsapi_mac_addr_p (xdrs, &objp->peer_address)) + return FALSE; + if (!xdr_int (xdrs, &objp->mode)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wds_get_mode_rpcdata (XDR *xdrs, qcsapi_wds_get_mode_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->index)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->mode, sizeof (int), (xdrproc_t) xdr_int)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_set_extender_params_rpcdata (XDR *xdrs, qcsapi_wifi_set_extender_params_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->type)) + return FALSE; + if (!xdr_int (xdrs, &objp->param_value)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_get_extender_params_rpcdata (XDR *xdrs, qcsapi_wifi_get_extender_params_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->type)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->p_value, sizeof (int), (xdrproc_t) xdr_int)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_get_beacon_type_rpcdata (XDR *xdrs, qcsapi_wifi_get_beacon_type_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->p_current_beacon, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_set_beacon_type_rpcdata (XDR *xdrs, qcsapi_wifi_set_beacon_type_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->p_new_beacon, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_get_WEP_key_index_rpcdata (XDR *xdrs, qcsapi_wifi_get_WEP_key_index_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->p_key_index, sizeof (u_int), (xdrproc_t) xdr_u_int)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_set_WEP_key_index_rpcdata (XDR *xdrs, qcsapi_wifi_set_WEP_key_index_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_u_int (xdrs, &objp->key_index)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_get_WEP_key_passphrase_rpcdata (XDR *xdrs, qcsapi_wifi_get_WEP_key_passphrase_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->current_passphrase, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_set_WEP_key_passphrase_rpcdata (XDR *xdrs, qcsapi_wifi_set_WEP_key_passphrase_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->new_passphrase, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_get_WEP_encryption_level_rpcdata (XDR *xdrs, qcsapi_wifi_get_WEP_encryption_level_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->current_encryption_level, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_get_basic_encryption_modes_rpcdata (XDR *xdrs, qcsapi_wifi_get_basic_encryption_modes_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->encryption_modes, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_set_basic_encryption_modes_rpcdata (XDR *xdrs, qcsapi_wifi_set_basic_encryption_modes_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->encryption_modes, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_get_basic_authentication_mode_rpcdata (XDR *xdrs, qcsapi_wifi_get_basic_authentication_mode_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->authentication_mode, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_set_basic_authentication_mode_rpcdata (XDR *xdrs, qcsapi_wifi_set_basic_authentication_mode_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->authentication_mode, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_get_WEP_key_rpcdata (XDR *xdrs, qcsapi_wifi_get_WEP_key_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_u_int (xdrs, &objp->key_index)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->current_passphrase, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_set_WEP_key_rpcdata (XDR *xdrs, qcsapi_wifi_set_WEP_key_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_u_int (xdrs, &objp->key_index)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->new_passphrase, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_get_WPA_encryption_modes_rpcdata (XDR *xdrs, qcsapi_wifi_get_WPA_encryption_modes_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->encryption_modes, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_set_WPA_encryption_modes_rpcdata (XDR *xdrs, qcsapi_wifi_set_WPA_encryption_modes_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->encryption_modes, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_get_WPA_authentication_mode_rpcdata (XDR *xdrs, qcsapi_wifi_get_WPA_authentication_mode_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->authentication_mode, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_set_WPA_authentication_mode_rpcdata (XDR *xdrs, qcsapi_wifi_set_WPA_authentication_mode_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->authentication_mode, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_get_interworking_rpcdata (XDR *xdrs, qcsapi_wifi_get_interworking_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->interworking, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_set_interworking_rpcdata (XDR *xdrs, qcsapi_wifi_set_interworking_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->interworking, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_get_80211u_params_rpcdata (XDR *xdrs, qcsapi_wifi_get_80211u_params_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->u_param, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->p_buffer, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_set_80211u_params_rpcdata (XDR *xdrs, qcsapi_wifi_set_80211u_params_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->param, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->value1, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->value2, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_security_get_nai_realms_rpcdata (XDR *xdrs, qcsapi_security_get_nai_realms_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->p_value, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_security_add_nai_realm_rpcdata (XDR *xdrs, qcsapi_security_add_nai_realm_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->encoding)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->nai_realm, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->eap_method, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_security_del_nai_realm_rpcdata (XDR *xdrs, qcsapi_security_del_nai_realm_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->nai_realm, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_security_get_roaming_consortium_rpcdata (XDR *xdrs, qcsapi_security_get_roaming_consortium_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->p_value, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_security_add_roaming_consortium_rpcdata (XDR *xdrs, qcsapi_security_add_roaming_consortium_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->p_value, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_security_del_roaming_consortium_rpcdata (XDR *xdrs, qcsapi_security_del_roaming_consortium_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->p_value, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_security_get_venue_name_rpcdata (XDR *xdrs, qcsapi_security_get_venue_name_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->p_value, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_security_add_venue_name_rpcdata (XDR *xdrs, qcsapi_security_add_venue_name_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->lang_code, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->venue_name, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_security_del_venue_name_rpcdata (XDR *xdrs, qcsapi_security_del_venue_name_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->lang_code, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->venue_name, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_security_get_oper_friendly_name_rpcdata (XDR *xdrs, qcsapi_security_get_oper_friendly_name_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->p_value, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_security_add_oper_friendly_name_rpcdata (XDR *xdrs, qcsapi_security_add_oper_friendly_name_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->lang_code, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->oper_friendly_name, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_security_del_oper_friendly_name_rpcdata (XDR *xdrs, qcsapi_security_del_oper_friendly_name_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->lang_code, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->oper_friendly_name, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_security_get_hs20_conn_capab_rpcdata (XDR *xdrs, qcsapi_security_get_hs20_conn_capab_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->p_value, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_security_add_hs20_conn_capab_rpcdata (XDR *xdrs, qcsapi_security_add_hs20_conn_capab_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->ip_proto, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->port_num, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->status, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_security_del_hs20_conn_capab_rpcdata (XDR *xdrs, qcsapi_security_del_hs20_conn_capab_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->ip_proto, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->port_num, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->status, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_get_hs20_status_rpcdata (XDR *xdrs, qcsapi_wifi_get_hs20_status_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->p_hs20, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_set_hs20_status_rpcdata (XDR *xdrs, qcsapi_wifi_set_hs20_status_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->hs20_val, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_get_proxy_arp_rpcdata (XDR *xdrs, qcsapi_wifi_get_proxy_arp_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->p_proxy_arp, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_set_proxy_arp_rpcdata (XDR *xdrs, qcsapi_wifi_set_proxy_arp_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->proxy_arp_val, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_get_l2_ext_filter_rpcdata (XDR *xdrs, qcsapi_wifi_get_l2_ext_filter_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->param, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->value, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_set_l2_ext_filter_rpcdata (XDR *xdrs, qcsapi_wifi_set_l2_ext_filter_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->param, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->value, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_get_hs20_params_rpcdata (XDR *xdrs, qcsapi_wifi_get_hs20_params_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->hs_param, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->p_buffer, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_set_hs20_params_rpcdata (XDR *xdrs, qcsapi_wifi_set_hs20_params_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->hs_param, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->value1, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->value2, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->value3, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->value4, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->value5, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->value6, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_remove_11u_param_rpcdata (XDR *xdrs, qcsapi_remove_11u_param_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->param, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_remove_hs20_param_rpcdata (XDR *xdrs, qcsapi_remove_hs20_param_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->hs_param, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_get_IEEE11i_encryption_modes_rpcdata (XDR *xdrs, qcsapi_wifi_get_IEEE11i_encryption_modes_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->encryption_modes, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_set_IEEE11i_encryption_modes_rpcdata (XDR *xdrs, qcsapi_wifi_set_IEEE11i_encryption_modes_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->encryption_modes, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_get_IEEE11i_authentication_mode_rpcdata (XDR *xdrs, qcsapi_wifi_get_IEEE11i_authentication_mode_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->authentication_mode, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_set_IEEE11i_authentication_mode_rpcdata (XDR *xdrs, qcsapi_wifi_set_IEEE11i_authentication_mode_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->authentication_mode, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_get_michael_errcnt_rpcdata (XDR *xdrs, qcsapi_wifi_get_michael_errcnt_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->errcount, sizeof (uint32_t), (xdrproc_t) xdr_uint32_t)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_get_pre_shared_key_rpcdata (XDR *xdrs, qcsapi_wifi_get_pre_shared_key_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_u_int (xdrs, &objp->key_index)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->pre_shared_key, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_set_pre_shared_key_rpcdata (XDR *xdrs, qcsapi_wifi_set_pre_shared_key_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_u_int (xdrs, &objp->key_index)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->pre_shared_key, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_add_radius_auth_server_cfg_rpcdata (XDR *xdrs, qcsapi_wifi_add_radius_auth_server_cfg_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->radius_auth_server_ipaddr, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->radius_auth_server_port, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->radius_auth_server_sh_key, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_del_radius_auth_server_cfg_rpcdata (XDR *xdrs, qcsapi_wifi_del_radius_auth_server_cfg_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->radius_auth_server_ipaddr, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->constp_radius_port, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_get_radius_auth_server_cfg_rpcdata (XDR *xdrs, qcsapi_wifi_get_radius_auth_server_cfg_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->radius_auth_server_cfg, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_set_own_ip_addr_rpcdata (XDR *xdrs, qcsapi_wifi_set_own_ip_addr_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->own_ip_addr, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_get_key_passphrase_rpcdata (XDR *xdrs, qcsapi_wifi_get_key_passphrase_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_u_int (xdrs, &objp->key_index)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->passphrase, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_set_key_passphrase_rpcdata (XDR *xdrs, qcsapi_wifi_set_key_passphrase_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_u_int (xdrs, &objp->key_index)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->passphrase, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_get_group_key_interval_rpcdata (XDR *xdrs, qcsapi_wifi_get_group_key_interval_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->group_key_interval, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_set_group_key_interval_rpcdata (XDR *xdrs, qcsapi_wifi_set_group_key_interval_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->group_key_interval, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_get_pmf_rpcdata (XDR *xdrs, qcsapi_wifi_get_pmf_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->p_pmf_cap, sizeof (int), (xdrproc_t) xdr_int)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_set_pmf_rpcdata (XDR *xdrs, qcsapi_wifi_set_pmf_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->pmf_cap)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_get_wpa_status_rpcdata (XDR *xdrs, qcsapi_wifi_get_wpa_status_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->mac_addr, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_u_int (xdrs, &objp->max_len)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->wpa_status, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_get_psk_auth_failures_rpcdata (XDR *xdrs, qcsapi_wifi_get_psk_auth_failures_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->count, sizeof (u_int), (xdrproc_t) xdr_u_int)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_get_auth_state_rpcdata (XDR *xdrs, qcsapi_wifi_get_auth_state_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->mac_addr, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->auth_state, sizeof (int), (xdrproc_t) xdr_int)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_set_security_defer_mode_rpcdata (XDR *xdrs, qcsapi_wifi_set_security_defer_mode_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->defer)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_get_security_defer_mode_rpcdata (XDR *xdrs, qcsapi_wifi_get_security_defer_mode_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->defer, sizeof (int), (xdrproc_t) xdr_int)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_apply_security_config_rpcdata (XDR *xdrs, qcsapi_wifi_apply_security_config_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_set_mac_address_filtering_rpcdata (XDR *xdrs, qcsapi_wifi_set_mac_address_filtering_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->new_mac_address_filtering)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_get_mac_address_filtering_rpcdata (XDR *xdrs, qcsapi_wifi_get_mac_address_filtering_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->current_mac_address_filtering, sizeof (int), (xdrproc_t) xdr_int)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_authorize_mac_address_rpcdata (XDR *xdrs, qcsapi_wifi_authorize_mac_address_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr___rpc_qcsapi_mac_addr_p (xdrs, &objp->address_to_authorize)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_deny_mac_address_rpcdata (XDR *xdrs, qcsapi_wifi_deny_mac_address_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr___rpc_qcsapi_mac_addr_p (xdrs, &objp->address_to_deny)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_remove_mac_address_rpcdata (XDR *xdrs, qcsapi_wifi_remove_mac_address_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr___rpc_qcsapi_mac_addr_p (xdrs, &objp->address_to_remove)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_is_mac_address_authorized_rpcdata (XDR *xdrs, qcsapi_wifi_is_mac_address_authorized_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr___rpc_qcsapi_mac_addr_p (xdrs, &objp->address_to_verify)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->p_mac_address_authorized, sizeof (int), (xdrproc_t) xdr_int)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_get_authorized_mac_addresses_rpcdata (XDR *xdrs, qcsapi_wifi_get_authorized_mac_addresses_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_u_int (xdrs, &objp->sizeof_list)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->list_mac_addresses, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_get_denied_mac_addresses_rpcdata (XDR *xdrs, qcsapi_wifi_get_denied_mac_addresses_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_u_int (xdrs, &objp->sizeof_list)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->list_mac_addresses, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_set_accept_oui_filter_rpcdata (XDR *xdrs, qcsapi_wifi_set_accept_oui_filter_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr___rpc_qcsapi_mac_addr_p (xdrs, &objp->oui)) + return FALSE; + if (!xdr_int (xdrs, &objp->flag)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_get_accept_oui_filter_rpcdata (XDR *xdrs, qcsapi_wifi_get_accept_oui_filter_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_u_int (xdrs, &objp->sizeof_list)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->oui_list, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_clear_mac_address_filters_rpcdata (XDR *xdrs, qcsapi_wifi_clear_mac_address_filters_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_set_mac_address_reserve_rpcdata (XDR *xdrs, qcsapi_wifi_set_mac_address_reserve_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->addr, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->mask, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_get_mac_address_reserve_rpcdata (XDR *xdrs, qcsapi_wifi_get_mac_address_reserve_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->buf, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_clear_mac_address_reserve_rpcdata (XDR *xdrs, qcsapi_wifi_clear_mac_address_reserve_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_get_option_rpcdata (XDR *xdrs, qcsapi_wifi_get_option_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->qcsapi_option)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->p_current_option, sizeof (int), (xdrproc_t) xdr_int)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_set_option_rpcdata (XDR *xdrs, qcsapi_wifi_set_option_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->qcsapi_option)) + return FALSE; + if (!xdr_int (xdrs, &objp->new_option)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_get_board_parameter_rpcdata (XDR *xdrs, qcsapi_get_board_parameter_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_int (xdrs, &objp->board_param)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->p_buffer, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_get_swfeat_list_rpcdata (XDR *xdrs, qcsapi_get_swfeat_list_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->p_buffer, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_SSID_create_SSID_rpcdata (XDR *xdrs, qcsapi_SSID_create_SSID_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->new_SSID, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_SSID_remove_SSID_rpcdata (XDR *xdrs, qcsapi_SSID_remove_SSID_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->del_SSID, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_SSID_verify_SSID_rpcdata (XDR *xdrs, qcsapi_SSID_verify_SSID_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->current_SSID, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_SSID_rename_SSID_rpcdata (XDR *xdrs, qcsapi_SSID_rename_SSID_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->current_SSID, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->new_SSID, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_SSID_get_SSID_list_rpcdata (XDR *xdrs, qcsapi_SSID_get_SSID_list_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_u_int (xdrs, &objp->arrayc)) + return FALSE; + if (!xdr_array (xdrs, (char **)&objp->list_SSID.list_SSID_val, (u_int *) &objp->list_SSID.list_SSID_len, ~0, + sizeof (str), (xdrproc_t) xdr_str)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_SSID_set_protocol_rpcdata (XDR *xdrs, qcsapi_SSID_set_protocol_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->current_SSID, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->new_protocol, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_SSID_get_protocol_rpcdata (XDR *xdrs, qcsapi_SSID_get_protocol_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->current_SSID, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->current_protocol, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_SSID_get_encryption_modes_rpcdata (XDR *xdrs, qcsapi_SSID_get_encryption_modes_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->current_SSID, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->encryption_modes, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_SSID_set_encryption_modes_rpcdata (XDR *xdrs, qcsapi_SSID_set_encryption_modes_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->current_SSID, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->encryption_modes, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_SSID_get_group_encryption_rpcdata (XDR *xdrs, qcsapi_SSID_get_group_encryption_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->current_SSID, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->encryption_mode, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_SSID_set_group_encryption_rpcdata (XDR *xdrs, qcsapi_SSID_set_group_encryption_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->current_SSID, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->encryption_mode, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_SSID_get_authentication_mode_rpcdata (XDR *xdrs, qcsapi_SSID_get_authentication_mode_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->current_SSID, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->authentication_mode, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_SSID_set_authentication_mode_rpcdata (XDR *xdrs, qcsapi_SSID_set_authentication_mode_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->current_SSID, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->authentication_mode, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_SSID_get_pre_shared_key_rpcdata (XDR *xdrs, qcsapi_SSID_get_pre_shared_key_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->current_SSID, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_u_int (xdrs, &objp->key_index)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->pre_shared_key, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_SSID_set_pre_shared_key_rpcdata (XDR *xdrs, qcsapi_SSID_set_pre_shared_key_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->current_SSID, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_u_int (xdrs, &objp->key_index)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->pre_shared_key, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_SSID_get_key_passphrase_rpcdata (XDR *xdrs, qcsapi_SSID_get_key_passphrase_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->current_SSID, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_u_int (xdrs, &objp->key_index)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->passphrase, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_SSID_set_key_passphrase_rpcdata (XDR *xdrs, qcsapi_SSID_set_key_passphrase_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->current_SSID, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_u_int (xdrs, &objp->key_index)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->passphrase, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_SSID_get_pmf_rpcdata (XDR *xdrs, qcsapi_SSID_get_pmf_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->current_SSID, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->p_pmf_cap, sizeof (int), (xdrproc_t) xdr_int)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_SSID_set_pmf_rpcdata (XDR *xdrs, qcsapi_SSID_set_pmf_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->SSID_str, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->pmf_cap)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_SSID_get_wps_SSID_rpcdata (XDR *xdrs, qcsapi_SSID_get_wps_SSID_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->wps_SSID, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_vlan_config_rpcdata (XDR *xdrs, qcsapi_wifi_vlan_config_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->cmd)) + return FALSE; + if (!xdr_uint32_t (xdrs, &objp->vlanid)) + return FALSE; + if (!xdr_uint32_t (xdrs, &objp->flags)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_show_vlan_config_rpcdata (XDR *xdrs, qcsapi_wifi_show_vlan_config_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->vcfg, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_enable_vlan_pass_through_rpcdata (XDR *xdrs, qcsapi_enable_vlan_pass_through_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->enabled)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_set_vlan_promisc_rpcdata (XDR *xdrs, qcsapi_wifi_set_vlan_promisc_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_int (xdrs, &objp->enable)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wps_registrar_report_button_press_rpcdata (XDR *xdrs, qcsapi_wps_registrar_report_button_press_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wps_registrar_report_pin_rpcdata (XDR *xdrs, qcsapi_wps_registrar_report_pin_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->wps_pin, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wps_registrar_get_pp_devname_rpcdata (XDR *xdrs, qcsapi_wps_registrar_get_pp_devname_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->blacklist)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->pp_devname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wps_registrar_set_pp_devname_rpcdata (XDR *xdrs, qcsapi_wps_registrar_set_pp_devname_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->update_blacklist)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->pp_devname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wps_enrollee_report_button_press_rpcdata (XDR *xdrs, qcsapi_wps_enrollee_report_button_press_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr___rpc_qcsapi_mac_addr_p (xdrs, &objp->bssid)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wps_enrollee_report_pin_rpcdata (XDR *xdrs, qcsapi_wps_enrollee_report_pin_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr___rpc_qcsapi_mac_addr_p (xdrs, &objp->bssid)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->wps_pin, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wps_enrollee_generate_pin_rpcdata (XDR *xdrs, qcsapi_wps_enrollee_generate_pin_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr___rpc_qcsapi_mac_addr_p (xdrs, &objp->bssid)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->wps_pin, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wps_get_ap_pin_rpcdata (XDR *xdrs, qcsapi_wps_get_ap_pin_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->force_regenerate)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->wps_pin, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wps_set_ap_pin_rpcdata (XDR *xdrs, qcsapi_wps_set_ap_pin_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->wps_pin, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wps_save_ap_pin_rpcdata (XDR *xdrs, qcsapi_wps_save_ap_pin_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wps_enable_ap_pin_rpcdata (XDR *xdrs, qcsapi_wps_enable_ap_pin_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->enable)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wps_get_sta_pin_rpcdata (XDR *xdrs, qcsapi_wps_get_sta_pin_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->wps_pin, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wps_get_state_rpcdata (XDR *xdrs, qcsapi_wps_get_state_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_u_int (xdrs, &objp->max_len)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->wps_state, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wps_get_configured_state_rpcdata (XDR *xdrs, qcsapi_wps_get_configured_state_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_u_int (xdrs, &objp->max_len)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->wps_state, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wps_get_runtime_state_rpcdata (XDR *xdrs, qcsapi_wps_get_runtime_state_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->max_len)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->state, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wps_set_configured_state_rpcdata (XDR *xdrs, qcsapi_wps_set_configured_state_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_u_int (xdrs, &objp->state)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wps_get_param_rpcdata (XDR *xdrs, qcsapi_wps_get_param_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->wps_type)) + return FALSE; + if (!xdr_u_int (xdrs, &objp->max_len)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->wps_str, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wps_set_timeout_rpcdata (XDR *xdrs, qcsapi_wps_set_timeout_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->value)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wps_on_hidden_ssid_rpcdata (XDR *xdrs, qcsapi_wps_on_hidden_ssid_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->value)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wps_on_hidden_ssid_status_rpcdata (XDR *xdrs, qcsapi_wps_on_hidden_ssid_status_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->max_len)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->state, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wps_upnp_enable_rpcdata (XDR *xdrs, qcsapi_wps_upnp_enable_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->value)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wps_upnp_status_rpcdata (XDR *xdrs, qcsapi_wps_upnp_status_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->reply_len)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->reply, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wps_allow_pbc_overlap_rpcdata (XDR *xdrs, qcsapi_wps_allow_pbc_overlap_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_u_int (xdrs, &objp->allow)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wps_get_allow_pbc_overlap_status_rpcdata (XDR *xdrs, qcsapi_wps_get_allow_pbc_overlap_status_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->status, sizeof (int), (xdrproc_t) xdr_int)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wps_set_access_control_rpcdata (XDR *xdrs, qcsapi_wps_set_access_control_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_uint32_t (xdrs, &objp->ctrl_state)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wps_get_access_control_rpcdata (XDR *xdrs, qcsapi_wps_get_access_control_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->ctrl_state, sizeof (uint32_t), (xdrproc_t) xdr_uint32_t)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wps_set_param_rpcdata (XDR *xdrs, qcsapi_wps_set_param_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->param_type)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->param_value, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wps_cancel_rpcdata (XDR *xdrs, qcsapi_wps_cancel_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wps_set_pbc_in_srcm_rpcdata (XDR *xdrs, qcsapi_wps_set_pbc_in_srcm_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_u_int (xdrs, &objp->enabled)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wps_get_pbc_in_srcm_rpcdata (XDR *xdrs, qcsapi_wps_get_pbc_in_srcm_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->p_enabled, sizeof (u_int), (xdrproc_t) xdr_u_int)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_registrar_set_default_pbc_bss_rpcdata (XDR *xdrs, qcsapi_registrar_set_default_pbc_bss_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_registrar_get_default_pbc_bss_rpcdata (XDR *xdrs, qcsapi_registrar_get_default_pbc_bss_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_int (xdrs, &objp->len)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->default_bss, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_gpio_set_config_rpcdata (XDR *xdrs, qcsapi_gpio_set_config_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_uint8_t (xdrs, &objp->gpio_pin)) + return FALSE; + if (!xdr_int (xdrs, &objp->new_gpio_config)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_gpio_get_config_rpcdata (XDR *xdrs, qcsapi_gpio_get_config_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_uint8_t (xdrs, &objp->gpio_pin)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->p_gpio_config, sizeof (int), (xdrproc_t) xdr_int)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_led_get_rpcdata (XDR *xdrs, qcsapi_led_get_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_uint8_t (xdrs, &objp->led_ident)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->p_led_setting, sizeof (uint8_t), (xdrproc_t) xdr_uint8_t)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_led_set_rpcdata (XDR *xdrs, qcsapi_led_set_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_uint8_t (xdrs, &objp->led_ident)) + return FALSE; + if (!xdr_uint8_t (xdrs, &objp->new_led_setting)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_led_pwm_enable_rpcdata (XDR *xdrs, qcsapi_led_pwm_enable_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_uint8_t (xdrs, &objp->led_ident)) + return FALSE; + if (!xdr_uint8_t (xdrs, &objp->onoff)) + return FALSE; + if (!xdr_u_int (xdrs, &objp->high_count)) + return FALSE; + if (!xdr_u_int (xdrs, &objp->low_count)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_led_brightness_rpcdata (XDR *xdrs, qcsapi_led_brightness_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_uint8_t (xdrs, &objp->led_ident)) + return FALSE; + if (!xdr_u_int (xdrs, &objp->level)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_gpio_enable_wps_push_button_rpcdata (XDR *xdrs, qcsapi_gpio_enable_wps_push_button_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_uint8_t (xdrs, &objp->wps_push_button)) + return FALSE; + if (!xdr_uint8_t (xdrs, &objp->active_logic)) + return FALSE; + if (!xdr_uint8_t (xdrs, &objp->use_interrupt_flag)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_get_count_associations_rpcdata (XDR *xdrs, qcsapi_wifi_get_count_associations_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->p_association_count, sizeof (u_int), (xdrproc_t) xdr_u_int)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_get_associated_device_mac_addr_rpcdata (XDR *xdrs, qcsapi_wifi_get_associated_device_mac_addr_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_u_int (xdrs, &objp->device_index)) + return FALSE; + if (!xdr___rpc_qcsapi_mac_addr_p (xdrs, &objp->device_mac_addr)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_get_associated_device_ip_addr_rpcdata (XDR *xdrs, qcsapi_wifi_get_associated_device_ip_addr_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_u_int (xdrs, &objp->device_index)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->ip_addr, sizeof (u_int), (xdrproc_t) xdr_u_int)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_get_link_quality_rpcdata (XDR *xdrs, qcsapi_wifi_get_link_quality_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_u_int (xdrs, &objp->association_index)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->p_link_quality, sizeof (u_int), (xdrproc_t) xdr_u_int)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_get_link_quality_max_rpcdata (XDR *xdrs, qcsapi_wifi_get_link_quality_max_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->p_max_quality, sizeof (u_int), (xdrproc_t) xdr_u_int)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_get_rx_bytes_per_association_rpcdata (XDR *xdrs, qcsapi_wifi_get_rx_bytes_per_association_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_u_int (xdrs, &objp->association_index)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->p_rx_bytes, sizeof (uint64_t), (xdrproc_t) xdr_uint64_t)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_get_tx_bytes_per_association_rpcdata (XDR *xdrs, qcsapi_wifi_get_tx_bytes_per_association_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_u_int (xdrs, &objp->association_index)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->p_tx_bytes, sizeof (uint64_t), (xdrproc_t) xdr_uint64_t)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_get_rx_packets_per_association_rpcdata (XDR *xdrs, qcsapi_wifi_get_rx_packets_per_association_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_u_int (xdrs, &objp->association_index)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->p_rx_packets, sizeof (u_int), (xdrproc_t) xdr_u_int)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_get_tx_packets_per_association_rpcdata (XDR *xdrs, qcsapi_wifi_get_tx_packets_per_association_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_u_int (xdrs, &objp->association_index)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->p_tx_packets, sizeof (u_int), (xdrproc_t) xdr_u_int)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_get_tx_err_packets_per_association_rpcdata (XDR *xdrs, qcsapi_wifi_get_tx_err_packets_per_association_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_u_int (xdrs, &objp->association_index)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->p_tx_err_packets, sizeof (u_int), (xdrproc_t) xdr_u_int)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_get_rssi_per_association_rpcdata (XDR *xdrs, qcsapi_wifi_get_rssi_per_association_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_u_int (xdrs, &objp->association_index)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->p_rssi, sizeof (u_int), (xdrproc_t) xdr_u_int)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_get_rssi_in_dbm_per_association_rpcdata (XDR *xdrs, qcsapi_wifi_get_rssi_in_dbm_per_association_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_u_int (xdrs, &objp->association_index)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->p_rssi, sizeof (int), (xdrproc_t) xdr_int)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_get_bw_per_association_rpcdata (XDR *xdrs, qcsapi_wifi_get_bw_per_association_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_u_int (xdrs, &objp->association_index)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->p_bw, sizeof (u_int), (xdrproc_t) xdr_u_int)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_get_tx_phy_rate_per_association_rpcdata (XDR *xdrs, qcsapi_wifi_get_tx_phy_rate_per_association_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_u_int (xdrs, &objp->association_index)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->p_tx_phy_rate, sizeof (u_int), (xdrproc_t) xdr_u_int)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_get_rx_phy_rate_per_association_rpcdata (XDR *xdrs, qcsapi_wifi_get_rx_phy_rate_per_association_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_u_int (xdrs, &objp->association_index)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->p_rx_phy_rate, sizeof (u_int), (xdrproc_t) xdr_u_int)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_get_tx_mcs_per_association_rpcdata (XDR *xdrs, qcsapi_wifi_get_tx_mcs_per_association_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_u_int (xdrs, &objp->association_index)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->p_mcs, sizeof (u_int), (xdrproc_t) xdr_u_int)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_get_rx_mcs_per_association_rpcdata (XDR *xdrs, qcsapi_wifi_get_rx_mcs_per_association_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_u_int (xdrs, &objp->association_index)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->p_mcs, sizeof (u_int), (xdrproc_t) xdr_u_int)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_get_achievable_tx_phy_rate_per_association_rpcdata (XDR *xdrs, qcsapi_wifi_get_achievable_tx_phy_rate_per_association_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_u_int (xdrs, &objp->association_index)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->p_achievable_tx_phy_rate, sizeof (u_int), (xdrproc_t) xdr_u_int)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_get_achievable_rx_phy_rate_per_association_rpcdata (XDR *xdrs, qcsapi_wifi_get_achievable_rx_phy_rate_per_association_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_u_int (xdrs, &objp->association_index)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->p_achievable_rx_phy_rate, sizeof (u_int), (xdrproc_t) xdr_u_int)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_get_auth_enc_per_association_rpcdata (XDR *xdrs, qcsapi_wifi_get_auth_enc_per_association_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_u_int (xdrs, &objp->association_index)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->p_auth_enc, sizeof (u_int), (xdrproc_t) xdr_u_int)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_get_tput_caps_rpcdata (XDR *xdrs, qcsapi_wifi_get_tput_caps_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_u_int (xdrs, &objp->association_index)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->tput_caps, sizeof (__rpc_ieee8011req_sta_tput_caps), (xdrproc_t) xdr___rpc_ieee8011req_sta_tput_caps)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_get_connection_mode_rpcdata (XDR *xdrs, qcsapi_wifi_get_connection_mode_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_u_int (xdrs, &objp->association_index)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->connection_mode, sizeof (u_int), (xdrproc_t) xdr_u_int)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_get_vendor_per_association_rpcdata (XDR *xdrs, qcsapi_wifi_get_vendor_per_association_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_u_int (xdrs, &objp->association_index)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->p_vendor, sizeof (u_int), (xdrproc_t) xdr_u_int)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_get_max_mimo_rpcdata (XDR *xdrs, qcsapi_wifi_get_max_mimo_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_u_int (xdrs, &objp->association_index)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->p_max_mimo, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_get_snr_per_association_rpcdata (XDR *xdrs, qcsapi_wifi_get_snr_per_association_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_u_int (xdrs, &objp->association_index)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->p_snr, sizeof (int), (xdrproc_t) xdr_int)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_get_time_associated_per_association_rpcdata (XDR *xdrs, qcsapi_wifi_get_time_associated_per_association_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_u_int (xdrs, &objp->association_index)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->time_associated, sizeof (u_int), (xdrproc_t) xdr_u_int)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_get_node_param_rpcdata (XDR *xdrs, qcsapi_wifi_get_node_param_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_uint32_t (xdrs, &objp->node_index)) + return FALSE; + if (!xdr_int (xdrs, &objp->param_type)) + return FALSE; + if (!xdr_int (xdrs, &objp->local_remote_flag)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->input_param_str, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->report_result, sizeof (__rpc_qcsapi_measure_report_result), (xdrproc_t) xdr___rpc_qcsapi_measure_report_result)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_get_node_counter_rpcdata (XDR *xdrs, qcsapi_wifi_get_node_counter_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_uint32_t (xdrs, &objp->node_index)) + return FALSE; + if (!xdr_int (xdrs, &objp->counter_type)) + return FALSE; + if (!xdr_int (xdrs, &objp->local_remote_flag)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->p_value, sizeof (uint64_t), (xdrproc_t) xdr_uint64_t)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_get_node_stats_rpcdata (XDR *xdrs, qcsapi_wifi_get_node_stats_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_uint32_t (xdrs, &objp->node_index)) + return FALSE; + if (!xdr_int (xdrs, &objp->local_remote_flag)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->p_stats, sizeof (__rpc_qcsapi_node_stats), (xdrproc_t) xdr___rpc_qcsapi_node_stats)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_get_max_queued_rpcdata (XDR *xdrs, qcsapi_wifi_get_max_queued_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_uint32_t (xdrs, &objp->node_index)) + return FALSE; + if (!xdr_int (xdrs, &objp->local_remote_flag)) + return FALSE; + if (!xdr_int (xdrs, &objp->reset_flag)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->max_queued, sizeof (uint32_t), (xdrproc_t) xdr_uint32_t)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_get_hw_noise_per_association_rpcdata (XDR *xdrs, qcsapi_wifi_get_hw_noise_per_association_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_u_int (xdrs, &objp->association_index)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->p_hw_noise, sizeof (int), (xdrproc_t) xdr_int)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_get_mlme_stats_per_mac_rpcdata (XDR *xdrs, qcsapi_wifi_get_mlme_stats_per_mac_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr___rpc_qcsapi_mac_addr_p (xdrs, &objp->client_mac_addr)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->stats, sizeof (__rpc_qcsapi_mlme_stats), (xdrproc_t) xdr___rpc_qcsapi_mlme_stats)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_get_mlme_stats_per_association_rpcdata (XDR *xdrs, qcsapi_wifi_get_mlme_stats_per_association_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_u_int (xdrs, &objp->association_index)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->stats, sizeof (__rpc_qcsapi_mlme_stats), (xdrproc_t) xdr___rpc_qcsapi_mlme_stats)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_get_mlme_stats_macs_list_rpcdata (XDR *xdrs, qcsapi_wifi_get_mlme_stats_macs_list_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->macs_list, sizeof (__rpc_qcsapi_mlme_stats_macs), (xdrproc_t) xdr___rpc_qcsapi_mlme_stats_macs)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_get_list_regulatory_regions_rpcdata (XDR *xdrs, qcsapi_wifi_get_list_regulatory_regions_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->list_regulatory_regions, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_regulatory_get_list_regulatory_regions_rpcdata (XDR *xdrs, qcsapi_regulatory_get_list_regulatory_regions_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->list_regulatory_regions, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_get_list_regulatory_channels_rpcdata (XDR *xdrs, qcsapi_wifi_get_list_regulatory_channels_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->region_by_name, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_u_int (xdrs, &objp->bw)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->list_of_channels, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_regulatory_get_list_regulatory_channels_rpcdata (XDR *xdrs, qcsapi_regulatory_get_list_regulatory_channels_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->region_by_name, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_u_int (xdrs, &objp->bw)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->list_of_channels, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_regulatory_get_list_regulatory_bands_rpcdata (XDR *xdrs, qcsapi_regulatory_get_list_regulatory_bands_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->region_by_name, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->list_of_bands, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_get_regulatory_tx_power_rpcdata (XDR *xdrs, qcsapi_wifi_get_regulatory_tx_power_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_u_int (xdrs, &objp->the_channel)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->region_by_name, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->p_tx_power, sizeof (int), (xdrproc_t) xdr_int)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_regulatory_get_regulatory_tx_power_rpcdata (XDR *xdrs, qcsapi_regulatory_get_regulatory_tx_power_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_u_int (xdrs, &objp->the_channel)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->region_by_name, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->p_tx_power, sizeof (int), (xdrproc_t) xdr_int)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_get_configured_tx_power_rpcdata (XDR *xdrs, qcsapi_wifi_get_configured_tx_power_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_u_int (xdrs, &objp->the_channel)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->region_by_name, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_u_int (xdrs, &objp->bw)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->p_tx_power, sizeof (int), (xdrproc_t) xdr_int)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_regulatory_get_configured_tx_power_rpcdata (XDR *xdrs, qcsapi_regulatory_get_configured_tx_power_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_u_int (xdrs, &objp->the_channel)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->region_by_name, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_u_int (xdrs, &objp->bw)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->p_tx_power, sizeof (int), (xdrproc_t) xdr_int)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_regulatory_get_configured_tx_power_ext_rpcdata (XDR *xdrs, qcsapi_regulatory_get_configured_tx_power_ext_rpcdata *objp) +{ + register int32_t *buf; + + + if (xdrs->x_op == XDR_ENCODE) { + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_u_int (xdrs, &objp->the_channel)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->region_by_name, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + buf = XDR_INLINE (xdrs, 3 * BYTES_PER_XDR_UNIT); + if (buf == NULL) { + if (!xdr_int (xdrs, &objp->the_bw)) + return FALSE; + if (!xdr_u_int (xdrs, &objp->bf_on)) + return FALSE; + if (!xdr_u_int (xdrs, &objp->number_ss)) + return FALSE; + + } else { + IXDR_PUT_LONG(buf, objp->the_bw); + IXDR_PUT_U_LONG(buf, objp->bf_on); + IXDR_PUT_U_LONG(buf, objp->number_ss); + } + if (!xdr_pointer (xdrs, (char **)&objp->p_tx_power, sizeof (int), (xdrproc_t) xdr_int)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; + } else if (xdrs->x_op == XDR_DECODE) { + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_u_int (xdrs, &objp->the_channel)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->region_by_name, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + buf = XDR_INLINE (xdrs, 3 * BYTES_PER_XDR_UNIT); + if (buf == NULL) { + if (!xdr_int (xdrs, &objp->the_bw)) + return FALSE; + if (!xdr_u_int (xdrs, &objp->bf_on)) + return FALSE; + if (!xdr_u_int (xdrs, &objp->number_ss)) + return FALSE; + + } else { + objp->the_bw = IXDR_GET_LONG(buf); + objp->bf_on = IXDR_GET_U_LONG(buf); + objp->number_ss = IXDR_GET_U_LONG(buf); + } + if (!xdr_pointer (xdrs, (char **)&objp->p_tx_power, sizeof (int), (xdrproc_t) xdr_int)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; + } + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_u_int (xdrs, &objp->the_channel)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->region_by_name, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->the_bw)) + return FALSE; + if (!xdr_u_int (xdrs, &objp->bf_on)) + return FALSE; + if (!xdr_u_int (xdrs, &objp->number_ss)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->p_tx_power, sizeof (int), (xdrproc_t) xdr_int)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_set_regulatory_region_rpcdata (XDR *xdrs, qcsapi_wifi_set_regulatory_region_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->region_by_name, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_regulatory_set_regulatory_region_rpcdata (XDR *xdrs, qcsapi_regulatory_set_regulatory_region_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->region_by_name, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_regulatory_restore_regulatory_tx_power_rpcdata (XDR *xdrs, qcsapi_regulatory_restore_regulatory_tx_power_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_get_regulatory_region_rpcdata (XDR *xdrs, qcsapi_wifi_get_regulatory_region_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->region_by_name, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_regulatory_overwrite_country_code_rpcdata (XDR *xdrs, qcsapi_regulatory_overwrite_country_code_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->curr_country_name, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->new_country_name, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_set_regulatory_channel_rpcdata (XDR *xdrs, qcsapi_wifi_set_regulatory_channel_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_u_int (xdrs, &objp->the_channel)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->region_by_name, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_u_int (xdrs, &objp->tx_power_offset)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_regulatory_set_regulatory_channel_rpcdata (XDR *xdrs, qcsapi_regulatory_set_regulatory_channel_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_u_int (xdrs, &objp->the_channel)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->region_by_name, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_u_int (xdrs, &objp->tx_power_offset)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_regulatory_get_db_version_rpcdata (XDR *xdrs, qcsapi_regulatory_get_db_version_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_int (xdrs, &objp->index)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->p_version, sizeof (int), (xdrproc_t) xdr_int)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_regulatory_apply_tx_power_cap_rpcdata (XDR *xdrs, qcsapi_regulatory_apply_tx_power_cap_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_int (xdrs, &objp->capped)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_get_list_DFS_channels_rpcdata (XDR *xdrs, qcsapi_wifi_get_list_DFS_channels_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->region_by_name, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->DFS_flag)) + return FALSE; + if (!xdr_u_int (xdrs, &objp->bw)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->list_of_channels, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_regulatory_get_list_DFS_channels_rpcdata (XDR *xdrs, qcsapi_regulatory_get_list_DFS_channels_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->region_by_name, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->DFS_flag)) + return FALSE; + if (!xdr_u_int (xdrs, &objp->bw)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->list_of_channels, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_is_channel_DFS_rpcdata (XDR *xdrs, qcsapi_wifi_is_channel_DFS_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->region_by_name, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_u_int (xdrs, &objp->the_channel)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->p_channel_is_DFS, sizeof (int), (xdrproc_t) xdr_int)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_regulatory_is_channel_DFS_rpcdata (XDR *xdrs, qcsapi_regulatory_is_channel_DFS_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->region_by_name, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_u_int (xdrs, &objp->the_channel)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->p_channel_is_DFS, sizeof (int), (xdrproc_t) xdr_int)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_get_dfs_cce_channels_rpcdata (XDR *xdrs, qcsapi_wifi_get_dfs_cce_channels_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->p_prev_channel, sizeof (u_int), (xdrproc_t) xdr_u_int)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->p_cur_channel, sizeof (u_int), (xdrproc_t) xdr_u_int)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_get_DFS_alt_channel_rpcdata (XDR *xdrs, qcsapi_wifi_get_DFS_alt_channel_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->p_dfs_alt_chan, sizeof (u_int), (xdrproc_t) xdr_u_int)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_set_DFS_alt_channel_rpcdata (XDR *xdrs, qcsapi_wifi_set_DFS_alt_channel_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_u_int (xdrs, &objp->dfs_alt_chan)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_start_dfs_reentry_rpcdata (XDR *xdrs, qcsapi_wifi_start_dfs_reentry_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_start_scan_ext_rpcdata (XDR *xdrs, qcsapi_wifi_start_scan_ext_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->scan_flag)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_get_csw_records_rpcdata (XDR *xdrs, qcsapi_wifi_get_csw_records_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->reset)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->record, sizeof (__rpc_qcsapi_csw_record), (xdrproc_t) xdr___rpc_qcsapi_csw_record)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_get_radar_status_rpcdata (XDR *xdrs, qcsapi_wifi_get_radar_status_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->rdstatus, sizeof (__rpc_qcsapi_radar_status), (xdrproc_t) xdr___rpc_qcsapi_radar_status)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_get_cac_status_rpcdata (XDR *xdrs, qcsapi_wifi_get_cac_status_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->cacstatus, sizeof (int), (xdrproc_t) xdr_int)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_get_results_AP_scan_rpcdata (XDR *xdrs, qcsapi_wifi_get_results_AP_scan_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->p_count_APs, sizeof (u_int), (xdrproc_t) xdr_u_int)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_get_count_APs_scanned_rpcdata (XDR *xdrs, qcsapi_wifi_get_count_APs_scanned_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->p_count_APs, sizeof (u_int), (xdrproc_t) xdr_u_int)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_get_properties_AP_rpcdata (XDR *xdrs, qcsapi_wifi_get_properties_AP_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_u_int (xdrs, &objp->index_AP)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->p_ap_properties, sizeof (__rpc_qcsapi_ap_properties), (xdrproc_t) xdr___rpc_qcsapi_ap_properties)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_set_scan_chk_inv_rpcdata (XDR *xdrs, qcsapi_wifi_set_scan_chk_inv_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->scan_chk_inv)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_get_scan_chk_inv_rpcdata (XDR *xdrs, qcsapi_wifi_get_scan_chk_inv_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->p, sizeof (int), (xdrproc_t) xdr_int)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_set_scan_buf_max_size_rpcdata (XDR *xdrs, qcsapi_wifi_set_scan_buf_max_size_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_u_int (xdrs, &objp->max_buf_size)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_get_scan_buf_max_size_rpcdata (XDR *xdrs, qcsapi_wifi_get_scan_buf_max_size_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->max_buf_size, sizeof (u_int), (xdrproc_t) xdr_u_int)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_set_scan_table_max_len_rpcdata (XDR *xdrs, qcsapi_wifi_set_scan_table_max_len_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_u_int (xdrs, &objp->max_table_len)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_get_scan_table_max_len_rpcdata (XDR *xdrs, qcsapi_wifi_get_scan_table_max_len_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->max_table_len, sizeof (u_int), (xdrproc_t) xdr_u_int)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_set_dwell_times_rpcdata (XDR *xdrs, qcsapi_wifi_set_dwell_times_rpcdata *objp) +{ + register int32_t *buf; + + + if (xdrs->x_op == XDR_ENCODE) { + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + buf = XDR_INLINE (xdrs, 5 * BYTES_PER_XDR_UNIT); + if (buf == NULL) { + if (!xdr_u_int (xdrs, &objp->max_dwell_time_active_chan)) + return FALSE; + if (!xdr_u_int (xdrs, &objp->min_dwell_time_active_chan)) + return FALSE; + if (!xdr_u_int (xdrs, &objp->max_dwell_time_passive_chan)) + return FALSE; + if (!xdr_u_int (xdrs, &objp->min_dwell_time_passive_chan)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + } else { + IXDR_PUT_U_LONG(buf, objp->max_dwell_time_active_chan); + IXDR_PUT_U_LONG(buf, objp->min_dwell_time_active_chan); + IXDR_PUT_U_LONG(buf, objp->max_dwell_time_passive_chan); + IXDR_PUT_U_LONG(buf, objp->min_dwell_time_passive_chan); + IXDR_PUT_LONG(buf, objp->return_code); + } + return TRUE; + } else if (xdrs->x_op == XDR_DECODE) { + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + buf = XDR_INLINE (xdrs, 5 * BYTES_PER_XDR_UNIT); + if (buf == NULL) { + if (!xdr_u_int (xdrs, &objp->max_dwell_time_active_chan)) + return FALSE; + if (!xdr_u_int (xdrs, &objp->min_dwell_time_active_chan)) + return FALSE; + if (!xdr_u_int (xdrs, &objp->max_dwell_time_passive_chan)) + return FALSE; + if (!xdr_u_int (xdrs, &objp->min_dwell_time_passive_chan)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + } else { + objp->max_dwell_time_active_chan = IXDR_GET_U_LONG(buf); + objp->min_dwell_time_active_chan = IXDR_GET_U_LONG(buf); + objp->max_dwell_time_passive_chan = IXDR_GET_U_LONG(buf); + objp->min_dwell_time_passive_chan = IXDR_GET_U_LONG(buf); + objp->return_code = IXDR_GET_LONG(buf); + } + return TRUE; + } + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_u_int (xdrs, &objp->max_dwell_time_active_chan)) + return FALSE; + if (!xdr_u_int (xdrs, &objp->min_dwell_time_active_chan)) + return FALSE; + if (!xdr_u_int (xdrs, &objp->max_dwell_time_passive_chan)) + return FALSE; + if (!xdr_u_int (xdrs, &objp->min_dwell_time_passive_chan)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_get_dwell_times_rpcdata (XDR *xdrs, qcsapi_wifi_get_dwell_times_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->p_max_dwell_time_active_chan, sizeof (u_int), (xdrproc_t) xdr_u_int)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->p_min_dwell_time_active_chan, sizeof (u_int), (xdrproc_t) xdr_u_int)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->p_max_dwell_time_passive_chan, sizeof (u_int), (xdrproc_t) xdr_u_int)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->p_min_dwell_time_passive_chan, sizeof (u_int), (xdrproc_t) xdr_u_int)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_set_bgscan_dwell_times_rpcdata (XDR *xdrs, qcsapi_wifi_set_bgscan_dwell_times_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_u_int (xdrs, &objp->dwell_time_active_chan)) + return FALSE; + if (!xdr_u_int (xdrs, &objp->dwell_time_passive_chan)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_get_bgscan_dwell_times_rpcdata (XDR *xdrs, qcsapi_wifi_get_bgscan_dwell_times_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->p_dwell_time_active_chan, sizeof (u_int), (xdrproc_t) xdr_u_int)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->p_dwell_time_passive_chan, sizeof (u_int), (xdrproc_t) xdr_u_int)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_start_scan_rpcdata (XDR *xdrs, qcsapi_wifi_start_scan_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_cancel_scan_rpcdata (XDR *xdrs, qcsapi_wifi_cancel_scan_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->force)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_get_scan_status_rpcdata (XDR *xdrs, qcsapi_wifi_get_scan_status_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->scanstatus, sizeof (int), (xdrproc_t) xdr_int)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_enable_bgscan_rpcdata (XDR *xdrs, qcsapi_wifi_enable_bgscan_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->enable)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_get_bgscan_status_rpcdata (XDR *xdrs, qcsapi_wifi_get_bgscan_status_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->enable, sizeof (int), (xdrproc_t) xdr_int)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_wait_scan_completes_rpcdata (XDR *xdrs, qcsapi_wifi_wait_scan_completes_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_uint32_t (xdrs, &objp->timeout)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_backoff_fail_max_rpcdata (XDR *xdrs, qcsapi_wifi_backoff_fail_max_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->fail_max)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_backoff_timeout_rpcdata (XDR *xdrs, qcsapi_wifi_backoff_timeout_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->timeout)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_get_mcs_rate_rpcdata (XDR *xdrs, qcsapi_wifi_get_mcs_rate_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->current_mcs_rate, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_set_mcs_rate_rpcdata (XDR *xdrs, qcsapi_wifi_set_mcs_rate_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->new_mcs_rate, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_set_pairing_id_rpcdata (XDR *xdrs, qcsapi_wifi_set_pairing_id_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->pairing_id, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_get_pairing_id_rpcdata (XDR *xdrs, qcsapi_wifi_get_pairing_id_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->pairing_id, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_set_pairing_enable_rpcdata (XDR *xdrs, qcsapi_wifi_set_pairing_enable_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->enable, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_get_pairing_enable_rpcdata (XDR *xdrs, qcsapi_wifi_get_pairing_enable_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->enable, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_non_wps_set_pp_enable_rpcdata (XDR *xdrs, qcsapi_non_wps_set_pp_enable_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_uint32_t (xdrs, &objp->ctrl_state)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_non_wps_get_pp_enable_rpcdata (XDR *xdrs, qcsapi_non_wps_get_pp_enable_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->ctrl_state, sizeof (uint32_t), (xdrproc_t) xdr_uint32_t)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_set_vendor_fix_rpcdata (XDR *xdrs, qcsapi_wifi_set_vendor_fix_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->fix_param)) + return FALSE; + if (!xdr_int (xdrs, &objp->value)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_errno_get_message_rpcdata (XDR *xdrs, qcsapi_errno_get_message_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_int (xdrs, &objp->qcsapi_retval)) + return FALSE; + if (!xdr_u_int (xdrs, &objp->msglen)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->error_msg, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_get_interface_stats_rpcdata (XDR *xdrs, qcsapi_get_interface_stats_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->stats, sizeof (__rpc_qcsapi_interface_stats), (xdrproc_t) xdr___rpc_qcsapi_interface_stats)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_get_phy_stats_rpcdata (XDR *xdrs, qcsapi_get_phy_stats_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->stats, sizeof (__rpc_qcsapi_phy_stats), (xdrproc_t) xdr___rpc_qcsapi_phy_stats)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_reset_all_counters_rpcdata (XDR *xdrs, qcsapi_reset_all_counters_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_uint32_t (xdrs, &objp->node_index)) + return FALSE; + if (!xdr_int (xdrs, &objp->local_remote_flag)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_get_uboot_info_rpcdata (XDR *xdrs, qcsapi_get_uboot_info_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->uboot_version, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->ef_config, sizeof (__rpc_early_flash_config), (xdrproc_t) xdr___rpc_early_flash_config)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_firmware_get_version_rpcdata (XDR *xdrs, qcsapi_firmware_get_version_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_u_int (xdrs, &objp->version_size)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->firmware_version, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_flash_image_update_rpcdata (XDR *xdrs, qcsapi_flash_image_update_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->image_file, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->partition_to_upgrade)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_send_file_rpcdata (XDR *xdrs, qcsapi_send_file_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->image_file_path, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->image_flags)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_pm_set_mode_rpcdata (XDR *xdrs, qcsapi_pm_set_mode_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_int (xdrs, &objp->mode)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_pm_get_mode_rpcdata (XDR *xdrs, qcsapi_pm_get_mode_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->mode, sizeof (int), (xdrproc_t) xdr_int)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_get_qpm_level_rpcdata (XDR *xdrs, qcsapi_get_qpm_level_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->qpm_level, sizeof (int), (xdrproc_t) xdr_int)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_set_host_state_rpcdata (XDR *xdrs, qcsapi_set_host_state_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_uint32_t (xdrs, &objp->host_state)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_qtm_get_state_rpcdata (XDR *xdrs, qcsapi_qtm_get_state_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_u_int (xdrs, &objp->param)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->value, sizeof (u_int), (xdrproc_t) xdr_u_int)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_qtm_get_state_all_rpcdata (XDR *xdrs, qcsapi_qtm_get_state_all_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_u_int (xdrs, &objp->max)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->value, sizeof (__rpc_qcsapi_data_128bytes), (xdrproc_t) xdr___rpc_qcsapi_data_128bytes)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_qtm_set_state_rpcdata (XDR *xdrs, qcsapi_qtm_set_state_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_u_int (xdrs, &objp->param)) + return FALSE; + if (!xdr_u_int (xdrs, &objp->value)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_qtm_get_config_rpcdata (XDR *xdrs, qcsapi_qtm_get_config_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_u_int (xdrs, &objp->param)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->value, sizeof (u_int), (xdrproc_t) xdr_u_int)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_qtm_get_config_all_rpcdata (XDR *xdrs, qcsapi_qtm_get_config_all_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_u_int (xdrs, &objp->max)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->value, sizeof (__rpc_qcsapi_data_1Kbytes), (xdrproc_t) xdr___rpc_qcsapi_data_1Kbytes)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_qtm_set_config_rpcdata (XDR *xdrs, qcsapi_qtm_set_config_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_u_int (xdrs, &objp->param)) + return FALSE; + if (!xdr_u_int (xdrs, &objp->value)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_qtm_add_rule_rpcdata (XDR *xdrs, qcsapi_qtm_add_rule_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->entry, sizeof (__rpc_qcsapi_data_128bytes), (xdrproc_t) xdr___rpc_qcsapi_data_128bytes)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_qtm_del_rule_rpcdata (XDR *xdrs, qcsapi_qtm_del_rule_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->entry, sizeof (__rpc_qcsapi_data_128bytes), (xdrproc_t) xdr___rpc_qcsapi_data_128bytes)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_qtm_del_rule_index_rpcdata (XDR *xdrs, qcsapi_qtm_del_rule_index_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_u_int (xdrs, &objp->index)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_qtm_get_rule_rpcdata (XDR *xdrs, qcsapi_qtm_get_rule_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_u_int (xdrs, &objp->max_entries)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->entries, sizeof (__rpc_qcsapi_data_3Kbytes), (xdrproc_t) xdr___rpc_qcsapi_data_3Kbytes)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_qtm_get_strm_rpcdata (XDR *xdrs, qcsapi_qtm_get_strm_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_u_int (xdrs, &objp->max_entries)) + return FALSE; + if (!xdr_int (xdrs, &objp->show_all)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->strms, sizeof (__rpc_qcsapi_data_4Kbytes), (xdrproc_t) xdr___rpc_qcsapi_data_4Kbytes)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_qtm_get_stats_rpcdata (XDR *xdrs, qcsapi_qtm_get_stats_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->stats, sizeof (__rpc_qcsapi_data_512bytes), (xdrproc_t) xdr___rpc_qcsapi_data_512bytes)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_qtm_get_inactive_flags_rpcdata (XDR *xdrs, qcsapi_qtm_get_inactive_flags_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->flags, sizeof (u_long), (xdrproc_t) xdr_u_long)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_run_script_rpcdata (XDR *xdrs, qcsapi_wifi_run_script_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->scriptname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->param, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_test_traffic_rpcdata (XDR *xdrs, qcsapi_wifi_test_traffic_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_uint32_t (xdrs, &objp->period)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_add_ipff_rpcdata (XDR *xdrs, qcsapi_wifi_add_ipff_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_u_int (xdrs, &objp->ipaddr)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_del_ipff_rpcdata (XDR *xdrs, qcsapi_wifi_del_ipff_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_u_int (xdrs, &objp->ipaddr)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_get_ipff_rpcdata (XDR *xdrs, qcsapi_wifi_get_ipff_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_int (xdrs, &objp->buflen)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->buf, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_get_rts_threshold_rpcdata (XDR *xdrs, qcsapi_wifi_get_rts_threshold_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->rts_threshold, sizeof (u_int), (xdrproc_t) xdr_u_int)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_set_rts_threshold_rpcdata (XDR *xdrs, qcsapi_wifi_set_rts_threshold_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_u_int (xdrs, &objp->rts_threshold)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_set_nss_cap_rpcdata (XDR *xdrs, qcsapi_wifi_set_nss_cap_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->modulation)) + return FALSE; + if (!xdr_u_int (xdrs, &objp->nss)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_get_nss_cap_rpcdata (XDR *xdrs, qcsapi_wifi_get_nss_cap_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->modulation)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->nss, sizeof (u_int), (xdrproc_t) xdr_u_int)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_get_tx_amsdu_rpcdata (XDR *xdrs, qcsapi_wifi_get_tx_amsdu_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->enable, sizeof (int), (xdrproc_t) xdr_int)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_set_tx_amsdu_rpcdata (XDR *xdrs, qcsapi_wifi_set_tx_amsdu_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->enable)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_get_disassoc_reason_rpcdata (XDR *xdrs, qcsapi_wifi_get_disassoc_reason_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->reason, sizeof (u_int), (xdrproc_t) xdr_u_int)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_block_bss_rpcdata (XDR *xdrs, qcsapi_wifi_block_bss_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_u_int (xdrs, &objp->flag)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_verify_repeater_mode_rpcdata (XDR *xdrs, qcsapi_wifi_verify_repeater_mode_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_set_ap_interface_name_rpcdata (XDR *xdrs, qcsapi_wifi_set_ap_interface_name_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_get_ap_interface_name_rpcdata (XDR *xdrs, qcsapi_wifi_get_ap_interface_name_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_get_temperature_info_rpcdata (XDR *xdrs, qcsapi_get_temperature_info_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->temp_exter, sizeof (int), (xdrproc_t) xdr_int)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->temp_inter, sizeof (int), (xdrproc_t) xdr_int)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->temp_bbic, sizeof (int), (xdrproc_t) xdr_int)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_calcmd_set_test_mode_rpcdata (XDR *xdrs, qcsapi_calcmd_set_test_mode_rpcdata *objp) +{ + register int32_t *buf; + + + if (xdrs->x_op == XDR_ENCODE) { + buf = XDR_INLINE (xdrs, 8 * BYTES_PER_XDR_UNIT); + if (buf == NULL) { + if (!xdr_u_int (xdrs, &objp->channel)) + return FALSE; + if (!xdr_u_int (xdrs, &objp->antenna)) + return FALSE; + if (!xdr_u_int (xdrs, &objp->mcs)) + return FALSE; + if (!xdr_u_int (xdrs, &objp->bw)) + return FALSE; + if (!xdr_u_int (xdrs, &objp->pkt_size)) + return FALSE; + if (!xdr_u_int (xdrs, &objp->eleven_n)) + return FALSE; + if (!xdr_u_int (xdrs, &objp->bf)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + } else { + IXDR_PUT_U_LONG(buf, objp->channel); + IXDR_PUT_U_LONG(buf, objp->antenna); + IXDR_PUT_U_LONG(buf, objp->mcs); + IXDR_PUT_U_LONG(buf, objp->bw); + IXDR_PUT_U_LONG(buf, objp->pkt_size); + IXDR_PUT_U_LONG(buf, objp->eleven_n); + IXDR_PUT_U_LONG(buf, objp->bf); + IXDR_PUT_LONG(buf, objp->return_code); + } + return TRUE; + } else if (xdrs->x_op == XDR_DECODE) { + buf = XDR_INLINE (xdrs, 8 * BYTES_PER_XDR_UNIT); + if (buf == NULL) { + if (!xdr_u_int (xdrs, &objp->channel)) + return FALSE; + if (!xdr_u_int (xdrs, &objp->antenna)) + return FALSE; + if (!xdr_u_int (xdrs, &objp->mcs)) + return FALSE; + if (!xdr_u_int (xdrs, &objp->bw)) + return FALSE; + if (!xdr_u_int (xdrs, &objp->pkt_size)) + return FALSE; + if (!xdr_u_int (xdrs, &objp->eleven_n)) + return FALSE; + if (!xdr_u_int (xdrs, &objp->bf)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + } else { + objp->channel = IXDR_GET_U_LONG(buf); + objp->antenna = IXDR_GET_U_LONG(buf); + objp->mcs = IXDR_GET_U_LONG(buf); + objp->bw = IXDR_GET_U_LONG(buf); + objp->pkt_size = IXDR_GET_U_LONG(buf); + objp->eleven_n = IXDR_GET_U_LONG(buf); + objp->bf = IXDR_GET_U_LONG(buf); + objp->return_code = IXDR_GET_LONG(buf); + } + return TRUE; + } + + if (!xdr_u_int (xdrs, &objp->channel)) + return FALSE; + if (!xdr_u_int (xdrs, &objp->antenna)) + return FALSE; + if (!xdr_u_int (xdrs, &objp->mcs)) + return FALSE; + if (!xdr_u_int (xdrs, &objp->bw)) + return FALSE; + if (!xdr_u_int (xdrs, &objp->pkt_size)) + return FALSE; + if (!xdr_u_int (xdrs, &objp->eleven_n)) + return FALSE; + if (!xdr_u_int (xdrs, &objp->bf)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_calcmd_show_test_packet_rpcdata (XDR *xdrs, qcsapi_calcmd_show_test_packet_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->tx_packet_num, sizeof (u_int), (xdrproc_t) xdr_u_int)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->rx_packet_num, sizeof (u_int), (xdrproc_t) xdr_u_int)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->crc_packet_num, sizeof (u_int), (xdrproc_t) xdr_u_int)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_calcmd_send_test_packet_rpcdata (XDR *xdrs, qcsapi_calcmd_send_test_packet_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_u_int (xdrs, &objp->to_transmit_packet_num)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_calcmd_stop_test_packet_rpcdata (XDR *xdrs, qcsapi_calcmd_stop_test_packet_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_calcmd_send_dc_cw_signal_rpcdata (XDR *xdrs, qcsapi_calcmd_send_dc_cw_signal_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_u_int (xdrs, &objp->channel)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_calcmd_stop_dc_cw_signal_rpcdata (XDR *xdrs, qcsapi_calcmd_stop_dc_cw_signal_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_calcmd_get_test_mode_antenna_sel_rpcdata (XDR *xdrs, qcsapi_calcmd_get_test_mode_antenna_sel_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->antenna_bit_mask, sizeof (u_int), (xdrproc_t) xdr_u_int)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_calcmd_get_test_mode_mcs_rpcdata (XDR *xdrs, qcsapi_calcmd_get_test_mode_mcs_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->test_mode_mcs, sizeof (u_int), (xdrproc_t) xdr_u_int)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_calcmd_get_test_mode_bw_rpcdata (XDR *xdrs, qcsapi_calcmd_get_test_mode_bw_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->test_mode_bw, sizeof (u_int), (xdrproc_t) xdr_u_int)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_calcmd_get_tx_power_rpcdata (XDR *xdrs, qcsapi_calcmd_get_tx_power_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->tx_power, sizeof (__rpc_qcsapi_calcmd_tx_power_rsp), (xdrproc_t) xdr___rpc_qcsapi_calcmd_tx_power_rsp)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_calcmd_set_tx_power_rpcdata (XDR *xdrs, qcsapi_calcmd_set_tx_power_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_u_int (xdrs, &objp->tx_power)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_calcmd_get_test_mode_rssi_rpcdata (XDR *xdrs, qcsapi_calcmd_get_test_mode_rssi_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->test_mode_rssi, sizeof (__rpc_qcsapi_calcmd_rssi_rsp), (xdrproc_t) xdr___rpc_qcsapi_calcmd_rssi_rsp)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_calcmd_set_mac_filter_rpcdata (XDR *xdrs, qcsapi_calcmd_set_mac_filter_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_int (xdrs, &objp->q_num)) + return FALSE; + if (!xdr_int (xdrs, &objp->sec_enable)) + return FALSE; + if (!xdr___rpc_qcsapi_mac_addr_p (xdrs, &objp->mac_addr)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_calcmd_get_antenna_count_rpcdata (XDR *xdrs, qcsapi_calcmd_get_antenna_count_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->antenna_count, sizeof (u_int), (xdrproc_t) xdr_u_int)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_calcmd_clear_counter_rpcdata (XDR *xdrs, qcsapi_calcmd_clear_counter_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_calcmd_get_info_rpcdata (XDR *xdrs, qcsapi_calcmd_get_info_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->output_info, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wowlan_set_match_type_rpcdata (XDR *xdrs, qcsapi_wowlan_set_match_type_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_uint32_t (xdrs, &objp->wowlan_match)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wowlan_set_L2_type_rpcdata (XDR *xdrs, qcsapi_wowlan_set_L2_type_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_uint32_t (xdrs, &objp->ether_type)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wowlan_set_udp_port_rpcdata (XDR *xdrs, qcsapi_wowlan_set_udp_port_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_uint32_t (xdrs, &objp->udp_port)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wowlan_set_magic_pattern_rpcdata (XDR *xdrs, qcsapi_wowlan_set_magic_pattern_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_uint32_t (xdrs, &objp->len)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->pattern, sizeof (__rpc_qcsapi_data_256bytes), (xdrproc_t) xdr___rpc_qcsapi_data_256bytes)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_wowlan_get_host_state_rpcdata (XDR *xdrs, qcsapi_wifi_wowlan_get_host_state_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->p_value, sizeof (uint16_t), (xdrproc_t) xdr_uint16_t)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->len, sizeof (uint32_t), (xdrproc_t) xdr_uint32_t)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_wowlan_get_match_type_rpcdata (XDR *xdrs, qcsapi_wifi_wowlan_get_match_type_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->p_value, sizeof (uint16_t), (xdrproc_t) xdr_uint16_t)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->len, sizeof (uint32_t), (xdrproc_t) xdr_uint32_t)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_wowlan_get_l2_type_rpcdata (XDR *xdrs, qcsapi_wifi_wowlan_get_l2_type_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->p_value, sizeof (uint16_t), (xdrproc_t) xdr_uint16_t)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->len, sizeof (uint32_t), (xdrproc_t) xdr_uint32_t)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_wowlan_get_udp_port_rpcdata (XDR *xdrs, qcsapi_wifi_wowlan_get_udp_port_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->p_value, sizeof (uint16_t), (xdrproc_t) xdr_uint16_t)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->len, sizeof (uint32_t), (xdrproc_t) xdr_uint32_t)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_wowlan_get_magic_pattern_rpcdata (XDR *xdrs, qcsapi_wifi_wowlan_get_magic_pattern_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->p_value, sizeof (__rpc_qcsapi_data_256bytes), (xdrproc_t) xdr___rpc_qcsapi_data_256bytes)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->len, sizeof (uint32_t), (xdrproc_t) xdr_uint32_t)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_set_enable_mu_rpcdata (XDR *xdrs, qcsapi_wifi_set_enable_mu_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_u_int (xdrs, &objp->mu_enable)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_get_enable_mu_rpcdata (XDR *xdrs, qcsapi_wifi_get_enable_mu_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->mu_enable, sizeof (u_int), (xdrproc_t) xdr_u_int)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_set_mu_use_precode_rpcdata (XDR *xdrs, qcsapi_wifi_set_mu_use_precode_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_u_int (xdrs, &objp->grp)) + return FALSE; + if (!xdr_u_int (xdrs, &objp->prec_enable)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_get_mu_use_precode_rpcdata (XDR *xdrs, qcsapi_wifi_get_mu_use_precode_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_u_int (xdrs, &objp->grp)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->prec_enable, sizeof (u_int), (xdrproc_t) xdr_u_int)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_set_mu_use_eq_rpcdata (XDR *xdrs, qcsapi_wifi_set_mu_use_eq_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_u_int (xdrs, &objp->eq_enable)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_get_mu_use_eq_rpcdata (XDR *xdrs, qcsapi_wifi_get_mu_use_eq_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->meq_enable, sizeof (u_int), (xdrproc_t) xdr_u_int)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_get_mu_groups_rpcdata (XDR *xdrs, qcsapi_wifi_get_mu_groups_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_u_int (xdrs, &objp->size)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->buf, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_enable_tdls_rpcdata (XDR *xdrs, qcsapi_wifi_enable_tdls_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_uint32_t (xdrs, &objp->enable_tdls)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_enable_tdls_over_qhop_rpcdata (XDR *xdrs, qcsapi_wifi_enable_tdls_over_qhop_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_uint32_t (xdrs, &objp->tdls_over_qhop_en)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_get_tdls_status_rpcdata (XDR *xdrs, qcsapi_wifi_get_tdls_status_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->p_tdls_status, sizeof (uint32_t), (xdrproc_t) xdr_uint32_t)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_set_tdls_params_rpcdata (XDR *xdrs, qcsapi_wifi_set_tdls_params_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->type)) + return FALSE; + if (!xdr_int (xdrs, &objp->param_value)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_get_tdls_params_rpcdata (XDR *xdrs, qcsapi_wifi_get_tdls_params_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->type)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->p_value, sizeof (int), (xdrproc_t) xdr_int)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +bool_t +xdr_qcsapi_wifi_tdls_operate_rpcdata (XDR *xdrs, qcsapi_wifi_tdls_operate_rpcdata *objp) +{ + register int32_t *buf; + + if (!xdr_pointer (xdrs, (char **)&objp->ifname, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->operate)) + return FALSE; + if (!xdr_pointer (xdrs, (char **)&objp->mac_addr_str, sizeof (__rpc_string), (xdrproc_t) xdr___rpc_string)) + return FALSE; + if (!xdr_int (xdrs, &objp->cs_interval)) + return FALSE; + if (!xdr_int (xdrs, &objp->return_code)) + return FALSE; + return TRUE; +} + +/* defines for local-only functions */ +#define QCSAPI_GPIO_MONITOR_RESET_DEVICE_REMOTE 2771 diff --git a/package/firmware/quantenna/src/qcsapi_rpc_common/client/find_host_addr.c b/package/firmware/quantenna/src/qcsapi_rpc_common/client/find_host_addr.c new file mode 100644 index 000000000..04eb8c7b7 --- /dev/null +++ b/package/firmware/quantenna/src/qcsapi_rpc_common/client/find_host_addr.c @@ -0,0 +1,157 @@ +/*SH0 +******************************************************************************* +** ** +** Copyright (c) 2009 - 2011 Quantenna Communications Inc ** +** ** +** File : call_qcsapi_local.c ** +** Description : tiny wrapper to invoke call_qcsapi locally, from main() ** +** ** +******************************************************************************* +** ** +** Redistribution and use in source and binary forms, with or without ** +** modification, are permitted provided that the following conditions ** +** are met: ** +** 1. Redistributions of source code must retain the above copyright ** +** notice, this list of conditions and the following disclaimer. ** +** 2. Redistributions in binary form must reproduce the above copyright ** +** notice, this list of conditions and the following disclaimer in the ** +** documentation and/or other materials provided with the distribution. ** +** 3. The name of the author may not be used to endorse or promote products ** +** derived from this software without specific prior written permission. ** +** ** +** Alternatively, this software may be distributed under the terms of the ** +** GNU General Public License ("GPL") version 2, or (at your option) any ** +** later version as published by the Free Software Foundation. ** +** ** +** In the case this software is distributed under the GPL license, ** +** you should have received a copy of the GNU General Public License ** +** along with this software; if not, write to the Free Software ** +** Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ** +** ** +** THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR ** +** IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES** +** OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. ** +** IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, ** +** INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT ** +** NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,** +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ** +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ** +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF ** +** THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ** +** ** +******************************************************************************* +EH0*/ + +#include +#include +#include +#include +#include +#include + +#define QCSAPI_HOST_ENV_VAR "QCSAPI_RPC_TARGET" + +static const char * const cfg_file_paths[] = { + "/mnt/jffs2/rmt_ip.conf", + "/etc/qcsapi_target_ip.conf", + NULL /* last entry must be null */ +}; + +#define MAX_HOSTNAME_SIZE 128 + + +void client_qcsapi_find_host_errmsg(const char *progname) +{ + int i; + fprintf(stderr, "No remote host configured! Remote host config is\n"); + fprintf(stderr, "evaluated in the following order:\n"); + fprintf(stderr, " 1) Command line parameter:\n"); + fprintf(stderr, " %s --host \n", progname); + fprintf(stderr, " 2) Environment variable:\n"); + fprintf(stderr, " export %s=\n", QCSAPI_HOST_ENV_VAR); + fprintf(stderr, " %s \n", progname); + fprintf(stderr, " 3) Configuration files, in order:\n"); + for (i = 0; cfg_file_paths[i]; i++) { + fprintf(stderr, " %s\n", cfg_file_paths[i]); + } +} + +static void trim_trailing_space(char *buf) +{ + int i; + for (i = strlen(buf) - 1; isspace(buf[i]); i--) { + buf[i] = '\0'; + } +} + +static const char *first_nonspace(const char *buf) +{ + while (*buf && isspace(*buf)) { + buf++; + } + return buf; +} + +static const char * client_qcsapi_find_host_read_file(const char * const filename) +{ + static char hostbuf[MAX_HOSTNAME_SIZE]; + const char* host = NULL; + char* fret; + + FILE *file = fopen(filename, "r"); + if (file == NULL) { + /* files may legitimately not exist */ + return NULL; + } + + /* assume the file contains the target host on the first line */ + fret = fgets(hostbuf, MAX_HOSTNAME_SIZE, file); + if (fret || feof(file)) { + trim_trailing_space(hostbuf); + host = first_nonspace(hostbuf); + } else { + fprintf(stderr, "%s: error reading file '%s': %s\n", + __FUNCTION__, filename, strerror(errno)); + } + + fclose(file); + + return host; +} + +const char* client_qcsapi_find_host_addr(int *argc, char ***argv) +{ + int i; + const char *host; + + /* check for command line arguments */ + if (argc && argv && *argc >= 2 && strcmp((*argv)[1], "--host") == 0) { + host = (*argv)[2]; + + /* move program argv[0] */ + (*argv)[2] = (*argv)[0]; + + /* skip over --host args */ + *argc = *argc - 2; + *argv = &(*argv)[2]; + + return host; + } + + /* check for environment variables */ + host = getenv(QCSAPI_HOST_ENV_VAR); + if (host) { + return host; + } + + /* check for config files */ + for (i = 0; cfg_file_paths[i]; i++) { + host = client_qcsapi_find_host_read_file(cfg_file_paths[i]); + if (host) { + return host; + } + } + + return NULL; +} + diff --git a/package/firmware/quantenna/src/qcsapi_rpc_common/client/find_host_addr.h b/package/firmware/quantenna/src/qcsapi_rpc_common/client/find_host_addr.h new file mode 100644 index 000000000..6ca653955 --- /dev/null +++ b/package/firmware/quantenna/src/qcsapi_rpc_common/client/find_host_addr.h @@ -0,0 +1,52 @@ +/*SH0 +******************************************************************************* +** ** +** Copyright (c) 2009 - 2011 Quantenna Communications Inc ** +** ** +** File : call_qcsapi_local.c ** +** Description : tiny wrapper to invoke call_qcsapi locally, from main() ** +** ** +******************************************************************************* +** ** +** Redistribution and use in source and binary forms, with or without ** +** modification, are permitted provided that the following conditions ** +** are met: ** +** 1. Redistributions of source code must retain the above copyright ** +** notice, this list of conditions and the following disclaimer. ** +** 2. Redistributions in binary form must reproduce the above copyright ** +** notice, this list of conditions and the following disclaimer in the ** +** documentation and/or other materials provided with the distribution. ** +** 3. The name of the author may not be used to endorse or promote products ** +** derived from this software without specific prior written permission. ** +** ** +** Alternatively, this software may be distributed under the terms of the ** +** GNU General Public License ("GPL") version 2, or (at your option) any ** +** later version as published by the Free Software Foundation. ** +** ** +** In the case this software is distributed under the GPL license, ** +** you should have received a copy of the GNU General Public License ** +** along with this software; if not, write to the Free Software ** +** Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ** +** ** +** THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR ** +** IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES** +** OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. ** +** IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, ** +** INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT ** +** NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,** +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ** +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ** +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF ** +** THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ** +** ** +******************************************************************************* +EH0*/ + +#ifndef __QCSAPI_FIND_HOST_ADDR_H__ +#define __QCSAPI_FIND_HOST_ADDR_H__ + +extern const char* client_qcsapi_find_host_addr(int *argc, char ***argv); +extern void client_qcsapi_find_host_errmsg(const char *progname); + +#endif /* __QCSAPI_FIND_HOST_ADDR_H__ */ + diff --git a/package/firmware/quantenna/src/qcsapi_rpc_common/client/qftc.c b/package/firmware/quantenna/src/qcsapi_rpc_common/client/qftc.c new file mode 100644 index 000000000..ce01f621e --- /dev/null +++ b/package/firmware/quantenna/src/qcsapi_rpc_common/client/qftc.c @@ -0,0 +1,227 @@ +/* + * Copyright (c) 2015 Quantenna Communications, Inc. + * All rights reserved. + */ +#include +#include +#include +#include +#include +#include +#include +#ifndef _GNU_SOURCE +#include +#endif +#include +#include "qcsapi_rpc_common/common/rpc_raw.h" + +#define QFTC_READ_TIMEOUT_MS (250) +#define QFTC_CONNECT_RET_LIMIT 5 +#define QFTC_RECV_RETRY_LIMIT 4 + +static struct qftc_cfg_t { + struct qftp_raw_ethpkt *send_buf; + struct qftp_raw_ethpkt *recv_buf; + struct qftp_ack_nack_pkt *recv_payload; + struct qftp_data_pkt *send_payload; + struct sockaddr_ll dst_addr; + int if_index; + int sock_fd; + int fd; +} qftc_cfg; + +static void qftc_clean(void) +{ + free(qftc_cfg.send_buf); + free(qftc_cfg.recv_buf); + if (qftc_cfg.fd >= 0) + close(qftc_cfg.fd); + if (qftc_cfg.sock_fd >= 0) + close(qftc_cfg.sock_fd); +} + +static int qftc_init(const char *file_path_name, const char *sif_name, const uint8_t *dmac_addr) +{ + qftc_cfg.sock_fd = -1; + qftc_cfg.send_buf = NULL; + qftc_cfg.recv_buf = NULL; + + qftc_cfg.fd = open(file_path_name, O_RDONLY); + + if (qftc_cfg.fd < 0) { + printf("Failed to open %s file\n", file_path_name); + return -1; + } + + qftc_cfg.sock_fd = socket(AF_PACKET, SOCK_RAW, htons(ETH_P_ALL)); + if (qftc_cfg.sock_fd < 0) + return -1; + + if (qrpc_set_prot_filter(qftc_cfg.sock_fd, QFTP_RAW_SOCK_PROT) < 0) { + return -1; + } + + qftc_cfg.send_buf = malloc(sizeof(*qftc_cfg.send_buf)); + qftc_cfg.recv_buf = malloc(sizeof(*qftc_cfg.recv_buf)); + if (!qftc_cfg.send_buf || !qftc_cfg.recv_buf) { + return -1; + } + qftc_cfg.send_payload = (struct qftp_data_pkt *)&qftc_cfg.send_buf->payload; + qftc_cfg.recv_payload = (struct qftp_ack_nack_pkt *)&qftc_cfg.recv_buf->payload; + + qftc_cfg.if_index = qrpc_clnt_raw_config_dst(qftc_cfg.sock_fd, sif_name, + &qftc_cfg.dst_addr, dmac_addr, + (struct q_raw_ethoui_hdr *) + qftc_cfg.send_buf, + QFTP_RAW_SOCK_PROT); + + if (qftc_cfg.if_index < 0) { + return -1; + } + + return 0; +} + +static uint32_t qftc_compose_connect_cmd(struct qftp_connect_pkt * const connect_payload, + const char *file_path_name) +{ + struct stat file_stat; + + memset(&file_stat, 0, sizeof(file_stat)); + if (!stat(file_path_name, &file_stat) && (file_stat.st_mode & S_IFREG)) { + connect_payload->sub_type = QFTP_FRAME_TYPE_CONNECT; + connect_payload->seq = 0; + connect_payload->image_size = file_stat.st_size; + strcpy(connect_payload->image_name, basename((char *)file_path_name)); + + return (sizeof(struct qftp_connect_pkt) + + strlen(connect_payload->image_name)); + } + + return 0; +} + +static uint32_t qftc_compose_data_cmd(void) +{ + ssize_t read_bytes; + const size_t max_data_len = ETH_FRAME_LEN - QFTP_DATA_PKT_HDR_SIZE; + + read_bytes = read(qftc_cfg.fd, qftc_cfg.send_payload->data, max_data_len); + qftc_cfg.send_payload->sub_type = QFTP_FRAME_TYPE_DATA; + ++qftc_cfg.send_payload->seq; + + return read_bytes; +} + +static int qftc_send_cmd(const uint32_t cmd_size) +{ + ssize_t sent_bytes; + + do { + sent_bytes = sendto(qftc_cfg.sock_fd, qftc_cfg.send_buf, cmd_size, 0, + (struct sockaddr *)&qftc_cfg.dst_addr, + sizeof(qftc_cfg.dst_addr)); + } while (sent_bytes < 0 && errno == EINTR); + + return sent_bytes; +} + +static int qftc_recv_cmd(void) +{ + struct sockaddr_ll lladdr; + socklen_t addrlen = sizeof(lladdr); + ssize_t bytes_recv = -1; + int retry_count = 0; + + memset(&lladdr, 0, sizeof(lladdr)); + do { + if (!qrpc_raw_read_timeout(qftc_cfg.sock_fd, QFTC_READ_TIMEOUT_MS)) { + do { + bytes_recv = recvfrom(qftc_cfg.sock_fd, qftc_cfg.recv_buf, + sizeof(*qftc_cfg.recv_buf), + MSG_DONTWAIT, (struct sockaddr *)&lladdr, + &addrlen); + } while (bytes_recv < 0 && errno == EINTR); + } else if (++retry_count > QFTC_RECV_RETRY_LIMIT) { + break; + } + } while ((lladdr.sll_ifindex != qftc_cfg.if_index) || (lladdr.sll_pkttype != PACKET_HOST)); + + return retry_count > QFTC_RECV_RETRY_LIMIT ? -1 : bytes_recv; +} + +static int qftc_connect(const char *file_path_name) +{ + uint32_t connect_cmd_hdr_size; + ssize_t bytes_recv; + int retry_count = 0; + int op_failed = 0; + + connect_cmd_hdr_size = qftc_compose_connect_cmd((struct qftp_connect_pkt *) + &qftc_cfg.send_buf->payload, + file_path_name); + if (!connect_cmd_hdr_size) { + return -1; + } + connect_cmd_hdr_size += sizeof(struct q_raw_ethoui_hdr); + + do { + /* Sending CONNECT command */ + if (qftc_send_cmd(connect_cmd_hdr_size) < 0) { + op_failed = 1; + break; + } + + /* Waiting for ACK */ + bytes_recv = qftc_recv_cmd(); + if ((bytes_recv >= (ssize_t)QFTP_ACK_NACK_FRAME_LEN) || + (qftc_cfg.recv_payload->sub_type == QFTP_FRAME_TYPE_ACK)) { + break; + } + } while (++retry_count < QFTC_CONNECT_RET_LIMIT); + + if (op_failed || retry_count >= QFTC_CONNECT_RET_LIMIT) + return -1; + + return 0; +} + +int qftc_start(const char *file_path_name, const char *sif_name, const uint8_t *dmac_addr) +{ + ssize_t read_bytes; + int op_failed = 0; + + if (qftc_init(file_path_name, sif_name, dmac_addr) < 0 || + qftc_connect(file_path_name) < 0) { + qftc_clean(); + return -1; + } + + read_bytes = qftc_compose_data_cmd(); + /* Start transmitting image file */ + while (read_bytes > 0) { + /* Sending DATA command */ + if (qftc_send_cmd(QFTP_DATA_PKT_HDR_SIZE + read_bytes) < 0) { + op_failed = 1; + break; + } + + /* Receiving ACK */ + if ((qftc_recv_cmd() < 0) || + (qftc_cfg.send_payload->seq != qftc_cfg.recv_payload->seq) || + (qftc_cfg.recv_payload->sub_type != QFTP_FRAME_TYPE_ACK)) { + op_failed = 1; + break; + } + + read_bytes = qftc_compose_data_cmd(); + } + + qftc_clean(); + + if (op_failed || (read_bytes < 0)) + return -1; + + return 0; +} + diff --git a/package/firmware/quantenna/src/qcsapi_rpc_common/client/qftc.h b/package/firmware/quantenna/src/qcsapi_rpc_common/client/qftc.h new file mode 100644 index 000000000..7a8894968 --- /dev/null +++ b/package/firmware/quantenna/src/qcsapi_rpc_common/client/qftc.h @@ -0,0 +1,8 @@ +/* + * Copyright (c) 2015 Quantenna Communications, Inc. + * All rights reserved. + */ +#ifndef __QCSAPI_QFTC_H__ +#define __QCSAPI_QFTC_H__ +extern int qftc_start(const char *file_path_name, const char *sif_name, const uint8_t *dmac_addr); +#endif diff --git a/package/firmware/quantenna/src/qcsapi_rpc_common/client/rpc_pci_clnt.c b/package/firmware/quantenna/src/qcsapi_rpc_common/client/rpc_pci_clnt.c new file mode 100644 index 000000000..0be7fe91d --- /dev/null +++ b/package/firmware/quantenna/src/qcsapi_rpc_common/client/rpc_pci_clnt.c @@ -0,0 +1,504 @@ +/* + * Copyright (C) 1987, Sun Microsystems, Inc. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials + * provided with the distribution. + * * Neither the name of Sun Microsystems, Inc. nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifndef PCIE_RPC_TYPE + #error "Not configure PCIE_RPC_TYPE" +#else + #if (PCIE_RPC_TYPE != RPC_TYPE_CALL_QCSAPI_PCIE) && (PCIE_RPC_TYPE != RPC_TYPE_QCSAPI_PCIE) + #error "Configuration invalid value for PCIE_RPC_TYPE" + #endif +#endif + +/* + * Private data kept per client handle + */ +struct cu_data { + int cu_sock; + struct sockaddr_nl cu_saddr; + struct sockaddr_nl cu_daddr; + //struct sockaddr_in cu_raddr; + //int cu_rlen; + int cu_slen; + int cu_dlen; + struct timeval cu_wait; + struct timeval cu_total; + struct rpc_err cu_error; + XDR cu_outxdrs; + u_int cu_xdrpos; + u_int cu_sendsz; + u_int cu_recvsz; + char *cu_outbuf; + char *cu_inbuf; + struct nlmsghdr *cu_reqnlh; + struct nlmsghdr *cu_respnlh; +}; + +static CLIENT *_clnt_pci_create(int sock_fd, + struct sockaddr_nl *src, + struct sockaddr_nl *dst, + u_long prog, u_long vers); +/* + * Generic client creation: takes (hostname, program-number, protocol) and + * returns client handle. Default options are set, which the user can + * change using the rpc equivalent of ioctl()'s. + */ +CLIENT *clnt_pci_create(const char *hostname, + u_long prog, u_long vers, const char *proto) +{ + CLIENT *client; + struct sockaddr_nl src_addr, dest_addr; + int sock_fd; + + sock_fd = socket(PF_NETLINK, SOCK_RAW, NETLINK_RPC_PCI_CLNT); + if (sock_fd < 0) + goto err; + + memset(&src_addr, 0, sizeof(src_addr)); + src_addr.nl_family = AF_NETLINK; + src_addr.nl_pid = getpid(); /* self pid */ + + bind(sock_fd, (struct sockaddr *)&src_addr, sizeof(src_addr)); + + memset(&dest_addr, 0, sizeof(dest_addr)); + memset(&dest_addr, 0, sizeof(dest_addr)); + dest_addr.nl_family = AF_NETLINK; + dest_addr.nl_pid = 0; /* For Linux Kernel */ + dest_addr.nl_groups = 0; /* unicast */ + + client = _clnt_pci_create(sock_fd, &src_addr, &dest_addr, prog, vers); + + if (client == NULL) + close(sock_fd); + + return client; + +err: +#if 0 + if (errno) { + struct rpc_createerr *ce = &get_rpc_createerr(); + ce->cf_stat = RPC_SYSTEMERROR; + ce->cf_error.re_errno = error; + return NULL; + } +#endif + return NULL; +} + +extern u_long _create_xid(void); + +/* + * PCI bases client side rpc operations + */ +static enum clnt_stat clnt_pci_call(CLIENT *, u_long, xdrproc_t, caddr_t, + xdrproc_t, caddr_t, struct timeval); +static void clnt_pci_abort(void); +static void clnt_pci_geterr(CLIENT *, struct rpc_err *); +static bool_t clnt_pci_freeres(CLIENT *, xdrproc_t, caddr_t); +static bool_t clnt_pci_control(CLIENT *, int, char *); +static void clnt_pci_destroy(CLIENT *); + +static const struct clnt_ops pci_ops = { + clnt_pci_call, + clnt_pci_abort, + clnt_pci_geterr, + clnt_pci_freeres, + clnt_pci_destroy, + clnt_pci_control +}; + +/* + * Create a UDP based client handle. + * If *sockp<0, *sockp is set to a newly created UPD socket. + * If raddr->sin_port is 0 a binder on the remote machine + * is consulted for the correct port number. + * NB: It is the clients responsibility to close *sockp. + * NB: The rpch->cl_auth is initialized to null authentication. + * Caller may wish to set this something more useful. + * + * wait is the amount of time used between retransmitting a call if + * no response has been heard; retransmission occurs until the actual + * rpc call times out. + * + * sendsz and recvsz are the maximum allowable packet sizes that can be + * sent and received. + */ + +static CLIENT *_clnt_pci_create(int sock_fd, + struct sockaddr_nl *src, + struct sockaddr_nl *dst, + u_long prog, u_long vers) +{ + + struct timeval wait; + CLIENT *cl; + struct cu_data *cu = NULL; + struct rpc_msg call_msg; + struct nlmsghdr *preqnlh, *prespnlh; + struct iovec iov; + struct msghdr msg; + //u_int sendsz, recvsz; + + wait.tv_sec = 5; + wait.tv_usec = 0; + + cl = (CLIENT *) malloc(sizeof(CLIENT)); + //sendsz = ((PCIMSGSIZE + 3) / 4) * 4; + //recvsz = ((PCIMSGSIZE + 3) / 4) * 4; + cu = (struct cu_data *)calloc(1, sizeof(*cu)); + + /* Allocate memory for nlm headers */ + preqnlh = (struct nlmsghdr *)calloc(1, NLMSG_SPACE(PCIMSGSIZE)); + prespnlh = (struct nlmsghdr *)calloc(1, NLMSG_SPACE(PCIMSGSIZE)); + + if (cl == NULL || cu == NULL || preqnlh == NULL || prespnlh == NULL) { + fprintf(stderr, "pci_clnt_create out of memory\n"); + goto fooy; + } + + cl->cl_ops = (struct clnt_ops *)&pci_ops; + cl->cl_private = (caddr_t) cu; + cu->cu_saddr = *src; + cu->cu_daddr = *dst; + cu->cu_slen = sizeof(cu->cu_saddr); + cu->cu_dlen = sizeof(cu->cu_daddr); + cu->cu_wait = wait; + cu->cu_total.tv_sec = -1; + cu->cu_total.tv_usec = -1; + cu->cu_sendsz = PCIMSGSIZE; + cu->cu_recvsz = PCIMSGSIZE; + + // setup req/resp netlink headers + cu->cu_reqnlh = preqnlh; + cu->cu_respnlh = prespnlh; + + memset(preqnlh, 0, NLMSG_SPACE(PCIMSGSIZE)); + preqnlh->nlmsg_len = NLMSG_SPACE(PCIMSGSIZE); + preqnlh->nlmsg_pid = getpid(); + preqnlh->nlmsg_flags = NLM_F_REQUEST; + cu->cu_outbuf = NLMSG_DATA(preqnlh); + + memset(prespnlh, 0, NLMSG_SPACE(PCIMSGSIZE)); + prespnlh->nlmsg_len = NLMSG_SPACE(PCIMSGSIZE); + prespnlh->nlmsg_pid = getpid(); + prespnlh->nlmsg_flags = NLM_F_REQUEST; + cu->cu_inbuf = NLMSG_DATA(prespnlh); + + call_msg.rm_xid = getpid(); //_create_xid (); + call_msg.rm_direction = CALL; + call_msg.rm_call.cb_rpcvers = RPC_MSG_VERSION; + call_msg.rm_call.cb_prog = prog; + call_msg.rm_call.cb_vers = vers; + + xdrmem_create(&(cu->cu_outxdrs), cu->cu_outbuf, PCIMSGSIZE, XDR_ENCODE); + if (!xdr_callhdr(&(cu->cu_outxdrs), &call_msg)) { + goto fooy; + } + cu->cu_xdrpos = XDR_GETPOS(&(cu->cu_outxdrs)); + cu->cu_sock = sock_fd; + cl->cl_auth = authnone_create(); + + // Register the client. May not be necessary. FIXME + preqnlh->nlmsg_len = 0; + preqnlh->nlmsg_type = NETLINK_TYPE_CLNT_REGISTER; + + iov.iov_base = (void *)cu->cu_reqnlh; + iov.iov_len = NLMSG_SPACE(0); + + memset((caddr_t) & msg, 0, sizeof(msg)); + msg.msg_name = (void *)&cu->cu_daddr; + msg.msg_namelen = cu->cu_dlen; + msg.msg_iov = &iov; + msg.msg_iovlen = 1; + + sendmsg(cu->cu_sock, &msg, 0); + return cl; + +fooy: + if (cu) + free((caddr_t) cu); + if (cl) + free((caddr_t) cl); + if (preqnlh) + free((caddr_t) preqnlh); + if (prespnlh) + free((caddr_t) prespnlh); + + return (CLIENT *) NULL; +} + +enum clnt_stat clnt_pci_call(cl, proc, xargs, argsp, xresults, resultsp, + utimeout) +CLIENT *cl; /* client handle */ +u_long proc; /* procedure number */ +xdrproc_t xargs; /* xdr routine for args */ +caddr_t argsp; /* pointer to args */ +xdrproc_t xresults; /* xdr routine for results */ +caddr_t resultsp; /* pointer to results */ +struct timeval utimeout; /* seconds to wait before giving up */ +{ + + struct cu_data *cu = (struct cu_data *)cl->cl_private; + XDR *xdrs; + int outlen = 0; + int inlen; + //socklen_t fromlen; + struct pollfd fd; + int milliseconds = (cu->cu_wait.tv_sec * 1000) + + (cu->cu_wait.tv_usec / 1000); + //struct sockaddr_in from; + struct rpc_msg reply_msg; + XDR reply_xdrs; + struct timeval time_waited; + bool_t ok; + int nrefreshes = 2; /* number of times to refresh cred */ + struct timeval timeout; + //int anyup; /* any network interface up */ + struct iovec iov; + struct msghdr msg; + //int ret; + + //printf("In clnt_pci_call\n"); + + if (cu->cu_total.tv_usec == -1) { + timeout = utimeout; /* use supplied timeout */ + } else { + timeout = cu->cu_total; /* use default timeout */ + } + + time_waited.tv_sec = 0; + time_waited.tv_usec = 0; + +call_again: + xdrs = &(cu->cu_outxdrs); + if (xargs == NULL) + goto get_reply; + xdrs->x_op = XDR_ENCODE; + XDR_SETPOS(xdrs, cu->cu_xdrpos); + + /* + * the transaction is the first thing in the out buffer + */ + (*(uint32_t *) (cu->cu_outbuf))++; + if ((!XDR_PUTLONG(xdrs, (long *)&proc)) || + (!AUTH_MARSHALL(cl->cl_auth, xdrs)) || (!(*xargs) (xdrs, argsp))) + return (cu->cu_error.re_status = RPC_CANTENCODEARGS); + outlen = (int)XDR_GETPOS(xdrs); + + // Set up the netlink msg headers + cu->cu_reqnlh->nlmsg_len = outlen; + iov.iov_base = (void *)cu->cu_reqnlh; + iov.iov_len = NLMSG_SPACE(outlen); + + memset((caddr_t) & msg, 0, sizeof(msg)); + msg.msg_name = (void *)&cu->cu_daddr; + msg.msg_namelen = cu->cu_dlen; + msg.msg_iov = &iov; + msg.msg_iovlen = 1; + + cu->cu_reqnlh->nlmsg_type = NETLINK_TYPE_CLNT_REQUEST; + + assert(outlen <= PCIMSGSIZE); + + //send_again: + //ret = sendmsg(cu->cu_sock, &msg, 0); + sendmsg(cu->cu_sock, &msg, 0); + //perror("sendmsg"); + //fprintf(stderr, "sendmsg data len %d, sent %d\n", outlen, ret ); + + /* + * report error if it could not send. + { + cu->cu_error.re_errno = errno; + return (cu->cu_error.re_status = RPC_CANTSEND); + } + */ + + /* + * Hack to provide rpc-based message passing + */ + if (timeout.tv_sec == 0 && timeout.tv_usec == 0) { + return (cu->cu_error.re_status = RPC_TIMEDOUT); + } + // Set up the netlink msg headers + iov.iov_base = (void *)cu->cu_respnlh; + iov.iov_len = cu->cu_respnlh->nlmsg_len; + msg.msg_name = (void *)&cu->cu_daddr; + msg.msg_namelen = cu->cu_dlen; + msg.msg_iov = &iov; + msg.msg_iovlen = 1; + +get_reply: + /* + * sub-optimal code appears here because we have + * some clock time to spare while the packets are in flight. + * (We assume that this is actually only executed once.) + */ + reply_msg.acpted_rply.ar_verf = _null_auth; + reply_msg.acpted_rply.ar_results.where = resultsp; + reply_msg.acpted_rply.ar_results.proc = xresults; + fd.fd = cu->cu_sock; + fd.events = POLLIN; + for (;;) { + switch (poll(&fd, 1, milliseconds)) { + case 0: + + time_waited.tv_sec += cu->cu_wait.tv_sec; + time_waited.tv_usec += cu->cu_wait.tv_usec; + while (time_waited.tv_usec >= 1000000) { + time_waited.tv_sec++; + time_waited.tv_usec -= 1000000; + } + if ((time_waited.tv_sec < timeout.tv_sec) || + ((time_waited.tv_sec == timeout.tv_sec) && + (time_waited.tv_usec < timeout.tv_usec))) { + //goto send_again; + } + return (cu->cu_error.re_status = RPC_TIMEDOUT); + + /* + * buggy in other cases because time_waited is not being + * updated. + */ + + case -1: + if (errno == EINTR) + continue; + cu->cu_error.re_errno = errno; + return (cu->cu_error.re_status = RPC_CANTRECV); + } + + do { + iov.iov_len = NLMSG_SPACE(PCIMSGSIZE); + inlen = recvmsg(cu->cu_sock, &msg, 0); + } while (inlen < 0 && errno == EINTR); + + if (inlen < 0) { + if (errno == EWOULDBLOCK) + continue; + cu->cu_error.re_errno = errno; + return (cu->cu_error.re_status = RPC_CANTRECV); + } + + if (inlen < NLMSG_HDRLEN) + continue; + + /* see if reply transaction id matches sent id. + Don't do this if we only wait for a replay */ + if (xargs != NULL && (*((u_int32_t *) (cu->cu_inbuf)) + != *((u_int32_t *) (cu->cu_outbuf)))) + continue; + /* we now assume we have the proper reply */ + break; + } + + /* + * now decode and validate the response + */ + xdrmem_create(&reply_xdrs, cu->cu_inbuf, (u_int) inlen, XDR_DECODE); + ok = xdr_replymsg(&reply_xdrs, &reply_msg); + /* XDR_DESTROY(&reply_xdrs); save a few cycles on noop destroy */ + if (ok) { + _seterr_reply(&reply_msg, &(cu->cu_error)); + if (cu->cu_error.re_status == RPC_SUCCESS) { + if (!AUTH_VALIDATE(cl->cl_auth, + &reply_msg.acpted_rply.ar_verf)) { + cu->cu_error.re_status = RPC_AUTHERROR; + cu->cu_error.re_why = AUTH_INVALIDRESP; + } + if (reply_msg.acpted_rply.ar_verf.oa_base != NULL) { + xdrs->x_op = XDR_FREE; + (void)xdr_opaque_auth(xdrs, + &(reply_msg.acpted_rply. + ar_verf)); + } + } /* end successful completion */ + else { + /* maybe our credentials need to be refreshed ... */ + if (nrefreshes > 0 && AUTH_REFRESH(cl->cl_auth)) { + nrefreshes--; + goto call_again; + } + } /* end of unsuccessful completion */ + } /* end of valid reply message */ + else { + cu->cu_error.re_status = RPC_CANTDECODERES; + } + return cu->cu_error.re_status; + + return 0; +} + +void clnt_pci_geterr(CLIENT * cl, struct rpc_err *errp) +{ + +} + +bool_t clnt_pci_freeres(CLIENT * cl, xdrproc_t xdr_res, caddr_t res_ptr) +{ + return 0; +} + +void clnt_pci_abort(void) +{ +} + +bool_t clnt_pci_control(CLIENT * cl, int request, char *info) +{ + return 0; +} + +void clnt_pci_destroy(CLIENT * cl) +{ + struct cu_data *cu = (struct cu_data *)cl->cl_private; + + if (cu->cu_sock >= 0) { + close(cu->cu_sock); + } + XDR_DESTROY(&(cu->cu_outxdrs)); + free((caddr_t) cu->cu_reqnlh); + free((caddr_t) cu->cu_respnlh); + free((caddr_t) cu); + free((caddr_t) cl); +} diff --git a/package/firmware/quantenna/src/qcsapi_rpc_common/client/rpc_raw_clnt.c b/package/firmware/quantenna/src/qcsapi_rpc_common/client/rpc_raw_clnt.c new file mode 100644 index 000000000..47f87167d --- /dev/null +++ b/package/firmware/quantenna/src/qcsapi_rpc_common/client/rpc_raw_clnt.c @@ -0,0 +1,358 @@ +/* + * Copyright (C) 1987, Sun Microsystems, Inc. + * Copyright (C) 2014 Quantenna Communications Inc. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials + * provided with the distribution. + * * Neither the name of Sun Microsystems, Inc. nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define QRPC_CLNT_RAW_POLL_TIMEOUT 5000 + +enum clnt_stat qrpc_clnt_raw_call(CLIENT *cl, u_long proc, xdrproc_t xargs, + caddr_t argsp, xdrproc_t xresults, caddr_t resultsp, struct timeval utimeout); +void qrpc_clnt_raw_abort(void); +void qrpc_clnt_raw_geterr(CLIENT *cl, struct rpc_err *errp); +bool_t qrpc_clnt_raw_freeres(CLIENT *cl, xdrproc_t xdr_res, caddr_t res_ptr); +void qrpc_clnt_raw_destroy(CLIENT *cl); +bool_t qrpc_clnt_raw_control(CLIENT *cl, int request, char *info); + +struct qrpc_clnt_raw_priv { + struct sockaddr_ll dst_addr; + struct rpc_err rpc_error; + XDR xdrs_out; + XDR xdrs_in; + uint8_t *outbuf; + uint8_t *out_pktbuf; + uint8_t *inbuf; + uint8_t *in_pktbuf; + struct qrpc_frame_hdr out_hdr; + uint32_t xdrs_outpos; + int raw_sock; + uint8_t sess_id; +}; + +static const struct clnt_ops qrpc_clnt_raw_ops = { + qrpc_clnt_raw_call, + qrpc_clnt_raw_abort, + qrpc_clnt_raw_geterr, + qrpc_clnt_raw_freeres, + qrpc_clnt_raw_destroy, + qrpc_clnt_raw_control +}; + +static void qrpc_clnt_raw_free_priv(struct qrpc_clnt_raw_priv *const priv) +{ + free(priv->outbuf); + free(priv->out_pktbuf); + free(priv->inbuf); + free(priv->in_pktbuf); + if (priv->raw_sock >= 0) + close(priv->raw_sock); + free(priv); +} + +CLIENT *qrpc_clnt_raw_create(u_long prog, u_long vers, + const char *const srcif_name, const uint8_t * dmac_addr, uint8_t sess_id) +{ + CLIENT *client; + int rawsock_fd; + struct qrpc_clnt_raw_priv *priv; + struct rpc_msg call_msg; + + rawsock_fd = socket(AF_PACKET, SOCK_RAW, htons(ETH_P_ALL)); + if (rawsock_fd < 0) + return NULL; + + if (qrpc_set_prot_filter(rawsock_fd, QRPC_RAW_SOCK_PROT) < 0) { + close(rawsock_fd); + return NULL; + } + + priv = calloc(1, sizeof(*priv)); + if (!priv) { + close(rawsock_fd); + return NULL; + } + + priv->raw_sock = rawsock_fd; + priv->outbuf = calloc(1, QRPC_BUFFER_LEN); + priv->inbuf = calloc(1, QRPC_BUFFER_LEN); + priv->out_pktbuf = calloc(1, ETH_FRAME_LEN); + priv->in_pktbuf = calloc(1, ETH_FRAME_LEN); + if (!priv->outbuf || !priv->inbuf || !priv->out_pktbuf || !priv->in_pktbuf) { + qrpc_clnt_raw_free_priv(priv); + return NULL; + } + + if (qrpc_clnt_raw_config_dst(rawsock_fd, srcif_name, &priv->dst_addr, + dmac_addr, &priv->out_hdr.qhdr, + QRPC_RAW_SOCK_PROT) < 0) { + qrpc_clnt_raw_free_priv(priv); + return NULL; + } + + client = calloc(1, sizeof(*client)); + if (!client) { + qrpc_clnt_raw_free_priv(priv); + return NULL; + } + + client->cl_ops = (struct clnt_ops *)&qrpc_clnt_raw_ops; + client->cl_private = (caddr_t) priv; + client->cl_auth = authnone_create(); + + xdrmem_create(&priv->xdrs_in, (char *)priv->inbuf + sizeof(struct qrpc_frame_hdr), + QRPC_BUFFER_LEN - sizeof(struct qrpc_frame_hdr), XDR_DECODE); + + xdrmem_create(&priv->xdrs_out, (char *)priv->outbuf, + QRPC_BUFFER_LEN, XDR_ENCODE); + call_msg.rm_xid = getpid(); + call_msg.rm_direction = CALL; + call_msg.rm_call.cb_rpcvers = RPC_MSG_VERSION; + call_msg.rm_call.cb_prog = prog; + call_msg.rm_call.cb_vers = vers; + if (!xdr_callhdr(&priv->xdrs_out, &call_msg)) { + qrpc_clnt_raw_free_priv(priv); + free(client); + return NULL; + } + priv->xdrs_outpos = XDR_GETPOS(&(priv->xdrs_out)); + + priv->sess_id = sess_id; + + return client; +} + +static int qrpc_clnt_raw_call_send(struct qrpc_clnt_raw_priv *const priv, const int len) +{ + int ret; + static const uint16_t payload_max = ETH_FRAME_LEN - sizeof(struct qrpc_frame_hdr); + uint16_t pkt_nr; + uint16_t i; + uint16_t payload_done = 0; + struct qrpc_frame_hdr *hdr; + + pkt_nr = (len + payload_max - 1) / payload_max; + + for (i = 0; i < pkt_nr; i++) { + uint16_t payload_len = MIN((uint16_t)len - payload_done, payload_max); + + /* build an EthII frame */ + priv->out_hdr.sub_type = ((i != pkt_nr - 1) ? QRPC_FRAME_TYPE_FRAG + : QRPC_FRAME_TYPE_COMPLETE); + priv->out_hdr.sid = priv->sess_id; + + hdr = (struct qrpc_frame_hdr *)priv->out_pktbuf; + memcpy(hdr, &priv->out_hdr, sizeof(priv->out_hdr)); + memcpy(hdr + 1, priv->outbuf + payload_done, payload_len); + payload_done += payload_len; + + do { + ret = sendto(priv->raw_sock, priv->out_pktbuf, sizeof(struct qrpc_frame_hdr) + payload_len, 0, + (struct sockaddr *)&priv->dst_addr, sizeof(priv->dst_addr)); + } while (ret < 0 && errno == EINTR); + + if ((uint16_t)ret != sizeof(struct qrpc_frame_hdr) + payload_len) { + priv->rpc_error.re_status = RPC_CANTSEND; + return -1; + } + } + + return 0; +} + +static int qrpc_clnt_raw_call_recv(struct qrpc_clnt_raw_priv *const priv) +{ + struct pollfd fds; + struct sockaddr_ll lladdr; + socklen_t addrlen = sizeof(lladdr); + int ret; + uint16_t payload_done = sizeof(struct qrpc_frame_hdr); + struct qrpc_frame_hdr hdr; + + do { + fds.fd = priv->raw_sock; + fds.events = POLLIN; + do { + ret = poll(&fds, 1, QRPC_CLNT_RAW_POLL_TIMEOUT); + } while (ret < 0 && errno == EINTR); + if (!ret) { + priv->rpc_error.re_status = RPC_TIMEDOUT; + return -1; + } + if (ret < 0) { + priv->rpc_error.re_status = RPC_SYSTEMERROR; + return -1; + } + + do { + ret = recvfrom(priv->raw_sock, priv->in_pktbuf, ETH_FRAME_LEN, + 0, (struct sockaddr *)&lladdr, &addrlen); + } while (ret < 0 && errno == EINTR); + + if (lladdr.sll_pkttype != PACKET_HOST) { + priv->rpc_error.re_status = RPC_TIMEDOUT; + return -1; + } + + if ((ret < (int)sizeof(struct qrpc_frame_hdr)) + || (ret - sizeof(struct qrpc_frame_hdr) + payload_done > QRPC_BUFFER_LEN)) { + priv->rpc_error.re_status = RPC_CANTRECV; + return -1; + } + + /* assemble the buffer */ + memcpy(&hdr, priv->in_pktbuf, sizeof(struct qrpc_frame_hdr)); + memcpy(priv->inbuf + payload_done, priv->in_pktbuf + sizeof(struct qrpc_frame_hdr), + ret - sizeof(struct qrpc_frame_hdr)); + + payload_done += (ret - sizeof(struct qrpc_frame_hdr)); + + } while (hdr.sub_type == QRPC_FRAME_TYPE_FRAG); + + memcpy(priv->inbuf, &hdr, sizeof(struct qrpc_frame_hdr)); + + return 0; +} + +enum clnt_stat qrpc_clnt_raw_call(CLIENT *cl, u_long proc, xdrproc_t xargs, caddr_t argsp, + xdrproc_t xresults, caddr_t resultsp, + struct timeval utimeout) +{ + struct qrpc_clnt_raw_priv *priv = (struct qrpc_clnt_raw_priv *)cl->cl_private; + XDR *xdrs_out = &priv->xdrs_out; + XDR *xdrs_in = &priv->xdrs_in; + struct rpc_msg reply_msg; + struct timeval curr_time; + struct qrpc_frame_hdr *hdr; + uint16_t tmp; + + if (xargs) { + xdrs_out->x_op = XDR_ENCODE; + XDR_SETPOS(xdrs_out, priv->xdrs_outpos); + + if ((!XDR_PUTLONG(xdrs_out, (long *)&proc)) || + (!AUTH_MARSHALL(cl->cl_auth, xdrs_out)) || + (!(*xargs) (xdrs_out, argsp))) { + priv->rpc_error.re_status = RPC_CANTENCODEARGS; + return priv->rpc_error.re_status; + } + tmp = ntohs(priv->out_hdr.seq); + priv->out_hdr.seq = htons(tmp + 1); + if (qrpc_clnt_raw_call_send(priv, XDR_GETPOS(xdrs_out)) < 0) { + return priv->rpc_error.re_status; + } + } + + if (gettimeofday(&curr_time, NULL) < 0) { + priv->rpc_error.re_status = RPC_SYSTEMERROR; + return priv->rpc_error.re_status; + } + utimeout.tv_sec += curr_time.tv_sec; + /* Waiting for reply */ + do { + if (qrpc_clnt_raw_call_recv(priv) < 0) { + if (priv->rpc_error.re_status == RPC_TIMEDOUT) + continue; + else + break; + } + + hdr = (struct qrpc_frame_hdr *)priv->inbuf; + if (xargs && priv->out_hdr.seq != hdr->seq) { + continue; + } + + xdrs_in->x_op = XDR_DECODE; + XDR_SETPOS(xdrs_in, 0); + + reply_msg.acpted_rply.ar_verf = _null_auth; + reply_msg.acpted_rply.ar_results.where = resultsp; + reply_msg.acpted_rply.ar_results.proc = xresults; + + if (xdr_replymsg(xdrs_in, &reply_msg)) { + if (reply_msg.rm_xid != (unsigned long)getpid()) { + continue; + } + _seterr_reply(&reply_msg, &priv->rpc_error); + if (priv->rpc_error.re_status == RPC_SUCCESS) { + if (!AUTH_VALIDATE(cl->cl_auth, &reply_msg.acpted_rply.ar_verf)) { + priv->rpc_error.re_status = RPC_AUTHERROR; + priv->rpc_error.re_why = AUTH_INVALIDRESP; + } + break; + } + } else { + priv->rpc_error.re_status = RPC_CANTDECODERES; + } + } while ((gettimeofday(&curr_time, NULL) == 0) && (curr_time.tv_sec < utimeout.tv_sec)); + + return priv->rpc_error.re_status; +} + +void qrpc_clnt_raw_abort(void) +{ +} + +void qrpc_clnt_raw_geterr(CLIENT *cl, struct rpc_err *errp) +{ + struct qrpc_clnt_raw_priv *priv = (struct qrpc_clnt_raw_priv *)cl->cl_private; + + *errp = priv->rpc_error; +} + +bool_t qrpc_clnt_raw_freeres(CLIENT *cl, xdrproc_t xdr_res, caddr_t res_ptr) +{ + return FALSE; +} + +void qrpc_clnt_raw_destroy(CLIENT *cl) +{ + struct qrpc_clnt_raw_priv *priv = (struct qrpc_clnt_raw_priv *)cl->cl_private; + + if (priv) { + XDR_DESTROY(&priv->xdrs_out); + XDR_DESTROY(&priv->xdrs_in); + qrpc_clnt_raw_free_priv(priv); + } + free(cl); +} + +bool_t qrpc_clnt_raw_control(CLIENT *cl, int request, char *info) +{ + return FALSE; +} diff --git a/package/firmware/quantenna/src/qcsapi_rpc_common/common/rpc_pci.h b/package/firmware/quantenna/src/qcsapi_rpc_common/common/rpc_pci.h new file mode 100644 index 000000000..6841b8db1 --- /dev/null +++ b/package/firmware/quantenna/src/qcsapi_rpc_common/common/rpc_pci.h @@ -0,0 +1,14 @@ +#ifndef _PCI_RPC_H +#define _PCI_RPC_H + +#include "rpc_pci_nlm.h" + +extern CLIENT * +clnt_pci_create (const char *hostname, + u_long prog, + u_long vers, + const char *proto); + +extern SVCXPRT *svc_pci_create (int sock); + +#endif diff --git a/package/firmware/quantenna/src/qcsapi_rpc_common/common/rpc_pci_nlm.h b/package/firmware/quantenna/src/qcsapi_rpc_common/common/rpc_pci_nlm.h new file mode 100644 index 000000000..c26cc79de --- /dev/null +++ b/package/firmware/quantenna/src/qcsapi_rpc_common/common/rpc_pci_nlm.h @@ -0,0 +1,26 @@ +#ifndef __PCI_NLM_H__ + +#define __PCI_NLM_H__ + +/* + * We seperate the netlink type for client and server here. + * If the netlink type is conflicted with customers', they just need to modify + * NETLINK_RPC_PCI_CLNT and the type define in the PCIe RC driver and the netlink + * type in the rpc server and PCIe EP driver will not be affected. + */ +#define NETLINK_RPC_PCI_CLNT 31 +#define NETLINK_RPC_PCI_SVC 31 +#define PCIMSGSIZE (64 * 1024 - 1) + +/* + * Nelink Message types. + */ +#define RPC_TYPE_CALL_QCSAPI_PCIE 0x0100 +#define RPC_TYPE_QCSAPI_PCIE 0x0200 + +#define NETLINK_TYPE_SVC_REGISTER (PCIE_RPC_TYPE | 0x0010) +#define NETLINK_TYPE_SVC_RESPONSE (PCIE_RPC_TYPE | 0x0011) +#define NETLINK_TYPE_CLNT_REGISTER (PCIE_RPC_TYPE | 0x0010) +#define NETLINK_TYPE_CLNT_REQUEST (PCIE_RPC_TYPE | 0x0011) + +#endif diff --git a/package/firmware/quantenna/src/qcsapi_rpc_common/common/rpc_raw.c b/package/firmware/quantenna/src/qcsapi_rpc_common/common/rpc_raw.c new file mode 100644 index 000000000..afc40ebd3 --- /dev/null +++ b/package/firmware/quantenna/src/qcsapi_rpc_common/common/rpc_raw.c @@ -0,0 +1,147 @@ +/* + * Copyright (c) 2015 Quantenna Communications, Inc. + * All rights reserved. + */ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +int qrpc_set_prot_filter(const int sock, const short prot) +{ + struct sock_filter filter[] = { + BPF_STMT(BPF_LD + BPF_H + BPF_ABS, ETH_ALEN * 2), /* read packet type id */ + BPF_JUMP(BPF_JMP + BPF_JEQ + BPF_K, + ETH_P_OUI_EXT, 0, 5), /* if OUI Extended Ethertype */ + + BPF_STMT(BPF_LD + BPF_W + BPF_ABS, ETH_HLEN), /* read OUI */ + BPF_JUMP(BPF_JMP + BPF_JEQ + BPF_K, + QUANTENNA_OUI << 8, 0, 3), /* if QUANTENNA OUI */ + + BPF_STMT(BPF_LD + BPF_B + BPF_ABS, ETH_HLEN + 4), /* read protocol */ + BPF_JUMP(BPF_JMP + BPF_JEQ + BPF_K, + prot, 0, 1), /* if matches */ + + BPF_STMT(BPF_RET + BPF_K, ETH_FRAME_LEN), /* accept packet */ + BPF_STMT(BPF_RET + BPF_K, 0) /* else ignore packet */ + }; + struct sock_fprog fp; + + fp.filter = filter; + fp.len = ARRAY_SIZE(filter); + + if (setsockopt(sock, SOL_SOCKET, SO_ATTACH_FILTER, &fp, sizeof(fp)) < 0) { + printf("Cannot set rpc packet filter\n"); + return -1; + } + + return 0; + +} + +int qrpc_clnt_raw_config_dst(const int sock, const char *const srcif_name, + struct sockaddr_ll *dst_addr, + const uint8_t *dmac_addr, + struct q_raw_ethoui_hdr *pkt_outbuf, + uint8_t qprot) +{ + struct ifreq ifreq; + struct ethhdr *const eth_packet = &pkt_outbuf->eth_hdr; + + memset(&ifreq, 0, sizeof(ifreq)); + strncpy(ifreq.ifr_name, srcif_name, IFNAMSIZ - 1); + if (ioctl(sock, SIOCGIFINDEX, &ifreq) < 0) { + printf("%s interface doesn't exist\n", srcif_name); + return -1; + } + + dst_addr->sll_family = AF_PACKET; + dst_addr->sll_protocol = htons(ETH_P_OUI_EXT); + dst_addr->sll_ifindex = ifreq.ifr_ifindex; + dst_addr->sll_halen = ETH_ALEN; + memcpy(dst_addr->sll_addr, dmac_addr, ETH_ALEN); + + memcpy(eth_packet->h_dest, dst_addr->sll_addr, ETH_ALEN); + if (ioctl(sock, SIOCGIFHWADDR, &ifreq) < 0) + return -1; + memcpy(eth_packet->h_source, ifreq.ifr_addr.sa_data, ETH_ALEN); + eth_packet->h_proto = htons(ETH_P_OUI_EXT); + + pkt_outbuf->prot_id[0] = QUANTENNA_OUI >> 16; + pkt_outbuf->prot_id[1] = QUANTENNA_OUI >> 8; + pkt_outbuf->prot_id[2] = QUANTENNA_OUI & 0xFF; + + pkt_outbuf->prot_id[3] = 0; + pkt_outbuf->prot_id[4] = qprot; + + return dst_addr->sll_ifindex; +} + +int qrpc_raw_read_timeout(const int sock_fd, const int timeout) +{ + struct pollfd fds; + int ret; + + fds.fd = sock_fd; + fds.events = POLLIN; + + do { + ret = poll(&fds, 1, timeout); + } while (ret < 0 && errno == EINTR); + + if (ret <= 0) { + return -1; + } + + return 0; +} + +int qrpc_raw_bind(const int sock, const char *const if_name, const int protocol) +{ + struct sockaddr_ll addr; + struct ifreq ifreq; + + memset(&ifreq, 0, sizeof(ifreq)); + strncpy(ifreq.ifr_name, if_name, IFNAMSIZ - 1); + if (ioctl(sock, SIOCGIFINDEX, &ifreq) < 0) + return -1; + + memset(&addr, 0, sizeof(addr)); + addr.sll_family = AF_PACKET; + addr.sll_protocol = htons(protocol); + addr.sll_ifindex = ifreq.ifr_ifindex; + + if (bind(sock, (struct sockaddr *)&addr, sizeof(addr)) < 0) + return -1; + + return 0; +} + +int str_to_mac(const char *txt_mac, uint8_t *mac) +{ + uint32_t mac_buf[ETH_ALEN]; + int ret; + + if (!txt_mac || !mac) + return -1; + + ret = sscanf(txt_mac, "%02x:%02x:%02x:%02x:%02x:%02x", &mac_buf[0], &mac_buf[1], + &mac_buf[2], &mac_buf[3], &mac_buf[4], &mac_buf[5]); + + if (ret != ETH_ALEN) + return -1; + + while (ret) { + mac[ret - 1] = (uint8_t)mac_buf[ret - 1]; + --ret; + } + + return 0; +} + diff --git a/package/firmware/quantenna/src/qcsapi_rpc_common/common/rpc_raw.h b/package/firmware/quantenna/src/qcsapi_rpc_common/common/rpc_raw.h new file mode 100644 index 000000000..a1f11113e --- /dev/null +++ b/package/firmware/quantenna/src/qcsapi_rpc_common/common/rpc_raw.h @@ -0,0 +1,94 @@ +/* + * Copyright (c) 2015 Quantenna Communications, Inc. + * All rights reserved. + */ +#ifndef RPC_RAW_H +#define RPC_RAW_H +#include +#include +#include + +#ifndef ARRAY_SIZE +#define ARRAY_SIZE(a) (sizeof (a) / sizeof ((a)[0])) +#endif + +#define QRPC_RAW_SOCK_PROT 11 +#define QFTP_RAW_SOCK_PROT 22 +#define ETH_P_OUI_EXT 0x88B7 +#define QUANTENNA_OUI 0x002686 + +#define QFTP_DATA_PKT_HDR_SIZE (sizeof(struct q_raw_ethoui_hdr) +\ + sizeof(struct qftp_data_pkt) - 1) +#define QFTP_ACK_NACK_FRAME_LEN (sizeof(struct q_raw_ethoui_hdr) +\ + sizeof(struct qftp_ack_nack_pkt)) + +/* QFT */ +#define QFTP_FRAME_TYPE_NACK 0 +#define QFTP_FRAME_TYPE_ACK 1 +#define QFTP_FRAME_TYPE_CONNECT 2 +#define QFTP_FRAME_TYPE_DATA 3 +/* RPC QCSAPI */ +#define QRPC_FRAME_TYPE_COMPLETE 4 +#define QRPC_FRAME_TYPE_FRAG 5 + +#define QRPC_BUFFER_LEN (16 * 1024) + +#define QRPC_QCSAPI_RPCD_SID 0 +#define QRPC_CALL_QCSAPI_RPCD_SID 1 + +struct q_raw_ethoui_hdr { + struct ethhdr eth_hdr; + uint8_t prot_id[5]; /* Protocol Identifier */ + uint8_t _pad1; +} __attribute__ ((packed)); + +/* QRPC frames */ +struct qrpc_frame_hdr { + struct q_raw_ethoui_hdr qhdr; + uint8_t sub_type; + uint8_t sid; + uint16_t seq; +} __attribute__ ((packed)); + +struct qrpc_raw_ethpkt { + struct qrpc_frame_hdr fhdr; + char payload[ETH_FRAME_LEN - sizeof(struct qrpc_frame_hdr)]; +} __attribute__ ((packed)); + +/* QFTP frame payloads */ +struct qftp_raw_ethpkt { + struct q_raw_ethoui_hdr hdr; + char payload[ETH_FRAME_LEN - sizeof(struct q_raw_ethoui_hdr)]; +} __attribute__ ((packed)); + +struct qftp_connect_pkt { + uint16_t sub_type; + uint16_t seq; + uint32_t image_size; + char image_name[1]; +} __attribute__ ((packed)); + +struct qftp_data_pkt { + uint16_t sub_type; + uint16_t seq; + char data[1]; +} __attribute__ ((packed)); + +struct qftp_ack_nack_pkt { + uint16_t sub_type; + uint16_t seq; +} __attribute__ ((packed)); + +extern CLIENT *qrpc_clnt_raw_create(u_long prog, u_long vers, + const char *const srcif_name, const uint8_t * dmac_addr, uint8_t sess_id); +extern SVCXPRT *qrpc_svc_raw_create(int sock, const char *const bind_interface, uint8_t sess_id); +extern int qrpc_set_prot_filter(const int sock, const short prot); +extern int qrpc_raw_bind(const int sock, const char *const if_name, const int protocol); +extern int str_to_mac(const char *txt_mac, uint8_t * mac); +extern int qrpc_clnt_raw_config_dst(const int sock, const char *const srcif_name, + struct sockaddr_ll *dst_addr, + const uint8_t *dmac_addr, + struct q_raw_ethoui_hdr *pkt_outbuf, + uint8_t qprot); +extern int qrpc_raw_read_timeout(const int sock_fd, const int timeout); +#endif diff --git a/package/firmware/quantenna/src/qcsapi_rpc_sample/c_rpc_qcsapi_sample.c b/package/firmware/quantenna/src/qcsapi_rpc_sample/c_rpc_qcsapi_sample.c new file mode 100755 index 000000000..b7babd007 --- /dev/null +++ b/package/firmware/quantenna/src/qcsapi_rpc_sample/c_rpc_qcsapi_sample.c @@ -0,0 +1,303 @@ +/*SH1 +******************************************************************************* +** ** +** Copyright (c) 2009 - 2011 Quantenna Communications Inc ** +** ** +** File : c_rpc_qcsapi_sample.c ** +** Description : ** +** ** +******************************************************************************* +** ** +** Redistribution and use in source and binary forms, with or without ** +** modification, are permitted provided that the following conditions ** +** are met: ** +** 1. Redistributions of source code must retain the above copyright ** +** notice, this list of conditions and the following disclaimer. ** +** 2. Redistributions in binary form must reproduce the above copyright ** +** notice, this list of conditions and the following disclaimer in the ** +** documentation and/or other materials provided with the distribution. ** +** 3. The name of the author may not be used to endorse or promote products ** +** derived from this software without specific prior written permission. ** +** ** +** Alternatively, this software may be distributed under the terms of the ** +** GNU General Public License ("GPL") version 2, or (at your option) any ** +** later version as published by the Free Software Foundation. ** +** ** +** In the case this software is distributed under the GPL license, ** +** you should have received a copy of the GNU General Public License ** +** along with this software; if not, write to the Free Software ** +** Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ** +** ** +** THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR ** +** IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES** +** OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. ** +** IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, ** +** INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT ** +** NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,** +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ** +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ** +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF ** +** THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ** +** ** +******************************************************************************* +EH1*/ + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "qcsapi_output.h" +#include "../qcsapi_rpc_common/client/find_host_addr.h" + +#include "qcsapi.h" +#include "../qcsapi_rpc/client/qcsapi_rpc_client.h" +#include "./qcsapi_rpc/generated/qcsapi_rpc.h" +#include "qcsapi_driver.h" +#include "call_qcsapi.h" + +#define MAX_RETRY_TIMES 15 +#define WIFINAME "wifi0" + +static int s_c_rpc_use_udp = 0; + +/*============================================================================= +FUNCTION: c_rpc_qcsapi_wps_push_button +DESCRIPTION: Start the WPS by QCSAPI +ARGUMENTS PASSED: +RETURN VALUE: 0:success, other:error +=============================================================================*/ +int c_rpc_qcsapi_wps_push_button() +{ + int ret; + qcsapi_mac_addr bssid; + memset(bssid, 0, MAC_ADDR_SIZE); + ret = qcsapi_wps_enrollee_report_button_press(WIFINAME, bssid); + if (ret < 0) { + printf("Qcsapi qcsapi_wps_enrollee_report_button_press error, return: %d\n", ret); + return -1; + } + printf("WPS push button started\n"); + return 0; +} + +/*============================================================================= +FUNCTION: c_rpc_qcsapi_get_rssi +DESCRIPTION: 1.Check if the association established. + 2.If associtied, get the rssi value by QCSAPI +ARGUMENTS PASSED: +RETURN VALUE: 0:success, other:error +=============================================================================*/ +int c_rpc_qcsapi_get_rssi() +{ + int ret; + int rssi=0; + qcsapi_unsigned_int assoc_cnt; + + //Get the association count + //if assoc_cnt is 0, it means not associated + ret = qcsapi_wifi_get_count_associations(WIFINAME, &assoc_cnt); + if (ret < 0) { + printf("Qcsapi qcsapi_wifi_get_count_associations error, return: %d\n", ret); + return -1; + } + //Has the association + if ( assoc_cnt == 0){ + printf("Device not associated\n"); + } else { + ret = qcsapi_wifi_get_rssi_in_dbm_per_association(WIFINAME, 0, &rssi); + if (ret < 0) { + printf("enrollee report button press return %d\n", ret); + return -1; + } + printf("RSSI: %d dbm\n",rssi); + } + return 0; +} + +/*============================================================================= +FUNCTION: c_rpc_qcsapi_get_ssid +DESCRIPTION: Get the current ssid. + If the device is not associated, the ssid could be empty. +ARGUMENTS PASSED: +RETURN VALUE: 0:success, other:error +=============================================================================*/ +int c_rpc_qcsapi_get_ssid() +{ + int ret; + qcsapi_SSID ssid; + ret = qcsapi_wifi_get_SSID(WIFINAME, ssid); + if (ret < 0) { + printf("Qcsapi qcsapi_wifi_get_SSID error, return: %d\n", ret); + return -1; + } + printf("Current SSID: %s\n",ssid); + return 0; +} + +/*============================================================================= +FUNCTION: c_rpc_qcsapi_start_scan +DESCRIPTION: Start the scan. +ARGUMENTS PASSED: +RETURN VALUE: 0:success, other:error +=============================================================================*/ +int c_rpc_qcsapi_start_scan() +{ + int ret; + ret = qcsapi_wifi_start_scan(WIFINAME); + if (ret < 0) { + printf("Qcsapi qcsapi_wifi_start_scan error, return: %d\n", ret); + return -1; + } + printf("Scan started\n"); + return 0; +} + +/*============================================================================= +FUNCTION: c_rpc_qcsapi_get_ap_properties +DESCRIPTION: Get the scaned AP properties and print. +ARGUMENTS PASSED: +RETURN VALUE: 0:success, other:error +=============================================================================*/ +int c_rpc_qcsapi_get_ap_properties() +{ + int ret,i; + unsigned int ap_count = 0; + qcsapi_ap_properties ap_current; + + //Get the scaned AP count + ret = qcsapi_wifi_get_results_AP_scan(WIFINAME, &ap_count); + if (ret < 0) { + printf("Qcsapi qcsapi_wifi_get_results_AP_scan error, return: %d\n", ret); + return -1; + } + if (ap_count == 0) { + printf("Scaned ap count is 0\n"); + return -1; + } + for (i = 0; i < ap_count; i++) { + ret = qcsapi_wifi_get_properties_AP(WIFINAME, i, &ap_current); + if (ret < 0) { + printf("Qcsapi qcsapi_wifi_get_properties_AP error, return: %d\n", ret); + return -1; + } + printf + ("AP %02d:\tSSID:%30s\tMAC:%02X:%02X:%02X:%02X:%02X:%02X\tSecurity:%d\tRSSI:%02d\tChannel:%02d\tWPS:%d\n", + i, ap_current.ap_name_SSID, ap_current.ap_mac_addr[0], ap_current.ap_mac_addr[1], + ap_current.ap_mac_addr[2], ap_current.ap_mac_addr[3], ap_current.ap_mac_addr[4], + ap_current.ap_mac_addr[5], ap_current.ap_flags, (ap_current.ap_RSSI-90), + ap_current.ap_channel, ap_current.ap_wps); + } + return 0; +} + +/*============================================================================= +FUNCTION: print_help +DESCRIPTION: Print the supported option list +ARGUMENTS PASSED: +RETURN VALUE: +=============================================================================*/ +void print_help() +{ + printf("RPC Qcsapi Sample:\n"); + printf("\t-h: Help\n"); + printf("\t-w: Wps push button\n"); + printf("\t-r: get Rssi\n"); + printf("\t-c: get Current ssid\n"); + printf("\t-s: start Scan\n"); + printf("\t-g: Get ap properties\n"); + printf("\t-u: Use UDP as the transport layer for RPC (default to TCP)\n"); + return; +} + +/*============================================================================= +FUNCTION: process_option +DESCRIPTION: Process all the options with corresponding functions +ARGUMENTS PASSED: int argc, char **argv +RETURN VALUE: +=============================================================================*/ +void process_option(int argc, char **argv) +{ + int c; + + while ((c = getopt(argc, argv, "hwrcsg")) != -1){ + switch (c) { + case 'h': //Help print + print_help(); + break; + case 'w': //WPS push button + c_rpc_qcsapi_wps_push_button(); + break; + case 'r': //get rssi + c_rpc_qcsapi_get_rssi(); + break; + case 'c': //get the current ssid + c_rpc_qcsapi_get_ssid(); + break; + case 's': //start scan + c_rpc_qcsapi_start_scan(); + break; + case 'g': //get the ap properties list + c_rpc_qcsapi_get_ap_properties(); + break; + case 'u': //use UDP as the transport. Default is TCP + s_c_rpc_use_udp = 1; + break; + default: + print_help(); + break; + } + } +} + +int main(int argc, char **argv) +{ + int retry = 0; + const char *host; + CLIENT *clnt; + + /* print help if no arguments */ + if (argc == 1) { + print_help(); + exit(1); + } + + /* setup RPC based on udp protocol */ + while (retry++ < MAX_RETRY_TIMES) { + + host = client_qcsapi_find_host_addr(&argc, &argv); + if (!host) { + client_qcsapi_find_host_errmsg(argv[0]); + sleep(1); + continue; + } + + if (!s_c_rpc_use_udp) { + clnt = clnt_create(host, QCSAPI_PROG, QCSAPI_VERS, "tcp"); + } else { + clnt = clnt_create(host, QCSAPI_PROG, QCSAPI_VERS, "udp"); + } + if (clnt == NULL) { + clnt_pcreateerror(host); + sleep(1); + continue; + } else { + client_qcsapi_set_rpcclient(clnt); + break; + } + } + + /* could not find host or create a client, exit */ + if (retry >= MAX_RETRY_TIMES) + exit(1); + + process_option(argc, argv); + + clnt_destroy(clnt); + + return 0; +} diff --git a/package/firmware/quantenna/src/qcsapi_sem.c b/package/firmware/quantenna/src/qcsapi_sem.c new file mode 100644 index 000000000..c7a7e164e --- /dev/null +++ b/package/firmware/quantenna/src/qcsapi_sem.c @@ -0,0 +1,160 @@ +/*SH0 +******************************************************************************* +** ** +** Copyright (c) 2009 - 2012 Quantenna Communications, Inc. ** +** ** +** File : qcsapi_sem.c ** +** Description : Locking mechanism for QCSAPI ** +** ** +******************************************************************************* +** ** +** Redistribution and use in source and binary forms, with or without ** +** modification, are permitted provided that the following conditions ** +** are met: ** +** 1. Redistributions of source code must retain the above copyright ** +** notice, this list of conditions and the following disclaimer. ** +** 2. Redistributions in binary form must reproduce the above copyright ** +** notice, this list of conditions and the following disclaimer in the ** +** documentation and/or other materials provided with the distribution. ** +** 3. The name of the author may not be used to endorse or promote products ** +** derived from this software without specific prior written permission. ** +** ** +** Alternatively, this software may be distributed under the terms of the ** +** GNU General Public License ("GPL") version 2, or (at your option) any ** +** later version as published by the Free Software Foundation. ** +** ** +** In the case this software is distributed under the GPL license, ** +** you should have received a copy of the GNU General Public License ** +** along with this software; if not, write to the Free Software ** +** Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ** +** ** +** THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR ** +** IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES** +** OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. ** +** IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, ** +** INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT ** +** NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,** +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ** +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ** +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF ** +** THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ** +** ** +******************************************************************************* +EH0*/ + +#include +#include +#include +#include + +#include + +#include "qcsapi.h" + +/* Existing path used to generate key for System V semaphore */ +#define LOCK_PATH "/lib/libqcsapi.so" + +/* The maximum times waiting initialization of semaphore */ +#define MAX_TRIES 10 + +union semun { + int val; /* value for SETVAL */ + struct semid_ds *buf; /* buffer for IPC_STAT & IPC_SET */ + unsigned short *array; /* array for GETALL & SETALL */ +}; + +/* + * postop is used to perform V operation on semaphore + * waitop is used to perform P operation on semaphore + */ +static struct sembuf postop, waitop; +static int semid, init_flag; + +static int sem_enable = 1; + +int +qcsapi_sem_init(void) +{ + struct semid_ds seminfo; + union semun arg; + int oflag, i; + + if (sem_enable == 0) + return 0; + + oflag = IPC_CREAT | IPC_EXCL | S_IRUSR | S_IWUSR; + + /* Init semop() structures: postop and waitop */ + postop.sem_num = 0; + postop.sem_op = 1; + postop.sem_flg = SEM_UNDO; + + waitop.sem_num = 0; + waitop.sem_op = -1; + waitop.sem_flg = SEM_UNDO; + + /* Create a new System V semaphore or open a existing semaphore */ + if ((semid = semget(ftok(LOCK_PATH, 0), 1, oflag)) >= 0) { + arg.val = 1; + semctl(semid, 0, SETVAL, arg); + + /* + * A pair of semops make sem_otime non-zero so that other processes + * can judge that the semaphore has been initialized + */ + semop(semid, &waitop, 1); + semop(semid, &postop, 1); + + } else if (errno == EEXIST) { + + /* + * The semaphore has been created; wait until it's initialized. + * Once initialized, field sem_otime is non-zero. + */ + oflag = S_IRUSR | S_IWUSR; + semid = semget(ftok(LOCK_PATH, 0), 1, oflag); + + arg.buf = &seminfo; + for (i = 0; i < MAX_TRIES; i++) { + semctl(semid, 0, IPC_STAT, arg); + if (arg.buf->sem_otime != 0) + break; + + sleep(1); + } + + if (i == MAX_TRIES) + return -qcsapi_sem_error; + + } else { + return -errno; + } + + init_flag = 1; + + return 0; +} + +void qcsapi_sem_disable(void) +{ + sem_enable = 0; +} + +void +qcsapi_sem_lock(void) +{ + if (sem_enable == 1) { + if (init_flag == 0) + qcsapi_sem_init(); + + if (init_flag == 1) + semop(semid, &waitop, 1); + } +} + +void +qcsapi_sem_unlock(void) +{ + if (sem_enable == 1 && init_flag == 1) + semop(semid, &postop, 1); +} diff --git a/package/firmware/quantenna/src/qcsapi_sem.h b/package/firmware/quantenna/src/qcsapi_sem.h new file mode 100644 index 000000000..02713cdce --- /dev/null +++ b/package/firmware/quantenna/src/qcsapi_sem.h @@ -0,0 +1,67 @@ +/*SH1 +******************************************************************************* +** ** +** Copyright (c) 2009 - 2012 Quantenna Communications, Inc. ** +** ** +** File : qcsapi_sem.h ** +** Description : Locking for QCSAPI ** +** ** +******************************************************************************* +** ** +** Redistribution and use in source and binary forms, with or without ** +** modification, are permitted provided that the following conditions ** +** are met: ** +** 1. Redistributions of source code must retain the above copyright ** +** notice, this list of conditions and the following disclaimer. ** +** 2. Redistributions in binary form must reproduce the above copyright ** +** notice, this list of conditions and the following disclaimer in the ** +** documentation and/or other materials provided with the distribution. ** +** 3. The name of the author may not be used to endorse or promote products ** +** derived from this software without specific prior written permission. ** +** ** +** Alternatively, this software may be distributed under the terms of the ** +** GNU General Public License ("GPL") version 2, or (at your option) any ** +** later version as published by the Free Software Foundation. ** +** ** +** In the case this software is distributed under the GPL license, ** +** you should have received a copy of the GNU General Public License ** +** along with this software; if not, write to the Free Software ** +** Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ** +** ** +** THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR ** +** IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES** +** OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. ** +** IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, ** +** INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT ** +** NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,** +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ** +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ** +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF ** +** THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ** +** ** +******************************************************************************* +EH1*/ + + +#ifndef _QCSAPI_SEM_H +#define _QCSAPI_SEM_H + +#define enter_qcsapi() qcsapi_sem_lock() +#define leave_qcsapi() qcsapi_sem_unlock() + +#ifdef __cplusplus +extern "C" { +#endif + +extern int qcsapi_sem_init(void); + +extern void qcsapi_sem_disable(void); + +extern void qcsapi_sem_lock(void); +extern void qcsapi_sem_unlock(void); + +#ifdef __cplusplus +} +#endif + +#endif /* _QCSAPI_SEM_H */ diff --git a/package/firmware/quantenna/src/qcsapi_util.c b/package/firmware/quantenna/src/qcsapi_util.c new file mode 100644 index 000000000..4445d3314 --- /dev/null +++ b/package/firmware/quantenna/src/qcsapi_util.c @@ -0,0 +1,148 @@ +/*SH0 +******************************************************************************* +** ** +** Copyright (c) 2015 Quantenna Communications, Inc. ** +** ** +** File : qcsapi_util.h ** +** Description : utility functions to be used by qcsapi_* and call_qcsapi ** +** ** +******************************************************************************* +** ** +** Redistribution and use in source and binary forms, with or without ** +** modification, are permitted provided that the following conditions ** +** are met: ** +** 1. Redistributions of source code must retain the above copyright ** +** notice, this list of conditions and the following disclaimer. ** +** 2. Redistributions in binary form must reproduce the above copyright ** +** notice, this list of conditions and the following disclaimer in the ** +** documentation and/or other materials provided with the distribution. ** +** 3. The name of the author may not be used to endorse or promote products ** +** derived from this software without specific prior written permission. ** +** ** +** Alternatively, this software may be distributed under the terms of the ** +** GNU General Public License ("GPL") version 2, or (at your option) any ** +** later version as published by the Free Software Foundation. ** +** ** +** In the case this software is distributed under the GPL license, ** +** you should have received a copy of the GNU General Public License ** +** along with this software; if not, write to the Free Software ** +** Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ** +** ** +** THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR ** +** IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES** +** OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. ** +** IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, ** +** INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT ** +** NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,** +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ** +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ** +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF ** +** THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ** +** ** +******************************************************************************* +EH0*/ + +#include +#include +#include +#include +#include + +#include "qcsapi_util.h" + +/* + * verify function return negative value when the parameter_value is not valid + */ +int qcsapi_verify_numeric(const char *parameter_value) +{ + while (*parameter_value != '\0') { + if (!isdigit(*parameter_value)) + return -1; + parameter_value++; + } + return 0; +} + +/* + * Conversion from string to unsigned integer. + * Handles invalid strings and integer overflows. + * return: + * 0 - on success + * -1 - on error + */ +int qcsapi_str_to_uint32(const char *str, uint32_t *result) +{ + char *endptr = NULL; + uint32_t res; + + while (isspace(*str)) { + str++; + } + + if (!isdigit(*str)) { + return -1; + } + + errno = 0; + res = strtoul(str, &endptr, 10); + if (errno != 0) { + return -1; + } + + if (!endptr || endptr == str) { + return -1; + } + + while (isspace(*endptr)) { + endptr++; + } + + if (*endptr != '\0') { + return -1; + } + + *result = res; + return 0; +} + +#define QCSAPI_MAX_ETHER_STRING 17 + +int parse_mac_addr(const char *mac_addr_as_str, qcsapi_mac_addr mac_addr) +{ + int i; + int mac_len = strnlen(mac_addr_as_str, QCSAPI_MAX_ETHER_STRING + 1); + unsigned int tmp[sizeof(qcsapi_mac_addr)]; + int retval; + + if (mac_addr_as_str == NULL) + return -qcsapi_invalid_mac_addr; + + if (mac_len > QCSAPI_MAX_ETHER_STRING) { + return -qcsapi_invalid_mac_addr; + } + + for (i = 0; i < mac_len; i++) { + if (!(isxdigit(mac_addr_as_str[i]) || (mac_addr_as_str[i] == ':'))) + return -qcsapi_invalid_mac_addr; + } + + retval = sscanf(mac_addr_as_str, "%x:%x:%x:%x:%x:%x", + &tmp[0], &tmp[1], &tmp[2], &tmp[3], &tmp[4], &tmp[5]); + if (retval != sizeof(qcsapi_mac_addr)) + return -qcsapi_invalid_mac_addr; + + for (i = 0; i < sizeof(qcsapi_mac_addr); i++) { + if (tmp[i] > 0xff) + return -qcsapi_invalid_mac_addr; + } + + mac_addr[0] = (uint8_t) tmp[0]; + mac_addr[1] = (uint8_t) tmp[1]; + mac_addr[2] = (uint8_t) tmp[2]; + mac_addr[3] = (uint8_t) tmp[3]; + mac_addr[4] = (uint8_t) tmp[4]; + mac_addr[5] = (uint8_t) tmp[5]; + + return 0; +} + diff --git a/package/firmware/quantenna/src/qcsapi_util.h b/package/firmware/quantenna/src/qcsapi_util.h new file mode 100644 index 000000000..f4f346326 --- /dev/null +++ b/package/firmware/quantenna/src/qcsapi_util.h @@ -0,0 +1,50 @@ +/*SH0 +******************************************************************************* +** ** +** Copyright (c) 2015 Quantenna Communications, Inc. ** +** ** +** File : qcsapi_util.h ** +** Description : utility functions to be used by qcsapi_* and call_qcsapi ** +** ** +******************************************************************************* +** ** +** Redistribution and use in source and binary forms, with or without ** +** modification, are permitted provided that the following conditions ** +** are met: ** +** 1. Redistributions of source code must retain the above copyright ** +** notice, this list of conditions and the following disclaimer. ** +** 2. Redistributions in binary form must reproduce the above copyright ** +** notice, this list of conditions and the following disclaimer in the ** +** documentation and/or other materials provided with the distribution. ** +** 3. The name of the author may not be used to endorse or promote products ** +** derived from this software without specific prior written permission. ** +** ** +** Alternatively, this software may be distributed under the terms of the ** +** GNU General Public License ("GPL") version 2, or (at your option) any ** +** later version as published by the Free Software Foundation. ** +** ** +** In the case this software is distributed under the GPL license, ** +** you should have received a copy of the GNU General Public License ** +** along with this software; if not, write to the Free Software ** +** Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ** +** ** +** THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR ** +** IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES** +** OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. ** +** IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, ** +** INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT ** +** NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,** +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ** +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ** +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF ** +** THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ** +** ** +******************************************************************************* +EH0*/ + +#include +#include + +int qcsapi_verify_numeric(const char *parameter_value); +int qcsapi_str_to_uint32(const char *str, uint32_t *result); +int parse_mac_addr(const char *mac_addr_as_str, qcsapi_mac_addr mac_addr); diff --git a/package/firmware/quantenna/src/qtn/lhost_muc_comm.h b/package/firmware/quantenna/src/qtn/lhost_muc_comm.h new file mode 100644 index 000000000..eea6ddd0d --- /dev/null +++ b/package/firmware/quantenna/src/qtn/lhost_muc_comm.h @@ -0,0 +1,976 @@ +/* + * Copyright (c) 2011 Quantenna Communications, Inc. + */ + +/* + * This file contains host definitions which are common between the + * host driver and the microcontroller/MAC code. + */ +#ifndef _LHOST_MUC_COMM_H +#define _LHOST_MUC_COMM_H + +#include "qtn_uc_comm.h" +#include "qtn_cca.h" +#include "qtn_wmm_ac.h" +#include "net80211/ieee80211.h" +#include "net80211/ieee80211_crypto.h" +#include "muc_txrx_stats.h" +#include "qtn/qvsp_common.h" +#include "qtn/shared_defs.h" + +/* packed definitions for each compiler */ +#if defined(MUC_BUILD) || defined(DSP_BUILD) || defined(AUC_BUILD) +# define PACKED __packed +# define LM(a,b) (b) +# define lhost_volatile +# define muc_volatile volatile +#else +# define PACKED __attribute__ ((packed)) +# define LM(a,b) (a) +# define lhost_volatile volatile +# define muc_volatile +#endif // #if defined(MUC_BUILD) || defined(DSP_BUILD) || defined(AUC_BUILD) + +#define HOST_TXD_NUMSEG 2 + +#define QTN_BBIC_11N 0x30 +#define QTN_BBIC_11AC 0x40 + +#define QTN_VSP_STATS_TID_NUM 4 + +#define QTN_VSP_TIDS { 6, 5, 0, 1 } +#define QTN_VSP_STATS_TID2IDX {0, 1, -1, -1, -1, 2, 3, -1} /* make sure no tids using same index */ + +struct qtn_vsp_per_node_stats { + struct qtn_per_tid_stats per_tid_stats[QTN_VSP_STATS_TID_NUM]; +}; + +struct qtn_vsp_stats { +#define QVSP_FAT_MAX 1000 +#define QVSP_FAT_NONE ((uint32_t)(-1)) + uint32_t fat; /* free airtime */ + uint32_t intf_ms; /* interference */ +#if TOPAZ_QTM + struct qtn_vsp_per_node_stats per_node_stats[QTN_NCIDX_MAX]; +#endif +}; + +/** + * \brief This enumeration represents the mode in use on the device. + * + * This enumeration is used to set the correct bandwidth. + */ + +enum { + QTN_11NAC_DISABLE = 0, + QTN_11NAC_ENABLE = 1, +}; + +/* Host tx descriptor */ +struct host_txdesc { + uint32_t hd_version:8; /* Descriptor version */ + uint32_t hd_tid:4; /* packet tid */ + uint32_t hd_txstatus:2; /* Transmit status: 1 sent to MuC, 2 tx success */ +#define QTN_TXSTATUS_TX_ON_MUC 1 +#define QTN_TXSTATUS_TX_SUCCESS 2 + uint32_t hd_wmmac:2; /* Reserved for WMM AC*/ + uint32_t hd_pktlen:16; /* Pkt len (incl. all headers) */ + uint32_t hd_node_idx; /* local node index */ + uint16_t hd_seglen[HOST_TXD_NUMSEG]; /* Segment lenghts */ + uint32_t hd_segaddr[HOST_TXD_NUMSEG]; /* Phys addr of each seg */ + uint32_t hd_ts; /* Timestamp of the pkt */ + uint32_t hd_nextpa; /* Phys addr of next host tx descr in fwd dir */ + uint32_t hd_nextpa_rev; /* Phys addr of next host tx descr in rev dir */ + void *hd_nextva_rev; /* Virtual addr (LHOST view) of next host tx descr in rev dir */ + uint32_t hd_pa; /* Physical addr of this host tx descr */ + void *hd_va; /* Virtual addr (LHOST view) of this host tx descr */ + uint32_t hd_status; /* Status of HTxD */ + void (*hd_muc_txdone_cb)(void *, uint32_t, uint32_t); /* MuC callback after txdone */ + uint32_t hd_muc_cb_arg1; /* parameter for hd_muc_txdone_cb */ + uint32_t hd_muc_cb_arg2; /* parameter for hd_muc_txdone_cb */ + uint32_t hd_txtsf; /* record the tsf_lo on that frame was sent successfully */ + uint8_t hd_mpdu[128]; + uint8_t hd_msdu[128]; + uint8_t hd_dma[128]; +#define HTXD_FLAG_AMSDU_DEST_CAPABLE 0x00000002 /* Can be used for AMSDU destination (append to) */ +#define HTXD_FLAG_AMSDU_SRC_CAPABLE 0x00000004 /* Can be used for AMSDU (copy from) */ +#define HTXD_FLAG_NO_UPDATE_NAV 0x00000008 /* Don't update NAV for this frame */ +#define HTXD_FLAG_NO_RETRY 0x00000010 /* Don't retry this frame if tx failed */ +#define HTXD_FLAG_NO_RETURN 0x00000020 /* Don't return txdesc from MuC to lhost */ +#define HTXD_FLAG_IMM_RETURN 0x00000040 /* Immediately return txdesc from Muc to lhost */ + uint32_t hd_flags; +}; + +#define QTN_AMSDU_DEST_CAPABLE_SIZE ETHER_MAX_LEN +#define QTN_AMSDU_DEST_CAPABLE_GUARD_SIZE 64 +#define QTN_AMSDU_SRC_FRAME_SIZE (QTN_AMSDU_DEST_CAPABLE_SIZE / 10) +#define QTN_AMSDU_DEST_CAPABLE_OCCUPY_SIZE (QTN_AMSDU_DEST_CAPABLE_SIZE / 3 * 2) + +#define HTXD_FLAG_SET(_htxd, _flag) \ + (((struct host_txdesc *)(_htxd))->hd_flags |= (_flag)) +#define HTXD_FLAG_CLR(_htxd, _flag) \ + (((struct host_txdesc *)(_htxd))->hd_flags &= ~(_flag)) +#define HTXD_FLAG_GET(_htxd, _flag) \ + (((struct host_txdesc *)(_htxd))->hd_flags & (_flag)) +#define HTXD_FLAG_ISSET(_htxd, _flag) \ + (!!(((struct host_txdesc *)(_htxd))->hd_flags & (_flag))) +#define HTXD_FLAG_KEEP_ONLY(_htxd, _flag) \ + (((struct host_txdesc *)(_htxd))->hd_flags &= (_flag)) + + +/* host_ioctl_hifinfo */ + +#define NAMESIZE 16 +#define VERSION_SIZE 16 +#define MAC_ADDR_LEN 6 +#define MAC_STR_BUF_SIZE 18 + +#define HOST_NUM_IOCTLQ 1 /* Number of ioctl q's */ +/* + * LHost -> MuC TX queues are per node to allow variable backpressure per node. + * One universal management data frame tx mailbox, and one ioctl mailbox + */ +#define HOST_NUM_MGMTQ 1 +#define HOST_NUM_DATAQ (QTN_NCIDX_MAX) +#define HOST_NUM_DATASEM 1 + +#define HOST_IOCTL_INDEX_BASE 0 +#define HOST_MGMT_INDEX_BASE (HOST_IOCTL_INDEX_BASE + HOST_NUM_IOCTLQ) +#define HOST_DATA_INDEX_BASE (HOST_MGMT_INDEX_BASE + HOST_NUM_MGMTQ) +#define HOST_NUM_HOSTIFQ (HOST_NUM_DATAQ + HOST_NUM_IOCTLQ + HOST_NUM_MGMTQ) +#define HOST_MBOX_SIZE (sizeof(uint32_t) * HOST_NUM_HOSTIFQ) + +#define QTN_PHY_RATE_PROP_SCALE 1024 +#define QTN_MUC_NODE_PKT_LIMIT_MIN 16 +#define QTN_MUC_NODE_PKT_LIMIT_DEFAULT 64 +#define QTN_MUC_NODE_PKT_LIMIT_MAX 128 + +#define IEEE80211_TXPOW_ENCODE(x) ((255 * 65536) + (x * 256) + 1) +#define IEEE80211_TXPOW_DECODE(x) (((x) - (255 * 65536) - 1) / 256) +#define RF_MIXER_VAL_HI 0x1 +#define RF_MIXER_VAL_LO 0x7 +#define RF_PGA_VAL_HI 0x3 +#define RF_PGA_VAL_LO 0x0 +#define IEEE80211_LOWGAIN_TXPOW_MAX 10 +#define IEEE80211_LOWGAIN_TXPOW_MIN 9 + +#define IEEE80211_CHAN_SEC_SHIFT 4 + +struct host_ioctl_hifinfo { + uint32_t hi_mboxstart; /* Start address for mbox */ + uint32_t hi_rxdoneirq; /* IRQ map for rx done */ + uint32_t hi_txdoneirq; /* IRQ map for tx done */ + uint32_t hi_rxfifo; /* Rx FIFO location */ + uint32_t hi_scanirq; /* IRQ map for Scan */ + uint32_t hi_scanfifo; /* Scan FIFO location */ + uint32_t hi_dspgpios; + uint32_t hi_vsp_stats_phys; + uint32_t hi_vapnode_idx; /* node_idx of the vap node for tx */ + uint8_t hi_vapid; + char hi_name[NAMESIZE]; /* Device name */ + char hi_version[VERSION_SIZE]; /* basic firmware version */ + char hi_algover[VERSION_SIZE]; /* calibration algorithm version */ + uint8_t hi_macaddr[MAC_ADDR_LEN]; + uint8_t hi_semmap[HOST_NUM_HOSTIFQ]; /* Mapping of semaphores */ +}; + +typedef int (*scan_done_fn)(int sc_devid, void *chan, int type, int status); + +struct host_scandesc { + uint8_t sd_type; + uint8_t sd_devid; + uint8_t status; + uint8_t ____pad; + uint8_t* sd_data; + scan_done_fn *sd_ppfn; + struct host_scandesc *sd_next; +}; + +struct host_rxdesc { + uint8_t hw_desc[128]; /* need to be aligned on 8 bytes */ + uint8_t *skbuff; + uint8_t *rd_buffer; + uint32_t rs_statword; + struct host_rxdesc *rd_next; + struct host_rxdesc *rd_pa; + struct host_rxdesc *rd_va; + void *node; /* Where the frame was from */ + uint32_t rx_status_word0; + uint32_t rx_status_qosctrl; + uint32_t rx_status_pnlo; + uint32_t rx_status_pnhi; + uint8_t gain_db; +}; + +struct host_descfifo { + struct host_rxdesc *df_fifo; /* Pointer to first descriptor in linked list */ + volatile uint32_t df_numelems; /* Num elems on fifo */ + volatile uint32_t df_size; /* Size of fifo */ + struct host_rxdesc * volatile hrdstart; /* the ptr to the host_rxdesc linked list ready for indication */ +}; + +struct host_scanfifo { + uint32_t sf_req; /* Pointer to request mailbox */ + uint32_t sf_res; /* Pointer to result mailbox */ + uint8_t sf_sem; /* Semaphore for Scan fifo */ + uint8_t tx_sem; /* Semaphore for Scan fifo */ + uint8_t ____pad[2]; +}; + +struct host_rxfifo { + struct host_descfifo *rf_fifo; /* Data Descriptor fifo */ + uint8_t rf_sem; /* Semaphore for rx fifo */ + uint8_t ____pad[3]; +}; + +struct host_ndp_mesg { + uint8_t macaddr_ta[6]; + uint8_t bw; + uint8_t rxgain; + uint8_t mcs; + uint8_t ____pad[3]; +}; + + +struct host_ioctl { + lhost_volatile uint32_t ioctl_dev; /* Device to run IOCTL on */ + lhost_volatile uint32_t ioctl_command; /* Command type */ + lhost_volatile uint32_t ioctl_arg1; /* Single valued arg 1 */ + lhost_volatile uint32_t ioctl_arg2; /* Single valued arg 2 */ + volatile uint32_t ioctl_argp; /* Argument payload pointer */ + volatile uint32_t ioctl_status; /* Status from other side */ + volatile uint32_t ioctl_rc; /* Command return code */ + lhost_volatile struct host_ioctl *ioctl_next; /* link to next msg in chain */ +}; + +struct qtn_vap_args { + char vap_name[17]; + uint8_t vap_id; + uint8_t vap_macaddr[IEEE80211_ADDR_LEN]; +}; + +struct qtn_setparams_args +{ + int ni_param; + int ni_value; + int ni_len; + unsigned char ni_data[64]; +}; + +struct qtn_baparams_args { + unsigned char ni_addr[8]; + enum ieee80211_ba_state state; + int tid; + int type; + int start_seq_num; + int window_size; + int lifetime; + uint16_t flags; +}; + +#define QTN_HLINK_RC_DONE 0x00000001 +#define QTN_HLINK_RC_ERR 0x00000002 +#define QTN_HLINK_STATUS_AVAIL 1 + +#define IOCTL_DEV_VAPCREATE 4 /* Create a vap */ +#define IOCTL_DEV_DEVOPEN 5 /* Bring the device up */ +#define IOCTL_DEV_BEACON_START 6 /* Start Beacon */ +#define IOCTL_DEV_NEWASSOC 7 /* New associated node */ +#define IOCTL_DEV_NEWBSSID 8 /* New associated node */ +#define IOCTL_DEV_SEND_NDP_ANNOUNCEMENT 10 /* Send NDP announcement */ +#define IOCTL_DEV_SETPARAMS 11 /* Configure Parameters */ +#define IOCTL_DEV_GETPARAMS 12 /* Configure Parameters */ +#define IOCTL_DEV_BA_ADDED_TX 13 +#define IOCTL_DEV_BA_ADDED_RX 14 +#define IOCTL_DEV_BA_REMOVED_TX 15 +#define IOCTL_DEV_BA_REMOVED_RX 16 +#define IOCTL_DEV_CHANGE_CHANNEL 17 +#define IOCTL_DEV_SETKEY 18 +#define IOCTL_DEV_CALCMD 19 /* Send the cal cmd */ +#define IOCTL_DEV_DELKEY 20 +#define IOCTL_DEV_CMD 21 /* General commands */ +#define IOCTL_DEV_DISASSOC 22 /* Configure node */ +#define IOCTL_DEV_SMPS 23 /* MIMO power save mode change */ +#define IOCTL_DEV_FORCEMICERROR 24 +#define IOCTL_DEV_SET_SCANMODE 25 +#define IOCTL_DEV_XMITCTL 26 /* transmission control (turning on or off) */ +#define IOCTL_DEV_BEACON_STOP 27 /* Stop transmitting beacons */ +#define IOCTL_DEV_SET_MACADDR 30 +#define IOCTL_DEV_KILL_MUC 31 +#define IOCTL_DEV_DUMP_LOG 32 +#define IOCTL_DEV_SET_HRFLAGS 33 +#define IOCTL_DEV_SAMPLE_CHANNEL 34 +#define IOCTL_DEV_CHANGE_CHAN_DEFERRED 35 +#define IOCTL_DEV_WMM_PARAMS 36 +#define IOCTL_DEV_VAPDELETE 37 /* Delete a vap */ +#define IOCTL_DEV_STORE_TXPOW 38 /* Store the Tx power, short-range workaround*/ +#define IOCTL_DEV_USE_RTS_CTS 39 /* Enable-disable RTS-CTS */ +#define IOCTL_DEV_RST_QUEUE_DEPTH 40 +#define IOCTL_DEV_SET_POWER_SAVE 41 /* send request to MuC to change power save level */ +#define IOCTL_DEV_VSP 42 /* Configure QVSP */ +#define IOCTL_DEV_SET_11G_ERP 43 /* set 11bg ERP on/off */ +#define IOCTL_DEV_BGSCAN_CHANNEL 44 +#define IOCTL_DEV_UPDATE_DTLS_PRESENT 45 /* update wheather DTLS session deteced or not */ +#define IOCTL_DEV_SET_OCAC 46 +#define IOCTL_DEV_MEAS_CHANNEL 47 /* notify MUC to execute measurement */ +#define IOCTL_DEV_GET_LINK_MARGIN_INFO 48 /* get rssi info */ +#define IOCTL_DEV_SET_TDLS_PARAM 49 /* set tdls related paramters */ +#define IOCTL_DEV_GET_TDLS_PARAM 50 /* set tdls related paramters */ +#define IOCTL_DEV_POWER_SAVE 51 /* enter/leave power save state */ +#define IOCTL_DEV_REMAIN_CHANNEL 52 /* Remain on target channel */ +#define IOCTL_DEV_SCS_UPDATE_SCAN_STATS 53 +#define IOCTL_DEV_SET_SCANMODE_STA 54 +#define IOCTL_DEV_GET_MU_GRP 55 /* get MU groups other releated data */ +#define IOCTL_DEV_SET_RX_GAIN_PARAMS 56 /* Set RX gain params */ +#define IOCTL_DEV_GET_MU_ENABLE 57 /* get MU enable flag */ +#define IOCTL_DEV_GET_PRECODE_ENABLE 58 /* get MU precode enable flag */ +#define IOCTL_DEV_GET_MU_USE_EQ 59 /* get EQ enable flag */ +#define IOCTL_DEV_SET_CHAN_POWER_TABLE 60 /* Set MuC power table */ +#define IOCTL_DEV_ENABLE_VLAN 61 /* Set Global Vlan mode */ +#define IOCTL_DEV_NODE_UPDATE 62 /* Update node information again after association */ +#define IOCTL_DEV_FWT_SW_SYNC 63 /* sync FWT timestamp base between Lhost and MUC */ + +#define IOCTL_DEV_CMD_MEMDBG_DUMP 1 /* Dump MuC memory */ +#define IOCTL_DEV_CMD_MEMDBG_DUMPCFG 2 /* Configuration for dumping MuC memory */ +#define IOCTL_DEV_CMD_MEMDBG_DUMPNODES 3 /* Configuration for dumping MuC nodes */ +#define IOCTL_DEV_CMD_SET_DRV_DBG 4 /* Set MUC debug message level*/ +#define IOCTL_DEV_CMD_GET_DRV_DBG 5 /* Get MUC debug message level*/ + +#define IOCTL_DEVATTACH_DEVFLAG_MASK 0xFFFF0000 +#define IOCTL_DEVATTACH_DEVFLAG_MASK_S 16 +#define IOCTL_DEVATTACH_DEVID_MASK 0x000000FF +#define IOCTL_DEVATTACH_DEV_RFCHIP_FREQID_MASK 0x00000F00 +#define IOCTL_DEVATTACH_DEV_RFCHIP_FREQID_MASK_S 8 +#define IOCTL_DEVATTACH_DEV_RFCHIP_VERID_MASK 0x0000F000 +#define IOCTL_DEVATTACH_DEV_RFCHIP_VERID_MASK_S 12 +#define IOCTL_DEVATTACH_IRQNUM 0x000000FF +#define IOCTL_DEVATTACH_IRQREG 0x00000F00 +#define IOCTL_DEVATTACH_IRQREG_S 8 +#define IOCTL_DEVATTACH_NMBOX_MASK 0x000000FF + +#define QTN_CHAN_IEEE (0xFF << 0) +#define QTN_CHAN_IEEE_S (0) +#define QTN_CHAN_PWR (0xFF << 8) +#define QTN_CHAN_PWR_S (8) + +#define QTNCHAN_TO_IEEENUM(chan) (MS(chan, QTN_CHAN_IEEE)) + +#define QTN_CHAN_FLG_DFS 0x20000000 +#define QTN_CHAN_FLG_HT40 0x40000000 +#define QTN_CHAN_FLG_PRI_HI 0x80000000 +#define QTN_CHAN_FLG_RSV01 0x01000000 +#define QTN_CHAN_FLG_RSV02 0x02000000 +#define QTN_CHAN_FLG_RSV04 0x04000000 +#define QTN_CHAN_FLG_RSV08 0x08000000 +#define QTN_CHAN_FLG_RSV10 0x10000000 + +#define QTN_CHAN_FLG_VHT80 0x00800000 + +#define QTN_BAND_FREQ (0xFF << 0) +#define QTN_BAND_FREQ_S (0) + +#define IOCTL_HLINK_DEVATTACH 1 /* Attach device */ +#define IOCTL_HLINK_DEVDETACH 2 /* Detach device */ +#define IOCTL_HLINK_DEVCHANGE 3 /* Change device state/flags */ +#define IOCTL_HLINK_LOGATTACH 4 /* Attach Log */ +#define IOCTL_HLINK_TEMP_ATTACH 5 /* Share temperature struct */ +#define IOCTL_HLINK_SVCERRATTACH 6 /* Attach svcerr */ +#define IOCTL_HLINK_RTNLEVENT 7 /* RTNL event */ +#define IOCTL_HLINK_NDP_FRAME 8 /* NDP frame */ +#define IOCTL_HLINK_FOPS_REQ 9 /* Recv File I/O req */ +#define IOCTL_HLINK_MIC_ERR 10 /* TKIP MIC failure detected */ +#define IOCTL_HLINK_BOOTED 11 /* MuC boot complete */ +#define IOCTL_HLINK_DROP_BA 12 /* drop BA */ +#define IOCTL_HLINK_DISASSOC_STA 13 /* disassociate station with a given aid */ +#define IOCTL_HLINK_RFIC_CAUSED_REBOOT 14 /* detected RFIC abnormal reset, reboot the system */ +#define IOCTL_HLINK_BA_ADD_START 15 /* start Tx ADDBA REQ sequence */ +#define IOCTL_HLINK_PEER_RTS 16 /* Peer RTS enable or disable */ +#define IOCTL_HLINK_DYN_WMM 17 /* Dynamic WMM enable or disable */ +#define IOCTL_HLINK_TDLS_EVENTS 18 /* TDLS Events from MuCfw */ +#define IOCTL_HLINK_RATE_TRAIN 19 /* Per-node rate training hash */ + +enum { + BW_INVALID = 0, + BW_HT20 = 20, + BW_HT40 = 40, + BW_HT80 = 80, + BW_HT160 = 160 +}; + +/* Fixed bw command offset */ +#define QTN_BW_FIXED_BW 0x3 +#define QTN_BW_FIXED_BW_S 0 +#define QTN_BW_FIXED_EN 0x10 +#define QTN_BW_FIXED_EN_S 4 + +enum { + QTN_DISABLE_PN_VALIDATION = 0, + QTN_ENABLE_PN_VALIDATION = 1 +}; + +struct qtn_csa_info { + uint64_t req_tsf; /* aim to change channels at this tsf */ + uint64_t switch_tsf; /* tsf just after channel change completed */ + uint32_t pre_notification_tu; /* pre-switch notification to lhost in TU */ + uint32_t post_notification_tu; /* post channel change notification */ + uint32_t freq_band; /* freqency band info */ + uint32_t channel; /* channel to switch to */ + +#define QTN_CSA_STATUS_MUC_SCHEDULED 0x00000001 +#define QTN_CSA_STATUS_MUC_ERROR_SCHED 0x00000010 +#define QTN_CSA_STATUS_MUC_PRE 0x00000002 +#define QTN_CSA_STATUS_MUC_SWITCHED 0x00000004 +#define QTN_CSA_STATUS_MUC_POST 0x00000008 +#define QTN_CSA_STATUS_MUC_ERROR_SW 0x00000010 +#define QTN_CSA_STATUS_MUC_CANCELLED 0x00000020 +#define QTN_CSA_STATUS_MUC_COMPLETE 0x00000040 + uint32_t muc_status; /* status written by MuC */ + +#define QTN_CSA_RESTART_QUEUE 0x00000001 +#define QTN_CSA_STATUS_LHOST_PRE_DONE 0x00000002 +#define QTN_CSA_STATUS_LHOST_SWITCH_DONE 0x00000004 +#define QTN_CSA_STATUS_LHOST_POST_DONE 0x00000008 +#define QTN_CSA_CANCEL 0x00000010 +#define QTN_CSA_STATUS_LHOST_ACTIVE 0x00000020 +#define QTN_CSA_STATUS_LHOST_UNITS_OFFSET 0x00000040 + uint32_t lhost_status; /* flags written by lhost */ +}; + +#define MEAS_RPI_HISTOGRAM_SIZE 8 + +enum meas_reason { + QTN_MEAS_REASON_SUCC = 0, + QTN_MEAS_REASON_OFF_CHANNEL_UNSUPPORT, + QTN_MEAS_REASON_DURATION_TOO_SHORT, + QTN_MEAS_REASON_TIMER_SCHED_FAIL, + QTN_MEAS_REASON_TYPE_UNSUPPORT, + QTN_MEAS_REASON_MAX, +}; + +enum meas_type { + QTN_MEAS_TYPE_BASIC = 0, + QTN_MEAS_TYPE_CCA, + QTN_MEAS_TYPE_RPI, + QTN_MEAS_TYPE_CHAN_LOAD, + QTN_MEAS_TYPE_NOISE_HIS, + QTN_MEAS_TYPE_MAX, +}; + +struct meas_time_slice { + uint32_t meas_slice; /* time slice */ + uint32_t meas_time_pri; /* prime time count based on meas_slice */ + uint32_t meas_time_sec; /* secondary time count based on meas_slice */ +}; + +struct qtn_meas_chan_info { + uint32_t work_channel; /* working channel to return to */ + int32_t meas_type; /* measurement type */ + int32_t meas_reason; /* measurement reason */ + struct meas_time_slice time_slice; /* time slice for measurement long duration */ + uint32_t meas_channel; + uint64_t meas_start_tsf; + uint32_t meas_dur_ms; + union { + struct { + uint32_t cca_busy_cnt; + uint32_t cca_try_cnt; + uint32_t cca_try_ms; + uint32_t cca_busy_ms; + } cca_and_chanload; + uint8_t rpi_counts[MEAS_RPI_HISTOGRAM_SIZE]; + int32_t basic_radar_num; + uint8_t basic; + } inter_data; +}; + +enum scs_lot_tsf_pos { + SCS_LOG_TSF_POS_LHOST_TASK_KICKOFF, + SCS_LOG_TSF_POS_LHOST_IOCTL2MUC, + SCS_LOG_TSF_POS_MUC_POLL_IOCTL_FROM_LHOST, + SCS_LOG_TSF_POS_MUC_QOSNULL_SENT, + SCS_LOG_TSF_POS_MUC_SMPL_START_BEFORE_CHAN_CHG, + SCS_LOG_TSF_POS_MUC_SMPL_START_AFTER_CHAN_CHG, + SCS_LOG_TSF_POS_MUC_SMPL_FINISH_BEFORE_CHAN_CHG, + SCS_LOG_TSF_POS_MUC_SMPL_FINISH_AFTER_CHAN_CHG, + SCS_LOG_TSF_POS_LHOST_CCA_INTR, + SCS_LOG_TSF_POS_LHOST_CCA_WORK, + SCS_LOG_TSF_POS_NUM +}; + +#define IEEE80211_SCS_LOG_TSF(_ic, _sample, _pos) ((_ic)->ic_get_tsf(&((_sample)->tsf[(_pos)]))) +#define QDRV_SCS_LOG_TSF(_sample, _pos) (hal_get_tsf(&((_sample)->tsf[(_pos)]))) +#define MUC_SCS_LOG_TSF(_qh, _sample, _pos) (hal_get_tsf((_qh), &((_sample)->tsf[(_pos)]))) + +struct qtn_samp_chan_info { + struct out_cca_info result; /* results structure for CCA measurement */ + uint32_t freq_band; + uint32_t samp_channel; /* The channel on which sample will be taken */ + uint32_t duration_msecs; /* Duration in milliseconds to stay on off channel */ + uint64_t start_tsf; /* tsf at which to start sampling */ + +#define QTN_CCA_STATUS_IDLE 0x0 +#define QTN_CCA_STATUS_HOST_IOCTL_SENT 0x1 +#define QTN_CCA_STATUS_MUC_SCHEDULED 0x2 +#define QTN_CCA_STATUS_MUC_STARTED 0x3 +#define QTN_CCA_STATUS_MUC_COMPLETE 0x4 +#define QTN_CCA_STATUS_MUC_CANCELLED 0x5 + uint32_t status; + +#define QTN_CCA_TYPE_BACKGROUND 0x1 +#define QTN_CCA_TYPE_DIRECTLY 0x2 + uint32_t type; + + uint32_t qosnull_txdesc_host; /* qosnull frame for channel sampling */ + uint32_t qosnull_txdesc_bus; /* qosnull frame in phyaddr */ + uint16_t qosnull_frame_len; /* the frame length of qosnull */ + uint16_t tx_node_idx; /* the node index that qosnull frame to */ + uint32_t qosnull_txtsf; /* the tsf_lo read from MAC on that qosnull frame was sent successfully */ + uint32_t qosnull_nav; /* the large NAV in qosnull frame */ + uint64_t tsf[SCS_LOG_TSF_POS_NUM]; /* timestamps used for precise time control and profiling */ +}; + +#define QTN_SCS_ASSOC_STA_MAX 12 + +struct qtn_scs_vsp_node_stats { + uint32_t ni_associd; + uint32_t tx_usecs; + uint32_t rx_usecs; +}; + +struct qtn_scs_vsp_info { + uint32_t num_of_assoc; + struct qtn_scs_vsp_node_stats scs_vsp_node_stats[QTN_SCS_ASSOC_STA_MAX]; +}; + +struct qtn_scs_scan_info { + uint32_t bw_sel; + uint32_t cca_idle; + uint32_t cca_busy; + uint32_t cca_tx; + uint32_t cca_intf; + uint32_t cca_try; + uint32_t bcn_rcvd; + uint32_t crc_err; + uint32_t lpre_err; + uint32_t spre_err; +}; + +#define QTN_SCS_MAX_OC_INFO 32 +struct qtn_scs_oc_info { + uint32_t off_channel; + uint32_t off_chan_bw_sel; + uint32_t off_chan_cca_busy; + uint32_t off_chan_cca_sample_cnt; + uint32_t off_chan_cca_try_cnt; + uint32_t off_chan_beacon_recvd; + uint32_t off_chan_crc_errs; + uint32_t off_chan_sp_errs; + uint32_t off_chan_lp_errs; +}; +/* Smart channel selection data shared between Lhost and MuC */ +struct qtn_scs_info { + uint32_t oc_info_count; + struct qtn_scs_oc_info oc_info[QTN_SCS_MAX_OC_INFO]; + uint32_t bw_sel; + uint32_t cca_try; + uint32_t cca_busy; + uint32_t cca_idle; + uint32_t cca_tx; + uint32_t cca_interference; + uint32_t beacon_recvd; + uint32_t tx_usecs; + uint32_t rx_usecs; + struct qtn_scs_vsp_info scs_vsp_info; +}; + +struct qtn_scs_info_set { + uint32_t valid_index; /* 0 or 1 */ + struct qtn_scs_info scs_info[2]; + struct qtn_scs_scan_info scan_info[IEEE80211_CHAN_MAX]; +}; + +struct qtn_remain_chan_info { + uint32_t chipid; + uint32_t data_channel; /* Data channel to return to */ + uint32_t off_channel; /* The required remain channel */ + uint32_t duration_usecs; /* Duration in microseconds to stay on remain channel */ + uint64_t start_tsf; /* tsf at which to switch to remain channel */ + +#define QTN_REM_CHAN_STATUS_IDLE 0x0 +#define QTN_REM_CHAN_STATUS_HOST_IOCTL_SENT 0x1 +#define QTN_REM_CHAN_STATUS_MUC_SCHEDULED 0x2 +#define QTN_REM_CHAN_STATUS_MUC_STARTED 0x3 +#define QTN_REM_CHAN_STATUS_MUC_COMPLETE 0x4 +#define QTN_REM_CHAN_STATUS_MUC_CANCELLED 0x5 + uint32_t status; /* channel switch status */ + + uint8_t peer_mac[IEEE80211_ADDR_LEN]; /* peer node mac address */ +}; + + +#define QTN_CCA_CNT2MS(_cnt) RUBY_TIMER_MUC_CCA_CNT2MS(_cnt) +#define QTN_CCA_INTV RUBY_TIMER_MUC_CCA_INTV + +enum scan_chan_tsf_pos { + SCAN_CHAN_TSF_LHOST_HOSTLINK_IOCTL = 0, + SCAN_CHAN_TSF_MUC_IOCTL_PROCESS, + SCAN_CHAN_TSF_MUC_SEND_START_FRM, + SCAN_CHAN_TSF_MUC_SEND_START_FRM_DONE, + SCAN_CHAN_TSF_MUC_GOTO_OFF_CHAN, + SCAN_CHAN_TSF_MUC_GOTO_OFF_CHAN_DONE, + SCAN_CHAN_TSF_MUC_SEND_PRBREQ_FRM, + SCAN_CHAN_TSF_MUC_SEND_PRBREQ_FRM_DONE, + SCAN_CHAN_TSF_MUC_GOTO_DATA_CHAN, + SCAN_CHAN_TSF_MUC_GOTO_DATA_CHAN_DONE, + SCAN_CHAN_TSF_MUC_SEND_FINISH_FRM, + SCAN_CHAN_TSF_MUC_SEND_FINISH_FRM_DONE, + SCAN_CHAN_TSF_LHOST_INTERRUPT, + SCAN_CHAN_TSF_LHOST_SCANWORK, + SCAN_CHAN_TSF_LOG_NUM +}; + +struct scan_chan_tsf_dbg { + int pos_index; + char *log_name; +}; + +#define QDRV_SCAN_LOG_TSF(_scan, _pos) (hal_get_tsf(&((_scan)->tsf[(_pos)]))) +#define MUC_SCAN_LOG_TSF(_qh, _scan, _pos) (hal_get_tsf((_qh), &((_scan)->tsf[(_pos)]))) + +struct qtn_scan_chan_info { + uint32_t freq_band; + uint32_t scan_channel; /* The channel on which sample will be taken */ +#define TIME_MARGIN_BEFORE_STARTFRM 3000 /* microseconds, time overhead for others before start frame is sent*/ +#define TIME_MARGIN_AFTER_STARTFRM 1000 /* microseconds, time overhead for others after start frame is sent*/ +#define TIME_OFFSET_SEND_PROBE_REQ 3000 /* microseconds, the time offset for sending probe_req frame + * after switching to off channel*/ +#define TIME_OFFSET_SEND_START_FRM 5000 /* microseconds, the time offset for sending start frame + * after set NETDEV_F_PAUSE_TX flag */ +#define TIME_DUR_FOR_ALL_BEACONS 25000 /* microseconds, the time duration for transmitting all beacons */ +#define TIME_MIN_WAIT_PROBE_REP 5000 /* microseconds, the minimal time for waiting for the probe + * response frame on scanning channel */ + uint32_t dwell_msecs; /* Duration in milliseconds to stay on scanning channel */ +#define QTN_SCAN_CHAN_MUC_IDLE 0x0 +#define QTN_SCAN_CHAN_MUC_STARTED 0x1 +#define QTN_SCAN_CHAN_MUC_PROBING 0x2 +#define QTN_SCAN_CHAN_MUC_COMPLETED 0x3 +#define QTN_SCAN_CHAN_MUC_FAILED 0x4 +#define QTN_SCAN_CHAN_MUC_SCHEDULED 0x5 + uint32_t muc_status; /* written only by MuC */ +#define QTN_SCAN_CHAN_FLAG_ACTIVE 0x00000001 +#define QTN_SCNA_CHAN_FLAG_PASSIVE_FAST 0x00000002 +#define QTN_SCNA_CHAN_FLAG_PASSIVE_NORMAL 0x00000004 +#define QTN_SCNA_CHAN_FLAG_PASSIVE_SLOW 0x00000008 +#define QTN_SCAN_CHAN_TURNOFF_RF 0x00000010 + uint32_t scan_flags; + uint32_t start_txdesc_host; /* The frame sent before go scan channel, + * e.g. pwrsav frame in STA mode */ + uint32_t start_txdesc_bus; /* Start frame in phyaddr */ + uint16_t start_node_idx; /* the node index that frame to */ + uint16_t start_frame_len; /* frame length */ + uint32_t prbreq_txdesc_host; /* probe request frame for active scanning */ + uint32_t prbreq_txdesc_bus; /* probe request frame in phyaddr */ + uint16_t prbreq_node_idx; /* the node index that frame to */ + uint16_t prbreq_frame_len; /* frame length */ + uint32_t finish_txdesc_host; /* The frame sent after back data channel, + * e.g. the frame to announce waking up in STA mode */ + uint32_t finish_txdesc_bus; /* Complete frame in phyaddr */ + uint16_t finish_node_idx; /* the node index that frame to */ + uint16_t finish_frame_len; /* frame length */ + uint64_t tsf[SCAN_CHAN_TSF_LOG_NUM]; +}; + +enum qtn_ocac_tsf_log { + OCAC_TSF_LOG_GOTO_OFF_CHAN = 0, + OCAC_TSF_LOG_GOTO_OFF_CHAN_DONE, + OCAC_TSF_LOG_GOTO_DATA_CHAN, + OCAC_TSF_LOG_GOTO_DATA_CHAN_DONE, + OCAC_TSF_LOG_NUM +}; + +struct qtn_ocac_info { + uint32_t freq_band; /* frequency band, written by lhost */ + uint32_t off_channel; /* The off channel, "0" means to stop ocac in MuC, written by lhost*/ + uint32_t qosnull_txdesc_host; /* qosnull frame in virtual address, written by lhost */ + uint32_t qosnull_txdesc_bus; /* qosnull frame in physical address, written by lhost */ + uint16_t qosnull_frame_len; /* the frame length of qosnull */ + uint16_t tx_node_idx; /* the node index that qosnull frame to */ + uint16_t dwell_time; /* the required time on off channel in one beacon interval, written by lhost */ + uint16_t secure_dwell; /* milliseconds, the time on off channel within on off-channel action, using + qosnull frame with large NAV to protect the traffic */ + uint16_t threshold_fat; /* the fat threshold to run off-channel CAC, written by lhost */ + uint16_t threshold_traffic; /* the traffic threshold to run off-channel CAC, written by lhost */ + uint16_t threshold_fat_dec; /* the threshold for consecutive fat decrease, written by lhost */ + uint16_t traffic_ctrl; /* whether to send qosnull or not, written by lhost */ + uint16_t offset_txhalt; /* milliseconds, the offset after beacon to halt tx, written by lhost */ + uint16_t offset_offchan; /* milliseconds, the offset after halt tx to switch off channel, written by lhost */ + +#define QTN_OCAC_ON_DATA_CHAN 0x1 +#define QTN_OCAC_ON_OFF_CHAN 0x2 + uint16_t chan_status; /* current on which channel, written by MuC */ + uint16_t actual_dwell_time; /* the actual time on off channel, written by MuC */ + uint64_t tsf_log[OCAC_TSF_LOG_NUM]; /* event tsf log, written by MuC */ +}; + +struct qtn_rf_rxgain_params +{ + uint8_t *gain_entry_tbl; + uint8_t lna_on_indx; + uint8_t max_gain_idx; + uint16_t cs_threshold_value; +}; + +/* MuC fops requst */ +#define MUC_FOPS_MAX_FNAME_SIZE (50) +enum { + MUC_FOPS_OPEN = 0, + MUC_FOPS_READ, + MUC_FOPS_WRITE, + MUC_FOPS_LSEEK, + MUC_FOPS_CLOSE, +}; + +enum { + MUC_FOPS_PENDING = 0x011ADDED, + MUC_FOPS_DONE = 0xF035D0DE, +}; + +enum { + MUC_FOPS_RDONLY = 0x0, + MUC_FOPS_WRONLY = 0x1, + MUC_FOPS_RDWR = 0x2, + MUC_FOPS_APPEND = 0x4, +}; + +struct muc_fops_req { + volatile int32_t ret_val; + volatile int32_t fd; + volatile uint32_t req_state; + volatile char *data_buff; +}; + +enum qdrv_cmd_muc_memdbgcnf_s { + QDRV_CMD_MUC_MEMDBG_STATUS, + QDRV_CMD_MUC_MEMDBG_FD_MAX, + QDRV_CMD_MUC_MEMDBG_NODE_MAX, + QDRV_CMD_MUC_MEMDBG_DUMP_MAX, + QDRV_CMD_MUC_MEMDBG_RATETBL, + QDRV_CMD_MUC_MEMDBG_MSG_SEND, + QDRV_CMD_MUC_MEMDBG_TRACE, + QDRV_CMD_MUC_MEMDBG_LAST +}; + +/* The following file indexes and file lists must all be kept in sync */ +#define FOPS_FD_EP_SAMPLES 9 +#define FOPS_FD_DCACHE_SAMPLES 10 +#ifdef PROFILE_MUC_SAMPLE_IPTR_AUC +#define FOPS_FD_IPTR_SAMPLES 15 +#else +#define FOPS_FD_IPTR_SAMPLES 11 +#endif +#define FOPS_FD_UBOOT_ENV 12 + +#define LHOST_CAL_FILES { \ + NULL, \ + "/proc/bootcfg/bf_factor", \ + "/tmp/txpower.txt", \ + "/proc/bootcfg/txpower.cal", \ + "/proc/bootcfg/dc_iq.cal", \ + "/mnt/jffs2/mon.out", \ + "/mnt/jffs2/gmon.out", \ + "/mnt/jffs2/pecount.out", \ + "/proc/bootcfg/pdetector.cal", \ + "/mnt/jffs2/profile_ep_muc", \ + "/mnt/jffs2/profile_dcache_muc",\ + "/mnt/jffs2/profile_iptr_muc", \ + "/proc/bootcfg/env", \ + "/etc/mtest", \ + "/proc/bootcfg/rx_iq.cal", \ + "/mnt/jffs2/profile_iptr_auc", \ +} + +#define MUC_CAL_FILES { \ + NULL, \ + NULL, \ + NULL, \ + NULL, \ + NULL, \ + "mon.out", \ + "gmon.out", \ + NULL, \ + NULL, \ + NULL, \ + NULL, \ + NULL, \ + NULL, \ +} + +enum tdls_ioctl_params { + IOCTL_TDLS_STATUS = 1, + IOCTL_TDLS_UAPSD_IND_WND, + IOCTL_TDLS_PTI_CTRL, + IOCTL_TDLS_PTI, + IOCTL_TDLS_PTI_PENDING, + IOCTL_TDLS_DBG_LEVEL, + IOCTL_TDLS_PTI_DELAY, + IOCTL_TDLS_PTI_EVENT = 100 +}; + +struct qtn_tdls_args { + uint8_t ni_macaddr[IEEE80211_ADDR_LEN]; + uint16_t ni_ncidx; + uint32_t tdls_cmd; + uint32_t tdls_params; +}; + +struct qtn_node_args +{ + /* header */ + uint8_t ni_macaddr[IEEE80211_ADDR_LEN]; + uint8_t ni_bssid[IEEE80211_ADDR_LEN]; + uint8_t ni_nrates; + uint8_t ni_rates[IEEE80211_RATE_MAXSIZE]; + uint8_t ni_htnrates; + uint8_t ni_htrates[IEEE80211_HT_RATE_MAXSIZE]; + uint16_t ni_associd; /* assoc response */ + uint16_t ni_node_idx; + uint16_t ni_flags; /* special-purpose state */ + struct wmm_params wmm_params[WME_NUM_AC]; + uint8_t ni_implicit_ba_rx; /* The RX side of the implicit BA. Zero for no implicit RX BA */ + uint8_t ni_implicit_ba_tx; /* The TX side of the implicit BA. Zero for no implicit TX BA */ + uint16_t ni_implicit_ba_size; /* Size of the implicit BAs */ + uint8_t ni_qtn_ie_flags; + uint8_t ni_vendor; + uint8_t ni_bbf_disallowed; /* flag to disallow BBF */ + uint8_t ni_std_bf_disallowed; /* flag to disallow standard BF */ + uint8_t ni_uapsd; /* U-APSD per-node flags matching WMM STA Qos Info field */ + uint8_t ni_htcap[sizeof(struct ieee80211_htcap)]; /* Processed HT capabilities */ + uint8_t ni_htinfo[sizeof(struct ieee80211_htinfo)]; /* Processed HT info */ + uint8_t ni_vhtcap[sizeof(struct ieee80211_vhtcap)]; /* Processed VHT capabilities */ + uint8_t ni_vhtop[sizeof(struct ieee80211_vhtop)]; /* Processed VHT operational info */ + struct qtn_node_shared_stats *ni_shared_stats; + uint32_t ni_ver_sw; + uint32_t ni_qtn_flags; + uint32_t ni_tdls_status; + uint8_t ni_mu_grp[sizeof(struct ieee80211_vht_mu_grp)]; + uint16_t ni_rsn_caps; /* optional rsn capabilities */ + uint8_t rsn_ucastcipher; /* selected unicast cipher */ + uint16_t tdls_peer_associd; /* tdls peer AID allocated by AP, unique in BSS */ + uint32_t ni_rate_train; + uint32_t ni_rate_train_peer; +}; + +struct qtn_beacon_args +{ + uint32_t pkt_data; + struct wmm_params wmm_params[WME_NUM_AC]; + uint32_t bintval; + uint32_t bo_tim; + uint32_t bo_tim_len; + uint32_t bo_tpc_rep; + uint32_t bo_chanswitch; + uint32_t bo_htcap; + uint32_t bo_htinfo; + uint32_t bo_vhtcap; + uint32_t bo_vhtop; +}; + +struct qtn_key { + u_int8_t wk_keylen; /* key length in bytes */ + u_int8_t wk_flags; +#define IEEE80211_KEY_XMIT 0x01 /* key used for xmit */ +#define IEEE80211_KEY_RECV 0x02 /* key used for recv */ +#define IEEE80211_KEY_GROUP 0x04 /* key used for WPA group operation */ +#define IEEE80211_KEY_SWCRYPT 0x10 /* host-based encrypt/decrypt */ +#define IEEE80211_KEY_SWMIC 0x20 /* host-based enmic/demic */ + u_int16_t wk_keyix; /* key index */ + u_int8_t wk_key[IEEE80211_KEYBUF_SIZE + IEEE80211_MICBUF_SIZE]; +#define wk_txmic wk_key + IEEE80211_KEYBUF_SIZE + 0 /* XXX can't () right */ +#define wk_rxmic wk_key + IEEE80211_KEYBUF_SIZE + 8 /* XXX can't () right */ + u_int64_t wk_keyrsc[IEEE80211_RSC_MAX]; /* key receive sequence counter */ + u_int64_t wk_keytsc; /* key transmit sequence counter */ + u_int32_t wk_cipher; /* cipher */ + u_int32_t wk_ncidx; /* node cache index */ +}; +#define IEEE80211_KEY_COMMON /* common flags passed in by apps */\ + (IEEE80211_KEY_XMIT | IEEE80211_KEY_RECV | IEEE80211_KEY_GROUP) + +struct qtn_key_args +{ + struct qtn_key key; + uint8_t wk_addr[IEEE80211_ADDR_LEN]; +}; + +struct qtn_power_save_args +{ + uint32_t enable; + uint8_t ni_addr[IEEE80211_ADDR_LEN]; +}; + +struct lhost_txdesc +{ + struct host_txdesc hw_desc; /* shared between muc and lhost */ + struct sk_buff *skb; + struct lhost_txdesc *next; +}; + +#define MUC_TXSTATUS_READY 0x0 +#define MUC_TXSTATUS_DONE 0x1 + +#define MUC_RXSTATUS_DONE 0x1 + +#define MUC_RXSTATUS_RXLEN 0xFFFF0000 +#define MUC_RXSTATUS_RXLEN_S 16 + +struct qtn_link_margin_info { + uint32_t mcs; + uint32_t bw; + int rssi_avg; + int reason; +#define QTN_LINK_MARGIN_REASON_SUCC 0 +#define QTN_LINK_MARGIN_REASON_NOSUCHNODE 1 + uint8_t mac_addr[IEEE80211_ADDR_LEN]; +}; + +#define QTN_RESERVED_DEVIDS 2 +#define QTN_WLANID_FROM_DEVID(devid) \ + ((devid < QTN_RESERVED_DEVIDS)? 0 : (devid - QTN_RESERVED_DEVIDS)) + +struct qtn_mu_grp_args { + /* MU group ID. 0 means the group is not used and grp_ni is empty*/ + uint8_t grp_id; + /* mu QMat installation status */ + /* QMat is not installed and not used */ +#define MU_QMAT_DISABLED 0 + /* QMat is installed and used */ +#define MU_QMAT_ENABLED 1 + /* QMat is installed, used but not updated */ +#define MU_QMAT_FREEZED 2 + /* QMat is installed, not used and not updated */ +#define MU_QMAT_NOT_USED 3 + uint8_t qmat_installed; + /* the index of the grp_ni[], is also the user position */ + uint16_t aid[IEEE80211_MU_GRP_NODES_MAX]; + uint8_t ncidx[IEEE80211_MU_GRP_NODES_MAX]; + /* matrix addr offsets in sram */ + unsigned int u0_1ss_u1_1ss; + unsigned int u0_2ss_u1_1ss; + unsigned int u0_3ss_u1_1ss; + unsigned int u0_1ss_u1_2ss; + unsigned int u0_1ss_u1_3ss; + unsigned int u0_2ss_u1_2ss; + /* stats */ + uint32_t upd_cnt; + int32_t rank; +}; + +struct qtn_fwt_sw_params { + uint32_t muc_hz; + uint32_t muc_jiffies_base; + uint64_t *muc_fwt_ts_mirror; + uint64_t *muc_fwt_ts_mirror_bus; + uint64_t m2h_op; +}; + +#endif // _LHOST_MUC_COMM_H + diff --git a/package/firmware/quantenna/src/qtn/muc_share_def.h b/package/firmware/quantenna/src/qtn/muc_share_def.h new file mode 100755 index 000000000..2b4c64d3d --- /dev/null +++ b/package/firmware/quantenna/src/qtn/muc_share_def.h @@ -0,0 +1,21 @@ +/* + * Copyright (c) 2014 Quantenna Communications, Inc. + */ + +#ifndef _MUC_SHARE_DEF_H_ +#define _MUUC_SHARE_DEF_H_ + +#include "../common/ruby_mem.h" + +#define QTN_FW_WMAC_RX_Q_MGMT 0 +#define QTN_FW_WMAC_RX_Q_CTRL 1 +#define QTN_FW_WMAC_RX_Q_DATA 2 +#define QTN_FW_WMAC_RX_QNUM 3 +#define QTN_FW_WMAC_RX_QDEEP_MGMT 9 +#define QTN_FW_WMAC_RX_QDEEP_CTRL 9 +#define QTN_FW_WMAC_RX_QDEEP_DATA 394 +#define QTN_FW_WMAC_RX_DESC_NUM (QTN_FW_WMAC_RX_QDEEP_MGMT + \ + QTN_FW_WMAC_RX_QDEEP_CTRL + QTN_FW_WMAC_RX_QDEEP_DATA) + +#endif // #ifndef _MUC_SHARE_DEF_H_ + diff --git a/package/firmware/quantenna/src/qtn/muc_txrx_stats.h b/package/firmware/quantenna/src/qtn/muc_txrx_stats.h new file mode 100644 index 000000000..f416f78b8 --- /dev/null +++ b/package/firmware/quantenna/src/qtn/muc_txrx_stats.h @@ -0,0 +1,928 @@ +/* + * Copyright (c) 2008-2012 Quantenna Communications, Inc. + */ + +/* + * This file contains host definitions which are common between the + * host driver and the microcontroller/MAC code. + */ + +/** + * The host tx descriptor for an ethernet packet + */ + +#ifndef _MUC_TXRX_STATS_H_ +#define _MUC_TXRX_STATS_H_ + +#include + +#ifdef ENABLE_STATS +#define MUC_UPDATE_STATS(_a, _b) (_a += _b) +#define MUC_SETSTAT(_a, _b) (_a = _b) +#else +#define MUC_UPDATE_STATS(_a, _b) +#define MUC_SETSTAT(_a, _b) +#endif + +/** + * \defgroup MUCSTATS MuC generated statistics + */ +/** @{ */ + +/** + * \brief MuC transmit statistics + * + * These statistics are generated on the MuC, mainly on the transmit datapath. + */ +struct muc_tx_stats { + /** + * The number of times the software failed to enqueue a beacon to the + * hardware. + * + * \note If this value is non-zero it could indicate a very congested + * medium. + */ + u_int32_t bcn_enq_failed; + + /** + * The number of times the TX status bit is set. + */ + u_int32_t tx_status_set; + + /** + * The number of packets received from the LHost. + */ + u_int32_t pkt_from_host; + + /** + * The number of interrupts from the host to indicate data is ready for + * transmit. + * + * \note This number will generally be quite low, as the LHost->MuC + * data path is poll driven rather than interrupt driven. + */ + u_int32_t host_intr; + u_int32_t netbuf_alloc_failed; + + /** + * The number of management packets prior to encapsulation. + * + * \note This number should be the same as mgm_after_encap when the system + * is idle. + */ + u_int32_t mgm_before_encap; + + /** + * The number of management packets after encapsulation. + * + * \note This number should be the same as mgm_before_encap when the system + * is idle. + */ + u_int32_t mgm_after_encap; + u_int32_t pkt_before_encap; + u_int32_t pkt_after_encap; + + /** + * The number of packets held, waiting for BA to complete. + */ + u_int32_t pkt_push_back; + u_int32_t tx_timeout; + + /** + * This counter shows the number of MPDUs or AMPDUs which needed to be retried + * by the hardware. + * + * For an MPDU, it indicates that no ACK was received from the peer. + * + * For an AMPDU, it indicates that no BACK was received from the peer. + * In this case, all subframes within the aggregate failed, and the hardware + * has requeued the entire aggregate for retransmission. + * + * If all hardware retries fail, the packet is returned back to the MAC for + * software retries. + * + * \sa tx_sw_retry. + */ + u_int32_t tx_hw_retry; + + /** + * This counter shows the number of non-aggregate MPDUs that have been resent + * by software for retransmission after an initial transmission failure. + * + * Transmission failure is when no ACK has been received from the peer after the + * configured number of hardware retries. + */ + u_int32_t tx_sw_retry_noagg; + + /** + * This counter shows the number of AMPDUs that have been repackaged + * by software for retransmission after an initial transmission failure. + * + * Transmission failure is when an AMPDU fails to receive a full block + * ACK (some subframes are incorrectly received). The repackaged AMPDU + * contains a subset of the subframes from the original AMPDU. + */ + u_int32_t tx_sw_retry; + u_int32_t tx_xretry; + u_int32_t tx_pspoll_deagg; + + /** + * This counter shows the number of packets (AMPDU subframes) for which all retry + * attempts have failed. + * + * \note This counter represents genuine packet loss. + */ + u_int32_t tx_xattempts; + + /** + * This counter shows the number of non-aggregate MPDUs for which all retry + * attempts have failed. + * + * \note This counter represents genuine packet loss. + */ + u_int32_t tx_xattempts_noagg; + u_int32_t tx_done_failed; + u_int32_t tx_cca_defer_cnt; + u_int32_t pkt_to_hw; + u_int32_t pkt_to_hw_deferred; + u_int32_t fd_absent; + u_int32_t fd_not_ready; + u_int32_t pkt_fd_available; + u_int32_t pkt_add_node; + u_int32_t pkt_add_q; + u_int32_t pkt_qtn_hardstart; + u_int32_t tx_reserved; + u_int32_t tx_released; + u_int32_t tx_reserve_fail; + u_int32_t tx_release_err; + u_int32_t tx_mu_reserved; + u_int32_t tx_mu_released; + u_int32_t tx_mu_reserve_fail; + u_int32_t tx_mu_release_err; + u_int32_t txalert_mu_ndp_update; + u_int32_t txalert_mu_rpt_poll; + u_int32_t txalert_mu_queue_full; + u_int32_t txalert_mu_queue_fail; + u_int32_t sample_rate_mu; + u_int32_t sample_bw_mu; + u_int32_t txdone_intr; + u_int32_t txalert_intr; + u_int32_t txalert_tasklet; + u_int32_t txalert_bcn_update; + u_int32_t txalert_ndp_update; + u_int32_t tx_ndp_q_occupied; + u_int32_t tx_ndp_start; + u_int32_t txdone_mgmt; + u_int32_t txdone_data; + u_int32_t tx_pwr; + u_int32_t bcn_scheme_power_save; + u_int32_t bcn_scheme; + + /** + * This counter shows the number of multicast frames sent while a + * client is in powersave. Multicast frames with powersave are sent + * after the DTIM beacon. + */ + u_int32_t tx_mcast_pwr; + + /** + * This counter shows the number of multicast frames queued for + * deferred (DTIM beacon) transmission. + * + * Multicast packets are deferred until the DTIM beacon when we have + * at least one power save client associated. + */ + u_int32_t tx_mcast_defer; + u_int32_t tx_mcast_defer_hwq; + u_int32_t tx_limit_drop; + u_int32_t fd_acquire; + u_int32_t fd_release; + u_int32_t fd_acq_fail; + u_int32_t fd_acq_fail_frms; + u_int32_t fd_acq_hal_fail; + u_int32_t fd_acq_hal_fail_frms; + u_int32_t ba_send; + u_int32_t ba_del; + u_int32_t fd_free_nodeclean; + u_int32_t msdu_expired; + u_int32_t last_ack_ssq; + u_int32_t last_sent_seq; + u_int32_t ampdu_subframe_failure; + u_int32_t ampdu_subframe_done; + u_int32_t tx_window_locked; + u_int32_t tx_window_failed; + u_int32_t tx_restrict_probe; + u_int32_t tx_restrict_mode; + u_int32_t tx_restrict_drop; + u_int32_t tx_restrict_delay; + u_int32_t tx_restrict_send; + u_int32_t tx_sample_pkts; + u_int32_t tx_sample_bytes; + u_int32_t tx_underflow; + u_int32_t tx_hal_enqueued; + u_int32_t txbf_mode; + u_int32_t psel_matrix; + u_int32_t sample_rate; + u_int32_t sample_bw; + uint32_t ra_flags; + u_int32_t fd_balance; + uint32_t invalid_delay; + uint32_t halt_tx; + uint32_t resume_tx; + uint32_t rfctrl_on; + uint32_t rfctrl_off; + uint32_t go_offchan; + uint32_t go_datachan; + uint32_t defer_cc; + uint32_t deferred_cc_done; + uint32_t off_chan_sample; + uint32_t off_chan_scan; + uint32_t off_chan_cac; + uint32_t cca_pri; + uint32_t cca_sec; + uint32_t cca_sec40; + uint32_t cca_busy; + uint32_t cca_fat; + uint32_t cca_intf; + uint32_t cca_trfc; + /** + * These counter show the information of MU frames. + */ + uint32_t mu_prec_snd_tx; + uint32_t mu_prec_snd_wait_done; + uint32_t mu_grp_sel_snd_tx; + uint32_t mu_grp_sel_snd_wait_done; + + uint32_t oc_auctx_timeout; + uint32_t oc_auctx_overwrite; + uint32_t oc_auctx_fail; + uint32_t gi_cnt; /* times GI has been set for any node */ + uint32_t gi_ncidx; /* last node to have GI set */ + uint32_t gi_val; /* SGI enabled state for this node */ + uint32_t select_state_ncidx; /* last node to have qn_select state set */ + uint32_t select_state_val; /* PPPC state for this node */ + uint32_t pppc_scale_cnt; /* times Tx gain scaling has been set for any node */ + uint32_t pppc_scale_ncidx; /* last node to have Tx gain scaling set */ + uint32_t pppc_scale_val; /* Tx gain scaling for this node (0 is max) */ + uint32_t pppc_scale_last_gput; /* The last goodput used by PPPC */ + uint32_t pppc_scale_last_gput_idx; /* The PPPC index of the last goodput value */ + uint32_t pppc_scale_base_cnt; /* times Tx gain scaling base has been set for any node */ + uint32_t pppc_scale_base_20m; /* Combined tx scale bases for different bf/nss cases in 20MHz */ + uint32_t pppc_scale_base_40m; /* Combined tx scale bases for different bf/nss cases in 40MHz */ + uint32_t pppc_scale_base_80m; /* Combined tx scale bases for different bf/nss cases in 80MHz */ + uint32_t pppc_scale_base_copy; /* combined the flags indicating the tx scale bases are copied bfoff 1ss cases */ + uint32_t pppc_scale_overstep; /* tx scale exceed the maximum scale indices */ + uint32_t pppc_scale_rollback; /* tx scale roll back because scale index over step */ + uint32_t pppc_0_gput; /* times pppc comparing goodput and both are zero */ + uint32_t tx_max_power; + uint32_t nc_csr_read_count; /* number of times Node Cache was read */ + uint32_t nc_csr_write_count; /* number of times Node Cache was written to */ + uint32_t nc_csr_done_watermark; /* Node cache done retries high watermark */ + uint32_t nc_csr_watermark_count; /* Number of times read retries reached max */ + uint32_t auc_dtim_notify; + uint32_t auc_ps_notify; + uint32_t tx_beacon_done; + uint32_t sfs_peer_rts; + uint32_t sfs_peer_rts_flags; + uint32_t sfs_local_rts; + uint32_t sfs_local_rts_flags; + uint32_t sfs_dyn_wmm; + uint32_t sfs_dyn_wmm_flags; + uint32_t auc_wmm_ps_notify; + uint32_t tx_wmm_ps_null_frames; +}; + +/** + * \brief MuC receive statistics + * + * These statistics are generated on the MuC, mainly on the receive datapath. This set of statistics + * also include low-level debugging facilities used internally. + */ +struct muc_rx_stats { + /** + * This counter shows the number of descriptors taken from the host, + * 'popped' from the top of the list. + */ + u_int32_t rxdesc_pop_from_host; + + /** + * This counter shows the number of descriptors pushed to the hardware + * for receive buffers. + */ + u_int32_t rxdesc_push_to_hw; + u_int32_t rxdesc_get_from_queue; + u_int32_t rxdesc_push_to_host; + u_int32_t rxdesc_non_aggr_push_to_host; + u_int32_t rxdesc_flush_to_host; + u_int32_t rxdesc_reuse_push; + u_int32_t rxdesc_reuse_pop; + + /** + * This counter shows the number of packets received with a bad duration. + * A bad duration is where the duration field is all 1's - that is, + * a packet which violates the 802.11 standard. + */ + u_int32_t rxdesc_status_bad_dur; + u_int32_t rxdesc_status_bad_len; + u_int32_t rxdesc_slow_status; + u_int32_t rxdesc_fast_status; + u_int32_t rxdesc_status_crc_err; + u_int32_t rxdesc_status_cmic_err; + u_int32_t rxdesc_status_cmic_no_crc_err; + u_int32_t rxdesc_status_retry; + u_int32_t agg_stored; + u_int32_t agg_duplicate; + + u_int32_t accel_mpdu; + u_int32_t accel_msdu; + u_int32_t accel_no_buffer; + u_int32_t accel_fwt_lu_timeout; + u_int32_t accel_fwt_false_miss; + u_int32_t accel_mcast_send; + u_int32_t accel_mcast_drop; + u_int32_t accel_no_match; + u_int32_t accel_drop; + u_int32_t accel_err; + + u_int32_t rate_train_chk; + u_int32_t rate_train_err; + u_int32_t rate_train_delay; + u_int32_t rate_train_none; + u_int32_t rate_train_hash_bad; + u_int32_t rate_train_hash_good; + + /** + * This counter shows the number of MPDUs within an AMPDU that have been + * discarded due to the sequence number being outside ('below') the current + * receive sequence window. + */ + u_int32_t agg_oldpkts; + + /** + * This counter shows the number of MPDUs within an AMPDU that have been + * discarded due to the sequence number being off by > 2047 (half the sequence + * space). + */ + u_int32_t agg_very_oldpkts; + u_int32_t agg_evict_in_order; + u_int32_t agg_evict_in_move; + + /** + * This counter shows the number of received subframes within the + * receive window that are missing when the window is moved. + * + * This counter represents one source receive packet loss. + */ + u_int32_t agg_evict_empty; + + /** + * This counter shows the number of received subframes within the + * receive window that are evicted due to timeout. Timeout is used + * to ensure we don't sit with a stuck receive aggregate window when + * the transmitter has stopped re-transmitting a given subframe. + */ + u_int32_t agg_timeout; + u_int32_t agg_rxwin_reset; + u_int32_t rx_qnum_err; + u_int32_t rx_mgmt; + u_int32_t rx_ctrl; + u_int32_t rx_pspoll; + u_int32_t rx_pwr_mgmt; + u_int32_t rx_delba; + /** + * This counter shows the number of times the powersave bit is set + * in the frame control field of packets received. + * + * \note This counter will generally be one greater than rx_pwr_mgmt_reset + * when we have a single PS client associated and in power save. + * + * \sa rx_pwr_mgmt_reset + */ + u_int32_t rx_pwr_mgmt_set; + + /** + * This counter shows the number of times the powersave bit of a + * currently power save client is reset. + * + * \note This counter will generally be one less than rx_pwr_mgmt_set + * when we have a single PS client associated and in power save mode. + * + * \sa rx_pwr_mgmt_set + */ + u_int32_t rx_pwr_mgmt_reset; + + /** + * \internal + * + * We have 2-stage process of pushing rx descriptors to the MAC: + * + * 1) On tasklet level we prepare descriptors and save these prepared + * descriptors into intermediate buffer "rxdesc_cache" + * + * 2) In RX ISR context we get buffer from "rxdesc_cache" and push it + * to hardware. Same procedure can be sometimes called within tasklet + * level too. It is because if we failed (e.g. no free descriptors) to + * push descriptor to hw in ISR context, likely we would not receive any + * RX interrupts anymore, so tasklet scheduled which would reschedule + * itself until succeed. + * + * rx_emergency counter incremented if (2) replenishing procedure found + * that hw rx queue have slot for descriptors and fail to retrieve + * descriptor from "rxdesc_cache" to replenish hw queue. + * + * Spike of rx_emergency does not look good. + * + * It's like tasklet was scheduled to replenish hw queue and fail it, + * reschedule itself and fail again and again. + * + * Generally, rx_emergency increasing is legitimate case, for example + * if the system is overloaded by incoming traffic. However, it also can + * be a sign of something bad, like processing of rx frames is stuck somewhere. + */ + u_int32_t rx_emergency; + u_int32_t rx_underflow; + u_int32_t rx_desc_underflow; + u_int32_t rx_desc_linkerr; + u_int32_t rx_notify; + u_int32_t rx_df_numelems; + u_int32_t last_recv_seq; + + /** + * This counter shows the number of packets received for an unknown + * node - that is - one which we do not have an association with. + */ + u_int32_t rx_node_not_found; + + /** + * This counter shows the number of duplicates of non-QoS packets we + * received and discarded. + */ + u_int32_t rx_non_qos_duplicate; + + /** + * This counter shows the number of received NDPs. + */ + u_int32_t rx_11n_ndp; + u_int32_t rx_11ac_ndp; + u_int32_t rx_ndp_inv_slot; + u_int32_t rx_11n_ndp_no_capt; + u_int32_t rx_ndp_sw_processed; + u_int32_t rx_ndp_lockup; + u_int32_t rx_11n_bf_act; + u_int32_t rx_11ac_bf_act; + u_int32_t rx_bf_act_inv_slot; + + /** + * This counter shows the number of received AMSDUs. This counter does + * not count the number of subframes within the AMSDU. + */ + u_int32_t rx_amsdu; + u_int32_t rx_data; + u_int32_t prev_rx_data; + u_int32_t rx_recv_qnull; + u_int32_t rx_recv_act; + u_int32_t rx_recv_bcn; + u_int32_t rx_recv_auth; + u_int32_t rx_recv_assoc_req; + u_int32_t rx_recv_assoc_res; + u_int32_t rx_recv_deauth; + u_int32_t rx_recv_disassoc; + + /** + * This counter shows the number of packets received where the MCS as + * indicated in the PLCP is invalid (> 76). + */ + u_int32_t rx_mcs_gt_76; + u_int32_t tkip_keys; /* Keep count of TKIP keys installed - for debug */ + u_int32_t rx_tkip_mic_err; /* Number of TKIP packets RX with MIC error - the number reported to the higher layers */ + u_int32_t icv_errs; /* The number of raw ICV errors reported by the hardware */ + u_int32_t tmic_errs; /* The number of raw TMIC errors reported by the hardware */ + u_int32_t cmic_errs; + u_int32_t crc_errs; + + /** + * This counter shows the number of transmit block ACK agreements + * installed. + * + * If the upper bit is set, at least one implicit block ACK has been + * established with a Quantenna peer. + * + * \note This number only increments - when block ACK agreements are + * removed, this counter does not decrement. + */ + u_int32_t ba_tx; + + /** + * This counter shows the number of receive block ACK agreements + * installed. + * + * If the upper bit is set, at least one implicit block ACK has been + * established with a Quantenna peer. + * + * \note This number only increments - when block ACK agreements are + * removed, this counter does not decrement. + */ + u_int32_t ba_rx; + + /** + * The number of times a block ACK has been rejected due to an out of + * resource situation. + */ + u_int32_t ba_rx_fail; + u_int32_t sec_oflow; + u_int32_t str_oflow; + u_int32_t oflow_fixup_timeout; + u_int32_t rxdone_intr; + u_int32_t rxtypedone_intr; + u_int32_t ipc_a2m_intr; + u_int32_t tqe_intr; + u_int32_t tqe_in_port_lhost; + u_int32_t tqe_in_port_bad; + u_int32_t tqe_a2m_type_txfb; + u_int32_t tqe_a2m_type_rxpkt; + u_int32_t tqe_a2m_type_unknown; + u_int32_t tqe_reschedule_task; + u_int32_t tqe_desc_unowned; + + /** + * \internal + * + * The number of interrupts from the baseband to the MuC. + * + * \note This should not be distributed externally - the following + * fields are for internal debugging ONLY. + */ + u_int32_t bb_intr; + + /** + * \internal + * + * The number of DLEAF overflow interrupts from the baseband. + */ + u_int32_t bb_irq_dleaf_oflow; + u_int32_t bb_irq_leaf_uflow; + u_int32_t bb_irq_leaf_ldpc_uflow; + u_int32_t bb_irq_tx_td_oflow_intr; + u_int32_t bb_irq_tx_td_uflow_intr; + u_int32_t bb_irq_rx_sm_wdg_intr; + /* BB spends more than 6.8ms (short GI)/7.55ms (long GI) to receive one packet */ + u_int32_t bb_irq_rx_long_dur; + /* BB spends more than 5.4ms (standard defined limit) to receive one 11ac packet. */ + u_int32_t bb_irq_rx_11ac_timeout; + u_int32_t bb_irq_tx_sm_wdg_intr; + + /** + * \internal + * + * The number of BB state machine watchdogs that have kicked in. + */ + u_int32_t bb_irq_main_sm_wdg_intr; + u_int32_t bb_irq_hready_wdg_intr; + u_int32_t mac_irq_rx_sec_buff_oflow; + u_int32_t mac_irq_rx_strq_oflow; + u_int32_t mac_irq_rx_bb_uflow_intr; + u_int32_t mac_irq_rx_bb_oflow_intr; + u_int32_t bb_irq_hready_wdg_reset; + + /** + * \internal + * + * This counter is incremented once at the start of the main watchdog state machine. + * + * \sa sreset_wdg_end + */ + u_int32_t sreset_wdg_begin; + + /** + * \internal + * + * This counter is incremented once at the end of the main watchdog state machine. + * + * \sa sreset_wdg_begin + */ + u_int32_t sreset_wdg_end; + u_int32_t sreset_wdg_in_place; + u_int32_t sreset_wdg_tx_beacon_hang; + + /** + * \internal + * + * The number of transmit hangs causing soft reset. + * + * Transmit hang is between 400 to 900ms from the time of sending a packet to the hardware + * without receiving a tx done interrupt. + */ + u_int32_t sreset_wdg_tx_hang; + + /** + * \internal + * + * The number of packet memory corruption causing soft reset. + * + * For unknown reason, packet memory may be corrupted. When packet memory corruption is detected, + * soft reset is triggered, and this counter incremented once. + */ + u_int32_t sreset_wdg_pm_corrupt; + + /** + * \internal + * + * The number of packet transmit control memory corruption causing soft reset. + * + * For unknown reason, transmit control memory may be corrupted. When transmit control memory corruption is detected, + * soft reset is triggered, and this counter incremented once. + */ + u_int32_t sreset_wdg_tcm_corrupt; + + /** + * \internal + * + * The number of receive hangs causing a soft reset. + * + * Receive hang is > 70s without receiving a single packet. + * + * Note that this can trigger in idle situations, but should not affect anything because + * the link is idle. + */ + u_int32_t sreset_wdg_rx_done; + u_int32_t sreset_wdg_in_place_try; + u_int32_t sreset_wdg_tasklet_sched_1; + u_int32_t sreset_wdg_tasklet_sched_2; + u_int32_t sreset_tasklet_sched; + u_int32_t sreset_tasklet_begin; + u_int32_t sreset_tasklet_end; + + /** + * \internal + * + * This counter is incremented when a BB hard reset is requested + * to occur in the middle of a soft reset sequence + */ + u_int32_t hreset_req; + + /** + * \internal + * + * This counter is incremented at the start of a soft reset. + * + * There should always be a corresponding increment in the sreset_end + * counter, or there is a problem. + * + * \sa sreset_end + */ + u_int32_t sreset_begin; + + /** + * \internal + * + * This counter is incremented at the end of a soft reset. + * + * The should always being a corresponding increment in the sreset_begin + * counter, or there is a problem. + * + * \sa sreset_begin + */ + u_int32_t sreset_end; + + /** + * \internal + * + * This counter is incremented each time DMA RX is in progress when a + * soft reset is triggered. + */ + u_int32_t sreset_dma_rx_inprog; + + /** + * \internal + * + * This counter is incremented each time DMA TX is in progress when a + * soft reset is triggered. + */ + u_int32_t sreset_dma_tx_inprog; + u_int32_t sreset_dma_rx_max_wait; + u_int32_t sreset_dma_tx_max_wait; + u_int32_t sreset_dma_tx_hang; + u_int32_t sreset_dma_rx_hang; + u_int32_t sreset_dma_rx_wait_timeout; + u_int32_t sreset_dma_tx_wait_timeout; + u_int32_t sreset_drop_not_valid; + u_int32_t sreset_drop_bad_addr; + u_int32_t rf_cmpvtune_out; + u_int32_t rf_cal_freq; + u_int32_t ac_max; + u_int32_t ac_min; + u_int32_t ac_cur; + u_int32_t ac_adj; + u_int32_t rx_gain; + u_int32_t rd_cache_indx; + u_int32_t logger_sreset_wmac1_dma_rx_inprog; + u_int32_t logger_sreset_wmac1_dma_tx_inprog; + u_int32_t logger_sreset_wmac1_dma_rx_max_wait; + u_int32_t logger_sreset_wmac1_dma_tx_max_wait; + u_int32_t logger_sreset_wmac1_dma_tx_hang; + u_int32_t logger_sreset_wmac1_dma_rx_hang; + u_int32_t logger_sreset_wmac1_dma_rx_wait_timeout; + u_int32_t logger_sreset_wmac1_dma_tx_wait_timeout; + /** + * These counter show the information of MU frames. + */ + u_int32_t mu_rx_pkt; + + /** + * \internal + * + * These counters monitor power duty cycling + */ + u_int32_t pduty_sleep; + u_int32_t pduty_rxoff; + u_int32_t pduty_period; + u_int32_t pduty_pct; + + /** + * \internal + * + * These counter are incremented when a soft-ring operation is triggered + */ + u_int32_t soft_ring_push_to_tqe; + u_int32_t soft_ring_empty; + u_int32_t soft_ring_not_empty; + u_int32_t soft_ring_add_force; + u_int32_t soft_ring_add_to_head; + u_int32_t soft_ring_add_continue; + u_int32_t soft_ring_free_pool_empty; + u_int32_t mimo_ps_mode_switch; /* times STA switch MIMO power-save mode by HT action */ + + u_int32_t rx_vlan_drop; + u_int32_t auto_cca_state; + u_int32_t auto_cca_th; + u_int32_t auto_cca_spre; + u_int32_t auto_cca_intf; + + /** + * \internal + * + * These counters are monitor memory allocation. + */ + u_int32_t total_dmem_alloc; + u_int32_t total_dram_alloc; + u_int32_t dmem_alloc_fails; + u_int32_t dram_alloc_fails; + u_int32_t total_dmem_free; + u_int32_t total_dram_free; + + /* RX frames BW mode*/ + u_int32_t rx_bw_80; + u_int32_t rx_bw_40; + u_int32_t rx_bw_20; + + /* U-APSD rx stats */ + uint32_t rx_wmm_ps_trigger; + uint32_t rx_wmm_ps_set; + uint32_t rx_wmm_ps_reset; + + uint32_t rx_intr_next_ptr_0; + uint32_t rx_hbm_pool_depleted; + + uint32_t rxq_intr[QTN_FW_WMAC_RX_QNUM]; + uint32_t rxq_fill[QTN_FW_WMAC_RX_QNUM]; + uint32_t rxq_nobuf[QTN_FW_WMAC_RX_QNUM]; + uint32_t rxq_stop[QTN_FW_WMAC_RX_QNUM]; + uint32_t rxq_pkt[QTN_FW_WMAC_RX_QNUM]; + uint32_t rxq_bad_status[QTN_FW_WMAC_RX_QNUM]; + uint32_t rxq_pkt_oversize[QTN_FW_WMAC_RX_QNUM]; + uint32_t rxq_pkt_delivered[QTN_FW_WMAC_RX_QNUM]; + uint32_t rxq_status_hole_chk_num[QTN_FW_WMAC_RX_QNUM]; + uint32_t rxq_status_hole_chk_step_sum[QTN_FW_WMAC_RX_QNUM]; + uint32_t rxq_status_hole_chk_step_max[QTN_FW_WMAC_RX_QNUM]; + uint32_t rxq_status_hole[QTN_FW_WMAC_RX_QNUM]; + uint32_t rxq_status_hole_max_size[QTN_FW_WMAC_RX_QNUM]; + uint32_t rxq_process_max[QTN_FW_WMAC_RX_QNUM]; + uint32_t rxq_process_sum[QTN_FW_WMAC_RX_QNUM]; + uint32_t rxq_process_num[QTN_FW_WMAC_RX_QNUM]; + uint32_t rxq_process_limited[QTN_FW_WMAC_RX_QNUM]; + uint32_t rxq_desc_chain_empty[QTN_FW_WMAC_RX_QNUM]; + uint32_t rx_data_last_seqfrag; + uint32_t rx_data_last_ip_id; + + /** + * This counter is incremented once per packet which is sent via the + * external filter (HotSpot functionality). + */ + uint32_t accel_l2_ext_filter; + uint32_t accel_mc_send_l2_ext_filter; + + /** + * This counter is incremented once per multicast packet dropped without + * forwording to the external filter (HotSpot functionality). + */ + uint32_t accel_mc_drop_l2_ext_filter; + + /** + * The number of Rx frames dropped because the WPA2 Packet Number (PN) was not incrementing. + * This condition indicates a possible replay attack. + */ + uint32_t rx_replay_attack_drop; +}; + +#define MUC_HT_NUM_RATES 77 +#define MUC_VHT_NUM_RATES 40 +struct muc_rx_rates { + u_int32_t rx_mcs[MUC_HT_NUM_RATES]; + u_int32_t rx_mcs_11ac[MUC_VHT_NUM_RATES]; +}; + +#define QTN_STATS_NUM_BF_SLOTS 10 +struct muc_rx_bf_stats { + u_int32_t rx_bf_valid[QTN_STATS_NUM_BF_SLOTS]; + u_int32_t rx_bf_aid[QTN_STATS_NUM_BF_SLOTS]; + u_int32_t rx_bf_ng[QTN_STATS_NUM_BF_SLOTS]; + u_int32_t rx_bf_11n_ndp[QTN_STATS_NUM_BF_SLOTS]; + u_int32_t rx_bf_11ac_ndp[QTN_STATS_NUM_BF_SLOTS]; + u_int32_t rx_bf_11n_act[QTN_STATS_NUM_BF_SLOTS]; + u_int32_t rx_bf_11ac_act[QTN_STATS_NUM_BF_SLOTS]; + u_int32_t rx_bf_11ac_grp_sel[QTN_STATS_NUM_BF_SLOTS]; + u_int32_t rx_bf_11ac_prec[QTN_STATS_NUM_BF_SLOTS]; + u_int32_t rx_bf_11ac_su[QTN_STATS_NUM_BF_SLOTS]; + u_int32_t rx_bf_11ac_dsp_fail[QTN_STATS_NUM_BF_SLOTS]; + u_int32_t mu_grp_add[QTN_STATS_NUM_BF_SLOTS]; + u_int32_t mu_grp_del[QTN_STATS_NUM_BF_SLOTS]; + u_int32_t msg_buf_alloc_fail; +}; + +/** @} */ + +extern struct muc_rx_stats uc_rx_stats; +extern struct muc_rx_rates uc_rx_rates; +extern struct muc_rx_bf_stats uc_rx_bf_stats; +extern struct muc_tx_stats uc_tx_stats; +extern struct qtn_rate_tx_stats_per_sec uc_tx_rates; +extern uint32_t uc_su_rate_stats_read; +extern uint32_t uc_mu_rate_stats_read; + +/* + * Rate adaption data collected for packet logger + * NOTE: Any changes to these definitions will require changes to stat_parser.pl + */ +#define RATES_STATS_NUM_ADAPTATIONS 16 +#define RATES_STATS_NUM_TX_RATES 6 +#define RATES_STATS_NUM_RX_RATES 8 /* Must be a multiple of word size */ +#define RATES_STATS_EVM_CNT 4 + +/* + * Currently only two user positions are supported for MU group + * the following define should be aligned + * with IEEE80211_MU_GRP_NODES_MAX (4) in future. + * for now we don't want to take care about 2x extra zero-filled + * huge arrays in rate stats + */ +#define RATES_STATS_MAX_USER_IN_GROUP 2 + +/** + * \addtogroup MUCSTATS + */ +/** @{ */ +struct qtn_rate_stats_mcs_data { + uint16_t mcs_rate; + uint16_t rate_index; + uint16_t state; + uint16_t pkt_total; + uint16_t pkt_error; + uint16_t pkt_hw_retry; + uint16_t pkt_sample; + uint16_t avg_per; +} __attribute__((packed)); + +struct qtn_rate_su_tx_stats { + uint32_t seq_no; + uint32_t timestamp; + uint32_t flags; + uint16_t sampling_index; + uint16_t sampling_rate; + struct qtn_rate_stats_mcs_data mcs_data[RATES_STATS_NUM_TX_RATES]; +} __attribute__((packed)); + +struct qtn_rate_mu_tx_stats { + struct qtn_rate_su_tx_stats group_stats[RATES_STATS_MAX_USER_IN_GROUP]; +} __attribute__((packed)); + +struct qtn_rate_gen_stats { + u_int16_t rx_mcs_rates[RATES_STATS_NUM_RX_RATES]; + u_int32_t rx_mcs[RATES_STATS_NUM_RX_RATES]; + u_int32_t rx_crc; + u_int32_t rx_sp_errors; + u_int32_t rx_lp_errors; + u_int32_t rx_evm[RATES_STATS_EVM_CNT]; + u_int32_t tx_subframe_success; + u_int32_t tx_subframe_fail; + u_int32_t tx_mgmt_success; + u_int32_t tx_hw_retry; + u_int32_t tx_sw_retry; +} __attribute__((packed)); + +struct qtn_rate_tx_stats_per_sec { + struct qtn_rate_su_tx_stats stats_su[RATES_STATS_NUM_ADAPTATIONS]; + struct qtn_rate_mu_tx_stats stats_mu[RATES_STATS_NUM_ADAPTATIONS]; +}; +/** @} */ + +#endif /* _STATS_H_ */ diff --git a/package/firmware/quantenna/src/qtn/qtn_cca.h b/package/firmware/quantenna/src/qtn/qtn_cca.h new file mode 100644 index 000000000..15209312b --- /dev/null +++ b/package/firmware/quantenna/src/qtn/qtn_cca.h @@ -0,0 +1,19 @@ +/* + * Copyright (c) 2011 Quantenna Communications, Inc. + * + * Shared datastructure between lhost, MuC and ADM module for CCA measurement + */ + +#ifndef _QTN_CCA_H +#define _QTN_CCA_H + +struct out_cca_info { + u_int64_t start_tsf; + u_int64_t end_tsf; + u_int32_t cnt_pri_cca; + u_int32_t cnt_sec_cca; + u_int32_t cca_sample_cnt; +}; + +#endif // _QTN_CCA_H + diff --git a/package/firmware/quantenna/src/qtn/qtn_config.h b/package/firmware/quantenna/src/qtn/qtn_config.h new file mode 100644 index 000000000..f660f938f --- /dev/null +++ b/package/firmware/quantenna/src/qtn/qtn_config.h @@ -0,0 +1,52 @@ +/*SH1 +******************************************************************************* +** ** +** Copyright (c) 2012 Quantenna Communications, Inc ** +** All Rights Reserved ** +** ** +** Author : Quantenna Communications Inc ** +** File : qtn_config.h ** +** Description : ** +** ** +******************************************************************************* +** ** +** Redistribution and use in source and binary forms, with or without ** +** modification, are permitted provided that the following conditions ** +** are met: ** +** 1. Redistributions of source code must retain the above copyright ** +** notice, this list of conditions and the following disclaimer. ** +** 2. Redistributions in binary form must reproduce the above copyright ** +** notice, this list of conditions and the following disclaimer in the ** +** documentation and/or other materials provided with the distribution. ** +** 3. The name of the author may not be used to endorse or promote products ** +** derived from this software without specific prior written permission. ** +** ** +** Alternatively, this software may be distributed under the terms of the ** +** GNU General Public License ("GPL") version 2, or (at your option) any ** +** later version as published by the Free Software Foundation. ** +** ** +** In the case this software is distributed under the GPL license, ** +** you should have received a copy of the GNU General Public License ** +** along with this software; if not, write to the Free Software ** +** Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ** +** ** +** THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR ** +** IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES** +** OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. ** +** IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, ** +** INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT ** +** NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,** +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ** +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ** +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF ** +** THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ** +** ** +******************************************************************************* +EH1*/ + +#ifndef _QTN_CONFIG_H_ +#define _QTN_CONFIG_H_ + +#define TXBF_6_STA_BF + +#endif /* _QTN_CONFIG_H_ */ diff --git a/package/firmware/quantenna/src/qtn/qtn_debug.h b/package/firmware/quantenna/src/qtn/qtn_debug.h new file mode 100644 index 000000000..d2b6f7a2a --- /dev/null +++ b/package/firmware/quantenna/src/qtn/qtn_debug.h @@ -0,0 +1,244 @@ +/*SH1 +******************************************************************************* +** ** +** Copyright (c) 2008 - 2012 Quantenna Communications, Inc ** +** All Rights Reserved ** +** ** +** Date : 21/03/12 ** +** File : qtn_debug.c ** +** Description : ** +** ** +******************************************************************************* +** ** +** Redistribution and use in source and binary forms, with or without ** +** modification, are permitted provided that the following conditions ** +** are met: ** +** 1. Redistributions of source code must retain the above copyright ** +** notice, this list of conditions and the following disclaimer. ** +** 2. Redistributions in binary form must reproduce the above copyright ** +** notice, this list of conditions and the following disclaimer in the ** +** documentation and/or other materials provided with the distribution. ** +** 3. The name of the author may not be used to endorse or promote products ** +** derived from this software without specific prior written permission. ** +** ** +** Alternatively, this software may be distributed under the terms of the ** +** GNU General Public License ("GPL") version 2, or (at your option) any ** +** later version as published by the Free Software Foundation. ** +** ** +** In the case this software is distributed under the GPL license, ** +** you should have received a copy of the GNU General Public License ** +** along with this software; if not, write to the Free Software ** +** Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ** +** ** +** THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR ** +** IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES** +** OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. ** +** IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, ** +** INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT ** +** NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,** +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ** +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ** +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF ** +** THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ** +** ** +******************************************************************************* +EH1*/ + +#ifndef QTN_DEBUG_H_ +#define QTN_DEBUG_H_ + +/* When set to 1 LHOST formats AuC print output. It is not possible to use %s and %pM +conversion specifiers. Also the number of arguments printed are limited to 8 and therefore +stack size is limited to 32. +When set to 0 AuC formats the output, pass the formatted line to the LHOST that +prints it. */ +#ifdef TOPAZ_PLATFORM + #define AUC_LHOST_PRINT_FORMAT 1 +#else + #define AUC_LHOST_PRINT_FORMAT 0 +#endif +#define PRINT_STACK_SIZE 32 + +#if defined(MUC_BUILD) +#define DBGFN uc_printk +#elif defined(AUC_BUILD) +#define DBGFN auc_os_printf +#else +#define DBGFN printk +#endif + +#ifndef __GNUC__ +#define __FUNCTION__ "" +#endif + +#define DBGFMT "%s: " +#define DBGEFMT "%s: ERROR - " +#define DBGWFMT "%s: WARNING - " +#define DBGARG __func__ +#define DBGMACVAR "%02x:%02x:%02x:%02x:%02x:%02x" +#define DBGMACFMT(a) \ + (a)[0], (a)[1], (a)[2], (a)[3], (a)[4], (a)[5] +#define DBGMACFMT_LE(a) \ + (a)[5], (a)[4], (a)[3], (a)[2], (a)[1], (a)[0] + +#define DBGFMT_BYTEFLD3_P "%u.%u.%u" +#define DBGFMT_BYTEFLD3_V(_v) (_v >> 16) & 0xff, (_v >> 8) & 0xff, _v & 0xff +#define DBGFMT_BYTEFLD4_P "%u.%u.%u.%u" +#define DBGFMT_BYTEFLD4_V(_v) (_v >> 24) & 0xff, (_v >> 16) & 0xff, (_v >> 8) & 0xff, _v & 0xff + +#ifndef BIT +#define BIT(x) (1 << (x)) +#endif + +typedef enum { + DBG_LM_QDRV = 1, + DBG_LM_QPCIE, + DBG_LM_QRADAR, + DBG_LM_QBOOTCFG, + DBG_LM_QADM, + DBG_LM_QWLAN, + DBG_LM_QMACFW, + DBG_LM_MAX +} dbg_log_module; + +typedef const struct +{ + dbg_log_module dbg_module_id; + const char *dbg_module_name; +} dbg_module_table_t; +extern unsigned int g_dbg_log_module; + +#if defined(MUC_BUILD) +extern unsigned int g_dbg_log_level; +extern unsigned int g_dbg_log_func; +#else +extern unsigned int g_dbg_log_level[DBG_LM_MAX]; +extern unsigned int g_dbg_log_func[DBG_LM_MAX]; +#endif +extern dbg_module_table_t dbg_module_name_entry[]; + +#define DBG_LL_EMERG 0 +#define DBG_LL_ALERT 1 +#define DBG_LL_ERR 2 +#define DBG_LL_WARNING 3 +#define DBG_LL_CRIT 4 +#define DBG_LL_NOTICE 5 +#define DBG_LL_INFO 6 +#define DBG_LL_HIDDEN 7 +#define DBG_LL_DEBUG 8 +#define DBG_LL_TRIAL 9 +#define DBG_LL_ALL 10 + +#define DBG_LF_00 0x00000001 +#define DBG_LF_01 0x00000002 +#define DBG_LF_02 0x00000004 +#define DBG_LF_03 0x00000008 +#define DBG_LF_04 0x00000010 +#define DBG_LF_05 0x00000020 +#define DBG_LF_06 0x00000040 +#define DBG_LF_07 0x00000080 +#define DBG_LF_08 0x00000100 +#define DBG_LF_09 0x00000200 +#define DBG_LF_10 0x00000400 +#define DBG_LF_11 0x00000800 +#define DBG_LF_12 0x00001000 +#define DBG_LF_13 0x00002000 +#define DBG_LF_14 0x00004000 +#define DBG_LF_15 0x00008000 +#define DBG_LF_16 0x00010000 +#define DBG_LF_17 0x00020000 +#define DBG_LF_18 0x00040000 +#define DBG_LF_19 0x00080000 +#define DBG_LF_20 0x00100000 +#define DBG_LF_21 0x00200000 +#define DBG_LF_22 0x00400000 +#define DBG_LF_23 0x00800000 +#define DBG_LF_24 0x01000000 +#define DBG_LF_25 0x02000000 +#define DBG_LF_26 0x04000000 +#define DBG_LF_27 0x08000000 +#define DBG_LF_28 0x10000000 +#define DBG_LF_29 0x20000000 +#define DBG_LF_30 0x40000000 +#define DBG_LF_31 0x80000000 +#define DBG_LF_ALL 0xFFFFFFFF + +#define DBG_LOG_FUNC (g_dbg_log_func[DBG_LM - 1]) +#define DBG_LOG_LEVEL (g_dbg_log_level[DBG_LM - 1]) +#define DBG_LOG_FUNC_TEST(flag) (g_dbg_log_func[DBG_LM - 1] & (flag)) + +#if defined(QTN_DEBUG) + +#define DBGPRINTF_RAW(ll, lf, fmt, ...) \ + do { \ + if((g_dbg_log_module & (BIT(DBG_LM - 1))) && \ + (DBG_LOG_LEVEL >= (ll)) && \ + (DBG_LOG_FUNC_TEST(lf))) { \ + DBGFN(fmt, ##__VA_ARGS__); \ + } \ + } while(0) + +#define DBGPRINTF(ll, lf, fmt, ...) \ + do { \ + if((g_dbg_log_module & (BIT(DBG_LM - 1))) && \ + (DBG_LOG_LEVEL >= (ll)) && \ + (DBG_LOG_FUNC_TEST(lf))) { \ + DBGFN(DBGFMT fmt, DBGARG, ##__VA_ARGS__); \ + } \ + } while(0) + +#define DBGPRINTF_E(fmt, ...) \ + do { \ + if (DBG_LOG_LEVEL >= DBG_LL_ERR) \ + DBGFN(DBGEFMT fmt, DBGARG, ##__VA_ARGS__); \ + } while(0) + +#define DBGPRINTF_W(fmt, ...) \ + do { \ + if (DBG_LOG_LEVEL >= DBG_LL_WARNING) \ + DBGFN(DBGWFMT fmt, DBGARG, ##__VA_ARGS__); \ + } while(0) + +#define DBGPRINTF_N(fmt, ...) \ + DBGFN(fmt, ##__VA_ARGS__); + +#define DBGPRINTF_LIMIT_E(fmt, ...) \ + do { \ + if ((DBG_LOG_LEVEL >= DBG_LL_ERR) && (net_ratelimit())) \ + DBGFN(DBGEFMT fmt, DBGARG, ##__VA_ARGS__); \ + } while(0) + +#define DBGPRINTF_LIMIT(ll, lf, fmt, ...) \ + do { \ + if ((g_dbg_log_module & BIT(DBG_LM - 1)) && \ + DBG_LOG_FUNC_TEST(lf) && \ + DBG_LOG_LEVEL >= (ll) && (net_ratelimit())) \ + DBGFN(DBGFMT fmt, DBGARG, ##__VA_ARGS__); \ + } while(0) +#else +#define DBGPRINTF(ll, lf, fmt, args...) +#define DBGPRINTF_E(fmt, args...) +#define DBGPRINTF_W(fmt, args...) +#define DBGPRINTF_LIMIT_E(fmt, args...) +#define DBGPRINTF_LIMIT(ll, lf, fmt, args...) +#endif + +#define HERE(x) do { \ + DBGFN("%s:%d:%s %s = %d 0x%x\n", \ + __FILE__, __LINE__, __FUNCTION__, (#x), \ + (int) (x), (unsigned int) (x)); \ +} while(0) + +#define HERES(x) do { \ + DBGFN("%s:%d:%s %s = '%s'\n", \ + __FILE__, __LINE__, __FUNCTION__, (#x), (x)); \ +} while(0) + +#define HERE_REG(addr) do { \ + DBGFN("%s:%d:%s reg 0x%08lx = 0x%08lx (%s)\n", \ + __FILE__, __LINE__, __FUNCTION__, \ + (unsigned long) (addr), \ + (unsigned long) readl(addr), (#addr)); \ +} while(0) + +#endif /* QTN_DEBUG_H_ */ diff --git a/package/firmware/quantenna/src/qtn/qtn_uc_comm.h b/package/firmware/quantenna/src/qtn/qtn_uc_comm.h new file mode 100644 index 000000000..9f114827e --- /dev/null +++ b/package/firmware/quantenna/src/qtn/qtn_uc_comm.h @@ -0,0 +1,27 @@ +/* + * Copyright (c) 2012 Quantenna Communications, Inc. + */ + +#ifndef _QTN_UC_COMM_H +#define _QTN_UC_COMM_H + +#define MAC_UNITS 1 + +#if defined(TOPAZ_PLATFORM) && defined(TOPAZ_128_NODE_MODE) +#define QTN_NCIDX_MAX 128 +#define QTN_NODE_TBL_SIZE_LHOST 118 +#define QTN_NODETID_NODE_SHIFT 7 +#else +#define QTN_NCIDX_MAX 64 +#define QTN_NODE_TBL_SIZE_LHOST 56 +#define QTN_NODETID_NODE_SHIFT 6 +#endif +#define QTN_MAX_BSS_VAPS 8 +#define QTN_MAX_WDS_VAPS 8 +#define QTN_MAX_VAPS ((QTN_MAX_BSS_VAPS) + (QTN_MAX_WDS_VAPS)) +#define QTN_NODE_TBL_MUC_HEADRM 3 /* Allow for delayed delete on MUC */ +#define QTN_NODE_TBL_SIZE_MUC ((QTN_NODE_TBL_SIZE_LHOST) + (QTN_NODE_TBL_MUC_HEADRM)) +#define QTN_ASSOC_LIMIT ((QTN_NODE_TBL_SIZE_LHOST) - (QTN_MAX_VAPS)) + +#endif // #ifndef _QTN_UC_COMM_H + diff --git a/package/firmware/quantenna/src/qtn/qtn_vlan.h b/package/firmware/quantenna/src/qtn/qtn_vlan.h new file mode 100644 index 000000000..dd653d35c --- /dev/null +++ b/package/firmware/quantenna/src/qtn/qtn_vlan.h @@ -0,0 +1,128 @@ +/* + * Copyright (c) 2014 Quantenna Communications, Inc. + * All rights reserved. + */ + +#ifndef _QTN_VLAN_H_ +#define _QTN_VLAN_H_ + +#include "../common/ruby_mem.h" +#include +#include + +#define QVLAN_MODE_PTHRU 0 +#define QVLAN_MODE_MBSS 1 +#define QVLAN_MODE_DYNAMIC 2 +#define QVLAN_MODE_MAX (QVLAN_MODE_DYNAMIC) +#define QVLAN_SHIFT_MODE 16 +#define QVLAN_MASK_MODE 0xffff0000 +#define QVLAN_MASK_VID 0x00000fff + +#define QVLAN_MODE(x) (uint16_t)((x) >> QVLAN_SHIFT_MODE) +#define QVLAN_VID(x) (uint16_t)((x) & QVLAN_MASK_VID) + +#define QVLAN_CMD_PTHRU 0 +#define QVLAN_CMD_UNPTHRU 1 +#define QVLAN_CMD_PTHRU_ALL 2 +#define QVLAN_CMD_UNPTHRU_ALL 3 +#define QVLAN_CMD_BIND 4 +#define QVLAN_CMD_UNBIND 5 +#define QVLAN_CMD_ENABLE 6 +#define QVLAN_CMD_DISABLE 7 +#define QVLAN_CMD_DYNAMIC 8 +#define QVLAN_CMD_UNDYNAMIC 9 + +#define QVLAN_MODE_STR_BIND "MBSS (Access) mode" +#define QVLAN_MODE_STR_PTHRU "Passthrough (Trunk) mode" +#define QVLAN_MODE_STR_DYNAMIC "Dynamic mode" + +/* default port vlan id */ +#define QVLAN_DEF_PVID 1 + +#define QVLAN_VID_MAX 4096 +#define QVLAN_VID_MAX_S 12 +#define QVLAN_VID_ALL 0xffff + +struct qtn_vlan_config { + uint32_t vlan_cfg; + uint8_t vlan_bitmap[QVLAN_VID_MAX / 7 + 1]; +}; + +/* +* VLAN forward/drop table +*| traffic direction | frame | Access(MBSS/Dynamic mode) | Trunk(Passthrough mode) +*|-------------------------------------------------------------------------------------------------------------- +*| wifi tx | no vlan | drop | forward +*|-------------------------------------------------------------------------------------------------------------- +*| | vlan tagged | compare tag with PVID: | compare tag against VID list +*| | | 1.equal:untag and forward | 1.Found:forward +*| | | 2.not equal:drop | 2.Not found:drop +*|-------------------------------------------------------------------------------------------------------------- +*| wifi rx | no vlan | Add PVID tag and forward | forward +*|-------------------------------------------------------------------------------------------------------------- +*| | vlan tagged | Compare tag with PVID: | compare tag against VID list +*| | | 1.equal:forward | 1. Found:forward +*| | | 2.not equal:drop | 2. Not found:drop +*|-------------------------------------------------------------------------------------------------------------- +*/ + +#define QVLAN_BYTES_PER_VID ((QTN_MAX_BSS_VAPS + NBBY - 1) / NBBY) +#define QVLAN_BYTES_PER_VID_SHIFT 0 + +RUBY_INLINE int +qtn_vlan_is_valid(int vid) +{ + return (vid >= 0 && vid < QVLAN_VID_MAX); +} + +RUBY_INLINE int +qtn_vlan_is_allowed(volatile uint8_t *vlan_bitmap, uint16_t vid, uint8_t vapid) +{ + return !!(vlan_bitmap[(vid << QVLAN_BYTES_PER_VID_SHIFT) + (vapid >> 3)] & BIT(vapid & (8 - 1))); +} + +RUBY_INLINE void +qtn_vlan_allow(uint8_t *vlan_bitmap, uint16_t vid, uint8_t vapid) +{ + vlan_bitmap[(vid << QVLAN_BYTES_PER_VID_SHIFT) + (vapid >> 3)] |= BIT(vapid & (8 - 1)); +} + +RUBY_INLINE void +qtn_vlan_disallow(uint8_t *vlan_bitmap, uint16_t vid, uint8_t vapid) +{ + vlan_bitmap[(vid << QVLAN_BYTES_PER_VID_SHIFT) + (vapid >> 3)] &= ~BIT(vapid & (8 - 1)); +} + +RUBY_INLINE void +qtn_vlan_gen_group_addr(uint8_t *mac, uint16_t vid, uint8_t vapid) +{ + uint16_t encode; + + mac[0] = 0xff; + mac[1] = 0xff; + mac[2] = 0xff; + mac[3] = 0xff; + + encode = ((uint16_t)vapid << QVLAN_VID_MAX_S) | vid; + mac[4] = encode >> 8; + mac[5] = (uint8_t)(encode & 0xff); +} + +RUBY_INLINE int +qtn_vlan_is_group_addr(const uint8_t *mac) +{ + return (mac[0] == 0xff && mac[1] == 0xff + && mac[2] == 0xff && mac[3] == 0xff + && mac[4] != 0xff); +} + +RUBY_INLINE int +qtn_vlancfg_reform(struct qtn_vlan_config *vcfg) +{ + /* remove 0,15,16,31 bits to restore vlan_cfg */ + vcfg->vlan_cfg &= 0x7ffe7ffe; + vcfg->vlan_cfg >>= 1; + + return ((vcfg->vlan_cfg & QVLAN_MASK_MODE) >> QVLAN_SHIFT_MODE); +} +#endif diff --git a/package/firmware/quantenna/src/qtn/qtn_wmm_ac.h b/package/firmware/quantenna/src/qtn/qtn_wmm_ac.h new file mode 100644 index 000000000..a2b12a006 --- /dev/null +++ b/package/firmware/quantenna/src/qtn/qtn_wmm_ac.h @@ -0,0 +1,74 @@ +/* + * Copyright (c) 2013 Quantenna Communications, Inc. + */ + +#ifndef _QTN_WMM_AC_H +#define _QTN_WMM_AC_H + +#define WMM_AC_BE 0 +#define WMM_AC_BK 1 +#define WMM_AC_VI 2 +#define WMM_AC_VO 3 +#define WMM_AC_NUM 4 +#define QTN_AC_MGMT WMM_AC_VO +#define WMM_AC_INVALID WMM_AC_NUM + +#define QTN_AC_ORDER { WMM_AC_VO, WMM_AC_VI, WMM_AC_BE, WMM_AC_BK } + +#define QTN_TID_BE 0 +#define QTN_TID_BK 1 +#define QTN_TID_2 2 +#define QTN_TID_3 3 +#define QTN_TID_WLAN 4 /* 802.11 encap'ed data from wlan driver */ +#define QTN_TID_VI 5 +#define QTN_TID_VO 6 +#define QTN_TID_MGMT 7 +#define QTN_TID_IS_80211(tid) ((tid == QTN_TID_MGMT) || (tid == QTN_TID_WLAN)) + +#define QTN_TID_ORDER { \ + QTN_TID_MGMT, \ + QTN_TID_WLAN, \ + QTN_TID_VO, \ + QTN_TID_VI, \ + QTN_TID_BE, \ + QTN_TID_BK \ +} + +#define QTN_TID_ORDER_DATA { \ + QTN_TID_VO, \ + QTN_TID_VI, \ + QTN_TID_BE, \ + QTN_TID_BK \ +} + +#define QTN_TID_ORDER_POLL { \ + QTN_TID_VO, \ + QTN_TID_VI, \ + QTN_TID_BE, \ + QTN_TID_BK, \ + QTN_TID_WLAN, \ + QTN_TID_MGMT \ +} + +#define WMM_AC_TO_TID(_ac) ( \ + (_ac == WMM_AC_VO) ? QTN_TID_VO : \ + (_ac == WMM_AC_VI) ? QTN_TID_VI : \ + (_ac == WMM_AC_BK) ? QTN_TID_BK : \ + QTN_TID_BE) + +#define TID_TO_WMM_AC(_tid) ( \ + (_tid == QTN_TID_BK) ? WMM_AC_BK : \ + (_tid == QTN_TID_VI) ? WMM_AC_VI : \ + (_tid == QTN_TID_VO) ? WMM_AC_VO : \ + (_tid == QTN_TID_WLAN) ? QTN_AC_MGMT : \ + (_tid == QTN_TID_MGMT) ? QTN_AC_MGMT : \ + WMM_AC_BE) + +#define QTN_TID_COLLAPSE(_tid) WMM_AC_TO_TID(TID_TO_WMM_AC(_tid)) + +#define AC_TO_QTN_QNUM(_ac) \ + (((_ac) == WME_AC_BE) ? 1 : \ + ((_ac) == WME_AC_BK) ? 0 : \ + (_ac)) + +#endif /* _QTN_WMM_AC_H */ diff --git a/package/firmware/quantenna/src/qtn/qvsp_common.h b/package/firmware/quantenna/src/qtn/qvsp_common.h new file mode 100644 index 000000000..2dc41dd04 --- /dev/null +++ b/package/firmware/quantenna/src/qtn/qvsp_common.h @@ -0,0 +1,36 @@ +/* +******************************************************************************* +** ** +** Copyright (c) 2012 Quantenna Communications Inc ** +** All Rights Reserved ** +** ** +** Author : Quantenna Communications, Inc. ** +** File : qvsp_common.h ** +** Description : Video Screen Protection ** +** ** +******************************************************************************* +*/ + +#ifndef _QVSP_COMMON_H_ +#define _QVSP_COMMON_H_ + +/* + * Default stream airtime cost in msec per sec to send or receive at 8 Mbps. + * Constants are binary for efficiency and do not need to be accurate. They only need to + * scale so that stream cost roughly equates to used airtime, in order to estimate the + * affect of disabling or re-enabling a stream. + */ +#define BYTES_PER_KIB (1024) /* Kibibytes */ +#define BYTES_PER_MIB (1024 * 1024) /* Mebibytes */ +#define QVSP_STRM_COST_UNIT_MIB (8) /* arbitrary (optimised) cost unit */ +#define QVSP_STRM_COST_UNIT_BYTES (QVSP_STRM_COST_UNIT_MIB * BYTES_PER_MIB) +#define QVSP_NODE_COST_DFLT (1000) + +struct qtn_per_tid_stats { + uint32_t tx_throt_pkts; + uint32_t tx_throt_bytes; + uint32_t tx_sent_pkts; + uint32_t tx_sent_bytes; +}; + +#endif diff --git a/package/firmware/quantenna/src/qtn/qvsp_data.h b/package/firmware/quantenna/src/qtn/qvsp_data.h new file mode 100644 index 000000000..4fad0c641 --- /dev/null +++ b/package/firmware/quantenna/src/qtn/qvsp_data.h @@ -0,0 +1,641 @@ +/*SH0 +******************************************************************************* +** ** +** Copyright (c) 2012-2013 Quantenna Communications, Inc. ** +** All Rights Reserved ** +** ** +** File : qvsp_data.h ** +** Description : Video Stream Protection ** +** ** +******************************************************************************* +EH0*/ + +#ifndef __QTN_QVSP_DATA_H__ +#define __QTN_QVSP_DATA_H__ + +#include +#include +#if defined(__KERNEL__) +#include "compat.h" +#include +#elif defined(MUC_BUILD) +#else +#include +#include +#define MSEC_PER_SEC 1000L +#endif + +/* + * Minimum rate at which to calculate node cost. + * If throughput is not sufficiently high, only small aggregates get transmitted which gives an + * artificially high and noisy node cost estimate. + * The threshold should be lower than QVSP_CFG_STRM_DISABLED_MAX, so that node cost continues to + * be updated when streams are disabled. + */ +#define QVSP_MIN_NODE_KBPS_UPDATE_DFLT 480 +#define QVSP_STRM_DISABLED_MAX_DFLT (QVSP_MIN_NODE_KBPS_UPDATE_DFLT + 20) + +/* Log levels */ +#define LL_0 0x00 +#define LL_1 0x01 +#define LL_2 0x02 +#define LL_3 0x03 +#define LL_4 0x04 +#define LL_5 0x05 +#define LL_6 0x06 +#define LL_7 0x07 +#define LL_8 0x08 +#define LL_9 0x09 + +enum qvsp_ioctl_state { + QVSP_STATE_FAT, + QVSP_STATE_FAT_AVAIL, + QVSP_STATE_FAT_INTF, + QVSP_STATE_STRM_TOT, + QVSP_STATE_STRM_QTN, + QVSP_STATE_STRM_ENA, + QVSP_STATE_STRM_DIS, + QVSP_STATE_STRM_DMT, + QVSP_STATE_READ_MAX, + QVSP_STATE_RESET, + QVSP_STATE_TEST_FAT, + QVSP_STATE_ALL_MAX +}; + +#ifndef DOXYGEN_EXCLUDE + +/* + * Restrictions: + * this structure must be kept in sync with qvsp_cfg_params and qvspdoc_enumstr_cfg + * _AC[0-3] fields must follow the 'global' equivalent (for macro assumptions) + */ +enum qvsp_cfg_param_e { + QVSP_CFG_ENABLED, + QVSP_CFG_ENABLED_ALWAYS, + QVSP_CFG_FAT_MIN, + QVSP_CFG_FAT_MIN_SOFT, + QVSP_CFG_FAT_MIN_SOFT_CONSEC, + QVSP_CFG_FAT_MIN_SAFE, + QVSP_CFG_FAT_MIN_CHECK_INTV, + QVSP_CFG_FAT_MAX_SOFT, + QVSP_CFG_FAT_MAX_SOFT_CONSEC, + QVSP_CFG_FAT_MAX_SAFE, + QVSP_CFG_FAT_MAX_CHECK_INTV, + QVSP_CFG_NODE_DATA_MIN, + QVSP_CFG_DISABLE_DEMOTE, + QVSP_CFG_DISABLE_DEMOTE_FIX_FAT, + QVSP_CFG_DISABLE_WAIT, + QVSP_CFG_DISABLE_PER_EVENT_MAX, + QVSP_CFG_ENABLE_WAIT, + QVSP_CFG_ENABLE_PER_EVENT_MAX, + QVSP_CFG_STRM_RMT_DIS_TCP, + QVSP_CFG_STRM_RMT_DIS_UDP, + QVSP_CFG_STRM_TPUT_MIN, + QVSP_CFG_STRM_DISABLED_MAX, + QVSP_CFG_STRM_ADPT_THROT, + QVSP_CFG_STRM_ADPT_THROT_STEP, + QVSP_CFG_STRM_ADPT_THROT_MARGIN, + QVSP_CFG_STRM_TPUT_SMPL_MIN, + QVSP_CFG_STRM_COST_RC_ADJUST, + QVSP_CFG_STRM_MAX, + QVSP_CFG_STRM_MAX_AC0, + QVSP_CFG_STRM_MAX_AC1, + QVSP_CFG_STRM_MAX_AC2, + QVSP_CFG_STRM_MAX_AC3, + QVSP_CFG_STRM_MIN, + QVSP_CFG_STRM_MIN_AC0, + QVSP_CFG_STRM_MIN_AC1, + QVSP_CFG_STRM_MIN_AC2, + QVSP_CFG_STRM_MIN_AC3, + QVSP_CFG_STRM_TPUT_MAX_TCP, + QVSP_CFG_STRM_TPUT_MAX_FIRST = QVSP_CFG_STRM_TPUT_MAX_TCP, + QVSP_CFG_STRM_TPUT_MAX_TCP_AC0, + QVSP_CFG_STRM_TPUT_MAX_TCP_AC1, + QVSP_CFG_STRM_TPUT_MAX_TCP_AC2, + QVSP_CFG_STRM_TPUT_MAX_TCP_AC3, + QVSP_CFG_STRM_TPUT_MAX_UDP, + QVSP_CFG_STRM_TPUT_MAX_UDP_AC0, + QVSP_CFG_STRM_TPUT_MAX_UDP_AC1, + QVSP_CFG_STRM_TPUT_MAX_UDP_AC2, + QVSP_CFG_STRM_TPUT_MAX_UDP_AC3, + QVSP_CFG_STRM_TPUT_MAX_LAST = QVSP_CFG_STRM_TPUT_MAX_UDP_AC3, + QVSP_CFG_STRM_ENABLE_WAIT, + QVSP_CFG_STRM_AGE_MAX, + QVSP_CFG_AGE_CHK_INTV, + QVSP_CFG_3RDPT_CTL, + QVSP_CFG_3RDPT_LOCAL_THROT, + QVSP_CFG_3RDPT_QTN, /* treat qtn client as 3rd party client, debug use only */ + QVSP_CFG_BA_THROT_INTV, + QVSP_CFG_BA_THROT_DUR_MIN, + QVSP_CFG_BA_THROT_DUR_STEP, + QVSP_CFG_BA_THROT_WINSIZE_MIN, + QVSP_CFG_BA_THROT_WINSIZE_MAX, + QVSP_CFG_WME_THROT_AC, + QVSP_CFG_WME_THROT_AIFSN, + QVSP_CFG_WME_THROT_ECWMIN, + QVSP_CFG_WME_THROT_ECWMAX, + QVSP_CFG_WME_THROT_TXOPLIMIT, + QVSP_CFG_WME_THROT_THRSH_DISABLED, + QVSP_CFG_WME_THROT_THRSH_VICTIM, + QVSP_CFG_EVENT_LOG_LVL, + QVSP_CFG_DEBUG_LOG_LVL, + QVSP_CFG_MAX, +}; + +struct qvsp_cfg_param { + const char *name; + const char *desc; + const char *units; + uint32_t default_val; + uint32_t min_val; + uint32_t max_val; +}; + +#define QVSP_CFG_PARAMS { \ + { "enabled", "QTM enabled", "number", 0, 0, 1}, \ + { "enabled_always", "QTM enabled when no QTM peers", "number", 0, 0, 1}, \ + { "fat_min", "Min free airtime", "msps", 100, 1, 1000 }, \ + { "fat_min_soft", "Soft min free airtime", "msps", 170, 1, 1000 }, \ + { "fat_min_soft_consec","Consecutive soft min free airtime", "number", 3, 1, 255 }, \ + { "fat_min_safe", "Safe min free airtime", "msps", 200, 1, 1000 }, \ + { "fat_min_check_intv", "Oversubscription check interval", "ms", 2000, 100, 60000 },\ + { "fat_max_soft", "Soft max free airtime", "msps", 350, 1, 1000 }, \ + { "fat_max_soft_consec","Consecutive soft max free airtime", "number", 5, 1, 255 }, \ + { "fat_max_safe", "Safe max free airtime", "msps", 250, 1, 1000 }, \ + { "fat_max_check_intv", "Undersubscription check interval", "ms", 2000, 100, 86400000 },\ + { "node_data_min", "Min data for node cost update", "Kbps", \ + QVSP_MIN_NODE_KBPS_UPDATE_DFLT, 1, 10000 },\ + { "disable_demote", "Demote stream to disable", "number", 1, 0, 1 }, \ + { "disable_demote_fat_fix", "Adjust FAT when demoting streams",\ + "number", 0, 0, 1 }, \ + { "disable_wait", "Min re-disable wait time", "secs", 3, 1, 86400 },\ + { "disable_event_max", "Max streams disabled per event", "number", 1, 1, 256 }, \ + { "enable_wait", "Min re-enable wait time", "secs", 15, 1, 86400 },\ + { "enable_event_max", "Max streams enabled per event", "number", 1, 1, 256 }, \ + { "rmt_disable_tcp", "Disable Rx TCP streams at STA", "number", 1, 0, 1 }, \ + { "rmt_disable_udp", "Disable Rx UDP streams at STA", "number", 1, 0, 1 }, \ + { "strm_tput_min", "Min throughput for a real stream", "Kbps", 1000, 1, 10000 },\ + { "strm_disabled_max", "Max throughput when disabled", "Kbps", \ + QVSP_STRM_DISABLED_MAX_DFLT, 20, 10000 },\ + { "strm_adpt_throt", "Adaptive throttling enabled", "number", 1, 0, 1 }, \ + { "strm_adpt_throt_step", "Adaptive throttling cost step", \ + "percent", 40, 1, 100 },\ + { "strm_adpt_throt_margin", "Adaptive throttling margin", \ + "Kbps", 10000, 0, 100000 },\ + { "strm_tput_smpl_min", "Min throughput sampling ms", "ms", 20, 1, 1000 },\ + { "strm_cost_rc_adjust","Adjust stream cost for rate change", "number", 1, 0, 1 },\ + { "strm_max", "Max streams", "cnt", 256, 1, 256 }, \ + { "strm_max_ac0", "Max streams for AC 0", "cnt", 0, 0, 256 }, \ + { "strm_max_ac1", "Max streams for AC 1", "cnt", 0, 0, 256 }, \ + { "strm_max_ac2", "Max streams for AC 2", "cnt", 0, 0, 256 }, \ + { "strm_max_ac3", "Max streams for AC 3", "cnt", 0, 0, 256 }, \ + { "strm_min", "Min streams", "cnt", 1, 1, 1000 }, \ + { "strm_min_ac0", "Min streams for AC 0", "cnt", 0, 1, 1000 }, \ + { "strm_min_ac1", "Min streams for AC 1", "cnt", 0, 1, 1000 }, \ + { "strm_min_ac2", "Min streams for AC 2", "cnt", 0, 1, 1000 }, \ + { "strm_min_ac3", "Min streams for AC 3", "cnt", 0, 1, 1000 }, \ + { "strm_tput_max_tcp", "Max stream throughput for TCP", "Mbps", 0, 0, 10000 },\ + { "strm_tput_max_tcp_ac0","Max stream throughput for TCP AC 0", "Mbps", 0, 0, 10000 },\ + { "strm_tput_max_tcp_ac1","Max stream throughput for TCP AC 1", "Mbps", 0, 0, 10000 },\ + { "strm_tput_max_tcp_ac2","Max stream throughput for TCP AC 2", "Mbps", 0, 0, 10000 },\ + { "strm_tput_max_tcp_ac3","Max stream throughput for TCP AC 3", "Mbps", 0, 0, 10000 },\ + { "strm_tput_max_udp", "Max stream throughput for UDP", "Mbps", 0, 0, 10000 },\ + { "strm_tput_max_udp_ac0","Max stream throughput for UDP AC 0", "Mbps", 0, 0, 10000 },\ + { "strm_tput_max_udp_ac1","Max stream throughput for UDP AC 1", "Mbps", 0, 0, 10000 },\ + { "strm_tput_max_udp_ac2","Max stream throughput for UDP AC 2", "Mbps", 0, 0, 10000 },\ + { "strm_tput_max_udp_ac3","Max stream throughput for UDP AC 3", "Mbps", 0, 0, 10000 },\ + { "strm_enable_wait", "Min stream re-enable wait time", "secs", 30, 1, 86400 },\ + { "strm_age_max", "Max stream age", "secs", 5, 1, 86400 },\ + { "age_check_intv", "Age check interval", "secs", 10, 1, 86400 },\ + { "3rd_party_ctl", "Enable 3rd party client control", "number", 0, 0, 1 }, \ + { "3rd_party_local_throt", "Throttling 3rd party client packet also in local",\ + "number", 0, 0, 1 }, \ + { "3rd_party_qtn", "Treat qtn client as 3rd party client", "number", 0, 0, 1 }, \ + { "ba_throt_intv", "BA throttling interval", "ms", 1000, 0, 10000 },\ + { "ba_throt_dur_min", "BA throttling min duration", "ms", 50, 0, 10000 },\ + { "ba_throt_dur_step", "BA throttling duration step", "ms", 100, 50, 10000 },\ + { "ba_throt_winsize_min", "BA throttling min winsize", "number", 1, 0, 256 },\ + { "ba_throt_winsize_max", "BA throttling max winsize", "number", 16, 1, 256 },\ + { "wme_throt_ac", "WME throttling AC bitmap", "number", 3, 0, 15 },\ + { "wme_throt_aifsn", "WME throttling AIFSN", "number", 15, 0, 15 },\ + { "wme_throt_ecwmin", "WME throttling encoded cwmin", "number", 14, 1, 14 },\ + { "wme_throt_ecwmax", "WME throttling encoded cwmax", "number", 15, 1, 15 },\ + { "wme_throt_txoplimit","WME throttling TXOP limit", "number", 0, 0, 65535 },\ + { "wme_throt_thrsh_disabled", "WME throttling disabled stream cost threshold",\ + "number", 150, 0, 1000 },\ + { "wme_throt_thrsh_victim", "WME throttling victim stream cost threshold",\ + "number", 150, 0, 1000 },\ + { "event_level", "Event log level", "number", LL_0, LL_0, LL_9 },\ + { "debug_level", "Debug log level", "number", LL_3, LL_0, LL_9 },\ +} + +/* Must be in sync with call_qcsapi_vsp_if_desc */ +enum qvsp_if_e { + QVSP_IF_ETH_RX, + QVSP_IF_QDRV_TX, + QVSP_IF_QDRV_RX, + QVSP_IF_PCIE_RX, + QVSP_IF_MAX +}; + +#define QVSP_IF_DESCS { \ + "eth_rx", \ + "qdrv_tx", \ + "qdrv_rx", \ + "pcie_rx", \ + "invalid" \ +} + +/* + * These must be kept in sync with QVSP_STRM_THROT_DESCS and QVSP_STRM_THROT_DESCS_ABBR. + */ +enum qvsp_strm_throt_policy { + QVSP_STRM_THROT_NONE = 0, + QVSP_STRM_THROT_BINARY = 1, + QVSP_STRM_THROT_ADPT = 2, + QVSP_STRM_THROT_MAX, +}; + +#define QVSP_STRM_THROT_DESCS { \ + "None", \ + "Binary", \ + "Adaptive", \ +} + +#define QVSP_STRM_THROT_DESCS_ABBR { \ + "N/A", \ + "BIN", \ + "ADP", \ +} + +enum qvsp_rule_dir_e { + QVSP_RULE_DIR_ANY, + QVSP_RULE_DIR_TX, + QVSP_RULE_DIR_RX, +}; + +#define QVSP_RULE_DIR_DESCS { \ + "Any", \ + "Tx", \ + "Rx", \ +} + +enum qvsp_rule_param_e { + QVSP_RULE_PARAM_DIR, + QVSP_RULE_PARAM_VAPPRI, + QVSP_RULE_PARAM_AC, + QVSP_RULE_PARAM_PROTOCOL, + QVSP_RULE_PARAM_TPUT_MIN, + QVSP_RULE_PARAM_TPUT_MAX, + QVSP_RULE_PARAM_COST_MIN, + QVSP_RULE_PARAM_COST_MAX, + QVSP_RULE_PARAM_ORDER, + QVSP_RULE_PARAM_THROT_POLICY, + QVSP_RULE_PARAM_DEMOTE, + QVSP_RULE_PARAM_MAX, +}; + +struct qvsp_rule_param { + const char *name; + const char *desc; + const char *units; + uint32_t min_val; + uint32_t max_val; +}; + +#define QVSP_RULE_PARAMS { \ + { "dir", "Direction", "val", 0, 2 }, \ + { "vappri", "VAP Priority", "bitmap", 0x1, 0xf }, \ + { "ac", "Access Classes", "bitmap", 0x1, 0xf }, \ + { "protocol", "IP protocol - TCP(6) or UDP(17)", "val", 6, 17 }, \ + { "tp_min", "Min throughput", "Mbps", 1, 10000 }, \ + { "tp_max", "Max throughput", "Mbps", 1, 10000 }, \ + { "cost_min", "Cost min", "msps", 1, 1000 }, \ + { "cost_max", "Cost max", "msps", 1, 1000 }, \ + { "order", "Match order", "val", 0, QVSP_RULE_ORDER_MAX - 1 },\ + { "throt_policy", "Throttling policy - binary(1) or adaptive(2)", \ + "val", 1, QVSP_STRM_THROT_MAX - 1 },\ + { "demote", "Demote stream", "val", 0, 1}, \ +} + +/* + * These must be kept in sync with QVSP_RULE_ORDER_DESCS and QVSP_RULE_ORDER_DESCS_ABBR. + */ +enum qvsp_rule_order_e { + QVSP_RULE_ORDER_GREATEST_COST_NODE, + QVSP_RULE_ORDER_LEAST_COST_NODE, + QVSP_RULE_ORDER_GREATEST_NODE_INV_PHY_RATE, + QVSP_RULE_ORDER_LEAST_NODE_INV_PHY_RATE, + QVSP_RULE_ORDER_GREATEST_COST_STREAM, + QVSP_RULE_ORDER_LEAST_COST_STREAM, + QVSP_RULE_ORDER_NEWEST, + QVSP_RULE_ORDER_OLDEST, + QVSP_RULE_ORDER_LOWEST_TPUT, + QVSP_RULE_ORDER_HIGHEST_TPUT, + QVSP_RULE_ORDER_MAX +}; + +#define QVSP_RULE_ORDER_DESCS { \ + "greatest cost node first", \ + "least cost node first", \ + "greatest inverse PHY rate node first", \ + "least inverse PHY rate node first", \ + "greatest cost stream first", \ + "least cost stream first", \ + "newest first", \ + "oldest first", \ + "lowest throughput first", \ + "highest throughput first", \ +} + +#define QVSP_RULE_ORDER_DESCS_ABBR { \ + "GCN", \ + "LCN", \ + "GIPR", \ + "LIPR", \ + "GCS", \ + "LCS", \ + "NS", \ + "OS", \ + "LT", \ + "HT", \ +} + +enum qvsp_strm_state_e { + QVSP_STRM_STATE_NONE, + QVSP_STRM_STATE_DISABLED, + QVSP_STRM_STATE_LOW_TPUT, + QVSP_STRM_STATE_PRE_ENABLED, + QVSP_STRM_STATE_ENABLED, + QVSP_STRM_STATE_DELETED, + QVSP_STRM_STATE_MAX +}; + +enum qvsp_hairpin_e { + QVSP_HAIRPIN_NONE, + QVSP_HAIRPIN_UCAST, + QVSP_HAIRPIN_MCAST, +}; + +#define QVSP_RULE_DIR_DESCS { \ + "Any", \ + "Tx", \ + "Rx", \ +} + +/* This definition must be kept in sync with the qvsp_ext_s struct */ +#define QVSP_INACTIVE_REASON { \ + "Config", \ + "WDS", \ + "CoC" \ +} + +#define QVSP_3RDPT_STR "3" + +#ifndef MUC_BUILD + +/** \addtogroup vsp_group + * @{ + */ + +/** + * Defines a stream based on source and destination + */ +struct qvsp_hash_flds_ipv4 { + /** IP source address */ + __be32 saddr; + + /** IP destination address */ + __be32 daddr; + + /** UDP/TCP source port */ + __be16 sport; + + /** UDP/TCP destination port */ + __be16 dport; +}; + +struct qvsp_hash_flds_ipv6 { + /** IP source address */ + struct in6_addr saddr; + + /** IP destination address */ + struct in6_addr daddr; + + /** UDP/TCP source port */ + __be16 sport; + + /** UDP/TCP destination port */ + __be16 dport; +}; + +union qvsp_hash_flds { + struct qvsp_hash_flds_ipv4 ipv4; + struct qvsp_hash_flds_ipv6 ipv6; +}; + +/** + * Whitelist definition. Passing streams are compared with + * the stream defined in 'hflds', ANDed with netmasks + */ +struct qvsp_wl_flds { + union qvsp_hash_flds hflds; + + /** IP source CIDR bitcount */ + uint8_t s_cidr_bits; + + /** IP destination CIDR bitcount */ + uint8_t d_cidr_bits; + + /** IP version */ + uint8_t ip_version; +}; + +/** + * IPv4 whitelist tricks for netmask; store netmasks in the hashfield union + */ +static inline __be32 * qvsp_wl_ipv4_netmask_src(struct qvsp_wl_flds *wl) +{ + struct qvsp_hash_flds_ipv4 *ipv4 = &wl->hflds.ipv4; + return (__be32 *)&ipv4[1]; +} + +static inline __be32 * qvsp_wl_ipv4_netmask_dst(struct qvsp_wl_flds *wl) +{ + return &(qvsp_wl_ipv4_netmask_src(wl))[1]; +} + +struct qvsp_rule_flds { + uint32_t param[QVSP_RULE_PARAM_MAX]; +}; + +struct qvsp_strm_stats { + unsigned long first_ref; + uint32_t pkts; + uint32_t bytes; + uint32_t bytes_sent; + uint32_t pkts_sent; +}; + +struct qvsp_stats_if { + uint32_t strm_add; + uint32_t strm_none; + uint32_t pkt_chk; + uint32_t pkt_tcp; + uint32_t pkt_udp; + uint32_t pkt_other; + uint32_t pkt_ignore; + uint32_t pkt_sent; + uint32_t pkt_drop_throttle; + uint32_t pkt_drop_disabled; + uint32_t pkt_demoted; + uint32_t pkt_frag_found; + uint32_t pkt_frag_not_found; +}; + +struct qvsp_stats { + uint32_t is_qtm; /* 0: VSP or 1: QTM */ + uint32_t strm_enable; + uint32_t strm_disable; + uint32_t strm_disable_remote; + uint32_t strm_reenable; + uint32_t fat_over; + uint32_t fat_under; + uint32_t fat_chk_disable; + uint32_t fat_chk_reenable; + uint32_t fat_chk_squeeze; + uint32_t fat_chk_loosen; + struct qvsp_stats_if stats_if[QVSP_IF_MAX]; +}; + +struct qvsp_strm_info { + union qvsp_hash_flds hash_flds; + uint16_t node_idx; + uint8_t node_mac[6]; + uint8_t vap_pri; + uint8_t tid; + uint16_t hairpin_id; + uint16_t hairpin_type; + uint8_t ip_version; + uint8_t ip_proto; + uint8_t ac_in; + uint8_t ac_out; + uint8_t strm_state; + uint8_t disable_remote; + uint8_t is_3rdpt_udp_us; + uint16_t last_ref_secs; + uint32_t ni_inv_phy_rate; + uint32_t phy_rate_disabled; + uint32_t bytes_max; + uint32_t ni_cost; + uint16_t cost_current; + uint16_t cost_max; + uint8_t hash; + uint8_t dir; + uint32_t throt_policy; + uint32_t throt_rate; + uint32_t demote_rule; + /* current state, might be different from demote_rule when recovering */ + uint32_t demote_state; + struct qvsp_strm_stats prev_stats; +}; + +/** @}*/ + +#endif /* MUC_BUILD */ + +/* + * Convert kilobits (Kb) to bytes + */ +static __inline__ uint32_t +qvsp_kbit2b(uint32_t kbps) +{ + return kbps * 1000 / NBBY; +} + +/* + * Convert bytes to kilobits (Kb) + */ +static __inline__ uint32_t +qvsp_b2kbit(uint32_t bytes) +{ + return bytes * NBBY / 1000; +} + +/* + * Convert bytes over an interval into to kilobits per second + */ +static __inline__ uint32_t +qvsp_b2kbitps(uint32_t bytes, unsigned long interval) +{ + /* bytes * NBBY / 1000 / 1000 * interval */ + return bytes * NBBY / interval; +} + +/* + * Convert bytes to megabits (Mb) + */ +static __inline__ uint32_t +qvsp_b2mbit(uint32_t bytes) +{ + return bytes * NBBY / 1000000; +} + +/* + * Convert inverse PHY rate to PHY rate + */ +static __inline__ uint32_t +qvsp_inv2phy(uint32_t inv_phy) +{ + return 65536 / inv_phy; +} + +/* + * Convert faked IP addr to Node/Tid. + * @ip is network/big endian. + */ +static __inline__ void +qvsp_fake_ip2nodetid(const uint32_t *ip, uint8_t *node, uint8_t *tid) +{ + *node = ((uint8_t*)ip)[2]; + *tid = ((uint8_t*)ip)[3]; +} + +#define QVSP_TID_FAKE_IP_VERSION 4 +#define QVSP_TID_FAKE_IP_PROTO IPPROTO_UDP + +/* + * Convert Node/Tid to faked IP addr + * Returned IP addr is network/big endian. + */ +static __inline__ void +qvsp_fake_nodetid2ip(uint32_t *ip, const uint8_t node, const uint8_t tid) +{ + ((uint8_t*)ip)[0] = 192; + ((uint8_t*)ip)[1] = 168; + ((uint8_t*)ip)[2] = node; + ((uint8_t*)ip)[3] = tid; +} + +#ifndef NIPQUAD_FMT +#define NIPQUAD_FMT "%d.%d.%d.%d" +#endif + +#ifndef NIPQUAD_LEN +#define NIPQUAD_LEN 15 +#endif + +#ifndef NIPQUAD +#define NIPQUAD(addr) \ + ((unsigned char *)&addr)[0], \ + ((unsigned char *)&addr)[1], \ + ((unsigned char *)&addr)[2], \ + ((unsigned char *)&addr)[3] +#endif + +#define QVSP_CFG_SHOW_ANYSTR "Any" + +#endif /* DOXYGEN_EXCLUDE */ + +#endif /* __QTN_QVSP_DATA_H__ */ + diff --git a/package/firmware/quantenna/src/qtn/shared_defs.h b/package/firmware/quantenna/src/qtn/shared_defs.h new file mode 100644 index 000000000..6b589f3f4 --- /dev/null +++ b/package/firmware/quantenna/src/qtn/shared_defs.h @@ -0,0 +1,674 @@ +/*SH1 +******************************************************************************* +** ** +** Copyright (c) 2010 Quantenna Communications Inc ** +** All Rights Reserved ** +** ** +** Author : Quantenna Communications Inc ** +** File : shared_params.h ** +** Description : ** +** ** +******************************************************************************* +** ** +** Redistribution and use in source and binary forms, with or without ** +** modification, are permitted provided that the following conditions ** +** are met: ** +** 1. Redistributions of source code must retain the above copyright ** +** notice, this list of conditions and the following disclaimer. ** +** 2. Redistributions in binary form must reproduce the above copyright ** +** notice, this list of conditions and the following disclaimer in the ** +** documentation and/or other materials provided with the distribution. ** +** 3. The name of the author may not be used to endorse or promote products ** +** derived from this software without specific prior written permission. ** +** ** +** Alternatively, this software may be distributed under the terms of the ** +** GNU General Public License ("GPL") version 2, or (at your option) any ** +** later version as published by the Free Software Foundation. ** +** ** +** In the case this software is distributed under the GPL license, ** +** you should have received a copy of the GNU General Public License ** +** along with this software; if not, write to the Free Software ** +** Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ** +** ** +** THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR ** +** IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES** +** OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. ** +** IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, ** +** INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT ** +** NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,** +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ** +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ** +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF ** +** THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ** +** ** +******************************************************************************* +EH1*/ + +#ifndef _SHARED_DEFS_H_ +#define _SHARED_DEFS_H_ + +#include "shared_defs_common.h" + +#ifdef TOPAZ_PLATFORM +#define QTN_SWITCH_CHANNEL_TIME_AVG 3750 /* microseconds */ +#else +#define QTN_SWITCH_CHANNEL_TIME_AVG 3500 /* microseconds */ +#endif + +#define IEEE80211_MAX_NAV 32767 + +/* SCS (ACI/CCI Detection and Mitigation) APIs */ +enum qtn_vap_scs_cmds { + IEEE80211_SCS_SET_ENABLE = 1, + IEEE80211_SCS_SET_DEBUG_ENABLE, + IEEE80211_SCS_SET_SAMPLE_ENABLE, + IEEE80211_SCS_SET_SAMPLE_DWELL_TIME, + IEEE80211_SCS_SET_SAMPLE_INTERVAL, + IEEE80211_SCS_SET_THRSHLD_SMPL_PKTNUM, + IEEE80211_SCS_SET_THRSHLD_PRI_CCA, + IEEE80211_SCS_SET_THRSHLD_SEC_CCA, + IEEE80211_SCS_SET_THRSHLD_SMPL_AIRTIME, + IEEE80211_SCS_SET_WF_CCA, + IEEE80211_SCS_SET_WF_RSSI, + IEEE80211_SCS_SET_WF_CRC_ERR, + IEEE80211_SCS_SET_WF_LPRE, + IEEE80211_SCS_SET_WF_SPRE, + IEEE80211_SCS_SET_WF_RETRIES, + IEEE80211_SCS_SET_WF_DFS, + IEEE80211_SCS_SET_WF_MAX_TX_PWR, + IEEE80211_SCS_SET_REPORT_ONLY, + IEEE80211_SCS_SET_CCA_INTF_RATIO, + IEEE80211_SCS_SET_CCA_IDLE_THRSHLD, + IEEE80211_SCS_SET_CCA_INTF_LO_THR, + IEEE80211_SCS_SET_CCA_INTF_HI_THR, + IEEE80211_SCS_SET_CCA_SMPL_DUR, + IEEE80211_SCS_GET_REPORT, + IEEE80211_SCS_GET_INTERNAL_STATS, + IEEE80211_SCS_SET_CCA_INTF_SMTH_FCTR, + IEEE80211_SCS_RESET_RANKING_TABLE, + IEEE80211_SCS_SET_CHAN_MTRC_MRGN, + IEEE80211_SCS_SET_RSSI_SMTH_FCTR, + IEEE80211_SCS_SET_ATTEN_ADJUST, + IEEE80211_SCS_SET_THRSHLD_ATTEN_INC, + IEEE80211_SCS_SET_THRSHLD_DFS_REENTRY, + IEEE80211_SCS_SET_THRSHLD_DFS_REENTRY_MINRATE, + IEEE80211_SCS_SET_PMBL_ERR_SMTH_FCTR, + IEEE80211_SCS_SET_PMBL_ERR_RANGE, + IEEE80211_SCS_SET_PMBL_ERR_MAPPED_INTF_RANGE, + IEEE80211_SCS_SET_THRSHLD_LOAD, + IEEE80211_SCS_SET_PMBL_ERR_WF, + IEEE80211_SCS_SET_THRSHLD_AGING_NOR, + IEEE80211_SCS_SET_THRSHLD_AGING_DFSREENT, + IEEE80211_SCS_SET_THRSHLD_DFS_REENTRY_INTF, + IEEE80211_SCS_SET_PMP_RPT_CCA_SMTH_FCTR, + IEEE80211_SCS_SET_PMP_RX_TIME_SMTH_FCTR, + IEEE80211_SCS_SET_PMP_TX_TIME_SMTH_FCTR, + IEEE80211_SCS_SET_PMP_STATS_STABLE_PERCENT, + IEEE80211_SCS_SET_PMP_STATS_STABLE_RANGE, + IEEE80211_SCS_SET_PMP_STATS_CLEAR_INTERVAL, + IEEE80211_SCS_SET_PMP_TXTIME_COMPENSATION, + IEEE80211_SCS_SET_PMP_RXTIME_COMPENSATION, + IEEE80211_SCS_SET_PMP_TDLSTIME_COMPENSATION, + IEEE80211_SCS_SET_SWITCH_CHANNEL_MANUALLY, + IEEE80211_SCS_SET_AS_RX_TIME_SMTH_FCTR, + IEEE80211_SCS_SET_AS_TX_TIME_SMTH_FCTR, + IEEE80211_SCS_SET_STATS_START, + IEEE80211_SCS_SET_CCA_IDLE_SMTH_FCTR, + IEEE80211_SCS_SET_PMBL_ERR_THRSHLD, + IEEE80211_SCS_SET_CCA_INTF_DFS_MARGIN, + IEEE80211_SCS_SET_MAX +}; + +#define IEEE80211_SCS_STATE_INIT 0 +#define IEEE80211_SCS_STATE_RESET 1 +#define IEEE80211_SCS_STATE_CHANNEL_SWITCHING 2 +#define IEEE80211_SCS_STATE_MEASUREMENT_CHANGE_CLEAN 3 /* param change */ +#define IEEE80211_SCS_STATE_PERIOD_CLEAN 4 + +#define IEEE80211_SCS_COMPARE_INIT_TIMER 5 +#define IEEE80211_SCS_COMPARE_TIMER_INTVAL 2 +#define IEEE80211_CCA_SAMPLE_DUR IEEE80211_SCS_COMPARE_TIMER_INTVAL /* seconds */ +#define IEEE80211_SCS_CHAN_CURRENT 0 +#define IEEE80211_SCS_CHAN_ALL 0xFF +#define IEEE80211_SCS_THRSHLD_MAX 100 /* metric */ +#define IEEE80211_SCS_THRSHLD_MIN 1 /* metric */ +#define IEEE80211_SCS_SMPL_DWELL_TIME_MAX 24 /* milliseconds, limited by max NAV reservation */ +#define IEEE80211_SCS_SMPL_DWELL_TIME_MIN 5 /* milliseconds */ +#define IEEE80211_SCS_SMPL_DWELL_TIME_DEFAULT 10 /* milliseconds */ +#define IEEE80211_SCS_SMPL_INTV_MAX 3600 /* seconds */ +#define IEEE80211_SCS_SMPL_INTV_MIN 1 /* seconds */ +#define IEEE80211_SCS_SMPL_INTV_DEFAULT 5 /* seconds */ +#define IEEE80211_SCS_THRSHLD_SMPL_PKTNUM_DEFAULT 16 /* packet number */ +#define IEEE80211_SCS_THRSHLD_SMPL_PKTNUM_MAX 1000 /* packet number */ +#define IEEE80211_SCS_THRSHLD_SMPL_PKTNUM_MIN 1 /* packet number */ +#ifdef TOPAZ_PLATFORM +#define IEEE80211_SCS_THRSHLD_SMPL_AIRTIME_DEFAULT 200 /* ms */ +#else +#define IEEE80211_SCS_THRSHLD_SMPL_AIRTIME_DEFAULT 300 /* ms */ +#endif +#define IEEE80211_SCS_THRSHLD_SMPL_AIRTIME_MAX 1000 /* ms */ +#define IEEE80211_SCS_THRSHLD_SMPL_AIRTIME_MIN 1 /* ms */ +#define IEEE80211_SCS_THRSHLD_PMBL_ERR_MAX 10000 /* count */ +#define IEEE80211_SCS_THRSHLD_PMBL_ERR_MIN 1 /* count */ + +/* + * Packet rate threshold is determined by how many packets we can hold in buffer without drop + * during off-channel period. It is limited by: + * - sw queue length of each node/tid + * - global resource shared by all node/tid, such as tqew descriptors and msdu headers. + * Current value doesn't apply to the scenario when tqew descriptors are already used up by large + * number of stations. + */ +#define IEEE80211_SCS_THRSHLD_SMPL_TX_PKTRATE (1024 - 128) /* margin = 128 + hw ring size */ +#define IEEE80211_SCS_THRSHLD_SMPL_RX_PKTRATE IEEE80211_SCS_THRSHLD_SMPL_TX_PKTRATE /* assume qtn peer */ +#define IEEE80211_SCS_THRSHLD_ATTEN_INC_DFT 5 /* db */ +#define IEEE80211_SCS_THRSHLD_ATTEN_INC_MIN 0 /* db */ +#define IEEE80211_SCS_THRSHLD_ATTEN_INC_MAX 20 /* db */ +#define IEEE80211_SCS_THRSHLD_DFS_REENTRY_DFT 60 /* seconds */ +#define IEEE80211_SCS_THRSHLD_DFS_REENTRY_MIN 0 /* seconds */ +#define IEEE80211_SCS_THRSHLD_DFS_REENTRY_MAX 0xffff /* seconds */ +#define IEEE80211_SCS_THRSHLD_DFS_REENTRY_INTF_MIN 0 +#define IEEE80211_SCS_THRSHLD_DFS_REENTRY_INTF_MAX 100 +#define IEEE80211_SCS_THRSHLD_DFS_REENTRY_INTF_DFT 40 +#define IEEE80211_SCS_THRSHLD_DFS_REENTRY_MINRATE_UNIT 100 /* kbps */ +#define IEEE80211_SCS_THRSHLD_DFS_REENTRY_MINRATE_DFT 5 /* unit: 100kbps */ +#define IEEE80211_SCS_THRSHLD_DFS_REENTRY_MINRATE_MIN 0 /* unit: 100kbps */ +#define IEEE80211_SCS_THRSHLD_DFS_REENTRY_MINRATE_MAX 0xffff /* unit: 100kbps */ +#define IEEE80211_SCS_THRSHLD_AGING_MIN 0 +#define IEEE80211_SCS_THRSHLD_AGING_MAX 0xFFFF +#define IEEE80211_SCS_THRSHLD_AGING_NOR_DFT (60 * 6) +#define IEEE80211_SCS_THRSHLD_AGING_DFSREENT_DFT 5 +#define IEEE80211_SCS_CCA_DUR_MAX 10 /* seconds */ +#define IEEE80211_SCS_CCA_DUR_MIN 2 /* seconds */ +#define IEEE80211_SCS_CCA_INTF_SCALE 1000 /* milliseconds */ +#define IEEE80211_SCS_SENDING_QOSNULL_TIME_AVG 1000 /* microseconds */ +#define IEEE80211_SCS_SMPL_TIME_MARGIN 2000 /* microseconds */ +#define IEEE80211_SCS_SMPL_TIME_OFFSET_SEND_QOSNULL 5000 /* microseconds */ +#define IEEE80211_SCS_SMPL_TIME_SENDING_ALL_BEACONS 25000 /* microseconds, the time duration for transmitting all beacons */ +#define IEEE80211_CCA_INTF_SMTH_FCTR_NOXP_DFT 75 +#define IEEE80211_CCA_INTF_SMTH_FCTR_XPED_DFT 90 +#define IEEE80211_CCA_INTF_SMTH_FCTR_MIN 0 +#define IEEE80211_CCA_INTF_SMTH_FCTR_MAX 100 +#define IEEE80211_SCS_CHAN_MTRC_MRGN_MAX 100 +#define IEEE80211_SCS_CHAN_MTRC_MRGN_DFT 5 +#define IEEE80211_SCS_RSSI_SMTH_FCTR_UP_DFT 75 +#define IEEE80211_SCS_RSSI_SMTH_FCTR_DOWN_DFT 25 +#define IEEE80211_SCS_RSSI_SMTH_FCTR_MAX 100 +#define IEEE80211_SCS_ATTEN_ADJUST_MIN -20 +#define IEEE80211_SCS_ATTEN_ADJUST_MAX 20 +#define IEEE80211_SCS_ATTEN_ADJUST_DFT 5 +#define IEEE80211_SCS_BRCM_RXGLITCH_THRSHLD_SCALE_DFT 40 +#define IEEE80211_SCS_PMBL_ERR_SMTH_FCTR_MIN 0 +#define IEEE80211_SCS_PMBL_ERR_SMTH_FCTR_MAX 100 +#define IEEE80211_SCS_PMBL_ERR_SMTH_FCTR_DFT 66 +#define IEEE80211_SCS_CCA_IDLE_SMTH_FCTR_MIN 0 +#define IEEE80211_SCS_CCA_IDLE_SMTH_FCTR_MAX 100 +#define IEEE80211_SCS_CCA_IDLE_SMTH_FCTR_DFT 50 +#define IEEE80211_SCS_PMP_RPT_CCA_SMTH_FCTR_MAX 100 +#define IEEE80211_SCS_PMP_RPT_CCA_SMTH_FCTR_DFT 66 +#define IEEE80211_SCS_PMP_RX_TIME_SMTH_FCTR_MAX 100 +#define IEEE80211_SCS_PMP_RX_TIME_SMTH_FCTR_DFT 66 +#define IEEE80211_SCS_PMP_TX_TIME_SMTH_FCTR_MAX 100 +#define IEEE80211_SCS_PMP_TX_TIME_SMTH_FCTR_DFT 66 +#define IEEE80211_SCS_PMP_STATS_STABLE_PERCENT_MAX 100 +#define IEEE80211_SCS_PMP_STATS_STABLE_PERCENT_DFT 30 +#define IEEE80211_SCS_PMP_STATS_STABLE_RANGE_MAX 1000 +#define IEEE80211_SCS_PMP_STATS_STABLE_RANGE_DFT 50 +#define IEEE80211_SCS_PMP_STATS_CLEAR_INTERVAL_MAX 3600 /* seconds */ +#define IEEE80211_SCS_PMP_STATS_CLEAR_INTERVAL_DFT 60 /* seconds */ +#define IEEE80211_SCS_AS_RX_TIME_SMTH_FCTR_MAX 100 +#define IEEE80211_SCS_AS_RX_TIME_SMTH_FCTR_DFT 50 +#define IEEE80211_SCS_AS_TX_TIME_SMTH_FCTR_MAX 100 +#define IEEE80211_SCS_AS_TX_TIME_SMTH_FCTR_DFT 50 + +#define IEEE80211_SCS_SMTH_RBS_TIME 80 + +#define IEEE80211_SCS_PMBL_ERR_RANGE_MIN 1000 +#define IEEE80211_SCS_PMBL_ERR_RANGE_MAX 0xFFFF +#define IEEE80211_SCS_PMBL_ERR_RANGE_DFT 5000 +#define IEEE80211_SCS_PMBL_ERR_MAPPED_INTF_RANGE_MIN 0 +#define IEEE80211_SCS_PMBL_ERR_MAPPED_INTF_RANGE_MAX 100 +#define IEEE80211_SCS_PMBL_ERR_MAPPED_INTF_RANGE_DFT 40 +#define IEEE80211_SCS_PMBL_ERR_WF_MIN 0 +#define IEEE80211_SCS_PMBL_ERR_WF_MAX 100 +#define IEEE80211_SCS_PMBL_SHORT_WF_DFT 0 +#define IEEE80211_SCS_PMBL_LONG_WF_DFT 100 +#define IEEE80211_SCS_THRSHLD_LOADED_MIN 0 +#define IEEE80211_SCS_THRSHLD_LOADED_MAX 1000 +#define IEEE80211_SCS_THRSHLD_LOADED_DFT 20 + +#define IEEE80211_SCS_CHAN_POWER_CUTPOINT 15 +#define IEEE80211_SCS_NORMALIZE(_v, _duration) (((_v) < (0xFFFFFFFF / IEEE80211_SCS_CCA_INTF_SCALE)) ? \ + ((_v) * IEEE80211_SCS_CCA_INTF_SCALE / (_duration)) : \ + ((_v) / (_duration) * IEEE80211_SCS_CCA_INTF_SCALE)) + +#define IEEE80211_SCS_SMOOTH(_old, _new, _fctr) (((_old) * (_fctr) + (_new) * (100 - (_fctr))) / 100) + +#define IEEE80211_SCS_OFFCHAN_WHOLE_DUR(_dwell_us) ((_dwell_us) + \ + (2 * QTN_SWITCH_CHANNEL_TIME_AVG) + \ + IEEE80211_SCS_SENDING_QOSNULL_TIME_AVG + \ + IEEE80211_SCS_SMPL_TIME_MARGIN) + +#define IEEE80211_SCS_VALUE_S 0 +#define IEEE80211_SCS_VALUE_M 0xffff +#define IEEE80211_SCS_WF_VALUE_M 0xff +#define IEEE80211_SCS_COMMAND_S 16 +#define IEEE80211_SCS_COMMAND_M 0xffff + +#define IEEE80211_SCS_STA_CCA_REQ_CC 0x1 +#define IEEE80211_SCS_SELF_CCA_CC 0x2 +#define IEEE80211_SCS_ATTEN_INC_CC 0x4 +#define IEEE80211_SCS_BRCM_STA_TRIGGER_CC 0x8 +#define IEEE80211_SCS_CCA_INTF_CC (IEEE80211_SCS_STA_CCA_REQ_CC | IEEE80211_SCS_SELF_CCA_CC) +#define IEEE80211_SCS_INTF_CC (IEEE80211_SCS_CCA_INTF_CC | IEEE80211_SCS_BRCM_STA_TRIGGER_CC) + +#define IEEE80211_REMAIN_CHAN_MIN_RSV_PERD 2 + +enum ieee80211_scs_update_mode { + IEEE80211_SCS_OFFCHAN, /* off-channel, use smoothing and omit current channel */ + IEEE80211_SCS_COCHAN, /* co-channel mode */ + IEEE80211_SCS_INIT_SCAN, /* like off-channel but include current channel */ +}; + +#define SCSLOG_CRIT 0 +#define SCSLOG_NOTICE 1 +#define SCSLOG_INFO 2 +#define SCSLOG_VERBOSE 3 +#define SCSLOG_LEVEL_MAX 3 +#if !defined(MUC_BUILD) && !defined(DSP_BUILD) && !defined(AUC_BUILD) +#define SCSDBG(_level, _fmt, ...) do { \ + if (ic->ic_scs.scs_debug_enable >= (_level)) { \ + DBGFN("SCS: " _fmt, ##__VA_ARGS__); \ + } \ + } while (0) +#endif + + +/* OCAC (Off-channel CAC) APIs */ +enum qtn_ocac_cmds { + IEEE80211_OCAC_SET_ENABLE = 1, + IEEE80211_OCAC_SET_DISABLE, + IEEE80211_OCAC_SET_DEBUG_LEVEL, + IEEE80211_OCAC_SET_DWELL_TIME, + IEEE80211_OCAC_SET_DURATION, + IEEE80211_OCAC_SET_THRESHOLD_FAT, + IEEE80211_OCAC_SET_DUMP_COUNTS, + IEEE80211_OCAC_SET_CAC_TIME, + IEEE80211_OCAC_SET_THRESHOLD_TRAFFIC, + IEEE80211_OCAC_SET_TIMER_INTERVAL, + IEEE80211_OCAC_SET_DUMP_TSFLOG, + IEEE80211_OCAC_SET_DUMP_CFG, + IEEE80211_OCAC_SET_TRAFFIC_CONTROL, + IEEE80211_OCAC_SET_THRESHOLD_CCA_INTF, + IEEE80211_OCAC_SET_REPORT_ONLY, + IEEE80211_OCAC_SET_DUMP_CCA_COUNTS, + IEEE80211_OCAC_SET_OFFSET_TXHALT, + IEEE80211_OCAC_SET_OFFSET_OFFCHAN, + IEEE80211_OCAC_SET_THRESHOLD_FAT_DEC, + IEEE80211_OCAC_SET_TIMER_EXPIRE_INIT, + IEEE80211_OCAC_SET_SECURE_DWELL_TIME, + IEEE80211_OCAC_SET_BEACON_INTERVAL, + IEEE80211_OCAC_SET_WEATHER_DURATION, + IEEE80211_OCAC_SET_WEATHER_CAC_TIME, + IEEE80211_OCAC_SET_MAX +}; + +enum qtn_ocac_get_cmds { + IEEE80211_OCAC_GET_STATUS = 1, + IEEE80211_OCAC_GET_AVAILABILITY, +}; + +#define IEEE80211_OCAC_CLEAN_STATS_STOP 0 +#define IEEE80211_OCAC_CLEAN_STATS_START 1 +#define IEEE80211_OCAC_CLEAN_STATS_RESET 2 + + +#define IEEE80211_OCAC_DWELL_TIME_MIN 5 /* milliseconds */ +#define IEEE80211_OCAC_DWELL_TIME_MAX 200 /* milliseconds */ +#define IEEE80211_OCAC_DWELL_TIME_DEFAULT 50 /* milliseconds */ + +#define IEEE80211_OCAC_SECURE_DWELL_TIME_MIN 5 /* milliseconds */ +#define IEEE80211_OCAC_SECURE_DWELL_TIME_MAX 23 /* milliseconds */ +#define IEEE80211_OCAC_SECURE_DWELL_TIME_DEFAULT 23 /* milliseconds */ + +#define IEEE80211_OCAC_DURATION_MIN 1 /* seconds */ +#define IEEE80211_OCAC_DURATION_MAX 64800 /* seconds */ +#define IEEE80211_OCAC_DURATION_DEFAULT 360 /* seconds */ + +#define IEEE80211_OCAC_CAC_TIME_MIN 1 /* seconds */ +#define IEEE80211_OCAC_CAC_TIME_MAX 64800 /* seconds */ +#define IEEE80211_OCAC_CAC_TIME_DEFAULT 145 /* seconds */ + +#define IEEE80211_OCAC_WEA_DURATION_MIN 60 /* seconds */ +#define IEEE80211_OCAC_WEA_DURATION_MAX 86400 /* seconds */ + +#define IEEE80211_OCAC_WEA_CAC_TIME_MIN 1 /* seconds */ +#define IEEE80211_OCAC_WEA_CAC_TIME_MAX 86400 /* seconds */ + +#define IEEE80211_OCAC_THRESHOLD_FAT_MIN 1 /* percent */ +#define IEEE80211_OCAC_THRESHOLD_FAT_MAX 100 /* percent */ +#define IEEE80211_OCAC_THRESHOLD_FAT_DEFAULT 65 /* percent */ + +#define IEEE80211_OCAC_THRESHOLD_TRAFFIC_MIN 1 /* percent */ +#define IEEE80211_OCAC_THRESHOLD_TRAFFIC_MAX 100 /* percent */ +#define IEEE80211_OCAC_THRESHOLD_TRAFFIC_DEFAULT 35 /* percent */ + +#define IEEE80211_OCAC_OFFSET_TXHALT_MIN 2 /* milliseconds */ +#define IEEE80211_OCAC_OFFSET_TXHALT_MAX 80 /* milliseconds */ +#define IEEE80211_OCAC_OFFSET_TXHALT_DEFAULT 10 /* milliseconds */ + +#define IEEE80211_OCAC_OFFSET_OFFCHAN_MIN 2 /* milliseconds */ +#define IEEE80211_OCAC_OFFSET_OFFCHAN_MAX 80 /* milliseconds */ +#define IEEE80211_OCAC_OFFSET_OFFCHAN_DEFAULT 5 /* milliseconds */ + +#define IEEE80211_OCAC_TRAFFIC_CTRL_DEFAULT 1 /* on */ + +#define IEEE80211_OCAC_THRESHOLD_CCA_INTF_MIN 1 /* percent */ +#define IEEE80211_OCAC_THRESHOLD_CCA_INTF_MAX 100 /* percent */ +#define IEEE80211_OCAC_THRESHOLD_CCA_INTF_DEFAULT 20 /* percent */ + +#define IEEE80211_OCAC_THRESHOLD_FAT_DEC_MIN 1 /* percent */ +#define IEEE80211_OCAC_THRESHOLD_FAT_DEC_MAX 100 /* percent */ +#define IEEE80211_OCAC_THRESHOLD_FAT_DEC_DEFAULT 10 /* percent */ + +#define IEEE80211_OCAC_TIMER_INTERVAL_MIN 1 /* seconds */ +#define IEEE80211_OCAC_TIMER_INTERVAL_MAX 100 /* seconds */ +#define IEEE80211_OCAC_TIMER_INTERVAL_DEFAULT 2 /* seconds */ + +#define IEEE80211_OCAC_BEACON_INTERVAL_MIN 100 /* TUs */ +#define IEEE80211_OCAC_BEACON_INTERVAL_MAX 1000 /* TUs */ +#define IEEE80211_OCAC_BEACON_INTERVAL_DEFAULT 100 /* TUs */ + +#define IEEE80211_OCAC_TIMER_EXPIRE_INIT_MIN 1 /* seconds */ +#define IEEE80211_OCAC_TIMER_EXPIRE_INIT_MAX 65000 /* seconds */ +#define IEEE80211_OCAC_TIMER_EXPIRE_INIT_DEFAULT 2 /* seconds */ + + +#define IEEE80211_OCAC_VALUE_S 0 +#define IEEE80211_OCAC_VALUE_M 0xffff +#define IEEE80211_OCAC_COMMAND_S 16 +#define IEEE80211_OCAC_COMMAND_M 0xffff +#define IEEE80211_OCAC_COMPRESS_VALUE_F 0x8000 +#define IEEE80211_OCAC_COMPRESS_VALUE_M 0x7fff + +#define IEEE80211_OCAC_TIME_MARGIN 2000 /* microseconds */ + +#define OCACLOG_CRIT 0 +#define OCACLOG_WARNING 1 +#define OCACLOG_NOTICE 2 +#define OCACLOG_INFO 3 +#define OCACLOG_VERBOSE 4 +#define OCACLOG_LEVEL_MAX 4 +#if !defined(MUC_BUILD) && !defined(DSP_BUILD) && !defined(AUC_BUILD) +#define OCACDBG(_level, _fmt, ...) do { \ + if (ic->ic_ocac.ocac_cfg.ocac_debug_level >= (_level)) { \ + DBGFN("DFS_s_radio: " _fmt, ##__VA_ARGS__); \ + } \ + } while (0) +#endif + +#define QTN_M2A_EVENT_TYPE_DTIM 1 +#define QTN_M2A_PS_EVENT_PM_ENABLE 2 /* enable power management */ +#define QTN_M2A_PS_EVENT_PM_DISABLE 3 /* disable power management */ +#define QTN_M2A_PS_EVENT_PS_POLL 4 /* ps poll */ +#define QTN_M2A_EVENT_TYPE_UAPSD_SP 5 /* U-APSD SP */ +#define QTN_M2A_EVENT_PTID_FLAG_SET 6 /* Set per-TID flag(muc) */ + +/* Common definitions for flags used to indicate ieee80211_node's states */ +#define IEEE80211_NODE_AUTH 0x0001 /* authorized for data */ +#define IEEE80211_NODE_QOS 0x0002 /* QoS enabled */ +#define IEEE80211_NODE_ERP 0x0004 /* ERP enabled */ +#define IEEE80211_NODE_HT 0x0008 /* HT enabled */ +/* NB: this must have the same value as IEEE80211_FC1_PWR_MGT */ +#define IEEE80211_NODE_PWR_MGT 0x0010 /* power save mode enabled */ +#define IEEE80211_NODE_PS_DELIVERING 0x0040 /* STA out of PS, getting delivery */ +#define IEEE80211_NODE_PS_POLL 0x0080 /* power save ps poll mode */ +#define IEEE80211_NODE_AREF 0x0020 /* authentication ref held */ +#define IEEE80211_NODE_2_TX_CHAINS 0x0400 /* this node needs to use 2 TX chain only, for IOT purpose */ +#define IEEE80211_NODE_UAPSD 0x1000 +#define IEEE80211_NODE_WDS_PEER 0x2000 /* this node is the wds peer in a wds vap */ +#define IEEE80211_NODE_VHT 0x4000 /* VHT enabled */ +#define IEEE80211_NODE_TPC 0x8000 /* indicate tpc capability */ + +/* Common definitions for ext_flags */ +#define IEEE80211_NODE_TDLS_PTI_REQ 0x0001 /* Should sending PTI request to peer */ +#define IEEE80211_NODE_TDLS_PTI_PENDING 0x0002 /* PTI request xmit to peer but not responsed */ +#define IEEE80211_NODE_UAPSD_SP_IN_PROGRESS 0x0004 /* U-APSD SP in progress */ +#define IEEE80211_NODE_TDLS_PTI_RESP 0x0008 /* PTI response frame received */ + +#define IEEE80211_NODE_TDLS_MASK 0x000B /* Mask for TDLS bits */ + +#define QTN_VAP_PRIORITY_RESERVED 2 /* reserve the low values for internal use */ +#define QTN_VAP_PRIORITY_NUM 4 +#define QTN_VAP_PRIORITY_MGMT (QTN_VAP_PRIORITY_RESERVED + QTN_VAP_PRIORITY_NUM) +#define QTN_TACMAP_HW_PRI_NUM 8 /* hw limitation for 128 node mode */ +#define QTN_TACMAP_PRI_PER_VAP 8 /* for maximum 8 TIDs */ +#define QTN_TACMAP_SW_PRI_BASE 64 /* values below this are used for "bad apple" nodes */ + +/* Quantenna specific flags (ni_qtn_flags), do not modify in Auc */ +#define QTN_IS_BCM_NODE 0x0000001 +#define QTN_IS_IPAD_NODE 0x0000002 +#define QTN_IS_IPHONE5_NODE 0x0000004 +#define QTN_IS_IPAD3_NODE 0x0000008 +#define QTN_IS_INTEL_5100_NODE 0x0000010 +#define QTN_IS_INTEL_5300_NODE 0x0000020 +#define QTN_IS_SAMSUNG_GALAXY_NODE 0x0000040 +#define QTN_IS_NOT_4ADDR_CAPABLE_NODE 0x0000080 +#define QTN_AC_BE_INHERITANCE_UPTO_VO 0x0000100 +#define QTN_AC_BE_INHERITANCE_UPTO_VI 0x0000200 +#define QTN_IS_INTEL_NODE 0x0000400 +#define QTN_IS_IPAD_AIR_NODE 0x0000800 +#define QTN_IS_IPAD4_NODE 0x0001000 +#define QTN_IS_REALTEK_NODE 0x0004000 +#define QTN_NODE_TX_RESTRICTED 0x0008000 /* restricted tx enabled */ +#define QTN_NODE_TX_RESTRICT_RTS 0x0010000 /* use RTS to confirm node is lost */ +#define QTN_IS_NO_RXAMSDU_NO_BF_NODE 0x0020000 +#define QTN_NODE_RXAMSDU_SUPPORT 0x0040000 /* node support TX amsdu */ +#define QTN_NODE_11N_TXAMSDU_OFF 0x0080000 +#define QTN_NODE_TXOP_RESTRICTED 0x0100000 +/* + * Bits that can be updated again by Lhost after association creation. Explicit definition helps + * avoid overwriting bits maintained by MuC itself. + */ +#define QTN_FLAGS_UPDATABLE_BITS (QTN_IS_INTEL_NODE) + +/* QTN bandwidth definition */ +#define QTN_BW_20M 0 +#define QTN_BW_40M 1 +#define QTN_BW_80M 2 +#define QTN_BW_MAX QTN_BW_80M + +#define QTN_MAILBOX_INVALID 0xffffffff /* Invalid value to indicate mailbox is disabled */ + +enum ni_tdls_status { + IEEE80211_TDLS_NODE_STATUS_NONE = 0, + IEEE80211_TDLS_NODE_STATUS_INACTIVE = 1, + IEEE80211_TDLS_NODE_STATUS_STARTING = 2, + IEEE80211_TDLS_NODE_STATUS_ACTIVE = 3, + IEEE80211_TDLS_NODE_STATUS_IDLE = 4 +}; + +/* WoWLAN APIs */ +enum qtn_vap_wowlan_cmds { + IEEE80211_WOWLAN_HOST_POWER_SAVE = 1, + IEEE80211_WOWLAN_MATCH_TYPE, + IEEE80211_WOWLAN_L2_ETHER_TYPE, + IEEE80211_WOWLAN_L3_UDP_PORT, + IEEE80211_WOWLAN_MAGIC_PATTERN, + IEEE80211_WOWLAN_MAGIC_PATTERN_GET, + IEEE80211_WOWLAN_SET_MAX +}; +/* + * Definitions relating to individual fields from phy_stats, + * shared between the Q driver and the APIs. + */ + +/* + * Error Sum needs to be reported together with the corresponding Number of + * Symbols; getting them in separate operations would introduce a race condition + * where the Error Sum and the Number of Symbols came from different + * PHY stat blocks. + */ + +#define QTN_PHY_AVG_ERROR_SUM_NSYM_NAME "avg_error_sum_nsym" + +#define QTN_PHY_EVM_MANTISSA_SHIFT 5 +#define QTN_PHY_EVM_EXPONENT_MASK 0x1f + +enum qtn_phy_stat_field { + QTN_PHY_NOSUCH_FIELD = -1, + QTN_PHY_AVG_ERROR_SUM_NSYM_FIELD, +}; + +#define QTN_M2A_TX_SCALE_BITS 4 +#define QTN_M2A_TX_SCALE_MASK ((1 << QTN_M2A_TX_SCALE_BITS) - 1) + +/* only for little endian */ +#if defined(AUC_BUILD) +#define U64_LOW32(_v) ((uint32_t)(_v)) +#define U64_HIGH32(_v) ((uint32_t)((_v) >> 32)) +#else +#define U64_LOW32(_v) (((uint32_t*)&(_v))[0]) +#define U64_HIGH32(_v) (((uint32_t*)&(_v))[1]) +#endif + +#define U64_COMPARE_GE(_a, _b) ((U64_HIGH32(_a) > U64_HIGH32(_b)) || \ + ((U64_HIGH32(_a) == U64_HIGH32(_b)) && (U64_LOW32(_a) >= U64_LOW32(_b)))) + +#define U64_COMPARE_GT(_a, _b) ((U64_HIGH32(_a) > U64_HIGH32(_b)) || \ + ((U64_HIGH32(_a) == U64_HIGH32(_b)) && (U64_LOW32(_a) > U64_LOW32(_b)))) + +#define U64_COMPARE_LE(_a, _b) ((U64_HIGH32(_a) < U64_HIGH32(_b)) || \ + ((U64_HIGH32(_a) == U64_HIGH32(_b)) && (U64_LOW32(_a) <= U64_LOW32(_b)))) + +#define U64_COMPARE_LT(_a, _b) ((U64_HIGH32(_a) < U64_HIGH32(_b)) || \ + ((U64_HIGH32(_a) == U64_HIGH32(_b)) && (U64_LOW32(_a) < U64_LOW32(_b)))) + +#ifndef MAC2STR +#define MAC2STR(a) (a)[0], (a)[1], (a)[2], (a)[3], (a)[4], (a)[5] +#define MACSTR "%02X:%02X:%02X:%02X:%02X:%02X" +#define MACSTRL "%02x:%02x:%02x:%02x:%02x:%02x" /* for MuC and Auc which don't support "X" */ +#endif + +/* + * VSP/QTM + * Macro TOPAZ_QTM is used to help identify changes between original VSP and QTM. + * In Lhost kernel driver, it must be used within CONFIG_QVSP(in kernel .config). + * CONFIG_QVSP TOPAZ_QTM ruby topaz + * Y 1 invalid *QTM works + * Y 0 *VSP works VSP alive but doesn't work for HDP + * N 1 invalid *no VSP/QTM + * N 0 *no VSP no VSP/QTM, and no QTM changes in MuC and AuC + * So generally, sololy changing CONFIG_QVSP works for both ruby and topaz as indicated by *. + * But to throughly clean QTM code in AuC and MuC, disable TOPAZ_QTM in topaz below. + */ +#ifdef TOPAZ_PLATFORM + #define TOPAZ_QTM 1 +#else + #define TOPAZ_QTM 0 +#endif + +#define COMPILE_TIME_ASSERT(constant_expr) \ +do { \ + switch(0) { \ + case 0: \ + case constant_expr: \ + ; \ + } \ +} while(0) + +/**@addtogroup DFSAPIs + *@{*/ +/** + * Reason for channel change + */ +enum ieee80211_csw_reason { + /** + * Reason is unknown + */ + IEEE80211_CSW_REASON_UNKNOWN, + /** + * Smart channel selection + */ + IEEE80211_CSW_REASON_SCS, + /** + * Radar detection + */ + IEEE80211_CSW_REASON_DFS, + /** + * Channel set by user + */ + IEEE80211_CSW_REASON_MANUAL, + /** + * Configuration change + */ + IEEE80211_CSW_REASON_CONFIG, + /** + * Scan initiated by user + */ + IEEE80211_CSW_REASON_SCAN, + /** + * Off-channel CAC + */ + IEEE80211_CSW_REASON_OCAC, + /** + * Channel switch announcement + */ + IEEE80211_CSW_REASON_CSA, + /** + * TDLS Channel switch announcement + */ + IEEE80211_CSW_REASON_TDLS_CS, + /** + * Number of values + */ + IEEE80211_CSW_REASON_MAX +}; +/**@}*/ + +/* + * Reasons for channel switches that are not recorded and therefore + * should not be listed in QCSAPI documentation + */ +enum ieee80211_csw_reason_private { + IEEE80211_CSW_REASON_SAMPLING = IEEE80211_CSW_REASON_MAX, + IEEE80211_CSW_REASON_OCAC_RUN, + IEEE80211_CSW_REASON_BGSCAN, +}; + +/* Keep this in sync with swfeat_desc */ +enum swfeat { + SWFEAT_ID_MODE_AP, + SWFEAT_ID_MODE_STA, + SWFEAT_ID_MODE_REPEATER, + SWFEAT_ID_PCIE_RC, + SWFEAT_ID_VHT, + SWFEAT_ID_2X2, + SWFEAT_ID_2X4, + SWFEAT_ID_4X4, + SWFEAT_ID_HS20, + SWFEAT_ID_WPA2_ENT, + SWFEAT_ID_MESH, + SWFEAT_ID_TDLS, + SWFEAT_ID_OCAC, + SWFEAT_ID_QHOP, + SWFEAT_ID_QSV, + SWFEAT_ID_QSV_NEIGH, + SWFEAT_ID_MU_MIMO, + SWFEAT_ID_DUAL_CHAN_VIRT, + SWFEAT_ID_DUAL_CHAN, + SWFEAT_ID_DUAL_BAND_VIRT, + SWFEAT_ID_DUAL_BAND, + SWFEAT_ID_QTM_PRIO, + SWFEAT_ID_QTM, + SWFEAT_ID_SPEC_ANALYZER, + SWFEAT_ID_MAX +}; + +#define SWFEAT_MAP_SIZE (SWFEAT_ID_MAX / 8 + 1) + +/* Used to scale temperature measurements */ +#define QDRV_TEMPSENS_COEFF 100000 +#define QDRV_TEMPSENS_COEFF10 (10 * QDRV_TEMPSENS_COEFF) + +#endif /* _SHARED_DEFS_H_ */ diff --git a/package/firmware/quantenna/src/qtn/shared_defs_common.h b/package/firmware/quantenna/src/qtn/shared_defs_common.h new file mode 100644 index 000000000..16d2d4d65 --- /dev/null +++ b/package/firmware/quantenna/src/qtn/shared_defs_common.h @@ -0,0 +1,149 @@ +/*SH1 +******************************************************************************* +** ** +** Copyright (c) 2014 Quantenna Communications Inc ** +** All Rights Reserved ** +** ** +** Author : Quantenna Communications Inc ** +** File : shared_defs.h ** +** Description : ** +** ** +******************************************************************************* +** ** +** Redistribution and use in source and binary forms, with or without ** +** modification, are permitted provided that the following conditions ** +** are met: ** +** 1. Redistributions of source code must retain the above copyright ** +** notice, this list of conditions and the following disclaimer. ** +** 2. Redistributions in binary form must reproduce the above copyright ** +** notice, this list of conditions and the following disclaimer in the ** +** documentation and/or other materials provided with the distribution. ** +** 3. The name of the author may not be used to endorse or promote products ** +** derived from this software without specific prior written permission. ** +** ** +** Alternatively, this software may be distributed under the terms of the ** +** GNU General Public License ("GPL") version 2, or (at your option) any ** +** later version as published by the Free Software Foundation. ** +** ** +** In the case this software is distributed under the GPL license, ** +** you should have received a copy of the GNU General Public License ** +** along with this software; if not, write to the Free Software ** +** Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ** +** ** +** THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR ** +** IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES** +** OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. ** +** IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, ** +** INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT ** +** NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,** +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ** +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ** +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF ** +** THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ** +** ** +******************************************************************************* +EH1*/ + +#ifndef _SHARED_DEFS_COMMON_H_ +#define _SHARED_DEFS_COMMON_H_ + +/* + * Default board type is 0 to match the default (fallback) from get_bootval. + * Script returns 0 if the parameter is not defined. + */ +#define QTN_RUBY_BOARD_TYPE_DEFAULT 0 + +#define QTN_RUBY_BRINGUP_BOARD 0 +#define QTN_RUBY_BRINGUP_BOARD_32_320 1 +#define QTN_RUBY_BRINGUP_BOARD_16_320 2 +#define QTN_RUBY_BRINGUP_BOARD_16_160 3 +#define QTN_RUBY_BRINGUP_BOARD_ETRON 4 +#define QTN_RUBY_BRINGUP_BOARD_ETRON_320 5 +#define QTN_RUBY_BRINGUP_BOARD_ETRON_160 6 +#define QTN_RUBY_BRINGUP_BOARD_16_200 7 +#define QTN_RUBY_BRINGUP_BOARD_32_200 8 +#define QTN_RUBY_BRINGUP_BOARD_PCIE 9 +/* diag board ids */ +#define QTN_RUBY_BRINGUP_BOARD_32_160_ARB 10 +#define QTN_RUBY_BRINGUP_BOARD_32_160_ARB_1 11 +#define QTN_RUBY_BRINGUP_BOARD_16_160_ARB_1 12 +#define QTN_RUBY_BRINGUP_BOARD_32_160_ARB_0 13 +#define QTN_RUBY_BRINGUP_BOARD_ETRON_160_EMAC1 14 +#define QTN_RUBY_BRINGUP_BOARD_ETRON_250_EMAC1 15 +#define QTN_RUBY_BRINGUP_BOARD_ETRON_32_320_EMAC1 16 +#define QTN_RUBY_BRINGUP_ETRON32_160 17 +#define QTN_RUBY_BRINGUP_ETRON32_320 18 +#define QTN_RUBY_BRINGUP_BOARD_MICRON_DUALEMAC 19 +#define QTN_RUBY_BRINGUP_BOARD_MICRON_DUALEMAC_MII 20 +#define QTN_RUBY_BRINGUP_BOARD_MICRON_DUALEMAC_LOOPBACK 21 +#define QTN_RUBY_BRINGUP_BOARD_16_160_DUALEMAC 22 + + +#define QTN_RUBY_REFERENCE_DESIGN_BOARD 1000 +#define QTN_RUBY_REFERENCE_DESIGN_BOARD_250 1001 +#define QTN_RUBY_REF_BOARD_DUAL_CON 1002 +#define QTN_RUBY_REFERENCE_DESIGN_BOARD_320 1003 +#define QTN_RUBY_ETRON_32_320_EMAC1 1004 +#define QTN_RUBY_ETRON_32_250_EMAC1 1005 +#define QTN_RUBY_REFERENCE_DESIGN_BOARD_RGMII_DLL 1006 +#define QTN_RUBY_QHS710_5S5_SIGE_DDR250 1007 +#define QTN_RUBY_QHS710_5S5_SIGE_DDR320 1008 +#define QTN_RUBY_OHS711_PCIE_320DDR 1009 +/* pcie reference ids */ +#define QTN_RUBY_QHS713_5S1_PCIERC_DDR160 1170 +#define QTN_RUBY_OHS711_5S13_PCIE_DDR320 1171 /* duplicate of 1009 */ +#define QTN_RUBY_QHS713_5S1_PCIERC_DDR320 1172 + +#define QTN_RUBY_ODM_BOARD_0 1200 +#define QTN_RUBY_ODM_BOARD_1 1201 +#define QTN_RUBY_ODM_BOARD_2 1202 +#define QTN_RUBY_ODM_BOARD_3 1203 +#define QTN_RUBY_ODM_BOARD_4 1204 +#define QTN_RUBY_ODM_BOARD_5 1205 +#define QTN_RUBY_ODM_BOARD_6 1206 +#define QTN_RUBY_ODM_BOARD_7 1207 +#define QTN_RUBY_ODM_BOARD_8 1208 +#define QTN_RUBY_ODM_BOARD_9 1209 +#define QTN_RUBY_ODM_BOARD_10 1210 +#define QTN_RUBY_ODM_BOARD_11 1211 +#define QTN_RUBY_ODM_BOARD_12 1212 +#define QTN_RUBY_ODM_BOARD_13 1213 +#define QTN_RUBY_ODM_BOARD_14 1214 +#define QTN_RUBY_ODM_BOARD_15 1215 +#define QTN_RUBY_ODM_BOARD_16 1216 +#define QTN_RUBY_ODM_BOARD_17 1217 +#define QTN_RUBY_ODM_BOARD_18 1218 +#define QTN_RUBY_ODM_BOARD_19 1219 +#define QTN_RUBY_ODM_BOARD_20 1220 +#define QTN_RUBY_ODM_BOARD_21 1221 +#define QTN_RUBY_ODM_BOARD_22 1222 +#define QTN_TOPAZ_FPGAA_BOARD 1223 +#define QTN_TOPAZ_FPGAB_BOARD 1224 +#define QTN_TOPAZ_DUAL_EMAC_FPGAA_BOARD 1225 +#define QTN_TOPAZ_DUAL_EMAC_FPGAB_BOARD 1226 +#define QTN_TOPAZ_RC_BOARD 1227 +#define QTN_TOPAZ_EP_BOARD 1228 +#define QTN_TOPAZ_BB_BOARD 1229 +#define QTN_TOPAZ_RF_BOARD 1230 +#define QTN_TOPAZ_QHS840_5S1 1231 + +#define QTN_RUBY_AUTOCONFIG_ID 32768 +#define QTN_RUBY_UNIVERSAL_BOARD_ID 65535 + +#define QTN_RUBY_NOSUCH_BOARD_TYPE -1 + +#define QTN_RUBY_BRINGUP_RWPA 0 +#define QTN_RUBY_REF_RWPA 1 +#define QTN_RUBY_SIGE 2 +#define QTN_RUBY_UNDEFINED 3 +#define QTN_RUBY_WIFI_NONE 4 +#define QTN_TPZ_SE5003L1 5 +#define QTN_TPZ_SE5003L1_INV 6 +#define QTN_TPZ_SKY85703 7 +#define QTN_TPZ_SKY85405_BPF840 8 +#define QTN_TPZ_DBS 9 /* BBIC4 + RFIC6 */ +#define QTN_TPZ_SE5502L 10 /* BBIC4 + RFIC5 */ +#define QTN_TPZ_SKY85710_NG 11 + +#endif /* _SHARED_DEFS_COMMON_H_ */ + diff --git a/package/firmware/quantenna/src/qtn/wlan_ioctl.h b/package/firmware/quantenna/src/qtn/wlan_ioctl.h new file mode 100644 index 000000000..c8537984f --- /dev/null +++ b/package/firmware/quantenna/src/qtn/wlan_ioctl.h @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2014 Quantenna Communications, Inc. + * All rights reserved. + */ + +#ifndef __WLAN_IOCTL_H__ +#define __WLAN_IOCTL_H__ + +enum ieee80211_wifi_mode { + IEEE80211_WIFI_MODE_NONE = 0, + IEEE80211_WIFI_MODE_A, + IEEE80211_WIFI_MODE_B, + IEEE80211_WIFI_MODE_G, + IEEE80211_WIFI_MODE_NA, + IEEE80211_WIFI_MODE_NG, + IEEE80211_WIFI_MODE_AC, + IEEE80211_WIFI_MODE_MAX, +}; + +#define WLAN_WIFI_MODES_STRINGS { \ + [IEEE80211_WIFI_MODE_NONE] = "-", \ + [IEEE80211_WIFI_MODE_A] = "a", \ + [IEEE80211_WIFI_MODE_B] = "b", \ + [IEEE80211_WIFI_MODE_G] = "g", \ + [IEEE80211_WIFI_MODE_NA] = "na", \ + [IEEE80211_WIFI_MODE_NG] = "ng", \ + [IEEE80211_WIFI_MODE_AC] = "ac", \ +} + +#define IEEE80211_HTCAP_IE_LENGTH 28 +#define IEEE80211_VHTCAP_IE_LENGTH 14 + +struct ieee8011req_sta_tput_caps { + uint8_t macaddr[ETH_ALEN]; + uint8_t mode; + uint8_t htcap_ie[IEEE80211_HTCAP_IE_LENGTH]; + uint8_t vhtcap_ie[IEEE80211_VHTCAP_IE_LENGTH]; +}; +#endif /* __WLAN_IOCTL_H__ */ diff --git a/package/firmware/quantenna/src/topaz-linux.lzma.img b/package/firmware/quantenna/src/topaz-linux.lzma.img new file mode 100755 index 0000000000000000000000000000000000000000..27c86a9fcfec4fcbe8920fb8583ed1698cdebf60 GIT binary patch literal 4505876 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≪`yV^}r+IqF6tt<|9d&qav=`3`QsZYmNzW&+q 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

cC4fQ`|{osE*t}4dGT1T;mjj1uY$d82m#{|sD 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�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 z zK$xuE@83P=%{n<1*VxI7_iec&&IM?5Opy=IRs{rr;r(tm%Nh%VAeS33#2-t12-jDg zt1x{F8zql;IpiOBDG5BP*D|*~*(fQ5+)GTCBs@3ACF}66TR<%M7-G|3;+N&z`{)6w z3kemd*3=VErWBolB^einuUTlZ1q(=?=X8IX`AoLf$4|McpcmT7ZN5)w>Y&s_;ZOvS!AgmPrJ6H{|v9LY|3_%U>k`FvNT1{@*<5eTpac|;2>)i@VOReJU1 zvUpSJ2%%r0py&GYuA#3w1YVC}a$rZS?TM7#`HNs9kbnTQ(zJs~IavEx_MYP9w$OSr z;UPV);FZ+ROvYM%EW{CQ?1hO7=HW;jK`?gX=@ks?9b2aGPc(-TMc{&4gTQ?ZaG-vw zA{>R04Vg4-C9HSLhho&u;^q0>a2*%wQ#ob9>12QM6nrN8`UOktqbhg9x zJMT@bRdMD6`Gxm;U9DV)fDM}2Xe@H+}*NvQS#sw}(W zx}KfZb5+t@8$hQMX+%g~mBOgJ43RHMs3^`Cj4+kgHXk|!Rh(PxkRM_9BT*0d5EVd4 zCT?*sv03p=aODBh2>N;ijwp*8MiR-@VMMI?QJPH{e;VgZS+^d=y_N1A#U-NL;76T} z>w$l+6So_sfNz7UdSvBtDYQndy@{nCw23iq0(T&QGqP9bRD=}&Z7zT|W(&tgrhiDd zpfXEJyF+dQD`-reU^@~e-G6aRD3FKCRnod`F~YNYDFYh5NN=Y@cF*%Us{ zyw~<-0y-M4yV*B1hBVTs-o*CQNYN8oOLLE`GI=rgXo`~VFcPBb zBSUZu^m&fo8NFP$lrP?OH*py8O>$v7*mfI(U_|P$(7ZVp#`|0$8!2zz&RikZfl^K> zSG$qU6E9pWHd#o6)pRW!U$9ilbqm?pFtd9%ryntP2d^Z)1!$;t8g)6mH>A^{S{{J_ z${*Iv>}EtFt!N5yx)g=%-MxAD>=Y33$yZFr)W;?0zXSEBX&t!?NApWB?=p#%Dw$qHZ9JwzN#UhF@@j*F9t+zcxLM;^v#>Uz3t=?xY zuc>6$TQon|{RSO+C!cJTW5#@L1&nyjCn`5dnh3hLI=>t4B`kOgroHGslwbpG1Wp%X z^L`Bj0Cm3uUWu!49hi4NbS8k3jb;&G}_84+eC-_15BF<?s z0{(0M0*ztL?v?lC?P#S2P5dE;jFE3guHMhruZAD@6_J1vWl(5Cmte?hk-aqePo;W4ndDvBP z!cG*q=_|m)K4CJh&mOy1PZ>?nEoU@Bm>VfcF=T>hHorR1H{I&hc*GNWA!)jubVPw%;p>99Y4maa zi%d&!os|UQbusW`89~rq30Wa|?ybDO4bin04 z7d^^!7Cxnyf0h}41|a2 zF>L2CSzRG1s>IgVFIjUslQY8`9VpVIv@5#x^DPEr?Xn zWGxx&=dW-l_l10#`KIf_&Ev5fm7xW$W8BSRXk@AL9lY$L8}rTfyJ~+zl2@VlZk z`@9Ol@fLit{!MHkbK&H=2%fkeJO$@{@0Dt64(X0~F$=QV*Z*7R$E_@^Z4~7)K}=Pw zk)B}XYdg^KfSiO@PyWR9AiK!^JS5Pw%7WqeNiq_7FZgB22>hVX^kA&ux{HGw(jqa* zHne8Z9AO`VD8YGO)f0yMoCiUzLk&8s#ReY(*I?qx<m1sN!ZjXViBHvw@8R2 zCWsZT+=pFwe3auEjcyB&SoLoUnceMeiysyjlY3Vky1yuUEUS81;edv?bv>w7291Rhyuh8srRHtBjp~U2Hy%aDTFH}K|+>=<_SysrQKM# zarcvb;pJr+oPClSknJZcezTizZe2oQyAAZ)?R-q%W$r@6af{a@fYdngcR|449(7lR z$4$dzcaZOwMz5I$7F0J<+!^xxS}yg8mS-Z6HocqYEo~sGR$EQFae2w~ zMz47?%l}huzSc(^!~o8aO%9CaJ4P$XJ@Ip%u1{+r0d~VUigD8TR@#V zmQwa|2iPzfY7fjl?8r_b1>8aI4m_8DWt@z`djAIpZ+}IxX2A6`Enno-1Fj+ohdvPX zKq6Vd1Wm#BIl`Rr$f+DhSt}$AsL8%lJol6FdFb`H)ijbHGj30&ur6avqH9 zq%>M;35JpAvTeZ5z5fmuXuCdTz$xCDE=<-OpOu$HZ5KPjAvk3PyICfaT z*Bmu@#9~G$W@jf74T<`qQgGT!`=qgtW(CaEL>_MrQ4h z8|h@z{-mI=4Hid=RKfbyIGRtvr1pF|({&buCk*YTBBF}|3jap7u*X5sP+?aZ=WFpg ziXbk{+GB}-lL}qR&?sz>Vxz#m1**j zfQnlbV+(t458n=ZYG9Thbn7MW72TpH^Q-a2bzmh7iz0Qp3TAU%;&AZG5s_yMkI1Op zbT2-r`Vp229LP@QT0AbaD*E~Qqox;%K$-@S{R>r(CG8A!cNWU@ou&vUF z^INs)uh!smsy8!A)FhGPL>t%E>>goh%mRw~4agRUa_M{cwzwJOb7xn}%)C2vm-GBi z0FlyjDiY52$&c2B6`;RzY8bMkXf4tTopfBTBR#t^jC3;P5R*~5DxZkx-ow6Xmhh68 z#Fn$Zzi04cjXeSG3f{5=TQzaa)5Qa2+yevdODIC<%tstG*YAYPn!mueZ*J%>I}hjd za|R@7qa**o`<{VM;ohZPa>mTrx`LB4!Yy$95F~sbsRSyq{wA{vyj+rTig>F-m~BcT z4|7W8ldz`x=!XQr9~pHc-6P43nAG36dF>1II=LBPO#&!t{Y{s`AUC;a^0z06=@Lzw zx6q<+86&N1kWN#fj?j)AeNO{t6I%%;=yIVLJIQ|-2_?Gnl?s@RieJdc!CpS79)9y& z0T)Ef@2kLKx}ohQ+Sv#2i`Mf5@(2lrsaJI`s~MU{Gb{Gb z7>~0*!9-|<#{Ex6ERmAn^&b+G?yPB3_4ThW#dfKMWL)f@@MRmws49 zLHu$TUFe}B&^!$>x6ff;+sqL6-ZU)hlNudj)J!6jjfG7no|8b8Vt-H1>s{{A%QGK{ zTSrxVo7?fSOU8o|^!0|x+Rt;AWZwB4X9Y4v%;SiBcKA%(f}Z;HiL~_;xLrWP?{v7L z9k~D9v0lk}r*C?*J}DiuS{g#FjezGcL3R2v?HY5f)|*}aPX&wirNU%oAt>5lyuhq! z<$3KEZAp}Nu)mVnIhUw^O+HwD0aeF;yM|rSjEy}JAAB((l(TsApMdF}PTgMvCwUR>_%YYFzuqLYItk$dU$`g7Z zQPvR;86m;RNtKHy>RiqdY|5d@bPr-G6t`Bv2u-508gki9cugX+N6HDCE@r|2ehDMl zP`(`XxrV&@A~Lgq41&tzywzmIT5Io}yIrXb*OQrp`loRGpP>?RC3B9paO_878Cqf0 z!l;|%{%*2YAdycofQ*1pF;oH|zY7aIZS(ait~3|3Q=G|SgrmDC&{4hG@OD~ZX=#<7 zhxh5=uFX-ybLF4WCy!>Ccd{5p(!KAWc!9C7K)!>m zIy5ht`wBrxx5o7l0yNt_xl+of2EjiYS^RGEXYIP+x%JC9QGMIQ+{?%(hde(-*E-w& za2~K6G|?@wZHeNXoc6hZm^*7PWT^Ad{hVmr%^dIg$DOPv8CGjF`boaMj|B4_C=b9l za(W+>2_0?LD>3?Qu6si9@z7@m-;(FHkLON!j&r+@R3;6L7s&WVKPh<{lgKrCHzSjI z-jHC=W)QRod)qFzc#1n1-3Z{MRa0?m`R*j&Og0}qaM3xJcJ@#4SoHxeo6&U3pXZ+Y z6(gOh59}FqluQq|)YXmSUI~y1O`XWINRd~_f1T_W*%CWHvtJwG` z58~O=$JLLlHOEegErTj-Ek}`=vhaVz0t*;Edbq7QUY7Ha+=L8E$AC=3xojR?UD0j0 zC-!<)^?r;OfgIVa2*7fB0Y1qjT!7_jVOaFEP0UIoFJeD(u|Bt))tR*KIyJr@3tdY1jzymckiY$+L<*Rgr*ZT0p6*qGagJ#HQ|rbl)jXGG;%m zuZC>x>;nS=Z=D`fG~}cId6?=w#%DhE-GnT!JLWWGgJS?D3W~bw9%F3*eZE%a9T&6p zf5iaqr&`soycJ5X3I>TviYIGHnN4vg(25Y3covEQcJBr3ZgtVMzPE&{@;HO8_UPt3 zxre7$N?e30d<3@)A7hmt0OFqfWou`aeH*!RH7c(+!7lUOSi0K>vvGOi=~M4NR{oU* zb?97*c_N|dq0FT8BX6mGsR088GD;$}*cN>&#-t1aU1Nh+U3?r;H6CDG8cxG$Dz~7~ z0bDD{n|D*wA$3b-JOVpT+9`{3{xIGfMS|C+VH*5gG4FAWeX?cu?oi2qvq^BC%k%VcGV(q~ueF%PRUkEOgFnD}WT+avGpcHd^(Gm*4H`Ybf25vTgGLsUSCJyFa zv2&VNdtgaoXxTpE9-Q7o7hh58?U|V%xfB54EfhvyGzlv6WM7w{uCY}a7eJO^ zH>`U+pC1@+G%On^O9&ZR%XAeSZwI4vI2){@CtZU7d11!l04oW?c}oA zAnW53&#;>lz+s2!{3izLZQY^_*~P7OMO8nq#EO6<+V>8T*N0fyT`*htSb_i>b~@`7 z&#)gvFI~=I(ZU$LhBxE01I9@d7ceFQ2u*oS0z+m`919L{MqYa2kI8^6S5RV4@P&^J z7c=as59f}Nl>?4mtF6$^WiGb?aqV7_03_ePbMD?0$}MSEvk2BktfWL`?8;TTrVdr| zhseSCYSKR*?x?Y348Z&%DBgr-_z_5t-0_6hR=VPECPQ{$sw<^P{@2*?UZ*@@YLvN3>mzN4LRknHcgL zCWjv(o0gq-%JSWBI;|Xo%>_w*l}><${4&S6FZUO;Bz-eLhxD~+Xn~R)gA2iQzV~V~ z`YHpZzJtVY?h~$Zx2Oc`LLn6;PHENemQ!ati8xvZqdT!+b;SNncAgoc4PJ?#$aZts zLJw5`wm|?!nd_Jxp*|D>;!*1sihrva2-0@sG{d1E)4GJ8@6)EN*0Q%sX^@zZC^H-C zx6OetV)!`lwF6eQBoG|h`oJA9VZD248BiJ2@~%(nI+!x}SYa)NdOK3YMGK;mOIJy# zQzrx)Tu2td%)>b7D0RgN-dKIIgUOm znTRwev;O~Us@o;7_kI0F%a%C5rrRwEOt}B6ikB|c5AY-ls~HrE(%6%hv7sfcy&`=N z!sdP_*pQxDt61x&>2UrIw?cdd<{OOl)zwyopTqMYin4CG*|mX|W$NZ0y_G+kOu>Tu z&r3UH3wk0601Has4!lr;kS~N~!qp+8TQs@Wf9$o2Ly1kFbiZBwA{BMRxUSFjHg%zS zN`;$J@j0N)1-$h+BF)psqeGHZM~j6Atr;`7zo>-2_{+suqa~-!hXk?h{Eg9h>v1iq z=!jFWKa+~>WMxQ%t}g2eV?J)u0)`lPzYEADK%O4wR~+I)i;K=pC_POFXlz_*VXrSe zxyr93mkXYK+9{5`Qsh|Bzp}lP$da54Q*Am0BvoT;8*E|3$C|LetWbl1y6#Bunn3=H zcT_|&alU`E4{`xsgq})uS|HabQ=gW{@JKsk?v3`WB9vfip~@E>9t;H}Se&2-#ZHA0 zqJZB;dAHAi&1oU-8`VRs_f`Z^J%U~oTtotH1FWh9nbu!40{`=RKJvYMRB=?J z%RGU~IZgJXP%Avuq0XD^CP_Cmow%OMkM8SuKD#%xD~M59kw;Ut_^>Txb8r7?VkaD4 z9*2EAuTR+MT9)@Y`g4rhJe^FEf&~2dvp0%|d<3m<+IjU*F5t|D4%6`0{s^}`(zUET9bcgR-?-yd&5thbuj=>xjiaf$OT(fjsT{Df| zw-pK@303=ykBI#8Cb)izPb!V8%Qyu;Lbl|&1W1bhXs{A>j!`~rBEN?pPxsA$!un`y zkz3bH<_wBM$y%>zP<7Tl$8p}1=2cs54FwOo^>>Dc5M6ulfG8c3>wJxc_RUMw5Z7l# zeqx~g$}qf&zag zfdnRe$HMZ);t~03P;gnFvs1ziozHPC90@7%IGPg>v9=S1Bhl{;Y6;GNHt=c`A_1Zc zs{;-;cxD?7wg^<3a)3p`u`{|2d-MlEyFN}%W_p;VCb}1O|BjW8QB^cO#Dr4}I)Kr( zLJ~^XfGALXQiLRI1>kyZdIe-$U{rMsd>v&!d?=y)KK%;&!(VD$F=Rx{NEA38 z5`2GIJ*m@v|3;zl7E^ZBo2ovTh&@|>FGj5522QWpCkb%wtDY&_a)uI)usR*yFm*x3 zdy-d|(1U#~v zF3c@83D@&GA|M1*LP4Xu>ShS_0G~L~06%|H~4Mk{Y~y z#bLT9?dYJ!i{O|-CbZ;3RDjx<$FKWpQ_Fg9dyIMK0FlCpNVe0l7$NWOH_b<7Y7jj?Ua}%w_z2 zpFPW*|3%6IID+r5bAuTtDjY)tN#zBUm9R6z(pk+c`1)Nu`ZP$)^?oUdmN`VIZR$d@ zW364u1K2lYka~R?vErI3_0g$R33&v6wuxh#)XvjzTO-|)=2UYl{ls|v!op<6wsfOv z`^?L#1G7;dMotJMdXC^#TF40TO@48a-)6ecOR0KZh`02IIU3zsB{M#As*O*ce3Hzj z2O4-?^#yM>+U4i6wpHJVg^i9i@hDqgOLcXjOycX-O{?Wze4=HB*Q$`+v*<+=0QTX| zA{r}UtURPfcvHS2$P`7NdMjMkp*I4WCIRT0O{xgnSSYn}1qacp-Mq);ksjm+HJ6NJ zIM&v}_UtTeUxY^mJ69YlmbJM4szgvl$8ua$fbiHCxN`#vhZu`I zGR;J|X<#uv66uWqUosW_$1TBnrwEG$?XXPz6UPqPK$bjMl8vJ?UP6(^%lM`65v{rC zmG+i>6@Xb|hyW3i~!1DHNn83vzW)^7}exS^BM(5ULdFOM)DF z@cn@7YLZaqnRBm=(~ffk_K?Oior%q|WwUym01)p{9iS297A8j-_{x@yPd#tYK%iG+ z_!Mo_1Mp4u?k6RiP|0qgltw}biF7W)Wbhi zFXe@oJ9r~HY}Iwzylx)Aa$Vq*n(gFt4g`0eN)$~GwipC|(E@XN6%;{KTys-bhdSS= zwT!`Q3(gx0Iqw7f?=54k&JuFAnkQSxc-O5C@u(!D+I`3ga5~bhSA*e2MEFd}<-ljK zy8``B&IABaK(4lG4y>3(x( zjA{2pemtjig>_6iLQ#*d)76fZ#-c~n>z038aCyV_w>A=V2YbF#7Dze8#Dp-vqo#t) zm#LEob#~XiueY!OafftY-!?}!l$h{I*mf-Faht%FEW^=g{smg55-{rz@X z8?YpVy|ydFrsG-&)8Hb$!G9C2D~QEekqdjQ@E;0KxCT*0@C(o`?$#sdHJtpNEAwfZ zUVgyhcO+8hyVx(tNtwQ9WWo{KM1BhOKkG0x*7|hGaBZy0#VzmnkNpoD;=YvWV}Fe@ zIY&?+vT2@P3+|&`nBIp^3z@EXu3 z5%=Mhpf4HPv32nDZ#)?he5lqEatc?Sl}6&)&N}83X?Z@^cHuo4Fz7^-lLtr_{=tAr z)J{+V3iCBKGFaDn++L+Ttd>vCuD-^1)S_LfCae?=ZdWXhiJRUTN-0FL~C=QU%pj_HuppZ|1yY&C7`Ov+5EIH|24Fl@D9dU!bm4>q)WT3OU z2-}7w?%Inb6V@><$!AGhpOd~POpEF?WF4N=$v@p@o4I-cf=9Ykyq#s$18c#pn!ot5 zicCi$xc0!G?58R`kFtl*k9Wti6FzjB{#l_)c*GKCsVRgHXWKEUV~~(?=tb<<^v&HC z?*6BRclZ5<+MsIj^QvQo8>3~e8%(suiL1}emMkLNCiDwDB9xKkPY`rqsdDKe-sPqZ zL2S^LHg>PCRvS6l{~$X%N@p@9U|c?GfB8@a+2t;C6c=cjtZ_PTu;U*H3?c1Z|P294SUs@S6~` z%dMjL3ZJKJ)?4Qyfm)Ji2XbbIG6{^3e0~{#6cKn6m(Sk|VZhpM0Ggz?&kHCd*nK$( z@W)2=#%$>lI-J|mPap#_ia%I4xvkWOu*0TT3cLnpd^R9}d7@oK9#OIBt zrxF0G0l7x2`Xh)}vbDO|^JweoU^bWsJFVTF_&)4>dy!Jj zfX+8nQ&YwSwTceEi17>oMKJyCh;*B4`)MeZNzdDm%IKSK$fx=puZ{0mFVmk)yy5n` zOx}ir+rY5EUJ8!Vg?&)?QP}E%7s>nA)Tr#v1)Z;w6B0NR@B0sRXbP8G?N9P;-7X=P z?C|*C!W4nJ!7DVlGH-SZs}o1PNo_seiJ7zl{>>@F(5G+JPxjcJv9c zQXlopL)|kGeHo?95Mqe<4Jk>$N`%e24J_Bx3N*>qASCqs9**?gp?TYLL7ACnzaoBl zsxRs^Vw9Hwk0hM-Rzpq?*t;-%2PQQ6J55NH=$RqgjC`wVJcl^^Owbe^&sIi3GSC!B zkpF2c(?yHGbNWHPE*m2SRow2_Bqf~i0JLxx3?>AH5+ssG#&X~rl#=a zxFPY7k2vvi4d)>$fL<;^I{2qc{?<0NpZ6AJHM*kCGMJ^M*fY#^IR68Z?uY!drV_%Kk!v(&}j&NZF z^#LRsS~GaHA4yuXP&@&4>n$rP($RikQ8mDTk(6`+@va(12j(!;YS6OT)45gl5Ac?; z0OPTfoeb`v64JI+c1H|G`c~Ozq;dfuR_hocP^QmW3g>!O ziXr1su#7R60V9t0h9k%dG!+zT|A25iyM-}0jG;VR)rN{cEGWlGN+ouonXmksHCRFC z@q{05=_&5R!-0hrW1u3shbM>qna1$3S=)`k?i)U7D<`ez#2;qyXMrVWEkeGQ(n9%W zYFZj|@7663tia!;_3mVTftbXk+gVM)+U4}RY;v+u^0MY~0tC z4)#MO*6hTo{XDyeuY z(mz?+kT4o?i7d@vw)9XdzH3s%gAYooX9KRAR%NdoG?x0En1d15_@DPcNYg50tKB~M z!>f=hL8f&;J@Fc$rH&O#Ad|Gpd&J3b*dBzY7I@wzaS;0N{<@E%b_z{wse^_vI1j^u@#OWDz|vY! zRD+7Bxwe2CZUAk^5p?RkHRm1K@cCVzhOxJ`zI&6#(cUtdF6qT)n0N z-`qk_=}MWZK|4d|=#)?L9c)xn{>n;&339T_R!Fw~5W{As#W!JDh&8D=s_6h&JWyxG zy$WL=wGH-wW1#@2N}(Tb^g>@?z^nVetb8Zc55U{A6(1>UI_hR_hURfQ&}~eY|4?R* z{Ra;y-@{75Lv>{6UhT5>c_}xPj$mm?=IkJOqu^>_FBFM&XZm2mWbnD2GieWVraAX| zA%(&`siWQ?8CyXI@gB+jz?jL9YW{?M#E!>C#GDg$!f-yo`Th|x^UAXA%8CE$Fd7Ymw8~wn=DixbJ9iOislRy z?3ycbHnfgGAcK!2>^Ge!@Z_uw)$JrfQk#}G_Jf5a>p;uBWq1#Jr0V}1LLRPf?P_bw zA`bs#PB~2WE%>y6pq?l6i!j_w6zLKOQuuW%Y(o9_;^y*h@gcX63RiJ4=ci@y?we$N zE=G16%_@RtVH>@5FCCbWIiqamBGi8P40^O{-L-iE*KR3%ty-+B z2ZNtG-JMH`NS7WjLPa?$scaJ*E%VA>pfZ*Ti9G`K`%tO>VxOS|YHQXK8cp&kU=p*S zy@cIE)637h{~S)LAFZ!>h5)gD`#Nw^Hb8oP4wp`7+Ygp~>>?4a_`Fs#uMfTN50X*S zNOC5VU*pdP#Wq?>&7gGzHEm;sREGQ;JXCm`Cb(*76k*$*BUz$5j|vM5OaO9;)644J zZ5M&~+7Q^~cj!lBul|A%IKU!K%f6CC5jrH*U8IX7HyyFSE^A}FP1mT*s@&H*7}qXN z_HbKbd(TVMxPx$z=37`+y#n6&6pApgl`Iv?x?pBv#_GI3{6o z@xXYOB?qOBQoCk#7=Bk~n|&7Aspr^l(9wNK`(}+(nSD>-fG(fv1pR)?88LZE1kjW> ztrXRoOp+}z!uIu}M2qjjGrrt6_n|m_dwep|r~=ICYV57%#h$$NNtyg$fytv*5Os{E z;EEm4p2Nt|3~-=AJZV4SIC?@o=aV?I$R)GDwZ0TbOUnkkJGr|175lblN6oveLz_-o z7=32RQF-y@_vlotNdC$q?^>r3P9H(V)XC5W^-NwfF5H-k7JW6UJ=o9#ZBCZ$3`fRd%L7@&ep z^Wa&r+!g63#ujUU2Lda`pX%wTb92%2l*h;&_vtC!-g1eih>g%RB2%+8ZL^C% z424q&jPgWU?eP*BDNab@)NiZVzMB!jWh`yDBdBgj#T}>ms*d&BQ7Jyrv&HvA8ffDV z*8#%HA9$vk!zlU5sC2+7@!UUB%c(DOe2`D$u4#RW2ij44X`x&>` z&PQHMKiBYU^`=78MV99;nqOgI5kT-(*vJ?qxA0m(EkrpJ72SDzh;X>$CYCHvXgov& zPq&IaR*nP&44rEEzqD)1&8u!)$n>q%vTZ|K-zB}^s2}b=gKLnA7j2V%Gj~8LqCWWfi_=5jx z@M9n9XLdqy?4)Q5n=7JWjJVZ;`7U^%NK3Z)b_4OaVtsBkGA790$}MdXpk-X`$!-?x z8sJf6T;5v{Qd=Bo@l0TOdnEI(8B{@7oMY_~koRF=9u}>u7ApthEolt2yT8(8^2S1S zjZcakw>0*fRQQQ5)<}~R`73fQ?SG}D@{T8V+0*X` zKVh+RNRmM*8ND0KVIcW}{TlAf6tIpAD1-h`n6J?^<)yEd1@N{NLvsOv15j7F4~HJC z2Jbv`t3fm|c>Mv>Pp;fF_L+M5tp`GlbV4rSW33!33XY*lUv3OvYXmM~5E7lXsOWRW zY452?A3rvmt%n2Srh_w7nQD0wiDmq@gvIvYpGp3H&i8g77!>Q# ={amzY+NrBV; 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≺_-RAI8}3kTC`%!Iu!bSF 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

VnERr_6&9DJ!i4Bky(Q-V@ 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

jh*yO8d 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 z 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

R5`0AEUG(+-`d&0VF-zFw#oc_`sCmBg%<`G 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�twcEB5+cZ)Je&l;th8(XteVJku3EOjFc+Y4 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

_6e zN0DQ}zzIP_U+hp>xGtBgG?AKFv|k>r`v9aSmo$(B`J#DNzlZ!{ph~JKoAtJEcW|&T z+`2t9i&Kpy8kNUu8ru9X`Q5P@&soF;L+HZ0i2O^c88Au3B0rsav$((`_bN|9+-}7= zD?Nh$1>rXuuh0VzF4Eb-w9{FwqM7cmCei6-@Rs(8yQsLhArNvcW4tS34$A$_Ud8^f3ac@IJ;z< zOgDOgh$E+PYN=pN{|!=YLhW@X-a3q}`U5;(pB*sjUu8)%4k5$C0uDogyJu5OqAcOEF+$B6O85mNR z+7w@(rg2Xnu<%c(rDRo2t$iNFSasO;-B>&d+N<%kPcJI_dT*;i55dubxz^V!mAG&k z3A1>0>K4Xgw&l>?D;n#IN_6T40J$0sn2|k)iNuaN))Fgl39EIpcC+I=?tyCRU~9={j;Y1}Z&FNyKnx&J*k7Y^q7*HMCKMI)?h`xc_J zSg7g$_6xXw3Uh7CUPdYU%<@{Tl>PS}L-5D&?ZQw>+Q4~^C`U3i|5@vx*?DUB z{qK}!+@Z@r{cykt^fR#JYP{~>jXnu;wTZqB+QC_AkRSolf(h5g<4DZ#&=q9~Z`0Eo zrXoePF~rq0&J1^Pjo)c*arJ-0WxWX>eP`2h^jfv|AVNNg*$8kzR+rpjJn_&Yq;-v|zbFtwEch2vxCt9pz zsba46g&PV$hfL$>zu?02rzLWZ&T)aCRgk?u4Fb`wzxUCVroR41KS}vjc)g!uvRW_{r3wNK5HgptX>zm)}QHhUDT!t zi&ZgT=-#x#Kvb4uUeaY?*~)1O1t@U=YZwO3H-k5`TiehQZaDZuYxZal>HxjkiMWHQzmS&|yp+A>&eg7Y1JFFLsT-sXJ#F#f}>?)HXNc_}rr=X*d5{HP44W zmOBSIJiA0yuvL@gd)RV+@&<;U^A;QJ!GWgGv>t3L$#CdvO?shFc_(2gD*0VZ4zsDg z-eq|QE{r+G6O9C$AOXlsmioZR61^ECZ*u&yi`WRUW<%jcHe~DCQfaKGlhK}h(}TGk zP^;R0o3q#o&gG~O;dS!jaKS+O4Z#?e6cLYVGd3|`T_b;gS$dWuY@egPoQhABu>)~k zj%Ry&j{_QpQz7BKwoAQyXX~F!V~KL9%cEuVzUkq9qs{XVhr`8mOz27;MWQ6-h3O{^ zz?9ow9JK77IR(SmT-d)q05ruT7+n;QL20#ip>M42WMptXAN7&)k<>O?vCLMYSp;RV z2g}tt$0N!&azHi$enZuhKtV_@E%^y! zME(bMm={3_tgD;LV_c=|n!cgXEaR}1BIJ>}lfHvVr-8?}wf>)-k4Fa25Qs|Lrh6@T zP`gR(LEs6TJCf2Xu2>#keG$M)JnNK8#C)A?yAPYvMh9t32PN5tHVVOTy z3YbD&h#vf4-!+>hbe`EJdtiw*X;e7uEagopN9+GAtDQzs&oO8g3WPo5G^Cp3{}vGp?peE^*h&^;NR-m;e0Hfm4SAhOwKGJ6#iiiPj|%r zFBRz}UfDZ~lU1+(olO_0#bG;AbNV(k@KGSxz&5b}hebe0xxT#9T(Cq~xoONg)8Fn0v^HMF^R(A_n^5 zaEbtBIMc)rcV8fvU-O8OhlBR>S@{{jhB2nm@Q#pK!+2^kkkK!0ky7xvWNlACmlK$L z-c9MAIH2Px_H%Bsp^9~04{j(-6^>D7L%XcLz)ceNr1$%DI{v27oS+)br`nkipQ~4E z1MMX4LTVy}GxvtBvA5OE@J6qHz5%!LcS*qs_``i|*&D!6zZ+d++8I$jo@f01H;HI) zCAQv~3E?y+Me3ir*|uvf47d|u9Qy;7!tQ%M7&qrvStL6pEU`nduI*e+XyMS%nE%W% zn{D-q)us?N`2f}Ic&w%$8?JBCNgG&>qxw;~g1FZ@nRpNqf^*UH5|Klt8#Fjo-XB4Pw&GvLj&72RTIUtTrwl^qk%bO@#gh<$nP!Y5iFRJx`49iiADsfd zLK>FzU?a>^KQ89tK9~?X@=3~NM&X)ztkX2uo}kiQL14xWD2S-Ut_B$P=X;^`AFaGe zH}uQP?sM^(E?Wbxk}RnDS(z}dKZD@?aq+la8A9Z#uHix+(VC>FHq?V3efy+D_O|&} zFxjF7BMFb9AlIC<<5oE^Q*Z$IMEaF^a++N!UmxSbpenCainR+oJgIZ7fc$2hpDT_O zWDi3|q$PN9Q!aT`ajEc?4Iws(lVM0RjddTV?Mu9-xjFhX{SOgX2#aZG76$|MMnLdX z3~8GzC-PIP5g4P}l@d z)aM)zoOdDMzm{NrN$Kwx%^#I|jRQ2ZHbI!+^E&(_oa(TnJV0!) z$RGG>rJ}ry%)WbV4Am=V3AxU)mNkQ}1Ci%VqWlSJp7w2?U|S3=SUu-A#Ga2ipf#3~ z^upC?P&p3i!k4KpUEOk{!zfJ(xe}t%6+g*byLBz-C<~%~k9@rHF^a>%2Q4{aTp%3v z_VB;6pE@^C{#70lT;JM?>tr4cHn>Sp1Og%{qW%Mq^ksVv%fM9-^}`)`bayAyy!%ef zU9wh_hV4*EbVQ%q(h63utlR6Kj$ZYz@jloEPV5OXHF)qAU%dn>s<{nNEoF>}o;p}( zZ+En(s0^qcP@j}v+~v9kwX8XO&4$&->7 zn#~8T#e2~1oSzcbBC=u9qFEX~g30UbCmq?#>3D^R>gw+@Ws-)S7w~qJz~h&eM=Hk` z6XybN+GT7-Gx)YMkR;PZZ_9@?bHcNTpsxa!lm(zd*5#WICYFVVbOtpr^Wjsn);uKH z>tP*jmeu)i&lPSY5n%lGdobdFUtjD-0`qHR<75?tcXey;vd8J2p*CKu)&r<8E|j(F z-IGnKv8F_IABXp0(0Bhd!EYO@@@67hC?k*T}zD+i- z=^b{ZR#wbhj^EJxOR;x5NgvY2=9HWQuSJe#@{lDA+?Ht08}{Ns6NF3QU?;-OjaR*t zDWfN!VTY%1t~MbuxE%7q^sY2!$80(IOzcif%A_;vq9ITs76+$J@hWF|qM(}`A*7zy zrCM}W&-1Wg)=>Kpwkvu8Zs&TIo(ISxW^(uhb;|#dK z2Fk#^rf$7pm7m2r7FQ0bm86;<@Dp**gg+$vA%C&dt?0f{tdyeI-xihAj6dr0Esv6m zp@uxeNPg<)`q6X;qS(0K!DduX0^j}@fCn_(9o*TYbhe7Yv3kfyW0cS@1V*jS^C?Qe zr2*OMHz+&|h6D6P@#ic+CYm}a!fHw+p8bSK%M|3oNtse4UbvQtv=G%oIb6QQ+GE$C zsJvx6eTmv>!aLEpaO^I|WBaI{yV*yr@&7J2)oNtopSphB))Mu zLPgx#Staa#r-%nwCoiN0>CPsVHi_+oF51kQ(lj|0wOjI#o20np-Z(p$HDwYpP2Uyq zkD8jM-)5i+KQ49^ZSUEIU3bJ9{|VIc(1|}$d_6y(aXqvQs+0BK-9zvO_F%HsbC!V& zv1ty(C#~%4VJJi^rsqZWzTU*?>-3N#2qT*omTPTxHiIytbcq2=oNrJ8fHh>e`E*Vx zl54q3VC+$Sqx2-bT_))IInc~=bSBy2k}3HK2C3yH@ywS-*lv72jNT#>!bq1Yr#InR zTH1yV$pk`L{MN{85ZXpi%nD(qBh_${3ZgRizOC9a^-fGLG3HZS=C||*=@-{zR9n0q zZbN3Y>Ka*jmXmV!%#JD;B|;nSswJ49Xn>ppx+&Mu+#TBQyU2gvo8CV6#pFp$u|p#UhK?FC`EaBBMNhdn%^9;g!`>i-rbd zrS(WAGH&45S`Wk4QSHs<8FhnQ1?E5Y*#b$i7^DDohk5>2^*_Mv;apsuWFN}etFVH9 z8n;4!c}iEs($<2bp1xuj58psv!M|-m#k%f8hDE@AC|wc|;XT6TQ~(p%x-pB24~&Im z9=8#la$)Id&)(UzB)E347dUho_>prXxqB)9fw9GSe;d8Y^W-yj$nYDFb5e<`i0-ZU zXtt3#7tQcC<(qyunR*>cX#@V}ZGgZgX?pChE1G101 zNp<3mONXz;;Hb_i9_SL@=l12kSYFN=5s8-A^n&c56CpczJG8*xKe zE3ZWaPz$rr*TijD0o2atp~UAbFM?}6Rz_xANPfH7QV_}?m6jI^14?{rffQXQW&sSD zegP{GUk=u3KeRwx4Bk83Fh;aIRMuTttoO?VXob(i^2%&JooUxqfo8$ijQuVkQ5Q%b z?&ej2&@Qs3U9;U;WF|03NYyAT#@O;anLV|tyeh#m}A>IU$qd+ zo)Wtix<3%iqjJH~e_;7{A&$p{(WWKuB0h-kzfB~B!?!Um^iLc<20)c*neq-Uc51um zVLdRAvrEP%B)3U}v_*AUMD5=roWg&_79P>2`%|<|;ky|4kbse*_>RJE zO(>(0kYpxe2oJcCYm>h0B;OALpx&*&P~e~@|8YzIM*fL#R4_p2a~Os+m8biX2?+Nn z$xH+D$Kx`w`|git(`eMJU$s-4uBX0%jTYC2cHhg{65*Yy_i?a~EoQ^g6FvM4x2)wo zE7`cUnvdbG3^Lmm{FylRaI2F|Zk-6TpV>viUaSHq1rn;xTMoY;u4U!i%!?a(r zOjy=vgRVk!%67_l{46a84hPzyT&cDSoa-oOM@pZ9ip-;H825pIb#PPhFF&(&F^)l%>J^VIysG#Q zuV2dLG2lWesr$Pbd(IICu+^;lbArMfmNFK0fT4eIbpkRwN52l8^W=;YbwkE$&_jY(tdjM<|kIx4@IHoQ`9-z>m{au z>mYU^3Jwt&7gg#<8g_%$6bV`L6>@7X%9JfQSUZ{G0?E|YPwzKe0M@BdWgE(pDQtCZ zKVEeWw$PfwF-H={5}4|MI2IlPF`U68MQE}1fnMpYz<4jAR2&9W4T!8xhkIZ)f1yGd zOEjar>GZ_hCRTmxZX}noqEft>J{I=k?&6LwZvlI!zG{W-V{H4f3wpRipWX2yP*S_T zc+Qu3Y+8phwr8&JPH{giyZOVHZ2lu&hb!&JCTPa>tv+%pV7&iJp@xrAgO<2W>{u_0 z>ZT{x-rjQ3IIx&$a5sZz;(UD?AsjYNF?Q$K1zAzOl0UN8DCj+ zKhrp%hV(nuL`nea+x^eccMn)s+U)T>0QP32l1s*jH@s9rX`+)n<&}k`oMcEH^lc?F zk;)9=A4zl^XH~pevi<&uad(?Ae2VUFz`LJyRx(`Pw>KRFriY)j-dane$@f7$g5|DI z{}N3}N{oAehRiuwUeHZ21iAf!=k_t;p&)u8@<#PtLEF0VYS|%+y%mz(&cLAFUd?+u zYhVxWNPC0Zcd{063C3pn7Fz<_lQPF7c;}z2E=FOu57TJ@D6%ly^a+GZ_X5Qvdha{) zk`QHhSAuA!gVvl>v+V!j&IpCCxV>|=fkLXdYy6w=Li06uQ0*Ao7$U9vcYHCm%NNdk zj?9C7{PUKj(SE248-@n5Yf~9qa+;Q;4w7UEgJ)yo&-gdrZI@R4LcVY;54Wt(SYC?= z*jV2X||9!Jetr=14cOpi?Dwr%+OIf7?Wez0~UpwR26lcw#>VVspc z9s#J4OwIjvGEA&R%Y_|Htr}^fuw%X$1 z!oM0RNn8}1WIv&|IbWl=P;f8-F7RZK<{x7#b_@t~x;u-o$Z*UD^aK?t#K(6PeaPa8 zqAxVywaYdG>#7e@qy|-M*0OjYM_wj6eO#8^n^=vL|MqPHzk9dKV&P)z9>%S|t`N;80pJ`| z$;#EqaPT60swZ!mv25IwTMbOUjY+>tK%BiP!-dhOZ`HDIP58+`HW@(#v4w+^-sSyO_K+(@D8*cmhGjBO zatsZH%xuX`HJ&0KU(mYGT~AL-$mrn2{ieRzbh3cRs}?26spklXzrPv7b)M`$>Rc?p zpk4M;LW*$S5+O95XNc}s^o0b;q9NppUpH}nOA8GLBeI=&M)+3!cV%D2?@=u=;u zpP;Jf`w)IO$dB<*)8iy+6`ObBPsB)Up`>O&7F0Dfc&4vcR6>O`kYcyp=wmfiIHQdL zJj>qouGTuy?fl{Jr`UUDUiC8mZ3J3_2$gEx#Tn2+-L^JXDds|#u0{zEw57RwSsd27c?3dX!GwuQ(v>^;p~cmm1q180EVggbooQ| zlOGEV!1Ny-navr@|K?{>oj&1-2y(cTaEK%dHg^S8Ger47J6<3{5^=na>Wb4yCHQCw zSqTRFMDRf?6+fC@xb`slaH302_7Pm!fXQj8GdkC8q-XXQo#2f_lpy!kRoocyYKoih zuiK|(QnY+~=IcIJ$Dt9^9HW*(l`|J?lxFSZxZRvTW%NiO`75(u8DZ zl^E#aRt7L$V70uhM(@{Qk~TUFGLuakT8wCw3ndnuu0l;#fokFjazyEfQEDB&FiKf< zRO+>^kGlMkm6b{-0Tf_zIn^02>g*FoH zmdX<65_airdHAbX7BlMpsL~ub04d0ilAF!Y10h&GDnhYT%P-p(G-L#-1w?7@NVjAbhdQEf(%SC^BdybPcE zI^z11m%&KEgGj1?_}R54;M{)kmv_nBKTO4*^QU)J>`1QR5KC+OcWCzO`}AbC0K5iT zba)k`_qXc7@VF$GvxoE&dYPDk82Dp#zCfYfpQK@EO@ zGWEK|naNKat&w%$j?6XhNGq&w@fQ95fhXHGzM^*EBMXz-%k?FMx61{M?3x0MB7d!j z%3pDdIoye#yWspT)CAzPrTTrt##C?A22+E&r_=j71Rb078oa*HIs4YR2|>J-~Wn zLxckUqfm%Cpe0~ym_J2x#kxDA{6d#H*{csBPt6h8g`Sw?W$Zdqm-tgk@FP59hJ>P% zh|ZB5CiGE_zd{FrS&{i!5`o`!g(+NGJa%Q-INH-6&&Y0FnoBv@#=FPkp(g1_(?TPf^SVqqKcI zr*PB>+l{r*?vVW>GW{>|hEgf^%K%3Jyl&ONt#=#8NYgdn;4s(9q2DMZcY$ z_<9%lL~m>7(*~HeeCe`RAf#&lF!HZ-wvhOO6zCvIF~a0mH^_2_s|bfQhYqjf^xNO0 zP*4%qShR$>7ZNSnL(8B zZNI%M0Zeu^TKvpA8b(gk{d5c;?aF0Kb$A$(Wm)DH`((PLw$Ye$m;SKy>bJ9Tq$pKL zQcqA`mO+9BBr=_p{qk&bR$f){_8booa=o!Ir(P@TZLd%*Mf3C#$;_FWs`q+D?LqIq zg$ytG$;7Y|K&?%>=;EYyjs85i(Xf@LdRr0e1z3aN7FK{eaRzWGGQ8V*x597MwqZ_I z=K-ymp2&hrq=xi^6F|Ag3r3|hu}rX!g4HLn)Gr*nr!u<@|JAbzzvc8tiA%D1`x~-< z?9H`B`qa7@8@>TMa@Bg+*$9UI)2drJ95<&+HHh`G)@pXY-679w!GV2?y^k8*PXw!~ z_!I~ zg_w0xjX7B}E}mX76c&kotHm+bO{#(^gdi44-gAFG-7NdQ&b*nC$Gn__WA%8DZ5Qc@ zWtZOvzokJlVpX9#{S}GhMa9+FeptLxh>Wp0B|KsZ35~hOw3qq9 z^W=wO1%o2xsAZf%i3#Wd{OLG&27Xch0_l>K*VzVv?)q4D&+ul( z(Efz}G#NCgJIMTYbXL?ft}qNfgI=6VpHRdhFg|k`y=Fboyflb z)f4R>`+C@(HetUS)}kHIViT|jSu!A(Nx7617wIw>J4+Q!Yh`58V$Y3`Cd}Uh=#L6- zY|4kmRN-LQHNo0KT2nnd2M9_s^~G-5cXrhlM)dkHqW**r zn5;%MaJ2V39m)B$gWlQa62YSCd;c1ROLKTj8@sE9f;Mx51f?a|VBd3L-_NA-$!jLa zf7o)rVAbBvcIUgi9>B7w>@%7LLPvN|FUX@(W~U$#9ez5lx_(FC5Hw$iNM(CmKSm@% z(^ke!GjLhuixIu8%@h@rf=0`o^?o~evaBV}iFH}~%fq65n7jZZl8+yOdcjHDp>0my zg;2YtRG?H~yrz>hU_K<5Mik%;5Sr^}l0Zj+!9njDs|CdE>p){KuKbq#lsGV!aS$hb zUf`<=B3&hr;N@@0JV%Sm%!xRjAtg9|3_I_OXH7~|gM;flkDL<#v;(1w(UuMcWM0At zf+u+z>H8nbt$Kq+tvlj1BVrpkosfbA;e=p6#RkN!Pg5aKfuYZn)6RppMhx~Q1AHp^ zN;oO@6|9z{zx`20Q!%VM`t5JuRyA|)(J*we1O9|MuuaDN1Irroa+NXz4$r=zPT4m$ z-IfOV0Ljp9N~^K00FNznI0u3Hrl zqV%}ROS8{@U-N*l?pUvuQ`_;Ekc;s)IAW(|V1s`FRknIxnz z%OJURJIGjL*cwxi39whneFVlDVH zYboZHDrCU20s3rSum1-%Cy~#I(9JX#jAtTzfiJizS>_<}Uvl(PnBg`3 ze>?NRvTyl#4wlHzKA!B)4G@p`e&=q)i#*Rh1l$LNQ_LcuQVfF?K3?%u8y2AtUDH_2 z4tbxRLkxl#Q$CN1?NzchU=)l`H$E2o8gpe zukNNpQ|Wk6kuDs)wW^U!*KQIzx;v@V7{68b#XFWQ#L{g#0l--y$bFP&P1OZ8T5Z0+ z5V3mS4{8Qkt#AFRp!f<0{mONp+-@hwwPg=FkUz1iHWG)lScn@$v!tfbY~Iw2LXgk{ z89Q5Bh=k(;l4RoyKFyG&KkW5-C=TppX(QIfkl^YIiuG#H{;5H8aoMTFUmZ2Y7tzXS zigtI_HpJ7vA1?1H?lt%#P&JP8mNk^kW9CcTLyEBo3ukP!38-m~nDXNeG_W|%VSHqm z$DvKQ^k49(AU&+fVho%L32->SGuGaKj!qFx%5{z>fqf;=6Yo!48bE#vFeI$Mp(o6n za6*h_$P)O(-K2YO_U)2|txQ-Tyz_M5jVW;)4(^+M{fdzKm~jCrdGOft#+en`j@xA! z>*23cPMppF%a%|mIVg`(L{x-*?q4BnZif>IKr|qz1K#@rg+M0=T+M>$MJCk@3Cp<9ryrZ0e%ASarrQl$d5d?p#y6Y{r9(#qrNIE^z6I?>XLpG(AUAVZ!0ROKf@GDhR z6&NiIgH=l41=9uzQ8_JL=_JM6Hz}ZZ=!Bkg6pKje+^JDCf-wVTy)zIeAPW7;{8QeZ zRexHDg||c&d%J1N;S+WJGn_+q7verl zs?!*=$R#4dY2p56RiKSP9#!oF$wxEF05iUL zw2KczJdp*>Y`RsGJTqs1vI*y@z^FrA$QEY}P2aE=E(SGjAgn@{mxrC$QsDNSKYBT5 z(8~(YiY0j*6y~UkOf`ZJD_f}T5@ktAOf)evBnslg|H7|un@ban6F@@>Mp~3h!L}3Q zq7N2ba5+gN{TaFCv0E{0UPy#^7N|Y}3-C@|6F1kkhRave4M@dZbqA2l} zf+RJlPo*)%f@3GeTv(D2*k;^;bl(J0U1a4x3N+Qb-*&zmjWJ9m>dRgWJbLmtpA6W_ zgvFV5+-H)S9$T_e0!l1IBeV5>D4rG3{-ovS`jLTE09w&6bo(9DDem;C_i4fLlChcJ8tAF$!%clJFlKo zCE42=aC~uakbA&Oq=TFA$9&$nyuki@GTNL^t_jIIu7DJl7A(%}Up-C}6&!J?SxmR* znZni`<78Z{KTluf&%p7AR1a)8_*I*PTSjYR0^;q(X3hgmb+HlcwCv+LX4;#x!60(b zAl;mXECtjQ#%FoBt4T6jCT2TQ{PwRTd=}X0c`3Q3(sQp#e2uZL5cn$6=i1{sT;=xf z2JBjqR@ZcFv^dkqZAi{;5JNquKf-+6pA`;ajCUp8&5z8h=XFn!$w%$$Grq7_@|6|BoRG^M<2gWsqgf&K zTbiBRpZnIy{G8Ut28Sgm^Ro^C%4$mYpd|OmcGkMK5&upE2r_&pEK;g-@^uPqpg9Y@ zdob*agky9KeMG_w5`iaD`o?t}d!*>UrOWcM_>*hJE$6hOUTz!%Ce-%W%Ej_Kc>N@$TLpk(K~d>kG`{4SEWKp)Z2y$=pcWebIRHjhu*=lFk;f^k67ewumx8Fz@#q zEMSr>r6uuB19_rMY@lHB=A%ONPjgDZ$I)#%Vk_C6yb<)tWJD$9IK7{#DWG!_?Vt%q z$jVH1WC+u0WI1&jMZV*CAs}ci~ad5;vX@W(WXjK$OC&ujro-6!Rh*{hZGht!iYSqF0wFXIItotA)Xd8 z)h85;kYT@w-^t6epj1uV*WD&nuo0IocPLe-7CO-pBMXmXvCSl!Y24_8XWaQO z)Nus;9}$Rq_jQTpxF+#FVD751ib$=DnEQ6&KUQ}~!a;+;@0t*NAyoTbmHjd5leSje z-a=O~zC$d)V2D62FQln>`wNc0bvVSbIp=pL^Wrp(id$pRuL%q@95Eo+8s9kjs_8tlPDe3@7|Buq_h=2@IUZy` zy?%Umx}KvVu;g487-8GpY4H5DRogn$IZOX8(wwHmkeeIU>g7gMj`F!LVex=}FbMuc zt)I)IW{KH$*D-4422K?~&L8|pyC=9ITAyBVIV#Q{=RTF2T98Z}F9@gSE;gO-t@%`miq~8L!ju<4W>PUO{b+07gK$zwjPi@4Z?@-95@#!ZZ%`031#N3_1^QiLJG3*;A*( zuUa^@K9$K;5hb6cd8GX+pwJ})feepe+Z73=i%B#*VXFW>?^V%+*I$H(#qG z0(At{4W>VDc0O5lowFk>f%-AKGzp&u={-UC%nPq%#1`?5ws;AOICIeUvTxm*buM%U z`aC~bS|qPy!B-!FEbO?@%ttvG2F=^UKAAeffY zqEgFD9k=p^4D=dQI7@~>^43hoCgUCDHWIn*1&K%O;QvtvgW&Fz}W<Hxa0I< z`Do^v{uW8AU?e)%(CPhHhip;(sIbH`_d~M(7V)+PN2afaBKeqh<;jjWa5ywErC)8@zq$ug; zW8?6hkjbjR09lzm4eS(+`b=E&io_@G&=pRF%D&*$=i$D(K|H+0--|K<@sUssm$}_7 z7cTTq#0>Ek6-c?Ca`BFXlMBgrll{Zd;Xt;AnIVX$>pPz@d;{h!!=w38N&+^r4osF# z@LD5gux2M9f(8R|@?6l_Z5nVxoyG9f!)trO@6zSsgB$r&V;dctio(~pVxM;?c}*jS z*KtcPM{WnnfQ1HXID{n^;XP}5-*+D#>^lWz+rca}`BlX}xxO@>9$?q=;RcZv@Zxu( zkxl7AN8m(31-nQ1=Kgwd`T^WpWhU4~Fd$lvcy_K1+jr1x>Q;1!Bpme@_YQhIN?{}3 zj1t>IWd~2=tgyik6TW5^+c#0c;PMfF<1zE4-Rk%+^y1JQds)X0jaloH)Mat9 z7mIw~=U=iZuH0`5TbA z>ToclB)JfG>9+)m1#s%z5hVoqrvMN!ZgwZYKst)S!_>go`Kvg=f@da&LHZ)6Spi;+ z2i*2Ib0@81uCCPE)kBtutNJtDs#3>s>Yd8d(fNf`AKR_MZRkYmE3dDi0iq9DAYjV; zrX`9=Em6oS0E>_p@=^Y3iK^s7vVgZChre5EE8@WpjL;$S20cuHKaJIB%XR;6qI$%C zwWr&9p;hc$*n~#5j_331fs*Q>V@o%ZvL2xVyXTvCdf*Y%a-~XZNeQ*v91f;qU7WJ%)YN+epTo1tWY_<4+ zNXfL=>JG75C)6ESs!>%mUx-qd0i70{cXR0?(Rtk~p1Q#c%S(9MFN^lTiiEr@bYm5} z##J}W;Y*L15VrbMGu@xL)f1Bgumy024QbbfJ zo(h-6uZrA!`@PLpXEanyv@MHVytW1e@}v9MSwpWq@GuQA?#96E5X-Hm7MGId2R{uh zC#TfyH01}}FyxK)M>Po4f$2;sBo5c?8)Z*f3aazY&sn(#-ovAwhKYrkF{Cp~>z>L5 zqe6J;{mih0sWJAN(EbVVq1FTw`8%Wo6qWRduf@3Q(<*H-<${qZ5gDb)Vde}SX#uom zBqqLk-^4VI+%#F|D_y(;B*kOEofBmCX%WbQ@(975A z)O3e?Nf%h=&`{blci$mlE|O1pafn!uKvC551EVcFkJ-cbjI{oMN5RydE1PAQ-u^fQ zW8A2~57|>~Vd(BVr^O(bS+7jm2SFmCLWgJ9kw}tap1QVq-3n&a#naU|!6s0kdJO9D z;KtP=y;)dGa|Et9EwGoO=Qz3D;ZQAX{`Fk+hq24V62|(joJdGE4L~5bEsPs9Gxa?g zEHCub+#b6ctB(*&ej`D}oWwab&;%*773xYg_k&AgQbu~o&C+d=NnO`Cg;O?}e-?5& z7WDnePvDlf;0b(?sj87=P*(b#O%f}(FTf8uD}$W5LSMC|U4ls_;hiKTkz_f&vW*%fc_T$EVy% zS(vM<)f$3^Kzf1UyHvs{XDo8r0CYEJTD&v4LG)&%m1KtwfF}_V)FPaA6qdQaIbdK{ z;KN%?5M7_Mj6FK3#kr%1E9Au!k(HA($+J@OcCA)q!Hyl3!g7OTJo?7zYUqIwfkm?a zKEjjtT#~1&OxScxnwOs3)G#39M-VPYMxr&rZN`E)NLXYXe7COF37l4!oROOEe@ClPS6Ym8f~ z>9($cEM8Y!fNPIz8v%b-weuo5k(Oc2dRSshjs&ZGqWy!0kho$p%q+dT*$(}{Gnd?q za^p5NWwRN#kD=R6c3|)sc2`e3qhCS4<0XFr1aUcg%aXNvs`Xha%fc{T&Cg-!B`u+? zs7G=F{z*Xs-5yVRh>n@tB-(!NY;5EbVwC(k+Cr8X>40ukKw^7*Ni)? zZ3fL|_#?G)6DjRB(KQRnzgox)_1dP^yA%8aOE3E?*!il#*q32P9CDhQKtJvdXphCq z{S<>y*+~d;WG=*k+--#$&`~HU^xdKv__n6AT&%EQr7I5~=JK!6bnb6TkV7%?oC-5r)_*o;OxgVSSa&ULA6*Yd5#$!Q)>fdJ(~sAKAJb|`tx zR5xyRp5arSuq@jN`xuWfD<#cUDEuZ<_yd`#e zb!;`-$7>RVIb3f%DR|F*lUmb`{|RibGTOjMt|OsuFriv_wO%Y^h3S_|xTZuH)Ynz^ z3}u9*_uCepw@>gCcGZo;H{VsT($P3r^rYL>eLaF93g8xLp-9>yu@HO)E6`^S(3Qr) z&R47dh~3Ml&=RkpUH6i8`J>(NDWQ_Dg<;R8YNL3 zptB>?>P`8Izeyoh39%6K+^8Uercl7J#%AYG@|yhLP0enH3;S(HJ;TxJtJ4$zA7 z_5tWFh%%QfWEjtn8g&=9c`uUrvVihWr2qGug~2_<*6b!%gaIgtvSS=hZqs-Jz6Gf~ zu?m`7sifLhno~x7uJP9TW7o2Z)xp*VSI2i7FHYhL8ml|^(gj=v`gERf-?SfjV5z1C z(JR|M%s2yyhjKm`g7h*m$x;#WHV-V4R)P~64&`KQJ7(#U@c)}5aSD&95{=>P%NXY| zHX={n>uxdofI;1_Fj`1VR{kT|fRVL=sGVl|@i{dU1<&@WKv>*PanN!2R`0N?^TJOi zBP+z{3>LQ>;+RDZvdGy$;ar$FU2PsZleqgeYGS(4L^WkWxNdhIDvM#jXq`|4++fdK z_FMmG>E?ywX3z>EZNk;SsbclN!ltky>cbP)Gt9Foi+9*y2pGVG(tUt6uS7}Nfh!~S7=Lkr{L^Ay=a^qpfdLV$bp_Z+agJnINp z+3)1VQ_-7Fq`~8jb*5YeeC9>G44Xyb$_%0i!ANU#JRDmMfE` zzGuG>0rYO7|(ESwAPJ7-%c?AP1G{p5*xquwSZX{ZUz;<c-D5NAFa7I#WMYt)Uc{}qootS#Zf{x&=6t5p z+3($Jn@;wfu+ZPC4I99t_118JC$L;H4GOWNjPq2{GJad?0)s<-jy|Wrfnsx!NcHB? zi0U$WEpwkp^U4F)*G67SQt)e@<$~%#gdI)H{WGPuGY^7(TM-{XjP2gxW$Wkdjiw8>>PGFKNmY)p zB+T~0U^(@*Vv1azm<=14omAZNb>bTU#f&_Mly^WMp=-gOY)$iFLZ6NjG&$rt zdeA_-f)L!4$GAKBGV5Ae-O)!QCXX}o69}1haD+1yPYws)eVP7?jcK z*O&<0nh2Tc0Ho-qW4uqA{@_c|Sci{H`b6Bzb3T9RLnkkVsiNh`IixH7G|ao?-T#jG z+#vle07D0fX$$Inhp_BnFW0SC_*aQWs{sE2h7+wLysWh z|3tnp*0umBNJgWZp0kY90qQNTA*;g;)l(qiMW|2ay|wDbF84WYNuj6pAD3phY6b&3 zkx-U1STkkJaF~JTthMtnv}Hx0q(56K0O}nODtmlFZPXC@h`t8hP^Bjx#`&eG8z+e$ zOt=ijVn+|b@snG;^2+9N*uK}pAx(c7PELMb)m(B3#|b$m;7Vafw*W`D}F*uI4dCStKG$7ptutKF~_>z4B` zLSZi{GzvOBO|bnvQcJ`JckvcZse7xfMEh=471;}a;i9<%qFA#Kk5gMow>LVWN2Wry z>Wo&d8iCu99@Dr+f|jva?}qih8+CfJ0bcPSi$)lyLbq8%p&09sWj2it3R}5Ddi-M} zmi(#~7hFs*-qD-$=<>fl_ZbN5^wKzx=HUBR3Lod`G zJJYtTRl8U_I!QUKW-xomq#f^Cue{*_uMEE<$H`%y2VP}^5q&n&v2BjzL+w)`ASP|c zVsQ&P1sNxhm3rZWTqi4saI9oT6~>2m!9ZUaH625X>f-=@dN#T~a=0mnZleQDzImeR zzi{Vqv{!F95sU03xAw-#<9-aB{9-3&x)!#>I<|{-$>5>>--RMT zTqjItpg0I8W!{xiZTCycSXSWxN(Zjc;5Wpq*mu=tiJ7d@ zYgdMYVfEjx6UI@1a4cfz1r!}?D1C3YWNPAa>!CxoV|%GSCGxeH9TgSzkp#iip=L*~ z^ZStvIq^^?Tazp8MubTH`W#m~D)t0(wn#h}dmVjrGmkb-111Tnu!%;BG=&y&LU+NX zZWV(E7#U&Jp*S)j3Q{dr0?>ka(r1n3(Fi0YD3e41{s?^`S*j5+gz4`O_ioi4=|57d z5h2LE1fk3``Mh9iu%SfOv-5^7GxR-C&*l;o3uB-c)BzB7ONW}qCvgBr;ZA$5rzQhI z6easzD9`=rB9HMX&SaIif57WLIh4~y8X;RdJ|Zgo0kBA0plaG*hl>70eQwxzph^~a z7YoGBz~x%L)i7h-z#x+|5zU73TAPU5<-Dfz_?a9i#}=>tr4WCP?}nL8?V!yxqYJ^g z8o%6+IPKoM z5Rw%7e26FZ%Eib@<5<%qyUR{rJg`q+w_ry#NPnuVuIW<`Q^i;zpMH3SK;a%s8G3;i zxYSX#HGNuAByK@uIPwqFMg*nD9FVLhl5w8+cQAq6Rr-KwAroNC@OmN zPH7By$%iD?Vk6cSk7}CX^TV4TtST$-;*5R;toZtL;bz;>TC}%gEK`dN|2pgo3OeH1 ze$&#skmQ%dIz?Zqv1i}E)0>;}j$aY=S!Y;LpLd59U50l$A*g_m6dGWMC*RtGQfy82Wd-ViBc zUZj}vQj9^7R3QLnn#GAimYc4uKL5YPv4!=LU6}8g0oT)SC7~I1paZZPL*|XWth3Md zO8zW!xluF}KBOqmtKq=Mg$J;JdT*ld9X;|{wI|x$`zy6aYO1@j)P-Rqfs-$4p_-kFS);3fvT^Q!ES$z$6%@}MR2 zJu&GitMDbr91otj8_KQpoFR6DWmi;Sh5W((3*w61+ZmRVt(&Ffh>tNW!}N5fg`mUr=5kH4Id z^HQ7#yfg4)<;_Osajpv}7=jA|fPA-{PKewx^li*}+;cO$DZqT>v>}^zTD|{KHaY&g zKS;}sfK`+?{@m{?vrCQZQFNRsIRoY$K#{aCqOwUFNN=dz(Afc1EC0o_^`Ua5+`4IR zYpLccI)k(6nUUdGyVh0|093vxHRS%joyc_!3)Q7AEYCEn0wb(PG>@YKW?Zxwrt3@@ zGZKzTKJ!m?T@o$Z_$oi*&Qd#?q@zv{wX?8!=}=7@aU$-JQqN;d&>=JlI(}?N=>!6IHfsjuTR5Wo>k-9iv1Wt!Ax8&L5uynaG);_ zfbt&r7IgeQ@#WXQtpqLDUW}DPz#@Y@najnzAns3*(w%3_z;j$HY`Cet6g={qNFS+; z8hUz@SKqRc&8-k47|N8q^ruO|KP>gfQ|%P8{a5ri(>weWId3p{Tdk$CmR4;~Y~h+P zBuhT`z)1S>Ip`P>9JSQ%_tBQ{}(kFy7mnxBDpK%lL0_BAo(s<`zJ{N;Z zt=WOK!@`paG6KfhxOek{xCrgL_N`1k?-)adjy)%7^#Jl`aufO$AFxD72(?hu3}2=| zw3enzR!-eRB70e%r{^S`05`WPb6waqB9whZZu$a^dmHTp-M*^{wIF}4%KlhUxUB{5 zn$dwTq!c1d*1b(Gb$7634s`dS0_7bYvUJWCBC0+Dv)aT_R5le?@F{DSV3oe(tTI2=xmR8Kv3uQMTahKfpNsUaYkm8;+VA>0* zeV;)WD~>sinR~~y<`GdEjfemdz|>g3cOK@RD18J`=YGfMow+5Vf+B)iP-vCb3#0rl zSH&z=_(f<9iP#0(&~5-i7BOgE3;wTPM?05SU1he9Z*MA5;BA-=&ea;e75|;_ z8#mXFPLJ~aae=JiI(D+jGVw2ZYp#%M=kkqEQ%V3=-9~f`Va>y{Har)mD2M*`-G+jZ zO5rY$OxV@q6TDEii?>o*tY6Oy1{C97FfZx;*4o%qCgnE5^LY}n7iG%+EMM$g7E`Ms z|Ko+nL_dF=OfTNb;rjRrGAw+cPm>?AE*nT1XWc1yD%F}1OSagGyq<3?UC7dtis?s~nrsAaEiykp~7YBs-(&`R^-zi#S$VCyrU*x)7%Q7h1WU>m<|uwMC~_ zYr6Fej!N@luYq5+!pA@HRi*IxH>vkPYb7Jsz_0chD!R$m_t1KHE=cfUNW>a8?8Jbzn0pngIh3&Lh{e$~pV?>2N$BrLt zy@sx66J#Py+eRYx5OO15(C^+jxR|b-$(Bgs4nne)JcYyycsTsT=xt4GW&%JySBJH2 zP6ZgJ;svL$0{JSN1Ejo!yKY_ODbC4mY4;k{m1BL@Y&^3CS`DYh-$)syRi3k{U@IUs zoJN6~iEPD}m$}G#V>-)?4!ai1FqfylzN>Gz+rQsC5j;Ke$DJo)VBw0ox+(pyIfkE` zbn(QZWrFAK?ht4I&z|Unv9guXsu%Gk&Sw-?at=0vs1my+FOn6Ez>X5}DAk%_Z2{=Y zP4F@}mw1$Dw^qhgnt-WpDN`KOf{ytSf*KDqIna)yNkOY}%L=MzoNvSJp$>k?FrN)- zzatAuNu?9RLUh@*fgr!X@FuOqWAIImtNuT8I?~>iMGUitjF}Mv44yppyz*Ms2biW6 zAF^n;XxDvvWk005X{Cad5rO#)u<2Om1lBLzkOC$7BWl-1>!J#Zktr*bz>BQuaD=TA zJZs9+WRs6eh44*^-h#W#MS@m^Ow>^2$xxP|HTefO8Qrl@N^>YQ(OTI&`n&-p8%`hp z57_`MG85V_#T^<<V;(9b<||02fM4VZEG(Cc1X|HlTx8lybBBGQ zaJt=6kVMXb@a{AL_X;#Wh){}26DC}X2FUwWo>+J38v&_>a(AD3svXybX2#S~LB?HN zawGHg?Ni5p09zd$NQ6?pK}bB{rKhm@wl+xHTHu0?4t$t|YEy0h3#8>Jo z?&rUWq0ql8(>0P-A@ZXY+#GRiziaaH|>WL&wCQ(nOSMw`l~&RdBntz+o~`R0Tww;S&okyz|*HI9$SQ01{cQ z3v^Q3HKG*GQmg7&Xw#1ZS}gtU?Os2rG6{He`9#wFV?;wK{Z~OxJT^f^9%-(3E51q! zQ_EE2)o1b24Gc`RwBr2Tk933M3s^`4iT9fqg|k-m0_viEBQ~|fU&pMDR!g;s+hMEH z*ah!lnf z8Wekjh0fSZtr>I@hwLYO`HN4uf<2yk;ioe)8q2P%cRTQyn)&kKH>kt(#Rhjs#apZZ zKsAG_Scgnnzx~$B``D9|9VgH(lQE{3Ed+vAKSPezYl_d zy9VxOLNym&JDE5cu0`uViF0(a9!Pl@Qph*q}iTOz0Td>=2RyE15wj0Esv<2JdKjVBh7-5Lpg$UoiWiOvDA z-`nh``ID5fKK#M{lcc+tZ}{CboW3 z1*n~&F=Ubv0?@z`|nnWl_@ijQ9q>mQEwN|6FlO(urve(8mM{-%zB6a`GN6_8s% z-CQxXTgc}_{-1qj2bb@Xh5K<4>YUw%p$V%0>RbOyEBF~&gKk9c1ydi*Bn(M$x70ES z*_cV&$|1SskY*p_1g_KODI)U$~ZE#ijD%%^th`C;21l8M27SR;35^vVQo0% zF!eZfITNHZTA#n0tOQ}$B6;YTL8k|NzWc%NZC%fFD>?=%v|u!Zg0|FM9r@iHpp3W2 zn5#O*A%JT-@LSYPP2@P2rXayF>sTe7%>bmNDPgc$^(4Kp?-KG6W48^i1&@XiH1%ud zdd_ZE&<^2)MZ#|?UFg`LbiXr?5Q<2$1I|t!i00x8B*d|7NQ54E!ilR?6 zNGFGg>=-9yl4~??t0K68U6caH>_->^ESReW_-J58qq_l@%|mamww~yeEbCOi*)+~^ zjX~aMXbBB)j%k9(_iIQa+bPA?5z_ZYb@NQesq+ZsF(+qT7JlV$&Aw-N=Gy7OztgnA z8W^In=XwKu3n|e|hzL9LmPdP^rljQd{?^puKAjr5G8i+cpw_XL>FS580;Z3$4vsa& z+OL8#I%0+HU#MM1LIEk`^JW|5JgHhB!z$#lG)?<6*ZoSB(4pw;uM4`Gv-PyPAFp|7 z2-B{&6D4!P`(51--<%+}VdR{HH~hmCV{vvSK5XlAZ(u@HgW+j0*1YLEk|!^X&0UR4 z*2>Cb9OYXV3V5f_+2Ke1&0t>T;aUC63uUBaNtJyd2J~j>)Iil)Ee4QDhQFW54qA!|HgzGQOu<*}eY zhs^VjB4oni;yN#BbHmTdlaRzV2s*4z=>^Z@ zVokzvcHv@lCMmY%U{SyfIUJ)K-@Nu*7%PfnI(XTTc^>yY2pi=9KeeZZTn7{?T<%N; zdsE_dGug+K7d@xJBz^kKn?pK&tj5;e89-|iR^Ii{_SK;Uf4tR2khtVnHXJ-u4b=)6 znq62l%Xf*>o5@ofH1E;)WvHWu-o)u*__=#o3G?MEHsN^ZhAVC9cOGow{u?fsjAHu# z(Vqi=SQ4+J5s)&(FtEkj30;St3!}9AFtX{-~sgv3}Pso#LB0U-+f1 z>b9;M)#xFO6EBseMaZW1hYjR7{uX#6`clL%W7M*kNmQ{Z$9fv`LMsOZRyg!qIsylP z{_!jS+XojLB1U$JHYNSB4G}!AkLm&xG`M>%L5I|6%D2uMM-LRNTvf+RlM z!M38@1o)H>{2wU+Nz6xgNdy%&enInSU`)*EJCU!6UMMfou1piVmkwbn z7AaS=h9|bqi392orDv&z+GAExZ}o1HY66@!@(YIY=Le{O$WiON6wJK3)=HMeK)8JO z=tw1<(Jm?c#I%%s&qYC?OvJ{Y^WU~0O0i&4XO44U6|)jq)-9=#-gdaJF1{G~07l22 zNw*b{FBoUMYbA~EIaLq+dSM0-6z^x-^-itow$U!xZJuPh`Q2pR)>$((#Mh+`oT&M_ zoSF`*-o0cnd@{;d2_sVF!papI3n`yMSe>W0e{n&|F$eC)D3Yh7sf;993(zi6e|$$d z*Bu~sy>VL4YzV(LTmH>41SE(V6?c}JG@rcc`3-U`PISQ{SOx9k#eXX5bAlJ|q)z>{ ze}HP?CQ%1?A9VhVzj8pvxa)D#!U*oLa)rA8$6qx~%*IzWN!X1k5gs$nN>}`au}=`1 z>H6~SYQHJ3%5c(M;NMEwu6Pb^)_X)2DI^j=;{>J#vf#l3cA;1Lu3*}PH#>Ty@gtau zJ5%(M3F5&$5p6(=@T0aeVhcasvrBOUoyo;S<|5K~Ydr4vO2KsgHhc{;$(Yq}&g4oX zs~SxlOCRGyXcq8s0209&GX^Obih6*RjN7M$32Q;Gs^Xt;-jt^ueH(J`x5X;-SPRUv z;&P$kUV!IHhk}8a0yF}Nm7-MOrm+3~MDS&(!oh63{(0oKjjJFg`w9b#NmF0RgKKZ+Xph?=q;kw`Jms*kVRRWtiWZTA3$^FlY>q{ z>OOs3!CnTUKwBs*p(JMrZ8~G&5_L(X#zT+sZ0k4i98v0berkB6?a_!DOpP8F$70HN zz%2I^?`hkGzl?j@AefMJB6-=l7gx&p9LP2%`&l_dm@GdH@q~RCbKwC2qsWZP+(IAs6Iwou z1xLX|8Al1fsA-Jh5@BcVJAx={3&iBP&Rw=|)TZS1Z%&Xql#H$D!(c@v_hvU=@y%fT zoK?XPkmT9->QzB9@L^xwJJA?ZFH;f~!y2%X&UCMsUsxS$zdLaTyrl#1+>kPK z#@1}n17-EUYSj1a9^f``Je?L9lv90`MGxbEy@IbVub4+KvcqK?3nKnam(3XmZK;P+H|9rw1j>tdu{r6eN5r0?4j=bU*2TQIs$~^ zCHnc=v;aA~gX}baqGJ#z1M9#xRxsF)Z7pnm@O(VoLjyuAAP1s^;S4EfXW8Cho`L;p z;sVu|7&?6zk}9q(o1IzMulM0(A$Y_ZfO^Rb0qLrv8`E@dTyl+~k~>)!*yDravE;*t zfU5T-9;=wq!X_}2WS$?%8xSZMB4AwyZl!ULGIUKMN`NkyzaKXFwg9WNzZ}n`7cDFE zSPk!y1^rBPq%!X)Vhs9{cnS!Nwf8C2Efz;j z-|^XxKaJ|dd4t|2G|~<=Y>cQU0qZOLR$B9|)~QWSgRT}&*RudfaCG|+`UU_()A))} zYWk^%F>_hMnh45U>?vI|U9_8z|L#1J)0WV-I|C2hQKi+(gGLFZE;@BpR?hk+B3CHuvXMC0=(#tox)I zDsP`>r1z8lcw^x26Z2xmQl>HqM(!0il*mf~-zFZ(Lpe(rR;Fww3=GUqUQ}pP#xMN5 zp*3bR9D-j2N09wO^zQvJkzo@}#ohw&C^@m7cH^N#!uzoca6CBE>oZxA`1&BIkV;_q zPG4z&<6*ZF7$Om;$!*o&b&{`Xrw{K>Xa>5NUGdua{(YTpeiHzB3`bR99NZ+5t?*09 z8@?bh>t?OzWIvA9^)bM?gjDVzMoh%IvvpyDe*}XdiqJ3`0(h96j5xy>WI$z?q{Fi= zTgo*ooZ3}$dR`jVf(OG=QXpiy>%}Vjv_xjH^--^OB3(n?27o4rYqyg48>^DsqchwT zX12W44vJ=3FO|H?1h5Q?i;Ws=YVE7FFa4_uJ z9eD+1bf=m28#~^lpl?2xL8%C$VngM%LS`yq#yTZIs4@0}tN_L&MyA?hm*8=VM$F2U zp2n3*Ri9gj#{l6OOFdRT{nanZX>D)B*kOND{fPGGE&OEIQui3`4h4t~5ovJgU*BD; z!;!6yW8mez{#Uu#I(qoH z&EmiD`LW8Tq1#F}RV{FvJ1;JPOQnu;SS&S>4(nv9a#%?1G!qQB!T%)Uu%PtephKgR zLU8m@5dM!}I^&!*lVYJAGaCK4eKpQH@`l6JIet6Y!4wrLf&af!*s=&wTSOpEKB0oy z;S_wDfTVdb2BlO#ZobzEK2TxP$?G*52afN?Bh=4(UZay!(5_VjhOhV*2JpJH6W0$X zQUTrjLH?`!43$lGScd%>|B4#9dQ)s2oTHa5xJ}ZV1dl6CUZW_}d{LsHeleETh_lj^ z4eHj0-ic1LaCaLbgSJRorS?ic!>xAYdoi9Z2aaG87$4rnH6Q2oNMmIP1tDyt1hXtnbT zR8*XE*g>L=hz7mZg72d7%iE{&wAlmHqWGFdDV9AAuub5&``$w?rvU&!b{7_gq84md;riWKECZwUyFx zYS?+TiDXNzz(F;HoaQRNw{#B7h@j%4rOP%Crx7;IS-IGdlRN+WEs-FXo7DIgEK>%V zEt#qFs9^e{a{}N@#L=QJ;jlI9_EaD>=Wz1X;}rnn`(|3Q83BB64x8;5|L>{(_$j`({L_Gw94>`3yq9X|X~=QhzmCdqQ?j1MKNJs}Bu^!Rp3|{1~0& zycChTr0s3XWN;0~yzJp(uh!6Bz=Jnx2+7%)c)!|&P?-G2hp!hnUg2nmz@o`idMWX^ zVaPr_WF5v7J&Es=<}0NYV8k&MyNZ1JGanw?I@uSZ8is*$vF{2iYsfhHA03|3f$n;kil~%V?r% z|6w>(>}x;>|D7YSybPAguY^AXxVRZ>mEcv|rCmdE6gSv_q&K+}Tajz?jiTAVi-WnF z^E^GX9+u^xeiH9+$bYPC-m|(rmelejW5O-GKf%Z>{mrbZu-7gvAUf9DCA&)=kC@14m8r|^ zK9JmaPXmEdz1hE`ZorZBQeE-QMwAbWZa?J-CqS={zP@qrC;IKNG*WVBNv#|XKh1!8 zpY6d4u6R!1by`WOh-RLiIOQ%F)z<Z1b=TlPJY*asH(^{ob+h^SJ8&81YyV~9Gc*Y4Vm=p>^{33ctJdAoQV36 zw8qP$?smKnYFsOu0UX7+eR{@)sq%`G!mqvgauiB#G@i%vpirn0Ac5iKBjH=R6-aub zKVBfvJ@Wd!qdz({Y$SG_^c{%{v6C-y^epYW%F7qtwyL&8hc+iS^L3uJ3YOffyG1@! zI7+5vo3T+Hh#?1!%dVMsU%K%_0kakRK3{KerxOEUrt&JMEsKaEExngeUI*@^@TYUk zI2Wm^BCWrjgO?8&Kd+?F%xfj^Nh})?In>JLxQE?&T7tTZfLfTcO3O*ZAxI;qSaXu2 z^`I`r4~8p!Jb20gz6F3z)QJ9r1&5=&W^aUyF5n}I=F_FV)}+d8JZRSvIz|#B3s;X} zeKS*w!{w#oubm>aTJRVeInay534n;Og9N->o_)KhkfA7ZJEhSLb+6shFec}YYEq75W)X&ZZ)F8j|6L)ol%Nq8mU zGH0BQ4J`T)cBUuUz+R*7nGlQ)ZdO1Z#;+m&f0=!z{R4ebnl_rw&`jD zl$jjJ?wr-p{yY$;)461;$|Dao7M&#cIGd+NhLGB0jAc>>)u|ZQXC2nhV@-4f?#~n9 z2>KF15)9ZnCF)UP%%F=;rVgtO0yRL&>xx&PzcpcN00RQ-%NAg7o&xdub=@<#(w7*@ zgFJ~B`DwhtpLILtJ-yV5=I5n+UG9$+$LzS|SJ6aFsUt*fV^i$)>UD~(LsbZO{CKph zZVea|OIL5;?iS#7Ao5+_MuTo@y`~FNf~1#-VvZIWQ@I6kB~DtFjdYUwz&A7(Crh9y zPRZo|dMHHilfaY2YRqB&ZwrFT%>XR(y|;Of`|cR#LM@A^VZtQoBej94f3t`j; zM=_34A9a$8!?UyZ8__1aNs4;Xn4m524_J9Ii%1J6qS2Ld6r`YV$%s=iO+N;2`tzDr zrrmOOD<5}%L@MwE5G;y3;i2qEVuLN)Od_+klWN-dTp)S^jPm*5uQbH~E@rWw`h5Kx z)5Lss@eOI!gNj!P!~VZ`*901a%~5@!FIViRaY6b5=vk=P&ei3YS%LcUq<|*4Y8Xw) ztA;UmJtx_@7iLLJteG8T6%F;+09=3K-@=GqC?ARJ?LG+hQG{?XR7Ww1d?xX!+eKBl z?cK zKnA$IgY&U@FI3+AT35}hL4lo=5DZE|(|go=i@(yhEygj$IKIy3WVvn6ddKRKr2}%k zd(bKC6QG=p$*oJIT0U(&A;2K6CtOdf@uR2KK`#rA9ejdsw_i?!+p-6j4d3(}&~BTy zm}&oQx*D>sSCsj=MH4`SZIr8V{2gof(ju|q1IB#!WP~|v%;R@A8E>!vOF*>0q;N=U zw22CG@hjF&f<*}LKX(|4fCXlE%S}U{{ZIk4#ma@pobugZz<7-u`zH;2T>L54;7k~B zA+E{$B849|Z0isr@n^zNml8Zv#h>{~5f<^%0u`l|#gC&HyCh@p<=GvnB#eQAxj@(3 zB6_B_NfIc1dY6}&ow485YEDb~QRAvpG;t^~XF3CZ0mq;?>a$g{ZSFjEXvJ?nw8^@b zs)97FN3diUTeHDv9CFT=Mu@sMAfaKeM5AS^eYfD36>BW$veubN>ZEWtwbcFtQ^eup z_kDDRr03Ei7c9jJ#h5wy++$1Y)jpT7u79`vRkWox;QrBd3-d_nBCfWaP?nuED)QG5 z&>I5lF=K$VfnuzQZC)|jD*}l{bw4p8IP6%tGwn|mP1~YFPP!1PR;~!VZ-TrDH`2b! z6`r3|``bPtAM${Ni~LaG*zoY^gXA~g-j)F1*dBde9fdGi+#%2*%woB__$jdl4|uO8 zJ$j)^+D>N0jV>!pn@XO%!A;W;VMig8S)gcJw2nvxmObq3i=tKJ*-ZDv7hKn)(5~f}v3-1?jT$c5jvd z%g450-z2r#^xQoRDcy-*k9@g2_Sl=HAM*#xJ+co!a|%L-hri;JH`01Qs2^@Iuv&ye zXT^@{X`R11KC{!~YmeO-Ro09-Ly?UVV7J;g{)^fvUc-t@+-{gK$uq=@*6JysSr;%Y(pD*-Ip_m;O^W8NbFrXK7)n#_?tG&Lxp8O$^++)NN2r)^KoWH2%O_<}z&+S)Wr`r7Y7?^Q?=_ z$y2)AIh8#{X;l`p#Pn{lkDIHUt8{(ZDAe(O|0PUZJe{+mXttu3JPXOo3xYZSGQE}7 z!P#}9wDbg^PXG*&s;IFbp3*C#bVvRP4-}cAuwqx8{p+cse~#(8{6(S`18_S7OlFf- zk3UH|w$Cb^N}|3A_2M?Gw+2cV^ej3Xc_*05XlPzgE&3TbGVf*m{cST-ai<3LC%x$O zRrNLK6nNCdBcqtYeSW4 zHeg?BQMz$q_)BZ>>_-=+ASoaU6{Xwl#4UyBw)HaPr?3SUgP=yzPG)*hWx)sI|Azd+ zAN&qQIw7Z6pRT(|T*)0zDDhH~mJe*h`2sVDl= zBDi71Po1bX?%2!t0ixu~^89Sg=zl&fS>2vh)r({M)d#}I!_WVX_aj_xx>ZK53%TWx z2JI5`{t8S+GZ8D&gj5{+y38!ndBHSeyIwt>sj28k=|=LAsuldS4edN&{q%U4nPUbx zFY`FL?UWBoIIf8Y|trqzbM=@CXJin;xV57i(ejB_;e!#ZQ# zEA8RQUsCQ;MQp(xmlvnYH`L8aM#9&hcy?^btXZaW&Of@$HGxP_*Xmedf^H*Dtuw`W z{0VRT@iz{IvDjV^%g8ARE^Vpr^+7H8GQnLGqjj6GtqK(J*-He{D!o9I&ngY5ZvfQ9 z@jmq}5U70$*=N-6i%c@;tCTW$$WJjF24;P1hdRP#qRKvVuIWe;GLd`Aj4d`WwArm8 zr(=e=JutdUg&CKl99ot3dAn*ap*?NtJQvRU7MOfsiSVj!AKww;v>c8BD(zx&J#C`NbIinhFme#hg(= zrno8(=mrcH=sQ03-CjBHu~CBZN{-2rB5|f~>4oEFz-@j%^g$^svj-jUg*;~@8P3~@ zYM2+0yNoqdJ)H!EXw-M`yLl>B-R^NRWlMAt#<94K>qequXqL~-JX9AsIHan207BWQ ztu2^pBhUmX=V)77s;L!im!}ryZB4+GjPPjK#30h)gcmUPhjR`kgY(E;sT$Wma+?{E zlrDa6EN3}pmud5S;TUsiP_G<|g71^PfEzZCnDfaB=K5%yQQ2up#pk8|EXCz3Ev&l& zivwX`Ub4`FnG%lb%};P^&;+1(y%>$)zGSoP{=X#S4>70Zi&Vh%0Ijes_VVR1y|8Hv zn8Hj{Gw)dAD~^weiT2OiPX3s-z70nOa-)y_1EZTqcoGvZHDxq@xpJT<0pHLj!)O9Q z71$x{C;V!!L!zh{t=GtgIHsYOEsy`aj%F#UtO`RG!QE1e+Z(&ocR=?K&M#y_4NRJz zm?#!6K8{^8JGv(B;A9iG^Vm8AV7t1W(@vSGl%?ikl405jvnEzmmxQGpCmh?-Q$EZZ zWV520tv4i+%ON$qR(qxqj3jlUL%ACKoFCh?^gGw=?Oj>lUhQJ#gKaksmRw9V;22T3 z8`=z8Sk9$0Gxt*k!VE+gR+AT<+R84v0BG0OYRQV}FqukIq?$I#CsSfztSg*{PJELK z03rB6v|1d>QM9$oF5b!2W86|jZxb(e5N$4WPrAje_h?_DLt<={QP;gU!XrG!?1m6l zuM36(spN-0-(RlR;*AbT4v&C~Wy`gp%|?g&#jLx1@)&+lUVRLA-)KimL4DUWEDH<6 zMkvqi0zPPzsBii!q(-*+GTkTJPb$-5ZB+Zr%P?b*V6JBh>wK`iRh+9;JnOzOgOzrqUO zT-*X%*Nhp0m@Bcgj(40Ny^^*%xGPSSYShfdml@ZcDCUM3EwmprtVrn_^sXpo=9}uu z#0z&f5Q==YI}eTT&GEYYvbrHiY$X#!<7VzGP;Z90}bc!{j`t=4qXAgK4ON;db?;J{Xy` zED7BxIWAk0+(7)4s*Ojfhq^-=fEK-DQldAEWv>CMeP)x_gg7YkF!gP}E^wp%0U}`> z5q$$2$k`}fNyE2!pPot)76|P9bW~ z&%U}Gf2bdf5CtNur8E#qYJj^_hO!ikCqO~X`Ey4!QM(qXHM{TMB1_>^CR`( zEH>%Bq46qC9~Koton;!#jF^gnr)WPbj@_NF62`eyr33sDrXm^Y-Sh?61+({Mn6T9zr6;7Lb*@)+jq+S` z@2N4Rid2KneM(ki7Qy=HEk^yw{EG!4CPX8du%Q#t00VDHl~0j+>?4l9;u$Y~N}uDL zS-3$WKsaMWOTHH?K)wveG7kRrGQc}GL@cF4Ysg|ja!a?hA`@Pn^_+!s={HutiOak^ z?KZAhRyJOWJX*rZX z`@dFW=Up5yTJj6WE$-@pH5rwkh!F~V9mnCqdHK(VFP74{{Fq_O{6YAb|RsB6(Ebx3mS4ZHEl zy2YSzINX;JwxPtf4AX5WWnA04+g#Ne&QB;}x)p|cU|Kn=smN)$g@W5mb5tEk!RbRe z@H`-0l2wE@JQ{|oER1Ojqy?cTnZ(pk76fOZ*W!}}Eo%3=5PSqr zU*i#4!^3BUA95_|Rl;bbR9xEEK(0sJ07|@Ph)scD^g~`F*ws1cWE&xi{5P~8XR>Jp zT`Jd{_&8{I)cBV{MBol*`X_GaF;nAp9MtPV>h@Xv;6gz)D`E+(6ZjZ7khO(QW2^1~ z+^k1GL)HyU0P=`&N+^D=Xpk8Fa>VluXGNkEbng$fIk%>F5jd}k^|p+s;?8%`W#^NT zxBXlw6D@USQ;QBb1vSw=0yUc3$|y)Z^oul-25Gr$n~|xa<)-o0$~JPnj|I8XooFAD zpIMz-dLkZ6B%2xQ|Lt$7a_du@#8ds7w{1uWkkJI9pjz&iP!FD0iA&?B5tx8yJhx5L z#H?(BNjc-nh;}bby%G&hzweC~?cT%dvhJj-b>|^aMh1#|XHT_ZfM^C5!sUYgbK>f( zB?BKj8Z+Iqm0;TJE)_?_++J|poI3VA`S3^(L>7j((`#{EJ^P29o8TKg*iQ(ur+Vr7 z+uM%tukq*^u4(Ws^R;0n^)D-!r?ga2*7w;9B?b)=>|uJ$&nG6SdsrPO5h(5wb^*jwF9nR$JbF}S(Q5j^SKe(b^+KqoLSi_K8ajetqOD}q-Uw1MJr#M0*O+#)UxTV z_-+(w{}7~yLPG+S-gb5tSK-9t#+V~*1u`u1T(qF%Ts`O}X7Q_NIhC#PzaxRLM0w=V zA8~&*865Rc;Lz(pnUru&nu1Gy@F3=gnM*HRdR zZAXhTA$a@rUas}*(A`ME^xFpa|6Jx|%k#ynysllP_CGTJG+NmGME8+IefNxb&8o+X zDQla-PNqd8xsj0^i3W*L!-qVqwCvhRW$SXJXD0~9@3)y=rk?R2y-~K_Y3j9mF}8U> zY;ary;%Qa6D3Ggy+F@Kz+~@MvkD3}T@+s(dw=F0p#_XWD@t!b%eX>K$4$OZ}q<lN%C1cc-OE_)F%sq?k2RQN?wFU(+m8*CGy-7;rbCyYR&Ym#23lse6--6c ztuwr*5Iu|+>q$T>Vta4att~G* z-K)8}UG{XzaP|-?KYwzdJ+)n)#%80#7*xQZ66A!?fp`wP=2Oni7Vkev*hS-b*n#O@ z5D0Pa4*EoNr9xf#-4hjw)JY?QM9FJ_?c6U7fy@b2sf+_1@{K?g_?OZIIlfAj-W%n5 z*^ybm^=K=#Zd&aDH}ncDu+0IzANmyg0pqB}Nb6S4l_Ir`Vx1zZcMO%Efs20AyeQ@z z?Ygp15*u&Hg85u^_F;njKR$ofa5OkN*DQ?QopSF(eHu`{6wKFwG$GZAe)CQbs~gN1 z5SBolm*HHQ^({Xtakua@8W%zVt^fkulaqa~58pMvtX@cGQB3){t zQDfvfZ=w-~sc%|*LmjR6H1Q7ZSqICApYplE{&wu;=&TTYK{(f>VH&l=+u77c0Nuoj z(#P3l4sx>1n+1e^g`>mHd%21yvmF6r350ady77&A?Tf$AgL=9fi_EiPIQ z^m*gO--(3%v}T$VvOI@m9v?mvtomFOro@xtPu+$QZm3_vw!mniR<@5{)q$HaD zLgYju1$~q6;U0;smGsNSG7LGY{&6|6JVSkli?Scnf^z~J-93-^$zR%R3kH0M?#o9} zf3^A#a!s;bh$jQmBh&Z&5+@Sq)H)7dEAa5$tyBI8f_rQhlR)20@admJmtbrg`B)2! zuDW(!U=C@MGCJcEE_CgHi%1REhv(zcO4T$oQ+LO%d2G)g_Wr^pkLaL+&prIJ`(Pw=8&2^%X049X znM~klOQWTLqWe#>8B?MPHYtRr%ovTr4keU16>cqY8&Br=x!%_?Du3topM!~`12%c} z&5aA*rb=|l?G6mFfme)oSDfzlDnbF(GYf+n*zLZ`I2EtX5^xjIF`Uwsp7nax6hjpK z@q}A4#mLSNUn%m2j7LVG7oGyt%W`O~tsIE!*t;9Sh?ae9c(_+_bq94` zD}Cy*WUvLLsslr88rJm~G?TCmSh?DKLxqBDh?in79mR0FJRz5n;|{+1ssCwv6UetO zp&C!5FtA~CIP^m`vaA>VpioLgpU#~MbQNw3=0-L zc%a*o(rfTwbx28d6%xd*6t=PfF8uLKhb#yz1BYlok=qE%=>AtTQ!6~YnkJ*fRb1Ku z_8Wb!PP2GQp?k5Sh6vGZIv}4iv>N>Kdbv96l3bBB?zx2_8Zrm!2lBj#Nnz^pT_OP7 zuvln+ttn$@>IAl&{-$_Z!2%wVJLS-AQo=VVW9pHw?W|$Ahpzjtx?BMxU^sp9VNv;6 zH-b2d;aR&v6o6q#app7_Uj=TkrCv(%5l&{(W?NErAL7!-ht&<7-48=%Y+H9v2S&Nt zC+F)@05*k|s+MWJZv~r8YbEIc!V)-ql22(Sf*y#gOST{$V6uB(hQ*-yYm{z>n>dO^ zN?PTlecDX09wEi&${9wti-b!y_?Si^51aKJIp26x=$_AjV9t_Ss$$2uT$Ce6A(dGl*X5#9non$cM5G}NbuIIk3NE{`+m7SJ;& zRl&!YdanRK>wuOphr(rJdssfL#Qjs6=$B$HgjCnJeDFzdQ!rQE?zkByX|*+@fmX#MGF`|&S{J>N8C4B@pLOY^Au{`H7q ze5{skNroa}u_a8!;6w6;J8-1gV42O`*d5C~E0@-Ub@$C?lgo9Mg6Jya^g7rWP)Nmg zOSeR1CDTaa`Vey))QM&xy{u#p0{FZKU~0-IqEqjt{6I#w~Aw$&XW+_tH_XUguh zCobu-(ob7uew<9@aQPVN+)W&cOTn%zx0p7n_D zRz0X)UqEU|KfeaRd=`cgMHig^@PE-Js!yS{(fg!On`uQ)2+Dw$QWVji5o(164TIj~YTFqr>!QJmR%)(f2 zeh=mzZNi#nAx9RoB!|zRq=#<=OHaN+nW5tL!qjzBm|a5`v}?J3Uk+L_1N#p0ky{2;tf=%3jh9|5;N2OA7)Y}W{)}hl4c`;qU{oF3mnbtIMHQTz zdk$ipduc_7Qoyx6gnFM3!0JtKf6vBVu$LaZD`k@RvT>oEh>P1dtzTSE-WID~^v0!OpE;OCTgh*}^mILPlo`URjePZJs8k zCj>fy66j6sl{)@PwLhZ;U4(Nc+^*QX`nWn*jdi5pMr+-W7zp;IuKLn`E*!J@5p6Y3 zn6p(RTPha8eb13(0}82TqhWp1=l^n-IoA#=^jkca@y_zsm6`g(YT}1Q(Ljig_!^{A zZ8dEbWaqg>V(`EvZ%^XR`QO&pIR1FAO`6<=)Mv6ei7HvD+D}69erh3Bm5#&5_Id(b z8(rwR##`60lQ)Hyqc^4V*ly@rCt7BrQt1(np7u-K5$o-&Mc?ii!y#0V(TKRx?KCx~ zGM!RAOx&#$#1c@?mgpd>Jp}h;27?`$H6ey`+aDir=#_u5g~>kH_MzfAgZ%emvpQI`RvTYT-oz6v~TZpmlvb2{OvzuHQ^pBiZ~`$|`>!4<`L`Kj@_-rWr+L}cuGa-Pxn-_Up~5G4 zWp?2CF*I)@9%x{xmQTnU+PO|I_@AjA_GosJ$4X*P4?$vuFg}Bl&239U6vIv zmHr_UA9kl7gt#OEWD?$EGejT^pBl~g6b*oT%g?7N^@ktb$Y(8Ck_aWU>t4Gm#fqJ{ zw7`I}WDA;o30}?jhohJ>`U#$auiWXqL7fFZN$F>o$cusy3m=jCX+#y!$Xm=^*;oa8 z$eY<`P-HExcb&R_-cV@q=dN0(@k| zQq71`3J{mE8z!?%NvvX&WEo8bhHyeat<)}^Y#V@{-QO(olE!mE_3GV0q4aQ^665!Z zK}75tBB2MUpyN|k$*ujLtv>OSb$82%^F zDFe7$dZ~Q~G+-0&-<90gXp;Zn7Z7=5h7e0I8C+(lUt%QLwYO8+z*5nhXt=L@$j3g- zyi;k^!HZX76QYm`_sh;MhyF{S+YSdc)Sxyzr4j(<&>y6Y#NWi_qvmo4MLnd%(=93A zV0(up;3|;f9{v`U>Pvq4`Ue<(x%+_C&SOzQAHQemlO*TVB{AQ!LJoDhfQBHgukbKl zZ6!SSL2$tg?mr^C4D9oR5mv0+gGHF)$6&T2zsJkRKw2()l|l2bsD7je9O1u0V1sBdAg+bsJB%E1@4~vQ5p+9F>v7 zL}6Dg_G15WswT^b)e8-SXz3gC8dn>slaT!_lXLy(Izn1+OpUQ~02YKfDxf(X>b1*Y zR>l-j3@Qo51`F;&VhGP1>-lacIL>xDA7%${1i=DcZoz$lHb~C(_W3+GLGPGdsJPM! zk|rD>KmYChdtJd|y_2-9ckkF=LlQD0jJjgu7^rjUGMagI`@$Lzk|dq2f)r=%!s6sG zt!(juG*^e&hg%#akqNe8YR*!rA_st;285YY@L$|dzvs}-gcTo74}k)?L1}BZu~B-3 zf{Lf4t&qA^Bc`(K)#$&Nb2bg6DmX1nf4iK<0=GKvwwc|KbF3G%7rW~`wd(69qS#qs zBWElXSchI*I?c~+kB9+u0&(2c%LNM3W{#v9sm}6B$lEIF%>)8*KWqA6*j;lMsrO-P zAC3Q$hF$u()};~n{_lwc25IW-JUixNP1C-Rt= ziY!ijN<{IQkYAR`?m0Aqm4M_u90vqxR;HrYMPy$#a@D2DXtXPh4SpYFJY2pbJ}8uR z@C|4MFn0x26TjU4I8|)127{?cwA(wf5CeTN0>5R~Ci)^yWKlp46Tp;y6*78nfbeTz zSl$exxFWgVi@E&XTes5xYBZv$N1kjT2oz-7+hhfHCMK3?ubMt_TN1cHzYNu;-hVEM z)ZULtIrB(O++6S;%0!^+RQkI!jNgJ>Te4?YnR~$jJQ3{cJQD;sdD#To=qcgd{yjja+}2lI%AG=8h&wY^^jk#6>&|GBc+|G;?v z_^j&cT&blFM0)aTn0#F8J^sSc`hDO#eeplzz|TU#K?^!6Sx_ASE3BZ-GXc#xb$X$H zElX=uSniw`mB_72BS)yhVa6XxW;^*KyMmcvYr~EXFj9bF9K3d4?JUThuUx0s_?ev5 z>K%o=TXhBSy;a6reGV;Od5^_2mttPNKqtjS?dSup(=Q;CD1nMvXc@CETrr`m^$ZT3 z_e;wuxhGp72pg& zb9(Ly-e+7aeMPEzv~a`PuPy{L?1ex!)_Xz%=w#*!klJn<1|uE6nZnXHBUJD-MaL&i7-rkM_M-J)GJOrXkfqTr=EEc{rwEvQ z4);~M2;A#fxg)4N`TifILz3AtFjhPyg6Bhy;)uj}Ir{_S(Jb)HPYX@+X42Tw7T|)A zBtn>-h!!Dv6UZW-ZEzlB-@}>dB*%Fc?QMw&GWmHsBf_~{7C?n)V9R*3gBZeElHD~Q zFPJy_k%k>367m@8LqImtLH#z&^%GjJ9Q?8y!_8U~7%AaO82{yvVVT)oI0oc}58~V(n5}t|=+KL?RfXwGHXKkd#mo(HgBSV?-D!mSt*MkezTJF;a zbtqEGu1e1MMY!bNnj_PSN8^UY2}5!0lBeXnLtOBsLX4H2YPZyP1clFMv+=tOroRb( zhYdLB;P_(YQMoN)mEJcv$%cugXwx5Q_qAx7lEGSyx@PWSUh^y#@``HOF7Lo*<%E2l zsGV6`LrD){&w@RoJLFsjnv892xf-f$l@>3pTSy^AID4yVJi9d{_&&PWN$5*ncy#p< zbd3l2r35qskmGCTZzDUghQvn->V3dpma*w{_+Q$+kP!XKdAUd6RfJP}fy!N-Xy}gz z`QmKV51LHAvxG|kUWEn>d_UBwig=}M8K?s3IhXkT zPB=Bd$>JJx%Bw!8@7~k=-U&&${Sk);!$7$l()ntTGBkZo*eD!w$ra(vW0<3^Uf>9W z{2uZ)WO>}~L-Vs(vRpkfBE%R#0n}uIgU3}jI@u=*@&x4HVmtF#b2O8hTufnXsgfWU zrdipkAyXc>AWVy3uonqJhPJdjO1bIh7q{o=fdCs}d(tbz#vZoK@**wiUbn0=YOA531gv~b>i$XM~m zeJEYwiihdmXO8)fcrrCzAb;nG&>$kZU*1g%4lT=f8rJ5En?~6J=J>M%f;Hv%vbacU zY)4>B>D{TU=Q@OARCR}}k3!TrQR?lvv4(?h7P}WA5AGuh7N8haE1YDqGtG|B+W9RC zbcufa*I(tnyrwZ8I|4jHI3~I|MoIC11vVj*HWDzO9uHEBj^j#&dHJ}qlg@uTKba7? zI=1ui7tW-UZ8z{lz2ta~IbO1wWl4urHfB8PX!h`r8@guiXfq>RCs1z~1kg+5tV+>d z6-CJx3tko|JveY#&_odr{?oOVN7_4Cm8E4SZ+6JXwC<%AL{4(+_WLFIRz^yCTy1)oOzx4Mc)#Kh;7f_Qr$*og(p(tCOSS@c2N&*-^{O8b3-12_?#2`#NRcW8zr-2 z_?a|LoF^rCJw)i5a{I0Zx)DLl8N|hPgm;r*59zMSkPB7znE;$BT`V}y{9DYVe~)ui zDZJf4XXFg%jUP0pQl~iwb=;Jl9jroh_q>P+@sxV~NkhS2OO zaVBB)Q+`x?VXqSY{3n&2JP?GMfgonWZ4sq9CvY_QLRZmBsJ4{HLN(j>x+JFENE6*O zR=jVng!x{;5wS%>#kEO%M9uv2*{6|^8Zm}Ay%k~Pf|0+iB*%^fs;T1n7smyk3|V6` z5fF(~#r%htd-Xs!qi2l;K{cUCvw1~0lMH2o6eDHDW3Yu?4vtGyu7b83?= zUUt`vIC3|eZZ$IQPgF%m^4Td3dzSHSAkz$`gCja0)7^azp+;Xr*~DGV8aeHkM7@0q zLoYjdN)8nI^rC+cj42zvV>>Ml@R#sF!YP04d`_i)fwa?_W~C^&cey2*|9Ok+liupJ z#h1;^WiUdpuzokORJwT0HbFx?Nv%1a@rdbM^0%0 zH`!y-)v1$bfh(Es=Jir7w|`vE!}+%6O|*)B9ifSR2Gvb|gLSdB#O#x%qJ3VeqgOvFU+1=c(GhyqZ%}hB&Bv6?mI* zl6;Q-`@GQRcf3{~yI)nPr3?U!7jeiVYmk*Epxj;?iapj`UeszRfc|2Hdm%`+M0trV zbhIurzIhBI0N~E53VSuEkhQ%GM)}HFMgKBB zbT4)OIc%F2jfbL4O=ZQgLX)ZLFyQ+4R4STn@f`Ddb&pmI#5{Qk)no0{d?B^$&ssW^ z@%0dD6k>WnonEnl_+ojyT}qhON9UJO(9#YdDJKaR%LJH^#QpNpbKvcF~f= zmoOa{p@0}{O*F#m4T1@Cs|NibeICVoCnFb)34=aL99f|*S;?k>8V*Pd3GG~Hu=EOE)?0|%? z@MsR36N#Ep+-%hEX*&Ugqgnv8*u|}m^ZcgvgKPq!9z=*KlC5^%5&nC^=oQrzNj#6L zv_b%iQ6rLzfuhJ9+I^WyAO}h&JT!Z&!)M>XoOF>-gXSp!99`~D0wWIBhy%oH6wTFS zH*dF%^qhVU;_m|0Rru%W8SmFrR2J10an%u&x%jN$Hk5}@6+sHIF?hhfLg(sk7&-DD z8z@LUuHHVxVbWEeqCPd~7fqmJ$(Tqn(Eu*T6e<_W{U7w$P%pqOeRcpaPwg>4wDRH? zqniGxyM$-M%-UnhRA#dp4Gc3bF*fhyi&40Wuc5n zns7M>Nf>vyHSA=Y4MzkAOscL^o>5F63&p8TS>zg8NMT!jZb~Ydy`%?WuJR`0(o`IGXHV_61K(| zRph4GRnN2rAT^*K?-W7ZNluK&21rGg0l&cMC2H`>Pm3^MF$=!#qt=8z#3kDY8wG^`)O7t zt4HR$$bt5ye-?a7nhNR>l1qm6$pxxLutk||+now>S+X$kNIX*~Iz=tCQO)!p(kcTu zFJK^ny#RyabnW;;1#@aMHFi2L5K^b2>mKt{qhY@(F1-YX*n+c};_mQ5fG}~nr59+^ zCXFb@Uw2HC^Ix!3k-uSOpKv!SJzue1hs+QtZ1|NlwrS1;<32*j*O&{1>?KuzdaJmt z+<{v8Qnr6aEGKl1*m>lQ5<9xgrRmajz0qkBz;U}58Ex=Q;ymy7(X?df6*ea!#)5x# zroOKe8i1rtE|i$vJyW{GlW$1M)7<)LM#`t?h%wXw2;@Z6=^YW6AThdd&F&*wPO$Q# zR!lkWq$NatV13hCP^~}?<|F8yjHoBpsa~uO6>`a;E!|PL9kJW!dJ8W;K7+6a7t3vQ zQsJjlYKoCjKW0OTa%}Kag?VfV4r`48e zM&Sb?lmxjW&=oI$TMdi5(oUL3cVasYjIlJpjacX>f6`=uedX);kLRIalZXG(ZH>E$ zt`ULXzt=r&%^7@G>PiJ_$3l!J+15&ughWs?*hA=_2jMN-OLrJ=p?2|D=k&v2tXSN~ z4Kmv_eSQG#O1eVLp>2rg4woWQrW4|V)L{O|Or^d$CIyn|G>yUl;wV`D1@2(+gH+q} zQ1wiG+^_;-SJ9TGx;mhvwJ;5IYn%(y%M?e5pMT1>uZ%id+;fsnQyV1~UL)R9cz)AO zv4@@ccAhQ6V_9i(eoj4^}-=bIiIZs}*w)KW2V@>bd zO`5bDN#S&uEnJQQg-CCg5J{L6r<+lD4s-6&Mr2h7)6f9MWw>dUu^5f^EJ~ z0R~J_`LDH+imzc|%Qv61l9ZJ4lcMMVVV|(O5|!VcRTt}a?ETt!;e8Kdc{q4!?(^iQzKpkhQa(kZ>Ll8i5Z_BUQ~0ww)6 zn^YVv>ss*ZYGfDt_Kw7$DpgIy=pxU)8>)0iPgEMS&~`IhM(4P5)na9}l0)hqeVOs( z#*|*j`BuIp_4?jGsmLg9-ABj3Ula9O z%E^TIN4Mmyt%~TfCY+?vrKMu1 z5W{@Ac;F>qGLGHVv~ zjN(Si0ih*C4~_i9#aG~;0b0^!8_}Q4eN0+KFUc?XR4E|88*54sf>YymRd>Wt zTv1FOkt*I~hHzld@7E7EYGpW5+Im$ z6v|~cf4M`-K$B4i*Q{kF&d!*K=PD4kWNCRx`!+#!nr6j5gK%oX@kEBx*W*80(j(P^ zw#TM>O`UOK!)^0vWd;3iLM8|ANMgI%idjtMQ-3+CVuzK|I_rI?Tl`bttnS_{rR(#ThImd5&Zp-Fkj(Aq+in+D;eB&?L;a`Qww$r&+v9#E|I|n{tH#J?A zYo7C>C}Cc76VGh%1z0vLHRoe>CA=(RYR<*EF8L;kw#HPQ(cBur){)PwgODbQ(r{uD zW)eBzSJJ*BziU95ipiikkJns#ACyYXgd=?&l>)82YXY?kBfVJ+s{!1Hs=)qiPZeAV z)Xr^SL1)(8x)VLNw{wA@Zyo=&9`srR@_~vn`SVY)uV27Ttw_;-&Ib>^$8R9|g=)hZ zef@q-UXD06NPPB-D%0W5a~GL+0 z7VpGcEF_-J$X6cE7>KVvu(>3LZ3? zJt7d2*^N#T4G6()IaMI`^&YH%+5TFe&S+*9_9STLT(YHSDqVp9&>`jHKj*Z%QV^d* zRB2!yjoHM^SIy0%K(D<%gGHpv6=#Rx>!9i6O}S9FWR4}$94=2avijWKOr>+-Rob|U zL6pes&i%6GY17+AViY|pNO-8r4|OqRPjxuI!+&CXI>(tBlU<&P8e9lry;$nRciy_X z&}gzIUg((uLOgpH*1~Ef9P+#?B;R#Qm2K{EN*p!x4GLxw7jaZ1jew)MvAS}x--Aj(+YtF+-ewV0 z+|Z_ia78;QY%emYi){uF7u5>1d(~O~k<~Z>_@oe5@_@7JAedw-t=1%a`gLkP^*m3* zL6~Fc9*7yqY4K{ukh2!ew31>Y_K?XGUklIZ1^A1TSep~ztj(!9EPTNUV7eTWfTBI=WcW%a zy|pzMd|5|UFX*sBly~};Y+pZ3I&8wyV9@!Atc~WS<1*BYxwgEYu@wVWw&KYUUVk&( zd$5GC%{8MawD3+90?u{ER_snxZ8q^?Wh5PAiMWK_%gt37msVv}MaN*Q(s;hvEOtf^ zbd)&rnJtWy_BN)$ndObt3)68by0St1(Taj76(?JD~;K(F6JcW^HCHaq6@V+B?kSrFg`qdipPEf zIwoIg>zaORdkc@#H42lb3GA+M4fvYP-8_kqy80AC(Kfbb$h!SOa^|)=Iy^__?JP6~Iv7d0;1%ZM@eN;es@L_U?Ol?wrJ{qz>cR7X&g8{aAvRa82Rq|Q(6 z@Gmf@;F4}(d^*qt7h~%m|F_e#t%$Ex-vL96k-l>LrjR(XQ~sYT-A-Cg&EN*}k!FZ%sJTX0sXRo6S7XGsRXE+Dx z9?UCu&t(4&={HssssrCV3QCgwsPQy}Mgo8(5(4kIZrF-CyZBnhX8%#sV#q+yKXBW) zAw@OI?lTC{ftc!|L^t9~U7AA1CR)74MD*I@U<6+k8=Q748%OTL$*q)hGojvmyxX$e zIqOszo7CfYkK#sQbXJh4%wH1-<}3<*eaLN%h65XdxPsp6l zTR)soArQj~k(I&MBCy74xw!Ae6*mR|JwU?0Rr+8^j;z}{Hj+NVen{#Y4k7%@6nhL% zAoeoK5QbQL2v5-zIHpADrDMVJ40&QP%B0vYSYt$2R$$~d6^i~e)~h9#Thne zOKmFaVm|Trde(2#%uAAapSD6Z=^5zmi5S7{GW|x#fwC{MJj)GVJV+Zk+_L7L&BU#m zIvC{zQ&y5JH}j6rGWatJ-|~t0UsecGW7U$p;n^6}zcL#vH9`}Yt(H8dbez_ky>sJXA zk92;hq+t-Nl0zHp6Jdh8fq(_o|Yp`l`(g z=2=T|z`Q;B@fl*T59IpoUO-3Uv#Z3QzBzWvaLWkgI!|m}H#2-8Me!Xy8&1wiQf53x|IrlBh&-Wp*jmt`j% zj-+L+xC+3|VK+tf;GJ&r*8^7|SJ0IBq^P(t_K2PiU>x*Z=9RggljJS4x9m;6ot3fu zl@HLxf03LYwj#9X(pq?$4dJ~&cWwqT=Lrl-m6~buU=2(TPG<-1;4TD;q$IX8iKrSO zE}VpfXctpjE8*(u)a~b(ID&rm&P!E<6Y2rhz5p~fJdNg?LT3qLhSliEIn1)3W_>K{ zqiWJYeOqXTBDQ&EP5z+lXLUl%sEH-3;VllJcYsy$CE1cEi61iaR~X;Kb!GJPVsgb- zR6R9;VxvTwd?-Q9dq+J>QzXS<7H!)FD?~ruJocfPk<66B$}kJaSuN zXxq3ho`nF+{OVKZr{vewzU<->*D&Ts0Zoi$Tc!{SLJiKik7jgNScYtUY04aec5y2z z4}+X0KC+l8DkpEMJbfK%{AN70V!+x>C865=?r=a2!G)Lk)$?9DzBq>jOrji31!uwj zyp;|)MR$r02l3RIVO4&Tuu1G7ZeSrB$CuB=XX1a#BnEmc%K&Wc+66;L#^iL8k7rz4 z;2s3^$Si#`7T`Im5fj==)bd=XvsE_F`Nl?0I)D>I6L8!}o8GKhhCBaablJ;J__5J3 zN7e-!GDWL8tCavH0=#`KeR_6Wu1N(OpAgXCLLqK4_^Lb>PPl;da2)-)r$(6!Un(OAeBLjf^D)sj*oL z-8C{8_a7~N>dV$#%o^tMG}kPx*)wY_QFN%b4(smuE1DHc+{m0E z(~Q2f3N44`B(B^T)37Tu$~5^^?4C^MWsxTj=QwlxZhVcGuT*;&TLNvy@o}qn!x{E$ z(Sr@+*brzaspShytP<+*X zcYN_|TS*H&nC*J!fZx4Zxjtx%XKWyU?Fp#qPoQ_y_4n1&meXg#fknRPrP0G`ofE)3BvN zy$M26Mez%L8Vk|>(Bdh#c}xgt?{I_k!n0`Ha@4Jz-Fr^pmKv8#FV+mE@2Vpf#pD&g z+&CnNSC-G(K`J{5Pi|JM_HFotxvQyRkz80Ow^mgG#ZKKFHlk2QlN;SZX6eJU^Ej*_ z;m7jZUYa9TlziR)$mf~%Ju3~)foeLinrctt zUK#d5=h!432O6fyZBez{~K7+<}%j*f9M3+OLC%7R-ZE8RVHbMaCb00?AGyAKKl@eutH}9 zy0;8k8;BJZ6TpE3oO)Ot(z|m3IEaL_D}n-l#x75Ji@%bQ{RC;L=BTC=^W`0@OF;DE zS;6st+XfKtc6sC4Ut0p}P92W-zvs6Wp}E+FBD#Gdb;dFlIavk&QBe@$5Rz8{1{xI> zaKi#GO=JO89#?xx`BA%6cz{8;#~xn3Y8mWit|USAfyAdJN4gI!k9*&fQ^(k{D?tLp zzEqj{R30!q09+47TTCc(_|cj0bCz#lh+lJE>epjD&F#Y$bcT6gUA6O9XNI+Ww>PQv zVCrXyCQkC?!1CmK_)B36q%8c%u`EvsK)4qqw497K3fTq2+lM@i2u8aXLRgV$;1sHP z<^yboIjepI4f2?Jztl9@Z5(Ho3!jH2h<%5RMcrj5-+%>C{7;eodf-Wbdj#I7I*l3P z^>2^c8pwgs*Ny-_H;<6dxlSH-k36yQ#Uxb@lZ=z{sEm74L1+!0qT3t{exQk@f#h_e z`OZwZ5gTx?5~Eg{54FzLkn|jaP2p!?rO_qX81STbHZttm90gkG?<~Ttl~k-sYehJE z_u#t$zY(A6LAjWamucK2gn5Cs3#-v(tI!~_CAdvakK4?zr zk+C{8y7P|%_UOr=HxFXmV&>E6w*ZMfetxYLxTO44TeiAZ7JoVJauILy#GqS3Mzj2O zldIN>)vA9X(cCXbKGs;;X7#}>1*LQIiG@$P2Y(MnzHl1n23nsFgin>1%R=y`pR~UO z2cb0Ed%5|)dhy3vCn^;A)!eSZvA!#I^O0cEi1`2|5zR??dhvjneXVy3hYUmX%(FXx zhhGTZ=O3ucMISAiT|i!1U1?0YjyOYu=%R2HX8MzWKWPw(KgaOlf_wP9zw#u z)(F61QH@>8F30jjEBADr@Tz*7k|ye$QN{E$9CTH;`LTCJb!XlC_O!=JY%PRP1wo6= z2zB6d*>z>m<1yk^P0#a`Vt0Qs^CO`w7IXT+kvun4M9&@vh^f+F2Ym>2iQvbwh?P&{&ouGD~UrC8dx%wJ9vMRd!ZP5*Cl{~n-`bH+c~jLm?a zKzLoae`_tFX!x~rfjq#7JMA6?r@oGr=VD!{N~qp&AkL+EzgFSuW^6?Hlu;b~n5r)v z#5oG@$PWTY!+12H<+_-MTl~mVJAi3pl1@N=vyCZj%nee&ZN~_tC!kSb+kBIp`J(qj%1&p6PRZV(aoez zENR*Gsj2ZTn~2Eh=RWeK+QJz<2!~#N@JB8GPqasT3iFSF)giqq0dib!9d%>e=LAcS z`+no{Pmm_(Vu{iW+hX0d7k5|SrB%lD?SUQp0GN=;#hTRFr`IW(ox`1F1r^!Bl4#;D zi@4~XNQAxzoe*ryTdvro<>^cs0jbY)ckHqj=FRm*r2qBTbh_L~VkN$ndFBp>`z>9k z5Hs|`30w?8GZs%EH=4bwup!j|5vvj`-PjC_+_#w4;*__j$rP2Y8WtA;agNUj@Zy#gDB{W53b63=b=w8tuo2Vta zy*nNj7zh~ZO*YFrFvd1yDLHYMN42sp_zupI!YuB7tMF)u<7orPwi-`mvB3n3S~cSE z|5g!stB_kT9oSPwfE(;7i-KFm_8+~C#YUee^K*2%gxJPlNN?mutM^-$K)0^m2oaPO zV0_fWi(vjh7hMD%immoiDclZQT0P}v8!v^STdB|rxzj6d#AKoiy`w+f*hj( z?!X8{_@>NCDe)N)QRfvc-q~|`MbfLM4zkoLP1RtyON0j9Y??mmY;oM&hDR=0e~P@G z*bP2K1TEz*(Q}0)y`Db5|K&0srBs|Q%p%>+6LtpLgoS+fqYdyDhzg9^5a=J6>OfX` zEwkC)*2U-l=2nh5f{(YDQjm7)kWd2%xKmC#-pH}pAu4`v+woR>3nagzaa}l45iN_| zfZzq2AzE;4FYza>3#B#%OwD#=vZQ=jC^FuqMevH=@x&`^w3DivtXlt|Z72QeN;4O+ zi~jC5h)qJRK1oG)N|AyH@iB+VV+x;f?Z92P9?#vUZ$Dvi=6awq9q**h>+#R1+lW54g0#CJna`S!-)=Th@@lgzEgY7C!v9Pd?>u8goX>zA1vn!>zyJ zcmhW(Nd=>IrwwjUmc)UC5&r;1yRimE=rjj~uMCB&VAgRoHR34yg!#V#^~pb)ZYP`e z+HU+~ce)?oljPY@I=HLb(uL^p+dSB$Ml|iY3)oD1yp})HZhT7TuM1xY6_UGIX?9Y4 zJoApt0TAO8Y6t)P5S)shldNKEDNC^X9;2U6_C}-jW8!B1p*Mi~&nMvtE>&3+%reYN z_#FqY5CLAwdHb^rFT<A44@BN8)TFLWAJNdWsM{J(PPSt7JY zL$!Y@VhQW&dy(Sk&pIn!Ia7^Q-MqPqpxeRF9-U2Y8F=PTBL4Ut6n@$pE&5m(i0WLH ztB6XsANBI~K!sg6g+z$fyM(--w(}JlxJGvdsLqd9YjnHnKYdup4`+BL%8s;Ep1V$$0=WzbZXu^G`jd2zDcK!hQuY+58yf_LP#JXGheg1ml9#LIzVicZJEx?5yQRp7Mggo6dv;@b!cCNRWThA0*%s zgHWTB==T0ZpwfdhvmRmq9xe8!hb8#U!h-gTvcmOW03}1II}ttw8L(r;pgmWKWl=m# zIv0n^pOcHhuK(&Xw5vfWKAI_zRC``K!iqLd_i_Ho@}RCO%r9Y!Lg?$?X*EGn=WM}R zM$wi`D>X0HtA;b>Z2QJ`~3|_qc-^ea}$p(j!4mtffeFL zFM6`NITACfWC2uW8E|G`5~ds}Nl27Ber+HUx$4yaIy^nXfDTWJr7tuuPp#nMe!h~_ z)AIMDFn)f>u7FalIR zZQy8qZ4nK~*SvbnFfAJ1qEcUZsKAv1b1!hwYXAaTHFC!dI0y8Nm%bLWzaamh;9g7= zHXZ)@qRDIo#^CSlxunG_M5IHwYkgeTS;w0L50_;>Xn4706&Qr>CGJc;=dWemxOA7` zJgx5&K z533VHcq@(QNWaVs-|DfBCjE|)J>_QY9?}iKLZ{NA=!3)trie!VJYRX_UX>8ik5ud~Wt|KS9=Sm?68 z#iU{jb6h^B+@L1!Kg1U+3Tfhb1o!*{A%axu7QzdtsyMfam^E>8Uv0A~8q_{~&G$E8 zuaf**=g;AEL8Y5XsR>pT}k!e$D zc_Y7xBB>-!WDZ1=lzS1yuODosYYPM*S<&*F5U0WWf@yNv3n+Gx{3o&=91Ma69Gsw> z%`t?8Sy3P%M}ZpqeE4w??av}i$|f)X_)rLFg@X=(gkeyiZ5EqL43(~i;)#K z8q;rQKOR-rCER5D-OXt%a{LmW(Eo$az>}QDVNQ;UchmFof28uJ^LKFE70#WkC3o}E zwQ7c#K)BtY7~&`G6$w&*)wzPKChIk>BK@2%8T|;e0-z6T;=Yn zYsWk|)2NV{7PpOf^l7V8w*#{C?W>h7h`r2kcnXEBtm>IA{jp-sbMnW0=DD&e=ZHLi z3&D;KEA^7)Ti%G#>!wp4X8vv52*I37<;>kFDJt=qw2cW@&zHpSkso`(H1*!2(Z|WK zzU>jW;vCem)pR)I6iB16$OJ~F9|&T=GAzW&CryNjiA^TstS$MqAkY^c{|ylAQwt=e zWuYT#D3#q#P|HUlA`yiyhco{AM_^aV4UPV7Z=xmc&0Q2Qco6^;Q*68Q(l}Z@2LU79 zq&u`=`51O@W!pxLbiqJ%V=e;eTsx#H;H`i^b3gyR}6ZUWH8uJew7*^`7_bH#n}IsO>00)Fl=7Q za9j}j6OlYckvAF|K|1S)bj&Mn8Yn;SxaA^U=@U+2)i-(pjj*3!etk(L_WBZT-(nox z8QQYuJqcQle(M<+*XCo{dIQuPD~$xev!Y+%*mly2@*_p-*w*(cg9YLeGd;?$x^K!r zDtLQ}{oRZ`)s8oT{Sl0oQ3gATW~fS$h}2j-I%Qx~&wlVhCjZa)Puof;DrgjKIYek_ z@()10IwS$*;>r1Bdi*Mamf|HMlOd_Ec%btb0UG5Ir2UxT0FMU7{$$$|?Et$-`I4vz zx<3tn_;AU;-x)FRZ{7np5xI&6X z1YQ(A^-EyR7`6kaWJ>gwjI{_7#PJ*uPO12wpSA2&B3@rSmYuJR*U$c0Ut10*A=)cD zAKsev>V(ghKz=y)H7VD&^!)1|`wl$e%{rK5IJTZ0nhl@18II|h7gt1A8`TOp?R0l` zcUvHeywk~Aa3B;F*;Hp{XaCwJK2IyUZ{nncergzJ(4!?t_pT-Tl%I~B>AhSNh&~M> zIl^wYo~tC}*o`K={e>oLRiMQiiCvI4Tp*$Bgw@TO=lb&bDm<$CtE8oRK$uOic%u~- zH6!D!si8p{odQB7QU0|n#Q}W!W_*>u;fMUr0w&gzcf>&zzw}0#jN(x;k~PiignVt% z5QLFG<8JIf14y?blfmr)zwl*wQc!0VNv;M$#1Y|68IPVMxiVNqKNev(mt)0fp!$;b zWert zc9n<0e3W!caK7}&2V^^5Po=5Rdg9UOMlp&v(=#Y4@-O6&{ifWJ5T1rv;h1%z1fvg$VL9}unm=ebs`t}FJPL-|k9;022kCIJ(nXp9^|p$p}urR z=J=Xg|H-yah~G#CX$dA`;0PY->=OF%kCwZ{*b+NgM~`c501vVw#n}HL*n`g{>^{rS z#G$A#FuKhWixz-j1{*6&kYCmceJf^&H#su!k?5KYdRUB5sQ%uJp4n(L-mO6zbuZRL z@2Oofs%RsQW8FUZwK=>-&S(QgQZ}Sr<;2>@WaDq2y)mzBT;!36zLyrH<#?3+zjQ(t zda&8vZLjq}gd!yI#@AEmM$3*vHlcktXDx1%)T$+9MEv%jN_b*r%E($asnSobUW@G} z>=+|dQwQ(b)`!a577G?S4kooVqk>JdP^u&?i2%qKhPdj!0h%cngrDgxKZy8})EZIT z`s`M40o=d=#T2lx+>B?CviAl&+nQQgD0Z!5fIChzvXYH#SdT#CjS4mI-0T4Hm+cJ% z|NB|+hE*!=xiw#bG`O_fo#l$04puYk;04nb-*k>|Ak|RirD)uo0*Vzvv+@_Vn*0g6 z+{w(irbrS+A&IBKwzq;+Q({n8yE#{nUu{{DEI<+|%E(+~?FKPeu=vG@$5xrb)h=8y z>Yg@_Q_Iv9VgwiZ#w#m@b^pO7jev4*p^smlJqK~fk*7x|G+hd7Ny_>fWXW)B<-V69 zB-6x?y$I03v=Cr~xMXeUvP$4XeuTc91kTGNYTa4&?+exI-o}N?Ivbfy7!6%&XZQTr z>`gSws1AgbS7gv})aRxHoHvKtRu#^{=n~@OSa}jg4(DIM9S*z22<+H{YoS!192Azv zi-D=9(6%PMES#u0w<}3M)|_&5CIXAf{08vsc(Gdm6flWqZ^ekTy4Jk3f?O(-`*pS{ z-|ENxIXI4rg9@n80pWZW7lMC>uW(qNr!|3L`*UGy0#k&#wAeneD1b1^r&_PtqU(a# zRV!@;<=8+n|xSusiXyJYic@3gMtE^ z#>MEVo>y;4syTN!-!kvARMj7R3PsAZz|$n1y)%szXzknp-6CU7?^{dM=izc0mfm((*s z8p8b+B0l^FC~abZe1kyTN#i*yQLXpy2-5Xgc>mu^0kx*r;e36{dygm$`)T!Q)}-sP zq504rGTS<1QaxSs?{pQ=hRoMA%*ZCw$?NA8k>=GVG8~y+8Zo3k5SVaC(Ltu12bRc0 zA40damLlT#j4ssYs0gtmi*GLlf%oe9SP(e8jXsnyR)f-~K)OsBWNpDVdj%DDbw@;) zmPhYFR)OLj8`X<5uygPf$Mr}PdwX?vVXCz&M}7FlU(13RjKgK6nI{z)>Sb%0_}MbW zLXQ&(3KMVcwlK1s7xcodG(@{yxzlz62s;I~Dd1E1li@`XvuIQ;gFkJ4KrqAiBu_z# z;`&2KibsYI3BF+Td+JDX5T&?`2r>@J>7(obpn3DkI!MX24|o>03JEsBJXtk*{Yfc< z-ul-N0)C-Ck}4#_hP~As!r`H5jZZ^Lrh+*U?mO>?bK*U&YGd(9*L#w_*iDK7v$Y zWruNi6F)N%=xFM`m1ClCb`7Jdb0gygBGB*V*GuxHRi9T3B{$Dc8>9S8_7LA!l_RG+)SyaL6%q$P-fzSnJ2?!)L6pr)DP0&`MPpjTk* zy-5ZAy!*$J=;nhPgPrjx&U|#(gKv+xOLyGV&Aj8|?t{XjWaH(AXsDZ^Wc)kXY zw4zjXAKh)Zs^>xwTCOy}&vK@7v7yR1i84yhEwG(r5<-oU#$!tIIFshL$q{a_3etJL z%YL+ArK>bc?V%_!E&vZdB8jCO^`8Y~OF+l4dtYFmBzaUq@}!#bd_S5U#4@JTf`Z1} z9=9``pt*9GR@N$;3f?@^xB3wCSfiZyL?I5M*Fp9Nh3~_K53HmGUTj?D;|RXBXVynv zqF?K!ujtfabE(rw{?Y_zd$E|$o|UVftt2YHIK=`AMzbA8(^vVAcT}3KH5WBNA+IKd zTQj+->Hyd3xWU@0jZ7;^7Bwc!kv>6fR|m&=t`~c33$s_ZhK7)g1BNAV?b5K5>qjW5 z^yXb|v%7qul`#syEnoZkBX7w^SzY?^^`H%hMP=B40MKi5g=xC+-~I7Z6~xQrp$UzM z&U3Jz?@y{5G2e?NtyATf>tDF;&m)Hd|9F+ALQ6TxUWA}>-08k)$I`0aILA!O!W}@> zjl!`o{h>;Y4|vD3=!_%xgKMophWzFP?A7A1atm8322`Be8g(jKjVlZgG3DM6R{Yef zln!xc#1Maw9;WV7a!K|M#{BfWN8niI1t`B$t@X#GQ3(nK7<)j4jROFqLriMAt6%A+ z3sEPJ*Q2J%Vz%FJ3-l1|e%M4$eX9O{*xOP`h@|WHGUqI&!LBI`(r=I|dVGd^f3XqW z`^v;E<1yHmIoXxF3LyW@?{3f`-|5$946~xIA4$T(5sLfK#3lXO_`AZgo zC?_zFv{Y8O*Yv%3xF(H}YSVlKS7oPZd=ttL>D$@Z9&=~3ac@TT0ZLW5V6)2 zbwk@=ZIt*dCP>t6oIi;cavuN>h6JsyqXCLm@4mxz^kG0LrS+5l<4lS&#XLF-TA0lc zvf;kfMr0MOqkf4X2Eft5r}~HC!%WuXll+(0SN!jpc!15N=ob@MLaoh!VBLZ(IiQp^_5JT|tsght=S$EHMwAGb5Ow2JYjG zG!&iTLuu47Rb6^6K$=x>{h4#G#KBzSc@8J@mg=c5LS9)?>|wj$nXh=WhGu7`bGTLf z6D^kI@oM6NQ+(P9G$CF&OMH2jGPTD9|Mh64G@^?i+rDcNE%!o}gfV3H>sp%wTy^J& zG9b<^4{06iR5;PI&t9iVcJC9z>{r+%8&Rd6ZtVjoan3w?I~tIc9i+t~WQ2X>M-l#_ zEy94YP*H%lf)qzxL$^Q1SH+xp)5#Fp#2FHeFJXXoyGD7e(@G0zKdq_RFHL#g@2d$v z_s!G;_paWp`kiUN0uSk!=lGY-5V>%u%v}I4c%^B5#12q$k!%sflI)ez$tBh`|a`m5JiEpn8F6Ayir=d#w_J3^?nzRXIkn zGEvKhosAX0owFB-w4*SRdkqOhJ>T*zuq*z@^EH#J(p3~+qR72RnML`(TGBTQp5}hX zUe)j!=p9XGozL)y*Nj04o5TV9#Uom=>J?FDLxCPgB-`0Ka(Hyp^E%buNR@@^wC_wZ+`|2reXR!+@aglJRu$C3#hk}?VKJ*gH024a1-y!{3e<%D3ln8;A`JX&1JnUR#;w^9(X*F*P? z>jz_b(Di11f~9OA5rwTg&mSBTTIr2BJpg4EN}i$c)lvfB0M@-_CkE8`{Bt(RumiYW z!t`W`SIKoTyGYEgy)A>_N-}Dn8Wm9y%Q6IK?XEaZZxla|RcD0}AQ^i954~z(GD|7k zA1DN$AVyQ;wVTf5p?n}^>ziMQKa>!|EImZb<1`8)b|Dbir}Nuty)*yTkU46Cy}2?R zZxqS16OUejz0jx4Ax@U{(M1^i;!YG(GdioWBd#iwo($nH43&{qG@gSgYyZgg#|7InsVn(I z=f_Ywyf>gtgEJ~LCH0{$OfriJt*qgzYaS#&bGr5IXn zIXWaS1}enp63^pET)84V;P*qrzJe|IA>EjJ1T=PXOLB`N4I9HCf3kkL^^uG#L!zbw zbJqNY48YeJr&2%nE$}(#sbtXBgC5Xbfh*W~d^YmyX|a*s9mE%~Uk0TBbvl5%KcS~R zb@VM|L(Uy|Rs7_KU7R@E{7J@u47zfR7u7*puVy__7-THYp z4@kr4p(hNJ2%>-WAD*Z?c();MYPBnN}L`-0^vmcOU6V#04DD&(4Nx*^dVY5up6_bzn=QB$nPphD`sTqP`TZ9AmiU3CVK-@SPW}xrM*Kn^#(yIwkidR-%V{!%z%D}y0GX48IE8nK zkT*L_y0~P%`_UI_U01F#l4oow&Bo)-VWzW_-3ei5P{sPw@z!xTkjI_)7z3C5l6Y3y zGYumRLgu1@X>2{g|2^R|vy+xCZP)JA_?ojtWL^vnW*HRL8dkS?%CM_vonWjeIp83mo%vk%#Ye&52A)2(*2@ z&co@v{dkE>^eofsdVUlAlkK!~qsRW=MAvEy{Q$wMLA$N#lm+>BKMVNK)>n(k7Qy&A zJ{yJ166eEO;)ajPFBL|nPCm`9SkdOZIZM022dY$%01EN*2&BGglhEl4lGZmN7cII@ zQ(rw;cUMa~%CwcxQV;~&&@uhfq&indREQ0W4sCW{pr4rpv&`OGwpcbHQfkWuu6CCU zfP&fPB!bJZex$o+HCJ&$aT3=&KBi`a0|yPN87;q8=hm7Y<4fg2#2h3+Ui{glP8uLQ zGIFYkaW#KZx`g9+B&*-M>StEaMJo%%c*q_q&S#0lb1|`=8oBV%in?*koC@Jlx3NLZ zkE2Pr2-6PIWN7nn^vH2`{pZWEL^s-#F;E&(hbld;DZ1WO$BhQU5C9IgsgctX zp0w$~;z>tkTn9*dlxjfMQcyR%7ol&w3sPp8-af4C1YVyX+#Ndq-fW zio?ajHqw##%}p-Ua8gIWGP@J%!vpjhvW3Kz&6l%$T$^@IOXvY29uSnVScHk;X#x59 zy2_ZmtQD7a2iptqtY4Q!xoXRd)XHIgf6f--N*@5;KTdT_5YgJT4hW_Rb4AgeA{`MC zgX_5(1kfr(KBh+EWPDQB!+sRJ|9c-0m~hxyZNP=e;ip4cPM7CD2!!AHI`6$g9r;THHbTmE-orH!A`!#K z{qFpH%X3b3%u6FcyJM$V9&?a$+8kw-+l!*0lweGes0cM)@N8RY$}EXpm=+#0kik>f z=j4|e)wlDA-87tuSltIBh#>U@v>LkL6^=R}g4ciIBS+jQL|ZSG&W^HN8V_PK9#QC) z9#fPBg7}vvDqo3zn-D60I1E|P^Cxcm`=(0mA$I_ba=iZTZZ8s{lS$otf;y-Eb>Q2cv9Z>qlx|Y7f(xUr) zc9+`{Ic;*0BRP#g?`22MXxS!8`e`V{S2&(8y%qi1X};x9uq>0%#a;^5ohiCkEM~dV zNPP?1oyVtJQGSMaO`IcjVgLYuQ-?CXB?M3?S&&!RVkaRgY75|uDM||&J(&fiQPyl_ zV5|2m;4DK~{oI#V0-qmaf>sK4n4r$W`3!t#z>T+E7BQ7b5aj^IhMA zPvmmxBhFWRI#&I=@cKnv4A6K?TSn{PG9AeX26MB3TL62H`Nh2ih4JeOwSE0}f{R$MiSby^}GpQo2 z?F2#J1`yLpXskfI!VYq`uvW7rdp z#j|#9j@cuD?HQck+&6dx}zEWL5F34T20kdQcfgE~?ZDq#{c#TfsoolzI%w50N2y^uwn9?{ITO zYkx113g)}2(ECipl4+g;RNQaz;1ON|c)G@2E+I56Go^4_^hDBcOPT5%*}jI7206Cv zi%FQrSEyvfzr}tnsllTila{*U_XX$RG?-=&nDGx|{Ep!6(#or>>Sn_dHbSQ`_RN&Y zM5gpK9MSV$bNJ?{WDo}GJBbvc^m$ipHTu z+^9TPlYj@R!IJLaD}npBYXtUZkl)A1xv=_$Ib&S!1napl6T-um7af5;v4;?Ao&jp> zL=kwO03Jm#5T?&BNS1cMp)8pC5dg!(7CB^75@)8I6+UxX!;~Xf_ zplo$+>pSNq;QL;ofr$UZ6WB`^?{tfe*+saU?6#)VVV<=R+HqT$XWH}W7gx7tKpL;4FhScw|DJ!|BKXeg_`bAzy*+ zN@*ng9lm;Y%hCv+KTiyjVZ6fy@W9FO-)fj%R@!;RpwsRWX%*N3h4DB4Tn`oqg{*%a zv3v_{Q`mIvO>d}T8Nv8#YZI7=Kz6f<&nLaGx(QSeJcQ+cp#!OX-wu?nOWR2?Xqwy( zOJr~vzXkWy+YoDC#@ZCs7@G*ei>kXDnC-dq`kaDcS&^q*? zP9!UhmlKZG%z`(ul7k-wZ6FL0Phr4^uWDy7Qif|iP**t&#vmWdE2!!xEP5?x$AF+l zi(sju%dziae&|%1U_4K6NICt8B#XC2w&ajnqD0izrYT z&QY6^(+5Uf3C~uDu7kS9g;s#>6@YqIh3+E6Vpg{VB*B{$wcGz8@0mdmXfFNJ61m>U6(Z1G00@yGtlUV?tf?e;fb8C;89DH*U!iK4k!G?l_5g|L zl*EiY8=LBlS15~6oLk8>`7Qf}Xb@iz7{{VKws+pmOaa*va+Ro=DVpjGaOsI=4+3_+ zT-04w<>?)C2HjUkgufWWx%TYD%SHMZNGp_vhEvN5jYlY*=c>hq1Gp$J4!4lC$yN!X z7j(nYEXFs`w#oP2QB%#_Oy}I(b0swGRp9MIz?fJ|8dOj6rXwA|57sKS|? z{ofDq@OtYu#Lrmz?P#ME>H|FNS(I`eU&bHApUDki2|uxO!> zgk0G;DXU-8$WyIV&%ARlf{L&Eea=@JH$G zo*Y=sTi`3vVJC%-n-H%e`2fk7nwpkN*zh;*a@20sL$%ABK6iWPDITTLBAQE?>Yci*0@=eGX>%t-knM3Dj- z(uYe@3jvpAvR7)^4i(8t`?F4Z%l zF%lmKjy8xiEBZBAfK_B)SR7mr(o{Y1J7?PB^6n3nJY!Ffv7Er-_1Oawy=v$0|XH@<|SK;IsTDdx&aiqctXHry( zj5-P}EjKE!9(+TH)%$pb2$$w22P3`*O*BZcZO6xuBz>?MJnNC6d2|-Jzh7e5I66q~p*w#sjpgKAX%(5dpsZ9@~kk58Vg#Y$_67~X4 zFE(T^6Dt>@hr%Vk=2=Ryr1KS%!6*O8mmP;53aOXf)1tATIZ=jJ&2D#JttMXcWuhfNxrFHF$| z8cUZjGf||eyp7Rfd=6CJR z&8omQ)uH563M*Iic+11q{mlc%MPF^w@0&o6p0{W4-hlDPVCXhbudAxxbaE`k$1RjpHlLb<&Ix;3h$nRkWb3m&;yM_9Y)5#My zO~DCHs|P4&d~x2u==>!Ubu5!`Y-+4-c&C#&kMcUqOEwJwsdtGsBD+(KvSK;)mhT)X ztR@ZTroPB-8nfS27$t=g$|%f(4004N;%D;YiXRdyz zc!BBC-^U{Aop%}-Keb_MSBgM`+N|g<%8l7t4ZmtW!tBFJ0mInM25@>jfMr?=8jks+yvOsM#~vX< z%b>{Gs1SJ1&HQH`zsLCosK7P}gh&DVJh$(~v@}L!4s5}7@oiE8^xH#IGCFOZVM9bT zH3#XcZwv0PObV>0g3I;qKvT`b8NCQI_{|TYxe*`<6=!v^q&j0WS~mC@O(cDw<}Ng+ zrSBZg_;w;>$~|1ZiN_z+_1LRiJmlO9zdcz^iSNd$t6V?lQEIiz8Ffb%^pU+nf(+bS zYx`znb80aMQBGKDL}+v-?QGSJBvBg~N%HU- zHD2WLtm83JEBq8@=p%_JK;nFM1Horl>n5<_;~oX$#U4Zr-vSV+fxi7#4&I%`_ECAE z&pDz!Ttb6eWJu}CRat{<_Pnw0+QRwm-(0pDLW;3E4>5R}M@i98)VP@ac$GK;WPjI- z8OP;#t+49GBm=L=*I|C4(|h`{^;%BIR2lU~iP3&`(Ggm>ra~)S`M1wAH2#Sdms2JT zPP^y46yi|HC+7p4YxmbX3?aAxiRijvaR_rA$(!`KAjIEJY#SqUaz5MJjRzXfcI(Qp z2L+8jB}d~RnE|{w^c2s#lw6%b8Twb=(wKCjuma%t3!3-B_j@zlp)}agu8gmfl+2Y) z3L!Sz-X(OAdl*(!SulgMX01oYkB3ci&)J@##k0vnPi(>^y4ePHs#h4`NH63S&AC7i zP563DSiFtnl2zW!tHP7mrbGto@g$ipuaD|r@`yt#P+-XTq3O~dk_58Cri)FT_#X;% zm_aIhtDAPe19H7R+Ppi_LWEwjmyS0x%t=HO1>D4L%k`$XLo!fyb`ShA)#}spYACt8 z9v~+@LZYR54v3<}k!~9XwaC*&sMB+JkA!XJ&8l~0$_Dj`QCtSZ1dwWmPl5KTAX#*H znaYKfkJjklR4W~)s6O(rUhe8R6ba9D`^%@G*v!Y*3Mt4TXy&TIE;ve-`ev6AhX3um zFGMfk!pD0f>VJ1t9u7^w>Y{(=g#1%V%NAH{3kFhbmepU!-tq5e?5l0lA??XWI7PFK z_Z-`q)*6a~r5l_7-bN3qjRw4ec%XLb%j)rAAu|Q@kBS={7X_WBN`v1H`8+egDM+D9 z0@Uo>)~&nRtZZzaHPHxf+Iwb+$K}003^GSkUODr>#&K8M+9>C+%_3!yA2>kZrb2WU zX`WS?jVPh|X#FRJ&=G2?_*1-^bkssA29Vsu4-z_BEA_y;HSN#@`tlZm9UMC{MFXIz z`#9WQ;Qs+FdgGip{N%PVSA`>scj?};?HtYhna^wsCu^yhQt0yySG|U$C|ULte5}&pqhk0Do|XW zs1BZd#EH10@FCja!x(GpXvg8@RO91GkEf>?7P1&r4a~7MpR`S?>RX~an|m9=Uq8?R z4UQ)8pk(>qQ-k1)xdync1?5W%Fd_^75XIVSB#+8+%g}El4E8&Ql@MeZGvg9ri*%mG zqL7Zd1zM|FC1?dlSHj4c2=2WLPUeD3oMlx;sMVy3O3q_m*xys>A78RmMl}15z$B5L zdZ0{^r|OkPAccHj*QBka=(ovMHwptXEKcqa*Lfe8Xem@i%83Qc2fodQ8V2&EKj zJc!BsL3zDanQx%VpOL}g!Ksr6Ij6Y%MUm?!Onwq^UWOA0eo`#WVdHEp>P6F+wptpq zA#s`$!88+NO;ahVbXNj``S;h}8!U{#dr&4EOVC23nA~S#c{(%RH+2#?IPTkLtI8Q# zq_-E4$1RO(bu4|*r)z(OEg~EC>JZTU1=}t$Bed)(<}AX5d>;iF`=w z!<&IT$u-=^%Xu_Xj!%f<^K1<^`l82QnmZ&p;ZaWVy@Fl~-<)4AC) z40It4EZV104^5}b^yAe~=dowHYdEFu&2b@00)w?yO76Pr9{Y@VT^}hvP-?i38WbUL zxD8MCIQ=l)u=x+!e^j?E|7Ifgt@;xx1y_^&qEaw&zW>LNp)SO+QIr6I*?_yd0_sEk z>C3TpC@fD6@(dxkw<09%NLwcDn*9KQI~wB{WZVy9@+r9B{;nE}d#H^znS#gn8b~GL z;=+JMBVv$Y}MO+Iu`eGiTNq{`yXxIPIdY|$;j(kn?}dSucUPJ z*kFH-&i+l|v=uZS?zHiy550N&9kFlyeZRxgZ=meCNV0@N$?GPz2j!KPaN%K;TjTCM zsF#kP*K1;jqZ7T1;Bq3)2oIs$wK@V$1CD#bbR7#&V6KBn;gAuK@7w(z_mi=P7V96o zvS`|;u!8!(HDU=s+by4LI|z$|d$MX#c|zmLcc1yO!0FdS7cex%hozfgdbY<h?wHygK z@SVLrCmUho>*QBFNfwem-?bNXPBKk+#Vr|81^}N?@X>NP29-y%S4nuAj@I9+`1z?m zin8gq5=;;^gbMUAfr4-wOe5bbKJ14EpR|9nyh2Q}hWx2_lTU$HQ?}iKLnbyXJm|q8 z_2)#Y+%EA!#!+){?gE*+nDs-NnxHM7?$T*4RQY|6`l??2S%=Kz43PN#xUhTHa#|7@ zIGbGcA$i|A9E{ zD2J1rCRn8uzYotsOUDgnDSDx{VZ`DUa&JMs%(5|>BYXn%R^iqWBGyrg*~yI}Mm=0- zTr@y_12)cJ7s^Es2op&=+WqzP+rV8z`2aIztPjH*sw>l=@scOHAR|`i=3QygGP5H3K+eW6V+7y?_^_kAwJ342sFtH9qZ2&eZbCSVHrQ29k zO!l&fK1WSQot@zDb9`nT~maDq`3wL$fHw6v;6BblPutSjo zMS1xgkxcALvJ9EBj3GRJMHDNzxbdeSv|@U}7E$*g`#0NsmDXzkPo8W$%tb<#CBsHq z!Fz=|s0IBpI1kKwmd88Aj--3wHrg3ulIQ{$a0d~xn%+0B>Spdb({#8j5f9N9G14;{ z2#E{Uw+Ci@f{<wbF_nPvUbrpWty4T#SF89s+8HE0SEmd2tMqYsQ z{m1Z~2zgpTxszDI_wwXkXX&!`S4{T4bR8-J2g@*Uiy8rbG3Q(VII;DEODS>lmtWp0 zz5q60C)c-AW(Q zN2j42(bh5(n?c34jW@QlOe>{P$vKs-NgWBniVk*c%GZ1AZ0a5KMX1Pw9(}GA>^MbO z8#ST;=L!CM$V8PXEG&5t`ND217L2Fqrf4QJ+E38IWZ62WEFS}Awt^Fwz)|T}qlI(2 zVNY^X=gJWzsvB}MfwK(WSCKsBA{KYInYMe(D{0jdks?7v$r+sZ#C?w2}*_7t%2&J2z>R$-Yr+Bdy}52t)lL5enjH)yxmS58kPT!jG?!9VN;8Pgg8wY zX%oyVN)?5DlFuH)FyX2?xhu%1FQ9q= zIc6mRah%~iC&98AlstmoMLSkn+1*{$5uHRF>^w`3W6MPbF!#U>g2Gq%ZBz8TYefT@|MJ zu&34vl3aPUDP?s2)jKsqf}A)(jXGkj2@awH-Taw*z&&uT$*gtbQR_cA54>6+DeAzo zop$3!|6;GH+%jT;UF*?HTT%J5>{ke0P#m%PqR8`aSg>?~L1Nkp%3<#9vt{Je%0J-C z3K!j%SU-~xKX+?+rP^qva2Iq%KtX59^uI2&Btx77dia~(&GnRU>hOkq?wqlX`TIhL?5#0qpiG&$|R0!;??2FnR zb_=<16Kje{Wr#hrtOe(%#`_ZCE<{(jhKuxXi)2siCf#R|Vo6B(`xQTLa|N1r?49g% z`6oTIh0^oO7-7QXzwFfa=WA!`79ms0LAnd%?N(3`-Jndpr|vdVpbmvQ8w-t;%}1AI zq5{S*#^kkwTBfjD6ns7DBI)g28g!p4E3Uev9(*|5pBP-hO^_b~KWOdEEhQZy`Z+2; z>Df}~*zSu#7R~i8ZhGK&BjQ-17g(-Xg2c_fXW(ET)5o<@q_4=oQO&>;^;d+7>-gEC zDWS+_@2LjQODHasa|1&Hc`E4qxqbk*xc8EgQx~xE3q4!u6AfLq(KG4%pM>nRsPi8$VrWa| zYig$0^u-T-sHe*B@{-IqU5sGi!bJ4%LJ>xBAwMqC1FiwP;XnX+DjD*QX zeR}O6d>gCKd}qpda9dDX(3-Y@$ZQ9HRI0c$b6}+s#2=xh+u*f?Qa$MX`V1Zw;VjW& zE!>)81y&Ebwb`?Le8H{M_e;|!TDa+mt|6v-{O4i_4rl|zMzOy2*|lT+x(DypgMles zL6UX7fGl3@9}E|9U=+7oAhV8)K6$JYE!H+?_Z*YE&U{N;uESTgWiuV{dMHe+Tc(*G zD`awsH-9qj#A-iQz1Tt-MTc*ASwPJ~C2IY0#H@_i8xlVO^Ud&pl;DH-sL#+xr~1-x zS3i@b_CW_*?=Gt`p&871*}ly{Q(h+PgAIy-wrkw&b4G5}8ZsBtSP5QsWDIt=CNtAg zoVr`UE~S4{Tc`FtR@S~n?o!d*PV-L-Wrzup19>z}UN6^;pI{GD3xXTFH#bO@JkRc! zrL}t6Y2sh`$K`&db(_woi>PJYX-Ir{otztC8i;Zehs3=R@#A}Ne~IQ`-41hc+z$iRO<{+ysL`p#)CMHHt{(et-qCtC6yQQGnyCfM#+>)Q=0& zKEmGm^;Gk5WNbL@7ICHED~LC05kI00-J|u)w&>ZoxXu`{%pKC>dwk0f`G0C zn&gmoh98=O88Q4fJCr>3PXWJeZf-*&$A|z)@(ey~gM5M2ENRwXjkm%2--Q^u1~z`U zEMWr86U!V4(6&!DU%pd=N!Ioh9+oqy*zq?R-qFzo6vR{NYgglD{g>u(daeHaQLarP zemBGX_7t z8)0!NH{rgX6#M*s3h~jKr6J_K(p~iEq`-i$;WjD~1@%m&l7V?y9r?q~ z;ZXMFGI81(Fw%5MKl2b(vCdvuwdPxgmk%D;i5*3*i`%?6C%M*arrK}{bIV;^Z|*9M zkhp|mw!H!%dkQ?{DRRJbz3|^^yKy*LelUEz72T+J@<%Qg{jkbTrj%d`?*gsg+?HN; zxM%4Wrv(HV_DKGs>X9|btEJ4UEGKSZ*&kJ8uFG$j&&x@?06;>Zqy;eR2}RiG4dm>G z1!DLg9+l|V-Gq*EWlBd@Xg`>L)S8XQKp0l{pv<*dHXSAy#=`FR3b~oi&sRy5Z}g>c z0WPxks#!;7abc%mE8D+^2(f()eX{B{dd$T~i>(eKZ z_@11NX;?;{6zaehzy`MszOV%N^&VyH=lx@aV!Gn@+lB(a>XJ;tyRe|uh*ebG$V{ec zhl3z|;#t$~20f3JjN~w!ZyqChdBH8eWhZ#8Xkh*lT2t^;=a_XS3)$hrR`b4dQ}B%H z`+)cY{PilG8UZBMuuGW=5RsL|Sx=xBC0+fzQmWRjrd#%aZm1I!4sSwieROfq z2C=Pd77?59;_`iwbLv^F@z_=m4-P%?N2r*<$1M(Yzw=qT|3w?DCj&W8Bi0azx@DbG zRYg_$5l-xXZRK;)bxMW-v4yhfmz^VNB=8sDj{?Iy7`-Pv@2C(Ni9_=6LxLn}hY11R zz1iZAx=J29zv^N~w6O*Px;(ae098BP7W@&RO}}tvQ1@fRxaXWxu=#H>9n2Js-i;h~ z8Tj8tuE*~h;*=65C73GeFyHGNQ9Vg;rP`nS zLKo$UAF`el)HkWpudOlD3VeUXES448#u#xmIGdD5$!A371m~C=<@C^$I5OT39dK7Q zUzT~H8d)r;=nZcf04)t9>$30ye3$Me2i%Zcwh?GlI%2N=#Flzv#uunX3?WoS9b|X( zM(B~?_1r!%af7|@X6D5DgYu@$^w2sft#7D1mQ(B ziFHP|WbeAwgyO$G*i{bn3oUK-?kI*nvbJEO9T+dvtd_<26f889q48SOUjpe}u$Zl) z?`mfO%{QKDx*EayNv^3uU^}zcFh3Y&74^TQM0dr6#o(?}SqUk7YsZ<0wU*a2u7&2} z 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 hmav~_EkGC=p)&1|4c_Iyi;afqF* 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 z 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