mirror of
				https://github.com/Telecominfraproject/wlan-ap.git
				synced 2025-10-31 02:17:58 +00:00 
			
		
		
		
	Compare commits
	
		
			52 Commits
		
	
	
		
			uCentral-t
			...
			release/v2
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|   | 406dad6604 | ||
|   | b31b236646 | ||
|   | 0c379ed26c | ||
|   | 647d5c8a33 | ||
|   | 7baf962bb8 | ||
|   | 09c23e4f4d | ||
|   | 5c82ff107e | ||
|   | 5d642d0325 | ||
|   | a37ed25128 | ||
|   | 544e6ff3a3 | ||
|   | ab2ff431ee | ||
|   | fd884e709b | ||
|   | a6140a494c | ||
|   | d9b43c559a | ||
|   | ebe982fad7 | ||
|   | 89ff811e94 | ||
|   | 7c030d452e | ||
|   | 24d64b4704 | ||
|   | 2279c1ab7e | ||
|   | fc223fae06 | ||
|   | 640e676753 | ||
|   | 650adaf7ad | ||
|   | f4129130dc | ||
|   | 8fcd427384 | ||
|   | 5f26f65e46 | ||
|   | 16b70f20e9 | ||
|   | 3912a0a362 | ||
|   | 46342a2621 | ||
|   | a5a37a22ce | ||
|   | 14d3c44184 | ||
|   | 2c3becff4b | ||
|   | cd6e94f201 | ||
|   | 017bfb6cd5 | ||
|   | 25e38d4ac4 | ||
|   | 5477419fd7 | ||
|   | f520e4f5a9 | ||
|   | a3813f4b5d | ||
|   | 839bee5a6d | ||
|   | 3fa8e33a45 | ||
|   | 8c52460881 | ||
|   | 0c9bc8a958 | ||
|   | 8cd26b4b50 | ||
|   | 8e511326d5 | ||
|   | 2d40fa3c55 | ||
|   | f7f91aa5c0 | ||
|   | f84eeb94f3 | ||
|   | 4a1f6009cf | ||
|   | 99432b9ccb | ||
|   | 9008c7b9db | ||
|   | 886b8cc103 | ||
|   | 6ad420b218 | ||
|   | 0c422f721c | 
							
								
								
									
										17
									
								
								.github/workflows/build-dev.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										17
									
								
								.github/workflows/build-dev.yml
									
									
									
									
										vendored
									
									
								
							| @@ -2,7 +2,7 @@ name: Build OpenWrt/uCentral images | ||||
|  | ||||
| on: | ||||
|   push: | ||||
|     branches: [ uCentral-* ] | ||||
|     branches: [ main, next, staging-* ] | ||||
|     tags: [ v* ] | ||||
|  | ||||
| jobs: | ||||
| @@ -11,7 +11,7 @@ jobs: | ||||
|     strategy: | ||||
|       fail-fast: false | ||||
|       matrix: | ||||
|         target: ['cig_wf188', 'cig_wf194c', 'cig_wf160d', 'edgecore_eap101', 'edgecore_eap102', 'edgecore_ecs4100-12ph', 'edgecore_ecw5211', 'edgecore_ecw5410', 'edgecore_oap100', 'edgecore_ssw2ac2600', 'edgecore_spw2ac1200', 'indio_um-305ac', 'linksys_e8450-ubi', 'linksys_ea8300', 'mikrotik_nand', 'tplink_cpe210_v3', 'tplink_cpe510_v3', 'tplink_eap225_outdoor_v1', 'tplink_ec420', 'tplink_ex227', 'tplink_ex228', 'tplink_ex447', 'wallys_dr40x9' ] | ||||
|         target: ['cig_wf188', 'cig_wf194c', 'cig_wf160d', 'edgecore_eap101', 'edgecore_eap102', 'edgecore_ecs4100-12ph', 'edgecore_ecw5211', 'edgecore_ecw5410', 'edgecore_oap100', 'edgecore_ssw2ac2600', 'edgecore_spw2ac1200', 'hfcl_ion4.yml', 'indio_um-305ac', 'linksys_ea6350', 'linksys_e8450-ubi', 'linksys_ea8300', 'tplink_ec420', 'tplink_ex227', 'tplink_ex228', 'tplink_ex447', 'wallys_dr40x9' ] | ||||
|  | ||||
|     steps: | ||||
|     - uses: actions/checkout@v2 | ||||
| @@ -61,3 +61,16 @@ jobs: | ||||
|  | ||||
|         [ -f openwrt/tmp/image-file ] && aws s3 cp --acl public-read --content-type "application/octet-stream" "openwrt/$(cat openwrt/tmp/image-file)" "s3://$AWS_S3_BUCKET_NAME/$IMG_NAME" | ||||
|         [ -f openwrt/tmp/image-file ] && aws s3 cp --acl public-read --content-type "application/json" "latest-upgrade.json" "s3://$AWS_S3_BUCKET_NAME/$JSON_NAME" | ||||
|  | ||||
|   trigger-testing: | ||||
|     runs-on: ubuntu-latest | ||||
|     needs: build | ||||
|     if: startsWith(github.ref, 'refs/tags/v') | ||||
|     steps: | ||||
|     - name: Trigger testing of release | ||||
|       uses: peter-evans/repository-dispatch@v1 | ||||
|       with: | ||||
|         token: ${{ secrets.WLAN_TESTING_PAT }} | ||||
|         repository: Telecominfraproject/wlan-testing | ||||
|         event-type: new-ap-release | ||||
|         client-payload: '{"ref": "${GITHUB_REF#refs/tags/}", "sha": "${{ github.sha }}"}' | ||||
|   | ||||
| @@ -1,7 +1,7 @@ | ||||
| From 0b769e318e332d3bf8c7ab68b492cdc90dcb8e18 Mon Sep 17 00:00:00 2001 | ||||
| From b3305eb14bf4daabee1e49eafcb04a856744db99 Mon Sep 17 00:00:00 2001 | ||||
| From: John Crispin <john@phrozen.org> | ||||
| Date: Sat, 4 Sep 2021 05:42:30 +0200 | ||||
| Subject: [PATCH 08/27] realtek: update to latest owrt HEAD | ||||
| Subject: [PATCH 01/66] realtek: update to latest owrt HEAD | ||||
|  | ||||
| Signed-off-by: John Crispin <john@phrozen.org> | ||||
| --- | ||||
| @@ -9,7 +9,7 @@ Signed-off-by: John Crispin <john@phrozen.org> | ||||
|  .../realtek/base-files/etc/board.d/02_network |   12 +- | ||||
|  .../lib/preinit/05_set_preinit_iface_realtek  |   13 - | ||||
|  .../lib/preinit/98_remove_preinit_realtek     |    6 - | ||||
|  target/linux/realtek/config-5.4               |   30 +- | ||||
|  target/linux/realtek/config-5.4               |   31 +- | ||||
|  .../realtek/dts/rtl8380_netgear_gigabit.dtsi  |   11 +- | ||||
|  .../realtek/dts/rtl8380_zyxel_gs1900-10hp.dts |    4 +- | ||||
|  .../realtek/dts/rtl8380_zyxel_gs1900-8.dts    |   12 - | ||||
| @@ -51,7 +51,7 @@ Signed-off-by: John Crispin <john@phrozen.org> | ||||
|  .../realtek/patches-5.4/710-adt7470.patch     |   20 + | ||||
|  .../realtek/patches-5.4/711-ec4100.patch      |  150 + | ||||
|  .../linux/realtek/patches-5.4/712-fixes.patch |   23 + | ||||
|  46 files changed, 16262 insertions(+), 1623 deletions(-) | ||||
|  46 files changed, 16263 insertions(+), 1623 deletions(-) | ||||
|  delete mode 100644 target/linux/realtek/base-files/lib/preinit/05_set_preinit_iface_realtek | ||||
|  delete mode 100644 target/linux/realtek/base-files/lib/preinit/98_remove_preinit_realtek | ||||
|  delete mode 100644 target/linux/realtek/dts/rtl8380_zyxel_gs1900-8.dts | ||||
| @@ -159,7 +159,7 @@ index dc5fdb059b..0000000000 | ||||
| - | ||||
| -boot_hook_add preinit_main remove_switch | ||||
| diff --git a/target/linux/realtek/config-5.4 b/target/linux/realtek/config-5.4 | ||||
| index 51025d5d89..ced5d5f7ae 100644 | ||||
| index 51025d5d89..cba448acb6 100644 | ||||
| --- a/target/linux/realtek/config-5.4 | ||||
| +++ b/target/linux/realtek/config-5.4 | ||||
| @@ -2,17 +2,18 @@ CONFIG_ARCH_32BIT_OFF_T=y | ||||
| @@ -184,7 +184,7 @@ index 51025d5d89..ced5d5f7ae 100644 | ||||
|  CONFIG_CONSOLE_LOGLEVEL_DEFAULT=15 | ||||
|  CONFIG_CPU_BIG_ENDIAN=y | ||||
|  CONFIG_CPU_GENERIC_DUMP_TLB=y | ||||
| @@ -40,14 +41,10 @@ CONFIG_DMA_NONCOHERENT_CACHE_SYNC=y | ||||
| @@ -40,14 +41,11 @@ CONFIG_DMA_NONCOHERENT_CACHE_SYNC=y | ||||
|  CONFIG_DTC=y | ||||
|  CONFIG_EARLY_PRINTK=y | ||||
|  CONFIG_EARLY_PRINTK_8250=y | ||||
| @@ -196,10 +196,11 @@ index 51025d5d89..ced5d5f7ae 100644 | ||||
| -CONFIG_FONT_8x16=y | ||||
| -CONFIG_FONT_AUTOSELECT=y | ||||
| -CONFIG_FONT_SUPPORT=y | ||||
| +CONFIG_FORCE_MAX_ZONEORDER=13 | ||||
|  CONFIG_FW_LOADER_PAGED_BUF=y | ||||
|  CONFIG_GENERIC_ATOMIC64=y | ||||
|  CONFIG_GENERIC_CLOCKEVENTS=y | ||||
| @@ -74,7 +71,9 @@ CONFIG_GENERIC_TIME_VSYSCALL=y | ||||
| @@ -74,7 +72,9 @@ CONFIG_GENERIC_TIME_VSYSCALL=y | ||||
|  CONFIG_GPIOLIB=y | ||||
|  CONFIG_GPIO_RTL8231=y | ||||
|  CONFIG_GPIO_RTL838X=y | ||||
| @@ -210,7 +211,7 @@ index 51025d5d89..ced5d5f7ae 100644 | ||||
|  CONFIG_GRO_CELLS=y | ||||
|  CONFIG_HANDLE_DOMAIN_IRQ=y | ||||
|  CONFIG_HARDWARE_WATCHPOINTS=y | ||||
| @@ -89,6 +88,7 @@ CONFIG_HZ_PERIODIC=y | ||||
| @@ -89,6 +89,7 @@ CONFIG_HZ_PERIODIC=y | ||||
|  CONFIG_I2C=y | ||||
|  CONFIG_I2C_ALGOBIT=y | ||||
|  CONFIG_I2C_BOARDINFO=y | ||||
| @@ -218,7 +219,7 @@ index 51025d5d89..ced5d5f7ae 100644 | ||||
|  CONFIG_I2C_GPIO=y | ||||
|  CONFIG_INITRAMFS_SOURCE="" | ||||
|  CONFIG_IRQCHIP=y | ||||
| @@ -107,6 +107,8 @@ CONFIG_MDIO_BUS=y | ||||
| @@ -107,6 +108,8 @@ CONFIG_MDIO_BUS=y | ||||
|  CONFIG_MDIO_DEVICE=y | ||||
|  CONFIG_MDIO_I2C=y | ||||
|  CONFIG_MEMFD_CREATE=y | ||||
| @@ -227,7 +228,7 @@ index 51025d5d89..ced5d5f7ae 100644 | ||||
|  CONFIG_MFD_SYSCON=y | ||||
|  CONFIG_MIGRATION=y | ||||
|  CONFIG_MIPS=y | ||||
| @@ -138,7 +140,7 @@ CONFIG_NEED_PER_CPU_KM=y | ||||
| @@ -138,7 +141,7 @@ CONFIG_NEED_PER_CPU_KM=y | ||||
|  CONFIG_NET_DEVLINK=y | ||||
|  CONFIG_NET_DSA=y | ||||
|  CONFIG_NET_DSA_RTL83XX=y | ||||
| @@ -236,7 +237,7 @@ index 51025d5d89..ced5d5f7ae 100644 | ||||
|  CONFIG_NET_RTL838X=y | ||||
|  CONFIG_NET_SWITCHDEV=y | ||||
|  CONFIG_NO_GENERIC_PCI_IOPORT_MAP=y | ||||
| @@ -161,12 +163,17 @@ CONFIG_PINCTRL=y | ||||
| @@ -161,12 +164,17 @@ CONFIG_PINCTRL=y | ||||
|  CONFIG_POWER_RESET=y | ||||
|  CONFIG_POWER_RESET_SYSCON=y | ||||
|  CONFIG_PSB6970_PHY=y | ||||
| @@ -254,7 +255,7 @@ index 51025d5d89..ced5d5f7ae 100644 | ||||
|  CONFIG_SERIAL_MCTRL_GPIO=y | ||||
|  CONFIG_SERIAL_OF_PLATFORM=y | ||||
|  CONFIG_SFP=y | ||||
| @@ -175,7 +182,7 @@ CONFIG_SPI_MASTER=y | ||||
| @@ -175,7 +183,7 @@ CONFIG_SPI_MASTER=y | ||||
|  CONFIG_SPI_MEM=y | ||||
|  CONFIG_SPI_RTL838X=y | ||||
|  CONFIG_SRCU=y | ||||
| @@ -263,7 +264,7 @@ index 51025d5d89..ced5d5f7ae 100644 | ||||
|  CONFIG_SWPHY=y | ||||
|  CONFIG_SYSCTL_EXCEPTION_TRACE=y | ||||
|  CONFIG_SYS_HAS_CPU_MIPS32_R1=y | ||||
| @@ -187,8 +194,11 @@ CONFIG_SYS_SUPPORTS_BIG_ENDIAN=y | ||||
| @@ -187,8 +195,11 @@ CONFIG_SYS_SUPPORTS_BIG_ENDIAN=y | ||||
|  CONFIG_SYS_SUPPORTS_MIPS16=y | ||||
|  CONFIG_TARGET_ISA_REV=2 | ||||
|  CONFIG_TICK_CPU_ACCOUNTING=y | ||||
|   | ||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @@ -1,7 +1,7 @@ | ||||
| From 3bc625814c04a24cdf16587c2adb2060a77a5e1a Mon Sep 17 00:00:00 2001 | ||||
| From 39af14f6e40bcb97772dcc0c03849fbf6aa0032b Mon Sep 17 00:00:00 2001 | ||||
| From: John Crispin <john@phrozen.org> | ||||
| Date: Thu, 27 May 2021 13:24:47 +0200 | ||||
| Subject: [PATCH 17/27] netifd: update to latest HEAD | ||||
| Subject: [PATCH 01/58] netifd: update to latest HEAD | ||||
|  | ||||
| Signed-off-by: John Crispin <john@phrozen.org> | ||||
| --- | ||||
| @@ -11,7 +11,7 @@ Signed-off-by: John Crispin <john@phrozen.org> | ||||
|  create mode 100644 package/network/config/netifd/patches/002-fix-dhcp-issue.patch | ||||
|  | ||||
| diff --git a/package/network/config/netifd/Makefile b/package/network/config/netifd/Makefile | ||||
| index 4b5f110da2..13c1d96ed7 100644 | ||||
| index 4b5f110da2..d0ddec8f61 100644 | ||||
| --- a/package/network/config/netifd/Makefile | ||||
| +++ b/package/network/config/netifd/Makefile | ||||
| @@ -5,16 +5,14 @@ PKG_RELEASE:=1 | ||||
| @@ -22,8 +22,8 @@ index 4b5f110da2..13c1d96ed7 100644 | ||||
| -PKG_SOURCE_VERSION:=440eb0647708274cc8d7d9e7c2bb0cfdfba90023 | ||||
| -PKG_MIRROR_HASH:=eed957036ab608fdc49bdf801fc5b4405fcd2a3a5e5d3343ec39898e156c10e9 | ||||
| +PKG_SOURCE_DATE:=2021-09-01 | ||||
| +PKG_SOURCE_VERSION:=300b1220fab38600f102bb8cfcc59a29ce41b095 | ||||
| +PKG_MIRROR_HASH:=310fa90059795b1c956f9822db712ecc58bc19725b0f05f98c9e0a6824c8ca36 | ||||
| +PKG_SOURCE_VERSION:=e467e0ff44c00cdd722e7149baaa8706d44e657e | ||||
| +PKG_MIRROR_HASH:=cde5c1c1609c29f24171dcd97d2264e28a6dfb724e25f4bd3c2be351b6dd4f10 | ||||
|  PKG_MAINTAINER:=Felix Fietkau <nbd@nbd.name> | ||||
|   | ||||
|  PKG_LICENSE:=GPL-2.0 | ||||
|   | ||||
| @@ -1,16 +1,17 @@ | ||||
| From 379e136c94ecb35b984e3ac7cc7ef493b60cb1b6 Mon Sep 17 00:00:00 2001 | ||||
| From 6718e9786f18dd1380e5977d224d13a5ff3df619 Mon Sep 17 00:00:00 2001 | ||||
| From: John Crispin <john@phrozen.org> | ||||
| Date: Sat, 4 Sep 2021 05:47:27 +0200 | ||||
| Subject: [PATCH 18/27] mac80211: update to latest HEAD | ||||
| Subject: [PATCH 02/58] mac80211: update to latest HEAD | ||||
|  | ||||
| Signed-off-by: John Crispin <john@phrozen.org> | ||||
| --- | ||||
|  package/kernel/mac80211/Makefile              |   15 +- | ||||
|  package/kernel/mac80211/ath.mk                |   14 +- | ||||
|  package/kernel/mac80211/ath.mk                |    5 +- | ||||
|  package/kernel/mac80211/broadcom.mk           |    4 +- | ||||
|  .../mac80211/files/lib/netifd/mac80211.sh     |   36 - | ||||
|  .../files/lib/netifd/wireless/mac80211.sh     |  184 ++- | ||||
|  .../files/lib/netifd/wireless/mac80211.sh     |  186 ++- | ||||
|  .../mac80211/files/lib/wifi/mac80211.sh       |  110 +- | ||||
|  .../patches/ath/120-owl-loader-compat.patch   |   53 - | ||||
|  .../patches/ath/402-ath_regd_optional.patch   |    2 +- | ||||
|  .../080-ath10k_thermal_config.patch           |    2 +- | ||||
|  ...21-ath10k_init_devices_synchronously.patch |    0 | ||||
| @@ -20,6 +21,7 @@ Signed-off-by: John Crispin <john@phrozen.org> | ||||
|  ...75-ath10k-use-tpt-trigger-by-default.patch |    0 | ||||
|  ...980-ath10k-fix-max-antenna-gain-unit.patch |    0 | ||||
|  ...-power-reduction-for-US-regulatory-d.patch |    0 | ||||
|  ...h10k-Try-to-get-mac-address-from-dts.patch |   42 + | ||||
|  .../201-ath5k-WAR-for-AR71xx-PCI-bug.patch    |    0 | ||||
|  .../411-ath5k_allow_adhoc_and_ap.patch        |    0 | ||||
|  .../420-ath5k_disable_fast_cc.patch           |    0 | ||||
| @@ -55,6 +57,7 @@ Signed-off-by: John Crispin <john@phrozen.org> | ||||
|  .../552-ath9k-ahb_of.patch}                   |    0 | ||||
|  .../553-ath9k_of_gpio_mask.patch              |    0 | ||||
|  .../602-rt2x00-introduce-rt2x00eeprom.patch   |    2 +- | ||||
|  ...07-rt2x00-add_platform_data_mac_addr.patch |   11 +- | ||||
|  .../100-remove-cryptoapi-dependencies.patch   |  699 --------- | ||||
|  .../patches/subsys/130-disable-fils.patch     |   32 - | ||||
|  ...aes-cmac-switch-to-shash-CMAC-driver.patch |  230 --- | ||||
| @@ -62,15 +65,19 @@ Signed-off-by: John Crispin <john@phrozen.org> | ||||
|  ...320-mac80211_hwsim-add-6GHz-channels.patch |  123 ++ | ||||
|  ...211_hwsim-make-6-GHz-channels-usable.patch |   74 + | ||||
|  ...-remove-legacy-minstrel-rate-control.patch |    2 +- | ||||
|  ...te-control-support-for-encap-offload.patch |   43 +- | ||||
|  ...introduce-aql_enable-node-in-debugfs.patch |  111 ++ | ||||
|  ...ange-struct-txq_info-for-fewer-holes.patch |   39 + | ||||
|  ...to-a-virtual-time-based-airtime-sche.patch | 1277 +++++++++++++++++ | ||||
|  ...bling-4-address-mode-on-a-sta-vif-af.patch |   72 + | ||||
|  ...on-API-to-configure-SAR-power-limita.patch |  398 +++++ | ||||
|  ...mac80211-add-ieee80211_set_sar_specs.patch |   51 + | ||||
|  ...eck-per-vif-offload_flags-in-Tx-path.patch |   26 + | ||||
|  .../500-mac80211_configure_antenna_gain.patch |   16 +- | ||||
|  64 files changed, 2420 insertions(+), 1087 deletions(-) | ||||
|  ...the-dst-buffer-to-of_get_mac_address.patch |  237 +++ | ||||
|  70 files changed, 2752 insertions(+), 1160 deletions(-) | ||||
|  delete mode 100644 package/kernel/mac80211/files/lib/netifd/mac80211.sh | ||||
|  delete mode 100644 package/kernel/mac80211/patches/ath/120-owl-loader-compat.patch | ||||
|  rename package/kernel/mac80211/patches/{ath => ath10k}/080-ath10k_thermal_config.patch (97%) | ||||
|  rename package/kernel/mac80211/patches/{ath => ath10k}/921-ath10k_init_devices_synchronously.patch (100%) | ||||
|  rename package/kernel/mac80211/patches/{ath => ath10k}/922-ath10k-increase-rx-buffer-size-to-2048.patch (100%) | ||||
| @@ -79,6 +86,7 @@ Signed-off-by: John Crispin <john@phrozen.org> | ||||
|  rename package/kernel/mac80211/patches/{ath => ath10k}/975-ath10k-use-tpt-trigger-by-default.patch (100%) | ||||
|  rename package/kernel/mac80211/patches/{ath => ath10k}/980-ath10k-fix-max-antenna-gain-unit.patch (100%) | ||||
|  rename package/kernel/mac80211/patches/{ath => ath10k}/981-ath10k-adjust-tx-power-reduction-for-US-regulatory-d.patch (100%) | ||||
|  create mode 100644 package/kernel/mac80211/patches/ath10k/984-ath10k-Try-to-get-mac-address-from-dts.patch | ||||
|  rename package/kernel/mac80211/patches/{ath => ath5k}/201-ath5k-WAR-for-AR71xx-PCI-bug.patch (100%) | ||||
|  rename package/kernel/mac80211/patches/{ath => ath5k}/411-ath5k_allow_adhoc_and_ap.patch (100%) | ||||
|  rename package/kernel/mac80211/patches/{ath => ath5k}/420-ath5k_disable_fast_cc.patch (100%) | ||||
| @@ -125,6 +133,8 @@ Signed-off-by: John Crispin <john@phrozen.org> | ||||
|  create mode 100644 package/kernel/mac80211/patches/subsys/383-mac80211-fix-enabling-4-address-mode-on-a-sta-vif-af.patch | ||||
|  create mode 100644 package/kernel/mac80211/patches/subsys/384-nl80211-add-common-API-to-configure-SAR-power-limita.patch | ||||
|  create mode 100644 package/kernel/mac80211/patches/subsys/385-mac80211-add-ieee80211_set_sar_specs.patch | ||||
|  create mode 100644 package/kernel/mac80211/patches/subsys/386-mac80211-check-per-vif-offload_flags-in-Tx-path.patch | ||||
|  create mode 100644 package/kernel/mac80211/patches/subsys/782-net-next-1-of-net-pass-the-dst-buffer-to-of_get_mac_address.patch | ||||
|  | ||||
| diff --git a/package/kernel/mac80211/Makefile b/package/kernel/mac80211/Makefile | ||||
| index dd9ec172ca..dd39c2d069 100644 | ||||
| @@ -187,7 +197,7 @@ index dd9ec172ca..dd39c2d069 100644 | ||||
|  	$(INSTALL_DIR) $(1)/etc/hotplug.d/ieee80211 | ||||
|  	$(INSTALL_DATA) ./files/mac80211.hotplug $(1)/etc/hotplug.d/ieee80211/10-wifi-detect | ||||
| diff --git a/package/kernel/mac80211/ath.mk b/package/kernel/mac80211/ath.mk | ||||
| index f209c95ba8..ad2860a98e 100644 | ||||
| index 24abb910ff..ad2860a98e 100644 | ||||
| --- a/package/kernel/mac80211/ath.mk | ||||
| +++ b/package/kernel/mac80211/ath.mk | ||||
| @@ -34,7 +34,7 @@ ifdef CONFIG_PACKAGE_MAC80211_TRACING | ||||
| @@ -199,11 +209,9 @@ index f209c95ba8..ad2860a98e 100644 | ||||
|  config-$(CONFIG_PACKAGE_ATH_DEBUG) += ATH_DEBUG ATH10K_DEBUG ATH9K_STATION_STATISTICS | ||||
|  config-$(CONFIG_PACKAGE_ATH_DFS) += ATH9K_DFS_CERTIFIED ATH10K_DFS_CERTIFIED | ||||
|  config-$(CONFIG_PACKAGE_ATH_SPECTRAL) += ATH9K_COMMON_SPECTRAL ATH10K_SPECTRAL | ||||
| @@ -42,11 +42,11 @@ config-$(CONFIG_PACKAGE_ATH_DYNACK) += ATH9K_DYNACK | ||||
|  config-$(call config_package,ath9k) += ATH9K | ||||
| @@ -43,9 +43,10 @@ config-$(call config_package,ath9k) += ATH9K | ||||
|  config-$(call config_package,ath9k-common) += ATH9K_COMMON | ||||
|  config-$(call config_package,owl-loader) += ATH9K_PCI_NO_EEPROM | ||||
| -config-$(CONFIG_TARGET_ar71xx) += ATH9K_AHB | ||||
|  config-$(CONFIG_TARGET_ath79) += ATH9K_AHB | ||||
| +config-$(CONFIG_TARGET_ar71xx) += ATH9K_AHB | ||||
|  config-$(CONFIG_TARGET_ipq40xx) += ATH10K_AHB | ||||
| @@ -213,42 +221,6 @@ index f209c95ba8..ad2860a98e 100644 | ||||
|  config-$(CONFIG_ATH9K_HWRNG) += ATH9K_HWRNG | ||||
|  config-$(CONFIG_ATH9K_SUPPORT_PCOEM) += ATH9K_PCOEM | ||||
|  config-$(CONFIG_ATH9K_TX99) += ATH9K_TX99 | ||||
| @@ -126,7 +126,7 @@ endef | ||||
|  define KernelPackage/ath | ||||
|    $(call KernelPackage/mac80211/Default) | ||||
|    TITLE:=Atheros common driver part | ||||
| -  DEPENDS+= @PCI_SUPPORT||USB_SUPPORT||TARGET_ar71xx||TARGET_ath79||TARGET_ath25 +kmod-mac80211 | ||||
| +  DEPENDS+= @PCI_SUPPORT||USB_SUPPORT||TARGET_ath79||TARGET_ath25 +kmod-mac80211 | ||||
|    FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/ath/ath.ko | ||||
|    MENU:=1 | ||||
|  endef | ||||
| @@ -191,7 +191,7 @@ define KernelPackage/ath9k-common | ||||
|    TITLE:=Atheros 802.11n wireless devices (common code for ath9k and ath9k_htc) | ||||
|    URL:=https://wireless.wiki.kernel.org/en/users/drivers/ath9k | ||||
|    HIDDEN:=1 | ||||
| -  DEPENDS+= @PCI_SUPPORT||USB_SUPPORT||TARGET_ar71xx||TARGET_ath79 +kmod-ath +@DRIVER_11N_SUPPORT | ||||
| +  DEPENDS+= @PCI_SUPPORT||USB_SUPPORT||TARGET_ath79 +kmod-ath +@DRIVER_11N_SUPPORT | ||||
|    FILES:= \ | ||||
|  	$(PKG_BUILD_DIR)/drivers/net/wireless/ath/ath9k/ath9k_common.ko \ | ||||
|  	$(PKG_BUILD_DIR)/drivers/net/wireless/ath/ath9k/ath9k_hw.ko | ||||
| @@ -201,7 +201,7 @@ define KernelPackage/ath9k | ||||
|    $(call KernelPackage/mac80211/Default) | ||||
|    TITLE:=Atheros 802.11n PCI wireless cards support | ||||
|    URL:=https://wireless.wiki.kernel.org/en/users/drivers/ath9k | ||||
| -  DEPENDS+= @PCI_SUPPORT||TARGET_ar71xx||TARGET_ath79 +kmod-ath9k-common | ||||
| +  DEPENDS+= @PCI_SUPPORT||TARGET_ath79 +kmod-ath9k-common | ||||
|    FILES:= \ | ||||
|  	$(PKG_BUILD_DIR)/drivers/net/wireless/ath/ath9k/ath9k.ko | ||||
|    AUTOLOAD:=$(call AutoProbe,ath9k) | ||||
| @@ -231,7 +231,7 @@ define KernelPackage/ath9k/config | ||||
|   | ||||
|  	config ATH9K_UBNTHSR | ||||
|  		bool "Support for Ubiquiti UniFi Outdoor+ access point" | ||||
| -		depends on PACKAGE_kmod-ath9k && (TARGET_ar71xx_generic||TARGET_ath79) | ||||
| +		depends on PACKAGE_kmod-ath9k && TARGET_ath79 | ||||
|  		default y | ||||
|   | ||||
|  endef | ||||
| diff --git a/package/kernel/mac80211/broadcom.mk b/package/kernel/mac80211/broadcom.mk | ||||
| index fb576c5809..473bbf597c 100644 | ||||
| --- a/package/kernel/mac80211/broadcom.mk | ||||
| @@ -314,7 +286,7 @@ index 92e5c0e395..0000000000 | ||||
| -	done | ||||
| -} | ||||
| diff --git a/package/kernel/mac80211/files/lib/netifd/wireless/mac80211.sh b/package/kernel/mac80211/files/lib/netifd/wireless/mac80211.sh | ||||
| index 9a9c35fb5f..a58af1fef0 100644 | ||||
| index 9a9c35fb5f..a25e4ff9b2 100644 | ||||
| --- a/package/kernel/mac80211/files/lib/netifd/wireless/mac80211.sh | ||||
| +++ b/package/kernel/mac80211/files/lib/netifd/wireless/mac80211.sh | ||||
| @@ -1,7 +1,6 @@ | ||||
| @@ -563,6 +535,15 @@ index 9a9c35fb5f..a58af1fef0 100644 | ||||
|  		[ -n "$phy" ] && return 0 | ||||
|  	} | ||||
|  	[ -n "$macaddr" ] && { | ||||
| @@ -528,7 +630,7 @@ mac80211_iw_interface_add() { | ||||
|  		rc="$?" | ||||
|  	} | ||||
|   | ||||
| -	[ "$rc" != 0 ] && wireless_setup_failed INTERFACE_CREATION_FAILED | ||||
| +	[ "$rc" != 0 ] && echo "Failed to create interface $ifname" | ||||
|  	return $rc | ||||
|  } | ||||
|   | ||||
| @@ -689,14 +791,8 @@ mac80211_prepare_iw_htmode() { | ||||
|  	case "$htmode" in | ||||
|  		VHT20|HT20) iw_htmode=HT20;; | ||||
| @@ -821,6 +802,65 @@ index 3e99f06693..6aa46b0c74 100644 | ||||
|  			set wireless.radio${devidx}.disabled=1 | ||||
|   | ||||
|  			set wireless.default_radio${devidx}=wifi-iface | ||||
| diff --git a/package/kernel/mac80211/patches/ath/120-owl-loader-compat.patch b/package/kernel/mac80211/patches/ath/120-owl-loader-compat.patch | ||||
| deleted file mode 100644 | ||||
| index d1d6c9e2e3..0000000000 | ||||
| --- a/package/kernel/mac80211/patches/ath/120-owl-loader-compat.patch | ||||
| +++ /dev/null | ||||
| @@ -1,53 +0,0 @@ | ||||
| -From: Christian Lamparter <chunkeey@gmail.com> | ||||
| -Date: Sat, 16 Nov 2019 19:25:24 +0100 | ||||
| -Subject: [PATCH] owl_loader: compatibility patch | ||||
| - | ||||
| -This patch includes OpenWrt specific changes that are | ||||
| -not included in the upstream owl-loader. | ||||
| - | ||||
| -This includes a platform data handling changes for ar71xx. | ||||
| - | ||||
| -Signed-off-by: Christian Lamparter <chunkeey@gmail.com> | ||||
| - | ||||
| ---- a/drivers/net/wireless/ath/ath9k/ath9k_pci_owl_loader.c | ||||
| -+++ b/drivers/net/wireless/ath/ath9k/ath9k_pci_owl_loader.c | ||||
| -@@ -103,6 +103,7 @@ static void owl_fw_cb(const struct firmw | ||||
| - { | ||||
| - 	struct pci_dev *pdev = (struct pci_dev *)context; | ||||
| - 	struct owl_ctx *ctx = (struct owl_ctx *)pci_get_drvdata(pdev); | ||||
| -+	struct ath9k_platform_data *pdata = dev_get_platdata(&pdev->dev); | ||||
| - 	struct pci_bus *bus; | ||||
| -  | ||||
| - 	complete(&ctx->eeprom_load); | ||||
| -@@ -118,6 +119,16 @@ static void owl_fw_cb(const struct firmw | ||||
| - 		goto release; | ||||
| - 	} | ||||
| -  | ||||
| -+	if (pdata) { | ||||
| -+		memcpy(pdata->eeprom_data, fw->data, fw->size); | ||||
| -+ | ||||
| -+		/* | ||||
| -+		 * eeprom has been successfully loaded - pass the data to ath9k | ||||
| -+		 * but remove the eeprom_name, so it doesn't try to load it too. | ||||
| -+		 */ | ||||
| -+		pdata->eeprom_name = NULL; | ||||
| -+	} | ||||
| -+ | ||||
| - 	if (ath9k_pci_fixup(pdev, (const u16 *)fw->data, fw->size)) | ||||
| - 		goto release; | ||||
| -  | ||||
| -@@ -137,8 +148,14 @@ release: | ||||
| - static const char *owl_get_eeprom_name(struct pci_dev *pdev) | ||||
| - { | ||||
| - 	struct device *dev = &pdev->dev; | ||||
| -+	struct ath9k_platform_data *pdata; | ||||
| - 	char *eeprom_name; | ||||
| -  | ||||
| -+	/* try the existing platform data first */ | ||||
| -+	pdata = dev_get_platdata(dev); | ||||
| -+	if (pdata && pdata->eeprom_name) | ||||
| -+		return pdata->eeprom_name; | ||||
| -+ | ||||
| - 	dev_dbg(dev, "using auto-generated eeprom filename\n"); | ||||
| -  | ||||
| - 	eeprom_name = devm_kzalloc(dev, EEPROM_FILENAME_LEN, GFP_KERNEL); | ||||
| diff --git a/package/kernel/mac80211/patches/ath/402-ath_regd_optional.patch b/package/kernel/mac80211/patches/ath/402-ath_regd_optional.patch | ||||
| index bf87d3551a..3c9180b113 100644 | ||||
| --- a/package/kernel/mac80211/patches/ath/402-ath_regd_optional.patch | ||||
| @@ -890,6 +930,54 @@ diff --git a/package/kernel/mac80211/patches/ath/981-ath10k-adjust-tx-power-redu | ||||
| similarity index 100% | ||||
| rename from package/kernel/mac80211/patches/ath/981-ath10k-adjust-tx-power-reduction-for-US-regulatory-d.patch | ||||
| rename to package/kernel/mac80211/patches/ath10k/981-ath10k-adjust-tx-power-reduction-for-US-regulatory-d.patch | ||||
| diff --git a/package/kernel/mac80211/patches/ath10k/984-ath10k-Try-to-get-mac-address-from-dts.patch b/package/kernel/mac80211/patches/ath10k/984-ath10k-Try-to-get-mac-address-from-dts.patch | ||||
| new file mode 100644 | ||||
| index 0000000000..5f427f6b8f | ||||
| --- /dev/null | ||||
| +++ b/package/kernel/mac80211/patches/ath10k/984-ath10k-Try-to-get-mac-address-from-dts.patch | ||||
| @@ -0,0 +1,42 @@ | ||||
| +From 22fb5991a44c78ff18ec0082dc90c809356eb893 Mon Sep 17 00:00:00 2001 | ||||
| +From: Ansuel Smith <ansuelsmth@gmail.com> | ||||
| +Date: Sun, 27 Sep 2020 19:23:35 +0200 | ||||
| +Subject: [PATCH 1/2] ath10k: Try to get mac-address from dts | ||||
| + | ||||
| +Most of embedded device that have the ath10k wifi integrated store the | ||||
| +mac-address in nvmem partitions. Try to fetch the mac-address using the | ||||
| +standard 'of_get_mac_address' than in all the check also try to fetch the | ||||
| +address using the nvmem api searching for a defined 'mac-address' cell. | ||||
| +Mac-address defined in the dts have priority than any other address found. | ||||
| + | ||||
| +Tested-on: QCA9984 hw1.0 PCI 10.4 | ||||
| + | ||||
| +Signed-off-by: Ansuel Smith <ansuelsmth@gmail.com> | ||||
| +--- | ||||
| + drivers/net/wireless/ath/ath10k/core.c | 10 ++++++++++ | ||||
| + 1 file changed, 10 insertions(+) | ||||
| + | ||||
| +diff --git a/drivers/net/wireless/ath/ath10k/core.c b/drivers/net/wireless/ath/ath10k/core.c | ||||
| +index 5f4e12196..9ed7b9883 100644 | ||||
| +--- a/drivers/net/wireless/ath/ath10k/core.c | ||||
| ++++ b/drivers/net/wireless/ath/ath10k/core.c | ||||
| +@@ -8,6 +8,7 @@ | ||||
| + #include <linux/module.h> | ||||
| + #include <linux/firmware.h> | ||||
| + #include <linux/of.h> | ||||
| ++#include <linux/of_net.h> | ||||
| + #include <linux/property.h> | ||||
| + #include <linux/dmi.h> | ||||
| + #include <linux/ctype.h> | ||||
| +@@ -3062,6 +3068,8 @@ static int ath10k_core_probe_fw(struct ath10k *ar) | ||||
| +  | ||||
| + 	device_get_mac_address(ar->dev, ar->mac_addr, sizeof(ar->mac_addr)); | ||||
| +  | ||||
| ++	of_get_mac_address(ar->dev->of_node, ar->mac_addr); | ||||
| ++ | ||||
| + 	ret = ath10k_core_init_firmware_features(ar); | ||||
| + 	if (ret) { | ||||
| + 		ath10k_err(ar, "fatal problem with firmware features: %d\n", | ||||
| +--  | ||||
| +2.27.0 | ||||
| + | ||||
| diff --git a/package/kernel/mac80211/patches/ath/201-ath5k-WAR-for-AR71xx-PCI-bug.patch b/package/kernel/mac80211/patches/ath5k/201-ath5k-WAR-for-AR71xx-PCI-bug.patch | ||||
| similarity index 100% | ||||
| rename from package/kernel/mac80211/patches/ath/201-ath5k-WAR-for-AR71xx-PCI-bug.patch | ||||
| @@ -1050,6 +1138,35 @@ index e74d9a9aa0..1c52132da6 100644 | ||||
|   RT2X00_LIB_CRYPTO= | ||||
|   RT2X00_LIB_LEDS= | ||||
|   RT2X00_LIB_DEBUGFS= | ||||
| diff --git a/package/kernel/mac80211/patches/rt2x00/607-rt2x00-add_platform_data_mac_addr.patch b/package/kernel/mac80211/patches/rt2x00/607-rt2x00-add_platform_data_mac_addr.patch | ||||
| index b5b2c61037..79f99ffdf4 100644 | ||||
| --- a/package/kernel/mac80211/patches/rt2x00/607-rt2x00-add_platform_data_mac_addr.patch | ||||
| +++ b/package/kernel/mac80211/patches/rt2x00/607-rt2x00-add_platform_data_mac_addr.patch | ||||
| @@ -1,19 +1,18 @@ | ||||
|  --- a/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c | ||||
|  +++ b/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c | ||||
| -@@ -990,8 +990,13 @@ static void rt2x00lib_rate(struct ieee80 | ||||
| +@@ -990,6 +990,12 @@ static void rt2x00lib_rate(struct ieee80 | ||||
|    | ||||
|   void rt2x00lib_set_mac_address(struct rt2x00_dev *rt2x00dev, u8 *eeprom_mac_addr) | ||||
|   { | ||||
|  +	struct rt2x00_platform_data *pdata; | ||||
| - 	const char *mac_addr; | ||||
| -  | ||||
| ++ | ||||
|  +	pdata = rt2x00dev->dev->platform_data; | ||||
|  +	if (pdata && pdata->mac_address) | ||||
|  +		ether_addr_copy(eeprom_mac_addr, pdata->mac_address); | ||||
|  + | ||||
| - 	mac_addr = of_get_mac_address(rt2x00dev->dev->of_node); | ||||
| - 	if (!IS_ERR(mac_addr)) | ||||
| - 		ether_addr_copy(eeprom_mac_addr, mac_addr); | ||||
| + 	of_get_mac_address(rt2x00dev->dev->of_node, eeprom_mac_addr); | ||||
| +  | ||||
| + 	if (!is_valid_ether_addr(eeprom_mac_addr)) { | ||||
|  --- a/include/linux/rt2x00_platform.h | ||||
|  +++ b/include/linux/rt2x00_platform.h | ||||
|  @@ -14,6 +14,7 @@ | ||||
| diff --git a/package/kernel/mac80211/patches/subsys/100-remove-cryptoapi-dependencies.patch b/package/kernel/mac80211/patches/subsys/100-remove-cryptoapi-dependencies.patch | ||||
| deleted file mode 100644 | ||||
| index ca02dfb06f..0000000000 | ||||
| @@ -2267,6 +2384,64 @@ index 96ee595ac1..1cab2eb194 100644 | ||||
|   CFLAGS_trace.o := -I$(src) | ||||
|    | ||||
|   rc80211_minstrel-y := \ | ||||
| diff --git a/package/kernel/mac80211/patches/subsys/376-mac80211-add-rate-control-support-for-encap-offload.patch b/package/kernel/mac80211/patches/subsys/376-mac80211-add-rate-control-support-for-encap-offload.patch | ||||
| index 43a4a1334d..f22b0d9849 100644 | ||||
| --- a/package/kernel/mac80211/patches/subsys/376-mac80211-add-rate-control-support-for-encap-offload.patch | ||||
| +++ b/package/kernel/mac80211/patches/subsys/376-mac80211-add-rate-control-support-for-encap-offload.patch | ||||
| @@ -7,24 +7,6 @@ The software rate control cannot deal with encap offload, so fix it. | ||||
|  Signed-off-by: Ryder Lee <ryder.lee@mediatek.com> | ||||
|  --- | ||||
|   | ||||
| ---- a/net/mac80211/ieee80211_i.h | ||||
| -+++ b/net/mac80211/ieee80211_i.h | ||||
| -@@ -2024,6 +2024,15 @@ static inline void ieee80211_tx_skb(stru | ||||
| - 	ieee80211_tx_skb_tid(sdata, skb, 7); | ||||
| - } | ||||
| -  | ||||
| -+static inline bool ieee80211_is_tx_data(struct sk_buff *skb) | ||||
| -+{ | ||||
| -+	struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data; | ||||
| -+	struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); | ||||
| -+ | ||||
| -+	return info->flags & IEEE80211_TX_CTL_HW_80211_ENCAP || | ||||
| -+	       ieee80211_is_data(hdr->frame_control); | ||||
| -+} | ||||
| -+ | ||||
| - u32 ieee802_11_parse_elems_crc(const u8 *start, size_t len, bool action, | ||||
| - 			       struct ieee802_11_elems *elems, | ||||
| - 			       u64 filter, u32 crc, u8 *transmitter_bssid, | ||||
|  --- a/net/mac80211/rate.c | ||||
|  +++ b/net/mac80211/rate.c | ||||
|  @@ -297,15 +297,11 @@ void ieee80211_check_rate_mask(struct ie | ||||
| @@ -117,3 +99,28 @@ Signed-off-by: Ryder Lee <ryder.lee@mediatek.com> | ||||
|    | ||||
|   	if (info->control.flags & IEEE80211_TX_CTRL_FAST_XMIT) { | ||||
|   		struct sta_info *sta = container_of(txq->sta, struct sta_info, | ||||
| +--- a/include/net/mac80211.h | ||||
| ++++ b/include/net/mac80211.h | ||||
| +@@ -6728,4 +6728,22 @@ struct sk_buff *ieee80211_get_fils_disco | ||||
| + struct sk_buff * | ||||
| + ieee80211_get_unsol_bcast_probe_resp_tmpl(struct ieee80211_hw *hw, | ||||
| + 					  struct ieee80211_vif *vif); | ||||
| ++ | ||||
| ++/** | ||||
| ++ * ieee80211_is_tx_data - check if frame is a data frame | ||||
| ++ * | ||||
| ++ * The function is used to check if a frame is a data frame. Frames with | ||||
| ++ * hardware encapsulation enabled are data frames. | ||||
| ++ * | ||||
| ++ * @skb: the frame to be transmitted. | ||||
| ++ */ | ||||
| ++static inline bool ieee80211_is_tx_data(struct sk_buff *skb) | ||||
| ++{ | ||||
| ++	struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); | ||||
| ++	struct ieee80211_hdr *hdr = (void *) skb->data; | ||||
| ++ | ||||
| ++	return info->flags & IEEE80211_TX_CTL_HW_80211_ENCAP || | ||||
| ++	       ieee80211_is_data(hdr->frame_control); | ||||
| ++} | ||||
| ++ | ||||
| + #endif /* MAC80211_H */ | ||||
| diff --git a/package/kernel/mac80211/patches/subsys/380-mac80211-introduce-aql_enable-node-in-debugfs.patch b/package/kernel/mac80211/patches/subsys/380-mac80211-introduce-aql_enable-node-in-debugfs.patch | ||||
| new file mode 100644 | ||||
| index 0000000000..b21b671c10 | ||||
| @@ -3714,7 +3889,7 @@ index 0000000000..ba78f7a142 | ||||
| +  | ||||
| diff --git a/package/kernel/mac80211/patches/subsys/383-mac80211-fix-enabling-4-address-mode-on-a-sta-vif-af.patch b/package/kernel/mac80211/patches/subsys/383-mac80211-fix-enabling-4-address-mode-on-a-sta-vif-af.patch | ||||
| new file mode 100644 | ||||
| index 0000000000..5a82f00c9e | ||||
| index 0000000000..c1f77ff5d9 | ||||
| --- /dev/null | ||||
| +++ b/package/kernel/mac80211/patches/subsys/383-mac80211-fix-enabling-4-address-mode-on-a-sta-vif-af.patch | ||||
| @@ -0,0 +1,72 @@ | ||||
| @@ -3768,7 +3943,7 @@ index 0000000000..5a82f00c9e | ||||
| + 	if (sdata->vif.type == NL80211_IFTYPE_MONITOR) { | ||||
| +--- a/net/mac80211/ieee80211_i.h | ||||
| ++++ b/net/mac80211/ieee80211_i.h | ||||
| +@@ -2224,6 +2224,8 @@ void ieee80211_dynamic_ps_timer(struct t | ||||
| +@@ -2215,6 +2215,8 @@ void ieee80211_dynamic_ps_timer(struct t | ||||
| + void ieee80211_send_nullfunc(struct ieee80211_local *local, | ||||
| + 			     struct ieee80211_sub_if_data *sdata, | ||||
| + 			     bool powersave); | ||||
| @@ -4251,6 +4426,38 @@ index 0000000000..c351bc812a | ||||
| + 	.reset_tid_config = ieee80211_reset_tid_config, | ||||
| ++	.set_sar_specs = ieee80211_set_sar_specs, | ||||
| + }; | ||||
| diff --git a/package/kernel/mac80211/patches/subsys/386-mac80211-check-per-vif-offload_flags-in-Tx-path.patch b/package/kernel/mac80211/patches/subsys/386-mac80211-check-per-vif-offload_flags-in-Tx-path.patch | ||||
| new file mode 100644 | ||||
| index 0000000000..cfad1c3927 | ||||
| --- /dev/null | ||||
| +++ b/package/kernel/mac80211/patches/subsys/386-mac80211-check-per-vif-offload_flags-in-Tx-path.patch | ||||
| @@ -0,0 +1,26 @@ | ||||
| +From: Ryder Lee <ryder.lee@mediatek.com> | ||||
| +Date: Fri, 18 Jun 2021 04:38:59 +0800 | ||||
| +Subject: [PATCH] mac80211: check per vif offload_flags in Tx path | ||||
| + | ||||
| +offload_flags has been introduced to indicate encap status of each interface. | ||||
| +An interface can encap offload at runtime, or if it has some extra limitations | ||||
| +it can simply override the flags, so it's more flexible to check offload_flags | ||||
| +in Tx path. | ||||
| + | ||||
| +Signed-off-by: Ryder Lee <ryder.lee@mediatek.com> | ||||
| +Link: https://lore.kernel.org/r/177785418cf407808bf3a44760302d0647076990.1623961575.git.ryder.lee@mediatek.com | ||||
| +Signed-off-by: Johannes Berg <johannes.berg@intel.com> | ||||
| +--- | ||||
| + | ||||
| +--- a/net/mac80211/tx.c | ||||
| ++++ b/net/mac80211/tx.c | ||||
| +@@ -3309,6 +3309,9 @@ static bool ieee80211_amsdu_aggregate(st | ||||
| + 	if (!ieee80211_hw_check(&local->hw, TX_AMSDU)) | ||||
| + 		return false; | ||||
| +  | ||||
| ++	if (sdata->vif.offload_flags & IEEE80211_OFFLOAD_ENCAP_ENABLED) | ||||
| ++		return false; | ||||
| ++ | ||||
| + 	if (skb_is_gso(skb)) | ||||
| + 		return false; | ||||
| +  | ||||
| diff --git a/package/kernel/mac80211/patches/subsys/500-mac80211_configure_antenna_gain.patch b/package/kernel/mac80211/patches/subsys/500-mac80211_configure_antenna_gain.patch | ||||
| index febe42eb9d..b2ee61a6dc 100644 | ||||
| --- a/package/kernel/mac80211/patches/subsys/500-mac80211_configure_antenna_gain.patch | ||||
| @@ -4318,6 +4525,249 @@ index febe42eb9d..b2ee61a6dc 100644 | ||||
|   		if (result) | ||||
|   			return result; | ||||
|   	} | ||||
| diff --git a/package/kernel/mac80211/patches/subsys/782-net-next-1-of-net-pass-the-dst-buffer-to-of_get_mac_address.patch b/package/kernel/mac80211/patches/subsys/782-net-next-1-of-net-pass-the-dst-buffer-to-of_get_mac_address.patch | ||||
| new file mode 100644 | ||||
| index 0000000000..5d94362155 | ||||
| --- /dev/null | ||||
| +++ b/package/kernel/mac80211/patches/subsys/782-net-next-1-of-net-pass-the-dst-buffer-to-of_get_mac_address.patch | ||||
| @@ -0,0 +1,237 @@ | ||||
| +From 83216e3988cd196183542937c9bd58b279f946af Mon Sep 17 00:00:00 2001 | ||||
| +From: Michael Walle <michael@walle.cc> | ||||
| +Date: Mon, 12 Apr 2021 19:47:17 +0200 | ||||
| +Subject: of: net: pass the dst buffer to of_get_mac_address() | ||||
| + | ||||
| +of_get_mac_address() returns a "const void*" pointer to a MAC address. | ||||
| +Lately, support to fetch the MAC address by an NVMEM provider was added. | ||||
| +But this will only work with platform devices. It will not work with | ||||
| +PCI devices (e.g. of an integrated root complex) and esp. not with DSA | ||||
| +ports. | ||||
| + | ||||
| +There is an of_* variant of the nvmem binding which works without | ||||
| +devices. The returned data of a nvmem_cell_read() has to be freed after | ||||
| +use. On the other hand the return of_get_mac_address() points to some | ||||
| +static data without a lifetime. The trick for now, was to allocate a | ||||
| +device resource managed buffer which is then returned. This will only | ||||
| +work if we have an actual device. | ||||
| + | ||||
| +Change it, so that the caller of of_get_mac_address() has to supply a | ||||
| +buffer where the MAC address is written to. Unfortunately, this will | ||||
| +touch all drivers which use the of_get_mac_address(). | ||||
| + | ||||
| +Usually the code looks like: | ||||
| + | ||||
| +  const char *addr; | ||||
| +  addr = of_get_mac_address(np); | ||||
| +  if (!IS_ERR(addr)) | ||||
| +    ether_addr_copy(ndev->dev_addr, addr); | ||||
| + | ||||
| +This can then be simply rewritten as: | ||||
| + | ||||
| +  of_get_mac_address(np, ndev->dev_addr); | ||||
| + | ||||
| +Sometimes is_valid_ether_addr() is used to test the MAC address. | ||||
| +of_get_mac_address() already makes sure, it just returns a valid MAC | ||||
| +address. Thus we can just test its return code. But we have to be | ||||
| +careful if there are still other sources for the MAC address before the | ||||
| +of_get_mac_address(). In this case we have to keep the | ||||
| +is_valid_ether_addr() call. | ||||
| + | ||||
| +The following coccinelle patch was used to convert common cases to the | ||||
| +new style. Afterwards, I've manually gone over the drivers and fixed the | ||||
| +return code variable: either used a new one or if one was already | ||||
| +available use that. Mansour Moufid, thanks for that coccinelle patch! | ||||
| + | ||||
| +<spml> | ||||
| +@a@ | ||||
| +identifier x; | ||||
| +expression y, z; | ||||
| +@@ | ||||
| +- x = of_get_mac_address(y); | ||||
| ++ x = of_get_mac_address(y, z); | ||||
| +  <... | ||||
| +- ether_addr_copy(z, x); | ||||
| +  ...> | ||||
| + | ||||
| +@@ | ||||
| +identifier a.x; | ||||
| +@@ | ||||
| +- if (<+... x ...+>) {} | ||||
| + | ||||
| +@@ | ||||
| +identifier a.x; | ||||
| +@@ | ||||
| +  if (<+... x ...+>) { | ||||
| +      ... | ||||
| +  } | ||||
| +- else {} | ||||
| + | ||||
| +@@ | ||||
| +identifier a.x; | ||||
| +expression e; | ||||
| +@@ | ||||
| +- if (<+... x ...+>@e) | ||||
| +-     {} | ||||
| +- else | ||||
| ++ if (!(e)) | ||||
| +      {...} | ||||
| + | ||||
| +@@ | ||||
| +expression x, y, z; | ||||
| +@@ | ||||
| +- x = of_get_mac_address(y, z); | ||||
| ++ of_get_mac_address(y, z); | ||||
| +  ... when != x | ||||
| +</spml> | ||||
| + | ||||
| +All drivers, except drivers/net/ethernet/aeroflex/greth.c, were | ||||
| +compile-time tested. | ||||
| + | ||||
| +Suggested-by: Andrew Lunn <andrew@lunn.ch> | ||||
| +Signed-off-by: Michael Walle <michael@walle.cc> | ||||
| +Reviewed-by: Andrew Lunn <andrew@lunn.ch> | ||||
| +Signed-off-by: David S. Miller <davem@davemloft.net> | ||||
| +--- | ||||
| + arch/arm/mach-mvebu/kirkwood.c                     |  3 +- | ||||
| + arch/powerpc/sysdev/tsi108_dev.c                   |  5 +- | ||||
| + drivers/net/ethernet/aeroflex/greth.c              |  6 +-- | ||||
| + drivers/net/ethernet/allwinner/sun4i-emac.c        | 10 ++-- | ||||
| + drivers/net/ethernet/altera/altera_tse_main.c      |  7 +-- | ||||
| + drivers/net/ethernet/arc/emac_main.c               |  8 +-- | ||||
| + drivers/net/ethernet/atheros/ag71xx.c              |  7 +-- | ||||
| + drivers/net/ethernet/broadcom/bcm4908_enet.c       |  7 +-- | ||||
| + drivers/net/ethernet/broadcom/bcmsysport.c         |  7 +-- | ||||
| + drivers/net/ethernet/broadcom/bgmac-bcma.c         | 10 ++-- | ||||
| + drivers/net/ethernet/broadcom/bgmac-platform.c     | 11 ++-- | ||||
| + drivers/net/ethernet/cadence/macb_main.c           | 11 ++-- | ||||
| + drivers/net/ethernet/cavium/octeon/octeon_mgmt.c   |  8 +-- | ||||
| + drivers/net/ethernet/cavium/thunder/thunder_bgx.c  |  5 +- | ||||
| + drivers/net/ethernet/davicom/dm9000.c              | 10 ++-- | ||||
| + drivers/net/ethernet/ethoc.c                       |  6 +-- | ||||
| + drivers/net/ethernet/ezchip/nps_enet.c             |  7 +-- | ||||
| + drivers/net/ethernet/freescale/fec_main.c          |  7 +-- | ||||
| + drivers/net/ethernet/freescale/fec_mpc52xx.c       |  7 +-- | ||||
| + drivers/net/ethernet/freescale/fman/mac.c          |  9 ++-- | ||||
| + .../net/ethernet/freescale/fs_enet/fs_enet-main.c  |  5 +- | ||||
| + drivers/net/ethernet/freescale/gianfar.c           |  8 +-- | ||||
| + drivers/net/ethernet/freescale/ucc_geth.c          |  5 +- | ||||
| + drivers/net/ethernet/hisilicon/hisi_femac.c        |  7 +-- | ||||
| + drivers/net/ethernet/hisilicon/hix5hd2_gmac.c      |  7 +-- | ||||
| + drivers/net/ethernet/lantiq_xrx200.c               |  7 +-- | ||||
| + drivers/net/ethernet/marvell/mv643xx_eth.c         |  5 +- | ||||
| + drivers/net/ethernet/marvell/mvneta.c              |  6 +-- | ||||
| + .../net/ethernet/marvell/prestera/prestera_main.c  | 11 ++-- | ||||
| + drivers/net/ethernet/marvell/pxa168_eth.c          |  9 +--- | ||||
| + drivers/net/ethernet/marvell/sky2.c                |  8 ++- | ||||
| + drivers/net/ethernet/mediatek/mtk_eth_soc.c        | 11 ++-- | ||||
| + drivers/net/ethernet/micrel/ks8851_common.c        |  7 ++- | ||||
| + drivers/net/ethernet/microchip/lan743x_main.c      |  5 +- | ||||
| + drivers/net/ethernet/nxp/lpc_eth.c                 |  4 +- | ||||
| + drivers/net/ethernet/qualcomm/qca_spi.c            | 10 ++-- | ||||
| + drivers/net/ethernet/qualcomm/qca_uart.c           |  9 +--- | ||||
| + drivers/net/ethernet/renesas/ravb_main.c           | 12 +++-- | ||||
| + drivers/net/ethernet/renesas/sh_eth.c              |  5 +- | ||||
| + .../net/ethernet/samsung/sxgbe/sxgbe_platform.c    | 13 ++--- | ||||
| + drivers/net/ethernet/socionext/sni_ave.c           | 10 ++-- | ||||
| + .../net/ethernet/stmicro/stmmac/dwmac-anarion.c    |  2 +- | ||||
| + .../ethernet/stmicro/stmmac/dwmac-dwc-qos-eth.c    |  2 +- | ||||
| + .../net/ethernet/stmicro/stmmac/dwmac-generic.c    |  2 +- | ||||
| + drivers/net/ethernet/stmicro/stmmac/dwmac-imx.c    |  2 +- | ||||
| + .../net/ethernet/stmicro/stmmac/dwmac-intel-plat.c |  2 +- | ||||
| + .../net/ethernet/stmicro/stmmac/dwmac-ipq806x.c    |  2 +- | ||||
| + .../net/ethernet/stmicro/stmmac/dwmac-lpc18xx.c    |  2 +- | ||||
| + .../net/ethernet/stmicro/stmmac/dwmac-mediatek.c   |  2 +- | ||||
| + drivers/net/ethernet/stmicro/stmmac/dwmac-meson.c  |  2 +- | ||||
| + .../net/ethernet/stmicro/stmmac/dwmac-meson8b.c    |  2 +- | ||||
| + drivers/net/ethernet/stmicro/stmmac/dwmac-oxnas.c  |  2 +- | ||||
| + .../ethernet/stmicro/stmmac/dwmac-qcom-ethqos.c    |  2 +- | ||||
| + drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c     |  2 +- | ||||
| + .../net/ethernet/stmicro/stmmac/dwmac-socfpga.c    |  2 +- | ||||
| + drivers/net/ethernet/stmicro/stmmac/dwmac-sti.c    |  2 +- | ||||
| + drivers/net/ethernet/stmicro/stmmac/dwmac-stm32.c  |  2 +- | ||||
| + drivers/net/ethernet/stmicro/stmmac/dwmac-sun8i.c  |  2 +- | ||||
| + drivers/net/ethernet/stmicro/stmmac/dwmac-sunxi.c  |  2 +- | ||||
| + .../net/ethernet/stmicro/stmmac/dwmac-visconti.c   |  2 +- | ||||
| + drivers/net/ethernet/stmicro/stmmac/stmmac.h       |  2 +- | ||||
| + drivers/net/ethernet/stmicro/stmmac/stmmac_main.c  |  2 +- | ||||
| + .../net/ethernet/stmicro/stmmac/stmmac_platform.c  | 14 ++--- | ||||
| + .../net/ethernet/stmicro/stmmac/stmmac_platform.h  |  2 +- | ||||
| + drivers/net/ethernet/ti/am65-cpsw-nuss.c           | 19 ++++--- | ||||
| + drivers/net/ethernet/ti/cpsw.c                     |  7 +-- | ||||
| + drivers/net/ethernet/ti/cpsw_new.c                 |  7 +-- | ||||
| + drivers/net/ethernet/ti/davinci_emac.c             |  8 +-- | ||||
| + drivers/net/ethernet/ti/netcp_core.c               |  7 +-- | ||||
| + drivers/net/ethernet/wiznet/w5100-spi.c            |  8 ++- | ||||
| + drivers/net/ethernet/wiznet/w5100.c                |  2 +- | ||||
| + drivers/net/ethernet/xilinx/ll_temac_main.c        |  8 +-- | ||||
| + drivers/net/ethernet/xilinx/xilinx_axienet_main.c  | 15 +++--- | ||||
| + drivers/net/ethernet/xilinx/xilinx_emaclite.c      |  8 +-- | ||||
| + drivers/net/wireless/ath/ath9k/init.c              |  5 +- | ||||
| + drivers/net/wireless/mediatek/mt76/eeprom.c        |  9 +--- | ||||
| + drivers/net/wireless/ralink/rt2x00/rt2x00dev.c     |  6 +-- | ||||
| + drivers/of/of_net.c                                | 60 ++++++++++------------ | ||||
| + drivers/staging/octeon/ethernet.c                  | 10 ++-- | ||||
| + drivers/staging/wfx/main.c                         |  7 ++- | ||||
| + include/linux/of_net.h                             |  6 +-- | ||||
| + include/net/dsa.h                                  |  2 +- | ||||
| + net/dsa/dsa2.c                                     |  2 +- | ||||
| + net/dsa/slave.c                                    |  2 +- | ||||
| + net/ethernet/eth.c                                 | 11 ++-- | ||||
| + 85 files changed, 218 insertions(+), 364 deletions(-) | ||||
| + | ||||
| +--- a/drivers/net/wireless/ath/ath9k/init.c | ||||
| ++++ b/drivers/net/wireless/ath/ath9k/init.c | ||||
| +@@ -618,7 +618,6 @@ static int ath9k_of_init(struct ath_soft | ||||
| + 	struct ath_hw *ah = sc->sc_ah; | ||||
| + 	struct ath_common *common = ath9k_hw_common(ah); | ||||
| + 	enum ath_bus_type bus_type = common->bus_ops->ath_bus_type; | ||||
| +-	const char *mac; | ||||
| + 	char eeprom_name[100]; | ||||
| + 	int ret; | ||||
| +  | ||||
| +@@ -641,9 +640,7 @@ static int ath9k_of_init(struct ath_soft | ||||
| + 		ah->ah_flags |= AH_NO_EEP_SWAP; | ||||
| + 	} | ||||
| +  | ||||
| +-	mac = of_get_mac_address(np); | ||||
| +-	if (!IS_ERR(mac)) | ||||
| +-		ether_addr_copy(common->macaddr, mac); | ||||
| ++	of_get_mac_address(np, common->macaddr); | ||||
| +  | ||||
| + 	return 0; | ||||
| + } | ||||
| +--- a/drivers/net/wireless/mediatek/mt76/eeprom.c | ||||
| ++++ b/drivers/net/wireless/mediatek/mt76/eeprom.c | ||||
| +@@ -90,15 +90,9 @@ out_put_node: | ||||
| + void | ||||
| + mt76_eeprom_override(struct mt76_dev *dev) | ||||
| + { | ||||
| +-#ifdef CONFIG_OF | ||||
| + 	struct device_node *np = dev->dev->of_node; | ||||
| +-	const u8 *mac = NULL; | ||||
| +  | ||||
| +-	if (np) | ||||
| +-		mac = of_get_mac_address(np); | ||||
| +-	if (!IS_ERR_OR_NULL(mac)) | ||||
| +-		ether_addr_copy(dev->macaddr, mac); | ||||
| +-#endif | ||||
| ++	of_get_mac_address(np, dev->macaddr); | ||||
| +  | ||||
| + 	if (!is_valid_ether_addr(dev->macaddr)) { | ||||
| + 		eth_random_addr(dev->macaddr); | ||||
| +--- a/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c | ||||
| ++++ b/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c | ||||
| +@@ -990,11 +990,7 @@ static void rt2x00lib_rate(struct ieee80 | ||||
| +  | ||||
| + void rt2x00lib_set_mac_address(struct rt2x00_dev *rt2x00dev, u8 *eeprom_mac_addr) | ||||
| + { | ||||
| +-	const char *mac_addr; | ||||
| +- | ||||
| +-	mac_addr = of_get_mac_address(rt2x00dev->dev->of_node); | ||||
| +-	if (!IS_ERR(mac_addr)) | ||||
| +-		ether_addr_copy(eeprom_mac_addr, mac_addr); | ||||
| ++	of_get_mac_address(rt2x00dev->dev->of_node, eeprom_mac_addr); | ||||
| +  | ||||
| + 	if (!is_valid_ether_addr(eeprom_mac_addr)) { | ||||
| + 		eth_random_addr(eeprom_mac_addr); | ||||
| --  | ||||
| 2.25.1 | ||||
|  | ||||
|   | ||||
| @@ -1,14 +1,14 @@ | ||||
| From 3b094ed6b1602969f0dd71b48ed220d0caace7ab Mon Sep 17 00:00:00 2001 | ||||
| From c51842eff4bcbc1def57e54d5eab0e5df2046d7e Mon Sep 17 00:00:00 2001 | ||||
| From: John Crispin <john@phrozen.org> | ||||
| Date: Sat, 4 Sep 2021 05:48:27 +0200 | ||||
| Subject: [PATCH 19/27] hostapd: update to latest HEAD | ||||
| Subject: [PATCH 01/56] hostapd: update to latest HEAD | ||||
|  | ||||
| Signed-off-by: John Crispin <john@phrozen.org> | ||||
| --- | ||||
|  package/network/services/hostapd/Makefile     |  15 +- | ||||
|  .../hostapd/files/hostapd-basic.config        |   2 +- | ||||
|  .../hostapd/files/hostapd-full.config         |   4 +- | ||||
|  .../network/services/hostapd/files/hostapd.sh | 141 +++++++-- | ||||
|  .../network/services/hostapd/files/hostapd.sh | 145 +++++++-- | ||||
|  ...-fix-frequency-setup-with-HE-enabled.patch | 196 ------------- | ||||
|  ...> 001-wolfssl-init-RNG-with-ECC-key.patch} |  11 +- | ||||
|  ...-init-order-disable-pri-sec-channel-.patch | 126 -------- | ||||
| @@ -72,7 +72,7 @@ Signed-off-by: John Crispin <john@phrozen.org> | ||||
|  .../services/hostapd/src/src/ap/ubus.c        | 214 +++++++++++++- | ||||
|  .../services/hostapd/src/src/ap/ubus.h        |  16 + | ||||
|  .../hostapd/src/src/utils/build_features.h    |   2 - | ||||
|  67 files changed, 1277 insertions(+), 2334 deletions(-) | ||||
|  67 files changed, 1280 insertions(+), 2335 deletions(-) | ||||
|  delete mode 100644 package/network/services/hostapd/patches/001-HE-VHT-fix-frequency-setup-with-HE-enabled.patch | ||||
|  rename package/network/services/hostapd/patches/{802-wolfssl-init-RNG-with-ECC-key.patch => 001-wolfssl-init-RNG-with-ECC-key.patch} (76%) | ||||
|  delete mode 100644 package/network/services/hostapd/patches/002-mesh-fix-channel-init-order-disable-pri-sec-channel-.patch | ||||
| @@ -179,7 +179,7 @@ index df272e443a..61b6daf861 100644 | ||||
|  # EAP-SAKE for the integrated EAP server | ||||
|  #CONFIG_EAP_SAKE=y | ||||
| diff --git a/package/network/services/hostapd/files/hostapd.sh b/package/network/services/hostapd/files/hostapd.sh | ||||
| index aa72e09eba..e941fa4f77 100644 | ||||
| index aa72e09eba..c1f48326fa 100644 | ||||
| --- a/package/network/services/hostapd/files/hostapd.sh | ||||
| +++ b/package/network/services/hostapd/files/hostapd.sh | ||||
| @@ -49,6 +49,7 @@ hostapd_append_wpa_key_mgmt() { | ||||
| @@ -261,7 +261,7 @@ index aa72e09eba..e941fa4f77 100644 | ||||
|   | ||||
|  	config_add_string 'owe_transition_bssid:macaddr' 'owe_transition_ssid:string' | ||||
|   | ||||
| @@ -319,7 +333,7 @@ hostapd_common_add_bss_config() { | ||||
| @@ -319,23 +333,33 @@ hostapd_common_add_bss_config() { | ||||
|  	config_add_int iw_ipaddr_type_availability iw_gas_address3 | ||||
|  	config_add_string iw_hessid iw_network_auth_type iw_qos_map_set | ||||
|  	config_add_array iw_roaming_consortium iw_domain_name iw_anqp_3gpp_cell_net iw_nai_realm | ||||
| @@ -270,7 +270,11 @@ index aa72e09eba..e941fa4f77 100644 | ||||
|   | ||||
|  	config_add_boolean hs20 disable_dgaf osen | ||||
|  	config_add_int anqp_domain_id | ||||
| @@ -330,12 +344,22 @@ hostapd_common_add_bss_config() { | ||||
| -	config_add_int hs20_deauth_req_timeout | ||||
| +	config_add_int hs20_deauth_req_timeout hs20_release | ||||
|  	config_add_array hs20_oper_friendly_name | ||||
|  	config_add_array osu_provider | ||||
|  	config_add_array operator_icon | ||||
|  	config_add_array hs20_conn_capab | ||||
|  	config_add_string osu_ssid hs20_wan_metrics hs20_operating_class hs20_t_c_filename hs20_t_c_timestamp | ||||
|   | ||||
| @@ -508,21 +512,32 @@ index aa72e09eba..e941fa4f77 100644 | ||||
|   | ||||
|  		iw_domain_name_conf= | ||||
|  		json_for_each_item append_iw_domain_name iw_domain_name | ||||
| @@ -924,9 +995,11 @@ hostapd_set_bss_options() { | ||||
| @@ -924,11 +995,14 @@ hostapd_set_bss_options() { | ||||
|   | ||||
|   | ||||
|  	local hs20 disable_dgaf osen anqp_domain_id hs20_deauth_req_timeout \ | ||||
| -		osu_ssid hs20_wan_metrics hs20_operating_class hs20_t_c_filename hs20_t_c_timestamp | ||||
| +		osu_ssid hs20_wan_metrics hs20_operating_class hs20_t_c_filename hs20_t_c_timestamp \ | ||||
| +		hs20_t_c_server_url | ||||
| +		hs20_t_c_server_url hs20_release | ||||
|  	json_get_vars hs20 disable_dgaf osen anqp_domain_id hs20_deauth_req_timeout \ | ||||
| -		osu_ssid hs20_wan_metrics hs20_operating_class hs20_t_c_filename hs20_t_c_timestamp | ||||
| +		osu_ssid hs20_wan_metrics hs20_operating_class hs20_t_c_filename hs20_t_c_timestamp \ | ||||
| +		hs20_t_c_server_url | ||||
| +		hs20_t_c_server_url hs20_release | ||||
|   | ||||
|  	set_default hs20 0 | ||||
| +	set_default hs20_release  1 | ||||
|  	set_default disable_dgaf $hs20 | ||||
| @@ -945,16 +1018,31 @@ hostapd_set_bss_options() { | ||||
|  	set_default osen 0 | ||||
|  	set_default anqp_domain_id 0 | ||||
| @@ -936,6 +1010,7 @@ hostapd_set_bss_options() { | ||||
|  	if [ "$hs20" = "1" ]; then | ||||
|  		append bss_conf "hs20=1" "$N" | ||||
|  		append_hs20_icons | ||||
| +		append bss_conf "hs20_release=$hs20_release" "$N" | ||||
|  		append bss_conf "disable_dgaf=$disable_dgaf" "$N" | ||||
|  		append bss_conf "osen=$osen" "$N" | ||||
|  		append bss_conf "anqp_domain_id=$anqp_domain_id" "$N" | ||||
| @@ -945,16 +1020,31 @@ hostapd_set_bss_options() { | ||||
|  		[ -n "$hs20_operating_class" ] && append bss_conf "hs20_operating_class=$hs20_operating_class" "$N" | ||||
|  		[ -n "$hs20_t_c_filename" ] && append bss_conf "hs20_t_c_filename=$hs20_t_c_filename" "$N" | ||||
|  		[ -n "$hs20_t_c_timestamp" ] && append bss_conf "hs20_t_c_timestamp=$hs20_t_c_timestamp" "$N" | ||||
| @@ -555,7 +570,7 @@ index aa72e09eba..e941fa4f77 100644 | ||||
|   | ||||
|  	set_default per_sta_vif 0 | ||||
|  	if [ "$per_sta_vif" -gt 0 ]; then | ||||
| @@ -1079,16 +1167,16 @@ wpa_supplicant_set_fixed_freq() { | ||||
| @@ -1079,16 +1169,16 @@ wpa_supplicant_set_fixed_freq() { | ||||
|  	append network_data "frequency=$freq" "$N$T" | ||||
|  	case "$htmode" in | ||||
|  		NOHT) append network_data "disable_ht=1" "$N$T";; | ||||
| @@ -576,7 +591,7 @@ index aa72e09eba..e941fa4f77 100644 | ||||
|  		*) append network_data "disable_vht=1" "$N$T";; | ||||
|  	esac | ||||
|  } | ||||
| @@ -1106,7 +1194,8 @@ wpa_supplicant_add_network() { | ||||
| @@ -1106,7 +1196,8 @@ wpa_supplicant_add_network() { | ||||
|  		ssid bssid key \ | ||||
|  		basic_rate mcast_rate \ | ||||
|  		ieee80211w ieee80211r \ | ||||
| @@ -586,7 +601,7 @@ index aa72e09eba..e941fa4f77 100644 | ||||
|   | ||||
|  	case "$auth_type" in | ||||
|  		sae|owe|eap192|eap-eap192) | ||||
| @@ -1119,6 +1208,7 @@ wpa_supplicant_add_network() { | ||||
| @@ -1119,6 +1210,7 @@ wpa_supplicant_add_network() { | ||||
|   | ||||
|  	set_default ieee80211r 0 | ||||
|  	set_default multi_ap 0 | ||||
| @@ -594,7 +609,7 @@ index aa72e09eba..e941fa4f77 100644 | ||||
|   | ||||
|  	local key_mgmt='NONE' | ||||
|  	local network_data= | ||||
| @@ -1150,7 +1240,10 @@ wpa_supplicant_add_network() { | ||||
| @@ -1150,7 +1242,10 @@ wpa_supplicant_add_network() { | ||||
|  		scan_ssid="" | ||||
|  	} | ||||
|   | ||||
|   | ||||
							
								
								
									
										247
									
								
								backports/0028-mt76-update-to-latest-HEAD.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										247
									
								
								backports/0028-mt76-update-to-latest-HEAD.patch
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,247 @@ | ||||
| From 99b9f524e94b98ce8fd3e141bf7e07bfa96bbea0 Mon Sep 17 00:00:00 2001 | ||||
| From: John Crispin <john@phrozen.org> | ||||
| Date: Tue, 14 Sep 2021 09:19:08 +0200 | ||||
| Subject: [PATCH] mt76: update to latest HEAD | ||||
|  | ||||
| Signed-off-by: John Crispin <john@phrozen.org> | ||||
| --- | ||||
|  package/kernel/mt76/Makefile                  |   7 +- | ||||
|  ...the-dst-buffer-to-of_get_mac_address.patch | 206 ++++++++++++++++++ | ||||
|  2 files changed, 210 insertions(+), 3 deletions(-) | ||||
|  create mode 100644 package/kernel/mt76/patches/001-of-net-pass-the-dst-buffer-to-of_get_mac_address.patch | ||||
|  | ||||
| diff --git a/package/kernel/mt76/Makefile b/package/kernel/mt76/Makefile | ||||
| index e4051d8347..431c57a240 100644 | ||||
| --- a/package/kernel/mt76/Makefile | ||||
| +++ b/package/kernel/mt76/Makefile | ||||
| @@ -8,11 +8,12 @@ PKG_LICENSE_FILES:= | ||||
|   | ||||
|  PKG_SOURCE_URL:=https://github.com/openwrt/mt76 | ||||
|  PKG_SOURCE_PROTO:=git | ||||
| -PKG_SOURCE_DATE:=2021-06-06 | ||||
| -PKG_SOURCE_VERSION:=22b690334c0f49b11534cc2e331c9d5e17c4a0bc | ||||
| -PKG_MIRROR_HASH:=ff5e563935919d2e40c1e7254ef3bc06f7ecc5e69f8ddd12903e8f5de942d630 | ||||
| +PKG_SOURCE_DATE:=2021-07-15 | ||||
| +PKG_SOURCE_VERSION:=bbebea7d6dc64313132226adc3f7369d36e9359d | ||||
| +PKG_MIRROR_HASH:=17cd74e72c1f6c8742b698bf6772afacc6fba71b233af8c4d59530600cf44d5b | ||||
|   | ||||
|  PKG_MAINTAINER:=Felix Fietkau <nbd@nbd.name> | ||||
| +PKG_USE_NINJA:=0 | ||||
|  PKG_BUILD_PARALLEL:=1 | ||||
|   | ||||
|  PKG_CONFIG_DEPENDS += \ | ||||
| diff --git a/package/kernel/mt76/patches/001-of-net-pass-the-dst-buffer-to-of_get_mac_address.patch b/package/kernel/mt76/patches/001-of-net-pass-the-dst-buffer-to-of_get_mac_address.patch | ||||
| new file mode 100644 | ||||
| index 0000000000..66075f2771 | ||||
| --- /dev/null | ||||
| +++ b/package/kernel/mt76/patches/001-of-net-pass-the-dst-buffer-to-of_get_mac_address.patch | ||||
| @@ -0,0 +1,206 @@ | ||||
| +From 83216e3988cd196183542937c9bd58b279f946af Mon Sep 17 00:00:00 2001 | ||||
| +From: Michael Walle <michael@walle.cc> | ||||
| +Date: Mon, 12 Apr 2021 19:47:17 +0200 | ||||
| +Subject: of: net: pass the dst buffer to of_get_mac_address() | ||||
| + | ||||
| +of_get_mac_address() returns a "const void*" pointer to a MAC address. | ||||
| +Lately, support to fetch the MAC address by an NVMEM provider was added. | ||||
| +But this will only work with platform devices. It will not work with | ||||
| +PCI devices (e.g. of an integrated root complex) and esp. not with DSA | ||||
| +ports. | ||||
| + | ||||
| +There is an of_* variant of the nvmem binding which works without | ||||
| +devices. The returned data of a nvmem_cell_read() has to be freed after | ||||
| +use. On the other hand the return of_get_mac_address() points to some | ||||
| +static data without a lifetime. The trick for now, was to allocate a | ||||
| +device resource managed buffer which is then returned. This will only | ||||
| +work if we have an actual device. | ||||
| + | ||||
| +Change it, so that the caller of of_get_mac_address() has to supply a | ||||
| +buffer where the MAC address is written to. Unfortunately, this will | ||||
| +touch all drivers which use the of_get_mac_address(). | ||||
| + | ||||
| +Usually the code looks like: | ||||
| + | ||||
| +  const char *addr; | ||||
| +  addr = of_get_mac_address(np); | ||||
| +  if (!IS_ERR(addr)) | ||||
| +    ether_addr_copy(ndev->dev_addr, addr); | ||||
| + | ||||
| +This can then be simply rewritten as: | ||||
| + | ||||
| +  of_get_mac_address(np, ndev->dev_addr); | ||||
| + | ||||
| +Sometimes is_valid_ether_addr() is used to test the MAC address. | ||||
| +of_get_mac_address() already makes sure, it just returns a valid MAC | ||||
| +address. Thus we can just test its return code. But we have to be | ||||
| +careful if there are still other sources for the MAC address before the | ||||
| +of_get_mac_address(). In this case we have to keep the | ||||
| +is_valid_ether_addr() call. | ||||
| + | ||||
| +The following coccinelle patch was used to convert common cases to the | ||||
| +new style. Afterwards, I've manually gone over the drivers and fixed the | ||||
| +return code variable: either used a new one or if one was already | ||||
| +available use that. Mansour Moufid, thanks for that coccinelle patch! | ||||
| + | ||||
| +<spml> | ||||
| +@a@ | ||||
| +identifier x; | ||||
| +expression y, z; | ||||
| +@@ | ||||
| +- x = of_get_mac_address(y); | ||||
| ++ x = of_get_mac_address(y, z); | ||||
| +  <... | ||||
| +- ether_addr_copy(z, x); | ||||
| +  ...> | ||||
| + | ||||
| +@@ | ||||
| +identifier a.x; | ||||
| +@@ | ||||
| +- if (<+... x ...+>) {} | ||||
| + | ||||
| +@@ | ||||
| +identifier a.x; | ||||
| +@@ | ||||
| +  if (<+... x ...+>) { | ||||
| +      ... | ||||
| +  } | ||||
| +- else {} | ||||
| + | ||||
| +@@ | ||||
| +identifier a.x; | ||||
| +expression e; | ||||
| +@@ | ||||
| +- if (<+... x ...+>@e) | ||||
| +-     {} | ||||
| +- else | ||||
| ++ if (!(e)) | ||||
| +      {...} | ||||
| + | ||||
| +@@ | ||||
| +expression x, y, z; | ||||
| +@@ | ||||
| +- x = of_get_mac_address(y, z); | ||||
| ++ of_get_mac_address(y, z); | ||||
| +  ... when != x | ||||
| +</spml> | ||||
| + | ||||
| +All drivers, except drivers/net/ethernet/aeroflex/greth.c, were | ||||
| +compile-time tested. | ||||
| + | ||||
| +Suggested-by: Andrew Lunn <andrew@lunn.ch> | ||||
| +Signed-off-by: Michael Walle <michael@walle.cc> | ||||
| +Reviewed-by: Andrew Lunn <andrew@lunn.ch> | ||||
| +Signed-off-by: David S. Miller <davem@davemloft.net> | ||||
| +--- | ||||
| + arch/arm/mach-mvebu/kirkwood.c                     |  3 +- | ||||
| + arch/powerpc/sysdev/tsi108_dev.c                   |  5 +- | ||||
| + drivers/net/ethernet/aeroflex/greth.c              |  6 +-- | ||||
| + drivers/net/ethernet/allwinner/sun4i-emac.c        | 10 ++-- | ||||
| + drivers/net/ethernet/altera/altera_tse_main.c      |  7 +-- | ||||
| + drivers/net/ethernet/arc/emac_main.c               |  8 +-- | ||||
| + drivers/net/ethernet/atheros/ag71xx.c              |  7 +-- | ||||
| + drivers/net/ethernet/broadcom/bcm4908_enet.c       |  7 +-- | ||||
| + drivers/net/ethernet/broadcom/bcmsysport.c         |  7 +-- | ||||
| + drivers/net/ethernet/broadcom/bgmac-bcma.c         | 10 ++-- | ||||
| + drivers/net/ethernet/broadcom/bgmac-platform.c     | 11 ++-- | ||||
| + drivers/net/ethernet/cadence/macb_main.c           | 11 ++-- | ||||
| + drivers/net/ethernet/cavium/octeon/octeon_mgmt.c   |  8 +-- | ||||
| + drivers/net/ethernet/cavium/thunder/thunder_bgx.c  |  5 +- | ||||
| + drivers/net/ethernet/davicom/dm9000.c              | 10 ++-- | ||||
| + drivers/net/ethernet/ethoc.c                       |  6 +-- | ||||
| + drivers/net/ethernet/ezchip/nps_enet.c             |  7 +-- | ||||
| + drivers/net/ethernet/freescale/fec_main.c          |  7 +-- | ||||
| + drivers/net/ethernet/freescale/fec_mpc52xx.c       |  7 +-- | ||||
| + drivers/net/ethernet/freescale/fman/mac.c          |  9 ++-- | ||||
| + .../net/ethernet/freescale/fs_enet/fs_enet-main.c  |  5 +- | ||||
| + drivers/net/ethernet/freescale/gianfar.c           |  8 +-- | ||||
| + drivers/net/ethernet/freescale/ucc_geth.c          |  5 +- | ||||
| + drivers/net/ethernet/hisilicon/hisi_femac.c        |  7 +-- | ||||
| + drivers/net/ethernet/hisilicon/hix5hd2_gmac.c      |  7 +-- | ||||
| + drivers/net/ethernet/lantiq_xrx200.c               |  7 +-- | ||||
| + drivers/net/ethernet/marvell/mv643xx_eth.c         |  5 +- | ||||
| + drivers/net/ethernet/marvell/mvneta.c              |  6 +-- | ||||
| + .../net/ethernet/marvell/prestera/prestera_main.c  | 11 ++-- | ||||
| + drivers/net/ethernet/marvell/pxa168_eth.c          |  9 +--- | ||||
| + drivers/net/ethernet/marvell/sky2.c                |  8 ++- | ||||
| + drivers/net/ethernet/mediatek/mtk_eth_soc.c        | 11 ++-- | ||||
| + drivers/net/ethernet/micrel/ks8851_common.c        |  7 ++- | ||||
| + drivers/net/ethernet/microchip/lan743x_main.c      |  5 +- | ||||
| + drivers/net/ethernet/nxp/lpc_eth.c                 |  4 +- | ||||
| + drivers/net/ethernet/qualcomm/qca_spi.c            | 10 ++-- | ||||
| + drivers/net/ethernet/qualcomm/qca_uart.c           |  9 +--- | ||||
| + drivers/net/ethernet/renesas/ravb_main.c           | 12 +++-- | ||||
| + drivers/net/ethernet/renesas/sh_eth.c              |  5 +- | ||||
| + .../net/ethernet/samsung/sxgbe/sxgbe_platform.c    | 13 ++--- | ||||
| + drivers/net/ethernet/socionext/sni_ave.c           | 10 ++-- | ||||
| + .../net/ethernet/stmicro/stmmac/dwmac-anarion.c    |  2 +- | ||||
| + .../ethernet/stmicro/stmmac/dwmac-dwc-qos-eth.c    |  2 +- | ||||
| + .../net/ethernet/stmicro/stmmac/dwmac-generic.c    |  2 +- | ||||
| + drivers/net/ethernet/stmicro/stmmac/dwmac-imx.c    |  2 +- | ||||
| + .../net/ethernet/stmicro/stmmac/dwmac-intel-plat.c |  2 +- | ||||
| + .../net/ethernet/stmicro/stmmac/dwmac-ipq806x.c    |  2 +- | ||||
| + .../net/ethernet/stmicro/stmmac/dwmac-lpc18xx.c    |  2 +- | ||||
| + .../net/ethernet/stmicro/stmmac/dwmac-mediatek.c   |  2 +- | ||||
| + drivers/net/ethernet/stmicro/stmmac/dwmac-meson.c  |  2 +- | ||||
| + .../net/ethernet/stmicro/stmmac/dwmac-meson8b.c    |  2 +- | ||||
| + drivers/net/ethernet/stmicro/stmmac/dwmac-oxnas.c  |  2 +- | ||||
| + .../ethernet/stmicro/stmmac/dwmac-qcom-ethqos.c    |  2 +- | ||||
| + drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c     |  2 +- | ||||
| + .../net/ethernet/stmicro/stmmac/dwmac-socfpga.c    |  2 +- | ||||
| + drivers/net/ethernet/stmicro/stmmac/dwmac-sti.c    |  2 +- | ||||
| + drivers/net/ethernet/stmicro/stmmac/dwmac-stm32.c  |  2 +- | ||||
| + drivers/net/ethernet/stmicro/stmmac/dwmac-sun8i.c  |  2 +- | ||||
| + drivers/net/ethernet/stmicro/stmmac/dwmac-sunxi.c  |  2 +- | ||||
| + .../net/ethernet/stmicro/stmmac/dwmac-visconti.c   |  2 +- | ||||
| + drivers/net/ethernet/stmicro/stmmac/stmmac.h       |  2 +- | ||||
| + drivers/net/ethernet/stmicro/stmmac/stmmac_main.c  |  2 +- | ||||
| + .../net/ethernet/stmicro/stmmac/stmmac_platform.c  | 14 ++--- | ||||
| + .../net/ethernet/stmicro/stmmac/stmmac_platform.h  |  2 +- | ||||
| + drivers/net/ethernet/ti/am65-cpsw-nuss.c           | 19 ++++--- | ||||
| + drivers/net/ethernet/ti/cpsw.c                     |  7 +-- | ||||
| + drivers/net/ethernet/ti/cpsw_new.c                 |  7 +-- | ||||
| + drivers/net/ethernet/ti/davinci_emac.c             |  8 +-- | ||||
| + drivers/net/ethernet/ti/netcp_core.c               |  7 +-- | ||||
| + drivers/net/ethernet/wiznet/w5100-spi.c            |  8 ++- | ||||
| + drivers/net/ethernet/wiznet/w5100.c                |  2 +- | ||||
| + drivers/net/ethernet/xilinx/ll_temac_main.c        |  8 +-- | ||||
| + drivers/net/ethernet/xilinx/xilinx_axienet_main.c  | 15 +++--- | ||||
| + drivers/net/ethernet/xilinx/xilinx_emaclite.c      |  8 +-- | ||||
| + drivers/net/wireless/ath/ath9k/init.c              |  5 +- | ||||
| + drivers/net/wireless/mediatek/mt76/eeprom.c        |  9 +--- | ||||
| + drivers/net/wireless/ralink/rt2x00/rt2x00dev.c     |  6 +-- | ||||
| + drivers/of/of_net.c                                | 60 ++++++++++------------ | ||||
| + drivers/staging/octeon/ethernet.c                  | 10 ++-- | ||||
| + drivers/staging/wfx/main.c                         |  7 ++- | ||||
| + include/linux/of_net.h                             |  6 +-- | ||||
| + include/net/dsa.h                                  |  2 +- | ||||
| + net/dsa/dsa2.c                                     |  2 +- | ||||
| + net/dsa/slave.c                                    |  2 +- | ||||
| + net/ethernet/eth.c                                 | 11 ++-- | ||||
| + 85 files changed, 218 insertions(+), 364 deletions(-) | ||||
| + | ||||
| +diff --git a/drivers/net/wireless/mediatek/mt76/eeprom.c b/drivers/net/wireless/mediatek/mt76/eeprom.c | ||||
| +index 665b54c5c8ae5..6d895738222ad 100644 | ||||
| +--- a/eeprom.c | ||||
| ++++ b/eeprom.c | ||||
| +@@ -91,15 +91,9 @@ void | ||||
| + { | ||||
| + 	struct mt76_dev *dev = phy->dev; | ||||
| +  | ||||
| +-#ifdef CONFIG_OF | ||||
| + 	struct device_node *np = dev->dev->of_node; | ||||
| +-	const u8 *mac = NULL; | ||||
| +  | ||||
| +-	if (np) | ||||
| +-		mac = of_get_mac_address(np); | ||||
| +-	if (!IS_ERR_OR_NULL(mac)) | ||||
| +-		ether_addr_copy(phy->macaddr, mac); | ||||
| +-#endif | ||||
| ++	of_get_mac_address(np, phy->macaddr); | ||||
| +  | ||||
| + 	if (!is_valid_ether_addr(phy->macaddr)) { | ||||
| + 		eth_random_addr(phy->macaddr); | ||||
| +--  | ||||
| +cgit 1.2.3-1.el7 | ||||
| + | ||||
| --  | ||||
| 2.25.1 | ||||
|  | ||||
| @@ -6,6 +6,9 @@ Case studies for OEM customers are available at the official page of [Facebook W | ||||
|  | ||||
| For OEM engineers, start by reading the init script in [files/etc/init.d/fbwifi](https://github.com/facebookincubator/fbc_owrt_feed/blob/master/fbwifi/files/etc/init.d/fbwifi) | ||||
|  | ||||
| To enable Facebook Wi-Fi, configure the gateway_token in `/etc/config/fbwifi`, and run `fbwifi enable`. | ||||
| To disable Facebook Wi-Fi, run `fbwifi disable`. | ||||
|  | ||||
| ## Contents | ||||
|  | ||||
| The 'files' subdirectory contains all the configuration, script and code  | ||||
|   | ||||
| @@ -1,3 +1,6 @@ | ||||
| -- SPDX-License-Identifier: GPL-2.0-only | ||||
| -- Copyright (c) Facebook, Inc. and its affiliates. | ||||
| -- | ||||
| -- FBWIFI Lua library | ||||
| -- function table | ||||
| local fbwifi = {} | ||||
| @@ -8,9 +11,7 @@ local log = require("posix.syslog") | ||||
| local uci = require("uci") | ||||
|  | ||||
| function fbwifi.gateway_token() | ||||
|  | ||||
| 	state = uci.cursor(nil, "/var/state") | ||||
| 	token = state:get("fbwifi", "main", "gateway_token") | ||||
| 	token = uci.get("fbwifi.main.gateway_token") | ||||
| 	if token and string.len(token) > 0 then | ||||
| 		return token | ||||
| 	else | ||||
| @@ -44,7 +45,7 @@ end | ||||
|  | ||||
| local mac_to_purge='' | ||||
| function remove_client_by_mac(client) | ||||
| 	state = uci.cursor(nil, "/var/state") | ||||
| 	state = uci.cursor("/var/state", "/tmp/fbwifi") | ||||
|  | ||||
| 	for key, value in pairs(client) do | ||||
| 		if | ||||
| @@ -62,7 +63,7 @@ function fbwifi.instate_client_rule( token, client_mac ) | ||||
|  | ||||
| 	log.syslog(log.LOG_INFO, "[fbwifi] Validating client "..client_mac) | ||||
|  | ||||
| 	state = uci.cursor(nil, "/var/state") | ||||
| 	state = uci.cursor("/var/state", "/tmp/fbwifi") | ||||
| 	state_name = "token_" .. token | ||||
|  | ||||
| 	RULE_COND="iptables -w -L FBWIFI_CLIENT_TO_INTERNET -t mangle | grep -i -q \"%s\"" | ||||
| @@ -92,6 +93,7 @@ function fbwifi.instate_client_rule( token, client_mac ) | ||||
| 	log.syslog(log.LOG_INFO, "[fbwifi] "..RULE) | ||||
|  | ||||
| 	state:save('fbwifi') | ||||
| 	state:commit('fbwifi') | ||||
| end | ||||
|  | ||||
| function fbwifi.revoke_client_rule( token ) | ||||
| @@ -103,7 +105,7 @@ function fbwifi.revoke_client_rule( token ) | ||||
|  | ||||
| 	log.syslog(log.LOG_INFO, string.format( "[fbwifi] Invalidating token (%s)", token) ) | ||||
|  | ||||
| 	state = uci.cursor(nil, "/var/state") | ||||
| 	state = uci.cursor("/var/state", "/tmp/fbwifi") | ||||
| 	state_name = "token_" .. token | ||||
| 	 | ||||
| 	client_mac = state:get("fbwifi", state_name, "mac") | ||||
| @@ -124,6 +126,7 @@ function fbwifi.revoke_client_rule( token ) | ||||
|  | ||||
| 		state:delete("fbwifi", state_name) | ||||
| 		state:save('fbwifi') | ||||
| 		state:commit('fbwifi') | ||||
| 	else | ||||
| 		log.syslog(log.LOG_WARNING, string.format( "[fbwifi] Client MAC not found in DB (%s)", state_name ) ) | ||||
| 	end | ||||
|   | ||||
| @@ -1,5 +1,5 @@ | ||||
| -- Copyright  | ||||
| -- Licensed to the public under the GNU General Public License v2. | ||||
| -- SPDX-License-Identifier: GPL-2.0-only | ||||
| -- Copyright (c) Facebook, Inc. and its affiliates. | ||||
|  | ||||
| module("luci.controller.fbwifi", package.seeall) | ||||
|  | ||||
|   | ||||
| @@ -8,7 +8,7 @@ | ||||
| <h1>Facebook Wi-Fi</h1> | ||||
| <% | ||||
| 	require("uci") | ||||
| 	state = uci.cursor(nil, "/var/state") | ||||
| 	state = uci.cursor("/var/state", "/tmp/fbwifi") | ||||
| 	url = state:get("fbwifi", "main", "captive_portal_config_url") | ||||
| %> | ||||
| <a href="<% print(url) %>">Configure FB business page</a> | ||||
|   | ||||
| @@ -26,6 +26,7 @@ enable) | ||||
| 	uci set uhttpd.fbwifi_redirect=uhttpd | ||||
| 	uci set uhttpd.fbwifi_redirect.enabled=1 | ||||
| 	uci set uhttpd.fbwifi_redirect.cert='/tmp/fbwifi/https_server_cert' | ||||
| 	uci set uhttpd.fbwifi_redirect.home='/dev/null' | ||||
| 	uci set uhttpd.fbwifi_redirect.json_script='/tmp/fbwifi/uhttpd-redirect.json' | ||||
| 	uci set uhttpd.fbwifi_redirect.key='/tmp/fbwifi/https_server_key' | ||||
| 	uci set uhttpd.fbwifi_redirect.listen_http='0.0.0.0:2060' | ||||
| @@ -39,7 +40,7 @@ enable) | ||||
| reload) | ||||
| 	/usr/sbin/fbwifi_get_config | ||||
|  | ||||
| 	login_url=$(uci -p /var/state get fbwifi.main.captive_portal_url) | ||||
| 	login_url=$(uci -c /var/state get fbwifi.main.captive_portal_url) | ||||
| 	[ -z "$login_url" ] && { | ||||
| 		logger -t fbwifi "captive_portal_url not available yet" | ||||
| 		exit 1 | ||||
|   | ||||
| @@ -1,5 +1,5 @@ | ||||
| echo -e "Runtime configuration and token DB\n" | ||||
| uci -p /var/state export fbwifi | ||||
| uci -c /var/state export fbwifi | ||||
|  | ||||
| echo -e "\nDynamic firewall flow rules\n" | ||||
| iptables -t mangle -L FBWIFI_CLIENT_TO_INTERNET | ||||
|   | ||||
| @@ -8,7 +8,7 @@ require("uci") | ||||
| fbwifi = require("fbwifi") | ||||
|  | ||||
| GATEWAY_TOKEN = fbwifi.gateway_token() | ||||
| state = uci.cursor(nil, "/var/state") | ||||
| state = uci.cursor("/var/state", "/tmp/fbwifi") | ||||
|  | ||||
| payload="name="..socket.dns.gethostname() | ||||
|  | ||||
| @@ -19,6 +19,7 @@ function queue_ssid_update(iface) | ||||
|             for line in file:lines() do | ||||
| 		payload=payload.."&bssid[]="..line | ||||
|             end | ||||
| 	    file:close() | ||||
| 	    payload=payload.."ssid[]="..iface["ssid"] | ||||
|         else | ||||
| 	    log.syslog(log.LOG_WARNING, "[fbwifi] Failed to find BSSID for interface br-"..iface["network"]) | ||||
|   | ||||
| @@ -10,7 +10,10 @@ GATEWAY_TOKEN = fbwifi.gateway_token() | ||||
| http_port = uci.get("fbwifi.main.http_port") | ||||
| https_port = uci.get("fbwifi.main.https_port") | ||||
|  | ||||
| state = uci.cursor(nil, "/var/state") | ||||
| statefile = assert(io.open("/var/state/fbwifi", "a"), "could not create state file") | ||||
| statefile:close() | ||||
|  | ||||
| state = uci.cursor("/var/state", "/tmp/fbwifi") | ||||
|  | ||||
| URL="https://api.fbwifi.com/v2.0/gateway" | ||||
| body, code, headers = http.request(URL.."?access_token="..GATEWAY_TOKEN.."&fields=config,config_version") | ||||
| @@ -100,7 +103,9 @@ result = os.execute("iptables -t mangle -F FBWIFI_TRAFFIC_ALLOWLIST ") | ||||
| table.foreach(obj['config']['traffic_allowlist'], process_traffic_rule) | ||||
| table.foreach(obj['config']['cross_origin_allowlist'], process_cross_origin_rule) | ||||
| table.foreach(obj['config']['urls'], process_url) | ||||
| state:set("fbwifi", "main", "cross_origin_allow_rules", cross_origin_list) | ||||
|  | ||||
| state:set("fbwifi", "main", "cross_origin_allow_rules", cross_origin_list) | ||||
| state:set("fbwifi", "main", "config_version", obj['config_version']) | ||||
|  | ||||
| state:save('fbwifi') | ||||
| state:commit('fbwifi') | ||||
|   | ||||
| @@ -6,7 +6,7 @@ log = require("posix.syslog") | ||||
| fbwifi = require("fbwifi") | ||||
| require("uci") | ||||
|  | ||||
| state = uci.cursor(nil, "/var/state") | ||||
| state = uci.cursor("/var/state", "/tmp/fbwifi") | ||||
| GATEWAY_TOKEN = fbwifi.gateway_token() | ||||
|  | ||||
| request = {  | ||||
| @@ -36,7 +36,7 @@ URL="https://api.fbwifi.com/v2.0/tokens" | ||||
| BODY=string.format( | ||||
| 	"tokens=%s&traffic_type=%s&config_version=%s", | ||||
| 	json.encode(request.tokens), | ||||
| 	"'total'", | ||||
| 	"total", | ||||
| 	state:get("fbwifi", "main", "config_version") | ||||
| ) | ||||
|  | ||||
|   | ||||
| @@ -1,7 +1,12 @@ | ||||
| #!/bin/sh | ||||
|  | ||||
| # SPDX-License-Identifier: GPL-2.0-only | ||||
| # Copyright (c) Facebook, Inc. and its affiliates. | ||||
|  | ||||
| IPT4="/usr/sbin/iptables" | ||||
|  | ||||
| set -- --wait 1 --wait-interval 100 | ||||
|  | ||||
| fbwifi_http_port="$(uci get fbwifi.main.http_port)" | ||||
| [ -n "$fbwifi_http_port" ] || { | ||||
| 	logger -t fbwifi "required option http_port not set" | ||||
| @@ -23,45 +28,48 @@ fbwifi_zone="$(uci get fbwifi.main.zone)" | ||||
| fbwifi_ifaces="$(fw3 -q zone "$fbwifi_zone")" | ||||
|  | ||||
| ## Create custom chains | ||||
| $IPT4 -t filter -N FBWIFI_FORWARD 2>/dev/null | ||||
| $IPT4 -t filter -N FBWIFI_INPUT 2>/dev/null | ||||
| $IPT4 -t mangle -N FBWIFI_CLIENT_TO_INTERNET 2>/dev/null | ||||
| $IPT4 -t mangle -N FBWIFI_PREROUTING 2>/dev/null | ||||
| $IPT4 -t mangle -N FBWIFI_TRAFFIC_ALLOWLIST 2>/dev/null | ||||
| $IPT4 -t nat -N FBWIFI_CLIENT_TO_INTERNET 2>/dev/null | ||||
| $IPT4 -t nat -N FBWIFI_PREROUTING 2>/dev/null | ||||
| $IPT4 -t nat -N FBWIFI_HOST_REDIRLIST 2>/dev/null | ||||
| "$IPT4" "$@" -t filter -N FBWIFI_FORWARD 2>/dev/null | ||||
| "$IPT4" "$@" -t filter -N FBWIFI_INPUT 2>/dev/null | ||||
| "$IPT4" "$@" -t mangle -N FBWIFI_CLIENT_TO_INTERNET 2>/dev/null | ||||
| "$IPT4" "$@" -t mangle -N FBWIFI_PREROUTING 2>/dev/null | ||||
| "$IPT4" "$@" -t mangle -N FBWIFI_TRAFFIC_ALLOWLIST 2>/dev/null | ||||
| "$IPT4" "$@" -t nat -N FBWIFI_CLIENT_TO_INTERNET 2>/dev/null | ||||
| "$IPT4" "$@" -t nat -N FBWIFI_PREROUTING 2>/dev/null | ||||
| "$IPT4" "$@" -t nat -N FBWIFI_HOST_REDIRLIST 2>/dev/null | ||||
|  | ||||
| ## Flush custom chains | ||||
| $IPT4 -t filter -F FBWIFI_FORWARD | ||||
| $IPT4 -t filter -F FBWIFI_INPUT | ||||
| $IPT4 -t mangle -F FBWIFI_CLIENT_TO_INTERNET | ||||
| $IPT4 -t mangle -F FBWIFI_PREROUTING | ||||
| $IPT4 -t mangle -F FBWIFI_TRAFFIC_ALLOWLIST | ||||
| $IPT4 -t nat -F FBWIFI_CLIENT_TO_INTERNET | ||||
| $IPT4 -t nat -F FBWIFI_PREROUTING | ||||
| $IPT4 -t nat -F FBWIFI_HOST_REDIRLIST | ||||
| "$IPT4" "$@" -t filter -F FBWIFI_FORWARD | ||||
| "$IPT4" "$@" -t filter -F FBWIFI_INPUT | ||||
| "$IPT4" "$@" -t mangle -F FBWIFI_CLIENT_TO_INTERNET | ||||
| "$IPT4" "$@" -t mangle -F FBWIFI_PREROUTING | ||||
| "$IPT4" "$@" -t mangle -F FBWIFI_TRAFFIC_ALLOWLIST | ||||
| "$IPT4" "$@" -t nat -F FBWIFI_CLIENT_TO_INTERNET | ||||
| "$IPT4" "$@" -t nat -F FBWIFI_PREROUTING | ||||
| "$IPT4" "$@" -t nat -F FBWIFI_HOST_REDIRLIST | ||||
|  | ||||
| ## Populate custom chains | ||||
| $IPT4 -t filter -A FBWIFI_FORWARD -p udp --dport 53 -m conntrack --ctstate NEW -j ACCEPT | ||||
| $IPT4 -t filter -A FBWIFI_FORWARD -m conntrack --ctstate NEW -m mark --mark 0xfb -j ACCEPT | ||||
| $IPT4 -t filter -A FBWIFI_FORWARD -j REJECT | ||||
| $IPT4 -t filter -A FBWIFI_INPUT -p tcp --dport "$fbwifi_http_port" -m conntrack --ctstate NEW -j ACCEPT | ||||
| $IPT4 -t filter -A FBWIFI_INPUT -p tcp --dport "$fbwifi_https_port"  -m conntrack --ctstate NEW -j ACCEPT | ||||
| $IPT4 -t mangle -A FBWIFI_PREROUTING -j FBWIFI_CLIENT_TO_INTERNET | ||||
| $IPT4 -t mangle -A FBWIFI_PREROUTING -j FBWIFI_TRAFFIC_ALLOWLIST | ||||
| $IPT4 -t nat -A FBWIFI_PREROUTING -j FBWIFI_CLIENT_TO_INTERNET | ||||
| $IPT4 -t nat -A FBWIFI_CLIENT_TO_INTERNET -p tcp --dport 80 -m conntrack --ctstate NEW -j FBWIFI_HOST_REDIRLIST | ||||
| $IPT4 -t nat -A FBWIFI_CLIENT_TO_INTERNET -p tcp --dport 443 -m conntrack --ctstate NEW -j FBWIFI_HOST_REDIRLIST | ||||
| $IPT4 -t nat -A FBWIFI_CLIENT_TO_INTERNET -p tcp --dport 80 -m conntrack --ctstate NEW -m mark --mark 0xfb -j ACCEPT | ||||
| $IPT4 -t nat -A FBWIFI_CLIENT_TO_INTERNET -p tcp --dport 443 -m conntrack --ctstate NEW -m mark --mark 0xfb -j ACCEPT | ||||
| $IPT4 -t nat -A FBWIFI_CLIENT_TO_INTERNET -p tcp --dport 80 -m conntrack --ctstate NEW -j REDIRECT --to-ports "$fbwifi_http_port" | ||||
| "$IPT4" "$@" -t filter -A FBWIFI_FORWARD -p udp --dport 53 -m conntrack --ctstate NEW -j ACCEPT | ||||
| "$IPT4" "$@" -t filter -A FBWIFI_FORWARD -m conntrack --ctstate NEW -m mark --mark 0xfb -j ACCEPT | ||||
| "$IPT4" "$@" -t filter -A FBWIFI_FORWARD -j REJECT | ||||
| "$IPT4" "$@" -t filter -A FBWIFI_INPUT -p tcp --dport "$fbwifi_http_port" -m conntrack --ctstate NEW -j ACCEPT | ||||
| "$IPT4" "$@" -t filter -A FBWIFI_INPUT -p tcp --dport "$fbwifi_https_port"  -m conntrack --ctstate NEW -j ACCEPT | ||||
| "$IPT4" "$@" -t filter -A FBWIFI_INPUT -p tcp --dport 443 -m conntrack --ctstate NEW -j ACCEPT | ||||
| "$IPT4" "$@" -t mangle -A FBWIFI_PREROUTING -j FBWIFI_CLIENT_TO_INTERNET | ||||
| "$IPT4" "$@" -t mangle -A FBWIFI_PREROUTING -j FBWIFI_TRAFFIC_ALLOWLIST | ||||
| "$IPT4" "$@" -t nat -A FBWIFI_PREROUTING -j FBWIFI_CLIENT_TO_INTERNET | ||||
| "$IPT4" "$@" -t nat -A FBWIFI_CLIENT_TO_INTERNET -p tcp --dport 80 -m conntrack --ctstate NEW -j FBWIFI_HOST_REDIRLIST | ||||
| "$IPT4" "$@" -t nat -A FBWIFI_CLIENT_TO_INTERNET -p tcp --dport 443 -m conntrack --ctstate NEW -j FBWIFI_HOST_REDIRLIST | ||||
| "$IPT4" "$@" -t nat -A FBWIFI_CLIENT_TO_INTERNET -p udp --dport 443 -m conntrack --ctstate NEW -j FBWIFI_HOST_REDIRLIST | ||||
| "$IPT4" "$@" -t nat -A FBWIFI_CLIENT_TO_INTERNET -p tcp --dport 80 -m conntrack --ctstate NEW -m mark --mark 0xfb -j ACCEPT | ||||
| "$IPT4" "$@" -t nat -A FBWIFI_CLIENT_TO_INTERNET -p tcp --dport 443 -m conntrack --ctstate NEW -m mark --mark 0xfb -j ACCEPT | ||||
| "$IPT4" "$@" -t nat -A FBWIFI_CLIENT_TO_INTERNET -p udp --dport 443 -m conntrack --ctstate NEW -m mark --mark 0xfb -j ACCEPT | ||||
| "$IPT4" "$@" -t nat -A FBWIFI_CLIENT_TO_INTERNET -p tcp --dport 80 -m conntrack --ctstate NEW -j REDIRECT --to-ports "$fbwifi_http_port" | ||||
|  | ||||
| ## Hook custom chains in firewall3 chains | ||||
| $IPT4 -t filter -I "zone_${fbwifi_zone}_input" 2 -j FBWIFI_INPUT | ||||
| $IPT4 -t filter -I "zone_${fbwifi_zone}_forward" 2 -j FBWIFI_FORWARD | ||||
| $IPT4 -t nat -I "zone_${fbwifi_zone}_prerouting" 2 -j FBWIFI_PREROUTING | ||||
| "$IPT4" "$@" -t filter -I "zone_${fbwifi_zone}_input" 2 -j FBWIFI_INPUT | ||||
| "$IPT4" "$@" -t filter -I "zone_${fbwifi_zone}_forward" 2 -j FBWIFI_FORWARD | ||||
| "$IPT4" "$@" -t nat -I "zone_${fbwifi_zone}_prerouting" 2 -j FBWIFI_PREROUTING | ||||
| # There are no firewall3 zone chains in the mangle table so we need to do this for all interfaces in the zone | ||||
| for iface in $fbwifi_ifaces; do | ||||
| 	$IPT4 -t mangle -I PREROUTING -i "$iface" -j FBWIFI_PREROUTING | ||||
| 	"$IPT4" "$@" -t mangle -I PREROUTING -i "$iface" -j FBWIFI_PREROUTING | ||||
| done | ||||
|   | ||||
| @@ -3,7 +3,7 @@ require("uci") | ||||
| log = require("posix.syslog") | ||||
| fbwifi = require("fbwifi") | ||||
|  | ||||
| state = uci.cursor(nil, "/var/state") | ||||
| state = uci.cursor("/var/state", "/tmp/fbwifi") | ||||
| function process_cors() | ||||
| 	origin = os.getenv("HTTP_ORIGIN") | ||||
| 	log.syslog(log.LOG_INFO, string.format("[fbwifi] [auth] process_cors origin %s", origin or 'not found') ) | ||||
| @@ -25,7 +25,7 @@ end | ||||
| method = os.getenv("REQUEST_METHOD") | ||||
| if method == 'GET' then | ||||
| 	log.syslog(log.LOG_INFO, "[fbwifi] [auth] GET handler") | ||||
| 	print("Status: 302") | ||||
| 	print("Status: 302 Found") | ||||
| 	print("Location: "..state:get("fbwifi", "main", "landing_page_url")) | ||||
| 	process_cors() | ||||
| 	print ('\n') | ||||
| @@ -35,7 +35,7 @@ elseif method == 'POST' then | ||||
| 	 | ||||
| 	log.syslog(log.LOG_INFO, "[fbwifi] [auth] POST handler") | ||||
| 	process_cors() | ||||
| 	print("Status: 200") | ||||
| 	print("Status: 200 OK") | ||||
|  | ||||
| 	form_data=io.read() | ||||
| 	while form_data do | ||||
| @@ -43,8 +43,9 @@ elseif method == 'POST' then | ||||
| 		if string.len(token or '') > 14 then | ||||
|  | ||||
| 			client = os.getenv("REMOTE_ADDR") | ||||
| 			f = io.popen("awk '/"..client.."/ { printf(\"%s\", $4) }' /proc/net/arp", 'r') | ||||
| 			f = io.popen("awk '/"..client..".*0x2/ { printf(\"%s\", $4) }' /proc/net/arp", 'r') | ||||
| 			client_mac = assert(f:read('*a')) | ||||
| 			f:close() | ||||
|  | ||||
| 			if fbwifi.validate_token(token) then | ||||
|                                 log.syslog(log.LOG_INFO, string.format( "[fbwifi] [auth] POST handler : Validating Token (%s) for MAC (%s)", token or 'nil', client_mac or 'nil') ) | ||||
|   | ||||
| @@ -2,7 +2,7 @@ | ||||
| json = require("cjson") | ||||
| require("uci") | ||||
|  | ||||
| state = uci.cursor(nil, "/var/state") | ||||
| state = uci.cursor("/var/state", "/tmp/fbwifi") | ||||
| client_mac = "" | ||||
| token = "" | ||||
|  | ||||
| @@ -22,8 +22,9 @@ function map_remote_mac_to_token(client) | ||||
| end | ||||
|  | ||||
| function hasValidToken(client_ip) | ||||
| 	f = io.popen("awk '/"..client_ip.."/ { printf(\"%s\", $4) }' /proc/net/arp", 'r') | ||||
| 	f = io.popen("awk '/"..client_ip..".*0x2/ { printf(\"%s\", $4) }' /proc/net/arp", 'r') | ||||
| 	client_mac = assert(f:read('*a')) | ||||
| 	f:close() | ||||
| 	state:foreach("fbwifi", "client", map_remote_mac_to_token) | ||||
|  | ||||
| 	return 0 < string.len(token) | ||||
|   | ||||
| @@ -1,10 +1,8 @@ | ||||
| #!/usr/bin/lua | ||||
| require "luci.cacheloader" | ||||
| require "luci.sgi.cgi" | ||||
| json = require("cjson") | ||||
| fbwifi = require("fbwifi") | ||||
|  | ||||
| state = uci.cursor(nil, "/var/state") | ||||
| state = uci.cursor("/var/state", "/tmp/fbwifi") | ||||
| GATEWAY_TOKEN = fbwifi.gateway_token() | ||||
|  | ||||
| response = { api_version = "2.0", token = json.null } | ||||
| @@ -38,8 +36,9 @@ function map_remote_mac_to_token(client) | ||||
| end | ||||
|  | ||||
| function getClientToken(client_ip) | ||||
| 	f = io.popen("awk '/"..client_ip.."/ { printf(\"%s\", $4) }' /proc/net/arp", 'r') | ||||
| 	f = io.popen("awk '/"..client_ip..".*0x2/ { printf(\"%s\", $4) }' /proc/net/arp", 'r') | ||||
| 	client_mac = assert(f:read('*a')) | ||||
| 	f:close() | ||||
|  | ||||
| 	state:foreach("fbwifi", "client", map_remote_mac_to_token) | ||||
| end | ||||
|   | ||||
							
								
								
									
										42
									
								
								feeds/ipq807x/kmod-sched-cake/Makefile
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										42
									
								
								feeds/ipq807x/kmod-sched-cake/Makefile
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,42 @@ | ||||
| # | ||||
| # Copyright (C) 2016 LEDE | ||||
| # | ||||
| # This is free software, licensed under the GNU General Public License v2. | ||||
| # See /LICENSE for more information. | ||||
| # | ||||
|  | ||||
| include $(TOPDIR)/rules.mk | ||||
| include $(INCLUDE_DIR)/kernel.mk | ||||
|  | ||||
| PKG_NAME:=sched-cake | ||||
| PKG_RELEASE:=1 | ||||
|  | ||||
| PKG_SOURCE_PROTO:=git | ||||
| PKG_SOURCE_URL:=https://github.com/dtaht/sch_cake.git | ||||
| PKG_SOURCE_DATE:=2021-07-09 | ||||
| PKG_SOURCE_VERSION:=d9e1398cc9091e9e7c7a740361e4617b75c24427 | ||||
| #PKG_MIRROR_HASH:=5bf06a804824db36ae393fc174aeec7b12633176e05a765c0931b39df5bd34df | ||||
| PKG_MAINTAINER:=Kevin Darbyshire-Bryant <ldir@darbyshire-bryant.me.uk> | ||||
|  | ||||
| include $(INCLUDE_DIR)/package.mk | ||||
|  | ||||
| define KernelPackage/sched-cake | ||||
|   SUBMENU:=Network Support | ||||
|   TITLE:=Cake fq_codel/blue derived shaper | ||||
|   URL:=https://github.com/dtaht/sch_cake | ||||
|   FILES:=$(PKG_BUILD_DIR)/sch_cake.ko | ||||
|   AUTOLOAD:=$(call AutoLoad,75,sch_cake) | ||||
|   DEPENDS:=+kmod-ipt-conntrack | ||||
| endef | ||||
|  | ||||
| include $(INCLUDE_DIR)/kernel-defaults.mk | ||||
|  | ||||
| define KernelPackage/sched-cake/description | ||||
|   Common Applications Kept Enhanced fq_codel/blue derived shaper | ||||
| endef | ||||
|  | ||||
| define Build/Compile | ||||
| 	$(KERNEL_MAKE) SUBDIRS="$(PKG_BUILD_DIR)" modules | ||||
| endef | ||||
|  | ||||
| $(eval $(call KernelPackage,sched-cake)) | ||||
							
								
								
									
										20
									
								
								feeds/ipq807x/kmod-sched-cake/patches/100-compat.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										20
									
								
								feeds/ipq807x/kmod-sched-cake/patches/100-compat.patch
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,20 @@ | ||||
| Index: sched-cake-2021-07-09-d9e1398c/cobalt_compat.h | ||||
| =================================================================== | ||||
| --- sched-cake-2021-07-09-d9e1398c.orig/cobalt_compat.h | ||||
| +++ sched-cake-2021-07-09-d9e1398c/cobalt_compat.h | ||||
| @@ -95,15 +95,6 @@ static inline unsigned int __tcp_hdrlen( | ||||
|  } | ||||
|  #endif | ||||
|   | ||||
| -#if KERNEL_VERSION(4, 6, 0) > LINUX_VERSION_CODE | ||||
| -static inline int skb_try_make_writable(struct sk_buff *skb, | ||||
| -					unsigned int write_len) | ||||
| -{ | ||||
| -	return skb_cloned(skb) && !skb_clone_writable(skb, write_len) && | ||||
| -	       pskb_expand_head(skb, 0, 0, GFP_ATOMIC); | ||||
| -} | ||||
| -#endif | ||||
| - | ||||
|  #if KERNEL_VERSION(4, 11, 0) > LINUX_VERSION_CODE | ||||
|  static inline int skb_mac_offset(const struct sk_buff *skb) | ||||
|  { | ||||
| @@ -6,7 +6,7 @@ PKG_SOURCE_PROTO:=git | ||||
| PKG_BRANCH:=master | ||||
| PKG_RELEASE:=2 | ||||
| PKG_SOURCE_URL:=https://source.codeaurora.org/quic/qsdk/oss/lklm/nss-clients/ | ||||
| PKG_VERSION:=9136ef60bf68ceed760781d3acbeddb05470e432 | ||||
| PKG_VERSION:=153998d70fdba508a59a28c13a606032cbf32686 | ||||
|  | ||||
| PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz | ||||
| PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION) | ||||
| @@ -18,23 +18,12 @@ MAKE_OPTS:= | ||||
| include $(INCLUDE_DIR)/package.mk | ||||
|  | ||||
| # Keep default as ipq806x for branches that does not have subtarget framework | ||||
| ifeq ($(CONFIG_TARGET_ipq),y) | ||||
| subtarget:=$(SUBTARGET) | ||||
| else | ||||
| subtarget:=$(CONFIG_TARGET_BOARD) | ||||
| endif | ||||
|  | ||||
| ifneq (, $(findstring $(subtarget), "ipq807x" "ipq807x_ipq807x" "ipq60xx" "ipq807x_ipq60xx")) | ||||
| # DTLS Manager v2.0 for Hawkeye/Cypress | ||||
|   DTLSMGR_DIR:=v2.0 | ||||
| # IPsec Manager v2.0 for Hawkeye/Cypress | ||||
|   IPSECMGR_DIR:=v2.0 | ||||
| else | ||||
| # DTLS Manager v1.0 for Akronite. | ||||
|   DTLSMGR_DIR:=v1.0 | ||||
| # IPsec Manager v1.0 for Akronite. | ||||
|   IPSECMGR_DIR:=v1.0 | ||||
| endif | ||||
|  | ||||
| define KernelPackage/qca-nss-drv-tun6rd | ||||
|   SECTION:=kernel | ||||
| @@ -437,6 +426,20 @@ define Build/InstallDev/qca-nss-clients | ||||
| 	$(CP) $(PKG_BUILD_DIR)/exports/* $(1)/usr/include/qca-nss-clients/ | ||||
| endef | ||||
|  | ||||
| define KernelPackage/qca-nss-drv-wifi-meshmgr | ||||
|   SECTION:=kernel | ||||
|   CATEGORY:=Kernel modules | ||||
|   SUBMENU:=Network Devices | ||||
|   DEPENDS:=+kmod-qca-nss-drv @!LINUX_3_18 | ||||
|   TITLE:=NSS WiFi-Mesh Manager for QCA NSS driver | ||||
|   FILES:=$(PKG_BUILD_DIR)/wifi_meshmgr/qca-nss-wifi-meshmgr.ko | ||||
|   AUTOLOAD:=$(call AutoLoad,51,qca-nss-wifi-meshmgr) | ||||
| endef | ||||
|  | ||||
| define KernelPackage/qca-nss-drv-wifi-meshmgr/Description | ||||
| Kernel module for WiFi Mesh manager | ||||
| endef | ||||
|  | ||||
| define Build/InstallDev | ||||
| 	$(call Build/InstallDev/qca-nss-clients,$(1)) | ||||
| endef | ||||
| @@ -585,6 +588,10 @@ ifneq ($(CONFIG_PACKAGE_kmod-qca-nss-drv-mirror),) | ||||
| MAKE_OPTS+=mirror=y | ||||
| endif | ||||
|  | ||||
| ifneq ($(CONFIG_PACKAGE_kmod-qca-nss-drv-wifi-meshmgr),) | ||||
| MAKE_OPTS+=wifi-meshmgr=y | ||||
| endif | ||||
|  | ||||
| define Build/Compile | ||||
| 	$(MAKE) -C "$(LINUX_DIR)" $(strip $(MAKE_OPTS)) \ | ||||
| 		CROSS_COMPILE="$(TARGET_CROSS)" \ | ||||
| @@ -624,3 +631,4 @@ $(eval $(call KernelPackage,qca-nss-drv-vxlanmgr)) | ||||
| $(eval $(call KernelPackage,qca-nss-drv-match)) | ||||
| #$(eval $(call KernelPackage,qca-nss-drv-tlsmgr)) | ||||
| $(eval $(call KernelPackage,qca-nss-drv-mirror)) | ||||
| $(eval $(call KernelPackage,qca-nss-drv-wifi-meshmgr)) | ||||
|   | ||||
| @@ -30,7 +30,7 @@ NSS_DP_INCLUDE += -I$(obj)/hal/gmac_hal_ops/syn/gmac | ||||
| endif | ||||
|  | ||||
| ccflags-y += $(NSS_DP_INCLUDE) | ||||
| ccflags-y += -Werror | ||||
| ccflags-y += -Wall -Werror | ||||
|  | ||||
| ifeq ($(SoC),$(filter $(SoC),ipq807x ipq807x_64 ipq60xx ipq60xx_64)) | ||||
| ccflags-y += -DNSS_DP_PPE_SUPPORT | ||||
| @@ -43,7 +43,7 @@ endif | ||||
|  | ||||
| ifeq ($(SoC),$(filter $(SoC),ipq807x ipq807x_64)) | ||||
| qca-nss-dp-objs += hal/arch/ipq807x/nss_ipq807x.o | ||||
| ccflags-y += -DNSS_DP_IPQ807X | ||||
| ccflags-y += -DNSS_DP_IPQ807X -DNSS_DP_EDMA_TX_SMALL_PKT_WAR | ||||
| endif | ||||
|  | ||||
| ifeq ($(SoC),$(filter $(SoC),ipq50xx ipq50xx_64)) | ||||
|   | ||||
| @@ -68,8 +68,13 @@ static void nss_dp_hal_tcsr_set(void) | ||||
| 	 * If TZ is not enabled, we can write to the register directly. | ||||
| 	 */ | ||||
| 	if (qcom_scm_is_available()) { | ||||
| #if (LINUX_VERSION_CODE < KERNEL_VERSION(5, 4, 0)) | ||||
| 		err = qcom_scm_tcsr_reg_write((tcsr_base + TCSR_GMAC_AXI_CACHE_OVERRIDE_OFFSET), | ||||
| 						TCSR_GMAC_AXI_CACHE_OVERRIDE_VALUE); | ||||
| #else | ||||
| 		err = qti_scm_tcsr_reg_write((tcsr_base + TCSR_GMAC_AXI_CACHE_OVERRIDE_OFFSET), | ||||
| 						TCSR_GMAC_AXI_CACHE_OVERRIDE_VALUE); | ||||
| #endif | ||||
| 		if (err) { | ||||
| 			pr_err("%s: SCM TCSR write error: %d\n", __func__, err); | ||||
| 		} | ||||
|   | ||||
| @@ -1,5 +1,5 @@ | ||||
| /* | ||||
|  * Copyright (c) 2016-2020, The Linux Foundation. All rights reserved. | ||||
|  * Copyright (c) 2016-2021, The Linux Foundation. All rights reserved. | ||||
|  * | ||||
|  * Permission to use, copy, modify, and/or distribute this software for any | ||||
|  * purpose with or without fee is hereby granted, provided that the above | ||||
| @@ -67,6 +67,76 @@ void edma_reg_write(uint32_t reg_off, uint32_t val) | ||||
| 	writel(val, edma_hw.reg_base + reg_off); | ||||
| } | ||||
|  | ||||
| /* | ||||
|  * edma_disable_interrupts() | ||||
|  *	Disable EDMA RX/TX interrupt masks. | ||||
|  */ | ||||
| static void edma_disable_interrupts(void) | ||||
| { | ||||
| 	struct edma_rxdesc_ring *rxdesc_ring = NULL; | ||||
| 	struct edma_rxfill_ring *rxfill_ring = NULL; | ||||
| 	struct edma_txcmpl_ring *txcmpl_ring = NULL; | ||||
| 	int i; | ||||
|  | ||||
| 	for (i = 0; i < edma_hw.rxdesc_rings; i++) { | ||||
| 		rxdesc_ring = &edma_hw.rxdesc_ring[i]; | ||||
| 		edma_reg_write(EDMA_REG_RXDESC_INT_MASK(rxdesc_ring->id), | ||||
| 			       EDMA_MASK_INT_CLEAR); | ||||
| 	} | ||||
|  | ||||
| 	for (i = 0; i < edma_hw.txcmpl_rings; i++) { | ||||
| 		txcmpl_ring = &edma_hw.txcmpl_ring[i]; | ||||
| 		edma_reg_write(EDMA_REG_TX_INT_MASK(txcmpl_ring->id), | ||||
| 			       EDMA_MASK_INT_CLEAR); | ||||
| 	} | ||||
|  | ||||
| 	for (i = 0; i < edma_hw.rxfill_rings; i++) { | ||||
| 		rxfill_ring = &edma_hw.rxfill_ring[i]; | ||||
| 		edma_reg_write(EDMA_REG_RXFILL_INT_MASK(rxfill_ring->id), | ||||
| 			       EDMA_MASK_INT_CLEAR); | ||||
| 	} | ||||
|  | ||||
| 	/* | ||||
| 	 * Clear MISC interrupt mask. | ||||
| 	 */ | ||||
| 	edma_reg_write(EDMA_REG_MISC_INT_MASK, EDMA_MASK_INT_CLEAR); | ||||
| } | ||||
|  | ||||
| /* | ||||
|  * edma_enable_interrupts() | ||||
|  *	Enable RX/TX EDMA interrupt masks. | ||||
|  */ | ||||
| static void edma_enable_interrupts(void) | ||||
| { | ||||
| 	struct edma_rxdesc_ring *rxdesc_ring = NULL; | ||||
| 	struct edma_rxfill_ring *rxfill_ring = NULL; | ||||
| 	struct edma_txcmpl_ring *txcmpl_ring = NULL; | ||||
| 	int i; | ||||
|  | ||||
| 	for (i = 0; i < edma_hw.rxfill_rings; i++) { | ||||
| 		rxfill_ring = &edma_hw.rxfill_ring[i]; | ||||
| 		edma_reg_write(EDMA_REG_RXFILL_INT_MASK(rxfill_ring->id), | ||||
| 				edma_hw.rxfill_intr_mask); | ||||
| 	} | ||||
|  | ||||
| 	for (i = 0; i < edma_hw.txcmpl_rings; i++) { | ||||
| 		txcmpl_ring = &edma_hw.txcmpl_ring[i]; | ||||
| 		edma_reg_write(EDMA_REG_TX_INT_MASK(txcmpl_ring->id), | ||||
| 				edma_hw.txcmpl_intr_mask); | ||||
| 	} | ||||
|  | ||||
| 	for (i = 0; i < edma_hw.rxdesc_rings; i++) { | ||||
| 		rxdesc_ring = &edma_hw.rxdesc_ring[i]; | ||||
| 		edma_reg_write(EDMA_REG_RXDESC_INT_MASK(rxdesc_ring->id), | ||||
| 				edma_hw.rxdesc_intr_mask); | ||||
| 	} | ||||
|  | ||||
| 	/* | ||||
| 	 * Enable MISC interrupt mask. | ||||
| 	 */ | ||||
| 	edma_reg_write(EDMA_REG_MISC_INT_MASK, edma_hw.misc_intr_mask); | ||||
| } | ||||
|  | ||||
| /* | ||||
|  * nss_dp_edma_if_open() | ||||
|  *	Do slow path data plane open | ||||
| @@ -85,6 +155,12 @@ static int edma_if_open(struct nss_dp_data_plane_ctx *dpc, | ||||
| 		return NSS_DP_SUCCESS; | ||||
|  | ||||
| 	napi_enable(&edma_hw.napi); | ||||
|  | ||||
| 	/* | ||||
| 	 * Enable the interrupt masks. | ||||
| 	 */ | ||||
| 	edma_enable_interrupts(); | ||||
|  | ||||
| 	return NSS_DP_SUCCESS; | ||||
| } | ||||
|  | ||||
| @@ -97,6 +173,11 @@ static int edma_if_close(struct nss_dp_data_plane_ctx *dpc) | ||||
| 	if (--edma_hw.active != 0) | ||||
| 		return NSS_DP_SUCCESS; | ||||
|  | ||||
| 	/* | ||||
| 	 * Disable the interrupt masks. | ||||
| 	 */ | ||||
| 	edma_disable_interrupts(); | ||||
|  | ||||
| 	/* | ||||
| 	 * Disable NAPI | ||||
| 	 */ | ||||
| @@ -311,9 +392,6 @@ static int edma_if_deinit(struct nss_dp_data_plane_ctx *dpc) | ||||
|  */ | ||||
| static int edma_irq_init(void) | ||||
| { | ||||
| 	struct edma_rxdesc_ring *rxdesc_ring = NULL; | ||||
| 	struct edma_rxfill_ring *rxfill_ring = NULL; | ||||
| 	struct edma_txcmpl_ring *txcmpl_ring = NULL; | ||||
| 	int err; | ||||
| 	uint32_t entry_num, i; | ||||
|  | ||||
| @@ -433,28 +511,6 @@ static int edma_irq_init(void) | ||||
| 		goto misc_intr_req_fail; | ||||
| 	} | ||||
|  | ||||
| 	/* | ||||
| 	 * Set interrupt mask | ||||
| 	 */ | ||||
| 	for (i = 0; i < edma_hw.rxfill_rings; i++) { | ||||
| 		rxfill_ring = &edma_hw.rxfill_ring[i]; | ||||
| 		edma_reg_write(EDMA_REG_RXFILL_INT_MASK(rxfill_ring->id), | ||||
| 				edma_hw.rxfill_intr_mask); | ||||
| 	} | ||||
|  | ||||
| 	for (i = 0; i < edma_hw.txcmpl_rings; i++) { | ||||
| 		txcmpl_ring = &edma_hw.txcmpl_ring[i]; | ||||
| 		edma_reg_write(EDMA_REG_TX_INT_MASK(txcmpl_ring->id), | ||||
| 				edma_hw.txcmpl_intr_mask); | ||||
| 	} | ||||
|  | ||||
| 	for (i = 0; i < edma_hw.rxdesc_rings; i++) { | ||||
| 		rxdesc_ring = &edma_hw.rxdesc_ring[i]; | ||||
| 		edma_reg_write(EDMA_REG_RXDESC_INT_MASK(rxdesc_ring->id), | ||||
| 				edma_hw.rxdesc_intr_mask); | ||||
| 	} | ||||
|  | ||||
| 	edma_reg_write(EDMA_REG_MISC_INT_MASK, edma_hw.misc_intr_mask); | ||||
| 	return 0; | ||||
|  | ||||
| misc_intr_req_fail: | ||||
|   | ||||
| @@ -1,6 +1,6 @@ | ||||
| /* | ||||
|  ************************************************************************** | ||||
|  * Copyright (c) 2016, 2018-2020, The Linux Foundation. All rights reserved. | ||||
|  * Copyright (c) 2016, 2018-2021, The Linux Foundation. All rights reserved. | ||||
|  * | ||||
|  * Permission to use, copy, modify, and/or distribute this software for | ||||
|  * any purpose with or without fee is hereby granted, provided that the | ||||
| @@ -30,7 +30,7 @@ | ||||
| #define EDMA_NAPI_WORK			100 | ||||
| #define EDMA_START_GMACS		NSS_DP_START_IFNUM | ||||
| #define EDMA_MAX_GMACS			NSS_DP_HAL_MAX_PORTS | ||||
| #define EDMA_TX_PKT_MIN_SIZE		33 | ||||
| #define EDMA_TX_PKT_MIN_SIZE		33	/* IPQ807x EDMA needs a minimum packet size of 33 bytes */ | ||||
| #if defined(NSS_DP_IPQ60XX) | ||||
| #define EDMA_MAX_TXCMPL_RINGS		24	/* Max TxCmpl rings */ | ||||
| #else | ||||
|   | ||||
| @@ -1,5 +1,5 @@ | ||||
| /* | ||||
|  * Copyright (c) 2016-2018, 2020, The Linux Foundation. All rights reserved. | ||||
|  * Copyright (c) 2016-2018, 2020-21, The Linux Foundation. All rights reserved. | ||||
|  * | ||||
|  * Permission to use, copy, modify, and/or distribute this software for any | ||||
|  * purpose with or without fee is hereby granted, provided that the above | ||||
| @@ -524,7 +524,7 @@ enum edma_tx edma_ring_xmit(struct edma_hw *ehw, | ||||
| { | ||||
| 	struct nss_dp_dev *dp_dev = netdev_priv(netdev); | ||||
| 	struct edma_txdesc_desc *txdesc = NULL; | ||||
| 	uint16_t buf_len = skb_headlen(skb); | ||||
| 	uint16_t buf_len; | ||||
| 	uint16_t hw_next_to_use, hw_next_to_clean, chk_idx; | ||||
| 	uint32_t data; | ||||
| 	uint32_t store_index = 0; | ||||
| @@ -560,6 +560,28 @@ enum edma_tx edma_ring_xmit(struct edma_hw *ehw, | ||||
| 		return EDMA_TX_DESC; | ||||
| 	} | ||||
|  | ||||
| #if defined(NSS_DP_EDMA_TX_SMALL_PKT_WAR) | ||||
| 	/* | ||||
| 	 * IPQ807x EDMA hardware can't process the packet if the packet size is | ||||
| 	 * less than EDMA_TX_PKT_MIN_SIZE (33 Byte). So, if the packet size | ||||
| 	 * is indeed less than EDMA_TX_PKT_MIN_SIZE, perform padding | ||||
| 	 * (if possible), otherwise drop the packet. | ||||
| 	 * Using skb_padto() API for padding the packet. This API will drop | ||||
| 	 * the packet if the padding is not possible. | ||||
| 	 */ | ||||
| 	if (unlikely(skb->len < EDMA_TX_PKT_MIN_SIZE)) { | ||||
| 		if (skb_padto(skb, EDMA_TX_PKT_MIN_SIZE)) { | ||||
| 			netdev_dbg(netdev, "padding couldn't happen, skb is freed.\n"); | ||||
| 			netdev->stats.tx_dropped++; | ||||
| 			spin_unlock_bh(&txdesc_ring->tx_lock); | ||||
| 			return EDMA_TX_OK; | ||||
| 		} | ||||
| 		skb->len = EDMA_TX_PKT_MIN_SIZE; | ||||
| 	} | ||||
| #endif | ||||
|  | ||||
| 	buf_len = skb_headlen(skb); | ||||
|  | ||||
| 	/* | ||||
| 	 * Deliver the ptp packet to phy driver for TX timestamping | ||||
| 	 */ | ||||
|   | ||||
| @@ -1,6 +1,6 @@ | ||||
| /* | ||||
|  ************************************************************************** | ||||
|  * Copyright (c) 2017-2020, The Linux Foundation. All rights reserved. | ||||
|  * Copyright (c) 2017-2021, The Linux Foundation. All rights reserved. | ||||
|  * | ||||
|  * Permission to use, copy, modify, and/or distribute this software for | ||||
|  * any purpose with or without fee is hereby granted, provided that the | ||||
| @@ -208,6 +208,10 @@ static int nss_dp_attr_set(struct net_device *dev, | ||||
| 				struct switchdev_trans *trans) | ||||
| { | ||||
| 	struct nss_dp_dev *dp_priv = (struct nss_dp_dev *)netdev_priv(dev); | ||||
| 	struct net_device *upper_dev; | ||||
| 	struct vlan_dev_priv *vlan; | ||||
| 	struct list_head *iter; | ||||
| 	uint32_t stp_state = attr->u.stp_state; | ||||
|  | ||||
| 	if (switchdev_trans_ph_prepare(trans)) | ||||
| 		return 0; | ||||
| @@ -218,7 +222,33 @@ static int nss_dp_attr_set(struct net_device *dev, | ||||
| 		netdev_dbg(dev, "set brport_flags %lu\n", attr->u.brport_flags); | ||||
| 		return 0; | ||||
| 	case SWITCHDEV_ATTR_ID_PORT_STP_STATE: | ||||
| 		return nss_dp_stp_state_set(dp_priv, attr->u.stp_state); | ||||
| 		/* | ||||
| 		 * The stp state is not changed to FAL_STP_DISABLED if | ||||
| 		 * the net_device (dev) has any vlan configured. Otherwise | ||||
| 		 * traffic on other vlan(s) will not work. | ||||
| 		 * | ||||
| 		 * Note: STP for VLANs is not supported by PPE. | ||||
| 		 */ | ||||
| 		if ((stp_state == BR_STATE_DISABLED) || | ||||
| 			(stp_state == BR_STATE_BLOCKING)) { | ||||
| 			rcu_read_lock(); | ||||
| 			netdev_for_each_upper_dev_rcu(dev, upper_dev, iter) { | ||||
| 				if (!is_vlan_dev(upper_dev)) | ||||
| 					continue; | ||||
|  | ||||
| 				vlan = vlan_dev_priv(upper_dev); | ||||
| 				if (vlan->real_dev == dev) { | ||||
| 					rcu_read_unlock(); | ||||
| 					netdev_dbg(dev, "Do not update stp state to: %u since vlan id: %d is configured on netdevice: %s\n", | ||||
| 							stp_state, vlan->vlan_id, vlan->real_dev->name); | ||||
| 					return 0; | ||||
| 				} | ||||
| 			} | ||||
|  | ||||
| 			rcu_read_unlock(); | ||||
| 		} | ||||
|  | ||||
| 		return nss_dp_stp_state_set(dp_priv, stp_state); | ||||
| 	default: | ||||
| 		return -EOPNOTSUPP; | ||||
| 	} | ||||
|   | ||||
| @@ -46,7 +46,7 @@ ifneq (, $(findstring $(subtarget), "ipq807x" "ipq807x_64" "ipq60xx" "ipq60xx_64 | ||||
| endif | ||||
| endef | ||||
|  | ||||
| EXTRA_CFLAGS+= -I$(STAGING_DIR)/usr/include/qca-nss-gmac -I$(STAGING_DIR)/usr/include/qca-nss-dp | ||||
| EXTRA_CFLAGS+= -I$(STAGING_DIR)/usr/include/qca-nss-gmac -I$(STAGING_DIR)/usr/include/qca-nss-dp -I$(STAGING_DIR)/usr/include/qca-ssdk | ||||
|  | ||||
| # Keeping default as ipq806x for branches that does not have subtarget framework | ||||
| subtarget:=$(SUBTARGET) | ||||
|   | ||||
| @@ -8,8 +8,6 @@ obj-m += qca-nss-drv.o | ||||
| # List the files that belong to the driver in alphabetical order. | ||||
| # | ||||
| qca-nss-drv-objs := \ | ||||
| 			nss_bridge.o \ | ||||
| 			nss_bridge_log.o \ | ||||
| 			nss_cmn.o \ | ||||
| 			nss_core.o \ | ||||
| 			nss_coredump.o \ | ||||
| @@ -29,16 +27,6 @@ qca-nss-drv-objs := \ | ||||
| 			nss_ipv4_stats.o \ | ||||
| 			nss_ipv4_strings.o \ | ||||
| 			nss_ipv4_log.o \ | ||||
| 			nss_ipv4_reasm.o \ | ||||
| 			nss_ipv4_reasm_stats.o \ | ||||
| 			nss_ipv4_reasm_strings.o \ | ||||
| 			nss_ipv6.o \ | ||||
| 			nss_ipv6_stats.o \ | ||||
| 			nss_ipv6_strings.o \ | ||||
| 			nss_ipv6_log.o \ | ||||
| 			nss_ipv6_reasm.o \ | ||||
| 			nss_ipv6_reasm_stats.o \ | ||||
| 			nss_ipv6_reasm_strings.o \ | ||||
| 			nss_log.o \ | ||||
| 			nss_lso_rx.o \ | ||||
| 			nss_lso_rx_stats.o \ | ||||
| @@ -70,21 +58,48 @@ qca-nss-drv-objs := \ | ||||
| 			nss_wifi_log.o \ | ||||
| 			nss_wifi_stats.o \ | ||||
| 			nss_wifi_vdev.o \ | ||||
| 			nss_wifi_if.o \ | ||||
| 			nss_wifi_if_stats.o \ | ||||
| 			nss_wifili.o \ | ||||
| 			nss_wifili_log.o \ | ||||
| 			nss_wifili_stats.o \ | ||||
| 			nss_wifili_strings.o \ | ||||
| 			nss_wifi_mac_db.o \ | ||||
| 			nss_wifi_ext_vdev.o \ | ||||
| 			nss_wifi_ext_vdev_stats.o \ | ||||
| 			nss_wifi_ext_vdev_log.o | ||||
| 			nss_wifi_mac_db.o | ||||
|  | ||||
| # Base NSS data plane/HAL support | ||||
| qca-nss-drv-objs += nss_data_plane/nss_data_plane_common.o | ||||
| qca-nss-drv-objs += nss_hal/nss_hal.o | ||||
|  | ||||
| ifneq "$(NSS_DRV_BRIDGE_ENABLE)" "n" | ||||
| ccflags-y += -DNSS_DRV_BRIDGE_ENABLE | ||||
| qca-nss-drv-objs += \ | ||||
| 		    nss_bridge.o \ | ||||
| 		    nss_bridge_log.o | ||||
| endif | ||||
|  | ||||
| ifneq "$(NSS_DRV_WIFI_EXT_VDEV_ENABLE)" "n" | ||||
| ccflags-y += -DNSS_DRV_WIFI_EXT_VDEV_ENABLE | ||||
| qca-nss-drv-objs += \ | ||||
| 		    nss_wifi_ext_vdev.o \ | ||||
| 		    nss_wifi_ext_vdev_stats.o \ | ||||
| 		    nss_wifi_ext_vdev_log.o | ||||
| endif | ||||
|  | ||||
| ifneq "$(NSS_DRV_WIFI_MESH_ENABLE)" "n" | ||||
| ccflags-y += -DNSS_DRV_WIFI_MESH_ENABLE | ||||
| qca-nss-drv-objs += \ | ||||
| 		    nss_wifi_mesh.o \ | ||||
| 		    nss_wifi_mesh_log.o \ | ||||
| 		    nss_wifi_mesh_stats.o \ | ||||
| 		    nss_wifi_mesh_strings.o | ||||
| endif | ||||
|  | ||||
| ifneq "$(NSS_DRV_IPV4_REASM_ENABLE)" "n" | ||||
| ccflags-y += -DNSS_DRV_IPV4_REASM_ENABLE | ||||
| qca-nss-drv-objs += \ | ||||
| 		    nss_ipv4_reasm.o \ | ||||
| 		    nss_ipv4_reasm_stats.o \ | ||||
| 		    nss_ipv4_reasm_strings.o | ||||
| endif | ||||
|  | ||||
| ifneq "$(NSS_DRV_L2TP_ENABLE)" "n" | ||||
| ccflags-y += -DNSS_DRV_L2TP_ENABLE | ||||
| qca-nss-drv-objs += \ | ||||
| @@ -109,6 +124,22 @@ qca-nss-drv-objs += \ | ||||
| 			 nss_pvxlan_stats.o | ||||
| endif | ||||
|  | ||||
| ifneq "$(NSS_DRV_IPV6_ENABLE)" "n" | ||||
| ccflags-y += -DNSS_DRV_IPV6_ENABLE | ||||
| qca-nss-drv-objs += \ | ||||
| 			nss_ipv6.o \ | ||||
| 			nss_ipv6_stats.o \ | ||||
| 			nss_ipv6_strings.o \ | ||||
| 			nss_ipv6_log.o | ||||
| ifneq "$(NSS_DRV_IPV6_REASM_ENABLE)" "n" | ||||
| ccflags-y += -DNSS_DRV_IPV6_REASM_ENABLE | ||||
| qca-nss-drv-objs += \ | ||||
| 		    nss_ipv6_reasm.o \ | ||||
| 		    nss_ipv6_reasm_stats.o \ | ||||
| 		    nss_ipv6_reasm_strings.o | ||||
| endif | ||||
| endif | ||||
|  | ||||
| ifneq "$(NSS_DRV_TSTAMP_ENABLE)" "n" | ||||
| ccflags-y += -DNSS_DRV_TSTAMP_ENABLE | ||||
| qca-nss-drv-objs += \ | ||||
| @@ -121,7 +152,8 @@ ccflags-y += -DNSS_DRV_GRE_ENABLE | ||||
| qca-nss-drv-objs += \ | ||||
| 			 nss_gre.o \ | ||||
| 			 nss_gre_log.o \ | ||||
| 			 nss_gre_stats.o | ||||
| 			 nss_gre_stats.o \ | ||||
| 			 nss_gre_strings.o | ||||
| endif | ||||
|  | ||||
| ifneq "$(NSS_DRV_GRE_REDIR_ENABLE)" "n" | ||||
| @@ -132,13 +164,17 @@ qca-nss-drv-objs += \ | ||||
| 			 nss_gre_redir_lag_ds.o \ | ||||
| 			 nss_gre_redir_lag_ds_log.o \ | ||||
| 			 nss_gre_redir_lag_ds_stats.o \ | ||||
| 			 nss_gre_redir_lag_ds_strings.o \ | ||||
| 			 nss_gre_redir_lag_us.o \ | ||||
| 			 nss_gre_redir_lag_us_log.o \ | ||||
| 			 nss_gre_redir_lag_us_stats.o \ | ||||
| 			 nss_gre_redir_lag_us_strings.o \ | ||||
| 			 nss_gre_redir_stats.o \ | ||||
| 			 nss_gre_redir_strings.o \ | ||||
| 			 nss_gre_redir_mark.o \ | ||||
| 			 nss_gre_redir_mark_log.o \ | ||||
| 			 nss_gre_redir_mark_stats.o | ||||
| 			 nss_gre_redir_mark_stats.o \ | ||||
| 			 nss_gre_redir_mark_strings.o | ||||
| endif | ||||
|  | ||||
| ifneq "$(NSS_DRV_GRE_TUNNEL_ENABLE)" "n" | ||||
| @@ -146,7 +182,8 @@ ccflags-y += -DNSS_DRV_GRE_TUNNEL_ENABLE | ||||
| qca-nss-drv-objs += \ | ||||
| 			 nss_gre_tunnel.o \ | ||||
| 			 nss_gre_tunnel_log.o \ | ||||
| 			 nss_gre_tunnel_stats.o | ||||
| 			 nss_gre_tunnel_stats.o \ | ||||
| 			 nss_gre_tunnel_strings.o | ||||
| endif | ||||
|  | ||||
| ifneq "$(NSS_DRV_CAPWAP_ENABLE)" "n" | ||||
| @@ -255,7 +292,8 @@ ccflags-y += -DNSS_DRV_CLMAP_ENABLE | ||||
| qca-nss-drv-objs += \ | ||||
| 			 nss_clmap.o \ | ||||
| 			 nss_clmap_log.o \ | ||||
| 			 nss_clmap_stats.o | ||||
| 			 nss_clmap_stats.o \ | ||||
| 			 nss_clmap_strings.o | ||||
| endif | ||||
|  | ||||
|  | ||||
| @@ -272,7 +310,8 @@ ccflags-y += -DNSS_DRV_MATCH_ENABLE | ||||
| qca-nss-drv-objs += \ | ||||
| 			nss_match.o \ | ||||
| 			nss_match_log.o \ | ||||
| 			nss_match_stats.o | ||||
| 			nss_match_stats.o \ | ||||
| 			nss_match_strings.o | ||||
| endif | ||||
|  | ||||
| ifneq "$(NSS_DRV_MIRROR_ENABLE)" "n" | ||||
| @@ -280,7 +319,17 @@ ccflags-y += -DNSS_DRV_MIRROR_ENABLE | ||||
| qca-nss-drv-objs += \ | ||||
| 			nss_mirror.o \ | ||||
| 			nss_mirror_log.o \ | ||||
| 			nss_mirror_stats.o | ||||
| 			nss_mirror_stats.o \ | ||||
| 			nss_mirror_strings.o | ||||
| endif | ||||
|  | ||||
| ifneq "$(NSS_DRV_UDP_ST_ENABLE)" "n" | ||||
| ccflags-y += -DNSS_DRV_UDP_ST_ENABLE | ||||
| qca-nss-drv-objs += \ | ||||
| 			nss_udp_st.o \ | ||||
| 			nss_udp_st_log.o \ | ||||
| 			nss_udp_st_stats.o \ | ||||
| 			nss_udp_st_strings.o | ||||
| endif | ||||
|  | ||||
| ifeq ($(SoC),$(filter $(SoC),ipq806x)) | ||||
| @@ -330,6 +379,7 @@ qca-nss-drv-objs += nss_data_plane/nss_data_plane.o \ | ||||
| 					nss_ppe.o \ | ||||
| 					nss_ppe_log.o \ | ||||
| 					nss_ppe_stats.o \ | ||||
| 					nss_ppe_strings.o \ | ||||
| 					nss_ppe_vp.o \ | ||||
| 					nss_ppe_vp_log.o \ | ||||
| 					nss_ppe_vp_stats.o | ||||
| @@ -341,7 +391,9 @@ ifneq "$(NSS_DRV_IPSEC_ENABLE)" "n" | ||||
| ccflags-y += -DNSS_DRV_IPSEC_ENABLE | ||||
| qca-nss-drv-objs += \ | ||||
| 		    nss_ipsec_cmn_log.o \ | ||||
| 		    nss_ipsec_cmn.o | ||||
| 		    nss_ipsec_cmn.o \ | ||||
| 		    nss_ipsec_cmn_stats.o \ | ||||
| 		    nss_ipsec_cmn_strings.o | ||||
| endif | ||||
|  | ||||
| ifneq "$(NSS_DRV_CRYPTO_ENABLE)" "n" | ||||
| @@ -351,6 +403,8 @@ ccflags-y += -DNSS_DRV_DMA_ENABLE | ||||
| qca-nss-drv-objs += \ | ||||
| 		    nss_crypto_cmn.o \ | ||||
| 		    nss_crypto_cmn_log.o \ | ||||
| 		    nss_crypto_cmn_stats.o \ | ||||
| 		    nss_crypto_cmn_strings.o \ | ||||
| 		    nss_dma.o \ | ||||
| 		    nss_dma_log.o \ | ||||
| 		    nss_dma_stats.o \ | ||||
| @@ -361,21 +415,26 @@ ifneq "$(NSS_DRV_DTLS_ENABLE)" "n" | ||||
| ccflags-y += -DNSS_DRV_DTLS_ENABLE | ||||
| qca-nss-drv-objs += \ | ||||
| 		    nss_dtls_cmn.o \ | ||||
| 		    nss_dtls_cmn_log.o | ||||
| 		    nss_dtls_cmn_log.o \ | ||||
| 		    nss_dtls_cmn_stats.o \ | ||||
| 		    nss_dtls_cmn_strings.o | ||||
| endif | ||||
|  | ||||
| ifneq "$(NSS_DRV_QVPN_ENABLE)" "n" | ||||
| ccflags-y += -DNSS_DRV_QVPN_ENABLE | ||||
| qca-nss-drv-objs += \ | ||||
| 	     nss_qvpn.o \ | ||||
| 	     nss_qvpn_log.o \ | ||||
| 	     nss_qvpn_stats.o \ | ||||
|              nss_qvpn_log.o | ||||
| 	     nss_qvpn_strings.o | ||||
| endif | ||||
| ifneq "$(NSS_DRV_TLS_ENABLE)" "n" | ||||
| ccflags-y += -DNSS_DRV_TLS_ENABLE | ||||
| qca-nss-drv-objs += \ | ||||
| 		     nss_tls.o \ | ||||
| 		     nss_tls_log.o | ||||
| 		     nss_tls_log.o \ | ||||
| 		     nss_tls_stats.o \ | ||||
| 		     nss_tls_strings.o | ||||
| endif | ||||
| endif | ||||
|  | ||||
| @@ -411,21 +470,27 @@ ifneq "$(NSS_DRV_IPSEC_ENABLE)" "n" | ||||
| ccflags-y += -DNSS_DRV_IPSEC_ENABLE | ||||
| qca-nss-drv-objs += \ | ||||
| 		    nss_ipsec_cmn_log.o \ | ||||
| 		    nss_ipsec_cmn.o | ||||
| 		    nss_ipsec_cmn.o \ | ||||
| 		    nss_ipsec_cmn_stats.o \ | ||||
| 		    nss_ipsec_cmn_strings.o | ||||
| endif | ||||
|  | ||||
| ifneq "$(NSS_DRV_CRYPTO_ENABLE)" "n" | ||||
| ccflags-y += -DNSS_DRV_CRYPTO_ENABLE | ||||
| qca-nss-drv-objs += \ | ||||
| 		    nss_crypto_cmn.o \ | ||||
| 		    nss_crypto_cmn_log.o | ||||
| 		    nss_crypto_cmn_log.o \ | ||||
| 		    nss_crypto_cmn_stats.o \ | ||||
| 		    nss_crypto_cmn_strings.o | ||||
| endif | ||||
|  | ||||
| ifneq "$(NSS_DRV_DTLS_ENABLE)" "n" | ||||
| ccflags-y += -DNSS_DRV_DTLS_ENABLE | ||||
| qca-nss-drv-objs += \ | ||||
| 		    nss_dtls_cmn.o \ | ||||
| 		    nss_dtls_cmn_log.o | ||||
| 		    nss_dtls_cmn_log.o \ | ||||
| 		    nss_dtls_cmn_stats.o \ | ||||
| 		    nss_dtls_cmn_strings.o | ||||
| endif | ||||
| ccflags-y += -I$(obj)/nss_hal/ipq50xx -DNSS_HAL_IPQ50XX_SUPPORT -DNSS_MULTI_H2N_DATA_RING_SUPPORT | ||||
| endif | ||||
| @@ -433,7 +498,7 @@ endif | ||||
| ccflags-y += -I$(obj)/nss_hal/include -I$(obj)/nss_data_plane/include -I$(obj)/exports -DNSS_DEBUG_LEVEL=0 -DNSS_PKT_STATS_ENABLED=1 | ||||
| ccflags-y += -I$(obj)/nss_data_plane/hal/include | ||||
| ccflags-y += -DNSS_PM_DEBUG_LEVEL=0 -DNSS_SKB_REUSE_SUPPORT=1 | ||||
| ccflags-y += -Werror | ||||
| ccflags-y += -Wall -Werror | ||||
|  | ||||
| KERNELVERSION := $(word 1, $(subst ., ,$(KERNELVERSION))).$(word 2, $(subst ., ,$(KERNELVERSION))) | ||||
|  | ||||
|   | ||||
							
								
								
									
										524
									
								
								feeds/ipq807x/qca-nss-drv/src/exports/nss_api_if.h
									
									
									
									
									
										
										
										Normal file → Executable file
									
								
							
							
						
						
									
										524
									
								
								feeds/ipq807x/qca-nss-drv/src/exports/nss_api_if.h
									
									
									
									
									
										
										
										Normal file → Executable file
									
								
							| @@ -1,6 +1,6 @@ | ||||
| /* | ||||
|  ************************************************************************** | ||||
|  * Copyright (c) 2013-2020, The Linux Foundation. All rights reserved. | ||||
|  * Copyright (c) 2013-2021, The Linux Foundation. All rights reserved. | ||||
|  * Permission to use, copy, modify, and/or distribute this software for | ||||
|  * any purpose with or without fee is hereby granted, provided that the | ||||
|  * above copyright notice and this permission notice appear in all copies. | ||||
| @@ -65,7 +65,6 @@ | ||||
| #include "nss_wifi_vdev.h" | ||||
| #include "nss_n2h.h" | ||||
| #include "nss_rps.h" | ||||
| #include "nss_wifi_if.h" | ||||
| #include "nss_portid.h" | ||||
| #include "nss_oam.h" | ||||
| #include "nss_dtls.h" | ||||
| @@ -100,6 +99,10 @@ | ||||
| #include "nss_lso_rx.h" | ||||
| #include "nss_wifi_mac_db_if.h" | ||||
| #include "nss_wifi_ext_vdev_if.h" | ||||
| #include "nss_wifili_if.h" | ||||
| #include "nss_ppe_vp.h" | ||||
| #include "nss_wifi_mesh.h" | ||||
| #include "nss_udp_st.h" | ||||
| #endif | ||||
|  | ||||
| #endif /*__KERNEL__ */ | ||||
| @@ -120,7 +123,7 @@ | ||||
| #define NSS_MAX_PHYSICAL_INTERFACES 8	/**< Maximum number of physical interfaces. */ | ||||
| #define NSS_MAX_VIRTUAL_INTERFACES 16	/**< Maximum number of virtual interfaces. */ | ||||
| #define NSS_MAX_TUNNEL_INTERFACES 4	/**< Maximum number of tunnel interfaces. */ | ||||
| #define NSS_MAX_SPECIAL_INTERFACES 68	/**< Maximum number of special interfaces. */ | ||||
| #define NSS_MAX_SPECIAL_INTERFACES 69	/**< Maximum number of special interfaces. */ | ||||
| #define NSS_MAX_WIFI_RADIO_INTERFACES 3	/**< Maximum number of radio interfaces. */ | ||||
|  | ||||
| /* | ||||
| @@ -271,511 +274,12 @@ | ||||
| #define NSS_DMA_INTERFACE (NSS_SPECIAL_IF_START + 66) | ||||
| 		/**< Special interface number for the DMA interface. */ | ||||
| #define NSS_WIFI_EXT_VDEV_INTERFACE (NSS_SPECIAL_IF_START + 67) | ||||
| 		/**< Special interface number for WiFi extended virtual interface. */ | ||||
|  | ||||
| 		/**< Special interface number for the Wi-Fi extended virtual interface. */ | ||||
| #define NSS_UDP_ST_INTERFACE (NSS_SPECIAL_IF_START + 68) | ||||
| 		/**< Special interface number for the UDP speed test interface. */ | ||||
|  | ||||
| #ifdef __KERNEL__ /* only kernel will use. */ | ||||
|  | ||||
| /** | ||||
|  * Wireless Multimedia Extention Access Category to TID. @hideinitializer | ||||
|  */ | ||||
| #define NSS_WIFILI_WME_AC_TO_TID(_ac) (	\ | ||||
| 		((_ac) == NSS_WIFILI_WME_AC_VO) ? 6 : \ | ||||
| 		(((_ac) == NSS_WIFILI_WME_AC_VI) ? 5 : \ | ||||
| 		(((_ac) == NSS_WIFILI_WME_AC_BK) ? 1 : \ | ||||
| 		0))) | ||||
|  | ||||
| /** | ||||
|  * Wireless TID to Wireless Extension Multimedia Access Category. @hideinitializer | ||||
|  */ | ||||
| #define NSS_WIFILI_TID_TO_WME_AC(_tid) (	\ | ||||
| 		(((_tid) == 0) || ((_tid) == 3)) ? NSS_WIFILI_WME_AC_BE : \ | ||||
| 		((((_tid) == 1) || ((_tid) == 2)) ? NSS_WIFILI_WME_AC_BK : \ | ||||
| 		((((_tid) == 4) || ((_tid) == 5)) ? NSS_WIFILI_WME_AC_VI : \ | ||||
| 		NSS_WIFILI_WME_AC_VO))) | ||||
|  | ||||
| /** | ||||
|  * Converts the format of an IPv6 address from Linux to NSS. @hideinitializer | ||||
|  */ | ||||
| #define IN6_ADDR_TO_IPV6_ADDR(ipv6, in6) \ | ||||
| 	{ \ | ||||
| 		((uint32_t *)ipv6)[0] = in6.in6_u.u6_addr32[0]; \ | ||||
| 		((uint32_t *)ipv6)[1] = in6.in6_u.u6_addr32[1]; \ | ||||
| 		((uint32_t *)ipv6)[2] = in6.in6_u.u6_addr32[2]; \ | ||||
| 		((uint32_t *)ipv6)[3] = in6.in6_u.u6_addr32[3]; \ | ||||
| 	} | ||||
|  | ||||
| /** | ||||
|  * Converts the format of an IPv6 address from NSS to Linux. @hideinitializer | ||||
|  */ | ||||
| #define IPV6_ADDR_TO_IN6_ADDR(in6, ipv6) \ | ||||
| 	{ \ | ||||
| 		in6.in6_u.u6_addr32[0] = ((uint32_t *)ipv6)[0]; \ | ||||
| 		in6.in6_u.u6_addr32[1] = ((uint32_t *)ipv6)[1]; \ | ||||
| 		in6.in6_u.u6_addr32[2] = ((uint32_t *)ipv6)[2]; \ | ||||
| 		in6.in6_u.u6_addr32[3] = ((uint32_t *)ipv6)[3]; \ | ||||
| 	} | ||||
|  | ||||
| /** | ||||
|  * Format of an IPv6 address (16 * 8 bits). | ||||
|  */ | ||||
| #define IPV6_ADDR_OCTAL_FMT "%04x:%04x:%04x:%04x:%04x:%04x:%04x:%04x" | ||||
|  | ||||
| /** | ||||
|  * Prints an IPv6 address (16 * 8 bits). | ||||
|  */ | ||||
| #define IPV6_ADDR_TO_OCTAL(ipv6) ((uint16_t *)ipv6)[0], ((uint16_t *)ipv6)[1], ((uint16_t *)ipv6)[2], ((uint16_t *)ipv6)[3], ((uint16_t *)ipv6)[4], ((uint16_t *)ipv6)[5], ((uint16_t *)ipv6)[6], ((uint16_t *)ipv6)[7] | ||||
|  | ||||
| /* | ||||
|  * IPv4 rule sync reasons. | ||||
|  */ | ||||
| #define NSS_IPV4_SYNC_REASON_STATS 0	/**< Rule for synchronizing statistics. */ | ||||
| #define NSS_IPV4_SYNC_REASON_FLUSH 1	/**< Rule for flushing a cache entry. */ | ||||
| #define NSS_IPV4_SYNC_REASON_EVICT 2	/**< Rule for evicting a cache entry. */ | ||||
| #define NSS_IPV4_SYNC_REASON_DESTROY 3 | ||||
| 		/**< Rule for destroying a cache entry (requested by the host OS). */ | ||||
| #define NSS_IPV4_SYNC_REASON_PPPOE_DESTROY 4 | ||||
| 		/**< Rule for destroying a cache entry that belongs to a PPPoE session. */ | ||||
|  | ||||
| /** | ||||
|  * nss_ipv4_create | ||||
|  *	Information for an IPv4 flow or connection create rule. | ||||
|  * | ||||
|  * All fields must be passed in host-endian order. | ||||
|  */ | ||||
| struct nss_ipv4_create { | ||||
| 	int32_t src_interface_num; | ||||
| 				/**< Source interface number (virtual or physical). */ | ||||
| 	int32_t dest_interface_num; | ||||
| 				/**< Destination interface number (virtual or physical). */ | ||||
| 	int32_t protocol;	/**< L4 protocol (e.g., TCP or UDP). */ | ||||
| 	uint32_t flags;		/**< Flags (if any) associated with this rule. */ | ||||
| 	uint32_t from_mtu;	/**< MTU of the incoming interface. */ | ||||
| 	uint32_t to_mtu;	/**< MTU of the outgoing interface. */ | ||||
| 	uint32_t src_ip;	/**< Source IP address. */ | ||||
| 	int32_t src_port;	/**< Source L4 port (e.g., TCP or UDP port). */ | ||||
| 	uint32_t src_ip_xlate;	/**< Translated source IP address (used with SNAT). */ | ||||
| 	int32_t src_port_xlate;	/**< Translated source L4 port (used with SNAT). */ | ||||
| 	uint32_t dest_ip;	/**< Destination IP address. */ | ||||
| 	int32_t dest_port;	/**< Destination L4 port (e.g., TCP or UDP port). */ | ||||
| 	uint32_t dest_ip_xlate; | ||||
| 			/**< Translated destination IP address (used with DNAT). */ | ||||
| 	int32_t dest_port_xlate; | ||||
| 			/**< Translated destination L4 port (used with DNAT). */ | ||||
| 	uint8_t src_mac[ETH_ALEN]; | ||||
| 			/**< Source MAC address. */ | ||||
| 	uint8_t dest_mac[ETH_ALEN]; | ||||
| 			/**< Destination MAC address. */ | ||||
| 	uint8_t src_mac_xlate[ETH_ALEN]; | ||||
| 			/**< Translated source MAC address (post-routing). */ | ||||
| 	uint8_t dest_mac_xlate[ETH_ALEN]; | ||||
| 			/**< Translated destination MAC address (post-routing). */ | ||||
| 	uint8_t flow_window_scale;	/**< Window scaling factor (TCP). */ | ||||
| 	uint32_t flow_max_window;	/**< Maximum window size (TCP). */ | ||||
| 	uint32_t flow_end;		/**< TCP window end. */ | ||||
| 	uint32_t flow_max_end;		/**< TCP window maximum end. */ | ||||
| 	uint32_t flow_pppoe_if_exist; | ||||
| 			/**< Flow direction: PPPoE interface exist flag. */ | ||||
| 	int32_t flow_pppoe_if_num; | ||||
| 			/**< Flow direction: PPPoE interface number. */ | ||||
| 	uint16_t ingress_vlan_tag;	/**< Ingress VLAN tag expected for this flow. */ | ||||
| 	uint8_t return_window_scale; | ||||
| 			/**< Window scaling factor of the return direction (TCP). */ | ||||
| 	uint32_t return_max_window; | ||||
| 			/**< Maximum window size of the return direction. */ | ||||
| 	uint32_t return_end; | ||||
| 			/**< Flow end for the return direction. */ | ||||
| 	uint32_t return_max_end; | ||||
| 			/**< Flow maximum end for the return direction. */ | ||||
| 	uint32_t return_pppoe_if_exist; | ||||
| 			/**< Return direction: PPPoE interface existence flag. */ | ||||
| 	int32_t return_pppoe_if_num; | ||||
| 			/**< Return direction: PPPoE interface number. */ | ||||
| 	uint16_t egress_vlan_tag;	/**< Egress VLAN tag expected for this flow. */ | ||||
| 	uint8_t spo_needed;		/**< Indicates whether SPO is required. */ | ||||
| 	uint32_t param_a0;		/**< Custom parameter 0. */ | ||||
| 	uint32_t param_a1;		/**< Custom parameter 1. */ | ||||
| 	uint32_t param_a2;		/**< Custom parameter 2. */ | ||||
| 	uint32_t param_a3;		/**< Custom parameter 3. */ | ||||
| 	uint32_t param_a4;		/**< Custom parameter 4. */ | ||||
| 	uint32_t qos_tag;		/**< Deprecated, will be removed soon. */ | ||||
| 	uint32_t flow_qos_tag;		/**< QoS tag value for the flow direction. */ | ||||
| 	uint32_t return_qos_tag;	/**< QoS tag value for the return direction. */ | ||||
| 	uint8_t dscp_itag;		/**< DSCP marking tag. */ | ||||
| 	uint8_t dscp_imask;		/**< DSCP marking input mask. */ | ||||
| 	uint8_t dscp_omask;		/**< DSCP marking output mask. */ | ||||
| 	uint8_t dscp_oval;		/**< DSCP marking output value. */ | ||||
| 	uint16_t vlan_itag;		/**< VLAN marking tag. */ | ||||
| 	uint16_t vlan_imask;		/**< VLAN marking input mask. */ | ||||
| 	uint16_t vlan_omask;		/**< VLAN marking output mask. */ | ||||
| 	uint16_t vlan_oval;		/**< VLAN marking output value. */ | ||||
| 	uint32_t in_vlan_tag[MAX_VLAN_DEPTH]; | ||||
| 			/**< Ingress VLAN tag expected for this flow. */ | ||||
| 	uint32_t out_vlan_tag[MAX_VLAN_DEPTH]; | ||||
| 			/**< Egress VLAN tag expected for this flow. */ | ||||
| 	uint8_t flow_dscp;		/**< IP DSCP value for the flow direction. */ | ||||
| 	uint8_t return_dscp;		/**< IP DSCP value for the return direction. */ | ||||
| }; | ||||
|  | ||||
| /* | ||||
|  * IPv4 connection flags (to be used with nss_ipv4_create::flags). | ||||
|  */ | ||||
| #define NSS_IPV4_CREATE_FLAG_NO_SEQ_CHECK 0x01 | ||||
| 		/**< Rule for not checking sequence numbers. */ | ||||
| #define NSS_IPV4_CREATE_FLAG_BRIDGE_FLOW 0x02 | ||||
| 		/**< Rule that indicates pure bridge flow (no routing is involved). */ | ||||
| #define NSS_IPV4_CREATE_FLAG_ROUTED 0x04	/**< Rule for a routed connection. */ | ||||
|  | ||||
| #define NSS_IPV4_CREATE_FLAG_DSCP_MARKING 0x08	/**< Rule for DSCP marking. */ | ||||
| #define NSS_IPV4_CREATE_FLAG_VLAN_MARKING 0x10	/**< Rule for VLAN marking. */ | ||||
| #define NSS_IPV4_CREATE_FLAG_QOS_VALID 0x20	/**< Rule for QoS is valid. */ | ||||
|  | ||||
| /** | ||||
|  * nss_ipv4_destroy | ||||
|  *	Information for an IPv4 flow or connection destroy rule. | ||||
|  */ | ||||
| struct nss_ipv4_destroy { | ||||
| 	int32_t protocol;	/**< L4 protocol ID. */ | ||||
| 	uint32_t src_ip;	/**< Source IP address. */ | ||||
| 	int32_t src_port;	/**< Source L4 port (e.g., TCP or UDP port). */ | ||||
| 	uint32_t dest_ip;	/**< Destination IP address. */ | ||||
| 	int32_t dest_port;	/**< Destination L4 port (e.g., TCP or UDP port). */ | ||||
| }; | ||||
|  | ||||
| /* | ||||
|  * IPv6 rule sync reasons. | ||||
|  */ | ||||
| #define NSS_IPV6_SYNC_REASON_STATS 0	/**< Rule for synchronizing statistics. */ | ||||
| #define NSS_IPV6_SYNC_REASON_FLUSH 1	/**< Rule for flushing a cache entry. */ | ||||
| #define NSS_IPV6_SYNC_REASON_EVICT 2	/**< Rule for evicting a cache entry. */ | ||||
| #define NSS_IPV6_SYNC_REASON_DESTROY 3 | ||||
| 		/**< Rule for destroying a cache entry (requested by the host OS). */ | ||||
| #define NSS_IPV6_SYNC_REASON_PPPOE_DESTROY 4 | ||||
| 		/**< Rule for destroying a cache entry that belongs to a PPPoE session. */ | ||||
|  | ||||
| /** | ||||
|  * nss_ipv6_create | ||||
|  *	Information for an IPv6 flow or connection create rule. | ||||
|  * | ||||
|  * All fields must be passed in host-endian order. | ||||
|  */ | ||||
| struct nss_ipv6_create { | ||||
| 	int32_t src_interface_num; | ||||
| 			/**< Source interface number (virtual or physical). */ | ||||
| 	int32_t dest_interface_num; | ||||
| 			/**< Destination interface number (virtual or physical). */ | ||||
| 	int32_t protocol;	/**< L4 protocol (e.g., TCP or UDP). */ | ||||
| 	uint32_t flags;		/**< Flags (if any) associated with this rule. */ | ||||
| 	uint32_t from_mtu;	/**< MTU of the incoming interface. */ | ||||
| 	uint32_t to_mtu;	/**< MTU of the outgoing interface. */ | ||||
| 	uint32_t src_ip[4];	/**< Source IP address. */ | ||||
| 	int32_t src_port;	/**< Source L4 port (e.g., TCP or UDP port). */ | ||||
| 	uint32_t dest_ip[4];	/**< Destination IP address. */ | ||||
| 	int32_t dest_port;	/**< Destination L4 port (e.g., TCP or UDP port). */ | ||||
| 	uint8_t src_mac[ETH_ALEN];	/**< Source MAC address. */ | ||||
| 	uint8_t dest_mac[ETH_ALEN];	/**< Destination MAC address. */ | ||||
| 	uint8_t flow_window_scale;	/**< Window scaling factor (TCP). */ | ||||
| 	uint32_t flow_max_window;	/**< Maximum window size (TCP). */ | ||||
| 	uint32_t flow_end;		/**< TCP window end. */ | ||||
| 	uint32_t flow_max_end;		/**< TCP window maximum end. */ | ||||
| 	uint32_t flow_pppoe_if_exist; | ||||
| 			/**< Flow direction: PPPoE interface existence flag. */ | ||||
| 	int32_t flow_pppoe_if_num; | ||||
| 			/**< Flow direction: PPPoE interface number. */ | ||||
| 	uint16_t ingress_vlan_tag; | ||||
| 			/**< Ingress VLAN tag expected for this flow. */ | ||||
| 	uint8_t return_window_scale; | ||||
| 			/**< Window scaling factor (TCP) for the return direction. */ | ||||
| 	uint32_t return_max_window; | ||||
| 			/**< Maximum window size (TCP) for the return direction. */ | ||||
| 	uint32_t return_end; | ||||
| 			/**< End for the return direction. */ | ||||
| 	uint32_t return_max_end; | ||||
| 			/**< Maximum end for the return direction. */ | ||||
| 	uint32_t return_pppoe_if_exist; | ||||
| 			/**< Return direction: PPPoE interface exist flag. */ | ||||
| 	int32_t return_pppoe_if_num; | ||||
| 			/**< Return direction: PPPoE interface number. */ | ||||
| 	uint16_t egress_vlan_tag;	/**< Egress VLAN tag expected for this flow. */ | ||||
| 	uint32_t qos_tag;		/**< Deprecated; will be removed soon. */ | ||||
| 	uint32_t flow_qos_tag;		/**< QoS tag value for flow direction. */ | ||||
| 	uint32_t return_qos_tag;	/**< QoS tag value for the return direction. */ | ||||
| 	uint8_t dscp_itag;		/**< DSCP marking tag. */ | ||||
| 	uint8_t dscp_imask;		/**< DSCP marking input mask. */ | ||||
| 	uint8_t dscp_omask;		/**< DSCP marking output mask. */ | ||||
| 	uint8_t dscp_oval;		/**< DSCP marking output value. */ | ||||
| 	uint16_t vlan_itag;		/**< VLAN marking tag. */ | ||||
| 	uint16_t vlan_imask;		/**< VLAN marking input mask. */ | ||||
| 	uint16_t vlan_omask;		/**< VLAN marking output mask. */ | ||||
| 	uint16_t vlan_oval;		/**< VLAN marking output value. */ | ||||
| 	uint32_t in_vlan_tag[MAX_VLAN_DEPTH]; | ||||
| 					/**< Ingress VLAN tag expected for this flow. */ | ||||
| 	uint32_t out_vlan_tag[MAX_VLAN_DEPTH]; | ||||
| 					/**< Egress VLAN tag expected for this flow. */ | ||||
| 	uint8_t flow_dscp;		/**< IP DSCP value for flow direction. */ | ||||
| 	uint8_t return_dscp;		/**< IP DSCP value for the return direction. */ | ||||
| }; | ||||
|  | ||||
| /* | ||||
|  * IPv6 connection flags (to be used with nss_ipv6_create::flags. | ||||
|  */ | ||||
| #define NSS_IPV6_CREATE_FLAG_NO_SEQ_CHECK 0x1 | ||||
| 		/**< Indicates that sequence numbers are not to be checked. */ | ||||
| #define NSS_IPV6_CREATE_FLAG_BRIDGE_FLOW 0x02 | ||||
| 		/**< Indicates that this is a pure bridge flow (no routing is involved). */ | ||||
| #define NSS_IPV6_CREATE_FLAG_ROUTED 0x04	/**< Rule is for a routed connection. */ | ||||
| #define NSS_IPV6_CREATE_FLAG_DSCP_MARKING 0x08	/**< Rule for DSCP marking. */ | ||||
| #define NSS_IPV6_CREATE_FLAG_VLAN_MARKING 0x10	/**< Rule for VLAN marking. */ | ||||
| #define NSS_IPV6_CREATE_FLAG_QOS_VALID 0x20	/**< Rule for Valid QoS. */ | ||||
|  | ||||
| /** | ||||
|  * nss_ipv6_destroy | ||||
|  *	Information for an IPv6 flow or connection destroy rule. | ||||
|  */ | ||||
| struct nss_ipv6_destroy { | ||||
| 	int32_t protocol;	/**< L4 protocol (e.g., TCP or UDP). */ | ||||
| 	uint32_t src_ip[4];	/**< Source IP address. */ | ||||
| 	int32_t src_port;	/**< Source L4 port (e.g., TCP or UDP port). */ | ||||
| 	uint32_t dest_ip[4];	/**< Destination IP address. */ | ||||
| 	int32_t dest_port;	/**< Destination L4 port (e.g., TCP or UDP port). */ | ||||
| }; | ||||
|  | ||||
| /** | ||||
|  * nss_ipv4_sync | ||||
|  *	Defines packet statistics for IPv4 and also keeps the connection entry alive. | ||||
|  * | ||||
|  * Statistics are bytes and packets seen over a connection. | ||||
|  * | ||||
|  * The addresses are NON-NAT addresses (i.e., true endpoint | ||||
|  * addressing). | ||||
|  * | ||||
|  * The source (src) creates the connection. | ||||
|  */ | ||||
| struct nss_ipv4_sync { | ||||
| 	uint32_t index;		/**< Slot ID for cache statistics to host OS. */ | ||||
| 			/*TODO: use an opaque information as host and NSS | ||||
| 			  may be using a different mechanism to store rules. */ | ||||
| 	int32_t protocol;	/**< L4 protocol (e.g., TCP or UDP). */ | ||||
| 	uint32_t src_ip;	/**< Source IP address. */ | ||||
| 	int32_t src_port;	/**< Source L4 port (e.g., TCP or UDP port). */ | ||||
| 	uint32_t src_ip_xlate;	/**< Translated source IP address (used with SNAT). */ | ||||
| 	int32_t src_port_xlate;	/**< Translated source L4 port (used with SNAT). */ | ||||
| 	uint32_t dest_ip;	/**< Destination IP address. */ | ||||
| 	int32_t dest_port;	/**< Destination L4 port (e.g., TCP or UDP port). */ | ||||
| 	uint32_t dest_ip_xlate; | ||||
| 			/**< Translated destination IP address (used with DNAT). */ | ||||
| 	int32_t dest_port_xlate; | ||||
| 			/**< Translated destination L4 port (used with DNAT). */ | ||||
| 	uint32_t flow_max_window;	/**< Maximum window size (TCP). */ | ||||
| 	uint32_t flow_end;		/**< TCP window end. */ | ||||
| 	uint32_t flow_max_end;		/**< TCP window maximum end. */ | ||||
| 	uint32_t flow_rx_packet_count;	/**< Rx packet count for the flow interface. */ | ||||
| 	uint32_t flow_rx_byte_count;	/**< Rx byte count for the flow interface. */ | ||||
| 	uint32_t flow_tx_packet_count;	/**< Tx packet count for the flow interface. */ | ||||
| 	uint32_t flow_tx_byte_count;	/**< Tx byte count for the flow interface. */ | ||||
| 	uint32_t return_max_window; | ||||
| 			/**< Maximum window size (TCP) for the return direction. */ | ||||
| 	uint32_t return_end; | ||||
| 			/**< End for the return direction. */ | ||||
| 	uint32_t return_max_end; | ||||
| 			/**< Maximum end for the return direction. */ | ||||
| 	uint32_t return_rx_packet_count; | ||||
| 			/**< Rx packet count for the return direction. */ | ||||
| 	uint32_t return_rx_byte_count; | ||||
| 			/**< Rx byte count for the return direction. */ | ||||
| 	uint32_t return_tx_packet_count; | ||||
| 			/**< Tx packet count for the return direction. */ | ||||
| 	uint32_t return_tx_byte_count; | ||||
| 			/**< Tx byte count for the return direction. */ | ||||
|  | ||||
| 	/** | ||||
| 	 * Time in Linux jiffies to be added to the current timeout to keep the | ||||
| 	 * connection alive. | ||||
| 	 */ | ||||
| 	unsigned long int delta_jiffies; | ||||
|  | ||||
| 	uint8_t reason;		/**< Reason for synchronization. */ | ||||
| 	uint32_t param_a0;	/**< Custom parameter 0. */ | ||||
| 	uint32_t param_a1;	/**< Custom parameter 1. */ | ||||
| 	uint32_t param_a2;	/**< Custom parameter 2. */ | ||||
| 	uint32_t param_a3;	/**< Custom parameter 3. */ | ||||
| 	uint32_t param_a4;	/**< Custom parameter 4. */ | ||||
|  | ||||
| 	uint8_t flags;		/**< Flags indicating the status of the flow. */ | ||||
| 	uint32_t qos_tag;	/**< QoS value of the flow. */ | ||||
| }; | ||||
|  | ||||
| /** | ||||
|  * nss_ipv4_establish | ||||
|  *	Defines connection-established message parameters for IPv4. | ||||
|  */ | ||||
| struct nss_ipv4_establish { | ||||
| 	uint32_t index;			/**< Slot ID for cache statistics to host OS. */ | ||||
| 			/*TODO: use an opaque information as host and NSS | ||||
| 			  may be using a different mechanism to store rules. */ | ||||
| 	uint8_t protocol;		/**< Protocol number. */ | ||||
| 	uint8_t reserved[3];		/**< Padding for word alignment. */ | ||||
| 	int32_t flow_interface;		/**< Flow interface number. */ | ||||
| 	uint32_t flow_mtu;		/**< MTU for the flow interface. */ | ||||
| 	uint32_t flow_ip;		/**< Flow IP address. */ | ||||
| 	uint32_t flow_ip_xlate;		/**< Translated flow IP address. */ | ||||
| 	uint32_t flow_ident;		/**< Flow identifier (e.g., port). */ | ||||
| 	uint32_t flow_ident_xlate;	/**< Translated flow identifier (e.g., port). */ | ||||
| 	uint16_t flow_mac[3];		/**< Source MAC address for the flow direction. */ | ||||
| 	uint32_t flow_pppoe_if_exist;	/**< Flow direction: PPPoE interface existence flag. */ | ||||
| 	int32_t flow_pppoe_if_num;	/**< Flow direction: PPPoE interface number. */ | ||||
| 	uint16_t ingress_vlan_tag;	/**< Ingress VLAN tag. */ | ||||
| 	int32_t return_interface;	/**< Return interface number. */ | ||||
| 	uint32_t return_mtu;		/**< MTU for the return interface. */ | ||||
| 	uint32_t return_ip;		/**< Return IP address. */ | ||||
| 	uint32_t return_ip_xlate;	/**< Translated return IP address. */ | ||||
| 	uint32_t return_ident;		/**< Return identier (e.g., port). */ | ||||
| 	uint32_t return_ident_xlate;	/**< Translated return identifier (e.g., port). */ | ||||
| 	uint16_t return_mac[3];		/**< Source MAC address for the return direction. */ | ||||
| 	uint32_t return_pppoe_if_exist;	/**< Return direction: PPPoE interface existence flag. */ | ||||
| 	int32_t return_pppoe_if_num;	/**< Return direction: PPPoE interface number. */ | ||||
| 	uint16_t egress_vlan_tag;	/**< Egress VLAN tag. */ | ||||
| 	uint8_t flags;			/**< Flags indicating the status of the flow. */ | ||||
| 	uint32_t qos_tag;		/**< QoS value of the flow. */ | ||||
| }; | ||||
|  | ||||
| /** | ||||
|  * nss_ipv4_cb_reason | ||||
|  *	Reasons for an IPv4 callback. | ||||
|  */ | ||||
| enum nss_ipv4_cb_reason { | ||||
| 	NSS_IPV4_CB_REASON_ESTABLISH = 0, | ||||
| 	NSS_IPV4_CB_REASON_SYNC, | ||||
| 	NSS_IPV4_CB_REASON_ESTABLISH_FAIL, | ||||
| }; | ||||
|  | ||||
| /** | ||||
|  * nss_ipv4_cb_params | ||||
|  *	Message parameters for an IPv4 callback. | ||||
|  */ | ||||
| struct nss_ipv4_cb_params { | ||||
| 	enum nss_ipv4_cb_reason reason;		/**< Reason for the callback. */ | ||||
|  | ||||
| 	/** | ||||
| 	 * Message parameters for an IPv4 callback. | ||||
| 	 */ | ||||
| 	union { | ||||
| 		struct nss_ipv4_sync sync; | ||||
| 				/**< Parameters for synchronization. */ | ||||
| 		struct nss_ipv4_establish establish; | ||||
| 				/**< Parameters for establishing a connection. */ | ||||
| 	} params;		/**< Payload of parameters. */ | ||||
| }; | ||||
|  | ||||
| /** | ||||
|  * nss_ipv6_sync | ||||
|  *	Update packet statistics (bytes and packets seen over a connection) and also keep the connection entry alive. | ||||
|  * | ||||
|  * The addresses are NON-NAT addresses (i.e., true endpoint addressing). | ||||
|  * | ||||
|  * The source (src) creates the connection. | ||||
|  */ | ||||
| struct nss_ipv6_sync { | ||||
| 	uint32_t index;		/**< Slot ID for cache statistics to the host OS. */ | ||||
| 	int32_t protocol;	/**< L4 protocol (e.g., TCP or UDP). */ | ||||
| 	uint32_t src_ip[4];	/**< Source IP address. */ | ||||
| 	int32_t src_port;	/**< Source L4 port (e.g., TCP or UDP port). */ | ||||
| 	uint32_t dest_ip[4];	/**< Destination IP address. */ | ||||
| 	int32_t dest_port;	/**< Destination L4 port (e.g., TCP or UDP port). */ | ||||
| 	uint32_t flow_max_window;	/**< Maximum window size (TCP). */ | ||||
| 	uint32_t flow_end;		/**< TCP window end. */ | ||||
| 	uint32_t flow_max_end;		/**< TCP window maximum end. */ | ||||
| 	uint32_t flow_rx_packet_count;	/**< Rx packet count for the flow interface. */ | ||||
| 	uint32_t flow_rx_byte_count;	/**< Rx byte count for the flow interface. */ | ||||
| 	uint32_t flow_tx_packet_count;	/**< Tx packet count for the flow interface. */ | ||||
| 	uint32_t flow_tx_byte_count;	/**< Tx byte count for the flow interface. */ | ||||
| 	uint32_t return_max_window; | ||||
| 			/**< Maximum window size (TCP) for the return direction. */ | ||||
| 	uint32_t return_end; | ||||
| 			/**< End for the return direction. */ | ||||
| 	uint32_t return_max_end; | ||||
| 			/**< Maximum end for the return direction. */ | ||||
| 	uint32_t return_rx_packet_count; | ||||
| 			/**< Rx packet count for the return direction. */ | ||||
| 	uint32_t return_rx_byte_count; | ||||
| 			/**< Rx byte count for the return direction. */ | ||||
| 	uint32_t return_tx_packet_count; | ||||
| 			/**< Tx packet count for the return direction. */ | ||||
| 	uint32_t return_tx_byte_count; | ||||
| 			/**< Tx byte count for the return direction. */ | ||||
|  | ||||
| 	/** | ||||
| 	 * Time in Linux jiffies to be added to the current timeout to keep the | ||||
| 	 * connection alive. | ||||
| 	 */ | ||||
| 	unsigned long int delta_jiffies; | ||||
|  | ||||
| 	/** | ||||
| 	 * Non-zero when the NA has ceased to accelerate the given connection. | ||||
| 	 */ | ||||
| 	uint8_t final_sync; | ||||
|  | ||||
| 	uint8_t evicted;	/**< Non-zero if the connection is evicted. */ | ||||
|  | ||||
| 	uint8_t flags;		/**< Flags indicating the status of the flow. */ | ||||
| 	uint32_t qos_tag;	/**< QoS value of the flow. */ | ||||
| }; | ||||
|  | ||||
| /** | ||||
|  * nss_ipv6_establish | ||||
|  *	Defines connection-established message parameters for IPv6. | ||||
|  */ | ||||
| struct nss_ipv6_establish { | ||||
| 	uint32_t index;		/**< Slot ID for cache statistics to the host OS. */ | ||||
| 	uint8_t protocol;	/**< Protocol number. */ | ||||
| 	int32_t flow_interface;	/**< Flow interface number. */ | ||||
| 	uint32_t flow_mtu;	/**< MTU for the flow interface. */ | ||||
| 	uint32_t flow_ip[4];	/**< Flow IP address. */ | ||||
| 	uint32_t flow_ident;	/**< Flow identifier (e.g., port). */ | ||||
| 	uint16_t flow_mac[3];	/**< Source MAC address for the flow direction. */ | ||||
| 	uint32_t flow_pppoe_if_exist;	/**< Flow direction: PPPoE interface existence flag. */ | ||||
| 	int32_t flow_pppoe_if_num;	/**< Flow direction: PPPoE interface number. */ | ||||
| 	uint16_t ingress_vlan_tag;	/**< Ingress VLAN tag. */ | ||||
| 	int32_t return_interface;	/**< Return interface number. */ | ||||
| 	uint32_t return_mtu;		/**< MTU for the return interface. */ | ||||
| 	uint32_t return_ip[4];		/**< Return IP address. */ | ||||
| 	uint32_t return_ident;		/**< Return identier (e.g., port). */ | ||||
| 	uint16_t return_mac[3];		/**< Source MAC address for the return direction. */ | ||||
| 	uint32_t return_pppoe_if_exist;	/**< Return direction: PPPoE interface existence flag. */ | ||||
| 	int32_t return_pppoe_if_num;	/**< Return direction: PPPoE interface number. */ | ||||
| 	uint16_t egress_vlan_tag;	/**< VLAN tag to be inserted for egress direction. */ | ||||
| 	uint8_t flags;			/**< Flags indicating the status of the flow. */ | ||||
| 	uint32_t qos_tag;		/**< QoS value of the flow. */ | ||||
| }; | ||||
|  | ||||
| /** | ||||
|  * nss_ipv6_cb_reason | ||||
|  *	Reasons for an IPv6 callback. | ||||
|  */ | ||||
| enum nss_ipv6_cb_reason { | ||||
| 	NSS_IPV6_CB_REASON_ESTABLISH = 0, | ||||
| 	NSS_IPV6_CB_REASON_SYNC, | ||||
| 	NSS_IPV6_CB_REASON_ESTABLISH_FAIL, | ||||
| }; | ||||
|  | ||||
| /** | ||||
|  * nss_ipv6_cb_params | ||||
|  *	Message parameters for an IPv6 callback. | ||||
|  */ | ||||
| struct nss_ipv6_cb_params { | ||||
| 	enum nss_ipv6_cb_reason reason;		/**< Reason for the callback. */ | ||||
|  | ||||
| 	/** | ||||
| 	 * Message parameters for an IPv6 callback. | ||||
| 	 */ | ||||
| 	union { | ||||
| 		struct nss_ipv6_sync sync; | ||||
| 				/**< Parameters for synchronization. */ | ||||
| 		struct nss_ipv6_establish establish; | ||||
| 				/**< Parameters for establishing a connection. */ | ||||
| 	} params;		/**< Callback parameters. */ | ||||
| }; | ||||
|  | ||||
| /* | ||||
|  * General utilities | ||||
|  */ | ||||
| @@ -791,16 +295,6 @@ struct nss_ipv6_cb_params { | ||||
|  */ | ||||
| typedef void (*nss_if_rx_msg_callback_t)(void *app_data, struct nss_cmn_msg *msg); | ||||
|  | ||||
| /** | ||||
|  * Callback function for IPv4 connection synchronization messages. | ||||
|  * | ||||
|  * @datatypes | ||||
|  * nss_ipv4_cb_params | ||||
|  * | ||||
|  * @param[in] nicb  Pointer to the parameter structure for an NSS IPv4 callback. | ||||
|  */ | ||||
| typedef void (*nss_ipv4_callback_t)(struct nss_ipv4_cb_params *nicb); | ||||
|  | ||||
| /** | ||||
|  * nss_get_state | ||||
|  *	Gets the NSS state. | ||||
|   | ||||
| @@ -139,8 +139,8 @@ struct nss_capwap_stats_msg { | ||||
|  | ||||
| 	uint32_t rx_frag_timeout_drops; | ||||
| 			/**< Packets dropped because of a reassembly timeout. */ | ||||
| 	uint32_t rx_queue_full_drops; | ||||
| 			/**< Packets dropped because the queue is full. */ | ||||
| 	uint32_t rx_n2h_drops; | ||||
| 			/**< Packets dropped because of error in packet processing. */ | ||||
| 	uint32_t rx_n2h_queue_full_drops; | ||||
| 			/**< Packets dropped because the NSS-to-host queue is full. */ | ||||
| 	uint32_t rx_csum_drops; | ||||
| @@ -297,6 +297,14 @@ struct nss_capwap_flow_rule_msg { | ||||
| 	uint32_t flow_id;		/**< Flow identification. */ | ||||
| }; | ||||
|  | ||||
| /** | ||||
|  * nss_capwap_enable_tunnel_msg | ||||
|  *	Structure to update sibling interface number. | ||||
|  */ | ||||
| struct nss_capwap_enable_tunnel_msg { | ||||
| 	uint32_t sibling_if_num; /**< Sibling interface Number. */ | ||||
| }; | ||||
|  | ||||
| /** | ||||
|  * nss_capwap_msg | ||||
|  *	Data for sending and receiving CAPWAP messages. | ||||
| @@ -322,6 +330,8 @@ struct nss_capwap_msg { | ||||
| 				/**< Flow rule add message. */ | ||||
| 		struct nss_capwap_flow_rule_msg flow_rule_del; | ||||
| 				/**< Flow rule delete message. */ | ||||
| 		struct nss_capwap_enable_tunnel_msg enable_tunnel; | ||||
| 				/**< Enable tunnel message. */ | ||||
| 	} msg;			/**< Message payload. */ | ||||
| }; | ||||
|  | ||||
| @@ -358,8 +368,8 @@ struct nss_capwap_tunnel_stats { | ||||
|  | ||||
| 	uint64_t rx_frag_timeout_drops; | ||||
| 			/**< Packets dropped because of a reassembly timeout. */ | ||||
| 	uint64_t rx_queue_full_drops; | ||||
| 			/**< Packets dropped because the queue is full. */ | ||||
| 	uint64_t rx_n2h_drops; | ||||
| 			/**< Packets dropped because of error in processing the packet. */ | ||||
| 	uint64_t rx_n2h_queue_full_drops; | ||||
| 			/**< Packets dropped because the NSS-to-host queue is full. */ | ||||
| 	uint64_t rx_csum_drops; | ||||
| @@ -374,6 +384,7 @@ struct nss_capwap_tunnel_stats { | ||||
| 	/* | ||||
| 	 * Tx/encap stats | ||||
| 	 */ | ||||
| 	uint64_t tx_dropped_inner;	/**<Packets dropped due to inflow queue full. */ | ||||
| 	uint64_t tx_segments;		/**< Number of segments or fragments. */ | ||||
| 	uint64_t tx_queue_full_drops; | ||||
| 			/**< Packets dropped because the queue is full. */ | ||||
|   | ||||
| @@ -1,6 +1,6 @@ | ||||
| /* | ||||
|  ************************************************************************** | ||||
|  * Copyright (c) 2019-2020, The Linux Foundation. All rights reserved. | ||||
|  * Copyright (c) 2019-2021, The Linux Foundation. All rights reserved. | ||||
|  * Permission to use, copy, modify, and/or distribute this software for | ||||
|  * any purpose with or without fee is hereby granted, provided that the | ||||
|  * above copyright notice and this permission notice appear in all copies. | ||||
| @@ -67,6 +67,50 @@ typedef enum nss_clmap_error_types { | ||||
| 	NSS_CLMAP_ERROR_MAX,			/**< Maximum error type. */ | ||||
| } nss_clmap_error_t; | ||||
|  | ||||
| /** | ||||
|  * nss_clmap_interface_type | ||||
|  *	Client map NSS interface type. | ||||
|  */ | ||||
| enum nss_clmap_interface_type { | ||||
| 	NSS_CLMAP_INTERFACE_TYPE_US, | ||||
| 	NSS_CLMAP_INTERFACE_TYPE_DS, | ||||
| 	NSS_CLMAP_INTERFACE_TYPE_MAX | ||||
| }; | ||||
|  | ||||
| /** | ||||
|  * nss_clmap_stats_type | ||||
|  *	Client map statistic counters. | ||||
|  */ | ||||
| enum nss_clmap_stats_type { | ||||
| 	NSS_CLMAP_INTERFACE_STATS_RX_PKTS,			/**< Number of packets received. */ | ||||
| 	NSS_CLMAP_INTERFACE_STATS_RX_BYTES,			/**< Number of bytes received. */ | ||||
| 	NSS_CLMAP_INTERFACE_STATS_TX_PKTS,			/**< Number of packets transmitted. */ | ||||
| 	NSS_CLMAP_INTERFACE_STATS_TX_BYTES,			/**< Number of bytes transmitted. */ | ||||
| 	NSS_CLMAP_INTERFACE_STATS_RX_QUEUE_0_DROPPED,		/**< Dropped receive packets 0. */ | ||||
| 	NSS_CLMAP_INTERFACE_STATS_RX_QUEUE_1_DROPPED,		/**< Dropped receive packets 1. */ | ||||
| 	NSS_CLMAP_INTERFACE_STATS_RX_QUEUE_2_DROPPED,		/**< Dropped receive packets 2. */ | ||||
| 	NSS_CLMAP_INTERFACE_STATS_RX_QUEUE_3_DROPPED,		/**< Dropped receive packets 3. */ | ||||
| 	NSS_CLMAP_INTERFACE_STATS_DROPPED_MACDB_LOOKUP_FAILED,	/**< Dropped due to MAC database look up failed. */ | ||||
| 	NSS_CLMAP_INTERFACE_STATS_DROPPED_INVALID_PACKET_SIZE,	/**< Dropped due to invalid size packets. */ | ||||
| 	NSS_CLMAP_INTERFACE_STATS_DROPPED_LOW_HEADROOM,		/**< Dropped due to insufficent headroom. */ | ||||
| 	NSS_CLMAP_INTERFACE_STATS_DROPPED_NEXT_NODE_QUEUE_FULL,	/**< Dropped due to next node queue full. */ | ||||
| 	NSS_CLMAP_INTERFACE_STATS_DROPPED_PBUF_ALLOC_FAILED,	/**< Dropped due to buffer allocation failure. */ | ||||
| 	NSS_CLMAP_INTERFACE_STATS_DROPPED_LINEAR_FAILED,	/**< Dropped due to linear copy failure. */ | ||||
| 	NSS_CLMAP_INTERFACE_STATS_SHARED_PACKET_CNT,		/**< Shared packet count. */ | ||||
| 	NSS_CLMAP_INTERFACE_STATS_ETHERNET_FRAME_ERROR,		/**< Ethernet frame error count. */ | ||||
| 	NSS_CLMAP_INTERFACE_STATS_MACDB_CREATE_REQUESTS_CNT,	/**< MAC database create requests count. */ | ||||
| 	NSS_CLMAP_INTERFACE_STATS_MACDB_CREATE_MAC_EXISTS_CNT,	/**< MAC database create failures, MAC exist count. */ | ||||
| 	NSS_CLMAP_INTERFACE_STATS_MACDB_CREATE_MAC_TABLE_FULL_CNT, | ||||
| 								/**< MAC database create failures, MAC database full count. */ | ||||
| 	NSS_CLMAP_INTERFACE_STATS_MACDB_DESTROY_REQUESTS_CNT,	/**< MAC database destroy requests count. */ | ||||
| 	NSS_CLMAP_INTERFACE_STATS_MACDB_DESTROY_MAC_NOT_FOUND_CNT, | ||||
| 								/**< MAC database destroy failures, MAC not found count. */ | ||||
| 	NSS_CLMAP_INTERFACE_STATS_MACDB_DESTROY_MAC_UNHASHED_CNT, | ||||
| 								/**< MAC database destroy failures, MAC unhashed count. */ | ||||
| 	NSS_CLMAP_INTERFACE_STATS_MACDB_FLUSH_REQUESTS_CNT,	/**< MAC database flush requests count. */ | ||||
| 	NSS_CLMAP_INTERFACE_STATS_MAX,				/**< Maximum statistics type. */ | ||||
| }; | ||||
|  | ||||
| /** | ||||
|  * nss_clmap_stats_msg | ||||
|  *	Per-interface statistics messages from the NSS firmware. | ||||
| @@ -111,6 +155,16 @@ struct nss_clmap_flush_mac_msg { | ||||
| 	uint32_t nexthop_ifnum;			/**< Next hop interface number. */ | ||||
| }; | ||||
|  | ||||
| /** | ||||
|  * nss_clmap_stats_notification | ||||
|  *	Client map transmission statistics structure. | ||||
|  */ | ||||
| struct nss_clmap_stats_notification { | ||||
| 	uint64_t stats_ctx[NSS_CLMAP_INTERFACE_STATS_MAX];	/**< Context transmission statistics. */ | ||||
| 	uint32_t core_id;					/**< Core ID. */ | ||||
| 	uint32_t if_num;					/**< Interface number. */ | ||||
| }; | ||||
|  | ||||
| /** | ||||
|  * nss_clmap_msg | ||||
|  *	Data for sending and receiving client map messages. | ||||
| @@ -301,6 +355,34 @@ extern void nss_clmap_init(void); | ||||
| extern void nss_clmap_msg_init(struct nss_clmap_msg *ncm, uint16_t if_num, uint32_t type, uint32_t len, | ||||
| 								nss_clmap_msg_callback_t cb, void *app_data); | ||||
|  | ||||
| /** | ||||
|  * nss_clmap_stats_unregister_notifier | ||||
|  *	Deregisters a statistics notifier. | ||||
|  * | ||||
|  * @datatypes | ||||
|  *	notifier_block | ||||
|  * | ||||
|  * @param[in] nb Notifier block. | ||||
|  * | ||||
|  * @return | ||||
|  * 0 on success or non-zero on failure. | ||||
|  */ | ||||
| extern int nss_clmap_stats_unregister_notifier(struct notifier_block *nb); | ||||
|  | ||||
| /** | ||||
|  * nss_clmap_stats_register_notifier | ||||
|  *	Registers a statistics notifier. | ||||
|  * | ||||
|  * @datatypes | ||||
|  *	notifier_block | ||||
|  * | ||||
|  * @param[in] nb Notifier block. | ||||
|  * | ||||
|  * @return | ||||
|  * 0 on success or non-zero on failure. | ||||
|  */ | ||||
| extern int nss_clmap_stats_register_notifier(struct notifier_block *nb); | ||||
|  | ||||
| /** | ||||
|  * @} | ||||
|  */ | ||||
|   | ||||
| @@ -1,6 +1,6 @@ | ||||
| /* | ||||
|  ************************************************************************** | ||||
|  * Copyright (c) 2014, 2016-2019, The Linux Foundation. All rights reserved. | ||||
|  * Copyright (c) 2014, 2016-2020, The Linux Foundation. All rights reserved. | ||||
|  * Permission to use, copy, modify, and/or distribute this software for | ||||
|  * any purpose with or without fee is hereby granted, provided that the | ||||
|  * above copyright notice and this permission notice appear in all copies. | ||||
| @@ -27,6 +27,13 @@ | ||||
|  * @{ | ||||
|  */ | ||||
|  | ||||
| /* | ||||
|  * Interface Number 1 Valid 7 Core 8 Type 16 Index | ||||
|  */ | ||||
| typedef int32_t nss_if_num_t; | ||||
| #define NSS_IF_IS_TYPE_DYNAMIC(if_num)		(if_num != -1) | ||||
| #define NSS_IF_IS_VALID(if_num)		(if_num < NSS_MAX_NET_INTERFACES) | ||||
|  | ||||
| /** | ||||
|  * @struct nss_ctx_instance | ||||
|  *	Forward declaration for structure that contains instance data for each | ||||
|   | ||||
| @@ -1,6 +1,6 @@ | ||||
| /* | ||||
|  ************************************************************************** | ||||
|  * Copyright (c) 2020, The Linux Foundation. All rights reserved. | ||||
|  * Copyright (c) 2020-2021, The Linux Foundation. All rights reserved. | ||||
|  * | ||||
|  * Permission to use, copy, modify, and/or distribute this software for | ||||
|  * any purpose with or without fee is hereby granted, provided that the | ||||
| @@ -52,6 +52,43 @@ enum nss_dma_msg_error { | ||||
| 	NSS_DMA_MSG_ERROR_MAX			/**< Maximum error type. */ | ||||
| }; | ||||
|  | ||||
| /** | ||||
|  * nss_dma_stats_types | ||||
|  *	DMA node statistics. | ||||
|  */ | ||||
| enum nss_dma_stats_types { | ||||
| 	NSS_DMA_STATS_NO_REQ = NSS_STATS_NODE_MAX, | ||||
| 					/**< Request descriptor not available. */ | ||||
| 	NSS_DMA_STATS_NO_DESC,		/**< DMA descriptors not available. */ | ||||
| 	NSS_DMA_STATS_NEXTHOP,		/**< Failed to retrive next hop. */ | ||||
| 	NSS_DMA_STATS_FAIL_NEXTHOP_QUEUE, | ||||
| 					/**< Failed to queue next hop. */ | ||||
| 	NSS_DMA_STATS_FAIL_LINEAR_SZ,	/**< Failed to get memory for linearization. */ | ||||
| 	NSS_DMA_STATS_FAIL_LINEAR_ALLOC,/**< Failed to allocate buffer for linearization. */ | ||||
| 	NSS_DMA_STATS_FAIL_LINEAR_NO_SG,/**< Skip linearization due to non-SG packet. */ | ||||
| 	NSS_DMA_STATS_FAIL_SPLIT_SZ,	/**< Failed to spliting buffer into multiple buffers. */ | ||||
| 	NSS_DMA_STATS_FAIL_SPLIT_ALLOC,	/**< Failed to allocate buffer for split. */ | ||||
| 	NSS_DMA_STATS_FAIL_SYNC_ALLOC,	/**< Failed to allocate buffer for sending statistics. */ | ||||
| 	NSS_DMA_STATS_FAIL_CTX_ACTIVE,	/**< Failed to queue as the node is not active. */ | ||||
| 	NSS_DMA_STATS_FAIL_HW_E0,	/**< Failed to process in hardware, error code E0. */ | ||||
| 	NSS_DMA_STATS_FAIL_HW_E1,	/**< Failed to process in hardware, error code E1. */ | ||||
| 	NSS_DMA_STATS_FAIL_HW_E2,	/**< Failed to process in hardware, error code E2. */ | ||||
| 	NSS_DMA_STATS_FAIL_HW_E3,	/**< Failed to process in hardware, error code E3. */ | ||||
| 	NSS_DMA_STATS_FAIL_HW_E4,	/**< Failed to process in hardware, error code E4. */ | ||||
| 	NSS_DMA_STATS_FAIL_HW_E5,	/**< Failed to process in hardware, error code E5. */ | ||||
| 	NSS_DMA_STATS_FAIL_HW_E6,	/**< Failed to process in hardware, error code E6. */ | ||||
| 	NSS_DMA_STATS_FAIL_HW_E7,	/**< Failed to process in hardware, error code E7. */ | ||||
| 	NSS_DMA_STATS_FAIL_HW_E8,	/**< Failed to process in hardware, error code E8. */ | ||||
| 	NSS_DMA_STATS_FAIL_HW_E9,	/**< Failed to process in hardware, error code E9. */ | ||||
| 	NSS_DMA_STATS_FAIL_HW_E10,	/**< Failed to process in hardware, error code E10. */ | ||||
| 	NSS_DMA_STATS_FAIL_HW_E11,	/**< Failed to process in hardware, error code E11. */ | ||||
| 	NSS_DMA_STATS_FAIL_HW_E12,	/**< Failed to process in hardware, error code E12. */ | ||||
| 	NSS_DMA_STATS_FAIL_HW_E13,	/**< Failed to process in hardware, error code E13. */ | ||||
| 	NSS_DMA_STATS_FAIL_HW_E14,	/**< Failed to process in hardware, error code E14. */ | ||||
| 	NSS_DMA_STATS_FAIL_HW_E15,	/**< Failed to process in hardware, error code E15. */ | ||||
| 	NSS_DMA_STATS_MAX,		/**< Maximum message type. */ | ||||
| }; | ||||
|  | ||||
| /** | ||||
|  * nss_dma_test_type | ||||
|  *	DMA Test types. | ||||
| @@ -64,6 +101,15 @@ enum nss_dma_test_type { | ||||
| 	NSS_DMA_TEST_TYPE_MAX			/**< Maximum test type. */ | ||||
| }; | ||||
|  | ||||
| /** | ||||
|  * nss_dma_stats_notification | ||||
|  *	DMA transmission statistics structure. | ||||
|  */ | ||||
| struct nss_dma_stats_notification { | ||||
| 	uint64_t stats_ctx[NSS_DMA_STATS_MAX];		/**< Context transmission statistics. */ | ||||
| 	uint32_t core_id;				/**< Core ID. */ | ||||
| }; | ||||
|  | ||||
| #ifdef __KERNEL__ /* only kernel will use. */ | ||||
| /* | ||||
|  * Maximum number of HW specific statistics | ||||
| @@ -129,11 +175,6 @@ struct nss_dma_msg { | ||||
|  * nss_dma_register_handler | ||||
|  *	Registers the DMA message handler. | ||||
|  * | ||||
|  * @datatypes | ||||
|  * nss_ctx_instance | ||||
|  * | ||||
|  * @param[in] nss_ctx  Pointer to the NSS context. | ||||
|  * | ||||
|  * @return | ||||
|  * None. | ||||
|  */ | ||||
| @@ -255,6 +296,34 @@ void nss_dma_init(void); | ||||
|  * Pointer to the NSS core context. | ||||
|  */ | ||||
| extern struct nss_ctx_instance *nss_dma_get_context(void); | ||||
|  | ||||
| /** | ||||
|  * nss_dma_stats_unregister_notifier | ||||
|  *	Deregisters a statistics notifier. | ||||
|  * | ||||
|  * @datatypes | ||||
|  *	notifier_block | ||||
|  * | ||||
|  * @param[in] nb Notifier block. | ||||
|  * | ||||
|  * @return | ||||
|  * 0 on success or non-zero on failure. | ||||
|  */ | ||||
| extern int nss_dma_stats_unregister_notifier(struct notifier_block *nb); | ||||
|  | ||||
| /** | ||||
|  * nss_dma_stats_register_notifier | ||||
|  *	Registers a statistics notifier. | ||||
|  * | ||||
|  * @datatypes | ||||
|  *	notifier_block | ||||
|  * | ||||
|  * @param[in] nb Notifier block. | ||||
|  * | ||||
|  * @return | ||||
|  * 0 on success or non-zero on failure. | ||||
|  */ | ||||
| extern int nss_dma_stats_register_notifier(struct notifier_block *nb); | ||||
| #endif /*__KERNEL__ */ | ||||
|  | ||||
| /** | ||||
|   | ||||
| @@ -1,6 +1,6 @@ | ||||
| /* | ||||
|  ************************************************************************** | ||||
|  * Copyright (c) 2017-2020, The Linux Foundation. All rights reserved. | ||||
|  * Copyright (c) 2017-2021, The Linux Foundation. All rights reserved. | ||||
|  * Permission to use, copy, modify, and/or distribute this software for | ||||
|  * any purpose with or without fee is hereby granted, provided that the | ||||
|  * above copyright notice and this permission notice appear in all copies. | ||||
| @@ -74,6 +74,85 @@ enum nss_dtls_cmn_error { | ||||
| 	NSS_DTLS_CMN_ERROR_MAX, | ||||
| }; | ||||
|  | ||||
| /** | ||||
|  * nss_dtls_cmn_ctx_stats_types | ||||
|  *	DTLS common context statistics types. | ||||
|  */ | ||||
| enum nss_dtls_cmn_ctx_stats_types { | ||||
| 	NSS_DTLS_CMN_STATS_RX_SINGLE_REC = NSS_STATS_NODE_MAX, | ||||
| 						/**< Received single DTLS record datagrams. */ | ||||
| 	NSS_DTLS_CMN_STATS_RX_MULTI_REC,	/**< Received multiple DTLS record datagrams. */ | ||||
| 	NSS_DTLS_CMN_STATS_FAIL_CRYPTO_RESOURCE,/**< Failure in crypto resource allocation. */ | ||||
| 	NSS_DTLS_CMN_STATS_FAIL_CRYPTO_ENQUEUE,	/**< Failure due to full queue in crypto or hardware. */ | ||||
| 	NSS_DTLS_CMN_STATS_FAIL_HEADROOM,	/**< Failure in headroom check. */ | ||||
| 	NSS_DTLS_CMN_STATS_FAIL_TAILROOM,	/**< Failure in tailroom check. */ | ||||
| 	NSS_DTLS_CMN_STATS_FAIL_VER,		/**< Failure in DTLS version check. */ | ||||
| 	NSS_DTLS_CMN_STATS_FAIL_EPOCH,		/**< Failure in DTLS epoch check. */ | ||||
| 	NSS_DTLS_CMN_STATS_FAIL_DTLS_RECORD,	/**< Failure in reading DTLS record. */ | ||||
| 	NSS_DTLS_CMN_STATS_FAIL_CAPWAP,		/**< Failure in CAPWAP classification. */ | ||||
| 	NSS_DTLS_CMN_STATS_FAIL_REPLAY,		/**< Failure in anti-replay check. */ | ||||
| 	NSS_DTLS_CMN_STATS_FAIL_REPLAY_DUP,	/**< Failure in anti-replay; duplicate records. */ | ||||
| 	NSS_DTLS_CMN_STATS_FAIL_REPLAY_WIN,	/**< Failure in anti-replay; packet outside the window. */ | ||||
| 	NSS_DTLS_CMN_STATS_FAIL_QUEUE,		/**< Failure due to full queue in DTLS. */ | ||||
| 	NSS_DTLS_CMN_STATS_FAIL_QUEUE_NEXTHOP,	/**< Failure due to full queue in next hop. */ | ||||
| 	NSS_DTLS_CMN_STATS_FAIL_PBUF_ALLOC,	/**< Failure in pbuf allocation. */ | ||||
| 	NSS_DTLS_CMN_STATS_FAIL_PBUF_LINEAR,	/**< Failure in pbuf linearization. */ | ||||
| 	NSS_DTLS_CMN_STATS_FAIL_PBUF_STATS,	/**< Failure in pbuf allocation for statistics. */ | ||||
| 	NSS_DTLS_CMN_STATS_FAIL_PBUF_ALIGN,	/**< Failure in pbuf alignment. */ | ||||
| 	NSS_DTLS_CMN_STATS_FAIL_CTX_ACTIVE,	/**< Failure in enqueue due to inactive context. */ | ||||
| 	NSS_DTLS_CMN_STATS_FAIL_HWCTX_ACTIVE,	/**< Failure in enqueue due to inactive hardware context. */ | ||||
| 	NSS_DTLS_CMN_STATS_FAIL_CIPHER,		/**< Failure in decrypting the data. */ | ||||
| 	NSS_DTLS_CMN_STATS_FAIL_AUTH,		/**< Failure in authenticating the data. */ | ||||
| 	NSS_DTLS_CMN_STATS_FAIL_SEQ_OVF,	/**< Failure due to sequence number overflow. */ | ||||
| 	NSS_DTLS_CMN_STATS_FAIL_BLK_LEN,	/**< Failure in decapsulation due to bad cipher length. */ | ||||
| 	NSS_DTLS_CMN_STATS_FAIL_HASH_LEN,	/**< Failure in decapsulation due to bad hash length. */ | ||||
| 	NSS_DTLS_CMN_STATS_LEN_ERROR,		/**< Length error. */ | ||||
| 	NSS_DTLS_CMN_STATS_TOKEN_ERROR,		/**< Token error, unknown token command or instruction. */ | ||||
| 	NSS_DTLS_CMN_STATS_BYPASS_ERROR,	/**< Token contains too much bypass data. */ | ||||
| 	NSS_DTLS_CMN_STATS_CONFIG_ERROR,	/**< Invalid command, algorithm, or mode combination. */ | ||||
| 	NSS_DTLS_CMN_STATS_ALGO_ERROR,		/**< Unsupported algorithm. */ | ||||
| 	NSS_DTLS_CMN_STATS_HASH_OVF_ERROR,	/**< Hash input overflow. */ | ||||
| 	NSS_DTLS_CMN_STATS_TTL_ERROR,		/**< TTL or HOP-Limit underflow. */ | ||||
| 	NSS_DTLS_CMN_STATS_CSUM_ERROR,		/**< Checksum error. */ | ||||
| 	NSS_DTLS_CMN_STATS_TIMEOUT_ERROR,	/**< Data timed out. */ | ||||
| 	NSS_DTLS_CMN_STATS_CLE_ERROR_0,		/**< Classification failure 0. */ | ||||
| 	NSS_DTLS_CMN_STATS_CLE_ERROR_1,		/**< Classification failure 1. */ | ||||
| 	NSS_DTLS_CMN_STATS_CLE_ERROR_2,		/**< Classification failure 2. */ | ||||
| 	NSS_DTLS_CMN_STATS_CLE_ERROR_3,		/**< Classification failure 3. */ | ||||
| 	NSS_DTLS_CMN_STATS_CLE_ERROR_4,		/**< Classification failure 4. */ | ||||
| 	NSS_DTLS_CMN_STATS_CLE_ERROR_5,		/**< Classification failure 5. */ | ||||
| 	NSS_DTLS_CMN_STATS_CLE_ERROR_6,		/**< Classification failure 6. */ | ||||
| 	NSS_DTLS_CMN_STATS_CLE_ERROR_7,		/**< Classification failure 7. */ | ||||
| 	NSS_DTLS_CMN_STATS_CLE_ERROR_8,		/**< Classification failure 8. */ | ||||
| 	NSS_DTLS_CMN_STATS_CLE_ERROR_9,		/**< Classification failure 9. */ | ||||
| 	NSS_DTLS_CMN_STATS_CLE_ERROR_10,	/**< Classification failure 10. */ | ||||
| 	NSS_DTLS_CMN_STATS_CLE_ERROR_11,	/**< Classification failure 11. */ | ||||
| 	NSS_DTLS_CMN_STATS_CLE_ERROR_12,	/**< Classification failure 12. */ | ||||
| 	NSS_DTLS_CMN_STATS_CLE_ERROR_13,	/**< Classification failure 13. */ | ||||
| 	NSS_DTLS_CMN_STATS_CLE_ERROR_14,	/**< Classification failure 14. */ | ||||
| 	NSS_DTLS_CMN_STATS_CLE_ERROR_15,	/**< Classification failure 15. */ | ||||
| 	NSS_DTLS_CMN_STATS_CLE_ERROR_16,	/**< Classification failure 16. */ | ||||
| 	NSS_DTLS_CMN_STATS_CLE_ERROR_17,	/**< Classification failure 17. */ | ||||
| 	NSS_DTLS_CMN_STATS_CLE_ERROR_18,	/**< Classification failure 18. */ | ||||
| 	NSS_DTLS_CMN_STATS_CLE_ERROR_19,	/**< Classification failure 19. */ | ||||
| 	NSS_DTLS_CMN_STATS_CLE_ERROR_20,	/**< Classification failure 20. */ | ||||
| 	NSS_DTLS_CMN_STATS_CLE_ERROR_21,	/**< Classification failure 21. */ | ||||
| 	NSS_DTLS_CMN_STATS_CLE_ERROR_22,	/**< Classification failure 22. */ | ||||
| 	NSS_DTLS_CMN_STATS_CLE_ERROR_23,	/**< Classification failure 23. */ | ||||
| 	NSS_DTLS_CMN_STATS_CLE_ERROR_24,	/**< Classification failure 24. */ | ||||
| 	NSS_DTLS_CMN_STATS_CLE_ERROR_25,	/**< Classification failure 25. */ | ||||
| 	NSS_DTLS_CMN_STATS_CLE_ERROR_26,	/**< Classification failure 26. */ | ||||
| 	NSS_DTLS_CMN_STATS_CLE_ERROR_27,	/**< Classification failure 27. */ | ||||
| 	NSS_DTLS_CMN_STATS_CLE_ERROR_28,	/**< Classification failure 28. */ | ||||
| 	NSS_DTLS_CMN_STATS_CLE_ERROR_29,	/**< Classification failure 29. */ | ||||
| 	NSS_DTLS_CMN_STATS_CLE_ERROR_30,	/**< Classification failure 30. */ | ||||
| 	NSS_DTLS_CMN_STATS_CLE_ERROR_31,	/**< Classification failure 31. */ | ||||
| 	NSS_DTLS_CMN_STATS_SEQ_LOW,		/**< Lower 32 bits of current transmit sequence number. */ | ||||
| 	NSS_DTLS_CMN_STATS_SEQ_HIGH,		/**< Upper 16 bits of current transmit sequence number. */ | ||||
| 	NSS_DTLS_CMN_STATS_EPOCH,		/**< Current epoch value. */ | ||||
| 	NSS_DTLS_CMN_CTX_STATS_MAX,		/**< Maximum message type. */ | ||||
| }; | ||||
|  | ||||
| /** | ||||
|  * nss_dtls_cmn_node_stats | ||||
|  * 	DTLS node statistics. | ||||
| @@ -183,6 +262,16 @@ struct nss_dtls_cmn_ctx_config_dtls { | ||||
| 	uint8_t res1;		/**< Reserved for alignment. */ | ||||
| }; | ||||
|  | ||||
| /** | ||||
|  * nss_dtls_cmn_stats_notification | ||||
|  *	DTLS common transmission statistics structure. | ||||
|  */ | ||||
| struct nss_dtls_cmn_stats_notification { | ||||
| 	uint64_t stats_ctx[NSS_DTLS_CMN_CTX_STATS_MAX];		/**< Context transmission statistics. */ | ||||
| 	uint32_t core_id;					/**< Core ID. */ | ||||
| 	uint32_t if_num;					/**< Interface number. */ | ||||
| }; | ||||
|  | ||||
| /** | ||||
|  * nss_dtls_cmn_msg | ||||
|  *	Data for sending and receiving DTLS messages. | ||||
| @@ -280,6 +369,20 @@ extern nss_tx_status_t nss_dtls_cmn_tx_msg_sync(struct nss_ctx_instance *nss_ctx | ||||
| 						enum nss_dtls_cmn_msg_type type, uint16_t len, | ||||
| 						struct nss_dtls_cmn_msg *ndcm, enum nss_dtls_cmn_error *resp); | ||||
|  | ||||
| /** | ||||
|  * nss_dtls_cmn_unregister_if | ||||
|  *	Deregisters a DTLS session interface from the NSS. | ||||
|  * | ||||
|  * @param[in] if_num  NSS interface number. | ||||
|  * | ||||
|  * @return | ||||
|  * None. | ||||
|  * | ||||
|  * @dependencies | ||||
|  * The DTLS session interface must have been previously registered. | ||||
|  */ | ||||
| extern void nss_dtls_cmn_unregister_if(uint32_t if_num); | ||||
|  | ||||
| /** | ||||
|  * nss_dtls_cmn_register_if | ||||
|  *	Registers a DTLS session interface with the NSS for sending and receiving | ||||
| @@ -309,22 +412,19 @@ extern struct nss_ctx_instance *nss_dtls_cmn_register_if(uint32_t if_num, | ||||
| 							 void *app_ctx); | ||||
|  | ||||
| /** | ||||
|  * nss_dtls_cmn_unregister_if | ||||
|  *	Deregisters a DTLS session interface from the NSS. | ||||
|  * nss_dtls_cmn_notify_unregister | ||||
|  *	Deregisters an event callback. | ||||
|  * | ||||
|  * @param[in] if_num  NSS interface number. | ||||
|  * @param[in] ifnum  NSS interface number. | ||||
|  * | ||||
|  * @return | ||||
|  * None. | ||||
|  * | ||||
|  * @dependencies | ||||
|  * The DTLS session interface must have been previously registered. | ||||
|  */ | ||||
| extern void nss_dtls_cmn_unregister_if(uint32_t if_num); | ||||
| extern void nss_dtls_cmn_notify_unregister(uint32_t ifnum); | ||||
|  | ||||
| /** | ||||
|  * nss_dtls_cmn_notify_register | ||||
|  *	Register an event callback to handle notification from DTLS firmware package. | ||||
|  *	Registers an event callback to handle notification from DTLS firmware package. | ||||
|  * | ||||
|  * @param[in] ifnum     NSS interface number. | ||||
|  * @param[in] ev_cb     Callback for DTLS tunnel message. | ||||
| @@ -336,17 +436,6 @@ extern void nss_dtls_cmn_unregister_if(uint32_t if_num); | ||||
| extern struct nss_ctx_instance *nss_dtls_cmn_notify_register(uint32_t ifnum, nss_dtls_cmn_msg_callback_t ev_cb, | ||||
| 							     void *app_data); | ||||
|  | ||||
| /** | ||||
|  * nss_dtls_cmn_notify_unregister | ||||
|  *	Unregister an event callback. | ||||
|  * | ||||
|  * @param[in] ifnum  NSS interface number. | ||||
|  * | ||||
|  * @return | ||||
|  * None. | ||||
|  */ | ||||
| extern void nss_dtls_cmn_notify_unregister(uint32_t ifnum); | ||||
|  | ||||
| /** | ||||
|  * nss_dtls_cmn_msg_init | ||||
|  *	Initializes a DTLS message. | ||||
| @@ -387,6 +476,34 @@ extern struct nss_ctx_instance *nss_dtls_cmn_get_context(void); | ||||
|  */ | ||||
| extern int32_t nss_dtls_cmn_get_ifnum(int32_t if_num); | ||||
|  | ||||
| /** | ||||
|  * nss_dtls_cmn_stats_unregister_notifier | ||||
|  *	Deregisters a statistics notifier. | ||||
|  * | ||||
|  * @datatypes | ||||
|  *	notifier_block | ||||
|  * | ||||
|  * @param[in] nb Notifier block. | ||||
|  * | ||||
|  * @return | ||||
|  * 0 on success or non-zero on failure. | ||||
|  */ | ||||
| extern int nss_dtls_cmn_stats_unregister_notifier(struct notifier_block *nb); | ||||
|  | ||||
| /** | ||||
|  * nss_dtls_cmn_stats_register_notifier | ||||
|  *	Registers a statistics notifier. | ||||
|  * | ||||
|  * @datatypes | ||||
|  *	notifier_block | ||||
|  * | ||||
|  * @param[in] nb Notifier block. | ||||
|  * | ||||
|  * @return | ||||
|  * 0 on success or non-zero on failure. | ||||
|  */ | ||||
| extern int nss_dtls_cmn_stats_register_notifier(struct notifier_block *nb); | ||||
|  | ||||
| /** | ||||
|  * @} | ||||
|  */ | ||||
|   | ||||
| @@ -1,6 +1,6 @@ | ||||
| /* | ||||
|  ************************************************************************** | ||||
|  * Copyright (c) 2014-2020, The Linux Foundation. All rights reserved. | ||||
|  * Copyright (c) 2014-2021, The Linux Foundation. All rights reserved. | ||||
|  * Permission to use, copy, modify, and/or distribute this software for | ||||
|  * any purpose with or without fee is hereby granted, provided that the | ||||
|  * above copyright notice and this permission notice appear in all copies. | ||||
| @@ -40,10 +40,10 @@ | ||||
| enum nss_dynamic_interface_type { | ||||
| 	NSS_DYNAMIC_INTERFACE_TYPE_NONE, | ||||
| 	NSS_DYNAMIC_INTERFACE_TYPE_GRE_REDIR, | ||||
| 	NSS_DYNAMIC_INTERFACE_TYPE_CAPWAP, | ||||
| 	NSS_DYNAMIC_INTERFACE_TYPE_RESERVED_5, | ||||
| 	NSS_DYNAMIC_INTERFACE_TYPE_TUNIPIP6_INNER, | ||||
| 	NSS_DYNAMIC_INTERFACE_TYPE_TUNIPIP6_OUTER, | ||||
| 	NSS_DYNAMIC_INTERFACE_TYPE_WIFI, | ||||
| 	NSS_DYNAMIC_INTERFACE_TYPE_RESERVED, | ||||
| 	NSS_DYNAMIC_INTERFACE_TYPE_VAP, | ||||
| 	NSS_DYNAMIC_INTERFACE_TYPE_RESERVED_0, | ||||
| 	NSS_DYNAMIC_INTERFACE_TYPE_PPPOE, | ||||
| @@ -105,6 +105,11 @@ enum nss_dynamic_interface_type { | ||||
| 	NSS_DYNAMIC_INTERFACE_TYPE_TLS_OUTER, | ||||
| 	NSS_DYNAMIC_INTERFACE_TYPE_MIRROR, | ||||
| 	NSS_DYNAMIC_INTERFACE_TYPE_WIFI_EXT_VDEV_WDS, | ||||
| 	NSS_DYNAMIC_INTERFACE_TYPE_CAPWAP_HOST_INNER, | ||||
| 	NSS_DYNAMIC_INTERFACE_TYPE_CAPWAP_OUTER, | ||||
| 	NSS_DYNAMIC_INTERFACE_TYPE_WIFI_EXT_VDEV_VLAN, | ||||
| 	NSS_DYNAMIC_INTERFACE_TYPE_WIFI_MESH_INNER, | ||||
| 	NSS_DYNAMIC_INTERFACE_TYPE_WIFI_MESH_OUTER, | ||||
| 	NSS_DYNAMIC_INTERFACE_TYPE_MAX | ||||
| }; | ||||
|  | ||||
|   | ||||
| @@ -1,6 +1,6 @@ | ||||
| /* | ||||
|  ************************************************************************** | ||||
|  * Copyright (c) 2016-2020, The Linux Foundation. All rights reserved. | ||||
|  * Copyright (c) 2016-2021, The Linux Foundation. All rights reserved. | ||||
|  * Permission to use, copy, modify, and/or distribute this software for | ||||
|  * any purpose with or without fee is hereby granted, provided that the | ||||
|  * above copyright notice and this permission notice appear in all copies. | ||||
| @@ -84,6 +84,7 @@ enum nss_edma_stats_rx_t { | ||||
| 	NSS_EDMA_STATS_RX_DESC, | ||||
| 	NSS_EDMA_STATS_RX_QOS_ERR, | ||||
| 	NSS_EDMA_STATS_RX_SRC_PORT_INVALID, | ||||
| 	NSS_EDMA_STATS_RX_SRC_IF_INVALID, | ||||
| 	NSS_EDMA_STATS_RX_MAX | ||||
| }; | ||||
|  | ||||
| @@ -143,6 +144,7 @@ struct nss_edma_rx_ring_stats { | ||||
| 	uint32_t desc_cnt;		/**< Number of descriptors processed. */ | ||||
| 	uint32_t qos_err;		/**< Number of QoS errors. */ | ||||
| 	uint32_t rx_src_port_invalid;	/**< Number of source port invalid errors. */ | ||||
| 	uint32_t rx_src_if_invalid;	/**< Number of source interface invalid errors. */ | ||||
| }; | ||||
|  | ||||
| /** | ||||
|   | ||||
| @@ -1,6 +1,6 @@ | ||||
| /* | ||||
|  ************************************************************************** | ||||
|  * Copyright (c) 2017-2019, The Linux Foundation. All rights reserved. | ||||
|  **************************************************************************** | ||||
|  * Copyright (c) 2017-2019, 2021, The Linux Foundation. All rights reserved. | ||||
|  * Permission to use, copy, modify, and/or distribute this software for | ||||
|  * any purpose with or without fee is hereby granted, provided that the | ||||
|  * above copyright notice and this permission notice appear in all copies. | ||||
| @@ -11,7 +11,7 @@ | ||||
|  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN | ||||
|  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT | ||||
|  * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | ||||
|  ************************************************************************** | ||||
|  **************************************************************************** | ||||
|  */ | ||||
|  | ||||
| /** | ||||
| @@ -119,47 +119,49 @@ enum nss_gre_ip_types { | ||||
| }; | ||||
|  | ||||
| /** | ||||
|  * GRE Base debug statistics | ||||
|  * nss_gre_base_types | ||||
|  *	GRE base debug statistics. | ||||
|  */ | ||||
| enum nss_gre_base_debug_types { | ||||
| 	GRE_BASE_RX_PACKETS,			/**< Rx packet count. */ | ||||
| 	GRE_BASE_RX_DROPPED,			/**< Number of packet dropped at Rx. */ | ||||
| 	GRE_BASE_EXP_ETH_HDR_MISSING,		/**< Ethernet header missing. */ | ||||
| 	GRE_BASE_EXP_ETH_TYPE_NON_IP,		/**< Packet is not IPV4 or IPV6. */ | ||||
| 	GRE_BASE_EXP_IP_UNKNOWN_PROTOCOL,	/**< Packet protocol is unknown. */ | ||||
| 	GRE_BASE_EXP_IP_HEADER_INCOMPLETE,	/**< Bad IP header. */ | ||||
| 	GRE_BASE_EXP_IP_BAD_TOTAL_LENGTH,	/**< IP total lenghth is invalid. */ | ||||
| 	GRE_BASE_EXP_IP_BAD_CHECKSUM,		/**< IP checksum is bad. */ | ||||
| 	GRE_BASE_EXP_IP_DATAGRAM_INCOMPLETE,	/**< Bad packet. */ | ||||
| 	GRE_BASE_EXP_IP_FRAGMENT,		/**< IP packet is a fragment. */ | ||||
| 	GRE_BASE_EXP_IP_OPTIONS_INCOMPLETE,	/**< IP option is invalid. */ | ||||
| 	GRE_BASE_EXP_IP_WITH_OPTIONS,		/**< IP packet with options. */ | ||||
| 	GRE_BASE_EXP_IPV6_UNKNOWN_PROTOCOL,	/**< Protocol is unknown. */ | ||||
| 	GRE_BASE_EXP_IPV6_HEADER_INCOMPLETE,	/**< Incomplete ipv6 header. */ | ||||
| 	GRE_BASE_EXP_GRE_UNKNOWN_SESSION,	/**< Unknown GRE session. */ | ||||
| 	GRE_BASE_EXP_GRE_NODE_INACTIVE,		/**< GRE node is inactive. */ | ||||
| 	GRE_BASE_DEBUG_MAX,			/**< GRE base debug max. */ | ||||
| enum nss_gre_base_types { | ||||
| 	NSS_GRE_BASE_RX_PACKETS,		/**< Receive packet count. */ | ||||
| 	NSS_GRE_BASE_RX_DROPPED,		/**< Number of packet dropped at receive. */ | ||||
| 	NSS_GRE_BASE_EXP_ETH_HDR_MISSING,	/**< Ethernet header missing. */ | ||||
| 	NSS_GRE_BASE_EXP_ETH_TYPE_NON_IP,	/**< Packet is not IPV4 or IPV6. */ | ||||
| 	NSS_GRE_BASE_EXP_IP_UNKNOWN_PROTOCOL,	/**< Packet protocol is unknown. */ | ||||
| 	NSS_GRE_BASE_EXP_IP_HEADER_INCOMPLETE,	/**< Bad IP header. */ | ||||
| 	NSS_GRE_BASE_EXP_IP_BAD_TOTAL_LENGTH,	/**< IP total length is invalid. */ | ||||
| 	NSS_GRE_BASE_EXP_IP_BAD_CHECKSUM,	/**< IP checksum is bad. */ | ||||
| 	NSS_GRE_BASE_EXP_IP_DATAGRAM_INCOMPLETE,/**< Bad packet. */ | ||||
| 	NSS_GRE_BASE_EXP_IP_FRAGMENT,		/**< IP packet is a fragment. */ | ||||
| 	NSS_GRE_BASE_EXP_IP_OPTIONS_INCOMPLETE,	/**< IP option is invalid. */ | ||||
| 	NSS_GRE_BASE_EXP_IP_WITH_OPTIONS,	/**< IP packet with options. */ | ||||
| 	NSS_GRE_BASE_EXP_IPV6_UNKNOWN_PROTOCOL,	/**< Protocol is unknown. */ | ||||
| 	NSS_GRE_BASE_EXP_IPV6_HEADER_INCOMPLETE,/**< Incomplete ipv6 header. */ | ||||
| 	NSS_GRE_BASE_EXP_GRE_UNKNOWN_SESSION,	/**< Unknown GRE session. */ | ||||
| 	NSS_GRE_BASE_EXP_GRE_NODE_INACTIVE,	/**< GRE node is inactive. */ | ||||
| 	NSS_GRE_BASE_DEBUG_MAX,			/**< GRE base debug maximum. */ | ||||
| }; | ||||
|  | ||||
| /* | ||||
|  * GRE session Packet drop and exception events. | ||||
| /** | ||||
|  * nss_gre_session_types | ||||
|  *	GRE session packet drop and exception events. | ||||
|  */ | ||||
| enum gre_session_debug_types { | ||||
| 	GRE_SESSION_PBUF_ALLOC_FAIL,		/**< Pbuf allocation failure. */ | ||||
| 	GRE_SESSION_DECAP_FORWARD_ENQUEUE_FAIL,	/**< Rx forward enqueue failure. */ | ||||
| 	GRE_SESSION_ENCAP_FORWARD_ENQUEUE_FAIL,	/**< Tx forward enqueue failure. */ | ||||
| 	GRE_SESSION_DECAP_TX_FORWARDED,		/**< Number of packets forwarded after decap. */ | ||||
| 	GRE_SESSION_ENCAP_RX_RECEIVED,		/**< Number of packets received for encap. */ | ||||
| 	GRE_SESSION_ENCAP_RX_DROPPED,		/**< Packets dropped while enqueuing for encap. */ | ||||
| 	GRE_SESSION_ENCAP_RX_LINEAR_FAIL,	/**< Packets dropped during encap linearization. */ | ||||
| 	GRE_SESSION_EXP_RX_KEY_ERROR,		/**< Rx KEY error. */ | ||||
| 	GRE_SESSION_EXP_RX_SEQ_ERROR,		/**< Rx Sequence number error. */ | ||||
| 	GRE_SESSION_EXP_RX_CS_ERROR,		/**< Rx checksum error */ | ||||
| 	GRE_SESSION_EXP_RX_FLAG_MISMATCH,	/**< Rx flag mismatch. */ | ||||
| 	GRE_SESSION_EXP_RX_MALFORMED,		/**< Rx packet is malformed. */ | ||||
| 	GRE_SESSION_EXP_RX_INVALID_PROTOCOL,	/**< Rx packet protocol is invalid. */ | ||||
| 	GRE_SESSION_EXP_RX_NO_HEADROOM,		/**< Packet does not have enough headroom. */ | ||||
| 	GRE_SESSION_DEBUG_MAX,			/**< Session debug max. */ | ||||
| enum nss_gre_session_types { | ||||
| 	NSS_GRE_SESSION_PBUF_ALLOC_FAIL,		/**< Pbuf allocation failure. */ | ||||
| 	NSS_GRE_SESSION_DECAP_FORWARD_ENQUEUE_FAIL,	/**< Receive forward enqueue failure. */ | ||||
| 	NSS_GRE_SESSION_ENCAP_FORWARD_ENQUEUE_FAIL,	/**< Transmit forward enqueue failure. */ | ||||
| 	NSS_GRE_SESSION_DECAP_TX_FORWARDED,		/**< Number of packets forwarded after decapsulation. */ | ||||
| 	NSS_GRE_SESSION_ENCAP_RX_RECEIVED,		/**< Number of packets received for encapsulation. */ | ||||
| 	NSS_GRE_SESSION_ENCAP_RX_DROPPED,		/**< Packets dropped while enqueuing for encapsulation. */ | ||||
| 	NSS_GRE_SESSION_ENCAP_RX_LINEAR_FAIL,		/**< Packets dropped during encapsulation linearization. */ | ||||
| 	NSS_GRE_SESSION_EXP_RX_KEY_ERROR,		/**< Receive key error. */ | ||||
| 	NSS_GRE_SESSION_EXP_RX_SEQ_ERROR,		/**< Receive Sequence number error. */ | ||||
| 	NSS_GRE_SESSION_EXP_RX_CS_ERROR,		/**< Receive checksum error */ | ||||
| 	NSS_GRE_SESSION_EXP_RX_FLAG_MISMATCH,		/**< Receive flag mismatch. */ | ||||
| 	NSS_GRE_SESSION_EXP_RX_MALFORMED,		/**< Receive packet is malformed. */ | ||||
| 	NSS_GRE_SESSION_EXP_RX_INVALID_PROTOCOL,	/**< Receive packet protocol is invalid. */ | ||||
| 	NSS_GRE_SESSION_EXP_RX_NO_HEADROOM,		/**< Packet does not have enough headroom. */ | ||||
| 	NSS_GRE_SESSION_DEBUG_MAX,			/**< Session debug maximum. */ | ||||
| }; | ||||
|  | ||||
| /** | ||||
| @@ -208,14 +210,33 @@ struct nss_gre_deconfig_msg { | ||||
|  */ | ||||
| struct nss_gre_session_stats_msg { | ||||
| 	struct nss_cmn_node_stats node_stats;		/**< Common node statistics. */ | ||||
| 	uint32_t stats[GRE_SESSION_DEBUG_MAX];	/**< Session debug statistics. */ | ||||
| 	uint32_t stats[NSS_GRE_SESSION_DEBUG_MAX];	/**< Session debug statistics. */ | ||||
| }; | ||||
|  | ||||
| /** | ||||
|  * GRE base statistics message | ||||
|  */ | ||||
| struct nss_gre_base_stats_msg { | ||||
| 	uint32_t stats[GRE_BASE_DEBUG_MAX];	/**< Base debug statistics. */ | ||||
| 	uint32_t stats[NSS_GRE_BASE_DEBUG_MAX];		/**< Base debug statistics. */ | ||||
| }; | ||||
|  | ||||
| /** | ||||
|  * nss_gre_base_stats_notification | ||||
|  *	GRE transmission statistics structure. | ||||
|  */ | ||||
| struct nss_gre_base_stats_notification { | ||||
| 	uint64_t stats_base_ctx[NSS_GRE_BASE_DEBUG_MAX];	/**< Base debug transmission statistics. */ | ||||
| 	uint32_t core_id;					/**< Core ID. */ | ||||
| }; | ||||
|  | ||||
| /** | ||||
|  * nss_gre_session_stats_notification | ||||
|  *	GRE transmission statistics structure. | ||||
|  */ | ||||
| struct nss_gre_session_stats_notification { | ||||
| 	uint64_t stats_session_ctx[NSS_GRE_SESSION_DEBUG_MAX];		/**< Session debug transmission statistics. */ | ||||
| 	uint32_t core_id;						/**< Core ID. */ | ||||
| 	uint32_t if_num;						/**< Interface number. */ | ||||
| }; | ||||
|  | ||||
| /** | ||||
| @@ -438,6 +459,34 @@ extern void nss_gre_register_pkt_callback(nss_gre_pkt_callback_t cb); | ||||
|  */ | ||||
| extern void nss_gre_unregister_pkt_callback(void); | ||||
|  | ||||
| /** | ||||
|  * nss_gre_stats_unregister_notifier | ||||
|  *	Deregisters a statistics notifier. | ||||
|  * | ||||
|  * @datatypes | ||||
|  *	notifier_block | ||||
|  * | ||||
|  * @param[in] nb Notifier block. | ||||
|  * | ||||
|  * @return | ||||
|  * 0 on success or non-zero on failure. | ||||
|  */ | ||||
| extern int nss_gre_stats_unregister_notifier(struct notifier_block *nb); | ||||
|  | ||||
| /** | ||||
|  * nss_gre_stats_register_notifier | ||||
|  *	Registers a statistics notifier. | ||||
|  * | ||||
|  * @datatypes | ||||
|  *	notifier_block | ||||
|  * | ||||
|  * @param[in] nb Notifier block. | ||||
|  * | ||||
|  * @return | ||||
|  * 0 on success or non-zero on failure. | ||||
|  */ | ||||
| extern int nss_gre_stats_register_notifier(struct notifier_block *nb); | ||||
|  | ||||
| /** | ||||
|  * @} | ||||
|  */ | ||||
|   | ||||
| @@ -1,6 +1,6 @@ | ||||
| /* | ||||
|  ************************************************************************** | ||||
|  * Copyright (c) 2014-2015, 2017-2020, The Linux Foundation. All rights reserved. | ||||
|  * Copyright (c) 2014-2015, 2017-2021, The Linux Foundation. All rights reserved. | ||||
|  * Permission to use, copy, modify, and/or distribute this software for | ||||
|  * any purpose with or without fee is hereby granted, provided that the | ||||
|  * above copyright notice and this permission notice appear in all copies. | ||||
| @@ -92,6 +92,60 @@ enum nss_gre_redir_tunnel_types { | ||||
| 	NSS_GRE_REDIR_TUNNEL_TYPE_MAX,		/**< Maximum tunnel type. */ | ||||
| }; | ||||
|  | ||||
| /** | ||||
|  * nss_gre_redir_stats_types | ||||
|  *	GRE redirect statistics types. | ||||
|  */ | ||||
| enum nss_gre_redir_stats_types { | ||||
| 	NSS_GRE_REDIR_STATS_TX_DROPS = NSS_STATS_NODE_MAX, | ||||
| 						/**< Dropped transmit packets. */ | ||||
| 	NSS_GRE_REDIR_STATS_SJACK_RX_PKTS,	/**< SJACK receive packet counter. */ | ||||
| 	NSS_GRE_REDIR_STATS_SJACK_TX_PKTS,	/**< SJACK transmit packet counter. */ | ||||
| 	NSS_GRE_REDIR_STATS_OFFLOAD_RX_PKTS_0,	/**< Offload receive packet counter 0. */ | ||||
| 	NSS_GRE_REDIR_STATS_OFFLOAD_RX_PKTS_1,	/**< Offload receive packet counter 1. */ | ||||
| 	NSS_GRE_REDIR_STATS_OFFLOAD_RX_PKTS_2,	/**< Offload receive packet counter 2. */ | ||||
| 	NSS_GRE_REDIR_STATS_OFFLOAD_RX_PKTS_3,	/**< Offload receive packet counter 3. */ | ||||
| 	NSS_GRE_REDIR_STATS_OFFLOAD_RX_PKTS_4,	/**< Offload receive packet counter 4. */ | ||||
| 	NSS_GRE_REDIR_STATS_OFFLOAD_TX_PKTS_0,	/**< Offload transmit packet counter 0. */ | ||||
| 	NSS_GRE_REDIR_STATS_OFFLOAD_TX_PKTS_1,	/**< Offload transmit packet counter 1. */ | ||||
| 	NSS_GRE_REDIR_STATS_OFFLOAD_TX_PKTS_2,	/**< Offload transmit packet counter 2. */ | ||||
| 	NSS_GRE_REDIR_STATS_OFFLOAD_TX_PKTS_3,	/**< Offload transmit packet counter 3. */ | ||||
| 	NSS_GRE_REDIR_STATS_OFFLOAD_TX_PKTS_4,	/**< Offload transmit packet counter 4. */ | ||||
| 	NSS_GRE_REDIR_STATS_EXCEPTION_US_RX_PKTS, | ||||
| 						/**< Upstream exception receive packet counter. */ | ||||
| 	NSS_GRE_REDIR_STATS_EXCEPTION_US_TX_PKTS, | ||||
| 						/**< Upstream exception transmit packet counter. */ | ||||
| 	NSS_GRE_REDIR_STATS_EXCEPTION_DS_RX_PKTS, | ||||
| 						/**< Downstream exception receive packet counter. */ | ||||
| 	NSS_GRE_REDIR_STATS_EXCEPTION_DS_TX_PKTS, | ||||
| 						/**< Downstream exception transmit packet counter. */ | ||||
| 	NSS_GRE_REDIR_STATS_ENCAP_SG_ALLOC_DROP, | ||||
| 						/**< Encapsulation drop counters due to scatter gather buffer allocation failure. */ | ||||
| 	NSS_GRE_REDIR_STATS_DECAP_FAIL_DROP, | ||||
| 						/**< Decapsulation drop counters due to invalid IP header. */ | ||||
| 	NSS_GRE_REDIR_STATS_DECAP_SPLIT_DROP, | ||||
| 						/**< Decapsulation drop counters due to split flow processing. */ | ||||
| 	NSS_GRE_REDIR_STATS_SPLIT_SG_ALLOC_FAIL, | ||||
| 						/**< Split processing fail counter due to scatter gather buffer allocation failure. */ | ||||
| 	NSS_GRE_REDIR_STATS_SPLIT_LINEAR_COPY_FAIL, | ||||
| 						/**< Split processing fail counter due to linear copy fail. */ | ||||
| 	NSS_GRE_REDIR_STATS_SPLIT_NOT_ENOUGH_TAILROOM, | ||||
| 						/**< Split processing fail counter due to insufficient tailroom. */ | ||||
| 	NSS_GRE_REDIR_STATS_EXCEPTION_DS_INVALID_DST_DROP, | ||||
| 						/**< Downstream exception handling fail counter due to invalid destination. */ | ||||
| 	NSS_GRE_REDIR_STATS_DECAP_EAPOL_FRAMES, | ||||
| 						/**< Decapsulation EAPoL frame counters. */ | ||||
| 	NSS_GRE_REDIR_STATS_EXCEPTION_DS_INV_APPID, | ||||
| 						/**< Invalid application ID for the transmit completion packets on exception downstream node. */ | ||||
| 	NSS_GRE_REDIR_STATS_HEADROOM_UNAVAILABLE, | ||||
| 						/**< Packet headroom unavailable to write metadata. */ | ||||
| 	NSS_GRE_REDIR_STATS_TX_COMPLETION_SUCCESS, | ||||
| 						/**< Host enqueue success count for the transmit completion packets. */ | ||||
| 	NSS_GRE_REDIR_STATS_TX_COMPLETION_DROP, | ||||
| 						/**< Host enqueue drop count for the transmit completion packets. */ | ||||
| 	NSS_GRE_REDIR_STATS_MAX			/**< Maximum statistics type. */ | ||||
| }; | ||||
|  | ||||
| /** | ||||
|  * nss_gre_redir_inner_configure_msg | ||||
|  *	Message information for configuring GRE inner node. | ||||
| @@ -246,37 +300,66 @@ struct nss_gre_redir_stats_sync_msg { | ||||
| 	uint32_t tx_completion_drop;			/**< Host enqueue drop count for the Tx completion packets. */ | ||||
| }; | ||||
|  | ||||
| /** | ||||
|  * nss_gre_redir_tun_stats | ||||
|  *	GRE redirect statistics to accumulate all the stats values. | ||||
|  */ | ||||
| struct nss_gre_redir_tun_stats { | ||||
| 	uint64_t rx_packets;		/**< Number of packets received. */ | ||||
| 	uint64_t rx_bytes;		/**< Number of bytes received. */ | ||||
| 	uint64_t tx_packets;		/**< Number of packets transmitted. */ | ||||
| 	uint64_t tx_bytes;		/**< Number of bytes transmitted. */ | ||||
| 	uint64_t rx_dropped[NSS_MAX_NUM_PRI]; | ||||
| 					/**< Packets dropped on receive due to queue full. */ | ||||
| 	uint64_t tx_dropped;		/**< Dropped transmit packets. */ | ||||
| 	uint64_t sjack_rx_packets;	/**< SJACK receive packet counter. */ | ||||
| 	uint64_t sjack_tx_packets;	/**< SJACK transmit packet counter. */ | ||||
| 	uint64_t offl_rx_pkts[NSS_GRE_REDIR_MAX_RADIO];	/**< Offload receive packet counter per radio. */ | ||||
| 	uint64_t offl_tx_pkts[NSS_GRE_REDIR_MAX_RADIO];	/**< Offload transmit packet counter per radio. */ | ||||
| 	uint64_t exception_us_rx;	/**< Upstream exception receive packet counter. */ | ||||
| 	uint64_t exception_us_tx;	/**< Upstream exception transmit packet counter. */ | ||||
| 	uint64_t exception_ds_rx;	/**< Downstream exception receive packet counter. */ | ||||
| 	uint64_t exception_ds_tx;	/**< Downstream exception transmit packet counter. */ | ||||
| 	uint64_t encap_sg_alloc_drop; | ||||
| 					/**< Encapsulation drop counters due to scatter gather buffer allocation failure. */ | ||||
| 	uint64_t decap_fail_drop;	/**< Decapsulation drop counters due to invalid IP header. */ | ||||
| 	uint64_t decap_split_drop;	/**< Decapsulation drop counters due to split flow processing. */ | ||||
| 	uint64_t split_sg_alloc_fail; | ||||
| 					/**< Split processing fail counter due to scatter gather buffer allocation failure. */ | ||||
| 	uint64_t split_linear_copy_fail; | ||||
| 					/**< Split processing fail counter due to linear copy fail. */ | ||||
| 	uint64_t split_not_enough_tailroom; | ||||
| 					/**< Split processing fail counter due to insufficient tailroom. */ | ||||
| 	uint64_t exception_ds_invalid_dst_drop; | ||||
| 					/**< Downstream exception handling fail counter due to invalid destination. */ | ||||
| 	uint64_t decap_eapol_frames;	/**< Decapsulation EAPoL frame counters. */ | ||||
| 	uint64_t exception_ds_inv_appid; | ||||
| 					/**< Invalid application ID for the transmit completion packets on exception downstream node. */ | ||||
| 	uint64_t headroom_unavail;	/**< Packet headroom unavailable to write metadata. */ | ||||
| 	uint64_t tx_completion_success;	/**< Host enqueue success count for the transmit completion packets. */ | ||||
| 	uint64_t tx_completion_drop;	/**< Host enqueue drop count for the transmit completion packets. */ | ||||
| }; | ||||
|  | ||||
| /** | ||||
|  * nss_gre_redir_tunnel_stats | ||||
|  *	GRE redirect statistics as seen by the HLOS. | ||||
|  */ | ||||
| struct nss_gre_redir_tunnel_stats { | ||||
| 	struct net_device *dev;			/**< Net device. */ | ||||
| 	struct nss_cmn_node_stats node_stats;		/**< Common node statistics. */ | ||||
| 	uint64_t tx_dropped;				/**< Dropped Tx packets. */ | ||||
| 	uint64_t sjack_rx_packets;			/**< SJACK Rx packet counter. */ | ||||
| 	uint64_t sjack_tx_packets;			/**< SJACK Tx packet counter. */ | ||||
| 	uint64_t offl_rx_pkts[NSS_GRE_REDIR_MAX_RADIO];	/**< Offload Rx packet counter per radio. */ | ||||
| 	uint64_t offl_tx_pkts[NSS_GRE_REDIR_MAX_RADIO];	/**< Offload Tx packet counter per radio. */ | ||||
| 	uint64_t exception_us_rx;			/**< Upstream exception Rx packet counter. */ | ||||
| 	uint64_t exception_us_tx;			/**< Upstream exception Tx packet counter. */ | ||||
| 	uint64_t exception_ds_rx;			/**< Downstream exception Rx packet counter. */ | ||||
| 	uint64_t exception_ds_tx;			/**< Downstream exception Tx packet counter. */ | ||||
| 	uint64_t encap_sg_alloc_drop;			/**< Encapsulation drop counters due to scatter gather buffer allocation failure. */ | ||||
| 	uint64_t decap_fail_drop;			/**< Decapsulation drop counters due to invalid IP header. */ | ||||
| 	uint64_t decap_split_drop;			/**< Decapsulation drop counters due to split flow processing. */ | ||||
| 	uint64_t split_sg_alloc_fail;			/**< Split processing fail counter due to scatter gather buffer allocation failure. */ | ||||
| 	uint64_t split_linear_copy_fail;		/**< Split processing fail counter due to linear copy fail. */ | ||||
| 	uint64_t split_not_enough_tailroom;		/**< Split processing fail counter due to insufficient tailroom. */ | ||||
| 	uint64_t exception_ds_invalid_dst_drop;		/**< Downstream exception handling fail counter due to invalid destination. */ | ||||
| 	uint64_t decap_eapol_frames;			/**< Decapsulation EAPoL frame counters. */ | ||||
| 	uint64_t exception_ds_inv_appid;		/**< Invalid application ID for the Tx completion packets on exception downstream node. */ | ||||
| 	uint64_t headroom_unavail;			/**< Packet headroom unavailable to write metadata. */ | ||||
| 	uint64_t tx_completion_success;			/**< Host enqueue success count for the Tx completion packets. */ | ||||
| 	uint64_t tx_completion_drop;			/**< Host enqueue drop count for the Tx completion packets. */ | ||||
| 	struct nss_gre_redir_tun_stats tstats;	/**< Structure to accumulate all the statistics. */ | ||||
| 	uint32_t ref_count;			/**< Reference count for statistics. */ | ||||
| }; | ||||
|  | ||||
| /** | ||||
|  * nss_gre_redir_stats_notification | ||||
|  *	GRE redirect transmission statistics structure. | ||||
|  */ | ||||
| struct nss_gre_redir_stats_notification { | ||||
| 	struct nss_gre_redir_tunnel_stats stats_ctx;	/**< Context transmission statistics. */ | ||||
| 	uint32_t core_id;				/**< Core ID. */ | ||||
| 	uint32_t if_num;				/**< Interface number. */ | ||||
| }; | ||||
|  | ||||
| /** | ||||
|  * nss_gre_redir_msg | ||||
|  *	Data for sending and receiving GRE tunnel redirect messages. | ||||
| @@ -466,7 +549,7 @@ extern nss_tx_status_t nss_gre_redir_tx_buf_noreuse(struct nss_ctx_instance *nss | ||||
| 			uint32_t if_num); | ||||
|  | ||||
| /** | ||||
|  * nss_gre_redir_get_stats | ||||
|  * nss_gre_redir_stats_get | ||||
|  *	Gets GRE redirect tunnel statistics. | ||||
|  * | ||||
|  * @datatypes | ||||
| @@ -478,7 +561,7 @@ extern nss_tx_status_t nss_gre_redir_tx_buf_noreuse(struct nss_ctx_instance *nss | ||||
|  * @return | ||||
|  * TRUE or FALSE. | ||||
|  */ | ||||
| extern bool nss_gre_redir_get_stats(int index, struct nss_gre_redir_tunnel_stats *stats); | ||||
| extern bool nss_gre_redir_stats_get(int index, struct nss_gre_redir_tunnel_stats *stats); | ||||
|  | ||||
| /** | ||||
|  * nss_gre_redir_alloc_and_register_node | ||||
| @@ -594,6 +677,34 @@ extern struct dentry *nss_gre_redir_get_dentry(void); | ||||
|  */ | ||||
| extern struct device *nss_gre_redir_get_device(void); | ||||
|  | ||||
| /** | ||||
|  * nss_gre_redir_stats_unregister_notifier | ||||
|  *	Deregisters a statistics notifier. | ||||
|  * | ||||
|  * @datatypes | ||||
|  *	notifier_block | ||||
|  * | ||||
|  * @param[in] nb Notifier block. | ||||
|  * | ||||
|  * @return | ||||
|  * 0 on success or non-zero on failure. | ||||
|  */ | ||||
| extern int nss_gre_redir_stats_unregister_notifier(struct notifier_block *nb); | ||||
|  | ||||
| /** | ||||
|  * nss_gre_redir_stats_register_notifier | ||||
|  *	Registers a statistics notifier. | ||||
|  * | ||||
|  * @datatypes | ||||
|  *	notifier_block | ||||
|  * | ||||
|  * @param[in] nb Notifier block. | ||||
|  * | ||||
|  * @return | ||||
|  * 0 on success or non-zero on failure. | ||||
|  */ | ||||
| extern int nss_gre_redir_stats_register_notifier(struct notifier_block *nb); | ||||
|  | ||||
| /** | ||||
|  * @} | ||||
|  */ | ||||
|   | ||||
| @@ -1,6 +1,6 @@ | ||||
| /* | ||||
|  ************************************************************************** | ||||
|  * Copyright (c) 2018, The Linux Foundation. All rights reserved. | ||||
|  * Copyright (c) 2018, 2021, The Linux Foundation. All rights reserved. | ||||
|  * Permission to use, copy, modify, and/or distribute this software for | ||||
|  * any purpose with or without fee is hereby granted, provided that the | ||||
|  * above copyright notice and this permission notice appear in all copies. | ||||
| @@ -72,6 +72,39 @@ enum nss_gre_redir_lag_ds_message_types { | ||||
| 	NSS_GRE_REDIR_LAG_DS_MAX_MSG_TYPES, | ||||
| }; | ||||
|  | ||||
| /** | ||||
|  * nss_gre_redir_lag_ds_stats_types | ||||
|  *	GRE redirect LAG downstream statistics. | ||||
|  */ | ||||
| enum nss_gre_redir_lag_ds_stats_types { | ||||
| 	NSS_GRE_REDIR_LAG_DS_STATS_DST_INVALID = NSS_STATS_NODE_MAX, | ||||
| 							/**< Packets that do not have a valid destination. */ | ||||
| 	NSS_GRE_REDIR_LAG_DS_STATS_EXCEPTION_PKT,	/**< Packets that are exceptioned to host. */ | ||||
| 	NSS_GRE_REDIR_LAG_DS_STATS_MAX,			/**< Maximum statistics type. */ | ||||
| }; | ||||
|  | ||||
| /** | ||||
|  * nss_gre_redir_lag_us_stats_types | ||||
|  *	GRE redirect LAG upstream statistics. | ||||
|  */ | ||||
| enum nss_gre_redir_lag_us_stats_types { | ||||
| 	NSS_GRE_REDIR_LAG_US_STATS_AMSDU_PKTS = NSS_STATS_NODE_MAX, | ||||
| 							/**< Number of AMSDU packets seen. */ | ||||
| 	NSS_GRE_REDIR_LAG_US_STATS_AMSDU_PKTS_ENQUEUED,	/**< Number of AMSDU packets enqueued. */ | ||||
| 	NSS_GRE_REDIR_LAG_US_STATS_AMSDU_PKTS_EXCEPTIONED, | ||||
| 							/**< Number of AMSDU packets exceptioned. */ | ||||
| 	NSS_GRE_REDIR_LAG_US_STATS_EXCEPTIONED,		/**< Number of exceptioned packets. */ | ||||
| 	NSS_GRE_REDIR_LAG_US_STATS_FREED,		/**< Freed packets when equeue to NSS to host fails. */ | ||||
| 	NSS_GRE_REDIR_LAG_US_STATS_ADD_ATTEMPT,		/**< Add hash attempts. */ | ||||
| 	NSS_GRE_REDIR_LAG_US_STATS_ADD_SUCCESS,		/**< Add hash success. */ | ||||
| 	NSS_GRE_REDIR_LAG_US_STATS_ADD_FAIL_TABLE_FULL,	/**< Add hash failed due to full table. */ | ||||
| 	NSS_GRE_REDIR_LAG_US_STATS_ADD_FAIL_EXISTS,	/**< Add hash failed as entry already exists. */ | ||||
| 	NSS_GRE_REDIR_LAG_US_STATS_DEL_ATTEMPT,		/**< Delete hash attempts. */ | ||||
| 	NSS_GRE_REDIR_LAG_US_STATS_DEL_SUCCESS,		/**< Delete hash success. */ | ||||
| 	NSS_GRE_REDIR_LAG_US_STATS_DEL_FAIL_NOT_FOUND,	/**< Delete hash failed as entry not found in hash table. */ | ||||
| 	NSS_GRE_REDIR_LAG_US_STATS_MAX,			/**< Maximum statistics type. */ | ||||
| }; | ||||
|  | ||||
| /** | ||||
|  * nss_gre_redir_lag_us_hash_mode | ||||
|  *	GRE redirect LAG upstream hash modes. | ||||
| @@ -253,6 +286,16 @@ struct nss_gre_redir_lag_us_tunnel_stats { | ||||
| 	struct nss_gre_redir_lag_us_cmn_db_stats db_stats;	/**< Common hash statistics. */ | ||||
| }; | ||||
|  | ||||
| /** | ||||
|  * nss_gre_redir_lag_us_stats_notification | ||||
|  *	GRE redirect LAG upstream transmission statistics structure. | ||||
|  */ | ||||
| struct nss_gre_redir_lag_us_stats_notification { | ||||
| 	struct nss_gre_redir_lag_us_tunnel_stats stats_ctx;	/**< Context transmission statistics. */ | ||||
| 	uint32_t core_id;					/**< Core ID. */ | ||||
| 	uint32_t if_num;					/**< Interface number. */ | ||||
| }; | ||||
|  | ||||
| /** | ||||
|  * nss_gre_redir_lag_ds_add_sta_msg | ||||
|  *	Message to add station in LAG deployment. | ||||
| @@ -324,13 +367,24 @@ struct nss_gre_redir_lag_ds_tun_stats { | ||||
| 	uint64_t rx_bytes;		/**< Received bytes. */ | ||||
| 	uint64_t tx_packets;		/**< Transmit packets. */ | ||||
| 	uint64_t tx_bytes;		/**< Transmit bytes. */ | ||||
| 	uint64_t rx_dropped[NSS_MAX_NUM_PRI];			/**< Packets dropped on receive due to queue full. */ | ||||
| 	uint64_t rx_dropped[NSS_MAX_NUM_PRI]; | ||||
| 					/**< Packets dropped on receive due to queue full. */ | ||||
| 	uint64_t dst_invalid;		/**< Packets that do not have a valid destination. */ | ||||
| 	uint64_t exception_cnt;		/**< Packets that are exceptioned to host. */ | ||||
| 	uint32_t ifnum;			/**< NSS interface number. */ | ||||
| 	bool valid;			/**< Valid flag. */ | ||||
| }; | ||||
|  | ||||
| /** | ||||
|  * nss_gre_redir_lag_ds_stats_notification | ||||
|  *	GRE redirect LAG downstream transmission statistics structure. | ||||
|  */ | ||||
| struct nss_gre_redir_lag_ds_stats_notification { | ||||
| 	struct nss_gre_redir_lag_ds_tun_stats stats_ctx;	/**< Context transmission statistics. */ | ||||
| 	uint32_t core_id;					/**< Core ID. */ | ||||
| 	uint32_t if_num;					/**< Interface number. */ | ||||
| }; | ||||
|  | ||||
| /** | ||||
|  * Callback function for receiving GRE redirect LAG upstream data. | ||||
|  * | ||||
| @@ -568,7 +622,7 @@ extern nss_tx_status_t nss_gre_redir_lag_us_tx_msg_sync(struct nss_ctx_instance | ||||
| extern nss_tx_status_t nss_gre_redir_lag_ds_tx_msg_sync(struct nss_ctx_instance *nss_ctx, struct nss_gre_redir_lag_ds_msg *ngrm); | ||||
|  | ||||
| /** | ||||
|  * nss_gre_redir_lag_us_get_cmn_stats | ||||
|  * nss_gre_redir_lag_us_stats_get | ||||
|  *	Fetches common node statistics for upstream GRE Redir LAG. | ||||
|  * | ||||
|  * @datatypes | ||||
| @@ -580,10 +634,10 @@ extern nss_tx_status_t nss_gre_redir_lag_ds_tx_msg_sync(struct nss_ctx_instance | ||||
|  * @return | ||||
|  * True if successful, else false. | ||||
|  */ | ||||
| extern bool nss_gre_redir_lag_us_get_cmn_stats(struct nss_gre_redir_lag_us_tunnel_stats *cmn_stats, uint32_t index); | ||||
| extern bool nss_gre_redir_lag_us_stats_get(struct nss_gre_redir_lag_us_tunnel_stats *cmn_stats, uint32_t index); | ||||
|  | ||||
| /** | ||||
|  * nss_gre_redir_lag_ds_get_stats | ||||
|  * nss_gre_redir_lag_ds_stats_get | ||||
|  *	Fetches common node statistics for downstream GRE Redir LAG. | ||||
|  * | ||||
|  * @datatypes | ||||
| @@ -595,7 +649,7 @@ extern bool nss_gre_redir_lag_us_get_cmn_stats(struct nss_gre_redir_lag_us_tunne | ||||
|  * @return | ||||
|  * True if successful, else false. | ||||
|  */ | ||||
| extern bool nss_gre_redir_lag_ds_get_cmn_stats(struct nss_gre_redir_lag_ds_tun_stats *cmn_stats, uint32_t index); | ||||
| extern bool nss_gre_redir_lag_ds_stats_get(struct nss_gre_redir_lag_ds_tun_stats *cmn_stats, uint32_t index); | ||||
|  | ||||
| /** | ||||
|  * nss_gre_redir_lag_us_get_context | ||||
| @@ -615,6 +669,62 @@ extern struct nss_ctx_instance *nss_gre_redir_lag_us_get_context(void); | ||||
|  */ | ||||
| extern struct nss_ctx_instance *nss_gre_redir_lag_ds_get_context(void); | ||||
|  | ||||
| /** | ||||
|  * nss_gre_redir_lag_ds_stats_unregister_notifier | ||||
|  *	Deregisters a statistics notifier. | ||||
|  * | ||||
|  * @datatypes | ||||
|  *	notifier_block | ||||
|  * | ||||
|  * @param[in] nb Notifier block. | ||||
|  * | ||||
|  * @return | ||||
|  * 0 on success or non-zero on failure. | ||||
|  */ | ||||
| extern int nss_gre_redir_lag_ds_stats_unregister_notifier(struct notifier_block *nb); | ||||
|  | ||||
| /** | ||||
|  * nss_gre_redir_lag_ds_stats_register_notifier | ||||
|  *	Registers a statistics notifier. | ||||
|  * | ||||
|  * @datatypes | ||||
|  *	notifier_block | ||||
|  * | ||||
|  * @param[in] nb Notifier block. | ||||
|  * | ||||
|  * @return | ||||
|  * 0 on success or non-zero on failure. | ||||
|  */ | ||||
| extern int nss_gre_redir_lag_ds_stats_register_notifier(struct notifier_block *nb); | ||||
|  | ||||
| /** | ||||
|  * nss_gre_redir_lag_us_stats_unregister_notifier | ||||
|  *	Deregisters a statistics notifier. | ||||
|  * | ||||
|  * @datatypes | ||||
|  *	notifier_block | ||||
|  * | ||||
|  * @param[in] nb Notifier block. | ||||
|  * | ||||
|  * @return | ||||
|  * 0 on success or non-zero on failure. | ||||
|  */ | ||||
| extern int nss_gre_redir_lag_us_stats_unregister_notifier(struct notifier_block *nb); | ||||
|  | ||||
| /** | ||||
|  * nss_gre_redir_lag_us_stats_register_notifier | ||||
|  *	Registers a statistics notifier. | ||||
|  * | ||||
|  * @datatypes | ||||
|  *	notifier_block | ||||
|  * | ||||
|  * @param[in] nb Notifier block. | ||||
|  * | ||||
|  * @return | ||||
|  * 0 on success or non-zero on failure. | ||||
|  */ | ||||
| extern int nss_gre_redir_lag_us_stats_register_notifier(struct notifier_block *nb); | ||||
|  | ||||
| /** | ||||
|  * @} | ||||
|  */ | ||||
|   | ||||
| @@ -1,6 +1,6 @@ | ||||
| /* | ||||
|  ************************************************************************** | ||||
|  * Copyright (c) 2019, The Linux Foundation. All rights reserved. | ||||
|  * Copyright (c) 2019, 2021, The Linux Foundation. All rights reserved. | ||||
|  * Permission to use, copy, modify, and/or distribute this software for | ||||
|  * any purpose with or without fee is hereby granted, provided that the | ||||
|  * above copyright notice and this permission notice appear in all copies. | ||||
| @@ -25,6 +25,8 @@ | ||||
| #define NSS_GRE_REDIR_MARK_HLOS_MAGIC 0xaade	/**< Metadata magic set by HLOS. */ | ||||
| #define NSS_GRE_REDIR_MARK_NSS_MAGIC 0xaadf	/**< Metadata magic set by NSS. */ | ||||
|  | ||||
| extern struct nss_gre_redir_mark_stats gre_mark_stats; | ||||
|  | ||||
| /** | ||||
|  * nss_gre_redir_mark messages | ||||
|  *	Message types for GRE redirect mark requests and responses. | ||||
| @@ -46,6 +48,23 @@ enum nss_gre_redir_mark_error_types { | ||||
| 	NSS_GRE_REDIR_MARK_ERROR_TYPE_MAX | ||||
| }; | ||||
|  | ||||
| /** | ||||
|  * nss_gre_redir_mark_stats_types | ||||
|  *	GRE redirect mark statistics types. | ||||
|  */ | ||||
| enum nss_gre_redir_mark_stats_types { | ||||
| 	NSS_GRE_REDIR_MARK_STATS_HLOS_MAGIC_FAILED = NSS_STATS_NODE_MAX, | ||||
| 							/**< HLOS magic fail count. */ | ||||
| 	NSS_GRE_REDIR_MARK_STATS_INV_DST_IF_DROPS,	/**< Invalid transmit interface drop count. */ | ||||
| 	NSS_GRE_REDIR_MARK_STATS_DST_IF_ENQUEUE,	/**< Next egress interface enqueue success count. */ | ||||
| 	NSS_GRE_REDIR_MARK_STATS_DST_IF_ENQUEUE_DROPS,	/**< Next egress interface enqueue drop count. */ | ||||
| 	NSS_GRE_REDIR_MARK_STATS_INV_APPID,		/**< Invalid application ID for the transmit completion packets. */ | ||||
| 	NSS_GRE_REDIR_MARK_STATS_HEADROOM_UNAVAILABLE,	/**< Packet headroom unavailable to write metadata. */ | ||||
| 	NSS_GRE_REDIR_MARK_STATS_TX_COMPLETION_SUCCESS,	/**< Transmit completion host enqueue success count. */ | ||||
| 	NSS_GRE_REDIR_MARK_STATS_TX_COMPLETION_DROPS,	/**< Transmit completion host enqueue drop count. */ | ||||
| 	NSS_GRE_REDIR_MARK_STATS_MAX			/**< Maximum statistics type. */ | ||||
| }; | ||||
|  | ||||
| /** | ||||
|  * nss_gre_redir_mark_metadata | ||||
|  *	HLOS to NSS per packet downstream metadata. | ||||
| @@ -55,7 +74,7 @@ struct nss_gre_redir_mark_metadata { | ||||
| 	uint8_t wifi_tid;		/**< TID value. */ | ||||
| 	uint8_t app_id;			/**< Application ID. */ | ||||
| 	uint16_t hw_hash_idx;		/**< Hardware AST hash index value. */ | ||||
| 	uint32_t tx_status;		/**< Tx status. */ | ||||
| 	uint32_t tx_status;		/**< Transmit status. */ | ||||
| 	uint16_t offset;		/**< Buffer offset from the metadata. */ | ||||
| 	uint16_t magic;			/**< Metadata magic. */ | ||||
| }; | ||||
| @@ -67,21 +86,31 @@ struct nss_gre_redir_mark_metadata { | ||||
| struct nss_gre_redir_mark_stats_sync_msg { | ||||
| 	struct nss_cmn_node_stats node_stats;	/**< Common node statistics. */ | ||||
| 	uint32_t hlos_magic_fail;               /**< HLOS magic fail count. */ | ||||
| 	uint32_t invalid_dst_drop;		/**< Invalid Tx interface drop count. */ | ||||
| 	uint32_t invalid_dst_drop;		/**< Invalid transmit interface drop count. */ | ||||
| 	uint32_t dst_enqueue_success;		/**< Next egress interface enqueue success count. */ | ||||
| 	uint32_t dst_enqueue_drop;		/**< Next egress interface enqueue drop count. */ | ||||
| 	uint32_t inv_appid;			/**< Invalid application ID for the Tx completion packets. */ | ||||
| 	uint32_t inv_appid;			/**< Invalid application ID for the transmit completion packets. */ | ||||
| 	uint32_t headroom_unavail;		/**< Packet headroom unavailable to write metadata. */ | ||||
| 	uint32_t tx_completion_success;		/**< Tx completion host enqueue success count. */ | ||||
| 	uint32_t tx_completion_drop;		/**< Tx completion host enqueue drop count. */ | ||||
| 	uint32_t tx_completion_success;		/**< Transmit completion host enqueue success count. */ | ||||
| 	uint32_t tx_completion_drop;		/**< Transmit completion host enqueue drop count. */ | ||||
| }; | ||||
|  | ||||
| /** | ||||
|  * nss_gre_redir_mark_register_cb_msg | ||||
|  *	Tx completion function register configuration message. | ||||
|  *	Transmit completion function register configuration message. | ||||
|  */ | ||||
| struct nss_gre_redir_mark_register_cb_msg { | ||||
| 	uint32_t nss_if_num;			/**< NSS Tx interface number on which callback needs to be registered. */ | ||||
| 	uint32_t nss_if_num;	/**< NSS transmit interface number on which callback needs to be registered. */ | ||||
| }; | ||||
|  | ||||
| /** | ||||
|  * nss_gre_redir_mark_stats_notification | ||||
|  *	GRE redirect mark transmission statistics structure. | ||||
|  */ | ||||
| struct nss_gre_redir_mark_stats_notification { | ||||
| 	uint64_t stats_ctx[NSS_GRE_REDIR_MARK_STATS_MAX];	/**< Context transmission statistics. */ | ||||
| 	uint32_t core_id;					/**< Core ID. */ | ||||
| 	uint32_t if_num;					/**< Interface number. */ | ||||
| }; | ||||
|  | ||||
| /** | ||||
| @@ -211,7 +240,7 @@ extern nss_tx_status_t nss_gre_redir_mark_tx_msg(struct nss_ctx_instance *nss_ct | ||||
| extern nss_tx_status_t nss_gre_redir_mark_tx_msg_sync(struct nss_ctx_instance *nss_ctx, struct nss_gre_redir_mark_msg *ngrm); | ||||
|  | ||||
| /** | ||||
|  * nss_gre_redir_mark_get_stats | ||||
|  * nss_gre_redir_mark_stats_get | ||||
|  *      Gets GRE redirect mark statistics. | ||||
|  * | ||||
|  * @datatypes | ||||
| @@ -223,7 +252,7 @@ extern nss_tx_status_t nss_gre_redir_mark_tx_msg_sync(struct nss_ctx_instance *n | ||||
|  * @return | ||||
|  * TRUE or FALSE. | ||||
|  */ | ||||
| extern bool nss_gre_redir_mark_get_stats(void *stats); | ||||
| extern bool nss_gre_redir_mark_stats_get(struct nss_gre_redir_mark_stats *stats); | ||||
|  | ||||
| /** | ||||
|  * nss_gre_redir_alloc_and_register_node | ||||
| @@ -274,6 +303,34 @@ extern struct dentry *nss_gre_redir_mark_get_dentry(void); | ||||
|  */ | ||||
| extern struct device *nss_gre_redir_mark_get_device(void); | ||||
|  | ||||
| /** | ||||
|  * nss_gre_redir_mark_stats_unregister_notifier | ||||
|  *	Deregisters a statistics notifier. | ||||
|  * | ||||
|  * @datatypes | ||||
|  *	notifier_block | ||||
|  * | ||||
|  * @param[in] nb Notifier block. | ||||
|  * | ||||
|  * @return | ||||
|  * 0 on success or non-zero on failure. | ||||
|  */ | ||||
| extern int nss_gre_redir_mark_stats_unregister_notifier(struct notifier_block *nb); | ||||
|  | ||||
| /** | ||||
|  * nss_gre_redir_mark_stats_register_notifier | ||||
|  *	Registers a statistics notifier. | ||||
|  * | ||||
|  * @datatypes | ||||
|  *	notifier_block | ||||
|  * | ||||
|  * @param[in] nb Notifier block. | ||||
|  * | ||||
|  * @return | ||||
|  * 0 on success or non-zero on failure. | ||||
|  */ | ||||
| extern int nss_gre_redir_mark_stats_register_notifier(struct notifier_block *nb); | ||||
|  | ||||
| /** | ||||
|  * @} | ||||
|  */ | ||||
|   | ||||
| @@ -1,6 +1,6 @@ | ||||
| /* | ||||
|  ************************************************************************** | ||||
|  * Copyright (c) 2016-2018,2020, The Linux Foundation. All rights reserved. | ||||
|  **************************************************************************** | ||||
|  * Copyright (c) 2016-2018, 2020-2021, The Linux Foundation. All rights reserved. | ||||
|  * Permission to use, copy, modify, and/or distribute this software for | ||||
|  * any purpose with or without fee is hereby granted, provided that the | ||||
|  * above copyright notice and this permission notice appear in all copies. | ||||
| @@ -11,7 +11,7 @@ | ||||
|  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN | ||||
|  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT | ||||
|  * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | ||||
|  ************************************************************************** | ||||
|  **************************************************************************** | ||||
|  */ | ||||
|  | ||||
| /** | ||||
| @@ -97,6 +97,41 @@ enum nss_gre_tunnel_error_types { | ||||
| 	NSS_GRE_TUNNEL_ERR_MAX, | ||||
| }; | ||||
|  | ||||
| /** | ||||
|  *  nss_gre_tunnel_stats_type | ||||
|  *	GRE tunnel session debug statistic counters. | ||||
|  */ | ||||
| enum nss_gre_tunnel_stats_type { | ||||
| 	NSS_GRE_TUNNEL_STATS_SESSION_RX_PKTS,			/**< Number of packets received. */ | ||||
| 	NSS_GRE_TUNNEL_STATS_SESSION_TX_PKTS,			/**< Number of packets transmitted. */ | ||||
| 	NSS_GRE_TUNNEL_STATS_SESSION_RX_QUEUE_0_DROPPED,	/**< Dropped receive packets 0. */ | ||||
| 	NSS_GRE_TUNNEL_STATS_SESSION_RX_QUEUE_1_DROPPED,	/**< Dropped receive packets 1. */ | ||||
| 	NSS_GRE_TUNNEL_STATS_SESSION_RX_QUEUE_2_DROPPED,	/**< Dropped receive packets 2. */ | ||||
| 	NSS_GRE_TUNNEL_STATS_SESSION_RX_QUEUE_3_DROPPED,	/**< Dropped receive packets 3. */ | ||||
| 	NSS_GRE_TUNNEL_STATS_SESSION_RX_MALFORMED,		/**< Malformed packet was received. */ | ||||
| 	NSS_GRE_TUNNEL_STATS_SESSION_RX_INVALID_PROT,		/**< Invalid protocol was received. */ | ||||
| 	NSS_GRE_TUNNEL_STATS_SESSION_DECAP_QUEUE_FULL,		/**< Decapsulation queue is full. */ | ||||
| 	NSS_GRE_TUNNEL_STATS_SESSION_RX_SINGLE_REC_DGRAM,	/**< Single fragment was received. */ | ||||
| 	NSS_GRE_TUNNEL_STATS_SESSION_RX_INVALID_REC_DGRAM,	/**< Invalid fragment was received. */ | ||||
| 	NSS_GRE_TUNNEL_STATS_SESSION_BUFFER_ALLOC_FAIL,		/**< Buffer memory allocation failed. */ | ||||
| 	NSS_GRE_TUNNEL_STATS_SESSION_BUFFER_COPY_FAIL,		/**< Buffer memory copy failed. */ | ||||
| 	NSS_GRE_TUNNEL_STATS_SESSION_OUTFLOW_QUEUE_FULL,	/**< Outflow queue is full. */ | ||||
| 	NSS_GRE_TUNNEL_STATS_SESSION_RX_DROPPED_HROOM,	/**< Packets dropped because of insufficent headroom. */ | ||||
| 	NSS_GRE_TUNNEL_STATS_SESSION_RX_CBUFFER_ALLOC_FAIL,	/**< Receive crypto buffer allocation failed. */ | ||||
| 	NSS_GRE_TUNNEL_STATS_SESSION_RX_CENQUEUE_FAIL,		/**< Receive enqueue-to-crypto failed. */ | ||||
| 	NSS_GRE_TUNNEL_STATS_SESSION_RX_DECRYPT_DONE,		/**< Receive decryption is complete. */ | ||||
| 	NSS_GRE_TUNNEL_STATS_SESSION_RX_FORWARD_ENQUEUE_FAIL,	/**< Receive forward enqueue failed. */ | ||||
| 	NSS_GRE_TUNNEL_STATS_SESSION_TX_CBUFFER_ALLOC_FAIL,	/**< Receive crypto buffer allocation failed. */ | ||||
| 	NSS_GRE_TUNNEL_STATS_SESSION_TX_CENQUEUE_FAIL,		/**< Transmit enqueue-to-crypto failed. */ | ||||
| 	NSS_GRE_TUNNEL_STATS_SESSION_RX_DROPPED_TROOM,	/**< Packets dropped because of insufficent tailroom. */ | ||||
| 	NSS_GRE_TUNNEL_STATS_SESSION_TX_FORWARD_ENQUEUE_FAIL,	/**< Transmit forward enqueue failed. */ | ||||
| 	NSS_GRE_TUNNEL_STATS_SESSION_TX_CIPHER_DONE,		/**< Transmit cipher is complete. */ | ||||
| 	NSS_GRE_TUNNEL_STATS_SESSION_CRYPTO_NOSUPP,		/**< Error count for non-supported crypto packets. */ | ||||
| 	NSS_GRE_TUNNEL_STATS_SESSION_RX_DROPPED_MH_VERSION,	/**< Receive drop: bad meta header. */ | ||||
| 	NSS_GRE_TUNNEL_STATS_SESSION_RX_UNALIGNED_PKT,		/**< Counter for unaligned packets. */ | ||||
| 	NSS_GRE_TUNNEL_STATS_SESSION_MAX,			/**< Maximum statistics type. */ | ||||
| }; | ||||
|  | ||||
| /** | ||||
|  * nss_gre_tunnel_di_to_wlan_id | ||||
|  *	Dynamic interface to WLAN ID message structure. | ||||
| @@ -151,20 +186,20 @@ struct nss_gre_tunnel_stats { | ||||
| 	uint32_t rx_dropped_hroom; | ||||
| 				/**< Packets dropped because of insufficent headroom. */ | ||||
| 	uint32_t rx_cbuf_alloc_fail; | ||||
| 				/**< Rx crypto buffer allocation failed. */ | ||||
| 	uint32_t rx_cenqueue_fail;		/**< Rx enqueue-to-crypto failed. */ | ||||
| 	uint32_t rx_decrypt_done;		/**< Rx decryption is complete. */ | ||||
| 	uint32_t rx_forward_enqueue_fail;	/**< Rx forward enqueue failed. */ | ||||
| 				/**< Receive crypto buffer allocation failed. */ | ||||
| 	uint32_t rx_cenqueue_fail;		/**< Receive enqueue-to-crypto failed. */ | ||||
| 	uint32_t rx_decrypt_done;		/**< Receive decryption is complete. */ | ||||
| 	uint32_t rx_forward_enqueue_fail;	/**< Receive forward enqueue failed. */ | ||||
| 	uint32_t tx_cbuf_alloc_fail; | ||||
| 				/**< Rx crypto buffer allocation failed. */ | ||||
| 	uint32_t tx_cenqueue_fail;		/**< Tx enqueue-to-crypto failed. */ | ||||
| 				/**< Receive crypto buffer allocation failed. */ | ||||
| 	uint32_t tx_cenqueue_fail;		/**< Transmit enqueue-to-crypto failed. */ | ||||
| 	uint32_t rx_dropped_troom; | ||||
| 				/**< Packets dropped because of insufficent tailroom. */ | ||||
| 	uint32_t tx_forward_enqueue_fail;	/**< Tx forward enqueue failed. */ | ||||
| 	uint32_t tx_cipher_done;		/**< Tx cipher is complete. */ | ||||
| 	uint32_t tx_forward_enqueue_fail;	/**< Transmit forward enqueue failed. */ | ||||
| 	uint32_t tx_cipher_done;		/**< Transmit cipher is complete. */ | ||||
| 	uint32_t crypto_nosupp; | ||||
| 				/**< Error count for non-supported crypto packets. */ | ||||
| 	uint32_t rx_dropped_mh_ver;		/**< Rx drop: bad meta header. */ | ||||
| 	uint32_t rx_dropped_mh_ver;		/**< Receive drop: bad meta header. */ | ||||
| 	uint32_t rx_unaligned_pkt;		/**< Counter for unaligned packets. */ | ||||
| #if defined(NSS_HAL_IPQ807x_SUPPORT) | ||||
| 	uint32_t crypto_resp_error[NSS_CRYPTO_CMN_RESP_ERROR_MAX]; | ||||
| @@ -172,6 +207,17 @@ struct nss_gre_tunnel_stats { | ||||
| #endif | ||||
| }; | ||||
|  | ||||
| /** | ||||
|  * nss_gre_tunnel_stats_notification | ||||
|  *	GRE tunnel transmission statistics structure. | ||||
|  */ | ||||
| struct nss_gre_tunnel_stats_notification { | ||||
| 	uint64_t stats_ctx[NSS_GRE_TUNNEL_STATS_SESSION_MAX + NSS_CRYPTO_CMN_RESP_ERROR_MAX]; | ||||
| 							/**< Context transmission statistics. */ | ||||
| 	uint32_t core_id;				/**< Core ID. */ | ||||
| 	uint32_t if_num;				/**< Interface number. */ | ||||
| }; | ||||
|  | ||||
| /** | ||||
|  * nss_gre_tunnel_msg | ||||
|  *	Data for sending and receiving GRE tunnel messages. | ||||
| @@ -347,6 +393,34 @@ extern nss_tx_status_t nss_gre_tunnel_inquiry( | ||||
| 		struct nss_gre_tunnel_configure *inquiry_info, | ||||
| 		nss_gre_tunnel_msg_callback_t cb, void *app_data); | ||||
|  | ||||
| /** | ||||
|  * nss_gre_tunnel_stats_unregister_notifier | ||||
|  *	Deregisters a statistics notifier. | ||||
|  * | ||||
|  * @datatypes | ||||
|  *	notifier_block | ||||
|  * | ||||
|  * @param[in] nb Notifier block. | ||||
|  * | ||||
|  * @return | ||||
|  * 0 on success or non-zero on failure. | ||||
|  */ | ||||
| extern int nss_gre_tunnel_stats_unregister_notifier(struct notifier_block *nb); | ||||
|  | ||||
| /** | ||||
|  * nss_gre_tunnel_stats_register_notifier | ||||
|  *	Registers a statistics notifier. | ||||
|  * | ||||
|  * @datatypes | ||||
|  *	notifier_block | ||||
|  * | ||||
|  * @param[in] nb Notifier block. | ||||
|  * | ||||
|  * @return | ||||
|  * 0 on success or non-zero on failure. | ||||
|  */ | ||||
| extern int nss_gre_tunnel_stats_register_notifier(struct notifier_block *nb); | ||||
|  | ||||
| /** | ||||
|  * @} | ||||
|  */ | ||||
|   | ||||
| @@ -1,6 +1,6 @@ | ||||
| /* | ||||
|  ************************************************************************** | ||||
|  * Copyright (c) 2014-2020, The Linux Foundation. All rights reserved. | ||||
|  * Copyright (c) 2014-2021, The Linux Foundation. All rights reserved. | ||||
|  * Permission to use, copy, modify, and/or distribute this software for | ||||
|  * any purpose with or without fee is hereby granted, provided that the | ||||
|  * above copyright notice and this permission notice appear in all copies. | ||||
| @@ -53,6 +53,8 @@ enum nss_if_message_types { | ||||
| 	NSS_IF_SET_IGS_NODE, | ||||
| 	NSS_IF_CLEAR_IGS_NODE, | ||||
| 	NSS_IF_RESET_NEXTHOP, | ||||
| 	NSS_IF_PPE_PORT_CREATE, | ||||
| 	NSS_IF_PPE_PORT_DESTROY, | ||||
| 	NSS_IF_MAX_MSG_TYPES = 9999, | ||||
| }; | ||||
|  | ||||
| @@ -197,6 +199,14 @@ struct nss_if_igs_config { | ||||
| 	int32_t igs_num;	/**< Ingress shaper interface number. */ | ||||
| }; | ||||
|  | ||||
| /** | ||||
|  * nss_if_ppe_port_create | ||||
|  *	Message to create PPE port. | ||||
|  */ | ||||
| struct nss_if_ppe_port_create { | ||||
| 	int32_t ppe_port_num;	/**< PPE port number returned by NSS. */ | ||||
| }; | ||||
|  | ||||
| /** | ||||
|  * nss_if_msgs | ||||
|  *	Information for physical NSS interface command messages. | ||||
| @@ -230,6 +240,8 @@ union nss_if_msgs { | ||||
| 			/**< Set nexthop of interface. */ | ||||
| 	struct nss_if_igs_config config_igs; | ||||
| 			/**< Configure an ingress shaper interface. */ | ||||
| 	struct nss_if_ppe_port_create ppe_port_create; | ||||
| 			/**< Create a PPE port. */ | ||||
| }; | ||||
|  | ||||
| /** | ||||
| @@ -371,6 +383,70 @@ nss_tx_status_t nss_if_set_nexthop(struct nss_ctx_instance *nss_ctx, uint32_t if | ||||
|  */ | ||||
| nss_tx_status_t nss_if_reset_nexthop(struct nss_ctx_instance *nss_ctx, uint32_t if_num); | ||||
|  | ||||
| /** | ||||
|  * nss_if_change_mtu | ||||
|  *	Change the MTU of the interface. | ||||
|  * | ||||
|  * @datatypes | ||||
|  * nss_ctx_instance | ||||
|  * | ||||
|  * @param[in] nss_ctx  Pointer to the NSS context. | ||||
|  * @param[in] if_num   NSS interface number. | ||||
|  * @param[in] mtu      New MTU. | ||||
|  * | ||||
|  * @return | ||||
|  * Status of the transmit operation. | ||||
|  */ | ||||
| nss_tx_status_t nss_if_change_mtu(struct nss_ctx_instance *nss_ctx, nss_if_num_t if_num, uint16_t mtu); | ||||
|  | ||||
| /** | ||||
|  * nss_if_change_mac_addr | ||||
|  *	Change the MAC address of the interface. | ||||
|  * | ||||
|  * @datatypes | ||||
|  * nss_ctx_instance | ||||
|  * | ||||
|  * @param[in] nss_ctx  Pointer to the NSS context. | ||||
|  * @param[in] if_num   NSS interface number. | ||||
|  * @param[in] mac_addr New MAC address. | ||||
|  * | ||||
|  * @return | ||||
|  * Status of the transmit operation. | ||||
|  */ | ||||
| nss_tx_status_t nss_if_change_mac_addr(struct nss_ctx_instance *nss_ctx, nss_if_num_t if_num, uint8_t *mac_addr); | ||||
|  | ||||
| /** | ||||
|  * nss_if_vsi_unassign | ||||
|  *	Detach the VSI ID from the given interface. | ||||
|  * | ||||
|  * @datatypes | ||||
|  * nss_ctx_instance | ||||
|  * | ||||
|  * @param[in] nss_ctx  Pointer to the NSS context. | ||||
|  * @param[in] if_num   NSS interface number. | ||||
|  * @param[in] vsi      VSI ID. | ||||
|  * | ||||
|  * @return | ||||
|  * Status of the transmit operation. | ||||
|  */ | ||||
| nss_tx_status_t nss_if_vsi_unassign(struct nss_ctx_instance *nss_ctx, nss_if_num_t if_num, uint32_t vsi); | ||||
|  | ||||
| /** | ||||
|  * nss_if_vsi_assign | ||||
|  *	Attach the VSI ID to the given interface. | ||||
|  * | ||||
|  * @datatypes | ||||
|  * nss_ctx_instance | ||||
|  * | ||||
|  * @param[in] nss_ctx  Pointer to the NSS context. | ||||
|  * @param[in] if_num   NSS interface number. | ||||
|  * @param[in] vsi      VSI ID. | ||||
|  * | ||||
|  * @return | ||||
|  * Status of the transmit operation. | ||||
|  */ | ||||
| nss_tx_status_t nss_if_vsi_assign(struct nss_ctx_instance *nss_ctx, nss_if_num_t if_num, uint32_t vsi); | ||||
|  | ||||
| /** | ||||
|  * @} | ||||
|  */ | ||||
|   | ||||
| @@ -1,6 +1,6 @@ | ||||
| /* | ||||
|  ************************************************************************** | ||||
|  * Copyright (c) 2018-2020, The Linux Foundation. All rights reserved. | ||||
|  * Copyright (c) 2018-2021, The Linux Foundation. All rights reserved. | ||||
|  * Permission to use, copy, modify, and/or distribute this software for | ||||
|  * any purpose with or without fee is hereby granted, provided that the | ||||
|  * above copyright notice and this permission notice appear in all copies. | ||||
| @@ -106,6 +106,37 @@ enum nss_ipsec_cmn_ctx_type { | ||||
| 	NSS_IPSEC_CMN_CTX_TYPE_MAX | ||||
| }; | ||||
|  | ||||
| /** | ||||
|  * nss_ipsec_cmn_stats_types | ||||
|  *	IPsec common statistics types. | ||||
|  */ | ||||
| enum nss_ipsec_cmn_stats_types { | ||||
| 	NSS_IPSEC_CMN_STATS_FAIL_HEADROOM = NSS_STATS_NODE_MAX, | ||||
| 						/**< Failure in headroom check. */ | ||||
| 	NSS_IPSEC_CMN_STATS_FAIL_TAILROOM,	/**< Failure in tailroom check. */ | ||||
| 	NSS_IPSEC_CMN_STATS_FAIL_REPLAY,	/**< Failure in anti-replay check. */ | ||||
| 	NSS_IPSEC_CMN_STATS_FAIL_REPLAY_DUP,	/**< Failure in anti-replay; duplicate records. */ | ||||
| 	NSS_IPSEC_CMN_STATS_FAIL_REPLAY_WIN,	/**< Failure in anti-replay; packet outside the window. */ | ||||
| 	NSS_IPSEC_CMN_STATS_FAIL_PBUF_CRYPTO,	/**< Failure in crypto pbuf allocation. */ | ||||
| 	NSS_IPSEC_CMN_STATS_FAIL_QUEUE,		/**< Failure due to queue full in IPsec. */ | ||||
| 	NSS_IPSEC_CMN_STATS_FAIL_QUEUE_CRYPTO,	/**< Failure due to queue full in crypto. */ | ||||
| 	NSS_IPSEC_CMN_STATS_FAIL_QUEUE_NEXTHOP,	/**< Failure due to queue full in next hop. */ | ||||
| 	NSS_IPSEC_CMN_STATS_FAIL_PBUF_ALLOC,	/**< Failure in pbuf allocation. */ | ||||
| 	NSS_IPSEC_CMN_STATS_FAIL_PBUF_LINEAR,	/**< Failure in pbuf linearization. */ | ||||
| 	NSS_IPSEC_CMN_STATS_FAIL_PBUF_STATS,	/**< Failure in pbuf allocation for statistics. */ | ||||
| 	NSS_IPSEC_CMN_STATS_FAIL_PBUF_ALIGN,	/**< Failure in pbuf access due to non-word alignmnt */ | ||||
| 	NSS_IPSEC_CMN_STATS_FAIL_CIPHER,	/**< Failure in decrypting the data. */ | ||||
| 	NSS_IPSEC_CMN_STATS_FAIL_AUTH,		/**< Failure in authenticating the data. */ | ||||
| 	NSS_IPSEC_CMN_STATS_FAIL_SEQ_OVF,	/**< Failure due to sequence number rollover. */ | ||||
| 	NSS_IPSEC_CMN_STATS_FAIL_BLK_LEN,	/**< Failure in decapsulation due to bad cipher block length. */ | ||||
| 	NSS_IPSEC_CMN_STATS_FAIL_HASH_LEN,	/**< Failure in decapsulation due to bad hash block length. */ | ||||
| 	NSS_IPSEC_CMN_STATS_FAIL_TRANSFORM,	/**< Failure in transformation; general error. */ | ||||
| 	NSS_IPSEC_CMN_STATS_FAIL_CRYPTO,	/**< Failure in crypto transformation. */ | ||||
| 	NSS_IPSEC_CMN_STATS_FAIL_CLE,		/**< Failure in classification; general failure. */ | ||||
| 	NSS_IPSEC_CMN_STATS_IS_STOPPED,		/**< Indicates if SA is stopped; for example: sequence overflow. */ | ||||
| 	NSS_IPSEC_CMN_STATS_MAX,		/**< Maximum statistics type. */ | ||||
| }; | ||||
|  | ||||
| /** | ||||
|  * nss_ipsec_cmn_flow_tuple | ||||
|  *	IPsec tuple for creating flow entries. | ||||
| @@ -336,6 +367,16 @@ struct nss_ipsec_cmn_mdata { | ||||
| 	} data;						/**< Metadata payload. */ | ||||
| }; | ||||
|  | ||||
| /** | ||||
|  * nss_ipsec_cmn_stats_notification | ||||
|  *	IPsec common transmission statistics structure. | ||||
|  */ | ||||
| struct nss_ipsec_cmn_stats_notification { | ||||
| 	uint64_t stats_ctx[NSS_IPSEC_CMN_STATS_MAX];	/**< Context transmission statistics. */ | ||||
| 	uint32_t core_id;				/**< Core ID. */ | ||||
| 	uint32_t if_num;				/**< Interface number. */ | ||||
| }; | ||||
|  | ||||
| /** | ||||
|  * nss_ipsec_cmn_msg | ||||
|  *	Message structure for NSS IPsec messages. | ||||
| @@ -424,6 +465,23 @@ extern struct nss_ctx_instance *nss_ipsec_cmn_get_context(void); | ||||
|  */ | ||||
| extern uint32_t nss_ipsec_cmn_get_ifnum_with_coreid(int32_t ifnum); | ||||
|  | ||||
| /** | ||||
|  * nss_ipsec_cmn_unregister_if | ||||
|  *	Deregisters an IPSEC tunnel interface from the NSS. | ||||
|  * | ||||
|  * @param[in] if_num  NSS interface number. | ||||
|  * | ||||
|  * @return | ||||
|  * None. | ||||
|  * | ||||
|  * @dependencies | ||||
|  * The tunnel interface must have been previously registered. | ||||
|  * | ||||
|  * @return | ||||
|  * True if successful, else false. | ||||
|  */ | ||||
| extern bool nss_ipsec_cmn_unregister_if(uint32_t if_num); | ||||
|  | ||||
| /** | ||||
|  * nss_ipsec_cmn_register_if | ||||
|  *	Registers the IPsec interface with the NSS for sending and | ||||
| @@ -451,39 +509,6 @@ extern struct nss_ctx_instance *nss_ipsec_cmn_register_if(uint32_t if_num, struc | ||||
| 						nss_ipsec_cmn_msg_callback_t cb_msg, | ||||
| 						uint32_t features, enum nss_dynamic_interface_type type, void *app_data); | ||||
|  | ||||
| /** | ||||
|  * nss_ipsec_cmn_unregister_if | ||||
|  *	Deregisters a IPSEC tunnel interface from the NSS. | ||||
|  * | ||||
|  * @param[in] if_num  NSS interface number. | ||||
| . * | ||||
|  * @return | ||||
|  * None. | ||||
|  * | ||||
|  * @dependencies | ||||
|  * The tunnel interface must have been previously registered. | ||||
|  * | ||||
|  * @return | ||||
|  * True if successful, else false. | ||||
|  */ | ||||
| extern bool nss_ipsec_cmn_unregister_if(uint32_t if_num); | ||||
|  | ||||
| /** | ||||
|  * nss_ipsec_cmn_notify_register | ||||
|  *	Register an event callback to handle notification from IPsec firmware package. | ||||
|  * | ||||
|  * @datatypes | ||||
|  * nss_ipsec_cmn_msg_callback_t \n | ||||
|  * | ||||
|  * @param[in] ifnum     NSS interface number. | ||||
|  * @param[in] cb        Callback for IPsec message. | ||||
|  * @param[in] app_data  Pointer to the application context. | ||||
|  * | ||||
|  * @return | ||||
|  * Pointer to NSS core context. | ||||
|  */ | ||||
| extern struct nss_ctx_instance *nss_ipsec_cmn_notify_register(uint32_t ifnum, nss_ipsec_cmn_msg_callback_t cb, void *app_data); | ||||
|  | ||||
| /** | ||||
|  * nss_ipsec_cmn_notify_unregister | ||||
|  *	Deregisters the message notifier from the HLOS driver. | ||||
| @@ -502,6 +527,22 @@ extern struct nss_ctx_instance *nss_ipsec_cmn_notify_register(uint32_t ifnum, ns | ||||
|  */ | ||||
| extern void nss_ipsec_cmn_notify_unregister(struct nss_ctx_instance *ctx, uint32_t if_num); | ||||
|  | ||||
| /** | ||||
|  * nss_ipsec_cmn_notify_register | ||||
|  *	Registers an event callback to handle notifications from the IPsec firmware package. | ||||
|  * | ||||
|  * @datatypes | ||||
|  * nss_ipsec_cmn_msg_callback_t \n | ||||
|  * | ||||
|  * @param[in] ifnum     NSS interface number. | ||||
|  * @param[in] cb        Callback for IPsec message. | ||||
|  * @param[in] app_data  Pointer to the application context. | ||||
|  * | ||||
|  * @return | ||||
|  * Pointer to the NSS core context. | ||||
|  */ | ||||
| extern struct nss_ctx_instance *nss_ipsec_cmn_notify_register(uint32_t ifnum, nss_ipsec_cmn_msg_callback_t cb, void *app_data); | ||||
|  | ||||
| /** | ||||
|  * nss_ipsec_cmn_msg_init | ||||
|  *	Initializes an IPsec message. | ||||
| @@ -615,6 +656,34 @@ extern bool nss_ipsec_cmn_ppe_port_config(struct nss_ctx_instance *ctx, struct n | ||||
|  */ | ||||
| bool nss_ipsec_cmn_ppe_mtu_update(struct nss_ctx_instance *ctx, uint32_t if_num, uint16_t mtu, uint16_t mru); | ||||
|  | ||||
| /** | ||||
|  * nss_ipsec_cmn_stats_unregister_notifier | ||||
|  *	Deregisters a statistics notifier. | ||||
|  * | ||||
|  * @datatypes | ||||
|  *	notifier_block | ||||
|  * | ||||
|  * @param[in] nb Notifier block. | ||||
|  * | ||||
|  * @return | ||||
|  * 0 on success or non-zero on failure. | ||||
|  */ | ||||
| extern int nss_ipsec_cmn_stats_unregister_notifier(struct notifier_block *nb); | ||||
|  | ||||
| /** | ||||
|  * nss_ipsec_cmn_stats_register_notifier | ||||
|  *	Registers a statistics notifier. | ||||
|  * | ||||
|  * @datatypes | ||||
|  *	notifier_block | ||||
|  * | ||||
|  * @param[in] nb Notifier block. | ||||
|  * | ||||
|  * @return | ||||
|  * 0 on success or non-zero on failure. | ||||
|  */ | ||||
| extern int nss_ipsec_cmn_stats_register_notifier(struct notifier_block *nb); | ||||
|  | ||||
| /** | ||||
|  * @} | ||||
|  */ | ||||
|   | ||||
| @@ -1,6 +1,6 @@ | ||||
| /* | ||||
|  ************************************************************************** | ||||
|  * Copyright (c) 2014-2020, The Linux Foundation. All rights reserved. | ||||
|  * Copyright (c) 2014-2021, The Linux Foundation. All rights reserved. | ||||
|  * Permission to use, copy, modify, and/or distribute this software for | ||||
|  * any purpose with or without fee is hereby granted, provided that the | ||||
|  * above copyright notice and this permission notice appear in all copies. | ||||
| @@ -31,6 +31,111 @@ | ||||
|  * @{ | ||||
|  */ | ||||
|  | ||||
| /* | ||||
|  * IPv4 connection flags (to be used with nss_ipv4_create::flags). | ||||
|  */ | ||||
| #define NSS_IPV4_CREATE_FLAG_NO_SEQ_CHECK 0x01 | ||||
| 		/**< Rule for not checking sequence numbers. */ | ||||
| #define NSS_IPV4_CREATE_FLAG_BRIDGE_FLOW 0x02 | ||||
| 		/**< Rule that indicates pure bridge flow (no routing is involved). */ | ||||
| #define NSS_IPV4_CREATE_FLAG_ROUTED 0x04	/**< Rule for a routed connection. */ | ||||
|  | ||||
| #define NSS_IPV4_CREATE_FLAG_DSCP_MARKING 0x08	/**< Rule for DSCP marking. */ | ||||
| #define NSS_IPV4_CREATE_FLAG_VLAN_MARKING 0x10	/**< Rule for VLAN marking. */ | ||||
| #define NSS_IPV4_CREATE_FLAG_QOS_VALID 0x20	/**< Rule for QoS is valid. */ | ||||
|  | ||||
| /** | ||||
|  * nss_ipv4_create | ||||
|  *	Information for an IPv4 flow or connection create rule. | ||||
|  * | ||||
|  * All fields must be passed in host-endian order. | ||||
|  */ | ||||
| struct nss_ipv4_create { | ||||
| 	int32_t src_interface_num; | ||||
| 				/**< Source interface number (virtual or physical). */ | ||||
| 	int32_t dest_interface_num; | ||||
| 				/**< Destination interface number (virtual or physical). */ | ||||
| 	int32_t protocol;	/**< L4 protocol (e.g., TCP or UDP). */ | ||||
| 	uint32_t flags;		/**< Flags (if any) associated with this rule. */ | ||||
| 	uint32_t from_mtu;	/**< MTU of the incoming interface. */ | ||||
| 	uint32_t to_mtu;	/**< MTU of the outgoing interface. */ | ||||
| 	uint32_t src_ip;	/**< Source IP address. */ | ||||
| 	int32_t src_port;	/**< Source L4 port (e.g., TCP or UDP port). */ | ||||
| 	uint32_t src_ip_xlate;	/**< Translated source IP address (used with SNAT). */ | ||||
| 	int32_t src_port_xlate;	/**< Translated source L4 port (used with SNAT). */ | ||||
| 	uint32_t dest_ip;	/**< Destination IP address. */ | ||||
| 	int32_t dest_port;	/**< Destination L4 port (e.g., TCP or UDP port). */ | ||||
| 	uint32_t dest_ip_xlate; | ||||
| 			/**< Translated destination IP address (used with DNAT). */ | ||||
| 	int32_t dest_port_xlate; | ||||
| 			/**< Translated destination L4 port (used with DNAT). */ | ||||
| 	uint8_t src_mac[ETH_ALEN]; | ||||
| 			/**< Source MAC address. */ | ||||
| 	uint8_t dest_mac[ETH_ALEN]; | ||||
| 			/**< Destination MAC address. */ | ||||
| 	uint8_t src_mac_xlate[ETH_ALEN]; | ||||
| 			/**< Translated source MAC address (post-routing). */ | ||||
| 	uint8_t dest_mac_xlate[ETH_ALEN]; | ||||
| 			/**< Translated destination MAC address (post-routing). */ | ||||
| 	uint8_t flow_window_scale;	/**< Window scaling factor (TCP). */ | ||||
| 	uint32_t flow_max_window;	/**< Maximum window size (TCP). */ | ||||
| 	uint32_t flow_end;		/**< TCP window end. */ | ||||
| 	uint32_t flow_max_end;		/**< TCP window maximum end. */ | ||||
| 	uint32_t flow_pppoe_if_exist; | ||||
| 			/**< Flow direction: PPPoE interface exist flag. */ | ||||
| 	int32_t flow_pppoe_if_num; | ||||
| 			/**< Flow direction: PPPoE interface number. */ | ||||
| 	uint16_t ingress_vlan_tag;	/**< Ingress VLAN tag expected for this flow. */ | ||||
| 	uint8_t return_window_scale; | ||||
| 			/**< Window scaling factor of the return direction (TCP). */ | ||||
| 	uint32_t return_max_window; | ||||
| 			/**< Maximum window size of the return direction. */ | ||||
| 	uint32_t return_end; | ||||
| 			/**< Flow end for the return direction. */ | ||||
| 	uint32_t return_max_end; | ||||
| 			/**< Flow maximum end for the return direction. */ | ||||
| 	uint32_t return_pppoe_if_exist; | ||||
| 			/**< Return direction: PPPoE interface existence flag. */ | ||||
| 	int32_t return_pppoe_if_num; | ||||
| 			/**< Return direction: PPPoE interface number. */ | ||||
| 	uint16_t egress_vlan_tag;	/**< Egress VLAN tag expected for this flow. */ | ||||
| 	uint8_t spo_needed;		/**< Indicates whether SPO is required. */ | ||||
| 	uint32_t param_a0;		/**< Custom parameter 0. */ | ||||
| 	uint32_t param_a1;		/**< Custom parameter 1. */ | ||||
| 	uint32_t param_a2;		/**< Custom parameter 2. */ | ||||
| 	uint32_t param_a3;		/**< Custom parameter 3. */ | ||||
| 	uint32_t param_a4;		/**< Custom parameter 4. */ | ||||
| 	uint32_t qos_tag;		/**< Deprecated, will be removed soon. */ | ||||
| 	uint32_t flow_qos_tag;		/**< QoS tag value for the flow direction. */ | ||||
| 	uint32_t return_qos_tag;	/**< QoS tag value for the return direction. */ | ||||
| 	uint8_t dscp_itag;		/**< DSCP marking tag. */ | ||||
| 	uint8_t dscp_imask;		/**< DSCP marking input mask. */ | ||||
| 	uint8_t dscp_omask;		/**< DSCP marking output mask. */ | ||||
| 	uint8_t dscp_oval;		/**< DSCP marking output value. */ | ||||
| 	uint16_t vlan_itag;		/**< VLAN marking tag. */ | ||||
| 	uint16_t vlan_imask;		/**< VLAN marking input mask. */ | ||||
| 	uint16_t vlan_omask;		/**< VLAN marking output mask. */ | ||||
| 	uint16_t vlan_oval;		/**< VLAN marking output value. */ | ||||
| 	uint32_t in_vlan_tag[MAX_VLAN_DEPTH]; | ||||
| 			/**< Ingress VLAN tag expected for this flow. */ | ||||
| 	uint32_t out_vlan_tag[MAX_VLAN_DEPTH]; | ||||
| 			/**< Egress VLAN tag expected for this flow. */ | ||||
| 	uint8_t flow_dscp;		/**< IP DSCP value for the flow direction. */ | ||||
| 	uint8_t return_dscp;		/**< IP DSCP value for the return direction. */ | ||||
| }; | ||||
|  | ||||
| /** | ||||
|  * nss_ipv4_destroy | ||||
|  *	Information for an IPv4 flow or connection destroy rule. | ||||
|  */ | ||||
| struct nss_ipv4_destroy { | ||||
| 	int32_t protocol;	/**< L4 protocol ID. */ | ||||
| 	uint32_t src_ip;	/**< Source IP address. */ | ||||
| 	int32_t src_port;	/**< Source L4 port (e.g., TCP or UDP port). */ | ||||
| 	uint32_t dest_ip;	/**< Destination IP address. */ | ||||
| 	int32_t dest_port;	/**< Destination L4 port (e.g., TCP or UDP port). */ | ||||
| }; | ||||
|  | ||||
| /** | ||||
|  * nss_ipv4_message_types | ||||
|  *	IPv4 bridge and routing rule message types. | ||||
| @@ -111,6 +216,12 @@ enum nss_ipv4_stats_types { | ||||
| 		/**< Number of IPv4 multicast connection destroy requests that missed the cache. */ | ||||
| 	NSS_IPV4_STATS_MC_CONNECTION_FLUSHES, | ||||
| 		/**< Number of IPv4 multicast connection flushes. */ | ||||
| 	NSS_IPV4_STATS_CONNECTION_CREATE_INVALID_MIRROR_IFNUM, | ||||
| 		/**< Number of IPv4 mirror connection requests with an invalid interface number. */ | ||||
| 	NSS_IPV4_STATS_CONNECTION_CREATE_INVALID_MIRROR_IFTYPE, | ||||
| 		/**< Number of IPv4 mirror connection requests with an invalid interface type. */ | ||||
| 	NSS_IPV4_STATS_MIRROR_FAILURES, | ||||
| 		/**< Number of IPv4 mirror failures. */ | ||||
| 	NSS_IPV4_STATS_MAX, | ||||
| 		/**< Maximum message type. */ | ||||
| }; | ||||
| @@ -175,6 +286,7 @@ enum nss_ipv4_stats_types { | ||||
| 		/**< Ingress shaping fields are valid. */ | ||||
| #define NSS_IPV4_RULE_CREATE_IDENTIFIER_VALID 0x1000 | ||||
| 		/**< Identifier is valid. */ | ||||
| #define NSS_IPV4_RULE_CREATE_MIRROR_VALID 0x2000	/**< Mirror fields are valid. */ | ||||
|  | ||||
| /* | ||||
|  * Multicast command rule flags | ||||
| @@ -237,6 +349,15 @@ enum nss_ipv4_stats_types { | ||||
| #define NSS_IPV4_RETURN_IDENTIFIER_VALID 0x02 | ||||
| 		/**< Identifier for return direction is valid. */ | ||||
|  | ||||
| /* | ||||
|  * Mirror valid flags (to be used with the valid field of nss_ipv4_mirror_rule structure) | ||||
|  */ | ||||
| #define NSS_IPV4_MIRROR_FLOW_VALID 0x01 | ||||
| 		/**< Mirror interface number for the flow direction is valid. */ | ||||
| #define NSS_IPV4_MIRROR_RETURN_VALID 0x02 | ||||
| 		/**< Mirror interface number for the return direction is valid. */ | ||||
|  | ||||
|  | ||||
| /** | ||||
|  * nss_ipv4_5tuple | ||||
|  *	Common 5-tuple information. | ||||
| @@ -410,6 +531,16 @@ struct nss_ipv4_identifier_rule { | ||||
| 		/**< Identifier for return direction. */ | ||||
| }; | ||||
|  | ||||
| /** | ||||
|  * nss_ipv4_mirror_rule | ||||
|  *	Mirror rule structure. | ||||
|  */ | ||||
| struct nss_ipv4_mirror_rule { | ||||
| 	uint32_t valid;			/**< Mirror validity flags. */ | ||||
| 	nss_if_num_t flow_ifnum;	/**< Flow mirror interface number. */ | ||||
| 	nss_if_num_t return_ifnum;	/**< Return mirror interface number. */ | ||||
| }; | ||||
|  | ||||
| /** | ||||
|  * nss_ipv4_error_response_types | ||||
|  *	Error types for IPv4 messages. | ||||
| @@ -478,6 +609,8 @@ struct nss_ipv4_rule_create_msg { | ||||
| 			/**< Ingress shaping related accleration parameters. */ | ||||
| 	struct nss_ipv4_identifier_rule identifier; | ||||
| 			/**< Rule for adding identifier. */ | ||||
| 	struct nss_ipv4_mirror_rule mirror_rule; | ||||
| 			/**< Mirror rule parameter. */ | ||||
| }; | ||||
|  | ||||
| /** | ||||
| @@ -821,6 +954,16 @@ struct nss_ipv4_node_sync { | ||||
|  | ||||
| 	uint32_t ipv4_mc_connection_flushes; | ||||
| 			/**< Number of multicast connection flushes. */ | ||||
|  | ||||
| 	uint32_t ipv4_connection_create_invalid_mirror_ifnum; | ||||
| 			/**< Number of create request failed with an invalid mirror interface number. */ | ||||
|  | ||||
| 	uint32_t ipv4_connection_create_invalid_mirror_iftype; | ||||
| 			/**< Number of create request failed with an invalid mirror interface type. */ | ||||
|  | ||||
| 	uint32_t ipv4_mirror_failures; | ||||
| 			/**< Mirror packet failed. */ | ||||
|  | ||||
| 	uint32_t exception_events[NSS_IPV4_EXCEPTION_EVENT_MAX]; | ||||
| 			/**< Number of exception events. */ | ||||
| }; | ||||
|   | ||||
| @@ -1,6 +1,6 @@ | ||||
| /* | ||||
|  ************************************************************************** | ||||
|  * Copyright (c) 2014-2020, The Linux Foundation. All rights reserved. | ||||
|  * Copyright (c) 2014-2021, The Linux Foundation. All rights reserved. | ||||
|  * Permission to use, copy, modify, and/or distribute this software for | ||||
|  * any purpose with or without fee is hereby granted, provided that the | ||||
|  * above copyright notice and this permission notice appear in all copies. | ||||
| @@ -27,6 +27,125 @@ | ||||
|  * @{ | ||||
|  */ | ||||
|  | ||||
| /** | ||||
|  * Converts the format of an IPv6 address from Linux to NSS. @hideinitializer | ||||
|  */ | ||||
| #define IN6_ADDR_TO_IPV6_ADDR(ipv6, in6) \ | ||||
| 	{ \ | ||||
| 		((uint32_t *)ipv6)[0] = in6.in6_u.u6_addr32[0]; \ | ||||
| 		((uint32_t *)ipv6)[1] = in6.in6_u.u6_addr32[1]; \ | ||||
| 		((uint32_t *)ipv6)[2] = in6.in6_u.u6_addr32[2]; \ | ||||
| 		((uint32_t *)ipv6)[3] = in6.in6_u.u6_addr32[3]; \ | ||||
| 	} | ||||
|  | ||||
| /** | ||||
|  * Converts the format of an IPv6 address from NSS to Linux. @hideinitializer | ||||
|  */ | ||||
| #define IPV6_ADDR_TO_IN6_ADDR(in6, ipv6) \ | ||||
| 	{ \ | ||||
| 		in6.in6_u.u6_addr32[0] = ((uint32_t *)ipv6)[0]; \ | ||||
| 		in6.in6_u.u6_addr32[1] = ((uint32_t *)ipv6)[1]; \ | ||||
| 		in6.in6_u.u6_addr32[2] = ((uint32_t *)ipv6)[2]; \ | ||||
| 		in6.in6_u.u6_addr32[3] = ((uint32_t *)ipv6)[3]; \ | ||||
| 	} | ||||
|  | ||||
| /** | ||||
|  * Format of an IPv6 address (16 * 8 bits). | ||||
|  */ | ||||
| #define IPV6_ADDR_OCTAL_FMT "%04x:%04x:%04x:%04x:%04x:%04x:%04x:%04x" | ||||
|  | ||||
| /** | ||||
|  * Prints an IPv6 address (16 * 8 bits). | ||||
|  */ | ||||
| #define IPV6_ADDR_TO_OCTAL(ipv6) ((uint16_t *)ipv6)[0], ((uint16_t *)ipv6)[1], ((uint16_t *)ipv6)[2], ((uint16_t *)ipv6)[3], ((uint16_t *)ipv6)[4], ((uint16_t *)ipv6)[5], ((uint16_t *)ipv6)[6], ((uint16_t *)ipv6)[7] | ||||
|  | ||||
| /* | ||||
|  * IPv6 connection flags (to be used with nss_ipv6_create::flags. | ||||
|  */ | ||||
| #define NSS_IPV6_CREATE_FLAG_NO_SEQ_CHECK 0x1 | ||||
| 		/**< Indicates that sequence numbers are not to be checked. */ | ||||
| #define NSS_IPV6_CREATE_FLAG_BRIDGE_FLOW 0x02 | ||||
| 		/**< Indicates that this is a pure bridge flow (no routing is involved). */ | ||||
| #define NSS_IPV6_CREATE_FLAG_ROUTED 0x04	/**< Rule is for a routed connection. */ | ||||
| #define NSS_IPV6_CREATE_FLAG_DSCP_MARKING 0x08	/**< Rule for DSCP marking. */ | ||||
| #define NSS_IPV6_CREATE_FLAG_VLAN_MARKING 0x10	/**< Rule for VLAN marking. */ | ||||
| #define NSS_IPV6_CREATE_FLAG_QOS_VALID 0x20	/**< Rule for Valid QoS. */ | ||||
|  | ||||
| /** | ||||
|  * nss_ipv6_create | ||||
|  *	Information for an IPv6 flow or connection create rule. | ||||
|  * | ||||
|  * All fields must be passed in host-endian order. | ||||
|  */ | ||||
| struct nss_ipv6_create { | ||||
| 	int32_t src_interface_num; | ||||
| 			/**< Source interface number (virtual or physical). */ | ||||
| 	int32_t dest_interface_num; | ||||
| 			/**< Destination interface number (virtual or physical). */ | ||||
| 	int32_t protocol;	/**< L4 protocol (e.g., TCP or UDP). */ | ||||
| 	uint32_t flags;		/**< Flags (if any) associated with this rule. */ | ||||
| 	uint32_t from_mtu;	/**< MTU of the incoming interface. */ | ||||
| 	uint32_t to_mtu;	/**< MTU of the outgoing interface. */ | ||||
| 	uint32_t src_ip[4];	/**< Source IP address. */ | ||||
| 	int32_t src_port;	/**< Source L4 port (e.g., TCP or UDP port). */ | ||||
| 	uint32_t dest_ip[4];	/**< Destination IP address. */ | ||||
| 	int32_t dest_port;	/**< Destination L4 port (e.g., TCP or UDP port). */ | ||||
| 	uint8_t src_mac[ETH_ALEN];	/**< Source MAC address. */ | ||||
| 	uint8_t dest_mac[ETH_ALEN];	/**< Destination MAC address. */ | ||||
| 	uint8_t flow_window_scale;	/**< Window scaling factor (TCP). */ | ||||
| 	uint32_t flow_max_window;	/**< Maximum window size (TCP). */ | ||||
| 	uint32_t flow_end;		/**< TCP window end. */ | ||||
| 	uint32_t flow_max_end;		/**< TCP window maximum end. */ | ||||
| 	uint32_t flow_pppoe_if_exist; | ||||
| 			/**< Flow direction: PPPoE interface existence flag. */ | ||||
| 	int32_t flow_pppoe_if_num; | ||||
| 			/**< Flow direction: PPPoE interface number. */ | ||||
| 	uint16_t ingress_vlan_tag; | ||||
| 			/**< Ingress VLAN tag expected for this flow. */ | ||||
| 	uint8_t return_window_scale; | ||||
| 			/**< Window scaling factor (TCP) for the return direction. */ | ||||
| 	uint32_t return_max_window; | ||||
| 			/**< Maximum window size (TCP) for the return direction. */ | ||||
| 	uint32_t return_end; | ||||
| 			/**< End for the return direction. */ | ||||
| 	uint32_t return_max_end; | ||||
| 			/**< Maximum end for the return direction. */ | ||||
| 	uint32_t return_pppoe_if_exist; | ||||
| 			/**< Return direction: PPPoE interface exist flag. */ | ||||
| 	int32_t return_pppoe_if_num; | ||||
| 			/**< Return direction: PPPoE interface number. */ | ||||
| 	uint16_t egress_vlan_tag;	/**< Egress VLAN tag expected for this flow. */ | ||||
| 	uint32_t qos_tag;		/**< Deprecated; will be removed soon. */ | ||||
| 	uint32_t flow_qos_tag;		/**< QoS tag value for flow direction. */ | ||||
| 	uint32_t return_qos_tag;	/**< QoS tag value for the return direction. */ | ||||
| 	uint8_t dscp_itag;		/**< DSCP marking tag. */ | ||||
| 	uint8_t dscp_imask;		/**< DSCP marking input mask. */ | ||||
| 	uint8_t dscp_omask;		/**< DSCP marking output mask. */ | ||||
| 	uint8_t dscp_oval;		/**< DSCP marking output value. */ | ||||
| 	uint16_t vlan_itag;		/**< VLAN marking tag. */ | ||||
| 	uint16_t vlan_imask;		/**< VLAN marking input mask. */ | ||||
| 	uint16_t vlan_omask;		/**< VLAN marking output mask. */ | ||||
| 	uint16_t vlan_oval;		/**< VLAN marking output value. */ | ||||
| 	uint32_t in_vlan_tag[MAX_VLAN_DEPTH]; | ||||
| 					/**< Ingress VLAN tag expected for this flow. */ | ||||
| 	uint32_t out_vlan_tag[MAX_VLAN_DEPTH]; | ||||
| 					/**< Egress VLAN tag expected for this flow. */ | ||||
| 	uint8_t flow_dscp;		/**< IP DSCP value for flow direction. */ | ||||
| 	uint8_t return_dscp;		/**< IP DSCP value for the return direction. */ | ||||
| }; | ||||
|  | ||||
| /** | ||||
|  * nss_ipv6_destroy | ||||
|  *	Information for an IPv6 flow or connection destroy rule. | ||||
|  */ | ||||
| struct nss_ipv6_destroy { | ||||
| 	int32_t protocol;	/**< L4 protocol (e.g., TCP or UDP). */ | ||||
| 	uint32_t src_ip[4];	/**< Source IP address. */ | ||||
| 	int32_t src_port;	/**< Source L4 port (e.g., TCP or UDP port). */ | ||||
| 	uint32_t dest_ip[4];	/**< Destination IP address. */ | ||||
| 	int32_t dest_port;	/**< Destination L4 port (e.g., TCP or UDP port). */ | ||||
| }; | ||||
|  | ||||
| /** | ||||
|  * nss_ipv6_stats_types | ||||
|  *	IPv6 node statistics. | ||||
| @@ -76,6 +195,14 @@ enum nss_ipv6_stats_types { | ||||
| 					/**< Number of IPv6 multicast connection destroy requests that missed the cache. */ | ||||
| 	NSS_IPV6_STATS_MC_CONNECTION_FLUSHES, | ||||
| 					/**< Number of IPv6 multicast connection flushes. */ | ||||
| 	NSS_IPV6_STATS_CONNECTION_CREATE_INVALID_MIRROR_IFNUM, | ||||
| 		/**< Number of IPv6 mirror connection requests with an invalid interface number. */ | ||||
| 	NSS_IPV6_STATS_CONNECTION_CREATE_INVALID_MIRROR_IFTYPE, | ||||
| 		/**< Number of IPv6 mirror connection requests with an invalid interface type. */ | ||||
|  | ||||
| 	NSS_IPV6_STATS_MIRROR_FAILURES, | ||||
| 		/**< Number of IPv6 mirror failures. */ | ||||
|  | ||||
| 	NSS_IPV6_STATS_MAX, | ||||
| 					/**< Maximum message type. */ | ||||
| }; | ||||
| @@ -169,6 +296,7 @@ enum nss_ipv6_dscp_map_actions { | ||||
| 		/**< Destination MAC address fields are valid. */ | ||||
| #define NSS_IPV6_RULE_CREATE_IGS_VALID 0x800	/**< Ingress shaping fields are valid. */ | ||||
| #define NSS_IPV6_RULE_CREATE_IDENTIFIER_VALID 0x1000	/**< Identifier is valid. */ | ||||
| #define NSS_IPV6_RULE_CREATE_MIRROR_VALID 0x2000	/**< Mirror fields are valid. */ | ||||
|  | ||||
| /* | ||||
|  * Multicast command rule flags | ||||
| @@ -229,6 +357,14 @@ enum nss_ipv6_dscp_map_actions { | ||||
| #define NSS_IPV6_RETURN_IDENTIFIER_VALID 0x02 | ||||
| 		/**< Identifier for return direction is valid. */ | ||||
|  | ||||
| /* | ||||
|  * Mirror valid flags (to be used with the valid field of nss_ipv6_mirror_rule structure) | ||||
|  */ | ||||
| #define NSS_IPV6_MIRROR_FLOW_VALID 0x01 | ||||
| 		/**< Mirror interface number for the flow direction is valid. */ | ||||
| #define NSS_IPV6_MIRROR_RETURN_VALID 0x02 | ||||
| 		/**< Mirror interface number for the return direction is valid. */ | ||||
|  | ||||
| /** | ||||
|  * nss_ipv6_exception_events | ||||
|  *	Exception events from an IPv6 bridge or route handler. | ||||
| @@ -460,6 +596,16 @@ struct nss_ipv6_identifier_rule { | ||||
| 		/**< Identifier for return direction. */ | ||||
| }; | ||||
|  | ||||
| /** | ||||
|  * nss_ipv6_mirror_rule | ||||
|  *	Mirror rule structure. | ||||
|  */ | ||||
| struct nss_ipv6_mirror_rule { | ||||
| 	uint32_t valid;			/**< Mirror validity flags. */ | ||||
| 	nss_if_num_t flow_ifnum;	/**< Flow mirror interface number. */ | ||||
| 	nss_if_num_t return_ifnum;	/**< Return mirror interface number. */ | ||||
| }; | ||||
|  | ||||
| /** | ||||
|  * nss_ipv6_error_response_types | ||||
|  *	Error types for IPv6 messages. | ||||
| @@ -556,6 +702,8 @@ struct nss_ipv6_rule_create_msg { | ||||
| 			/**< Ingress shaping related accleration parameters. */ | ||||
| 	struct nss_ipv6_identifier_rule identifier; | ||||
| 			/**< Rule for adding identifier. */ | ||||
| 	struct nss_ipv6_mirror_rule mirror_rule; | ||||
| 			/**< Mirror rule parameter. */ | ||||
| }; | ||||
|  | ||||
| /** | ||||
| @@ -801,6 +949,16 @@ struct nss_ipv6_node_sync { | ||||
|  | ||||
| 	uint32_t ipv6_mc_connection_flushes; | ||||
| 			/**< Number of multicast connection flushes. */ | ||||
|  | ||||
| 	uint32_t ipv6_connection_create_invalid_mirror_ifnum; | ||||
| 			/**< Number of create request failed with an invalid mirror interface number. */ | ||||
|  | ||||
| 	uint32_t ipv6_connection_create_invalid_mirror_iftype; | ||||
| 			/**< Number of create request failed with an invalid mirror interface type. */ | ||||
|  | ||||
| 	uint32_t ipv6_mirror_failures; | ||||
| 			/**< Mirror packet failed. */ | ||||
|  | ||||
| 	uint32_t exception_events[NSS_IPV6_EXCEPTION_EVENT_MAX]; | ||||
| 			/**< Number of exception events. */ | ||||
| }; | ||||
|   | ||||
| @@ -1,6 +1,6 @@ | ||||
| /* | ||||
|  ************************************************************************** | ||||
|  * Copyright (c) 2016-2020, The Linux Foundation. All rights reserved. | ||||
|  * Copyright (c) 2016-2021, The Linux Foundation. All rights reserved. | ||||
|  * Permission to use, copy, modify, and/or distribute this software for | ||||
|  * any purpose with or without fee is hereby granted, provided that the | ||||
|  * above copyright notice and this permission notice appear in all copies. | ||||
| @@ -36,6 +36,16 @@ | ||||
|  */ | ||||
| #define NSS_MAX_MAP_T_DYNAMIC_INTERFACES 4 | ||||
|  | ||||
| #define NSS_MAPT_MDATA_FLAG_DF_BIT  (1 << 0) | ||||
|  | ||||
| /* | ||||
|  * mapt meta data | ||||
|  */ | ||||
| struct nss_map_t_mdata { | ||||
| 	uint16_t flags; | ||||
| 	uint16_t res[6]; | ||||
| }; | ||||
|  | ||||
| /** | ||||
|  * nss_map_t_msg_types | ||||
|  *	Message types for MAP-T requests and responses. | ||||
|   | ||||
| @@ -1,6 +1,6 @@ | ||||
| /* | ||||
|  ************************************************************************** | ||||
|  * Copyright (c) 2020, The Linux Foundation. All rights reserved. | ||||
|  * Copyright (c) 2020-2021, The Linux Foundation. All rights reserved. | ||||
|  * | ||||
|  * Permission to use, copy, modify, and/or distribute this software for | ||||
|  * any purpose with or without fee is hereby granted, provided that the | ||||
| @@ -78,6 +78,20 @@ enum nss_mirror_error_type { | ||||
| 	NSS_MIRROR_ERROR_TYPE_MAX,			/**< Maximum message type. */ | ||||
| }; | ||||
|  | ||||
| /** | ||||
|  * nss_mirror_stats | ||||
|  *	Mirror interface debug statistics. | ||||
|  */ | ||||
| enum nss_mirror_stats { | ||||
| 	NSS_MIRROR_STATS_PKTS,			/**< Number of packets exceptioned to host. */ | ||||
| 	NSS_MIRROR_STATS_BYTES,			/**< Number of bytes exceptioned to host. */ | ||||
| 	NSS_MIRROR_STATS_TX_SEND_FAIL,		/**< Transmit send failures. */ | ||||
| 	NSS_MIRROR_STATS_DEST_LOOKUP_FAIL,	/**< Destination lookup failures. */ | ||||
| 	NSS_MIRROR_STATS_MEM_ALLOC_FAIL,	/**< Memory allocation failures. */ | ||||
| 	NSS_MIRROR_STATS_COPY_FAIL,		/**< Copy failures. */ | ||||
| 	NSS_MIRROR_STATS_MAX			/**< Maximum statistics count. */ | ||||
| }; | ||||
|  | ||||
| /** | ||||
|  * nss_mirror_configure_msg | ||||
|  *	Mirror interface configuration information. | ||||
| @@ -119,6 +133,16 @@ struct nss_mirror_stats_sync_msg { | ||||
| 	struct nss_mirror_node_stats mirror_stats;	/**< Debug statistics for mirror. */ | ||||
| }; | ||||
|  | ||||
| /** | ||||
|  * nss_mirror_stats_notification | ||||
|  *	Mirror transmission statistics structure. | ||||
|  */ | ||||
| struct nss_mirror_stats_notification { | ||||
| 	uint64_t stats_ctx[NSS_MIRROR_STATS_MAX];	/**< Context transmission statistics. */ | ||||
| 	uint32_t core_id;				/**< Core ID. */ | ||||
| 	uint32_t if_num;				/**< Interface number. */ | ||||
| }; | ||||
|  | ||||
| /** | ||||
|  * nss_mirror_msg | ||||
|  *	Data for sending and receiving mirror interface messages. | ||||
| @@ -205,6 +229,17 @@ extern nss_tx_status_t nss_mirror_tx_msg(struct nss_ctx_instance *nss_ctx, struc | ||||
|  */ | ||||
| extern nss_tx_status_t nss_mirror_tx_msg_sync(struct nss_ctx_instance *nss_ctx, struct nss_mirror_msg *msg); | ||||
|  | ||||
| /** | ||||
|  * nss_mirror_unregister_if | ||||
|  *	Deregisters a mirror interface from the NSS. | ||||
|  * | ||||
|  * @param[in] if_num  NSS interface number. | ||||
|  * | ||||
|  * @return | ||||
|  * None. | ||||
|  */ | ||||
| extern void nss_mirror_unregister_if(uint32_t if_num); | ||||
|  | ||||
| /** | ||||
|  * nss_mirror_register_if | ||||
|  *	Registers a mirror interface with the NSS for sending and receiving messages. | ||||
| @@ -228,17 +263,6 @@ extern struct nss_ctx_instance *nss_mirror_register_if(uint32_t if_num, | ||||
| 		nss_mirror_msg_callback_t event_callback, | ||||
| 		struct net_device *netdev, uint32_t features); | ||||
|  | ||||
| /** | ||||
|  * nss_mirror_unregister_if | ||||
|  *	Deregisters a mirror interface from the NSS. | ||||
|  * | ||||
|  * @param[in] if_num  NSS interface number. | ||||
|  * | ||||
|  * @return | ||||
|  * None. | ||||
|  */ | ||||
| extern void nss_mirror_unregister_if(uint32_t if_num); | ||||
|  | ||||
| /** | ||||
|  * nss_mirror_verify_if_num | ||||
|  *	Verify whether the interface is an mirror interface or not. | ||||
| @@ -259,6 +283,34 @@ extern bool nss_mirror_verify_if_num(uint32_t if_num); | ||||
|  */ | ||||
| extern void nss_mirror_register_handler(void); | ||||
|  | ||||
| /** | ||||
|  * nss_mirror_stats_unregister_notifier | ||||
|  *	Deregisters a statistics notifier. | ||||
|  * | ||||
|  * @datatypes | ||||
|  *	notifier_block | ||||
|  * | ||||
|  * @param[in] nb Notifier block. | ||||
|  * | ||||
|  * @return | ||||
|  * 0 on success or non-zero on failure. | ||||
|  */ | ||||
| extern int nss_mirror_stats_unregister_notifier(struct notifier_block *nb); | ||||
|  | ||||
| /** | ||||
|  * nss_mirror_stats_register_notifier | ||||
|  *	Registers a statistics notifier. | ||||
|  * | ||||
|  * @datatypes | ||||
|  *	notifier_block | ||||
|  * | ||||
|  * @param[in] nb Notifier block. | ||||
|  * | ||||
|  * @return | ||||
|  * 0 on success or non-zero on failure. | ||||
|  */ | ||||
| extern int nss_mirror_stats_register_notifier(struct notifier_block *nb); | ||||
|  | ||||
| /** | ||||
|  * @} | ||||
|  */ | ||||
|   | ||||
| @@ -1,6 +1,6 @@ | ||||
| /* | ||||
|  ************************************************************************** | ||||
|  * Copyright (c) 2016-2018, 2020, The Linux Foundation. All rights reserved. | ||||
|  * Copyright (c) 2016-2018, 2020-2021, The Linux Foundation. All rights reserved. | ||||
|  * Permission to use, copy, modify, and/or distribute this software for | ||||
|  * any purpose with or without fee is hereby granted, provided that the | ||||
|  * above copyright notice and this permission notice appear in all copies. | ||||
| @@ -22,6 +22,8 @@ | ||||
| #ifndef _NSS_PPE_H_ | ||||
| #define _NSS_PPE_H_ | ||||
|  | ||||
| typedef int32_t nss_ppe_port_t; | ||||
|  | ||||
| /** | ||||
|  * @addtogroup nss_ppe_subsystem | ||||
|  * @{ | ||||
| @@ -56,6 +58,34 @@ enum nss_ppe_sc_type { | ||||
| 	NSS_PPE_SC_MAX,			/**< Maximum service code. */ | ||||
| }; | ||||
|  | ||||
| /** | ||||
|  * nss_ppe_stats_unregister_notifier | ||||
|  *	Deregisters a statistics notifier. | ||||
|  * | ||||
|  * @datatypes | ||||
|  *	notifier_block | ||||
|  * | ||||
|  * @param[in] nb Notifier block. | ||||
|  * | ||||
|  * @return | ||||
|  * 0 on success or non-zero on failure. | ||||
|  */ | ||||
| extern int nss_ppe_stats_unregister_notifier(struct notifier_block *nb); | ||||
|  | ||||
| /** | ||||
|  * nss_ppe_stats_register_notifier | ||||
|  *	Registers a statistics notifier. | ||||
|  * | ||||
|  * @datatypes | ||||
|  *	notifier_block | ||||
|  * | ||||
|  * @param[in] nb Notifier block. | ||||
|  * | ||||
|  * @return | ||||
|  * 0 on success or non-zero on failure. | ||||
|  */ | ||||
| extern int nss_ppe_stats_register_notifier(struct notifier_block *nb); | ||||
|  | ||||
| /** @} */ /* end_addtogroup nss_ppe_subsystem */ | ||||
|  | ||||
| #endif /* _NSS_PPE_H_ */ | ||||
|   | ||||
							
								
								
									
										79
									
								
								feeds/ipq807x/qca-nss-drv/src/exports/nss_ppe_vp.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										79
									
								
								feeds/ipq807x/qca-nss-drv/src/exports/nss_ppe_vp.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,79 @@ | ||||
| /* | ||||
|  ************************************************************************** | ||||
|  * Copyright (c) 2021, The Linux Foundation. All rights reserved. | ||||
|  * Permission to use, copy, modify, and/or distribute this software for | ||||
|  * any purpose with or without fee is hereby granted, provided that the | ||||
|  * above copyright notice and this permission notice appear in all copies. | ||||
|  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES | ||||
|  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF | ||||
|  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR | ||||
|  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES | ||||
|  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN | ||||
|  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT | ||||
|  * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | ||||
|  ************************************************************************** | ||||
|  */ | ||||
|  | ||||
| /** | ||||
|  * @file nss_ppe_vp.h | ||||
|  *	NSS PPE Virtual Port definitions. | ||||
|  */ | ||||
|  | ||||
| #ifndef _NSS_PPE_VP_H_ | ||||
| #define _NSS_PPE_VP_H_ | ||||
|  | ||||
| /** | ||||
|  * nss_if_ppe_vp_destroy | ||||
|  *	Destroy the PPE VP for a given NSS interface number. | ||||
|  * | ||||
|  * @datatypes | ||||
|  * nss_ctx_instance | ||||
|  * | ||||
|  * @param[in] nss_ctx  Pointer to the NSS context. | ||||
|  * @param[in] if_num   NSS interface number. | ||||
|  * | ||||
|  * @return | ||||
|  * Status of the Tx operation. | ||||
|  */ | ||||
| nss_tx_status_t nss_ppe_vp_destroy(struct nss_ctx_instance *nss_ctx, nss_if_num_t if_num); | ||||
|  | ||||
| /** | ||||
|  * nss_ppe_vp_create | ||||
|  *	Create the PPE VP for a given NSS interface number. | ||||
|  * | ||||
|  * @datatypes | ||||
|  * nss_ctx_instance | ||||
|  * | ||||
|  * @param[in] nss_ctx  Pointer to the NSS context. | ||||
|  * @param[in] if_num   NSS interface number. | ||||
|  * | ||||
|  * @return | ||||
|  * Status of the Tx operation. | ||||
|  */ | ||||
| nss_tx_status_t nss_ppe_vp_create(struct nss_ctx_instance *nss_ctx, nss_if_num_t if_num); | ||||
|  | ||||
| /** | ||||
|  * nss_ppe_vp_get_ppe_port_by_nssif | ||||
|  *	Returns the PPE VP number for a given NSS interface number. | ||||
|  * | ||||
|  * @param[in] nss_ctx  Pointer to the NSS context. | ||||
|  * @param[in] nss_if  NSS interface number. | ||||
|  * | ||||
|  * @return | ||||
|  * Returns the PPE VP number corresponding to the NSS interface number. | ||||
|  */ | ||||
| nss_ppe_port_t nss_ppe_vp_get_ppe_port_by_nssif(struct nss_ctx_instance *nss_ctx, nss_if_num_t nss_if); | ||||
|  | ||||
| /** | ||||
|  * nss_ppe_vp_get_context | ||||
|  *	Return the NSS context of PPE VP. | ||||
|  * | ||||
|  * @datatypes | ||||
|  * nss_ctx_instance | ||||
|  * | ||||
|  * @return | ||||
|  * Pointer to the NSS core context. | ||||
|  */ | ||||
| struct nss_ctx_instance *nss_ppe_vp_get_context(void); | ||||
|  | ||||
| #endif /* _NSS_PPE_VP_H_ */ | ||||
| @@ -1,6 +1,6 @@ | ||||
| /* | ||||
|  ************************************************************************** | ||||
|  * Copyright (c) 2019, The Linux Foundation. All rights reserved. | ||||
|  * Copyright (c) 2019, 2021, The Linux Foundation. All rights reserved. | ||||
|  * Permission to use, copy, modify, and/or distribute this software for | ||||
|  * any purpose with or without fee is hereby granted, provided that the | ||||
|  * above copyright notice and this permission notice appear in all copies. | ||||
| @@ -27,10 +27,6 @@ | ||||
|  * @{ | ||||
|  */ | ||||
|  | ||||
| #define NSS_QVPN_INTERFACE_MAX_LONG BITS_TO_LONGS(NSS_MAX_NET_INTERFACES)	/**< QVPN interface mapping bits. */ | ||||
| #define NSS_QVPN_STATS_MAX_LINES (NSS_STATS_NODE_MAX + 32)			/**< Maxminum number of lines for QVPN statistics dump. */ | ||||
| #define NSS_QVPN_STATS_SIZE_PER_IF (NSS_STATS_MAX_STR_LENGTH * NSS_QVPN_STATS_MAX_LINES)	/**< Total number of statistics per QVPN interface. */ | ||||
|  | ||||
| #define NSS_QVPN_CMDS_MAX 10			/**< Maximum number of QVPN commands supported. */ | ||||
| #define NSS_QVPN_VPN_HDR_HEAD_SIZE_MAX 64	/**< Maximum size of QVPN header. */ | ||||
| #define NSS_QVPN_VPN_HDR_TAIL_SIZE_MAX 32	/**< Maximum size of QVPN tail. */ | ||||
| @@ -293,6 +289,16 @@ struct nss_qvpn_stats_sync_msg { | ||||
| 	uint32_t exception_event[NSS_QVPN_EXCEPTION_EVENT_MAX];		/**< QVPN exception events. */ | ||||
| }; | ||||
|  | ||||
| /** | ||||
|  * nss_qvpn_stats_notification | ||||
|  *	QVPN transmission statistics structure. | ||||
|  */ | ||||
| struct nss_qvpn_stats_notification { | ||||
| 	uint64_t stats_ctx[NSS_STATS_NODE_MAX];		/**< Context transmission statistics. */ | ||||
| 	uint32_t core_id;				/**< Core ID. */ | ||||
| 	uint32_t if_num;				/**< Interface number. */ | ||||
| }; | ||||
|  | ||||
| /** | ||||
|  * nss_qvpn_msg | ||||
|  *	QVPN message structure for configuration and statistics. | ||||
| @@ -419,6 +425,17 @@ typedef void (*nss_qvpn_callback_t)(struct net_device *netdev, struct sk_buff *s | ||||
|  */ | ||||
| typedef void (*nss_qvpn_msg_callback_t)(void *app_data, struct nss_cmn_msg *msg); | ||||
|  | ||||
| /** | ||||
|  * nss_qvpn_unregister_if | ||||
|  *	Deregisters the QVPN interface from the NSS. | ||||
|  * | ||||
|  * @param[in] if_num              NSS interface number. | ||||
|  * | ||||
|  * @return | ||||
|  * None. | ||||
|  */ | ||||
| void nss_qvpn_unregister_if(uint32_t if_num); | ||||
|  | ||||
| /** | ||||
|  * nss_qvpn_register_if | ||||
|  *	Register to send/receive QVPN messages to NSS. | ||||
| @@ -441,17 +458,6 @@ struct nss_ctx_instance *nss_qvpn_register_if(uint32_t if_num, nss_qvpn_callback | ||||
| 			nss_qvpn_msg_callback_t qvpn_event_callback, struct net_device *netdev, | ||||
| 			uint32_t features, void *app_ctx); | ||||
|  | ||||
| /** | ||||
|  * nss_qvpn_unregister_if | ||||
|  *	Deregisters the QVPN interface from the NSS. | ||||
|  * | ||||
|  * @param[in] if_num              NSS interface number. | ||||
|  * | ||||
|  * @return | ||||
|  * None. | ||||
|  */ | ||||
| void nss_qvpn_unregister_if(uint32_t if_num); | ||||
|  | ||||
| /** | ||||
|  * nss_qvpn_ifnum_with_core_id | ||||
|  *	Gets the QVPN interface number with the core ID. | ||||
| @@ -481,6 +487,34 @@ void nss_qvpn_register_handler(void); | ||||
|  */ | ||||
| unsigned long *nss_qvpn_ifmap_get(void); | ||||
|  | ||||
| /** | ||||
|  * nss_qvpn_stats_unregister_notifier | ||||
|  *	Deregisters a statistics notifier. | ||||
|  * | ||||
|  * @datatypes | ||||
|  *	notifier_block | ||||
|  * | ||||
|  * @param[in] nb Notifier block. | ||||
|  * | ||||
|  * @return | ||||
|  * 0 on success or non-zero on failure. | ||||
|  */ | ||||
| extern int nss_qvpn_stats_unregister_notifier(struct notifier_block *nb); | ||||
|  | ||||
| /** | ||||
|  * nss_qvpn_stats_register_notifier | ||||
|  *	Registers a statistics notifier. | ||||
|  * | ||||
|  * @datatypes | ||||
|  *	notifier_block | ||||
|  * | ||||
|  * @param[in] nb Notifier block. | ||||
|  * | ||||
|  * @return | ||||
|  * 0 on success or non-zero on failure. | ||||
|  */ | ||||
| extern int nss_qvpn_stats_register_notifier(struct notifier_block *nb); | ||||
|  | ||||
| /** | ||||
|  * @} | ||||
|  */ | ||||
|   | ||||
| @@ -18,7 +18,7 @@ | ||||
|  | ||||
| /* | ||||
|  * @file nss_rmnet_rx.h | ||||
|  *	NSS Virtual interface message Structure and APIs | ||||
|  *	NSS RMNET interface message Structure and APIs | ||||
|  */ | ||||
|  | ||||
| #ifndef __NSS_RMNET_RX_H | ||||
| @@ -58,7 +58,7 @@ enum nss_rmnet_rx_msg_types { | ||||
|  | ||||
| /** | ||||
|  * nss_rmnet_rx_error_types | ||||
|  *	Error types for the virtual interface. | ||||
|  *	Error types for the RMNET interface. | ||||
|  */ | ||||
| enum nss_rmnet_rx_error_types { | ||||
| 	NSS_RMNET_RX_SUCCESS,				/**< No error. */ | ||||
| @@ -125,19 +125,19 @@ struct nss_rmnet_rx_msg { | ||||
| 	struct nss_cmn_msg cm;		/**< Common message header. */ | ||||
|  | ||||
| 	/** | ||||
| 	 * Payload of a virtual interface message. | ||||
| 	 * Payload of an RMNET interface message. | ||||
| 	 */ | ||||
| 	union { | ||||
| 		struct nss_rmnet_rx_config_msg if_config; | ||||
| 				/**< Rule for creating a virtual interface. */ | ||||
| 				/**< Rule for creating an RMNET interface. */ | ||||
| 		struct nss_rmnet_rx_stats stats; | ||||
| 				/**< Virtual interface statistics. */ | ||||
| 				/**< RMNET interface statistics. */ | ||||
| 	} msg;			/**< Message payload. */ | ||||
| }; | ||||
|  | ||||
| /** | ||||
|  * Callback to transmit interface data received from NSS | ||||
|  * to the transmit path of the virtual interface. | ||||
|  * to the transmit path of the RMNET interface. | ||||
|  * | ||||
|  * @datatypes | ||||
|  * net_device \n | ||||
| @@ -183,8 +183,8 @@ struct nss_rmnet_rx_handle { | ||||
| 	int32_t if_num_h2n;			/**< Redirect interface number on host-to-NSS path. */ | ||||
| 	struct net_device *ndev;		/**< Associated network device. */ | ||||
| 	struct nss_rmnet_rx_pvt *pvt;		/**< Private data structure. */ | ||||
| 	uint64_t *stats_n2h;			/**< Virtual interface statistics from NSS-to-host. */ | ||||
| 	uint64_t *stats_h2n;			/**< Virtual interface statistics from host-to-NSS. */ | ||||
| 	uint64_t *stats_n2h;			/**< RMNET interface statistics from NSS-to-host. */ | ||||
| 	uint64_t *stats_h2n;			/**< RMNET interface statistics from host-to-NSS. */ | ||||
| 	atomic_t refcnt;			/**< Reference count. */ | ||||
| 	nss_rmnet_rx_msg_callback_t cb;		/**< Message callback. */ | ||||
| 	void *app_data;		/**< Application data to be passed to the callback. */ | ||||
| @@ -192,12 +192,12 @@ struct nss_rmnet_rx_handle { | ||||
|  | ||||
| /** | ||||
|  * nss_rmnet_rx_destroy_sync | ||||
|  *	Destroys the virtual interface synchronously. | ||||
|  *	Destroys the RMNET interface synchronously. | ||||
|  * | ||||
|  * @datatypes | ||||
|  * nss_rmnet_rx_handle | ||||
|  * | ||||
|  * @param[in,out] handle  Pointer to the virtual interface handle (provided during | ||||
|  * @param[in,out] handle  Pointer to the RMNET interface handle (provided during | ||||
|  *                        dynamic interface allocation). | ||||
|  * | ||||
|  * @return | ||||
| @@ -210,7 +210,7 @@ extern nss_tx_status_t nss_rmnet_rx_destroy_sync(struct nss_rmnet_rx_handle *han | ||||
|  | ||||
| /** | ||||
|  * nss_rmnet_rx_create_sync_nexthop | ||||
|  *	Creates a virtual interface synchronously with specified nexthops. | ||||
|  *	Creates an RMNET interface synchronously with specified nexthops. | ||||
|  * | ||||
|  * @datatypes | ||||
|  * net_device | ||||
| @@ -220,19 +220,33 @@ extern nss_tx_status_t nss_rmnet_rx_destroy_sync(struct nss_rmnet_rx_handle *han | ||||
|  * @param[in] nexthop_h2n  Nexthop interface number of host-to-NSS dynamic interface. | ||||
|  * | ||||
|  * @return | ||||
|  * Pointer to NSS virtual interface handle. | ||||
|  * Pointer to the NSS RMNET interface handle. | ||||
|  */ | ||||
| extern struct nss_rmnet_rx_handle *nss_rmnet_rx_create_sync_nexthop(struct net_device *netdev, uint32_t nexthop_n2h, uint32_t nexthop_h2n); | ||||
|  | ||||
| /** | ||||
|  * nss_rmnet_rx_create | ||||
|  *	Creates an RMNET interface synchronously with generic nexthops. | ||||
|  * | ||||
|  * @datatypes | ||||
|  * net_device | ||||
|  * | ||||
|  * @param[in] netdev       Pointer to the associated network device. | ||||
|  * | ||||
|  * @return | ||||
|  * Pointer to the NSS RMNET interface handle. | ||||
|  */ | ||||
| extern struct nss_rmnet_rx_handle *nss_rmnet_rx_create(struct net_device *netdev); | ||||
|  | ||||
| /** | ||||
|  * nss_rmnet_rx_tx_buf | ||||
|  *	Forwards virtual interface packets to the NSS. | ||||
|  *	Forwards RMNET interface packets to the NSS. | ||||
|  * | ||||
|  * @datatypes | ||||
|  * nss_rmnet_rx_handle \n | ||||
|  * sk_buff | ||||
|  * | ||||
|  * @param[in,out] handle  Pointer to the virtual interface handle (provided during | ||||
|  * @param[in,out] handle  Pointer to the RMNET interface handle (provided during | ||||
|  *                        registration). | ||||
|  * @param[in]    skb     Pointer to the data socket buffer. | ||||
|  * | ||||
| @@ -244,14 +258,14 @@ extern nss_tx_status_t nss_rmnet_rx_tx_buf(struct nss_rmnet_rx_handle *handle, | ||||
|  | ||||
| /** | ||||
|  * nss_rmnet_rx_tx_msg | ||||
|  *	Sends a message to the virtual interface. | ||||
|  *	Sends a message to the RMNET interface. | ||||
|  * | ||||
|  * @datatypes | ||||
|  * nss_ctx_instance \n | ||||
|  * nss_rmnet_rx_msg | ||||
|  * | ||||
|  * @param[in] nss_ctx  Pointer to the NSS context (provided during registration). | ||||
|  * @param[in] nvim     Pointer to the virtual interface message. | ||||
|  * @param[in] nvim     Pointer to the RMNET interface message. | ||||
|  * | ||||
|  * @return | ||||
|  * Command Tx status. | ||||
| @@ -260,12 +274,12 @@ extern nss_tx_status_t nss_rmnet_rx_tx_msg(struct nss_ctx_instance *nss_ctx, str | ||||
|  | ||||
| /** | ||||
|  * nss_rmnet_rx_xmit_callback_unregister | ||||
|  *	Deregisters the transmit callback from the virtual interface. | ||||
|  *	Deregisters the transmit callback from the RMNET interface. | ||||
|  * | ||||
|  * @datatypes | ||||
|  * nss_rmnet_rx_handle | ||||
|  * | ||||
|  * @param[in,out] handle  Pointer to the virtual interface handle. | ||||
|  * @param[in,out] handle  Pointer to the RMNET interface handle. | ||||
|  * | ||||
|  * @return | ||||
|  * None. | ||||
| @@ -274,15 +288,15 @@ extern void nss_rmnet_rx_xmit_callback_unregister(struct nss_rmnet_rx_handle *ha | ||||
|  | ||||
| /** | ||||
|  * nss_rmnet_rx_xmit_callback_register | ||||
|  *	Registers a transmit callback to a virtual interface. | ||||
|  *	Registers a transmit callback to an RMNET interface. | ||||
|  * | ||||
|  * @datatypes | ||||
|  * nss_rmnet_rx_handle \n | ||||
|  * nss_rmnet_rx_xmit_callback_t | ||||
|  * | ||||
|  * @param[in,out] handle        Pointer to the virtual interface handle (provided during | ||||
|  * @param[in,out] handle        Pointer to the RMNET interface handle (provided during | ||||
|  *                              dynamic interface allocation). | ||||
|  * @param[in]    cb             Callback handler for virtual data packets. | ||||
|  * @param[in]    cb             Callback handler for RMNET data packets. | ||||
|  * | ||||
|  * @return | ||||
|  * None. | ||||
| @@ -292,12 +306,12 @@ extern void nss_rmnet_rx_xmit_callback_register(struct nss_rmnet_rx_handle *hand | ||||
|  | ||||
| /** | ||||
|  * nss_rmnet_rx_unregister | ||||
|  *	Deregisters a virtual interface from the NSS driver. | ||||
|  *	Deregisters an RMNET interface from the NSS driver. | ||||
|  * | ||||
|  * @datatypes | ||||
|  * nss_rmnet_rx_handle | ||||
|  * | ||||
|  * @param[in,out] handle  Pointer to the virtual interface handle. | ||||
|  * @param[in,out] handle  Pointer to the RMNET interface handle. | ||||
|  * | ||||
|  * @return | ||||
|  * None. | ||||
| @@ -306,16 +320,16 @@ extern void nss_rmnet_rx_unregister(struct nss_rmnet_rx_handle *handle); | ||||
|  | ||||
| /** | ||||
|  * nss_rmnet_rx_register | ||||
|  *	Registers a virtual Interface with NSS driver. | ||||
|  *	Registers an RMNET Interface with NSS driver. | ||||
|  * | ||||
|  * @datatypes | ||||
|  * nss_rmnet_rx_handle \n | ||||
|  * nss_rmnet_rx_data_callback_t \n | ||||
|  * net_device | ||||
|  * | ||||
|  * @param[in,out] handle        Pointer to the virtual interface handle (provided during | ||||
|  * @param[in,out] handle        Pointer to the RMNET interface handle (provided during | ||||
|  *                              dynamic interface allocation). | ||||
|  * @param[in]    data_callback  Callback handler for virtual data packets. | ||||
|  * @param[in]    data_callback  Callback handler for RMNET data packets. | ||||
|  * @param[in]    netdev         Pointer to the associated network device. | ||||
|  * | ||||
|  * @return | ||||
| @@ -349,22 +363,22 @@ extern int32_t nss_rmnet_rx_get_ifnum(struct net_device *dev); | ||||
|  | ||||
| /** | ||||
|  * nss_rmnet_rx_get_interface_num | ||||
|  *	Returns the virtual interface number associated with the handle. | ||||
|  *	Returns the RMNET interface number associated with the handle. | ||||
|  * | ||||
|  * @datatypes | ||||
|  * nss_rmnet_rx_handle | ||||
|  * | ||||
|  * @param[in] handle  Pointer to the virtual interface handle (provided during | ||||
|  * @param[in] handle  Pointer to the RMNET interface handle (provided during | ||||
| 		      dynamic interface allocation). | ||||
|  * | ||||
|  * @return | ||||
|  * Virtual interface number. | ||||
|  * RMNET interface number. | ||||
|  */ | ||||
| extern int32_t nss_rmnet_rx_get_interface_num(struct nss_rmnet_rx_handle *handle); | ||||
|  | ||||
| /** | ||||
|  * nss_rmnet_rx_get_context | ||||
|  *	Gets the virtual interface context. | ||||
|  *	Gets the RMNET interface context. | ||||
|  * | ||||
|  * @return | ||||
|  * Pointer to the NSS core context. | ||||
|   | ||||
| @@ -1,6 +1,6 @@ | ||||
| /* | ||||
|  ************************************************************************** | ||||
|  * Copyright (c) 2020, The Linux Foundation. All rights reserved. | ||||
|  * Copyright (c) 2020-2021, The Linux Foundation. All rights reserved. | ||||
|  * | ||||
|  * Permission to use, copy, modify, and/or distribute this software for any | ||||
|  * purpose with or without fee is hereby granted, provided that the above | ||||
| @@ -68,6 +68,43 @@ enum nss_tls_error { | ||||
| 	NSS_TLS_ERROR_MAX,                  /**< Maximum TLS error. */ | ||||
| }; | ||||
|  | ||||
| /** | ||||
|  * nss_tls_stats_types | ||||
|  *	TLS statistics types. | ||||
|  */ | ||||
| enum nss_tls_stats_types { | ||||
| 	NSS_TLS_STATS_SINGLE_REC = NSS_STATS_NODE_MAX, | ||||
| 						/**< Number of transmit single record datagrams. */ | ||||
| 	NSS_TLS_STATS_MULTI_REC,		/**< Number of multiple transmit record datagrams. */ | ||||
| 	NSS_TLS_STATS_TX_INVAL_REQS,		/**< Number of transmit invalidations successfully requested. */ | ||||
| 	NSS_TLS_STATS_RX_CCS_REC,		/**< Number of change cipher specification records received. */ | ||||
| 	NSS_TLS_STATS_FAIL_CCS,			/**< Failure to switch to new crypto. */ | ||||
| 	NSS_TLS_STATS_ETH_NODE_DEACTIVE,	/**< Ethernet node deactivated because no crypto was available. */ | ||||
| 	NSS_TLS_STATS_CRYPTO_ALLOC_SUCCESS,	/**< Number of successful crypto allocations. */ | ||||
| 	NSS_TLS_STATS_CRYPTO_FREE_REQ,		/**< Number of crypto-free requests. */ | ||||
| 	NSS_TLS_STATS_CRYPTO_FREE_SUCCESS,	/**< Number of crypto-free successes. */ | ||||
| 	NSS_TLS_STATS_FAIL_CRYPTO_ALLOC,	/**< Number of failed crypto allocations. */ | ||||
| 	NSS_TLS_STATS_FAIL_CRYPTO_LOOKUP,	/**< Failure to find an active crypto session. */ | ||||
| 	NSS_TLS_STATS_FAIL_REQ_ALLOC,		/**< Failure to allocate request memory pool.  */ | ||||
| 	NSS_TLS_STATS_FAIL_PBUF_STATS,		/**< Failure in pbuf allocation for statistics. */ | ||||
| 	NSS_TLS_STATS_FAIL_CTX_ACTIVE,		/**< Failure in enqueue due to inactive context. */ | ||||
| 	NSS_TLS_STATS_HW_LEN_ERROR,		/**< Length error. */ | ||||
| 	NSS_TLS_STATS_HW_TOKEN_ERROR,		/**< Token error; unknown token command or instruction. */ | ||||
| 	NSS_TLS_STATS_HW_BYPASS_ERROR,		/**< Token contains too much bypass data. */ | ||||
| 	NSS_TLS_STATS_HW_CRYPTO_ERROR,		/**< Cryptographic block size error. */ | ||||
| 	NSS_TLS_STATS_HW_HASH_ERROR,		/**< Hash block size error. */ | ||||
| 	NSS_TLS_STATS_HW_CONFIG_ERROR,		/**< Invalid command, algorithm, or mode combination. */ | ||||
| 	NSS_TLS_STATS_HW_ALGO_ERROR,		/**< Unsupported algorithm. */ | ||||
| 	NSS_TLS_STATS_HW_HASH_OVF_ERROR,	/**< Hash input overflow. */ | ||||
| 	NSS_TLS_STATS_HW_AUTH_ERROR,		/**< Hash input overflow. */ | ||||
| 	NSS_TLS_STATS_HW_PAD_VERIFY_ERROR,	/**< Pad verification error. */ | ||||
| 	NSS_TLS_STATS_HW_TIMEOUT_ERROR,		/**< Data timed out. */ | ||||
| 	NSS_TLS_STATS_NO_DESC_IN,		/**< Ingress DMA descriptor not available. */ | ||||
| 	NSS_TLS_STATS_NO_DESC_OUT,		/**< Egress DMA descriptor not available. */ | ||||
| 	NSS_TLS_STATS_NO_REQS,			/**< Not enough requests available for records. */ | ||||
| 	NSS_TLS_STATS_MAX,			/**< Maximum statistics type. */ | ||||
| }; | ||||
|  | ||||
| /** | ||||
|  * nss_tls_hw_stats | ||||
|  *	TLS HW statistics. | ||||
| @@ -156,6 +193,16 @@ struct nss_tls_cipher_update { | ||||
| 	uint8_t reserved;	/**< Reserved for future use. */ | ||||
| }; | ||||
|  | ||||
| /** | ||||
|  * nss_tls_stats_notification | ||||
|  *	TLS transmission statistics structure. | ||||
|  */ | ||||
| struct nss_tls_stats_notification { | ||||
| 	uint64_t stats_ctx[NSS_TLS_STATS_MAX];		/**< Context transmission statistics. */ | ||||
| 	uint32_t core_id;				/**< Core ID. */ | ||||
| 	uint32_t if_num;				/**< Interface number. */ | ||||
| }; | ||||
|  | ||||
| /** | ||||
|  * nss_tls_msg | ||||
|  *	Data for sending and receiving TLS messages. | ||||
| @@ -245,7 +292,7 @@ extern nss_tx_status_t nss_tls_tx_msg(struct nss_ctx_instance *nss_ctx, struct n | ||||
|  * @param[in]  if_num   NSS interface number. | ||||
|  * @param[in]  type     Type of message. | ||||
|  * @param[in]  len      Size of the payload. | ||||
|  * @param[in]  nicm     Pointer to the NSS IPsec message. | ||||
|  * @param[in]  ntcm     Pointer to the NSS IPsec message. | ||||
|  * | ||||
|  * @return | ||||
|  * Status of the Tx operation. | ||||
| @@ -254,6 +301,20 @@ extern nss_tx_status_t nss_tls_tx_msg_sync(struct nss_ctx_instance *nss_ctx, uin | ||||
| 						enum nss_tls_msg_type type, uint16_t len, | ||||
| 						struct nss_tls_msg *ntcm); | ||||
|  | ||||
| /** | ||||
|  * nss_tls_unregister_if | ||||
|  *	Deregisters a TLS session interface from the NSS. | ||||
|  * | ||||
|  * @param[in] if_num  NSS interface number. | ||||
|  * | ||||
|  * @return | ||||
|  * None. | ||||
|  * | ||||
|  * @dependencies | ||||
|  * The TLS session interface must have been previously registered. | ||||
|  */ | ||||
| extern void nss_tls_unregister_if(uint32_t if_num); | ||||
|  | ||||
| /** | ||||
|  * nss_tls_register_if | ||||
|  *	Registers a TLS session interface with the NSS for sending and receiving | ||||
| @@ -284,22 +345,19 @@ extern struct nss_ctx_instance *nss_tls_register_if(uint32_t if_num, | ||||
| 							 void *app_ctx); | ||||
|  | ||||
| /** | ||||
|  * nss_tls_unregister_if | ||||
|  *	Deregisters a TLS session interface from the NSS. | ||||
|  * nss_tls_notify_unregister | ||||
|  *	Deregisters an event callback. | ||||
|  * | ||||
|  * @param[in] if_num  NSS interface number. | ||||
|  * @param[in] ifnum  NSS interface number. | ||||
|  * | ||||
|  * @return | ||||
|  * None. | ||||
|  * | ||||
|  * @dependencies | ||||
|  * The TLS session interface must have been previously registered. | ||||
|  */ | ||||
| extern void nss_tls_unregister_if(uint32_t if_num); | ||||
| extern void nss_tls_notify_unregister(uint32_t ifnum); | ||||
|  | ||||
| /** | ||||
|  * nss_tls_notify_register | ||||
|  *	Register an event callback to handle notification from TLS firmware package. | ||||
|  *	Registers an event callback to handle notification from TLS firmware package. | ||||
|  * | ||||
|  * @datatypes | ||||
|  * nss_tls_msg_callback_t | ||||
| @@ -313,17 +371,6 @@ extern void nss_tls_unregister_if(uint32_t if_num); | ||||
|  */ | ||||
| extern struct nss_ctx_instance *nss_tls_notify_register(uint32_t ifnum, nss_tls_msg_callback_t ev_cb, void *app_data); | ||||
|  | ||||
| /** | ||||
|  * nss_tls_notify_unregister | ||||
|  *	Unregister an event callback. | ||||
|  * | ||||
|  * @param[in] ifnum  NSS interface number. | ||||
|  * | ||||
|  * @return | ||||
|  * None. | ||||
|  */ | ||||
| extern void nss_tls_notify_unregister(uint32_t ifnum); | ||||
|  | ||||
| /** | ||||
|  * nss_tls_msg_init | ||||
|  *	Initializes a TLS message sent asynchronously. | ||||
| @@ -377,6 +424,44 @@ extern struct nss_ctx_instance *nss_tls_get_context(void); | ||||
|  * Pointer to the device. | ||||
|  */ | ||||
| extern struct device *nss_tls_get_dev(struct nss_ctx_instance *nss_ctx); | ||||
|  | ||||
| /** | ||||
|  * nss_tls_ifmap_get | ||||
|  *	Returns active TLS interfaces. | ||||
|  * | ||||
|  * @return | ||||
|  * Pointer to the interface map. | ||||
|  */ | ||||
| unsigned long *nss_tls_ifmap_get(void); | ||||
|  | ||||
| /** | ||||
|  * nss_tls_stats_unregister_notifier | ||||
|  *	Deregisters a statistics notifier. | ||||
|  * | ||||
|  * @datatypes | ||||
|  *	notifier_block | ||||
|  * | ||||
|  * @param[in] nb Notifier block. | ||||
|  * | ||||
|  * @return | ||||
|  * 0 on success or non-zero on failure. | ||||
|  */ | ||||
| extern int nss_tls_stats_unregister_notifier(struct notifier_block *nb); | ||||
|  | ||||
| /** | ||||
|  * nss_tls_stats_register_notifier | ||||
|  *	Registers a statistics notifier. | ||||
|  * | ||||
|  * @datatypes | ||||
|  *	notifier_block | ||||
|  * | ||||
|  * @param[in] nb Notifier block. | ||||
|  * | ||||
|  * @return | ||||
|  * 0 on success or non-zero on failure. | ||||
|  */ | ||||
| extern int nss_tls_stats_register_notifier(struct notifier_block *nb); | ||||
|  | ||||
| /** | ||||
|  * @} | ||||
|  */ | ||||
|   | ||||
							
								
								
									
										284
									
								
								feeds/ipq807x/qca-nss-drv/src/exports/nss_udp_st.h
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										284
									
								
								feeds/ipq807x/qca-nss-drv/src/exports/nss_udp_st.h
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,284 @@ | ||||
| /* | ||||
|  ************************************************************************** | ||||
|  * Copyright (c) 2021, The Linux Foundation. All rights reserved. | ||||
|  * | ||||
|  * Permission to use, copy, modify, and/or distribute this software for | ||||
|  * any purpose with or without fee is hereby granted, provided that the | ||||
|  * above copyright notice and this permission notice appear in all copies. | ||||
|  * | ||||
|  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES | ||||
|  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF | ||||
|  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR | ||||
|  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES | ||||
|  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN | ||||
|  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT | ||||
|  * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | ||||
|  ************************************************************************** | ||||
|  */ | ||||
|  | ||||
| /** | ||||
|  * @file nss_udp_st.h | ||||
|  *	NSS Ethernet interface definitions. | ||||
|  */ | ||||
|  | ||||
| #ifndef __NSS_UDP_ST_H | ||||
| #define __NSS_UDP_ST_H | ||||
|  | ||||
| /** | ||||
|  * @addtogroup nss_udp_st_subsystem | ||||
|  * @{ | ||||
|  */ | ||||
|  | ||||
| #define NSS_UDP_ST_TX_CONN_MAX 16 | ||||
| #define NSS_UDP_ST_FLAG_IPV4 4		/**< L3 Protocol - IPv4. */ | ||||
| #define NSS_UDP_ST_FLAG_IPV6 6		/**< L3 Protocol - IPv6. */ | ||||
|  | ||||
| /** | ||||
|  * nss_udp_st_message_types | ||||
|  *	UDP speed test message types. | ||||
|  */ | ||||
| enum nss_udp_st_message_types { | ||||
| 	NSS_UDP_ST_START_MSG,			/**< Start message. */ | ||||
| 	NSS_UDP_ST_STOP_MSG,			/**< Stop message. */ | ||||
| 	NSS_UDP_ST_CFG_RULE_MSG,		/**< Configure IPv4/IPv6 rule. */ | ||||
| 	NSS_UDP_ST_UNCFG_RULE_MSG,		/**< Unconfigure IPv4/IPv6 rule. */ | ||||
| 	NSS_UDP_ST_STATS_SYNC_MSG,		/**< Statistic syncronization. */ | ||||
| 	NSS_UDP_ST_TX_CREATE_MSG,		/**< Create transmit node. */ | ||||
| 	NSS_UDP_ST_TX_DESTROY_MSG,		/**< Destroy transmit node. */ | ||||
| 	NSS_UDP_ST_RESET_STATS_MSG,		/**< Reset existing statistics. */ | ||||
| 	NSS_UDP_ST_MAX_MSG_TYPES,		/**< Maximum message type. */ | ||||
| }; | ||||
|  | ||||
| /** | ||||
|  * nss_udp_st_test_types | ||||
|  *	Test types of the UDP speed test. | ||||
|  */ | ||||
| enum nss_udp_st_test_types { | ||||
| 	NSS_UDP_ST_TEST_RX,			/**< Test type is receive. */ | ||||
| 	NSS_UDP_ST_TEST_TX,			/**< Test type is transmit. */ | ||||
| 	NSS_UDP_ST_TEST_MAX			/**< Maximum test type. */ | ||||
| }; | ||||
|  | ||||
| /** | ||||
|  * nss_udp_st_error | ||||
|  *	UDP speed test error types. | ||||
|  */ | ||||
| enum nss_udp_st_error { | ||||
| 	NSS_UDP_ST_ERROR_NONE,			/**< No error. */ | ||||
| 	NSS_UDP_ST_ERROR_INCORRECT_RATE,	/**< Incorrect Tx rate. */ | ||||
| 	NSS_UDP_ST_ERROR_INCORRECT_BUFFER_SIZE,	/**< Incorrect buffer size. */ | ||||
| 	NSS_UDP_ST_ERROR_MEMORY_FAILURE,	/**< Memory allocation failed. */ | ||||
| 	NSS_UDP_ST_ERROR_INCORRECT_STATE,	/**< Trying to configure during incorrect state. */ | ||||
| 	NSS_UDP_ST_ERROR_INCORRECT_FLAGS,	/**< Incorrect flag configuration. */ | ||||
| 	NSS_UDP_ST_ERROR_ENTRY_EXIST,		/**< Given tunnel entry already exists. */ | ||||
| 	NSS_UDP_ST_ERROR_ENTRY_ADD_FAILED,	/**< UDP ST Encap entry addition failed. */ | ||||
| 	NSS_UDP_ST_ERROR_ENTRY_NOT_EXIST,	/**< Given tunnel entry does not exists. */ | ||||
| 	NSS_UDP_ST_ERROR_WRONG_START_MSG_TYPE,	/**< Start message type error. */ | ||||
| 	NSS_UDP_ST_ERROR_WRONG_STOP_MSG_TYPE,	/**< Stop message type error. */ | ||||
| 	NSS_UDP_ST_ERROR_TOO_MANY_USERS,	/**< Too many users tried to be added. */ | ||||
| 	NSS_UDP_ST_ERROR_UNKNOWN_MSG_TYPE,	/**< Unknown message type failure. */ | ||||
| 	NSS_UDP_ST_ERROR_PB_ALLOC,		/**< Pbuf allocation failed. */ | ||||
| 	NSS_UDP_ST_ERROR_PB_SIZE,		/**< Pbuf size is too small to fit buffer. */ | ||||
| 	NSS_UDP_ST_ERROR_DROP_QUEUE,		/**< Packet dropped enqueue next node. */ | ||||
| 	UDP_ST_ERROR_TIMER_MISSED,		/**< Timer call is missed. */ | ||||
| 	NSS_UDP_ST_ERROR_MAX,			/**< Maximum error type. */ | ||||
| }; | ||||
|  | ||||
| /** | ||||
|  * nss_udp_st_stats_time | ||||
|  *	UDP speed test time statistics types. | ||||
|  */ | ||||
| enum nss_udp_st_stats_time { | ||||
| 	NSS_UDP_ST_STATS_TIME_START,		/**< Start time of the test. */ | ||||
| 	NSS_UDP_ST_STATS_TIME_CURRENT,		/**< Current time of the running test. */ | ||||
| 	NSS_UDP_ST_STATS_TIME_ELAPSED,		/**< Elapsed time of the current test. */ | ||||
| 	NSS_UDP_ST_STATS_TIME_MAX		/**< Maximum time statistics. */ | ||||
| }; | ||||
|  | ||||
| /** | ||||
|  * Create TX node to start pushing rules. | ||||
|  */ | ||||
| struct nss_udp_st_tx_create { | ||||
| 	uint32_t rate;			/**< Rate in Mbps. */ | ||||
| 	uint32_t buffer_size;		/**< UDP buffer size. */ | ||||
| 	uint8_t dscp;			/**< DSCP value. */ | ||||
| }; | ||||
|  | ||||
| /** | ||||
|  * Destroy Tx node. | ||||
|  */ | ||||
| struct nss_udp_st_tx_destroy { | ||||
| 	uint32_t flag;			/**< Tx destroy flag. */ | ||||
| }; | ||||
|  | ||||
| /** | ||||
|  * NSS UDP speed test start structure. | ||||
|  */ | ||||
| struct nss_udp_st_start { | ||||
| 	uint32_t type;	/**< Started test type (for example, receive or transmit). */ | ||||
|  | ||||
| }; | ||||
|  | ||||
| /** | ||||
|  * NSS UDP speed test stop structure. | ||||
|  */ | ||||
| struct nss_udp_st_stop { | ||||
| 	uint32_t type;	/**< Stopped test type (for example, receive or transmit). */ | ||||
| }; | ||||
|  | ||||
| /** | ||||
|  * NSS UDP speed test ip structure | ||||
|  */ | ||||
| struct nss_udp_st_ip { | ||||
| 	union { | ||||
| 		uint32_t ipv4;          /**< IPv4 address. */ | ||||
| 		uint32_t ipv6[4];       /**< IPv6 address. */ | ||||
| 	} ip; | ||||
| }; | ||||
|  | ||||
| /** | ||||
|  * NSS UDP speed test IPv4/IPv6 configuration structure. | ||||
|  */ | ||||
| struct nss_udp_st_cfg { | ||||
| 	struct nss_udp_st_ip src_ip;	/**< Source IP address. */ | ||||
| 	int32_t src_port;		/**< Source L4 port. */ | ||||
| 	struct nss_udp_st_ip dest_ip;	/**< Destination IP address. */ | ||||
| 	int32_t dest_port;		/**< Destination L4 port. */ | ||||
| 	uint32_t type;			/**< Started test type (for example, receive or transmit). */ | ||||
| 	uint16_t ip_version;		/**< IP version to indicate IPv4 or IPv6. */ | ||||
| }; | ||||
|  | ||||
| /** | ||||
|  * NSS UDP speed test node statistics structure. | ||||
|  */ | ||||
| struct nss_udp_st_node_stats { | ||||
| 	struct nss_cmn_node_stats node_stats;	/**< Common node statistics for the UDP speed test. */ | ||||
| 	uint32_t errors[NSS_UDP_ST_ERROR_MAX];	/**< Error statistics. */ | ||||
| }; | ||||
|  | ||||
| /** | ||||
|  * NSS UDP speed test statistics structure. | ||||
|  */ | ||||
| struct nss_udp_st_stats { | ||||
| 	struct nss_udp_st_node_stats nstats;	/**< Node statistics for the UDP speed test. */ | ||||
| 	uint32_t time_stats[NSS_UDP_ST_TEST_MAX][NSS_UDP_ST_STATS_TIME_MAX]; | ||||
| 						/**< Time statistics. */ | ||||
| }; | ||||
|  | ||||
| /** | ||||
|  * NSS UDP speed test reset statistics structure. | ||||
|  */ | ||||
| struct nss_udp_st_reset_stats { | ||||
| 	uint32_t flag;  /**< Reset statistics flag. */ | ||||
| }; | ||||
|  | ||||
| /** | ||||
|  * Message structure of the UDP speed test commands. | ||||
|  */ | ||||
| struct nss_udp_st_msg { | ||||
| 	struct nss_cmn_msg cm;          /**< Message header. */ | ||||
| 	union { | ||||
| 		struct nss_udp_st_tx_create create;	/**< Prepare transmit message. */ | ||||
| 		struct nss_udp_st_tx_destroy destroy;	/**< Destroy transmit message. */ | ||||
| 		struct nss_udp_st_start start;		/**< Start message. */ | ||||
| 		struct nss_udp_st_stop stop;		/**< Stop message. */ | ||||
| 		struct nss_udp_st_cfg cfg;		/**< IPv4/IPv6 configuration message. */ | ||||
| 		struct nss_udp_st_cfg uncfg;		/**< IPv4/IPv6 unconfiguration message. */ | ||||
| 		struct nss_udp_st_stats stats;		/**< Statistics synchronization message. */ | ||||
| 		struct nss_udp_st_reset_stats reset_stats; | ||||
| 							/**< Reset statistics message. */ | ||||
| 	} msg; | ||||
| }; | ||||
|  | ||||
| /** | ||||
|  * Callback function for receiving UDP speed test messages. | ||||
|  * | ||||
|  * @datatypes | ||||
|  * nss_udp_st_msg | ||||
|  * | ||||
|  * @param[in] app_data  Pointer to the application context of the message. | ||||
|  * @param[in] msg       Pointer to the message data. | ||||
|  */ | ||||
| typedef void (*nss_udp_st_msg_callback_t)(void *app_data, struct nss_udp_st_msg *msg); | ||||
|  | ||||
| /** | ||||
|  * nss_udp_st_register_handler | ||||
|  *	Registers the UDP speed test message handler. | ||||
|  * | ||||
|  * @datatypes | ||||
|  * nss_ctx_instance | ||||
|  * | ||||
|  * @param[in] nss_ctx  Pointer to the NSS context. | ||||
|  * | ||||
|  * @return | ||||
|  * None. | ||||
|  */ | ||||
| extern void nss_udp_st_register_handler(struct nss_ctx_instance *nss_ctx); | ||||
|  | ||||
| /** | ||||
|  * nss_udp_st_tx | ||||
|  *	Transmits a UDP speed test message to the NSS. | ||||
|  * | ||||
|  * @datatypes | ||||
|  * nss_ctx_instance \n | ||||
|  * nss_udp_st_msg | ||||
|  * | ||||
|  * @param[in] nss_ctx  Pointer to the NSS context. | ||||
|  * @param[in] num      Pointer to the message data. | ||||
|  * | ||||
|  * @return | ||||
|  * Status of the transmit operation. | ||||
|  */ | ||||
| extern nss_tx_status_t nss_udp_st_tx(struct nss_ctx_instance *nss_ctx, struct nss_udp_st_msg *num); | ||||
|  | ||||
| /** | ||||
|  * nss_udp_st_tx_sync | ||||
|  *	Transmits a synchronous UDP speed test message to the NSS. | ||||
|  * | ||||
|  * @datatypes | ||||
|  * nss_ctx_instance \n | ||||
|  * nss_udp_st_msg | ||||
|  * | ||||
|  * @param[in] nss_ctx  Pointer to the NSS context. | ||||
|  * @param[in] num      Pointer to the message data. | ||||
|  * | ||||
|  * @return | ||||
|  * Status of the transmit operation. | ||||
|  */ | ||||
| extern nss_tx_status_t nss_udp_st_tx_sync(struct nss_ctx_instance *nss_ctx, struct nss_udp_st_msg *num); | ||||
|  | ||||
| /** | ||||
|  * nss_udp_st_msg_init | ||||
|  *	Initializes UDP speed test messages. | ||||
|  * | ||||
|  * @datatypes | ||||
|  * nss_udp_st_msg \n | ||||
|  * nss_udp_st_msg_callback_t | ||||
|  * | ||||
|  * @param[in,out] num       Pointer to the NSS interface message. | ||||
|  * @param[in]     if_num    NSS interface number. | ||||
|  * @param[in]     type      Type of message. | ||||
|  * @param[in]     len       Size of the payload. | ||||
|  * @param[in]     cb        Callback function for the message. | ||||
|  * @param[in]     app_data  Pointer to the application context of the message. | ||||
|  * | ||||
|  * @return | ||||
|  * None. | ||||
|  */ | ||||
| extern void nss_udp_st_msg_init(struct nss_udp_st_msg *num, uint16_t if_num, uint32_t type, uint32_t len, | ||||
| 			nss_udp_st_msg_callback_t cb, void *app_data); | ||||
|  | ||||
| /** | ||||
|  * nss_udp_st_get_mgr | ||||
|  *	Gets the NSS context that is managing UDP speed sest processes. | ||||
|  * | ||||
|  * @return | ||||
|  * Pointer to the NSS core context. | ||||
|  */ | ||||
| extern struct nss_ctx_instance *nss_udp_st_get_mgr(void); | ||||
|  | ||||
| /** | ||||
|  *@} | ||||
|  */ | ||||
|  | ||||
| #endif /* __NSS_UDP_ST_H */ | ||||
| @@ -1,6 +1,6 @@ | ||||
| /* | ||||
|  ************************************************************************** | ||||
|  * Copyright (c) 2019, The Linux Foundation. All rights reserved. | ||||
|  * Copyright (c) 2019, 2021 The Linux Foundation. All rights reserved. | ||||
|  * Permission to use, copy, modify, and/or distribute this software for | ||||
|  * any purpose with or without fee is hereby granted, provided that the | ||||
|  * above copyright notice and this permission notice appear in all copies. | ||||
| @@ -111,6 +111,7 @@ struct nss_vxlan_stats_msg { | ||||
| 	uint32_t except_vni_lookup_failed;	/**< Virtual network ID look up failed. */ | ||||
| 	uint32_t dropped_malformed;		/**< Packet is malformed. */ | ||||
| 	uint32_t dropped_next_node_queue_full;	/**< Next node dropped the packet. */ | ||||
| 	uint32_t except_inner_hash;		/**< Inner hash calculation failed. */ | ||||
| }; | ||||
|  | ||||
| /** | ||||
|   | ||||
| @@ -1,6 +1,6 @@ | ||||
| /* | ||||
|  ************************************************************************** | ||||
|  * Copyright (c) 2015-2018, The Linux Foundation. All rights reserved. | ||||
|  * Copyright (c) 2015-2018, 2021, The Linux Foundation. All rights reserved. | ||||
|  * Permission to use, copy, modify, and/or distribute this software for | ||||
|  * any purpose with or without fee is hereby granted, provided that the | ||||
|  * above copyright notice and this permission notice appear in all copies. | ||||
| @@ -722,6 +722,10 @@ struct nss_wifi_peer_ol_stats { | ||||
| 	uint32_t ppdu_retries;	/**< Number of PPDU retries. */ | ||||
| 	uint32_t rssi_chains[NSS_WIFI_MAX_RSSI_CHAINS]; | ||||
| 				/**< Acknowledgment RSSI per chain. */ | ||||
| 	uint32_t rx_msdus;	/**< Number of MSDUs received. */ | ||||
| 	uint32_t rx_bytes;	/**< Number of bytes received. */ | ||||
| 	uint32_t rx_mpdus;	/**< Number of MPDUs received. */ | ||||
| 	uint32_t rx_retries;	/**< Number of MPDU retries. */ | ||||
| }; | ||||
|  | ||||
| /** | ||||
|   | ||||
| @@ -35,6 +35,7 @@ enum nss_wifi_ext_vdev_msg_types { | ||||
| 	NSS_WIFI_EXT_VDEV_MSG_CONFIGURE_WDS, | ||||
| 	NSS_WIFI_EXT_VDEV_SET_NEXT_HOP, | ||||
| 	NSS_WIFI_EXT_VDEV_MSG_STATS_SYNC, | ||||
| 	NSS_WIFI_EXT_VDEV_MSG_CONFIGURE_VLAN, | ||||
| 	NSS_WIFI_EXT_VDEV_MSG_MAX | ||||
| }; | ||||
|  | ||||
| @@ -50,12 +51,16 @@ enum nss_wifi_ext_vdev_error_types { | ||||
| 	NSS_WIFI_EXT_VDEV_ERROR_INV_PVAP_ID,	/**< Invalid parent virtual device interface number. */ | ||||
| 	NSS_WIFI_EXT_VDEV_ERROR_RADIO_NOT_PRESENT,	/**< Radio node is not present. */ | ||||
| 	NSS_WIFI_EXT_VDEV_ERROR_INV_IF,		/**< Message sent on invalid interface number. */ | ||||
| 	NSS_WIFI_EXT_VDEV_ERROR_MAX,		/**< Maxiumum error types. */ | ||||
| 	NSS_WIFI_EXT_VDEV_ERROR_INV_VLAN_ID,	/**< Invalid VLAN ID. */ | ||||
| 	NSS_WIFI_EXT_VDEV_ERROR_INV_CMD,	/**< Invalid command. */ | ||||
| 	NSS_WIFI_EXT_VDEV_ERROR_PEERID_ALREADY_CONFIGURED, | ||||
| 						/**< Peer ID is already configured. */ | ||||
| 	NSS_WIFI_EXT_VDEV_ERROR_MAX		/**< Maxiumum error types. */ | ||||
| }; | ||||
|  | ||||
| /** | ||||
|  * nss_wifi_ext_vdev_wds_msg | ||||
|  *	Extended WDS config message. | ||||
|  *	Extended WDS configuration message. | ||||
|  */ | ||||
| struct nss_wifi_ext_vdev_wds_msg { | ||||
| 	uint16_t wds_peer_id;	/**< WDS station peer ID. */ | ||||
| @@ -90,6 +95,14 @@ struct nss_wifi_ext_vdev_set_next_hop_msg { | ||||
| 	uint32_t if_num;		/**< Interface number. */ | ||||
| }; | ||||
|  | ||||
| /** | ||||
|  * nss_wifi_ext_vdev_vlan_msg | ||||
|  *	Extended VLAN configuration message. | ||||
|  */ | ||||
| struct nss_wifi_ext_vdev_vlan_msg { | ||||
| 	uint16_t vlan_id;	/**< VLAN ID. */ | ||||
| }; | ||||
|  | ||||
| /** | ||||
|  * nss_wifi_ext_vdev_msg | ||||
|  *	Message structure to Send/Receive commands. | ||||
| @@ -102,6 +115,7 @@ struct nss_wifi_ext_vdev_msg { | ||||
| 		struct nss_wifi_ext_vdev_wds_msg wmsg;	/**< WDS configure message. */ | ||||
| 		struct nss_wifi_ext_vdev_set_next_hop_msg wnhm;	/**< Next hop set message. */ | ||||
| 		struct nss_wifi_ext_vdev_stats stats;	/**< Statistics messasge. */ | ||||
| 		struct nss_wifi_ext_vdev_vlan_msg vmsg;	/**< VLAN message. */ | ||||
| 	} msg; | ||||
| }; | ||||
|  | ||||
| @@ -126,7 +140,7 @@ typedef void (*nss_wifi_ext_vdev_data_callback_t)(struct net_device *netdev, str | ||||
|  * nss_wifi_ext_vdev_msg | ||||
|  * | ||||
|  * @param[in] app_data  Pointer to the application context of the message. | ||||
|  * @param[in]wevm       Pointer to the message data. | ||||
|  * @param[in] wevm      Pointer to the message data. | ||||
|  */ | ||||
| typedef void (*nss_wifi_ext_vdev_msg_callback_t)(void *app_data, struct nss_cmn_msg *ncm); | ||||
|  | ||||
| @@ -240,8 +254,8 @@ extern nss_tx_status_t nss_wifi_ext_vdev_tx_msg_sync(struct nss_ctx_instance *ns | ||||
|  * @datatypes | ||||
|  * nss_ctx_instance \n | ||||
|  * | ||||
|  * @param[in] nss_ctx  NSS core context. | ||||
|  * @param[in] ifnum  NSS interface number. | ||||
|  * @param[in] ctx      NSS core context. | ||||
|  * @param[in] if_num   NSS interface number. | ||||
|  * @param[in] next_hop Next hop interface number. | ||||
|  */ | ||||
| extern nss_tx_status_t nss_wifi_ext_vdev_set_next_hop(struct nss_ctx_instance *ctx, int if_num, int next_hop); | ||||
| @@ -267,8 +281,8 @@ extern struct nss_ctx_instance *nss_wifi_ext_vdev_get_ctx(void); | ||||
|  * | ||||
|  * @param[in] if_num         NSS interface number. | ||||
|  * @param[in] cb_func_data   Callback for the data. | ||||
|  * @param[in] cb_func_msg    Callback for the message. | ||||
|  * @param[in] cb_func_event  Callback for the event message. | ||||
|  * @param[in] cb_func_ext    Callback for the message. | ||||
|  * @param[in] cb_func_msg    Callback for the event message. | ||||
|  * @param[in] features       Data socket buffer types supported by this interface. | ||||
|  * @param[in] netdev         Pointer to the associated network device. | ||||
|  * @param[in] app_ctx        Pointer to the application context. | ||||
|   | ||||
| @@ -1,292 +0,0 @@ | ||||
| /* | ||||
|  ************************************************************************** | ||||
|  * Copyright (c) 2015-2017, The Linux Foundation. All rights reserved. | ||||
|  * Permission to use, copy, modify, and/or distribute this software for | ||||
|  * any purpose with or without fee is hereby granted, provided that the | ||||
|  * above copyright notice and this permission notice appear in all copies. | ||||
|  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES | ||||
|  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF | ||||
|  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR | ||||
|  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES | ||||
|  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN | ||||
|  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT | ||||
|  * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | ||||
|  ************************************************************************** | ||||
|  */ | ||||
|  | ||||
| /** | ||||
|  * @file nss_wifi_if.h | ||||
|  *	NSS Wi-Fi interface message Structure and APIs. | ||||
|  */ | ||||
|  | ||||
| #ifndef __NSS_WIFI_IF_H | ||||
| #define __NSS_WIFI_IF_H | ||||
|  | ||||
| /** | ||||
|  * @addtogroup nss_wifi_subsystem | ||||
|  * @{ | ||||
|  */ | ||||
|  | ||||
| /** | ||||
|  * nss_wifi_if_msg_types | ||||
|  *	Message types for Wi-Fi interface requests and responses. | ||||
|  */ | ||||
| enum nss_wifi_if_msg_types { | ||||
| 	NSS_WIFI_IF_OPEN = NSS_IF_OPEN, | ||||
| 	NSS_WIFI_IF_CLOSE = NSS_IF_CLOSE, | ||||
| 	NSS_WIFI_IF_LINK_STATE_NOTIFY = NSS_IF_LINK_STATE_NOTIFY, | ||||
| 	NSS_WIFI_IF_MTU_CHANGE = NSS_IF_MTU_CHANGE, | ||||
| 	NSS_WIFI_IF_MAC_ADDR_SET = NSS_IF_MAC_ADDR_SET, | ||||
| 	NSS_WIFI_IF_STATS_SYNC = NSS_IF_STATS, | ||||
| 	NSS_WIFI_IF_ISHAPER_ASSIGN = NSS_IF_ISHAPER_ASSIGN, | ||||
| 	NSS_WIFI_IF_BSHAPER_ASSIGN = NSS_IF_BSHAPER_ASSIGN, | ||||
| 	NSS_WIFI_IF_ISHAPER_UNASSIGN = NSS_IF_ISHAPER_UNASSIGN, | ||||
| 	NSS_WIFI_IF_BSHAPER_UNASSIGN = NSS_IF_BSHAPER_UNASSIGN, | ||||
| 	NSS_WIFI_IF_ISHAPER_CONFIG = NSS_IF_ISHAPER_CONFIG, | ||||
| 	NSS_WIFI_IF_BSHAPER_CONFIG = NSS_IF_BSHAPER_CONFIG, | ||||
| 	NSS_WIFI_IF_VSI_ASSIGN = NSS_IF_VSI_ASSIGN, | ||||
| 	NSS_WIFI_IF_VSI_UNASSIGN = NSS_IF_VSI_UNASSIGN, | ||||
| 	NSS_WIFI_IF_TX_CREATE_MSG = NSS_IF_MAX_MSG_TYPES + 1, | ||||
| 	NSS_WIFI_IF_TX_DESTROY_MSG, | ||||
| 	NSS_WIFI_IF_STATS_SYNC_MSG, | ||||
| 	NSS_WIFI_IF_MAX_MSG_TYPES | ||||
| }; | ||||
|  | ||||
| /** | ||||
|  * nss_wifi_if_error_types | ||||
|  *	Error types for the Wi-Fi interface. | ||||
|  */ | ||||
| enum nss_wifi_if_error_types { | ||||
| 	NSS_WIFI_IF_SUCCESS, | ||||
| 	NSS_WIFI_IF_CORE_FAILURE, | ||||
| 	NSS_WIFI_IF_ALLOC_FAILURE, | ||||
| 	NSS_WIFI_IF_DYNAMIC_IF_FAILURE, | ||||
| 	NSS_WIFI_IF_MSG_TX_FAILURE, | ||||
| 	NSS_WIFI_IF_REG_FAILURE, | ||||
| 	NSS_WIFI_IF_CORE_NOT_INITIALIZED | ||||
| }; | ||||
|  | ||||
| /** | ||||
|  * nss_wifi_if_create_msg | ||||
|  *	Payload for configuring the Wi-Fi interface. | ||||
|  */ | ||||
| struct nss_wifi_if_create_msg { | ||||
| 	uint32_t flags;				/**< Interface flags. */ | ||||
| 	uint8_t mac_addr[ETH_ALEN];		/**< MAC address. */ | ||||
| }; | ||||
|  | ||||
| /** | ||||
|  * nss_wifi_if_destroy_msg | ||||
|  *	Payload for destroying the Wi-Fi interface. | ||||
|  */ | ||||
| struct nss_wifi_if_destroy_msg { | ||||
| 	int32_t reserved;			/**< Placeholder. */ | ||||
| }; | ||||
|  | ||||
| /** | ||||
|  * nss_wifi_if_stats | ||||
|  *	Wi-Fi interface statistics received from the NSS. | ||||
|  */ | ||||
| struct nss_wifi_if_stats { | ||||
| 	struct nss_cmn_node_stats node_stats; | ||||
| 				/**< Common statistics. */ | ||||
| 	uint32_t tx_enqueue_failed; | ||||
| 				/**< Number of packets dropped when queuing to the next node in a network graph. */ | ||||
| 	uint32_t shaper_enqueue_failed; | ||||
| 				/**< Number of packets dropped when queuing to the shaper node. */ | ||||
| }; | ||||
|  | ||||
| /** | ||||
|  * nss_wifi_if_msg | ||||
|  *	Data for sending and receiving Wi-Fi interface messages. | ||||
|  */ | ||||
| struct nss_wifi_if_msg { | ||||
| 	struct nss_cmn_msg cm;			/**< Common message header. */ | ||||
|  | ||||
| 	/** | ||||
| 	 * Payload of a Wi-Fi interface message. | ||||
| 	 */ | ||||
| 	union { | ||||
| 		union nss_if_msgs if_msgs; | ||||
| 				/**< NSS interface messages. */ | ||||
| 		struct nss_wifi_if_create_msg create; | ||||
| 				/**< Creates a Wi-Fi interface rule. */ | ||||
| 		struct nss_wifi_if_destroy_msg destroy; | ||||
| 				/**< Destroys a Wi-Fi interface rule. */ | ||||
| 		struct nss_wifi_if_stats stats; | ||||
| 				/**< Interface statistics. */ | ||||
| 	} msg;			/**< Message payload. */ | ||||
| }; | ||||
|  | ||||
| /** | ||||
|  * nss_wifi_if_pvt | ||||
|  *	Private data information for the Wi-Fi interface. | ||||
|  */ | ||||
| struct nss_wifi_if_pvt { | ||||
| 	struct semaphore sem; | ||||
| 			/**< Semaphore for a specified Wi-Fi interface number. */ | ||||
| 	struct completion complete; | ||||
| 			/**< Waits for the NSS to process a message on the specified Wi-Fi interface. */ | ||||
| 	int response;	/**< Response received on a Wi-Fi interface number. */ | ||||
| 	int sem_init_done; | ||||
| 			/**< Indicates whether the semaphore is initialized. */ | ||||
| }; | ||||
|  | ||||
| /** | ||||
|  * Callback function for receiving Wi-Fi data. | ||||
|  * | ||||
|  * @datatypes | ||||
|  * net_device \n | ||||
|  * sk_buff \n | ||||
|  * napi_struct | ||||
|  * | ||||
|  * @param[in] netdev  Pointer to the associated network device. | ||||
|  * @param[in] skb     Pointer to the data socket buffer. | ||||
|  * @param[in] napi    Pointer to the NAPI structure. | ||||
|  */ | ||||
| typedef void (*nss_wifi_if_data_callback_t)(struct net_device *netdev, | ||||
| 		struct sk_buff *skb, struct napi_struct *napi); | ||||
|  | ||||
| /** | ||||
|  * Callback function for receiving Wi-Fi messages. | ||||
|  * | ||||
|  * @datatypes | ||||
|  * nss_cmn_msg | ||||
|  * | ||||
|  * @param[in] app_data  Pointer to the application context of the message. | ||||
|  * @param[in] msg       Pointer to the message data. | ||||
|  */ | ||||
| typedef void (*nss_wifi_if_msg_callback_t)(void *app_data, | ||||
| 		struct nss_cmn_msg *msg); | ||||
|  | ||||
| /** | ||||
|  * nss_wifi_if_handle | ||||
|  *	Context for WLAN-to-NSS communication. | ||||
|  */ | ||||
| struct nss_wifi_if_handle { | ||||
| 	struct nss_ctx_instance *nss_ctx;	/**< NSS context. */ | ||||
| 	int32_t if_num;				/**< Interface number. */ | ||||
| 	struct nss_wifi_if_pvt *pvt;		/**< Private data structure. */ | ||||
| 	struct nss_wifi_if_stats stats; | ||||
| 			/**< Statistics corresponding to this handle. */ | ||||
| 	nss_wifi_if_msg_callback_t cb; | ||||
| 			/**< Callback registered by other modules. */ | ||||
| 	void *app_data; | ||||
| 			/**< Application context to be passed to that callback. */ | ||||
| }; | ||||
|  | ||||
| /** | ||||
|  * nss_wifi_if_tx_msg | ||||
|  *	Sends a message to the Wi-Fi interface. | ||||
|  * | ||||
|  * @datatypes | ||||
|  * nss_ctx_instance \n | ||||
|  * nss_wifi_if_msg | ||||
|  * | ||||
|  * @param[in] nss_ctx  Pointer to the NSS context (provided during registration). | ||||
|  * @param[in] nwim     Pointer to the Wi-Fi interface message. | ||||
|  * | ||||
|  * @return | ||||
|  * Status of the Tx operation. | ||||
|  */ | ||||
| extern nss_tx_status_t nss_wifi_if_tx_msg(struct nss_ctx_instance *nss_ctx, | ||||
| 					struct nss_wifi_if_msg *nwim); | ||||
|  | ||||
| /** | ||||
|  * nss_wifi_if_register | ||||
|  *	Registers a Wi-Fi interface with the NSS driver. | ||||
|  * | ||||
|  * @datatypes | ||||
|  * nss_wifi_if_handle \n | ||||
|  * nss_wifi_if_data_callback_t \n | ||||
|  * net_device | ||||
|  * | ||||
|  * @param[in] handle       Pointer to the Wi-Fi context (provided during Wi-Fi | ||||
|  *                             interface allocation). | ||||
|  * @param[in] rx_callback  Callback handler for Wi-Fi data packets. | ||||
|  * @param[in] netdev       Pointer to the associated network device. | ||||
|  * | ||||
|  * @return | ||||
|  * None. | ||||
|  */ | ||||
| extern void nss_wifi_if_register(struct nss_wifi_if_handle *handle, | ||||
| 				nss_wifi_if_data_callback_t rx_callback, | ||||
| 				struct net_device *netdev); | ||||
|  | ||||
| /** | ||||
|  * nss_wifi_if_unregister | ||||
|  *	Deregisters a Wi-Fi interface from the NSS driver. | ||||
|  * | ||||
|  * @datatypes | ||||
|  * nss_wifi_if_handle | ||||
|  * | ||||
|  * @param[in] handle  Pointer to the Wi-Fi context. | ||||
|  * | ||||
|  * @return | ||||
|  * None. | ||||
|  */ | ||||
| extern void nss_wifi_if_unregister(struct nss_wifi_if_handle *handle); | ||||
|  | ||||
| /** | ||||
|  * nss_wifi_if_create_sync | ||||
|  *	Creates a Wi-Fi interface. | ||||
|  * | ||||
|  * @datatypes | ||||
|  * net_device | ||||
|  * | ||||
|  * @param[in] netdev  Pointer to the associated network device. | ||||
|  * | ||||
|  * @return | ||||
|  * Pointer to the Wi-Fi handle. | ||||
|  */ | ||||
| extern struct nss_wifi_if_handle *nss_wifi_if_create_sync(struct net_device *netdev); | ||||
|  | ||||
| /** | ||||
|  * nss_wifi_if_destroy_sync | ||||
|  *	Destroys the Wi-Fi interface associated with the interface number. | ||||
|  * | ||||
|  * @datatypes | ||||
|  * nss_wifi_if_handle | ||||
|  * | ||||
|  * @param[in] handle  Pointer to the Wi-Fi handle. | ||||
|  * | ||||
|  * @return | ||||
|  * Status of the Tx operation. | ||||
|  */ | ||||
| extern nss_tx_status_t nss_wifi_if_destroy_sync(struct nss_wifi_if_handle *handle); | ||||
|  | ||||
| /** | ||||
|  * nss_wifi_if_tx_buf | ||||
|  *	Sends a data packet or buffer to the NSS. | ||||
|  * | ||||
|  * @datatypes | ||||
|  * nss_wifi_if_handle \n | ||||
|  * sk_buff | ||||
|  * | ||||
|  * @param[in] handle  Context associated with the interface. | ||||
|  * @param[in] skb     Pointer to the data socket buffer. | ||||
|  * | ||||
|  * @return | ||||
|  * Status of the Tx operation. | ||||
|  */ | ||||
| extern nss_tx_status_t nss_wifi_if_tx_buf(struct nss_wifi_if_handle *handle, | ||||
| 					struct sk_buff *skb); | ||||
|  | ||||
| /** | ||||
|  * nss_wifi_if_copy_stats | ||||
|  *	Copies Wi-Fi interface statistics for display. | ||||
|  * | ||||
|  * @param[in]  if_num  NSS interface number. | ||||
|  * @param[in]  index   Index in the statistics array. | ||||
|  * @param[out] line    Pointer to the buffer into which the statistics are copied. | ||||
|  * | ||||
|  * @return | ||||
|  * Number of bytes copied. | ||||
|  */ | ||||
| int32_t nss_wifi_if_copy_stats(int32_t if_num, int index, char *line); | ||||
|  | ||||
| /** | ||||
|  * @} | ||||
|  */ | ||||
|  | ||||
| #endif /* __NSS_WIFI_IF_H */ | ||||
| @@ -43,6 +43,8 @@ enum nss_wifi_mac_db_msg_types { | ||||
| 	NSS_WIFI_MAC_DB_UPDATE_ENTRY_MSG,	/**< Wi-Fi MAC database update entry message. */ | ||||
| 	NSS_WIFI_MAC_DB_DEINIT_MSG,		/**< Wi-Fi MAC database deinitialization message. */ | ||||
| 	NSS_WIFI_MAC_DB_GROUP_ENTRIES_ADD_MSG,	/**< Wi-Fi MAC database group entries add message. */ | ||||
| 	NSS_WIFI_MAC_DB_ENTRY_ACTIVITY_MSG,	/**< Wi-Fi MAC database entry activity message. */ | ||||
| 	NSS_WIFI_MAC_DB_CREATE_ENTRY_MSG,	/**< Wi-Fi MAC database entry create message. */ | ||||
| 	NSS_WIFI_MAC_DB_MAX_MSG | ||||
| }; | ||||
|  | ||||
| @@ -69,9 +71,8 @@ enum nss_wifi_mac_db_if_opmode { | ||||
| 	NSS_WIFI_MAC_DB_ENTRY_IF_OPMODE_MAX	/**< Maximum entry database interface operation mode. */ | ||||
| }; | ||||
|  | ||||
| /* | ||||
|  * nss_wifi_mac_db_err_types | ||||
|  *	Wi-Fi MAC database erros. | ||||
| /** | ||||
|  * Wi-Fi MAC database errors. | ||||
|  */ | ||||
| enum nss_wifi_mac_db_err_types { | ||||
| 	NSS_WIFI_MAC_DB_ERROR_NONE, | ||||
| @@ -112,12 +113,42 @@ enum nss_wifi_mac_db_err_types { | ||||
| 		/**< Wi-Fi MAC database error maximum. */ | ||||
| }; | ||||
|  | ||||
| /** | ||||
|  * nss_wifi_mac_db_entry_create_msg | ||||
|  * 	Wi-Fi MAC database entry create message. | ||||
|  */ | ||||
| struct nss_wifi_mac_db_entry_create_msg { | ||||
| 	uint8_t mac_addr[ETH_ALEN];			/**< MAC address. */ | ||||
| 	uint16_t reserved;				/**< Reserved bytes. */ | ||||
| 	int32_t nss_if;					/**< NSS interface number. */ | ||||
| }; | ||||
|  | ||||
| /** | ||||
|  * nss_wifi_mac_db_entry_activity_info | ||||
|  * 	Wi-Fi MAC database entry activity information. | ||||
|  */ | ||||
| struct nss_wifi_mac_db_entry_activity_info { | ||||
| 	uint8_t mac_addr[ETH_ALEN];			/**< MAC address. */ | ||||
| 	uint16_t reserved;				/**< Reserved bytes. */ | ||||
| 	int32_t nss_if;					/**< NSS interface number. */ | ||||
| }; | ||||
|  | ||||
| /** | ||||
|  * nss_wifi_mac_db_entry_activity_info_msg | ||||
|  * 	Wi-Fi MAC database entry activity information message. | ||||
|  */ | ||||
| struct nss_wifi_mac_db_entry_activity_info_msg { | ||||
| 	uint32_t nentries;		/**< Number of entries. */ | ||||
| 	struct nss_wifi_mac_db_entry_activity_info info[1]; | ||||
| 					/**< Wi-Fi MAC database entry activity information. */ | ||||
| }; | ||||
|  | ||||
| /** | ||||
|  * nss_wifi_mac_db_entry_info_msg | ||||
|  *	Wi-Fi MAC database entry information. | ||||
|  */ | ||||
| struct nss_wifi_mac_db_entry_info_msg { | ||||
| 	uint8_t mac_addr[6];		/**< MAC address. */ | ||||
| 	uint8_t mac_addr[ETH_ALEN];	/**< MAC address. */ | ||||
| 	uint16_t flag;			/**< Flag information about NSS interface. */ | ||||
| 	int32_t nss_if;		    	/**< NSS interface number. */ | ||||
| 	uint32_t iftype;		/**< NSS interface type. */ | ||||
| @@ -151,6 +182,10 @@ struct nss_wifi_mac_db_msg { | ||||
| 				/**< Wi-Fi MAC database information specific message. */ | ||||
| 		struct nss_wifi_mac_db_entry_group_info_msg nmfdbegimsg; | ||||
| 				/**< Wi-Fi MAC database information specific message. */ | ||||
| 		struct nss_wifi_mac_db_entry_activity_info_msg nmfdbeact_imsg; | ||||
| 				/**< Wi-Fi MAC database entry activity information message. */ | ||||
| 		struct nss_wifi_mac_db_entry_create_msg nmfdbecmsg; | ||||
| 				/**< Wi-Fi MAC database entry create message. */ | ||||
| 	} msg;			/**< Message payload. */ | ||||
| }; | ||||
|  | ||||
|   | ||||
							
								
								
									
										1000
									
								
								feeds/ipq807x/qca-nss-drv/src/exports/nss_wifi_mesh.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1000
									
								
								feeds/ipq807x/qca-nss-drv/src/exports/nss_wifi_mesh.h
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @@ -1,6 +1,6 @@ | ||||
| /* | ||||
|  ************************************************************************** | ||||
|  * Copyright (c) 2015-2020, The Linux Foundation. All rights reserved. | ||||
|  * Copyright (c) 2015-2021, The Linux Foundation. All rights reserved. | ||||
|  * Permission to use, copy, modify, and/or distribute this software for | ||||
|  * any purpose with or without fee is hereby granted, provided that the | ||||
|  * above copyright notice and this permission notice appear in all copies. | ||||
| @@ -16,7 +16,7 @@ | ||||
|  | ||||
| /** | ||||
|  * @file nss_wifi_vdev.h | ||||
|  *	NSS TO HLOS Wi-Fi virtual device interface definitions. | ||||
|  *	NSS-to-HLOS Wi-Fi virtual device interface definitions. | ||||
|  */ | ||||
|  | ||||
| #ifndef __NSS_WIFI_VDEV_H | ||||
| @@ -74,6 +74,8 @@ enum nss_wifi_vdev_msg_types { | ||||
| 	NSS_WIFI_VDEV_INTERFACE_RECOVERY_RESET_MSG, | ||||
| 	NSS_WIFI_VDEV_INTERFACE_RECOVERY_RECONF_MSG, | ||||
| 	NSS_WIFI_VDEV_SET_GROUP_KEY, | ||||
| 	NSS_WIFI_VDEV_HMMC_MEMBER_ADD_MSG, | ||||
| 	NSS_WIFI_VDEV_HMMC_MEMBER_DEL_MSG, | ||||
| 	NSS_WIFI_VDEV_MAX_MSG | ||||
| }; | ||||
|  | ||||
| @@ -128,6 +130,15 @@ enum nss_wifi_vdev_err_types { | ||||
| 	NSS_WIFI_VDEV_VLAN_MODE_CONFIG_FAIL, | ||||
| 	NSS_WIFI_VDEV_RECOVERY_RESET_FAIL, | ||||
| 	NSS_WIFI_VDEV_RECOVERY_RECONF_FAIL, | ||||
| 	NSS_WIFI_VDEV_CONFIG_GROUP_KEY_FAIL, | ||||
| 	NSS_WIFI_VDEV_MULTIPASS_NOT_ENABLED, | ||||
| 	NSS_WIFI_VDEV_ALLOC_VLAN_MAP_FAILED, | ||||
| 	NSS_WIFI_VDEV_MTU_CHANGE_FAIL, | ||||
| 	NSS_WIFI_VDEV_MAC_ADDR_CHANGE_FAIL, | ||||
| 	NSS_WIFI_VDEV_PPE_PORT_CREATE_FAIL, | ||||
| 	NSS_WIFI_VDEV_PPE_PORT_DESTROY_FAIL, | ||||
| 	NSS_WIFI_VDEV_PPE_VSI_ASSIGN_FAIL, | ||||
| 	NSS_WIFI_VDEV_PPE_VSI_UNASSIGN_FAIL, | ||||
| 	NSS_WIFI_VDEV_EINV_MAX_CFG | ||||
| }; | ||||
|  | ||||
| @@ -150,6 +161,11 @@ enum nss_wifi_vdev_ext_data_pkt_type { | ||||
| 	NSS_WIFI_VDEV_EXT_TX_COMPL_PKT_TYPE = 11,	/**< Tx completion. */ | ||||
| 	NSS_WIFI_VDEV_EXT_DATA_PKT_TYPE_WDS_LEARN = 12,	/**< WDS source port learning command. */ | ||||
| 	NSS_WIFI_VDEV_EXT_DATA_PPDU_INFO = 13,		/**< PPDU metadata information. */ | ||||
| 	NSS_WIFI_VDEV_EXT_DATA_PKT_TYPE_MCBC_RX = 14,	/**< Multicast/broadcast packet received. */ | ||||
| 	NSS_WIFI_VDEV_MESH_EXT_DATA_PKT_TYPE_RX_SPL_PACKET = 15, | ||||
| 							/**< Mesh link VAP special packet. */ | ||||
| 	NSS_WIFI_VDEV_MESH_EXT_DATA_PKT_TYPE_RX_MCAST_EXC = 16, | ||||
| 							/**< Mesh link VAP multicast packet. */ | ||||
| 	NSS_WIFI_VDEV_EXT_DATA_PKT_TYPE_MAX | ||||
| }; | ||||
|  | ||||
| @@ -185,6 +201,9 @@ enum nss_wifi_vdev_cmd { | ||||
| 	NSS_WIFI_VDEV_ENABLE_IGMP_ME_CMD,	/**< Configuration to set IGMP multicast enhancement on VAP. */ | ||||
| 	NSS_WIFI_VDEV_CFG_WDS_BACKHAUL_CMD, | ||||
| 					/**< Configuration to set WDS backhaul extension on VAP. */ | ||||
| 	NSS_WIFI_VDEV_CFG_MCBC_EXC_TO_HOST_CMD, /**< Configuration to set multicast/broadcast exception to host on VAP. */ | ||||
| 	NSS_WIFI_VDEV_CFG_PEER_AUTHORIZE_CMD, | ||||
| 					/**< Configuration to enable peer authorization on VAP. */ | ||||
| 	NSS_WIFI_VDEV_MAX_CMD | ||||
| }; | ||||
|  | ||||
| @@ -220,6 +239,11 @@ enum nss_wifi_vdev_vlan_tagging_mode { | ||||
| 	NSS_WIFI_VDEV_VLAN_MAX		/**< Wi-Fi maximum VLAN support type. */ | ||||
| }; | ||||
|  | ||||
| enum vap_ext_mode { | ||||
| 	WIFI_VDEV_EXT_MODE_MESH_LINK = 1,	/* Wi-Fi mesh VAP mode */ | ||||
| 	WIFI_VDEV_EXT_MODE_MAX,			/* Wi-Fi maximum VAP mode */ | ||||
| }; | ||||
|  | ||||
| /** | ||||
|  * nss_wifi_vdev_config_msg | ||||
|  *	Virtual device configuration. | ||||
| @@ -246,7 +270,8 @@ struct nss_wifi_vdev_config_msg { | ||||
| 	uint8_t is_wrap;		/**< Specifies whether the VAP is a WRAP-AP. */ | ||||
| 	uint8_t is_nss_qwrap_en;	/**< VAP is configured for NSS firmware QWRAP logic. */ | ||||
| 	uint8_t tx_per_pkt_vdev_id_check;	/**< Transmit per-packet virtual device ID check. */ | ||||
| 	uint8_t reserved;		/**< Reserved for 4-byte alignment padding. */ | ||||
| 	uint8_t align_pad;		/**< Reserved field. */ | ||||
| 	uint32_t vap_ext_mode;		/**< Different VAP extended modes. */ | ||||
| }; | ||||
|  | ||||
| /** | ||||
| @@ -435,6 +460,66 @@ struct nss_wifi_vdev_me_snptbl_grp_mbr_update_msg { | ||||
| 				/**< Source IP address. */ | ||||
| }; | ||||
|  | ||||
| /** | ||||
|  * nss_wifi_vdev_me_hmmc_add_msg | ||||
|  *	Information for adding an entry into the host-managed multicast list. | ||||
|  */ | ||||
| struct nss_wifi_vdev_me_hmmc_add_msg { | ||||
| 	uint32_t ether_type;	/**< IPv4 or IPv6. */ | ||||
| 	union { | ||||
| 		uint32_t ipv4_addr; | ||||
| 			/**< IPv4 multicast group address. */ | ||||
| 		uint8_t ipv6_addr[NSS_WIFI_VDEV_IPV6_ADDR_LENGTH]; | ||||
| 			/**< IPv6 multicast group address. */ | ||||
| 	} u;	/**< Type of group addresses. */ | ||||
| 	uint32_t netmask;	/**< IP subnet netmask. */ | ||||
| }; | ||||
|  | ||||
| /** | ||||
|  * nss_wifi_vdev_me_hmmc_del_msg | ||||
|  *	Information for deleting an entry from the host-managed multicast list. | ||||
|  */ | ||||
| struct nss_wifi_vdev_me_hmmc_del_msg { | ||||
| 	uint32_t ether_type;	/**< IPv4 or IPv6. */ | ||||
| 	union { | ||||
| 		uint32_t ipv4_addr; | ||||
| 			/**< IPv4 multicast group address. */ | ||||
| 		uint8_t ipv6_addr[NSS_WIFI_VDEV_IPV6_ADDR_LENGTH]; | ||||
| 			/**< IPv6 multicast group address. */ | ||||
| 	} u;	/**< Type of group addresses. */ | ||||
| 	uint32_t netmask;	/**< IP subnet netmask. */ | ||||
| }; | ||||
|  | ||||
| /** | ||||
|  * nss_wifi_vdev_me_deny_ip_add_msg | ||||
|  *	Information for adding an entry into the deny list. | ||||
|  */ | ||||
| struct nss_wifi_vdev_me_deny_ip_add_msg { | ||||
| 	uint32_t ether_type;	/**< IPv4 or IPv6. */ | ||||
| 	union { | ||||
| 		uint32_t ipv4_addr; | ||||
| 			/**< IPv4 multicast group address. */ | ||||
| 		uint8_t ipv6_addr[NSS_WIFI_VDEV_IPV6_ADDR_LENGTH]; | ||||
| 			/**< IPv6 multicast group address. */ | ||||
| 	} u;	/**< Type of group addresses. */ | ||||
| 	uint32_t netmask;	/**< IP subnet netmask. */ | ||||
| }; | ||||
|  | ||||
| /** | ||||
|  * nss_wifi_vdev_me_deny_ip_del_msg | ||||
|  *	Information for deleting an entry from the deny list. | ||||
|  */ | ||||
| struct nss_wifi_vdev_me_deny_ip_del_msg { | ||||
| 	uint32_t ether_type;	/**< IPv4 or IPv6. */ | ||||
| 	union { | ||||
| 		uint32_t ipv4_addr; | ||||
| 			/**< IPv4 multicast group address. */ | ||||
| 		uint8_t ipv6_addr[NSS_WIFI_VDEV_IPV6_ADDR_LENGTH]; | ||||
| 			/**< IPv6 multicast group address. */ | ||||
| 	} u;	/**< Type of group addresses. */ | ||||
| 	uint32_t netmask;	/**< IP subnet netmask. */ | ||||
| }; | ||||
|  | ||||
| /** | ||||
|  * nss_wifi_vdev_me_snptbl_deny_grp_add_msg | ||||
|  *	Information for adding a snooplist member to a deny list. | ||||
| @@ -952,6 +1037,8 @@ struct nss_wifi_vdev_stats_sync_msg { | ||||
| 	uint32_t rx_mcast_bytes;		/**< Receive multicast bytes count. */ | ||||
| 	uint32_t rx_decrypt_err;		/**< Receive decryption error */ | ||||
| 	uint32_t rx_mic_err;			/**< Receive MIC error */ | ||||
| 	uint32_t mcbc_exc_host_fail_cnt; | ||||
| 			/**< Number of multicast/broadcast packets failed to send to host through exception path. */ | ||||
| }; | ||||
|  | ||||
| /** | ||||
| @@ -982,7 +1069,15 @@ struct nss_wifi_vdev_msg { | ||||
| 		struct nss_wifi_vdev_me_snptbl_grp_mbr_update_msg vdev_grp_member_update; | ||||
| 				/**< Updates a snooplist group member. */ | ||||
| 		struct nss_wifi_vdev_me_snptbl_deny_grp_add_msg vdev_deny_member_add; | ||||
| 				/**< Adds a snooplist member to a deny list. */ | ||||
| 				/**< Add a snooplist member to the deny list. */ | ||||
| 		struct nss_wifi_vdev_me_hmmc_add_msg vdev_hmmc_member_add; | ||||
| 				/**< Adds a new member into the HMMC list. */ | ||||
| 		struct nss_wifi_vdev_me_hmmc_del_msg vdev_hmmc_member_del; | ||||
| 				/**< Delete a member from the HMMC list. */ | ||||
| 		struct nss_wifi_vdev_me_deny_ip_add_msg vdev_deny_list_member_add; | ||||
| 				/**< Adds a new member into the deny list. */ | ||||
| 		struct nss_wifi_vdev_me_deny_ip_del_msg vdev_deny_list_member_del; | ||||
| 				/**< Delete a member from the deny list. */ | ||||
| 		struct nss_wifi_vdev_txmsg vdev_txmsgext; | ||||
| 				/**< Transmits special data. */ | ||||
| 		struct nss_wifi_vdev_vow_dbg_cfg_msg vdev_vow_dbg_cfg; | ||||
|   | ||||
| @@ -1,6 +1,6 @@ | ||||
| /* | ||||
|  ************************************************************************** | ||||
|  * Copyright (c) 2017-2020, The Linux Foundation. All rights reserved. | ||||
|  * Copyright (c) 2017-2021, The Linux Foundation. All rights reserved. | ||||
|  * Permission to use, copy, modify, and/or distribute this software for | ||||
|  * any purpose with or without fee is hereby granted, provided that the | ||||
|  * above copyright notice and this permission notice appear in all copies. | ||||
| @@ -62,7 +62,7 @@ | ||||
| 				/**< Maximum number of bandwidth supported. */ | ||||
| #define NSS_WIFILI_REPT_MU_MIMO 1 | ||||
| #define NSS_WIFILI_REPT_MU_OFDMA_MIMO 3 | ||||
| #define NSS_WIFILI_MAX_RESERVED_TYPE 3 | ||||
| #define NSS_WIFILI_MAX_RESERVED_TYPE 2 | ||||
| 				/**< Maximum reserved type. */ | ||||
| #define NSS_WIFILI_SOC_PER_PACKET_METADATA_SIZE 60 | ||||
| 				/**< Metadata area total size. */ | ||||
| @@ -95,6 +95,11 @@ | ||||
| #define NSS_WIFILI_WBM_INTERNAL_ERR_MAX 5 | ||||
| 				/**< WBM internal maximum errors. */ | ||||
|  | ||||
| /* | ||||
|  * Peer Size in Bytes | ||||
|  */ | ||||
| #define NSS_WIFILI_PEER_SIZE 1600 | ||||
|  | ||||
| /* | ||||
|  * Radio specific flags | ||||
|  */ | ||||
| @@ -105,6 +110,27 @@ | ||||
|  */ | ||||
| #define NSS_WIFILI_PEER_MSG_DISABLE_4ADDR 0x01 | ||||
|  | ||||
| #ifdef __KERNEL__ /* only kernel will use. */ | ||||
|  | ||||
| /** | ||||
|  * Wireless Multimedia Extention Access Category to TID. @hideinitializer | ||||
|  */ | ||||
| #define NSS_WIFILI_WME_AC_TO_TID(_ac) (	\ | ||||
| 		((_ac) == NSS_WIFILI_WME_AC_VO) ? 6 : \ | ||||
| 		(((_ac) == NSS_WIFILI_WME_AC_VI) ? 5 : \ | ||||
| 		(((_ac) == NSS_WIFILI_WME_AC_BK) ? 1 : \ | ||||
| 		0))) | ||||
|  | ||||
| /** | ||||
|  * Wireless TID to Wireless Extension Multimedia Access Category. @hideinitializer | ||||
|  */ | ||||
| #define NSS_WIFILI_TID_TO_WME_AC(_tid) (	\ | ||||
| 		(((_tid) == 0) || ((_tid) == 3)) ? NSS_WIFILI_WME_AC_BE : \ | ||||
| 		((((_tid) == 1) || ((_tid) == 2)) ? NSS_WIFILI_WME_AC_BK : \ | ||||
| 		((((_tid) == 4) || ((_tid) == 5)) ? NSS_WIFILI_WME_AC_VI : \ | ||||
| 		NSS_WIFILI_WME_AC_VO))) | ||||
| #endif /* __KERNEL */ | ||||
|  | ||||
| /** | ||||
|  * nss_wifili_thread_scheme_id | ||||
|  *	List of thread scheme IDs. | ||||
| @@ -209,6 +235,9 @@ enum nss_wifili_msg_types { | ||||
| 	NSS_WIFILI_PEER_EXT_STATS_MSG, | ||||
| 	NSS_WIFILI_CLR_STATS, | ||||
| 	NSS_WIFILI_PEER_4ADDR_EVENT_MSG, | ||||
| 	NSS_WIFILI_DBDC_REPEATER_LOOP_DETECTION_MSG, | ||||
| 	NSS_WIFILI_PEER_UPDATE_AUTH_FLAG, | ||||
| 	NSS_WIFILI_SEND_MESH_CAPABILITY_INFO, | ||||
| 	NSS_WIFILI_MAX_MSG | ||||
| }; | ||||
|  | ||||
| @@ -384,6 +413,7 @@ enum nss_wifili_radio_cmd { | ||||
| 	NSS_WIFILI_SET_FORCE_CLIENT_MCAST_TRAFFIC,	/**< Flag to force multicast traffic for a radio. */ | ||||
| 	NSS_WIFILI_SET_DROP_SECONDARY_MCAST,		/**< Flag to drop multicast traffic on secondary radio. */ | ||||
| 	NSS_WIFILI_SET_DBDC_FASTLANE,			/**< Flag to set DBDC fast-lane mode. */ | ||||
| 	NSS_WIFILI_SET_DBDC_NOBACKHAUL_RADIO,           /**< Flag to set DBDC to no backhaul radio. */ | ||||
| 	NSS_WIFILI_RADIO_MAX_CMD			/**< Maximum radio command index. */ | ||||
| }; | ||||
|  | ||||
| @@ -680,6 +710,8 @@ struct nss_wifili_hal_srng_soc_msg { | ||||
| 			/**< Shadow read pointer address. */ | ||||
| 	uint32_t shadow_wrptr_mem_addr; | ||||
| 			/**< Shadow write pointer address. */ | ||||
| 	uint32_t lmac_rings_start_id; | ||||
| 			/**< start id of LMAC rings. */ | ||||
| }; | ||||
|  | ||||
| /** | ||||
| @@ -1308,6 +1340,7 @@ struct nss_wifili_rx_err { | ||||
| struct nss_wifili_rx_ctrl_stats { | ||||
| 	struct nss_wifili_rx_err err;			/**< Rx peer errors. */ | ||||
| 	uint32_t multipass_rx_pkt_drop;         /**< Total number of multipass packets without a VLAN header. */ | ||||
| 	uint32_t peer_unauth_rx_pkt_drop;		/**< Number of receive packets dropped due to an authorized peer. */ | ||||
| 	uint32_t reserved_type[NSS_WIFILI_MAX_RESERVED_TYPE];	/**< Reserved type for future use. */ | ||||
| 	uint32_t non_amsdu_cnt;			/**< Number of MSDUs with no MSDU level aggregation. */ | ||||
| 	uint32_t amsdu_cnt;			/**< Number of MSDUs part of AMSDU. */ | ||||
| @@ -1560,6 +1593,14 @@ struct nss_wifili_peer_isolation_msg { | ||||
| 	uint16_t isolation;			/**< Isolation enabled/disabled. */ | ||||
| }; | ||||
|  | ||||
| /** | ||||
|  * nss_wifili_dbdc_repeater_loop_detection_msg | ||||
|  *	Wifili DBDC repeater loop detection message. | ||||
|  */ | ||||
| struct nss_wifili_dbdc_repeater_loop_detection_msg { | ||||
| 	bool dbdc_loop_detected;		/**< DBDC repeater loop detection flag. */ | ||||
| }; | ||||
|  | ||||
| /** | ||||
|  * nss_wifili_dbdc_repeater_set_msg | ||||
|  *	Wifili DBDC repeater set message. | ||||
| @@ -1612,6 +1653,16 @@ struct nss_wifili_clr_stats_msg { | ||||
| 	uint8_t vdev_id;;	/**< VAP ID. */ | ||||
| }; | ||||
|  | ||||
| /** | ||||
|  * nss_wifili_update_auth_flag | ||||
|  * 	Peer authentication flag message. | ||||
|  */ | ||||
| struct nss_wifili_peer_update_auth_flag { | ||||
| 	uint16_t peer_id;		/**< Peer ID. */ | ||||
| 	uint8_t auth_flag;		/**< Peer authentication flag. */ | ||||
| 	uint8_t reserved;		/**< Alignment padding. */ | ||||
| }; | ||||
|  | ||||
| /** | ||||
|  * nss_wifili_update_pdev_lmac_id_msg | ||||
|  * 	Physical device ID and lower MAC ID update message. | ||||
| @@ -1670,7 +1721,7 @@ struct nss_wifili_radio_cfg_msg { | ||||
|  | ||||
| /** | ||||
|  * struct wifili_peer_wds_4addr_allow_msg | ||||
|  *	Per peer four address configuration message. | ||||
|  *	Per-peer four address configuration message. | ||||
|  */ | ||||
| struct nss_wifili_peer_wds_4addr_allow_msg { | ||||
| 	uint32_t peer_id;	/**< Peer ID. */ | ||||
| @@ -1678,6 +1729,14 @@ struct nss_wifili_peer_wds_4addr_allow_msg { | ||||
| 	bool enable;		/**< Boolean flag to enable/disable four address frames. */ | ||||
| }; | ||||
|  | ||||
| /** | ||||
|  * struct nss_wifili_mesh_capability_info | ||||
|  * 	Wi-Fi mesh capability flag. | ||||
|  */ | ||||
| struct nss_wifili_mesh_capability_info { | ||||
| 	bool mesh_enable;	/**< Wi-Fi mesh capability flag. */ | ||||
| }; | ||||
|  | ||||
| /** | ||||
|  * nss_wifili_msg | ||||
|  *	Structure that describes wifili messages. | ||||
| @@ -1755,7 +1814,13 @@ struct nss_wifili_msg { | ||||
| 		struct nss_wifili_clr_stats_msg clrstats; | ||||
| 				/**< Clear NSS firmware statistics. */ | ||||
| 		struct nss_wifili_peer_wds_4addr_allow_msg wpswm; | ||||
| 				/**< Peer four address event message. */ | ||||
| 				/**< Peer four-address event message. */ | ||||
| 		struct nss_wifili_dbdc_repeater_loop_detection_msg wdrldm; | ||||
| 				/**< Wifili DBDC repeater loop detection message. */ | ||||
| 		struct nss_wifili_peer_update_auth_flag peer_auth; | ||||
| 				/**< Peer authentication flag message. */ | ||||
| 		struct nss_wifili_mesh_capability_info cap_info; | ||||
| 				/**< Mesh capability flag. */ | ||||
| 	} msg;			/**< Message payload. */ | ||||
| }; | ||||
|  | ||||
| @@ -1900,7 +1965,21 @@ void nss_unregister_wifili_radio_if(uint32_t if_num); | ||||
|  * @return | ||||
|  * External interface number. | ||||
|  */ | ||||
| uint32_t nss_get_available_wifili_external_if(void); | ||||
| nss_if_num_t nss_get_available_wifili_external_if(void); | ||||
|  | ||||
| /** | ||||
|  * nss_wifili_release_external_if | ||||
|  *	Release the used interface number | ||||
|  * | ||||
|  * @datatypes | ||||
|  * nss_if_num | ||||
|  * | ||||
|  * @param[in] if_num             NSS interface number. | ||||
|  * | ||||
|  * @return | ||||
|  * void | ||||
|  */ | ||||
| void nss_wifili_release_external_if(nss_if_num_t ifnum); | ||||
|  | ||||
| /** | ||||
|  * nss_wifili_thread_scheme_alloc | ||||
|   | ||||
| @@ -1,6 +1,6 @@ | ||||
| /* | ||||
|  ************************************************************************** | ||||
|  * Copyright (c) 2014-2020, The Linux Foundation. All rights reserved. | ||||
|  * Copyright (c) 2014-2021, The Linux Foundation. All rights reserved. | ||||
|  * Permission to use, copy, modify, and/or distribute this software for | ||||
|  * any purpose with or without fee is hereby granted, provided that the | ||||
|  * above copyright notice and this permission notice appear in all copies. | ||||
| @@ -48,17 +48,33 @@ struct nss_capwap_handle { | ||||
| }; | ||||
| static struct nss_capwap_handle *nss_capwap_hdl[NSS_MAX_DYNAMIC_INTERFACES]; | ||||
|  | ||||
| /* | ||||
|  * nss_capwap_get_interface_type() | ||||
|  *	Function to get the type of dynamic interface. | ||||
|  */ | ||||
| static enum nss_dynamic_interface_type nss_capwap_get_interface_type(uint32_t if_num) | ||||
| { | ||||
| 	struct nss_ctx_instance *nss_ctx; | ||||
| 	nss_ctx = &nss_top_main.nss[nss_top_main.capwap_handler_id]; | ||||
| 	NSS_VERIFY_CTX_MAGIC(nss_ctx); | ||||
|  | ||||
| 	return nss_dynamic_interface_get_type(nss_ctx, if_num); | ||||
| } | ||||
|  | ||||
| /* | ||||
|  * nss_capwap_verify_if_num() | ||||
|  *	Verify if_num passed to us. | ||||
|  */ | ||||
| static bool nss_capwap_verify_if_num(uint32_t if_num) | ||||
| { | ||||
| 	enum nss_dynamic_interface_type type; | ||||
|  | ||||
| 	if (nss_is_dynamic_interface(if_num) == false) { | ||||
| 		return false; | ||||
| 	} | ||||
|  | ||||
| 	if (nss_dynamic_interface_get_type(nss_capwap_get_ctx(), if_num) != NSS_DYNAMIC_INTERFACE_TYPE_CAPWAP) { | ||||
| 	type = nss_capwap_get_interface_type(if_num); | ||||
| 	if ((type != NSS_DYNAMIC_INTERFACE_TYPE_CAPWAP_HOST_INNER) && (type != NSS_DYNAMIC_INTERFACE_TYPE_CAPWAP_OUTER) ) { | ||||
| 		return false; | ||||
| 	} | ||||
|  | ||||
| @@ -88,10 +104,10 @@ static void nss_capwap_refcnt_dec(int32_t if_num) | ||||
| } | ||||
|  | ||||
| /* | ||||
|  * nss_capwap_refcnt() | ||||
|  * nss_capwap_refcnt_get() | ||||
|  *	Get refcnt on the tunnel. | ||||
|  */ | ||||
| static uint32_t nss_capwap_refcnt(int32_t if_num) | ||||
| static uint32_t nss_capwap_refcnt_get(int32_t if_num) | ||||
| { | ||||
| 	if_num = if_num - NSS_DYNAMIC_IF_START; | ||||
| 	return atomic_read(&nss_capwap_hdl[if_num]->refcnt); | ||||
| @@ -133,28 +149,40 @@ static nss_capwap_msg_callback_t nss_capwap_get_msg_callback(int32_t if_num, voi | ||||
| } | ||||
|  | ||||
| /* | ||||
|  * nss_capwapmgr_update_stats() | ||||
|  * nss_capwap_update_stats() | ||||
|  *	Update per-tunnel stats for each CAPWAP interface. | ||||
|  */ | ||||
| static void nss_capwapmgr_update_stats(struct nss_capwap_handle *handle, struct nss_capwap_stats_msg *fstats) | ||||
| static void nss_capwap_update_stats(struct nss_capwap_handle *handle, struct nss_capwap_stats_msg *fstats) | ||||
| { | ||||
| 	struct nss_capwap_tunnel_stats *stats; | ||||
| 	enum nss_dynamic_interface_type type; | ||||
|  | ||||
| 	stats = &handle->stats; | ||||
| 	type = nss_capwap_get_interface_type(handle->if_num); | ||||
|  | ||||
| 	switch(type) { | ||||
| 	case NSS_DYNAMIC_INTERFACE_TYPE_CAPWAP_OUTER: | ||||
| 		stats->rx_segments += fstats->rx_segments; | ||||
| 		stats->dtls_pkts += fstats->dtls_pkts; | ||||
|  | ||||
| 		stats->rx_dup_frag += fstats->rx_dup_frag; | ||||
| 		stats->rx_oversize_drops += fstats->rx_oversize_drops; | ||||
| 		stats->rx_frag_timeout_drops += fstats->rx_frag_timeout_drops; | ||||
| 	stats->rx_queue_full_drops += fstats->rx_queue_full_drops; | ||||
| 		stats->rx_n2h_drops += fstats->rx_n2h_drops; | ||||
| 		stats->rx_n2h_queue_full_drops += fstats->rx_n2h_queue_full_drops; | ||||
| 		stats->rx_mem_failure_drops += fstats->rx_mem_failure_drops; | ||||
| 		stats->rx_csum_drops += fstats->rx_csum_drops; | ||||
| 		stats->rx_malformed += fstats->rx_malformed; | ||||
| 		stats->rx_frag_gap_drops += fstats->rx_frag_gap_drops; | ||||
|  | ||||
| 		/* | ||||
| 		 * Update pnode rx stats for OUTER node. | ||||
| 		 */ | ||||
| 		stats->pnode_stats.rx_packets += fstats->pnode_stats.rx_packets; | ||||
| 		stats->pnode_stats.rx_bytes += fstats->pnode_stats.rx_bytes; | ||||
| 		stats->pnode_stats.rx_dropped += nss_cmn_rx_dropped_sum(&fstats->pnode_stats); | ||||
| 		break; | ||||
|  | ||||
| 	case NSS_DYNAMIC_INTERFACE_TYPE_CAPWAP_HOST_INNER: | ||||
| 		stats->tx_segments += fstats->tx_segments; | ||||
| 		stats->tx_queue_full_drops += fstats->tx_queue_full_drops; | ||||
| 		stats->tx_mem_failure_drops += fstats->tx_mem_failure_drops; | ||||
| @@ -165,13 +193,18 @@ static void nss_capwapmgr_update_stats(struct nss_capwap_handle *handle, struct | ||||
| 		stats->tx_dropped_nwireless += fstats->tx_dropped_nwireless; | ||||
|  | ||||
| 		/* | ||||
| 	 * add pnode stats now. | ||||
| 		 * Update pnode tx stats for INNER node. | ||||
| 		 */ | ||||
| 	stats->pnode_stats.rx_packets += fstats->pnode_stats.rx_packets; | ||||
| 	stats->pnode_stats.rx_bytes += fstats->pnode_stats.rx_bytes; | ||||
| 	stats->pnode_stats.rx_dropped += nss_cmn_rx_dropped_sum(&fstats->pnode_stats); | ||||
| 		stats->pnode_stats.tx_packets += fstats->pnode_stats.tx_packets; | ||||
| 		stats->pnode_stats.tx_bytes += fstats->pnode_stats.tx_bytes; | ||||
| 		stats->tx_dropped_inner += nss_cmn_rx_dropped_sum(&fstats->pnode_stats); | ||||
| 		break; | ||||
|  | ||||
| 	default: | ||||
| 		nss_warning("%px: Received invalid dynamic interface type: %d", handle, type); | ||||
| 		nss_assert(0); | ||||
| 		return; | ||||
| 	} | ||||
|  | ||||
| 	/* | ||||
| 	 * Set to 1 when the tunnel is operating in fast memory. | ||||
| @@ -217,7 +250,7 @@ static void nss_capwap_msg_handler(struct nss_ctx_instance *nss_ctx, struct nss_ | ||||
| 				/* | ||||
| 				 * Update driver statistics and send statistics notifications to the registered modules. | ||||
| 				 */ | ||||
| 				nss_capwapmgr_update_stats(nss_capwap_hdl[if_num], &ntm->msg.stats); | ||||
| 				nss_capwap_update_stats(nss_capwap_hdl[if_num], &ntm->msg.stats); | ||||
| 				nss_capwap_stats_notify(ncm->interface, nss_ctx->id); | ||||
| 			} | ||||
| 		} | ||||
| @@ -262,16 +295,16 @@ static bool nss_capwap_instance_alloc(struct nss_ctx_instance *nss_ctx, uint32_t | ||||
| 	memset(h, 0, sizeof(struct nss_capwap_handle)); | ||||
| 	h->if_num = if_num; | ||||
|  | ||||
| 	spin_lock(&nss_capwap_spinlock); | ||||
| 	spin_lock_bh(&nss_capwap_spinlock); | ||||
| 	if (nss_capwap_hdl[if_num - NSS_DYNAMIC_IF_START] != NULL) { | ||||
| 		spin_unlock(&nss_capwap_spinlock); | ||||
| 		spin_unlock_bh(&nss_capwap_spinlock); | ||||
| 		kfree(h); | ||||
| 		nss_warning("%px: Another thread is already allocated instance for :%d", nss_ctx, if_num); | ||||
| 		return false; | ||||
| 	} | ||||
|  | ||||
| 	nss_capwap_hdl[if_num - NSS_DYNAMIC_IF_START] = h; | ||||
| 	spin_unlock(&nss_capwap_spinlock); | ||||
| 	spin_unlock_bh(&nss_capwap_spinlock); | ||||
|  | ||||
| 	return true; | ||||
| } | ||||
| @@ -299,14 +332,14 @@ nss_tx_status_t nss_capwap_tx_msg(struct nss_ctx_instance *nss_ctx, struct nss_c | ||||
| 	} | ||||
|  | ||||
| 	if_num = msg->cm.interface - NSS_DYNAMIC_IF_START; | ||||
| 	spin_lock(&nss_capwap_spinlock); | ||||
| 	spin_lock_bh(&nss_capwap_spinlock); | ||||
| 	if (!nss_capwap_hdl[if_num]) { | ||||
| 		spin_unlock(&nss_capwap_spinlock); | ||||
| 		spin_unlock_bh(&nss_capwap_spinlock); | ||||
| 		nss_warning("%px: capwap tunnel if_num is not there: %d", nss_ctx, msg->cm.interface); | ||||
| 		return NSS_TX_FAILURE_BAD_PARAM; | ||||
| 	} | ||||
| 	nss_capwap_refcnt_inc(msg->cm.interface); | ||||
| 	spin_unlock(&nss_capwap_spinlock); | ||||
| 	spin_unlock_bh(&nss_capwap_spinlock); | ||||
|  | ||||
| 	/* | ||||
| 	 * Trace messages. | ||||
| @@ -348,14 +381,14 @@ bool nss_capwap_get_stats(uint32_t if_num, struct nss_capwap_tunnel_stats *stats | ||||
| 	} | ||||
|  | ||||
| 	if_num = if_num - NSS_DYNAMIC_IF_START; | ||||
| 	spin_lock(&nss_capwap_spinlock); | ||||
| 	spin_lock_bh(&nss_capwap_spinlock); | ||||
| 	if (nss_capwap_hdl[if_num] == NULL) { | ||||
| 		spin_unlock(&nss_capwap_spinlock); | ||||
| 		spin_unlock_bh(&nss_capwap_spinlock); | ||||
| 		return false; | ||||
| 	} | ||||
|  | ||||
| 	memcpy(stats, &nss_capwap_hdl[if_num]->stats, sizeof(struct nss_capwap_tunnel_stats)); | ||||
| 	spin_unlock(&nss_capwap_spinlock); | ||||
| 	spin_unlock_bh(&nss_capwap_spinlock); | ||||
| 	return true; | ||||
| } | ||||
| EXPORT_SYMBOL(nss_capwap_get_stats); | ||||
| @@ -376,13 +409,13 @@ struct nss_ctx_instance *nss_capwap_notify_register(uint32_t if_num, nss_capwap_ | ||||
| 		return NULL; | ||||
| 	} | ||||
|  | ||||
| 	spin_lock(&nss_capwap_spinlock); | ||||
| 	spin_lock_bh(&nss_capwap_spinlock); | ||||
| 	if (nss_capwap_hdl[if_num - NSS_DYNAMIC_IF_START] != NULL) { | ||||
| 		spin_unlock(&nss_capwap_spinlock); | ||||
| 		spin_unlock_bh(&nss_capwap_spinlock); | ||||
| 		nss_warning("%px: notfiy register tunnel already exists for interface %d", nss_ctx, if_num); | ||||
| 		return NULL; | ||||
| 	} | ||||
| 	spin_unlock(&nss_capwap_spinlock); | ||||
| 	spin_unlock_bh(&nss_capwap_spinlock); | ||||
|  | ||||
| 	return nss_ctx; | ||||
| } | ||||
| @@ -410,9 +443,9 @@ nss_tx_status_t nss_capwap_notify_unregister(struct nss_ctx_instance *nss_ctx, u | ||||
| 	} | ||||
|  | ||||
| 	index = if_num - NSS_DYNAMIC_IF_START; | ||||
| 	spin_lock(&nss_capwap_spinlock); | ||||
| 	spin_lock_bh(&nss_capwap_spinlock); | ||||
| 	if (nss_capwap_hdl[index] == NULL) { | ||||
| 		spin_unlock(&nss_capwap_spinlock); | ||||
| 		spin_unlock_bh(&nss_capwap_spinlock); | ||||
| 		nss_warning("%px: notify unregister received for unallocated if_num: %d", nss_ctx, if_num); | ||||
| 		return NSS_TX_FAILURE_BAD_PARAM; | ||||
| 	} | ||||
| @@ -421,14 +454,14 @@ nss_tx_status_t nss_capwap_notify_unregister(struct nss_ctx_instance *nss_ctx, u | ||||
| 	 * It's the responsibility of caller to wait and call us again. We return failure saying | ||||
| 	 * that we can't remove msg handler now. | ||||
| 	 */ | ||||
| 	if (nss_capwap_refcnt(if_num) != 0) { | ||||
| 		spin_unlock(&nss_capwap_spinlock); | ||||
| 	if (nss_capwap_refcnt_get(if_num) != 0) { | ||||
| 		spin_unlock_bh(&nss_capwap_spinlock); | ||||
| 		nss_warning("%px: notify unregister tunnel %d: has reference", nss_ctx, if_num); | ||||
| 		return NSS_TX_FAILURE_QUEUE; | ||||
| 	} | ||||
|  | ||||
| 	nss_capwap_set_msg_callback(if_num, NULL, NULL); | ||||
| 	spin_unlock(&nss_capwap_spinlock); | ||||
| 	spin_unlock_bh(&nss_capwap_spinlock); | ||||
|  | ||||
| 	return NSS_TX_SUCCESS; | ||||
| } | ||||
| @@ -449,12 +482,12 @@ struct nss_ctx_instance *nss_capwap_data_register(uint32_t if_num, nss_capwap_bu | ||||
| 		return NULL; | ||||
| 	} | ||||
|  | ||||
| 	spin_lock(&nss_capwap_spinlock); | ||||
| 	spin_lock_bh(&nss_capwap_spinlock); | ||||
| 	if (nss_ctx->subsys_dp_register[if_num].ndev != NULL) { | ||||
| 		spin_unlock(&nss_capwap_spinlock); | ||||
| 		spin_unlock_bh(&nss_capwap_spinlock); | ||||
| 		return NULL; | ||||
| 	} | ||||
| 	spin_unlock(&nss_capwap_spinlock); | ||||
| 	spin_unlock_bh(&nss_capwap_spinlock); | ||||
|  | ||||
| 	core_status = nss_core_register_handler(nss_ctx, if_num, nss_capwap_msg_handler, NULL); | ||||
| 	if (core_status != NSS_CORE_STATUS_SUCCESS) { | ||||
| @@ -488,18 +521,18 @@ bool nss_capwap_data_unregister(uint32_t if_num) | ||||
| 		return false; | ||||
| 	} | ||||
|  | ||||
| 	spin_lock(&nss_capwap_spinlock); | ||||
| 	spin_lock_bh(&nss_capwap_spinlock); | ||||
| 	/* | ||||
| 	 * It's the responsibility of caller to wait and call us again. | ||||
| 	 */ | ||||
| 	if (nss_capwap_refcnt(if_num) != 0) { | ||||
| 		spin_unlock(&nss_capwap_spinlock); | ||||
| 	if (nss_capwap_refcnt_get(if_num) != 0) { | ||||
| 		spin_unlock_bh(&nss_capwap_spinlock); | ||||
| 		nss_warning("%px: notify unregister tunnel %d: has reference", nss_ctx, if_num); | ||||
| 		return false; | ||||
| 	} | ||||
| 	h = nss_capwap_hdl[if_num - NSS_DYNAMIC_IF_START]; | ||||
| 	nss_capwap_hdl[if_num - NSS_DYNAMIC_IF_START] = NULL; | ||||
| 	spin_unlock(&nss_capwap_spinlock); | ||||
| 	spin_unlock_bh(&nss_capwap_spinlock); | ||||
|  | ||||
| 	(void) nss_core_unregister_handler(nss_ctx, if_num); | ||||
|  | ||||
|   | ||||
| @@ -50,7 +50,7 @@ static ssize_t nss_capwap_stats_encap(char *line, int len, int i, struct nss_cap | ||||
| 		tcnt = s->tx_dropped_ver_mis; | ||||
| 		break; | ||||
| 	case 5: | ||||
| 		tcnt = 0; | ||||
| 		tcnt = s->tx_dropped_inner; | ||||
| 		break; | ||||
| 	case 6: | ||||
| 		tcnt = s->tx_dropped_hroom; | ||||
| @@ -114,7 +114,7 @@ static ssize_t nss_capwap_stats_decap(char *line, int len, int i, struct nss_cap | ||||
| 		tcnt = s->rx_frag_gap_drops; | ||||
| 		break; | ||||
| 	case 9: | ||||
| 		tcnt = s->rx_queue_full_drops; | ||||
| 		tcnt = s->rx_n2h_drops; | ||||
| 		return snprintf(line, len, "%s = %llu (n2h = %llu)\n", nss_capwap_strings_decap_stats[i].stats_name, tcnt, s->rx_n2h_queue_full_drops); | ||||
| 	case 10: | ||||
| 		tcnt = s->rx_n2h_queue_full_drops; | ||||
| @@ -166,12 +166,22 @@ static ssize_t nss_capwap_stats_read(struct file *fp, char __user *ubuf, size_t | ||||
|  | ||||
| 	for (; if_num <= max_if_num; if_num++) { | ||||
| 		bool isthere; | ||||
| 		enum nss_dynamic_interface_type dtype; | ||||
|  | ||||
| 		if (nss_is_dynamic_interface(if_num) == false) { | ||||
| 			continue; | ||||
| 		} | ||||
|  | ||||
| 		if (nss_dynamic_interface_get_type(nss_capwap_get_ctx(), if_num) != NSS_DYNAMIC_INTERFACE_TYPE_CAPWAP) { | ||||
| 		dtype = nss_dynamic_interface_get_type(nss_capwap_get_ctx(), if_num); | ||||
|  | ||||
| 		/* | ||||
| 		 * Read encap stats from inner node and decap stats from outer node. | ||||
| 		 */ | ||||
| 		if ((type == 1) && (dtype != NSS_DYNAMIC_INTERFACE_TYPE_CAPWAP_HOST_INNER)) { | ||||
| 			continue; | ||||
| 		} | ||||
|  | ||||
| 		if ((type == 0) && (dtype != NSS_DYNAMIC_INTERFACE_TYPE_CAPWAP_OUTER)) { | ||||
| 			continue; | ||||
| 		} | ||||
|  | ||||
|   | ||||
| @@ -32,7 +32,7 @@ struct nss_stats_info nss_capwap_strings_encap_stats[NSS_CAPWAP_STATS_ENCAP_MAX] | ||||
| 	{"tx_segments",		NSS_STATS_TYPE_SPECIAL}, | ||||
| 	{"tx_drop_seg_ref",	NSS_STATS_TYPE_DROP}, | ||||
| 	{"tx_drop_ver_mismatch",NSS_STATS_TYPE_DROP}, | ||||
| 	{"tx_drop_unalign",	NSS_STATS_TYPE_DROP}, | ||||
| 	{"tx_dropped_inner",	NSS_STATS_TYPE_DROP}, | ||||
| 	{"tx_drop_hroom",	NSS_STATS_TYPE_DROP}, | ||||
| 	{"tx_drop_DTLS",	NSS_STATS_TYPE_DROP}, | ||||
| 	{"tx_drop_nwireless",	NSS_STATS_TYPE_DROP}, | ||||
| @@ -69,7 +69,7 @@ struct nss_stats_info nss_capwap_strings_decap_stats[NSS_CAPWAP_STATS_DECAP_MAX] | ||||
| 	{"rx_drop_frag_timeout",NSS_STATS_TYPE_DROP}, | ||||
| 	{"rx_drop_frag_dup",	NSS_STATS_TYPE_DROP}, | ||||
| 	{"rx_drop_frag_gap",	NSS_STATS_TYPE_DROP}, | ||||
| 	{"rx_drop_qfull",	NSS_STATS_TYPE_DROP}, | ||||
| 	{"rx_drop_n2h",		NSS_STATS_TYPE_DROP}, | ||||
| 	{"rx_drop_n2h_qfull",	NSS_STATS_TYPE_DROP}, | ||||
| 	{"rx_drop_mem_fail",	NSS_STATS_TYPE_DROP}, | ||||
| 	{"rx_drop_csum",	NSS_STATS_TYPE_DROP}, | ||||
|   | ||||
| @@ -1,6 +1,6 @@ | ||||
| /* | ||||
|  ************************************************************************** | ||||
|  * Copyright (c) 2019-2020, The Linux Foundation. All rights reserved. | ||||
|  * Copyright (c) 2019-2021, The Linux Foundation. All rights reserved. | ||||
|  * Permission to use, copy, modify, and/or distribute this software for | ||||
|  * any purpose with or without fee is hereby granted, provided that the | ||||
|  * above copyright notice and this permission notice appear in all copies. | ||||
| @@ -23,6 +23,7 @@ | ||||
| #include "nss_cmn.h" | ||||
| #include "nss_tx_rx_common.h" | ||||
| #include "nss_clmap_stats.h" | ||||
| #include "nss_clmap_strings.h" | ||||
| #include "nss_clmap_log.h" | ||||
|  | ||||
| #define NSS_CLMAP_TX_TIMEOUT 3000 | ||||
| @@ -106,6 +107,7 @@ static void nss_clmap_msg_handler(struct nss_ctx_instance *nss_ctx, struct nss_c | ||||
| 	switch (nclm->cm.type) { | ||||
| 	case NSS_CLMAP_MSG_TYPE_SYNC_STATS: | ||||
| 		nss_clmap_stats_sync(nss_ctx, &nclm->msg.stats, ncm->interface); | ||||
| 		nss_clmap_stats_notify(nss_ctx, ncm->interface); | ||||
| 		break; | ||||
| 	} | ||||
|  | ||||
| @@ -336,7 +338,9 @@ EXPORT_SYMBOL(nss_clmap_get_ctx); | ||||
|  */ | ||||
| void nss_clmap_init() | ||||
| { | ||||
| 	nss_clmap_stats_dentry_create(); | ||||
| 	sema_init(&clmap_pvt.sem, 1); | ||||
| 	init_completion(&clmap_pvt.complete); | ||||
|  | ||||
| 	nss_clmap_stats_dentry_create(); | ||||
| 	nss_clmap_strings_dentry_create(); | ||||
| } | ||||
|   | ||||
| @@ -1,6 +1,6 @@ | ||||
| /* | ||||
|  ************************************************************************** | ||||
|  * Copyright (c) 2019-2020, The Linux Foundation. All rights reserved. | ||||
|  * Copyright (c) 2019-2021, The Linux Foundation. All rights reserved. | ||||
|  * Permission to use, copy, modify, and/or distribute this software for | ||||
|  * any purpose with or without fee is hereby granted, provided that the | ||||
|  * above copyright notice and this permission notice appear in all copies. | ||||
| @@ -15,8 +15,18 @@ | ||||
|  */ | ||||
|  | ||||
| #include "nss_tx_rx_common.h" | ||||
| #include "nss_clmap.h" | ||||
| #include "nss_clmap_stats.h" | ||||
| #include "nss_clmap_strings.h" | ||||
|  | ||||
| /* | ||||
|  * Declare atomic notifier data structure for statistics. | ||||
|  */ | ||||
| ATOMIC_NOTIFIER_HEAD(nss_clmap_stats_notifier); | ||||
|  | ||||
| /* | ||||
|  * Spinlock to protect clmap statistics update/read | ||||
|  */ | ||||
| DEFINE_SPINLOCK(nss_clmap_stats_lock); | ||||
|  | ||||
| struct nss_clmap_stats *stats_db[NSS_CLMAP_MAX_DEBUG_INTERFACES] = {NULL}; | ||||
| @@ -31,34 +41,23 @@ static char *nss_clmap_interface_type_str[NSS_CLMAP_INTERFACE_TYPE_MAX] = { | ||||
| }; | ||||
|  | ||||
| /* | ||||
|  * nss_clmap_stats_str | ||||
|  *	Clmap statistics strings for nss tunnel stats | ||||
|  * nss_clmap_stats_session_unregister | ||||
|  *	Unregister debug statistic for clmap session. | ||||
|  */ | ||||
| static char *nss_clmap_stats_str[NSS_CLMAP_INTERFACE_STATS_MAX] = { | ||||
| 	"rx_pkts", | ||||
| 	"rx_bytes", | ||||
| 	"tx_pkts", | ||||
| 	"tx_bytes", | ||||
| 	"rx_queue_0_dropped", | ||||
| 	"rx_queue_1_dropped", | ||||
| 	"rx_queue_2_dropped", | ||||
| 	"rx_queue_3_dropped", | ||||
| 	"MAC DB look up failed", | ||||
| 	"Invalid packet count", | ||||
| 	"Headroom drop", | ||||
| 	"Next node queue full drop", | ||||
| 	"Pbuf alloc failed drop", | ||||
| 	"Linear failed drop", | ||||
| 	"Shared packet count", | ||||
| 	"Ethernet frame error", | ||||
| 	"Macdb create requests count", | ||||
| 	"Macdb create failures MAC exists count", | ||||
| 	"Macdb create failures MAC table full count", | ||||
| 	"Macdb destroy requests count", | ||||
| 	"Macdb destroy failures MAC not found count", | ||||
| 	"Macdb destroy failures MAC unhashed count", | ||||
| 	"Macdb flush requests count" | ||||
| }; | ||||
| void nss_clmap_stats_session_unregister(uint32_t if_num) | ||||
| { | ||||
| 	uint32_t i; | ||||
|  | ||||
| 	spin_lock_bh(&nss_clmap_stats_lock); | ||||
| 	for (i = 0; i < NSS_CLMAP_MAX_DEBUG_INTERFACES; i++) { | ||||
| 		if (stats_db[i] && (stats_db[i]->nss_if_num == if_num)) { | ||||
| 			kfree(stats_db[i]); | ||||
| 			stats_db[i] = NULL; | ||||
| 			break; | ||||
| 		} | ||||
| 	} | ||||
| 	spin_unlock_bh(&nss_clmap_stats_lock); | ||||
| } | ||||
|  | ||||
| /* | ||||
|  * nss_clmap_stats_session_register | ||||
| @@ -94,25 +93,6 @@ bool nss_clmap_stats_session_register(uint32_t if_num, uint32_t if_type, struct | ||||
| 	return stats_status; | ||||
| } | ||||
|  | ||||
| /* | ||||
|  * nss_clmap_stats_session_unregister | ||||
|  * 	Unregister debug statistic for clmap session. | ||||
|  */ | ||||
| void nss_clmap_stats_session_unregister(uint32_t if_num) | ||||
| { | ||||
| 	uint32_t i; | ||||
|  | ||||
| 	spin_lock_bh(&nss_clmap_stats_lock); | ||||
| 	for (i = 0; i < NSS_CLMAP_MAX_DEBUG_INTERFACES; i++) { | ||||
| 		if (stats_db[i] && (stats_db[i]->nss_if_num == if_num)) { | ||||
| 			kfree(stats_db[i]); | ||||
| 			stats_db[i] = NULL; | ||||
| 			break; | ||||
| 		} | ||||
| 	} | ||||
| 	spin_unlock_bh(&nss_clmap_stats_lock); | ||||
| } | ||||
|  | ||||
| /* | ||||
|  * nss_clmap_get_debug_stats() | ||||
|  *	Get clmap debug statistics. | ||||
| @@ -142,12 +122,12 @@ static int nss_clmap_get_debug_stats(struct nss_clmap_stats *stats) | ||||
| static ssize_t nss_clmap_stats_read(struct file *fp, char __user *ubuf, | ||||
| 					size_t sz, loff_t *ppos) | ||||
| { | ||||
| 	uint32_t max_output_lines = 2 + (NSS_CLMAP_INTERFACE_STATS_MAX * NSS_CLMAP_MAX_DEBUG_INTERFACES + 2) + 2; | ||||
| 	uint32_t max_output_lines = (NSS_CLMAP_INTERFACE_STATS_MAX * NSS_CLMAP_MAX_DEBUG_INTERFACES) + NSS_STATS_EXTRA_OUTPUT_LINES; | ||||
| 	size_t size_al = NSS_STATS_MAX_STR_LENGTH * max_output_lines; | ||||
| 	size_t size_wr = 0; | ||||
| 	ssize_t bytes_read = 0; | ||||
| 	struct net_device *dev; | ||||
| 	uint32_t id, i; | ||||
| 	uint32_t id; | ||||
| 	struct nss_clmap_stats *clmap_stats = NULL; | ||||
| 	int interface_cnt; | ||||
|  | ||||
| @@ -171,8 +151,7 @@ static ssize_t nss_clmap_stats_read(struct file *fp, char __user *ubuf, | ||||
| 	 * Get clmap statistics. | ||||
| 	 */ | ||||
| 	interface_cnt = nss_clmap_get_debug_stats(clmap_stats); | ||||
| 	size_wr = scnprintf(lbuf + size_wr, size_al - size_wr, | ||||
| 			"\n clmap Interface statistics start:\n\n"); | ||||
| 	size_wr += nss_stats_banner(lbuf, size_wr, size_al, "clmap stats", NSS_STATS_SINGLE_CORE); | ||||
| 	for (id = 0; id < interface_cnt; id++) { | ||||
| 		struct nss_clmap_stats *clmsp = clmap_stats + id; | ||||
|  | ||||
| @@ -190,16 +169,10 @@ static ssize_t nss_clmap_stats_read(struct file *fp, char __user *ubuf, | ||||
| 				clmsp->nss_if_num, nss_clmap_interface_type_str[clmsp->nss_if_type], dev->name); | ||||
| 		dev_put(dev); | ||||
|  | ||||
| 		for (i = 0; i < NSS_CLMAP_INTERFACE_STATS_MAX; i++) { | ||||
| 			size_wr += scnprintf(lbuf + size_wr, size_al - size_wr, | ||||
| 					"\t%s = %llu\n", nss_clmap_stats_str[i], | ||||
| 					clmsp->stats[i]); | ||||
| 		} | ||||
| 		size_wr += scnprintf(lbuf + size_wr, size_al - size_wr, "\n"); | ||||
| 		size_wr += nss_stats_print("clmap", NULL, NSS_STATS_SINGLE_INSTANCE, nss_clmap_strings_stats, | ||||
| 						clmsp->stats, NSS_CLMAP_INTERFACE_STATS_MAX, lbuf, size_wr, size_al); | ||||
| 	} | ||||
|  | ||||
| 	size_wr += scnprintf(lbuf + size_wr, size_al - size_wr, | ||||
| 			"\n clmap Interface statistics end\n"); | ||||
| 	bytes_read = simple_read_from_buffer(ubuf, sz, ppos, lbuf, size_wr); | ||||
|  | ||||
| 	kfree(clmap_stats); | ||||
| @@ -272,3 +245,52 @@ void nss_clmap_stats_dentry_create(void) | ||||
| { | ||||
| 	nss_stats_create_dentry("clmap", &nss_clmap_stats_ops); | ||||
| } | ||||
|  | ||||
| /* | ||||
|  * nss_clmap_stats_notify() | ||||
|  *	Sends notifications to all the registered modules. | ||||
|  * | ||||
|  * Leverage NSS-FW statistics timing to update Netlink. | ||||
|  */ | ||||
| void nss_clmap_stats_notify(struct nss_ctx_instance *nss_ctx, uint32_t if_num) | ||||
| { | ||||
| 	struct nss_clmap_stats_notification clmap_stats; | ||||
| 	struct nss_clmap_stats *s = NULL; | ||||
| 	int i; | ||||
|  | ||||
| 	spin_lock_bh(&nss_clmap_stats_lock); | ||||
| 	for (i = 0; i < NSS_CLMAP_MAX_DEBUG_INTERFACES; i++) { | ||||
| 		if (!stats_db[i] || (stats_db[i]->nss_if_num != if_num)) { | ||||
| 			continue; | ||||
| 		} | ||||
|  | ||||
| 		s = stats_db[i]; | ||||
| 		clmap_stats.core_id = nss_ctx->id; | ||||
| 		clmap_stats.if_num = if_num; | ||||
| 		memcpy(clmap_stats.stats_ctx, s->stats, sizeof(clmap_stats.stats_ctx)); | ||||
| 		spin_unlock_bh(&nss_clmap_stats_lock); | ||||
| 		atomic_notifier_call_chain(&nss_clmap_stats_notifier, NSS_STATS_EVENT_NOTIFY, &clmap_stats); | ||||
| 		return; | ||||
| 	} | ||||
| 	spin_unlock_bh(&nss_clmap_stats_lock); | ||||
| } | ||||
|  | ||||
| /* | ||||
|  * nss_clmap_stats_unregister_notifier() | ||||
|  *	Deregisters statistics notifier. | ||||
|  */ | ||||
| int nss_clmap_stats_unregister_notifier(struct notifier_block *nb) | ||||
| { | ||||
| 	return atomic_notifier_chain_unregister(&nss_clmap_stats_notifier, nb); | ||||
| } | ||||
| EXPORT_SYMBOL(nss_clmap_stats_unregister_notifier); | ||||
|  | ||||
| /* | ||||
|  * nss_clmap_stats_register_notifier() | ||||
|  *	Registers statistics notifier. | ||||
|  */ | ||||
| int nss_clmap_stats_register_notifier(struct notifier_block *nb) | ||||
| { | ||||
| 	return atomic_notifier_chain_register(&nss_clmap_stats_notifier, nb); | ||||
| } | ||||
| EXPORT_SYMBOL(nss_clmap_stats_register_notifier); | ||||
|   | ||||
| @@ -1,6 +1,6 @@ | ||||
| /* | ||||
|  ****************************************************************************** | ||||
|  * Copyright (c) 2019, The Linux Foundation. All rights reserved. | ||||
|  * Copyright (c) 2019, 2021, The Linux Foundation. All rights reserved. | ||||
|  * Permission to use, copy, modify, and/or distribute this software for | ||||
|  * any purpose with or without fee is hereby granted, provided that the | ||||
|  * above copyright notice and this permission notice appear in all copies. | ||||
| @@ -19,51 +19,12 @@ | ||||
|  | ||||
| #define NSS_CLMAP_MAX_DEBUG_INTERFACES 2 * NSS_CLMAP_MAX_INTERFACES | ||||
|  | ||||
| /* | ||||
|  * Clmap NSS interface type. | ||||
|  */ | ||||
| enum nss_clmap_interface_type { | ||||
| 	NSS_CLMAP_INTERFACE_TYPE_US, | ||||
| 	NSS_CLMAP_INTERFACE_TYPE_DS, | ||||
| 	NSS_CLMAP_INTERFACE_TYPE_MAX | ||||
| }; | ||||
|  | ||||
| /* | ||||
|  * Clmap statistic counters. | ||||
|  */ | ||||
| enum nss_clmap_stats_type { | ||||
|         NSS_CLMAP_INTERFACE_STATS_RX_PKTS, | ||||
|         NSS_CLMAP_INTERFACE_STATS_RX_BYTES, | ||||
|         NSS_CLMAP_INTERFACE_STATS_TX_PKTS, | ||||
|         NSS_CLMAP_INTERFACE_STATS_TX_BYTES, | ||||
|         NSS_CLMAP_INTERFACE_STATS_RX_QUEUE_0_DROPPED, | ||||
|         NSS_CLMAP_INTERFACE_STATS_RX_QUEUE_1_DROPPED, | ||||
|         NSS_CLMAP_INTERFACE_STATS_RX_QUEUE_2_DROPPED, | ||||
|         NSS_CLMAP_INTERFACE_STATS_RX_QUEUE_3_DROPPED, | ||||
| 	NSS_CLMAP_INTERFACE_STATS_DROPPED_MACDB_LOOKUP_FAILED, | ||||
| 	NSS_CLMAP_INTERFACE_STATS_DROPPED_INVALID_PACKET_SIZE, | ||||
| 	NSS_CLMAP_INTERFACE_STATS_DROPPED_LOW_HEADROOM, | ||||
| 	NSS_CLMAP_INTERFACE_STATS_DROPPED_NEXT_NODE_QUEUE_FULL, | ||||
| 	NSS_CLMAP_INTERFACE_STATS_DROPPED_PBUF_ALLOC_FAILED, | ||||
| 	NSS_CLMAP_INTERFACE_STATS_DROPPED_LINEAR_FAILED, | ||||
| 	NSS_CLMAP_INTERFACE_STATS_SHARED_PACKET_CNT, | ||||
| 	NSS_CLMAP_INTERFACE_STATS_ETHERNET_FRAME_ERROR, | ||||
| 	NSS_CLMAP_INTERFACE_STATS_MACDB_CREATE_REQUESTS_CNT, | ||||
| 	NSS_CLMAP_INTERFACE_STATS_MACDB_CREATE_MAC_EXISTS_CNT, | ||||
| 	NSS_CLMAP_INTERFACE_STATS_MACDB_CREATE_MAC_TABLE_FULL_CNT, | ||||
| 	NSS_CLMAP_INTERFACE_STATS_MACDB_DESTROY_REQUESTS_CNT, | ||||
| 	NSS_CLMAP_INTERFACE_STATS_MACDB_DESTROY_MAC_NOT_FOUND_CNT, | ||||
| 	NSS_CLMAP_INTERFACE_STATS_MACDB_DESTROY_MAC_UNHASHED_CNT, | ||||
| 	NSS_CLMAP_INTERFACE_STATS_MACDB_FLUSH_REQUESTS_CNT, | ||||
| 	NSS_CLMAP_INTERFACE_STATS_MAX, | ||||
| }; | ||||
|  | ||||
| /* | ||||
|  * Clmap session debug statistics. | ||||
|  */ | ||||
| struct nss_clmap_stats { | ||||
| 	uint64_t stats[NSS_CLMAP_INTERFACE_STATS_MAX]; | ||||
| 	int32_t if_index; | ||||
| 	uint64_t stats[NSS_CLMAP_INTERFACE_STATS_MAX];	/* Clmap statistics. */ | ||||
| 	int32_t if_index;				/* Interface index. */ | ||||
| 	uint32_t nss_if_num;				/* NSS interface number. */ | ||||
| 	enum nss_clmap_interface_type nss_if_type;	/* NSS interface type. */ | ||||
| 	bool valid; | ||||
| @@ -72,6 +33,7 @@ struct nss_clmap_stats { | ||||
| /* | ||||
|  * Clmap statistics APIs. | ||||
|  */ | ||||
| extern void nss_clmap_stats_notify(struct nss_ctx_instance *nss_ctx, uint32_t if_num); | ||||
| extern bool nss_clmap_stats_session_register(uint32_t if_num, enum nss_clmap_interface_type if_type, struct net_device *netdev); | ||||
| extern void nss_clmap_stats_session_unregister(uint32_t if_num); | ||||
| extern void nss_clmap_stats_sync(struct nss_ctx_instance *nss_ctx, struct nss_clmap_stats_msg *stats_msg, uint32_t if_num); | ||||
|   | ||||
							
								
								
									
										73
									
								
								feeds/ipq807x/qca-nss-drv/src/nss_clmap_strings.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										73
									
								
								feeds/ipq807x/qca-nss-drv/src/nss_clmap_strings.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,73 @@ | ||||
| /* | ||||
|  ************************************************************************** | ||||
|  * Copyright (c) 2020-2021, The Linux Foundation. All rights reserved. | ||||
|  * Permission to use, copy, modify, and/or distribute this software for | ||||
|  * any purpose with or without fee is hereby granted, provided that the | ||||
|  * above copyright notice and this permission notice appear in all copies. | ||||
|  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES | ||||
|  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF | ||||
|  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR | ||||
|  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES | ||||
|  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN | ||||
|  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT | ||||
|  * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | ||||
|  ************************************************************************** | ||||
|  */ | ||||
|  | ||||
| #include "nss_stats.h" | ||||
| #include "nss_core.h" | ||||
| #include "nss_strings.h" | ||||
| #include "nss_clmap_strings.h" | ||||
|  | ||||
| /* | ||||
|  * nss_clmap_strings_stats | ||||
|  *	Clmap statistics strings for nss tunnel stats | ||||
|  */ | ||||
| struct nss_stats_info nss_clmap_strings_stats[NSS_CLMAP_INTERFACE_STATS_MAX] = { | ||||
| 	{"rx_pkts",					NSS_STATS_TYPE_COMMON}, | ||||
| 	{"rx_bytes",					NSS_STATS_TYPE_COMMON}, | ||||
| 	{"tx_pkts",					NSS_STATS_TYPE_COMMON}, | ||||
| 	{"tx_bytes",					NSS_STATS_TYPE_COMMON}, | ||||
| 	{"rx_queue_0_dropped",				NSS_STATS_TYPE_DROP}, | ||||
| 	{"rx_queue_1_dropped",				NSS_STATS_TYPE_DROP}, | ||||
| 	{"rx_queue_2_dropped",				NSS_STATS_TYPE_DROP}, | ||||
| 	{"rx_queue_3_dropped",				NSS_STATS_TYPE_DROP}, | ||||
| 	{"MAC DB look up failed",			NSS_STATS_TYPE_SPECIAL}, | ||||
| 	{"Invalid packet count",			NSS_STATS_TYPE_SPECIAL}, | ||||
| 	{"Headroom drop",				NSS_STATS_TYPE_SPECIAL}, | ||||
| 	{"Next node queue full drop",			NSS_STATS_TYPE_SPECIAL}, | ||||
| 	{"Pbuf alloc failed drop",			NSS_STATS_TYPE_SPECIAL}, | ||||
| 	{"Linear failed drop",				NSS_STATS_TYPE_SPECIAL}, | ||||
| 	{"Shared packet count",				NSS_STATS_TYPE_SPECIAL}, | ||||
| 	{"Ethernet frame error",			NSS_STATS_TYPE_SPECIAL}, | ||||
| 	{"Macdb create requests count",			NSS_STATS_TYPE_SPECIAL}, | ||||
| 	{"Macdb create failures MAC exists count",	NSS_STATS_TYPE_SPECIAL}, | ||||
| 	{"Macdb create failures MAC table full count",	NSS_STATS_TYPE_SPECIAL}, | ||||
| 	{"Macdb destroy requests count",		NSS_STATS_TYPE_SPECIAL}, | ||||
| 	{"Macdb destroy failures MAC not found count",	NSS_STATS_TYPE_SPECIAL}, | ||||
| 	{"Macdb destroy failures MAC unhashed count",	NSS_STATS_TYPE_SPECIAL}, | ||||
| 	{"Macdb flush requests count",			NSS_STATS_TYPE_SPECIAL} | ||||
| }; | ||||
|  | ||||
| /* | ||||
|  * nss_clmap_strings_read() | ||||
|  *	Read clmap statistics names | ||||
|  */ | ||||
| static ssize_t nss_clmap_strings_read(struct file *fp, char __user *ubuf, size_t sz, loff_t *ppos) | ||||
| { | ||||
| 	return nss_strings_print(ubuf, sz, ppos, nss_clmap_strings_stats, NSS_CLMAP_INTERFACE_STATS_MAX); | ||||
| } | ||||
|  | ||||
| /* | ||||
|  * nss_clmap_strings_ops | ||||
|  */ | ||||
| NSS_STRINGS_DECLARE_FILE_OPERATIONS(clmap); | ||||
|  | ||||
| /* | ||||
|  * nss_clmap_strings_dentry_create() | ||||
|  *	Create clmap statistics strings debug entry. | ||||
|  */ | ||||
| void nss_clmap_strings_dentry_create(void) | ||||
| { | ||||
| 	nss_strings_create_dentry("clmap", &nss_clmap_strings_ops); | ||||
| } | ||||
							
								
								
									
										25
									
								
								feeds/ipq807x/qca-nss-drv/src/nss_clmap_strings.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								feeds/ipq807x/qca-nss-drv/src/nss_clmap_strings.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,25 @@ | ||||
| /* | ||||
|  *************************************************************************** | ||||
|  * Copyright (c) 2020-2021, The Linux Foundation. All rights reserved. | ||||
|  * Permission to use, copy, modify, and/or distribute this software for | ||||
|  * any purpose with or without fee is hereby granted, provided that the | ||||
|  * above copyright notice and this permission notice appear in all copies. | ||||
|  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES | ||||
|  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF | ||||
|  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR | ||||
|  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES | ||||
|  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN | ||||
|  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT | ||||
|  * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | ||||
|  *************************************************************************** | ||||
|  */ | ||||
|  | ||||
| #ifndef __NSS_CLMAP_STRINGS_H | ||||
| #define __NSS_CLMAP_STRINGS_H | ||||
|  | ||||
| #include "nss_clmap_stats.h" | ||||
|  | ||||
| extern struct nss_stats_info nss_clmap_strings_stats[NSS_CLMAP_INTERFACE_STATS_MAX]; | ||||
| extern void nss_clmap_strings_dentry_create(void); | ||||
|  | ||||
| #endif /* __NSS_CLMAP_STRINGS_H */ | ||||
| @@ -1,6 +1,6 @@ | ||||
| /* | ||||
|  ************************************************************************** | ||||
|  * Copyright (c) 2014-2020, The Linux Foundation. All rights reserved. | ||||
|  * Copyright (c) 2014-2021, The Linux Foundation. All rights reserved. | ||||
|  * Permission to use, copy, modify, and/or distribute this software for | ||||
|  * any purpose with or without fee is hereby granted, provided that the | ||||
|  * above copyright notice and this permission notice appear in all copies. | ||||
| @@ -197,8 +197,7 @@ bool nss_cmn_interface_is_redirect(struct nss_ctx_instance *nss_ctx, int32_t int | ||||
| { | ||||
| 	enum nss_dynamic_interface_type type = nss_dynamic_interface_get_type(nss_ctx, interface_num); | ||||
|  | ||||
| 	return type == NSS_DYNAMIC_INTERFACE_TYPE_WIFI | ||||
| 		|| type == NSS_DYNAMIC_INTERFACE_TYPE_GENERIC_REDIR_N2H | ||||
| 	return type == NSS_DYNAMIC_INTERFACE_TYPE_GENERIC_REDIR_N2H | ||||
| 		|| type == NSS_DYNAMIC_INTERFACE_TYPE_GENERIC_REDIR_H2N | ||||
| 		|| type == NSS_DYNAMIC_INTERFACE_TYPE_VIRTIF_DEPRECATED; | ||||
| } | ||||
|   | ||||
| @@ -1,6 +1,6 @@ | ||||
| /* | ||||
|  ************************************************************************** | ||||
|  * Copyright (c) 2013-2020, The Linux Foundation. All rights reserved. | ||||
|  * Copyright (c) 2013-2021, The Linux Foundation. All rights reserved. | ||||
|  * Permission to use, copy, modify, and/or distribute this software for | ||||
|  * any purpose with or without fee is hereby granted, provided that the | ||||
|  * above copyright notice and this permission notice appear in all copies. | ||||
| @@ -1064,6 +1064,21 @@ static inline void nss_core_rx_pbuf(struct nss_ctx_instance *nss_ctx, struct n2h | ||||
| 	} | ||||
| } | ||||
|  | ||||
| /* | ||||
|  * nss_core_set_skb_classify() | ||||
|  *	Set skb field to avoid ingress shaping. | ||||
|  */ | ||||
| static inline void nss_core_set_skb_classify(struct sk_buff *nbuf) | ||||
| { | ||||
| #ifdef CONFIG_NET_CLS_ACT | ||||
| #if (LINUX_VERSION_CODE < KERNEL_VERSION(5, 4, 0)) | ||||
| 		nbuf->tc_verd = SET_TC_NCLS_NSS(nbuf->tc_verd); | ||||
| #else | ||||
| 		skb_set_tc_classify_offload(nbuf); | ||||
| #endif | ||||
| #endif | ||||
| } | ||||
|  | ||||
| /* | ||||
|  * nss_core_handle_nrfrag_skb() | ||||
|  *	Handled the processing of fragmented skb's | ||||
| @@ -1111,20 +1126,16 @@ static inline bool nss_core_handle_nr_frag_skb(struct nss_ctx_instance *nss_ctx, | ||||
| 		nbuf->len = payload_len; | ||||
| 		nbuf->priority = desc->pri; | ||||
|  | ||||
| /* | ||||
|  * TODO: Remove kernel version check when IGS is ported | ||||
|  */ | ||||
| #if (LINUX_VERSION_CODE < KERNEL_VERSION(5, 4, 0)) | ||||
| #ifdef CONFIG_NET_CLS_ACT | ||||
| 		/* | ||||
| 		 * Skip the ingress QoS for the packet if the descriptor has | ||||
| 		 * ingress shaped flag set. | ||||
| 		 */ | ||||
| 		if (unlikely(desc->bit_flags & N2H_BIT_FLAG_INGRESS_SHAPED)) { | ||||
| 			nbuf->tc_verd = SET_TC_NCLS_NSS(nbuf->tc_verd); | ||||
| 			nss_core_set_skb_classify(nbuf); | ||||
| 		} | ||||
| #endif | ||||
| #endif | ||||
|  | ||||
| 		goto pull; | ||||
| 	} | ||||
|  | ||||
| @@ -1156,19 +1167,14 @@ static inline bool nss_core_handle_nr_frag_skb(struct nss_ctx_instance *nss_ctx, | ||||
| 		nbuf->len = payload_len; | ||||
| 		nbuf->priority = desc->pri; | ||||
|  | ||||
| /* | ||||
|  * TODO: Remove kernel version check when IGS is ported | ||||
|  */ | ||||
| #if (LINUX_VERSION_CODE < KERNEL_VERSION(5, 4, 0)) | ||||
| #ifdef CONFIG_NET_CLS_ACT | ||||
| 		/* | ||||
| 		 * Skip the ingress QoS for the packet if the descriptor has | ||||
| 		 * ingress shaped flag set. | ||||
| 		 */ | ||||
| 		if (unlikely(desc->bit_flags & N2H_BIT_FLAG_INGRESS_SHAPED)) { | ||||
| 			nbuf->tc_verd = SET_TC_NCLS_NSS(nbuf->tc_verd); | ||||
| 			nss_core_set_skb_classify(nbuf); | ||||
| 		} | ||||
| #endif | ||||
| #endif | ||||
|  | ||||
| 		/* | ||||
| @@ -1276,19 +1282,14 @@ static inline bool nss_core_handle_linear_skb(struct nss_ctx_instance *nss_ctx, | ||||
|  | ||||
| 		nbuf->priority = desc->pri; | ||||
|  | ||||
| /* | ||||
|  * TODO: Remove kernel version check when IGS is ported | ||||
|  */ | ||||
| #if (LINUX_VERSION_CODE < KERNEL_VERSION(5, 4, 0)) | ||||
| #ifdef CONFIG_NET_CLS_ACT | ||||
| 		/* | ||||
| 		 * Skip the ingress QoS for the packet if the descriptor has | ||||
| 		 * ingress shaped flag set. | ||||
| 		 */ | ||||
| 		if (unlikely(desc->bit_flags & N2H_BIT_FLAG_INGRESS_SHAPED)) { | ||||
| 			nbuf->tc_verd = SET_TC_NCLS_NSS(nbuf->tc_verd); | ||||
| 			nss_core_set_skb_classify(nbuf); | ||||
| 		} | ||||
| #endif | ||||
| #endif | ||||
|  | ||||
| 		/* | ||||
| @@ -1339,19 +1340,14 @@ static inline bool nss_core_handle_linear_skb(struct nss_ctx_instance *nss_ctx, | ||||
| 		nbuf->truesize = desc->payload_len; | ||||
| 		nbuf->priority = desc->pri; | ||||
|  | ||||
| /* | ||||
|  * TODO: Remove kernel version check when IGS is ported | ||||
|  */ | ||||
| #if (LINUX_VERSION_CODE < KERNEL_VERSION(5, 4, 0)) | ||||
| #ifdef CONFIG_NET_CLS_ACT | ||||
| 		/* | ||||
| 		 * Skip the ingress QoS for the packet if the descriptor has | ||||
| 		 * ingress shaped flag set. | ||||
| 		 */ | ||||
| 		if (unlikely(desc->bit_flags & N2H_BIT_FLAG_INGRESS_SHAPED)) { | ||||
| 			nbuf->tc_verd = SET_TC_NCLS_NSS(nbuf->tc_verd); | ||||
| 			nss_core_set_skb_classify(nbuf); | ||||
| 		} | ||||
| #endif | ||||
| #endif | ||||
|  | ||||
| 		*head_ptr = nbuf; | ||||
| @@ -1735,9 +1731,11 @@ static void nss_core_init_nss(struct nss_ctx_instance *nss_ctx, struct nss_if_me | ||||
| 		 * connections supported by the accelerator. | ||||
| 		 */ | ||||
| 		nss_ipv4_conn_cfg = max_ipv4_conn; | ||||
| #ifdef NSS_DRV_IPV6_ENABLE | ||||
| 		nss_ipv6_conn_cfg = max_ipv6_conn; | ||||
| 		nss_ipv4_update_conn_count(max_ipv4_conn); | ||||
| 		nss_ipv6_update_conn_count(max_ipv6_conn); | ||||
| #endif | ||||
| 		nss_ipv4_update_conn_count(max_ipv4_conn); | ||||
|  | ||||
| #ifdef NSS_MEM_PROFILE_LOW | ||||
| 		/* | ||||
|   | ||||
| @@ -1,6 +1,6 @@ | ||||
| /* | ||||
|  ************************************************************************** | ||||
|  * Copyright (c) 2013-2020, The Linux Foundation. All rights reserved. | ||||
|  * Copyright (c) 2013-2021, The Linux Foundation. All rights reserved. | ||||
|  * Permission to use, copy, modify, and/or distribute this software for | ||||
|  * any purpose with or without fee is hereby granted, provided that the | ||||
|  * above copyright notice and this permission notice appear in all copies. | ||||
| @@ -568,6 +568,7 @@ struct nss_top_instance { | ||||
| 	uint8_t mirror_handler_id; | ||||
| 	uint8_t wmdb_handler_id; | ||||
| 	uint8_t dma_handler_id; | ||||
| 	uint8_t udp_st_handler_id; | ||||
|  | ||||
| 	/* | ||||
| 	 * Data/Message callbacks for various interfaces | ||||
| @@ -903,6 +904,8 @@ struct nss_platform_data { | ||||
| 				/* Does this core handle TLS Tunnel ? */ | ||||
| 	enum nss_feature_enabled mirror_enabled; | ||||
| 				/* Does this core handle mirror? */ | ||||
| 	enum nss_feature_enabled udp_st_enabled; | ||||
| 				/* Does this core handle udp st? */ | ||||
| }; | ||||
| #endif | ||||
|  | ||||
|   | ||||
| @@ -21,6 +21,8 @@ | ||||
|  | ||||
| #include "nss_tx_rx_common.h" | ||||
| #include "nss_crypto_cmn.h" | ||||
| #include "nss_crypto_cmn_strings.h" | ||||
| #include "nss_crypto_cmn_stats.h" | ||||
| #include "nss_crypto_cmn_log.h" | ||||
|  | ||||
| /* | ||||
| @@ -94,6 +96,18 @@ static void nss_crypto_cmn_msg_handler(struct nss_ctx_instance *nss_ctx, struct | ||||
| 	 */ | ||||
| 	nss_crypto_cmn_log_rx_msg(nim); | ||||
|  | ||||
| 	switch (nim->cm.type) { | ||||
| 	case NSS_CRYPTO_CMN_MSG_TYPE_SYNC_NODE_STATS: | ||||
| 	case NSS_CRYPTO_CMN_MSG_TYPE_SYNC_ENG_STATS: | ||||
| 	case NSS_CRYPTO_CMN_MSG_TYPE_SYNC_CTX_STATS: | ||||
| 		/* | ||||
| 		 * Update driver statistics and send statistics | ||||
| 		 * notification to the registered modules. | ||||
| 		 */ | ||||
| 		nss_crypto_cmn_stats_sync(nss_ctx, &nim->msg.stats); | ||||
| 		nss_crypto_cmn_stats_notify(nss_ctx); | ||||
| 		break; | ||||
| 	} | ||||
| 	/* | ||||
| 	 * Load, Test & call | ||||
| 	 */ | ||||
| @@ -357,6 +371,9 @@ void nss_crypto_cmn_register_handler(void) | ||||
| 	sema_init(&g_nss_crypto_cmn.sem, 1); | ||||
| 	init_completion(&g_nss_crypto_cmn.complete); | ||||
| 	nss_core_register_handler(nss_ctx, NSS_CRYPTO_CMN_INTERFACE, nss_crypto_cmn_msg_handler, NULL); | ||||
|  | ||||
| 	nss_crypto_cmn_stats_dentry_create(); | ||||
| 	nss_crypto_cmn_strings_dentry_create(); | ||||
| } | ||||
|  | ||||
| /* | ||||
|   | ||||
							
								
								
									
										166
									
								
								feeds/ipq807x/qca-nss-drv/src/nss_crypto_cmn_stats.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										166
									
								
								feeds/ipq807x/qca-nss-drv/src/nss_crypto_cmn_stats.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,166 @@ | ||||
| /* | ||||
|  ************************************************************************** | ||||
|  * Copyright (c) 2020, The Linux Foundation. All rights reserved. | ||||
|  * Permission to use, copy, modify, and/or distribute this software for | ||||
|  * any purpose with or without fee is hereby granted, provided that the | ||||
|  * above copyright notice and this permission notice appear in all copies. | ||||
|  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES | ||||
|  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF | ||||
|  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR | ||||
|  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES | ||||
|  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN | ||||
|  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT | ||||
|  * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | ||||
|  ************************************************************************** | ||||
|  */ | ||||
|  | ||||
| #include "nss_core.h" | ||||
| #include "nss_crypto_cmn_stats.h" | ||||
| #include "nss_crypto_cmn_strings.h" | ||||
|  | ||||
| /* | ||||
|  * Declare atomic notifier data structure for statistics. | ||||
|  */ | ||||
| ATOMIC_NOTIFIER_HEAD(nss_crypto_cmn_stats_notifier); | ||||
|  | ||||
| /* | ||||
|  * Spinlock to protect CRYPTO_CMN statistics update/read | ||||
|  */ | ||||
| DEFINE_SPINLOCK(nss_crypto_cmn_stats_lock); | ||||
|  | ||||
| /* | ||||
|  * nss_crypto_cmn_stats | ||||
|  *	crypto common statistics | ||||
|  */ | ||||
| uint64_t nss_crypto_cmn_stats[NSS_CRYPTO_CMN_STATS_MAX]; | ||||
|  | ||||
| /* | ||||
|  * nss_crypto_cmn_stats_read() | ||||
|  *	Read crypto common statistics | ||||
|  */ | ||||
| static ssize_t nss_crypto_cmn_stats_read(struct file *fp, char __user *ubuf, size_t sz, loff_t *ppos) | ||||
| { | ||||
| 	int32_t i; | ||||
|  | ||||
| 	/* | ||||
| 	 * Max output lines = #stats + | ||||
| 	 * few blank lines for banner printing + Number of Extra outputlines | ||||
| 	 * for future reference to add new stats | ||||
| 	 */ | ||||
| 	uint32_t max_output_lines = NSS_CRYPTO_CMN_STATS_MAX + NSS_STATS_EXTRA_OUTPUT_LINES; | ||||
| 	size_t size_al = NSS_STATS_MAX_STR_LENGTH * max_output_lines; | ||||
| 	size_t size_wr = 0; | ||||
| 	ssize_t bytes_read = 0; | ||||
| 	uint64_t *stats_shadow; | ||||
|  | ||||
| 	char *lbuf = vzalloc(size_al); | ||||
| 	if (unlikely(!lbuf)) { | ||||
| 		nss_warning("Could not allocate memory for local statistics buffer"); | ||||
| 		return -ENOMEM; | ||||
| 	} | ||||
|  | ||||
| 	stats_shadow = vzalloc(NSS_CRYPTO_CMN_STATS_MAX * 8); | ||||
| 	if (unlikely(!stats_shadow)) { | ||||
| 		nss_warning("Could not allocate memory for local shadow buffer"); | ||||
| 		vfree(lbuf); | ||||
| 		return -ENOMEM; | ||||
| 	} | ||||
|  | ||||
| 	/* | ||||
| 	 * crypto common statistics | ||||
| 	 */ | ||||
| 	spin_lock_bh(&nss_crypto_cmn_stats_lock); | ||||
| 	for (i = 0; i < NSS_CRYPTO_CMN_STATS_MAX; i++) | ||||
| 		stats_shadow[i] = nss_crypto_cmn_stats[i]; | ||||
|  | ||||
| 	spin_unlock_bh(&nss_crypto_cmn_stats_lock); | ||||
| 	size_wr += nss_stats_banner(lbuf, size_wr, size_al, "crypto_cmn", NSS_STATS_SINGLE_CORE); | ||||
| 	size_wr += nss_stats_print("crypto_cmn", NULL, NSS_STATS_SINGLE_INSTANCE, nss_crypto_cmn_strings_stats, | ||||
| 					stats_shadow, NSS_CRYPTO_CMN_STATS_MAX, lbuf, size_wr, size_al); | ||||
|  | ||||
| 	bytes_read = simple_read_from_buffer(ubuf, sz, ppos, lbuf, strlen(lbuf)); | ||||
| 	vfree(lbuf); | ||||
| 	vfree(stats_shadow); | ||||
|  | ||||
| 	return bytes_read; | ||||
| } | ||||
|  | ||||
| /* | ||||
|  * nss_crypto_cmn_stats_ops | ||||
|  */ | ||||
| NSS_STATS_DECLARE_FILE_OPERATIONS(crypto_cmn); | ||||
|  | ||||
| /* | ||||
|  * nss_crypto_cmn_stats_dentry_create() | ||||
|  *	Create crypto common statistics debug entry. | ||||
|  */ | ||||
| void nss_crypto_cmn_stats_dentry_create(void) | ||||
| { | ||||
| 	nss_stats_create_dentry("crypto_cmn", &nss_crypto_cmn_stats_ops); | ||||
| } | ||||
|  | ||||
| /* | ||||
|  * nss_crypto_cmn_stats_sync() | ||||
|  *	Handle the syncing of NSS crypto common statistics. | ||||
|  */ | ||||
| void nss_crypto_cmn_stats_sync(struct nss_ctx_instance *nss_ctx, struct nss_crypto_cmn_stats *nct) | ||||
| { | ||||
| 	int j; | ||||
|  | ||||
| 	spin_lock_bh(&nss_crypto_cmn_stats_lock); | ||||
|  | ||||
| 	/* | ||||
| 	 * Common node stats | ||||
| 	 */ | ||||
| 	nss_crypto_cmn_stats[NSS_STATS_NODE_RX_PKTS] += nct->nstats.rx_packets; | ||||
| 	nss_crypto_cmn_stats[NSS_STATS_NODE_RX_BYTES] += nct->nstats.rx_bytes; | ||||
| 	nss_crypto_cmn_stats[NSS_STATS_NODE_TX_PKTS] += nct->nstats.tx_packets; | ||||
| 	nss_crypto_cmn_stats[NSS_STATS_NODE_TX_BYTES] += nct->nstats.tx_bytes; | ||||
|  | ||||
| 	for (j = 0; j < NSS_MAX_NUM_PRI; j++) | ||||
| 		nss_crypto_cmn_stats[NSS_STATS_NODE_RX_QUEUE_0_DROPPED + j] += nct->nstats.rx_dropped[j]; | ||||
|  | ||||
| 	/* | ||||
| 	 * crypto common statistics | ||||
| 	 */ | ||||
| 	nss_crypto_cmn_stats[NSS_CRYPTO_CMN_STATS_FAIL_VERSION] += nct->fail_version; | ||||
| 	nss_crypto_cmn_stats[NSS_CRYPTO_CMN_STATS_FAIL_CTX] += nct->fail_ctx; | ||||
| 	nss_crypto_cmn_stats[NSS_CRYPTO_CMN_STATS_FAIL_DMA] += nct->fail_dma; | ||||
|  | ||||
| 	spin_unlock_bh(&nss_crypto_cmn_stats_lock); | ||||
| } | ||||
|  | ||||
| /* | ||||
|  * nss_crypto_cmn_stats_notify() | ||||
|  *	Sends notifications to all the registered modules. | ||||
|  * | ||||
|  * Leverage NSS-FW statistics timing to update Netlink. | ||||
|  */ | ||||
| void nss_crypto_cmn_stats_notify(struct nss_ctx_instance *nss_ctx) | ||||
| { | ||||
| 	struct nss_crypto_cmn_stats_notification crypto_cmn_stats; | ||||
|  | ||||
| 	crypto_cmn_stats.core_id = nss_ctx->id; | ||||
| 	memcpy(crypto_cmn_stats.stats, nss_crypto_cmn_stats, sizeof(crypto_cmn_stats.stats)); | ||||
| 	atomic_notifier_call_chain(&nss_crypto_cmn_stats_notifier, NSS_STATS_EVENT_NOTIFY, &crypto_cmn_stats); | ||||
| } | ||||
|  | ||||
| /* | ||||
|  * nss_crypto_cmn_stats_register_notifier() | ||||
|  *	Registers statistics notifier. | ||||
|  */ | ||||
| int nss_crypto_cmn_stats_register_notifier(struct notifier_block *nb) | ||||
| { | ||||
| 	return atomic_notifier_chain_register(&nss_crypto_cmn_stats_notifier, nb); | ||||
| } | ||||
| EXPORT_SYMBOL(nss_crypto_cmn_stats_register_notifier); | ||||
|  | ||||
| /* | ||||
|  * nss_crypto_cmn_stats_unregister_notifier() | ||||
|  *	Deregisters statistics notifier. | ||||
|  */ | ||||
| int nss_crypto_cmn_stats_unregister_notifier(struct notifier_block *nb) | ||||
| { | ||||
| 	return atomic_notifier_chain_unregister(&nss_crypto_cmn_stats_notifier, nb); | ||||
| } | ||||
| EXPORT_SYMBOL(nss_crypto_cmn_stats_unregister_notifier); | ||||
							
								
								
									
										77
									
								
								feeds/ipq807x/qca-nss-drv/src/nss_crypto_cmn_stats.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										77
									
								
								feeds/ipq807x/qca-nss-drv/src/nss_crypto_cmn_stats.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,77 @@ | ||||
| /* | ||||
|  ****************************************************************************** | ||||
|  * Copyright (c) 2020, The Linux Foundation. All rights reserved. | ||||
|  * Permission to use, copy, modify, and/or distribute this software for | ||||
|  * any purpose with or without fee is hereby granted, provided that the | ||||
|  * above copyright notice and this permission notice appear in all copies. | ||||
|  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES | ||||
|  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF | ||||
|  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR | ||||
|  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES | ||||
|  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN | ||||
|  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT | ||||
|  * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | ||||
|  * **************************************************************************** | ||||
|  */ | ||||
|  | ||||
| #ifndef __NSS_CRYPTO_CMN_STATS_H | ||||
| #define __NSS_CRYPTO_CMN_STATS_H | ||||
|  | ||||
| #include <nss_cmn.h> | ||||
|  | ||||
| /** | ||||
|  * nss_crypto_cmn_stats_types | ||||
|  *	crypto common transmission node statistics | ||||
|  */ | ||||
| enum nss_crypto_cmn_stats_types { | ||||
| 	NSS_CRYPTO_CMN_STATS_FAIL_VERSION = NSS_STATS_NODE_MAX,	/* version mismatch failures */ | ||||
| 	NSS_CRYPTO_CMN_STATS_FAIL_CTX,				/* context related failures */ | ||||
| 	NSS_CRYPTO_CMN_STATS_FAIL_DMA,				/* dma descriptor full */ | ||||
| 	NSS_CRYPTO_CMN_STATS_MAX,				/* Maximum message type */ | ||||
| }; | ||||
|  | ||||
| /** | ||||
|  * nss_crypto_cmn_stats_notification | ||||
|  *	crypto common transmission statistics structure | ||||
|  */ | ||||
| struct nss_crypto_cmn_stats_notification { | ||||
| 	uint32_t core_id;				/* core ID */ | ||||
| 	uint64_t stats[NSS_CRYPTO_CMN_STATS_MAX];	/* transmission statistics */ | ||||
| }; | ||||
|  | ||||
| /* | ||||
|  * crypto common statistics APIs | ||||
|  */ | ||||
| extern void nss_crypto_cmn_stats_notify(struct nss_ctx_instance *nss_ctx); | ||||
| extern void nss_crypto_cmn_stats_sync(struct nss_ctx_instance *nss_ctx, struct nss_crypto_cmn_stats *nct); | ||||
| extern void nss_crypto_cmn_stats_dentry_create(void); | ||||
|  | ||||
| /** | ||||
|  * nss_crypto_cmn_stats_register_notifier | ||||
|  *	Registers a statistics notifier. | ||||
|  * | ||||
|  * @datatypes | ||||
|  * notifier_block | ||||
|  * | ||||
|  * @param[in] nb Notifier block. | ||||
|  * | ||||
|  * @return | ||||
|  * 0 on success or -2 on failure. | ||||
|  */ | ||||
| extern int nss_crypto_cmn_stats_register_notifier(struct notifier_block *nb); | ||||
|  | ||||
| /** | ||||
|  * nss_crypto_cmn_stats_unregister_notifier | ||||
|  *	Deregisters a statistics notifier. | ||||
|  * | ||||
|  * @datatypes | ||||
|  * notifier_block | ||||
|  * | ||||
|  * @param[in] nb Notifier block. | ||||
|  * | ||||
|  * @return | ||||
|  * 0 on success or -2 on failure. | ||||
|  */ | ||||
| extern int nss_crypto_cmn_stats_unregister_notifier(struct notifier_block *nb); | ||||
|  | ||||
| #endif /* __NSS_CRYPTO_CMN_STATS_H */ | ||||
							
								
								
									
										61
									
								
								feeds/ipq807x/qca-nss-drv/src/nss_crypto_cmn_strings.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										61
									
								
								feeds/ipq807x/qca-nss-drv/src/nss_crypto_cmn_strings.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,61 @@ | ||||
| /* | ||||
|  ************************************************************************** | ||||
|  * Copyright (c) 2020, The Linux Foundation. All rights reserved. | ||||
|  * Permission to use, copy, modify, and/or distribute this software for | ||||
|  * any purpose with or without fee is hereby granted, provided that the | ||||
|  * above copyright notice and this permission notice appear in all copies. | ||||
|  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES | ||||
|  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF | ||||
|  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR | ||||
|  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES | ||||
|  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN | ||||
|  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT | ||||
|  * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | ||||
|  ************************************************************************** | ||||
|  */ | ||||
|  | ||||
| #include "nss_stats.h" | ||||
| #include "nss_core.h" | ||||
| #include "nss_strings.h" | ||||
| #include "nss_crypto_cmn_strings.h" | ||||
|  | ||||
| /* | ||||
|  * nss_crypto_cmn_strings_stats | ||||
|  *	crypto common statistics strings. | ||||
|  */ | ||||
| struct nss_stats_info nss_crypto_cmn_strings_stats[NSS_CRYPTO_CMN_STATS_MAX] = { | ||||
| 	{"rx_pkts",		NSS_STATS_TYPE_COMMON}, | ||||
| 	{"rx_byts",		NSS_STATS_TYPE_COMMON}, | ||||
| 	{"tx_pkts",		NSS_STATS_TYPE_COMMON}, | ||||
| 	{"tx_byts",		NSS_STATS_TYPE_COMMON}, | ||||
| 	{"rx_queue[0]_drops",	NSS_STATS_TYPE_DROP}, | ||||
| 	{"rx_queue[1]_drops",	NSS_STATS_TYPE_DROP}, | ||||
| 	{"rx_queue[2]_drops",	NSS_STATS_TYPE_DROP}, | ||||
| 	{"rx_queue[3]_drops",	NSS_STATS_TYPE_DROP}, | ||||
| 	{"fail_version",	NSS_STATS_TYPE_SPECIAL}, | ||||
| 	{"fail_ctx",		NSS_STATS_TYPE_SPECIAL}, | ||||
| 	{"fail_dma",		NSS_STATS_TYPE_SPECIAL} | ||||
| }; | ||||
|  | ||||
| /* | ||||
|  * nss_crypto_cmn_strings_read() | ||||
|  *	Read crypto common node statistics names | ||||
|  */ | ||||
| static ssize_t nss_crypto_cmn_strings_read(struct file *fp, char __user *ubuf, size_t sz, loff_t *ppos) | ||||
| { | ||||
| 	return nss_strings_print(ubuf, sz, ppos, nss_crypto_cmn_strings_stats, NSS_CRYPTO_CMN_STATS_MAX); | ||||
| } | ||||
|  | ||||
| /* | ||||
|  * nss_crypto_cmn_strings_ops | ||||
|  */ | ||||
| NSS_STRINGS_DECLARE_FILE_OPERATIONS(crypto_cmn); | ||||
|  | ||||
| /* | ||||
|  * nss_crypto_cmn_strings_dentry_create() | ||||
|  *	Create crypto common statistics strings debug entry. | ||||
|  */ | ||||
| void nss_crypto_cmn_strings_dentry_create(void) | ||||
| { | ||||
| 	nss_strings_create_dentry("crypto_cmn", &nss_crypto_cmn_strings_ops); | ||||
| } | ||||
							
								
								
									
										25
									
								
								feeds/ipq807x/qca-nss-drv/src/nss_crypto_cmn_strings.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								feeds/ipq807x/qca-nss-drv/src/nss_crypto_cmn_strings.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,25 @@ | ||||
| /* | ||||
|  ************************************************************************** | ||||
|  * Copyright (c) 2020, The Linux Foundation. All rights reserved. | ||||
|  * Permission to use, copy, modify, and/or distribute this software for | ||||
|  * any purpose with or without fee is hereby granted, provided that the | ||||
|  * above copyright notice and this permission notice appear in all copies. | ||||
|  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES | ||||
|  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF | ||||
|  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR | ||||
|  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES | ||||
|  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN | ||||
|  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT | ||||
|  * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | ||||
|  ************************************************************************** | ||||
|  */ | ||||
|  | ||||
| #ifndef __NSS_CRYPTO_CMN_STRINGS_H | ||||
| #define __NSS_CRYPTO_CMN_STRINGS_H | ||||
|  | ||||
| #include "nss_crypto_cmn_stats.h" | ||||
|  | ||||
| extern struct nss_stats_info nss_crypto_cmn_strings_stats[NSS_CRYPTO_CMN_STATS_MAX]; | ||||
| extern void nss_crypto_cmn_strings_dentry_create(void); | ||||
|  | ||||
| #endif /* __NSS_CRYPTO_CMN_STRINGS_H */ | ||||
| @@ -17,6 +17,22 @@ | ||||
| #include "nss_phys_if.h" | ||||
| #include <nss_dp_api_if.h> | ||||
|  | ||||
| #if (LINUX_VERSION_CODE < KERNEL_VERSION(4, 5, 0)) | ||||
| #define NSS_DATA_PLANE_SUPPORTED_FEATURES (NETIF_F_HIGHDMA \ | ||||
| 					| NETIF_F_HW_CSUM \ | ||||
| 					| NETIF_F_RXCSUM \ | ||||
| 					| NETIF_F_SG \ | ||||
| 					| NETIF_F_FRAGLIST \ | ||||
| 					| (NETIF_F_TSO | NETIF_F_TSO6 | NETIF_F_UFO)) | ||||
| #else | ||||
| #define NSS_DATA_PLANE_SUPPORTED_FEATURES (NETIF_F_HIGHDMA \ | ||||
| 					| NETIF_F_HW_CSUM \ | ||||
| 					| NETIF_F_RXCSUM \ | ||||
| 					| NETIF_F_SG \ | ||||
| 					| NETIF_F_FRAGLIST \ | ||||
| 					| (NETIF_F_TSO | NETIF_F_TSO6)) | ||||
| #endif | ||||
|  | ||||
| /* | ||||
|  * nss_data_plane_param | ||||
|  */ | ||||
| @@ -33,5 +49,6 @@ struct nss_data_plane_param { | ||||
| void nss_data_plane_hal_add_dp_ops(struct nss_dp_data_plane_ops *dp_ops); | ||||
| void nss_data_plane_hal_register(struct nss_ctx_instance *nss_ctx); | ||||
| void nss_data_plane_hal_unregister(struct nss_ctx_instance *nss_ctx); | ||||
| void nss_data_plane_hal_set_features(struct nss_dp_data_plane_ctx *dpc); | ||||
| uint16_t nss_data_plane_hal_get_mtu_sz(uint16_t mtu); | ||||
| void nss_data_plane_hal_stats_sync(struct nss_data_plane_param *ndpp, struct nss_phys_if_stats *stats); | ||||
|   | ||||
| @@ -55,6 +55,23 @@ void nss_data_plane_hal_unregister(struct nss_ctx_instance *nss_ctx) | ||||
| { | ||||
| } | ||||
|  | ||||
| /* | ||||
|  * nss_data_plane_hal_set_features | ||||
|  */ | ||||
| void nss_data_plane_hal_set_features(struct nss_dp_data_plane_ctx *dpc) | ||||
| { | ||||
| 	dpc->dev->features |= NSS_DATA_PLANE_SUPPORTED_FEATURES; | ||||
| 	dpc->dev->hw_features |= NSS_DATA_PLANE_SUPPORTED_FEATURES; | ||||
| 	dpc->dev->wanted_features |= NSS_DATA_PLANE_SUPPORTED_FEATURES; | ||||
|  | ||||
| 	/* | ||||
| 	 * Synopsys GMAC does not support checksum offload for QinQ VLANs. | ||||
| 	 * Hence, we do not advertise checksum offload support for VLANs. | ||||
| 	 */ | ||||
| 	dpc->dev->vlan_features |= NSS_DATA_PLANE_SUPPORTED_FEATURES & | ||||
| 					(~(NETIF_F_RXCSUM | NETIF_F_HW_CSUM)); | ||||
| } | ||||
|  | ||||
| /* | ||||
|  * nss_data_plane_hal_stats_sync() | ||||
|  */ | ||||
|   | ||||
| @@ -83,6 +83,17 @@ void nss_data_plane_hal_unregister(struct nss_ctx_instance *nss_ctx) | ||||
| 					NSS_PTP_EVENT_SERVICE_CODE); | ||||
| } | ||||
|  | ||||
| /* | ||||
|  * nss_data_plane_hal_set_features | ||||
|  */ | ||||
| void nss_data_plane_hal_set_features(struct nss_dp_data_plane_ctx *dpc) | ||||
| { | ||||
| 	dpc->dev->features |= NSS_DATA_PLANE_SUPPORTED_FEATURES; | ||||
| 	dpc->dev->hw_features |= NSS_DATA_PLANE_SUPPORTED_FEATURES; | ||||
| 	dpc->dev->vlan_features |= NSS_DATA_PLANE_SUPPORTED_FEATURES; | ||||
| 	dpc->dev->wanted_features |= NSS_DATA_PLANE_SUPPORTED_FEATURES; | ||||
| } | ||||
|  | ||||
| /* | ||||
|  * nss_data_plane_hal_stats_sync() | ||||
|  */ | ||||
|   | ||||
| @@ -83,6 +83,17 @@ void nss_data_plane_hal_unregister(struct nss_ctx_instance *nss_ctx) | ||||
| 					NSS_PTP_EVENT_SERVICE_CODE); | ||||
| } | ||||
|  | ||||
| /* | ||||
|  * nss_data_plane_hal_set_features | ||||
|  */ | ||||
| void nss_data_plane_hal_set_features(struct nss_dp_data_plane_ctx *dpc) | ||||
| { | ||||
| 	dpc->dev->features |= NSS_DATA_PLANE_SUPPORTED_FEATURES; | ||||
| 	dpc->dev->hw_features |= NSS_DATA_PLANE_SUPPORTED_FEATURES; | ||||
| 	dpc->dev->vlan_features |= NSS_DATA_PLANE_SUPPORTED_FEATURES; | ||||
| 	dpc->dev->wanted_features |= NSS_DATA_PLANE_SUPPORTED_FEATURES; | ||||
| } | ||||
|  | ||||
| /* | ||||
|  * nss_data_plane_hal_stats_sync() | ||||
|  */ | ||||
|   | ||||
| @@ -19,22 +19,6 @@ | ||||
| #include "nss_tx_rx_common.h" | ||||
| #include "nss_data_plane_hal.h" | ||||
|  | ||||
| #if (LINUX_VERSION_CODE < KERNEL_VERSION(4, 5, 0)) | ||||
| #define NSS_DATA_PLANE_SUPPORTED_FEATURES (NETIF_F_HIGHDMA \ | ||||
| 					| NETIF_F_HW_CSUM \ | ||||
| 					| NETIF_F_RXCSUM \ | ||||
| 					| NETIF_F_SG \ | ||||
| 					| NETIF_F_FRAGLIST \ | ||||
| 					| (NETIF_F_TSO | NETIF_F_TSO6 | NETIF_F_UFO)) | ||||
| #else | ||||
| #define NSS_DATA_PLANE_SUPPORTED_FEATURES (NETIF_F_HIGHDMA \ | ||||
| 					| NETIF_F_HW_CSUM \ | ||||
| 					| NETIF_F_RXCSUM \ | ||||
| 					| NETIF_F_SG \ | ||||
| 					| NETIF_F_FRAGLIST \ | ||||
| 					| (NETIF_F_TSO | NETIF_F_TSO6)) | ||||
| #endif | ||||
|  | ||||
| /* | ||||
|  * nss_data_plane_param | ||||
|  */ | ||||
| @@ -228,10 +212,7 @@ drop: | ||||
|  */ | ||||
| static void __nss_data_plane_set_features(struct nss_dp_data_plane_ctx *dpc) | ||||
| { | ||||
| 	dpc->dev->features |= NSS_DATA_PLANE_SUPPORTED_FEATURES; | ||||
| 	dpc->dev->hw_features |= NSS_DATA_PLANE_SUPPORTED_FEATURES; | ||||
| 	dpc->dev->vlan_features |= NSS_DATA_PLANE_SUPPORTED_FEATURES; | ||||
| 	dpc->dev->wanted_features |= NSS_DATA_PLANE_SUPPORTED_FEATURES; | ||||
| 	nss_data_plane_hal_set_features(dpc); | ||||
| } | ||||
|  | ||||
| /* | ||||
|   | ||||
| @@ -1,6 +1,6 @@ | ||||
| /* | ||||
|  ************************************************************************** | ||||
|  * Copyright (c) 2020, The Linux Foundation. All rights reserved. | ||||
|  * Copyright (c) 2020-2021, The Linux Foundation. All rights reserved. | ||||
|  * | ||||
|  * Permission to use, copy, modify, and/or distribute this software for | ||||
|  * any purpose with or without fee is hereby granted, provided that the | ||||
| @@ -120,7 +120,7 @@ static void nss_dma_msg_handler(struct nss_ctx_instance *nss_ctx, struct nss_cmn | ||||
| 	 */ | ||||
| 	if (ndm->cm.type == NSS_DMA_MSG_TYPE_SYNC_STATS) { | ||||
| 		nss_dma_stats_sync(nss_ctx, &ndm->msg.stats); | ||||
|  | ||||
| 		nss_dma_stats_notify(nss_ctx); | ||||
| 	} | ||||
|  | ||||
| 	/* | ||||
|   | ||||
| @@ -1,6 +1,6 @@ | ||||
| /* | ||||
|  ************************************************************************** | ||||
|  * Copyright (c) 2020, The Linux Foundation. All rights reserved. | ||||
|  * Copyright (c) 2020-2021, The Linux Foundation. All rights reserved. | ||||
|  * | ||||
|  * Permission to use, copy, modify, and/or distribute this software for | ||||
|  * any purpose with or without fee is hereby granted, provided that the | ||||
| @@ -17,9 +17,15 @@ | ||||
|  */ | ||||
|  | ||||
| #include "nss_core.h" | ||||
| #include "nss_dma.h" | ||||
| #include "nss_dma_stats.h" | ||||
| #include "nss_dma_strings.h" | ||||
|  | ||||
| /* | ||||
|  * Declare atomic notifier data structure for statistics. | ||||
|  */ | ||||
| ATOMIC_NOTIFIER_HEAD(nss_dma_stats_notifier); | ||||
|  | ||||
| /* | ||||
|  * Spinlock to protect DMA statistics update/read | ||||
|  */ | ||||
| @@ -117,3 +123,41 @@ void nss_dma_stats_sync(struct nss_ctx_instance *nss_ctx, struct nss_dma_stats * | ||||
|  | ||||
| 	spin_unlock_bh(&nss_dma_stats_lock); | ||||
| } | ||||
|  | ||||
| /* | ||||
|  * nss_dma_stats_notify() | ||||
|  *	Sends notifications to all the registered modules. | ||||
|  * | ||||
|  * Leverage NSS-FW statistics timing to update Netlink. | ||||
|  */ | ||||
| void nss_dma_stats_notify(struct nss_ctx_instance *nss_ctx) | ||||
| { | ||||
| 	struct nss_dma_stats_notification dma_stats; | ||||
|  | ||||
| 	spin_lock_bh(&nss_dma_stats_lock); | ||||
| 	dma_stats.core_id = nss_ctx->id; | ||||
| 	memcpy(dma_stats.stats_ctx, nss_dma_stats, sizeof(dma_stats.stats_ctx)); | ||||
| 	spin_unlock_bh(&nss_dma_stats_lock); | ||||
|  | ||||
| 	atomic_notifier_call_chain(&nss_dma_stats_notifier, NSS_STATS_EVENT_NOTIFY, &dma_stats); | ||||
| } | ||||
|  | ||||
| /* | ||||
|  * nss_dma_stats_unregister_notifier() | ||||
|  *	Deregisters statistics notifier. | ||||
|  */ | ||||
| int nss_dma_stats_unregister_notifier(struct notifier_block *nb) | ||||
| { | ||||
| 	return atomic_notifier_chain_unregister(&nss_dma_stats_notifier, nb); | ||||
| } | ||||
| EXPORT_SYMBOL(nss_dma_stats_unregister_notifier); | ||||
|  | ||||
| /* | ||||
|  * nss_dma_stats_register_notifier() | ||||
|  *	Registers statistics notifier. | ||||
|  */ | ||||
| int nss_dma_stats_register_notifier(struct notifier_block *nb) | ||||
| { | ||||
| 	return atomic_notifier_chain_register(&nss_dma_stats_notifier, nb); | ||||
| } | ||||
| EXPORT_SYMBOL(nss_dma_stats_register_notifier); | ||||
|   | ||||
| @@ -1,6 +1,6 @@ | ||||
| /* | ||||
|  ****************************************************************************** | ||||
|  * Copyright (c) 2020, The Linux Foundation. All rights reserved. | ||||
|  * Copyright (c) 2020-2021, The Linux Foundation. All rights reserved. | ||||
|  * | ||||
|  * Permission to use, copy, modify, and/or distribute this software for | ||||
|  * any purpose with or without fee is hereby granted, provided that the | ||||
| @@ -21,44 +21,10 @@ | ||||
|  | ||||
| #include <nss_cmn.h> | ||||
|  | ||||
| /** | ||||
|  * nss_dma_stats_types | ||||
|  *	DMA node statistics. | ||||
|  */ | ||||
| enum nss_dma_stats_types { | ||||
| 	NSS_DMA_STATS_NO_REQ = NSS_STATS_NODE_MAX,	/**< Request descriptor not available. */ | ||||
| 	NSS_DMA_STATS_NO_DESC,				/**< DMA descriptors not available. */ | ||||
| 	NSS_DMA_STATS_NEXTHOP,				/**< Failed to retrive next hop. */ | ||||
| 	NSS_DMA_STATS_FAIL_NEXTHOP_QUEUE,		/**< Failed to queue next hop. */ | ||||
| 	NSS_DMA_STATS_FAIL_LINEAR_SZ,			/**< Failed to get memory for linearization. */ | ||||
| 	NSS_DMA_STATS_FAIL_LINEAR_ALLOC,		/**< Failed to allocate buffer for linearization. */ | ||||
| 	NSS_DMA_STATS_FAIL_LINEAR_NO_SG,		/**< Skip linearization due to non-SG packet. */ | ||||
| 	NSS_DMA_STATS_FAIL_SPLIT_SZ,			/**< Failed to spliting buffer into multiple buffers. */ | ||||
| 	NSS_DMA_STATS_FAIL_SPLIT_ALLOC,			/**< Failed to allocate buffer for split. */ | ||||
| 	NSS_DMA_STATS_FAIL_SYNC_ALLOC,			/**< Failed to allocate buffer for sending statistics. */ | ||||
| 	NSS_DMA_STATS_FAIL_CTX_ACTIVE,			/**< Failed to queue as the node is not active. */ | ||||
| 	NSS_DMA_STATS_FAIL_HW_E0,			/**< Failed to process in HW, error code E0. */ | ||||
| 	NSS_DMA_STATS_FAIL_HW_E1,			/**< Failed to process in HW, error code E1. */ | ||||
| 	NSS_DMA_STATS_FAIL_HW_E2,			/**< Failed to process in HW, error code E2. */ | ||||
| 	NSS_DMA_STATS_FAIL_HW_E3,			/**< Failed to process in HW, error code E3. */ | ||||
| 	NSS_DMA_STATS_FAIL_HW_E4,			/**< Failed to process in HW, error code E4. */ | ||||
| 	NSS_DMA_STATS_FAIL_HW_E5,			/**< Failed to process in HW, error code E5. */ | ||||
| 	NSS_DMA_STATS_FAIL_HW_E6,			/**< Failed to process in HW, error code E6. */ | ||||
| 	NSS_DMA_STATS_FAIL_HW_E7,			/**< Failed to process in HW, error code E7. */ | ||||
| 	NSS_DMA_STATS_FAIL_HW_E8,			/**< Failed to process in HW, error code E8. */ | ||||
| 	NSS_DMA_STATS_FAIL_HW_E9,			/**< Failed to process in HW, error code E9. */ | ||||
| 	NSS_DMA_STATS_FAIL_HW_E10,			/**< Failed to process in HW, error code E10. */ | ||||
| 	NSS_DMA_STATS_FAIL_HW_E11,			/**< Failed to process in HW, error code E11. */ | ||||
| 	NSS_DMA_STATS_FAIL_HW_E12,			/**< Failed to process in HW, error code E12. */ | ||||
| 	NSS_DMA_STATS_FAIL_HW_E13,			/**< Failed to process in HW, error code E13. */ | ||||
| 	NSS_DMA_STATS_FAIL_HW_E14,			/**< Failed to process in HW, error code E14. */ | ||||
| 	NSS_DMA_STATS_FAIL_HW_E15,			/**< Failed to process in HW, error code E15. */ | ||||
| 	NSS_DMA_STATS_MAX,				/**< Maximum message type. */ | ||||
| }; | ||||
|  | ||||
| /* | ||||
|  * DMA statistics APIs | ||||
|  */ | ||||
| extern void nss_dma_stats_notify(struct nss_ctx_instance *nss_ctx); | ||||
| extern void nss_dma_stats_sync(struct nss_ctx_instance *nss_ctx, struct nss_dma_stats *nds); | ||||
| extern void nss_dma_stats_dentry_create(void); | ||||
|  | ||||
|   | ||||
| @@ -1,6 +1,6 @@ | ||||
| /* | ||||
|  ************************************************************************** | ||||
|  * Copyright (c) 2017-2020, The Linux Foundation. All rights reserved. | ||||
|  * Copyright (c) 2017-2021, The Linux Foundation. All rights reserved. | ||||
|  * Permission to use, copy, modify, and/or distribute this software for | ||||
|  * any purpose with or without fee is hereby granted, provided that the | ||||
|  * above copyright notice and this permission notice appear in all copies. | ||||
| @@ -16,106 +16,22 @@ | ||||
|  | ||||
| #include "nss_tx_rx_common.h" | ||||
| #include "nss_dtls_cmn_log.h" | ||||
| #include "nss_dtls_cmn_stats.h" | ||||
| #include "nss_dtls_cmn_strings.h" | ||||
|  | ||||
| #define NSS_DTLS_CMN_TX_TIMEOUT 3000 /* 3 Seconds */ | ||||
| #define NSS_DTLS_CMN_INTERFACE_MAX_LONG BITS_TO_LONGS(NSS_MAX_NET_INTERFACES) | ||||
| #define NSS_DTLS_CMN_STATS_MAX_LINES (NSS_STATS_NODE_MAX + 32) | ||||
| #define NSS_DTLS_CMN_STATS_SIZE_PER_IF (NSS_STATS_MAX_STR_LENGTH * NSS_DTLS_CMN_STATS_MAX_LINES) | ||||
|  | ||||
| /* | ||||
|  * Private data structure. | ||||
|  */ | ||||
| static struct nss_dtls_cmn_cmn_pvt { | ||||
| static struct nss_dtls_cmn_pvt { | ||||
| 	struct semaphore sem; | ||||
| 	struct completion complete; | ||||
| 	enum nss_dtls_cmn_error resp; | ||||
| 	unsigned long if_map[NSS_DTLS_CMN_INTERFACE_MAX_LONG]; | ||||
| } dtls_cmn_pvt; | ||||
|  | ||||
| /* | ||||
|  * nss_dtls_cmn_stats_sync() | ||||
|  *	Update dtls_cmn node statistics. | ||||
|  */ | ||||
| static void nss_dtls_cmn_stats_sync(struct nss_ctx_instance *nss_ctx, struct nss_cmn_msg *ncm) | ||||
| { | ||||
| 	struct nss_dtls_cmn_msg *ndcm = (struct nss_dtls_cmn_msg *)ncm; | ||||
| 	struct nss_top_instance *nss_top = nss_ctx->nss_top; | ||||
| 	struct nss_dtls_cmn_ctx_stats *msg_stats = &ndcm->msg.stats; | ||||
| 	uint64_t *if_stats; | ||||
|  | ||||
| 	spin_lock_bh(&nss_top->stats_lock); | ||||
|  | ||||
| 	/* | ||||
| 	 * Update common node stats, | ||||
| 	 * Note: DTLS only supports a single queue for RX. | ||||
| 	 */ | ||||
| 	if_stats = nss_top->stats_node[ncm->interface]; | ||||
| 	if_stats[NSS_STATS_NODE_RX_PKTS] += msg_stats->pkt.rx_packets; | ||||
| 	if_stats[NSS_STATS_NODE_RX_BYTES] += msg_stats->pkt.rx_bytes; | ||||
| 	if_stats[NSS_STATS_NODE_RX_QUEUE_0_DROPPED] += msg_stats->pkt.rx_dropped[0]; | ||||
|  | ||||
| 	if_stats[NSS_STATS_NODE_TX_PKTS] += msg_stats->pkt.tx_packets; | ||||
| 	if_stats[NSS_STATS_NODE_TX_BYTES] += msg_stats->pkt.tx_bytes; | ||||
|  | ||||
| 	spin_unlock_bh(&nss_top->stats_lock); | ||||
| } | ||||
|  | ||||
| /* | ||||
|  * nss_dtls_cmn_stats_read() | ||||
|  *	Read dtls_cmn node statiistics. | ||||
|  */ | ||||
| static ssize_t nss_dtls_cmn_stats_read(struct file *fp, char __user *ubuf, size_t sz, loff_t *ppos) | ||||
| { | ||||
| 	struct nss_ctx_instance *nss_ctx = nss_dtls_cmn_get_context(); | ||||
| 	enum nss_dynamic_interface_type type; | ||||
| 	ssize_t bytes_read = 0; | ||||
| 	size_t len = 0, size; | ||||
| 	uint32_t if_num; | ||||
| 	char *buf; | ||||
|  | ||||
| 	size = NSS_DTLS_CMN_STATS_SIZE_PER_IF * bitmap_weight(dtls_cmn_pvt.if_map, NSS_MAX_NET_INTERFACES); | ||||
|  | ||||
| 	buf = kzalloc(size, GFP_KERNEL); | ||||
| 	if (!buf) { | ||||
| 		nss_warning("Could not allocate memory for local statistics buffer"); | ||||
| 		return 0; | ||||
| 	} | ||||
|  | ||||
| 	/* | ||||
| 	 * Common node stats for each DTLS dynamic interface. | ||||
| 	 */ | ||||
| 	for_each_set_bit(if_num, dtls_cmn_pvt.if_map, NSS_MAX_NET_INTERFACES) { | ||||
|  | ||||
| 		type = nss_dynamic_interface_get_type(nss_ctx, if_num); | ||||
|  | ||||
| 		switch (type) { | ||||
| 		case NSS_DYNAMIC_INTERFACE_TYPE_DTLS_CMN_INNER: | ||||
| 			len += scnprintf(buf + len, size - len, "\nInner if_num:%03u", if_num); | ||||
| 			break; | ||||
|  | ||||
| 		case NSS_DYNAMIC_INTERFACE_TYPE_DTLS_CMN_OUTER: | ||||
| 			len += scnprintf(buf + len, size - len, "\nOuter if_num:%03u", if_num); | ||||
| 			break; | ||||
|  | ||||
| 		default: | ||||
| 			len += scnprintf(buf + len, size - len, "\nUnknown(%d) if_num:%03u", type, if_num); | ||||
| 			break; | ||||
| 		} | ||||
|  | ||||
| 		len += scnprintf(buf + len, size - len, "\n-------------------\n"); | ||||
| 		len += nss_stats_fill_common_stats(if_num, NSS_STATS_SINGLE_INSTANCE, buf, len, size - len, "dtls_cmn"); | ||||
| 	} | ||||
|  | ||||
| 	bytes_read = simple_read_from_buffer(ubuf, sz, ppos, buf, len); | ||||
| 	kfree(buf); | ||||
|  | ||||
| 	return bytes_read; | ||||
| } | ||||
|  | ||||
| /* | ||||
|  * nss_dtls_cmn_stats_ops. | ||||
|  */ | ||||
| NSS_STATS_DECLARE_FILE_OPERATIONS(dtls_cmn) | ||||
|  | ||||
| /* | ||||
|  * nss_dtls_cmn_verify_ifnum() | ||||
|  *	Verify if the interface number is a DTLS interface. | ||||
| @@ -162,8 +78,10 @@ static void nss_dtls_cmn_handler(struct nss_ctx_instance *nss_ctx, struct nss_cm | ||||
| 		return; | ||||
| 	} | ||||
|  | ||||
| 	if (ncm->type == NSS_DTLS_CMN_MSG_TYPE_SYNC_STATS) | ||||
| 	if (ncm->type == NSS_DTLS_CMN_MSG_TYPE_SYNC_STATS) { | ||||
| 		nss_dtls_cmn_stats_sync(nss_ctx, ncm); | ||||
| 		nss_dtls_cmn_stats_notify(nss_ctx, ncm->interface); | ||||
| 	} | ||||
|  | ||||
| 	/* | ||||
| 	 * Update the callback and app_data for NOTIFY messages. | ||||
| @@ -220,6 +138,15 @@ static void nss_dtls_cmn_callback(void *app_data, struct nss_cmn_msg *ncm) | ||||
| 	return; | ||||
| } | ||||
|  | ||||
| /* | ||||
|  * nss_dtls_cmn_ifmap_get() | ||||
|  *	Return DTLS common active interfaces map. | ||||
|  */ | ||||
| unsigned long *nss_dtls_cmn_ifmap_get(void) | ||||
| { | ||||
| 	return dtls_cmn_pvt.if_map; | ||||
| } | ||||
|  | ||||
| /* | ||||
|  * nss_dtls_cmn_tx_buf() | ||||
|  *	Transmit buffer over DTLS interface. | ||||
| @@ -519,5 +446,6 @@ void nss_dtls_cmn_register_handler(void) | ||||
| { | ||||
| 	sema_init(&dtls_cmn_pvt.sem, 1); | ||||
| 	init_completion(&dtls_cmn_pvt.complete); | ||||
| 	nss_stats_create_dentry("dtls_cmn", &nss_dtls_cmn_stats_ops); | ||||
| 	nss_dtls_cmn_stats_dentry_create(); | ||||
| 	nss_dtls_cmn_strings_dentry_create(); | ||||
| } | ||||
|   | ||||
							
								
								
									
										215
									
								
								feeds/ipq807x/qca-nss-drv/src/nss_dtls_cmn_stats.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										215
									
								
								feeds/ipq807x/qca-nss-drv/src/nss_dtls_cmn_stats.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,215 @@ | ||||
| /* | ||||
|  *************************************************************************** | ||||
|  * Copyright (c) 2020-2021, The Linux Foundation. All rights reserved. | ||||
|  * Permission to use, copy, modify, and/or distribute this software for | ||||
|  * any purpose with or without fee is hereby granted, provided that the | ||||
|  * above copyright notice and this permission notice appear in all copies. | ||||
|  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES | ||||
|  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF | ||||
|  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR | ||||
|  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES | ||||
|  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN | ||||
|  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT | ||||
|  * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | ||||
|  *************************************************************************** | ||||
|  */ | ||||
|  | ||||
| #include "nss_core.h" | ||||
| #include "nss_dtls_cmn.h" | ||||
| #include "nss_dtls_cmn_stats.h" | ||||
| #include "nss_dtls_cmn_strings.h" | ||||
|  | ||||
| /* | ||||
|  * Declare atomic notifier data structure for statistics. | ||||
|  */ | ||||
| ATOMIC_NOTIFIER_HEAD(nss_dtls_cmn_stats_notifier); | ||||
|  | ||||
| /* | ||||
|  * Spinlock to protect dtls common statistics update/read | ||||
|  */ | ||||
| DEFINE_SPINLOCK(nss_dtls_cmn_stats_lock); | ||||
|  | ||||
| unsigned long *nss_dtls_cmn_ifmap_get(void); | ||||
|  | ||||
| /* | ||||
|  * nss_dtls_cmn_ctx_stats | ||||
|  *	dtls common ctx statistics | ||||
|  */ | ||||
| uint64_t nss_dtls_cmn_ctx_stats[NSS_MAX_NET_INTERFACES][NSS_DTLS_CMN_CTX_STATS_MAX]; | ||||
|  | ||||
| /* | ||||
|  * nss_dtls_cmn_stats_iface_type() | ||||
|  *	Return a string for each interface type. | ||||
|  */ | ||||
| static const char *nss_dtls_cmn_stats_iface_type(enum nss_dynamic_interface_type type) | ||||
| { | ||||
| 	switch (type) { | ||||
| 	case NSS_DYNAMIC_INTERFACE_TYPE_DTLS_CMN_INNER: | ||||
| 		return "dtls_cmn_inner"; | ||||
|  | ||||
| 	case NSS_DYNAMIC_INTERFACE_TYPE_DTLS_CMN_OUTER: | ||||
| 		return "dtls_cmn_outer"; | ||||
|  | ||||
| 	default: | ||||
| 		return "invalid_interface"; | ||||
|  | ||||
| 	} | ||||
| } | ||||
|  | ||||
| /* | ||||
|  * nss_dtls_cmn_stats_read() | ||||
|  *	Read dtls common node statistics. | ||||
|  */ | ||||
| static ssize_t nss_dtls_cmn_stats_read(struct file *fp, char __user *ubuf, size_t sz, loff_t *ppos) | ||||
| { | ||||
| 	/* | ||||
| 	 * Max output lines = #stats + | ||||
| 	 * few blank lines for banner printing + Number of Extra outputlines | ||||
| 	 * for future reference to add new stats | ||||
| 	 */ | ||||
| 	uint32_t max_output_lines = NSS_DTLS_CMN_CTX_STATS_MAX + NSS_STATS_EXTRA_OUTPUT_LINES; | ||||
| 	size_t size_al = NSS_STATS_MAX_STR_LENGTH * max_output_lines; | ||||
| 	struct nss_ctx_instance *nss_ctx = nss_dtls_cmn_get_context(); | ||||
| 	enum nss_dynamic_interface_type type; | ||||
| 	unsigned long *ifmap; | ||||
| 	uint64_t *stats_shadow; | ||||
| 	ssize_t bytes_read = 0; | ||||
| 	size_t size_wr = 0; | ||||
| 	uint32_t if_num; | ||||
| 	int32_t i; | ||||
| 	int count; | ||||
| 	char *lbuf; | ||||
|  | ||||
| 	ifmap = nss_dtls_cmn_ifmap_get(); | ||||
| 	count = bitmap_weight(ifmap, NSS_MAX_NET_INTERFACES); | ||||
| 	if (count) { | ||||
| 		size_al = size_al * count; | ||||
| 	} | ||||
|  | ||||
| 	lbuf = vzalloc(size_al); | ||||
| 	if (unlikely(!lbuf)) { | ||||
| 		nss_warning("Could not allocate memory for local statistics buffer"); | ||||
| 		return -ENOMEM; | ||||
| 	} | ||||
|  | ||||
| 	stats_shadow = vzalloc(NSS_DTLS_CMN_CTX_STATS_MAX * 8); | ||||
| 	if (unlikely(!stats_shadow)) { | ||||
| 		nss_warning("Could not allocate memory for local shadow buffer"); | ||||
| 		vfree(lbuf); | ||||
| 		return -ENOMEM; | ||||
| 	} | ||||
|  | ||||
| 	/* | ||||
| 	 * Common node stats for each DTLS dynamic interface. | ||||
| 	 */ | ||||
| 	size_wr += nss_stats_banner(lbuf, size_wr, size_al, "dtls_cmn stats", NSS_STATS_SINGLE_CORE); | ||||
| 	for_each_set_bit(if_num, ifmap, NSS_MAX_NET_INTERFACES) { | ||||
|  | ||||
| 		type = nss_dynamic_interface_get_type(nss_ctx, if_num); | ||||
| 		if ((type != NSS_DYNAMIC_INTERFACE_TYPE_DTLS_CMN_INNER) && | ||||
| 			(type != NSS_DYNAMIC_INTERFACE_TYPE_DTLS_CMN_OUTER)) { | ||||
| 			continue; | ||||
| 		} | ||||
|  | ||||
| 		spin_lock_bh(&nss_dtls_cmn_stats_lock); | ||||
| 		for (i = 0; i < NSS_DTLS_CMN_CTX_STATS_MAX; i++) { | ||||
| 			stats_shadow[i] = nss_dtls_cmn_ctx_stats[if_num][i]; | ||||
| 		} | ||||
| 		spin_unlock_bh(&nss_dtls_cmn_stats_lock); | ||||
|  | ||||
| 		size_wr += scnprintf(lbuf + size_wr, size_al - size_wr, "\n%s if_num:%03u\n", | ||||
| 					nss_dtls_cmn_stats_iface_type(type), if_num); | ||||
| 		size_wr += nss_stats_print("dtls_cmn", NULL, NSS_STATS_SINGLE_INSTANCE, nss_dtls_cmn_ctx_stats_str, | ||||
| 						stats_shadow, NSS_DTLS_CMN_CTX_STATS_MAX, lbuf, size_wr, size_al); | ||||
| 	} | ||||
|  | ||||
| 	bytes_read = simple_read_from_buffer(ubuf, sz, ppos, lbuf, strlen(lbuf)); | ||||
| 	vfree(lbuf); | ||||
| 	vfree(stats_shadow); | ||||
|  | ||||
| 	return bytes_read; | ||||
| } | ||||
|  | ||||
| /* | ||||
|  * nss_dtls_cmn_stats_ops. | ||||
|  */ | ||||
| NSS_STATS_DECLARE_FILE_OPERATIONS(dtls_cmn); | ||||
|  | ||||
| /* | ||||
|  * nss_dtls_cmn_stats_dentry_create() | ||||
|  *	Create dtls common statistics debug entry. | ||||
|  */ | ||||
| void nss_dtls_cmn_stats_dentry_create(void) | ||||
| { | ||||
| 	nss_stats_create_dentry("dtls_cmn", &nss_dtls_cmn_stats_ops); | ||||
| } | ||||
|  | ||||
| /* | ||||
|  * nss_dtls_cmn_stats_sync() | ||||
|  *	Update dtls common node statistics. | ||||
|  */ | ||||
| void nss_dtls_cmn_stats_sync(struct nss_ctx_instance *nss_ctx, struct nss_cmn_msg *ncm) | ||||
| { | ||||
| 	struct nss_dtls_cmn_msg *ndcm = (struct nss_dtls_cmn_msg *)ncm; | ||||
| 	struct nss_dtls_cmn_ctx_stats *ndccs = &ndcm->msg.stats; | ||||
| 	uint64_t *ctx_stats; | ||||
| 	uint32_t *msg_stats; | ||||
| 	uint16_t i = 0; | ||||
|  | ||||
| 	spin_lock_bh(&nss_dtls_cmn_stats_lock); | ||||
|  | ||||
| 	msg_stats = (uint32_t *)ndccs; | ||||
| 	ctx_stats = nss_dtls_cmn_ctx_stats[ncm->interface]; | ||||
|  | ||||
| 	for (i = 0; i < NSS_DTLS_CMN_CTX_STATS_MAX; i++, ctx_stats++, msg_stats++) { | ||||
| 		*ctx_stats += *msg_stats; | ||||
| 	} | ||||
|  | ||||
| 	spin_unlock_bh(&nss_dtls_cmn_stats_lock); | ||||
| } | ||||
|  | ||||
| /* | ||||
|  * nss_dtls_cmn_stats_notify() | ||||
|  *	Sends notifications to all the registered modules. | ||||
|  * | ||||
|  * Leverage NSS-FW statistics timing to update Netlink. | ||||
|  */ | ||||
| void nss_dtls_cmn_stats_notify(struct nss_ctx_instance *nss_ctx, uint32_t if_num) | ||||
| { | ||||
| 	struct nss_dtls_cmn_stats_notification *dtls_cmn_stats; | ||||
|  | ||||
| 	dtls_cmn_stats = kmalloc(sizeof(struct nss_dtls_cmn_stats_notification), GFP_ATOMIC); | ||||
| 	if (!dtls_cmn_stats) { | ||||
| 		nss_warning("Unable to allocate memory for stats notification\n"); | ||||
| 		return; | ||||
| 	} | ||||
|  | ||||
| 	spin_lock_bh(&nss_dtls_cmn_stats_lock); | ||||
| 	dtls_cmn_stats->core_id = nss_ctx->id; | ||||
| 	dtls_cmn_stats->if_num = if_num; | ||||
| 	memcpy(dtls_cmn_stats->stats_ctx, nss_dtls_cmn_ctx_stats[if_num], sizeof(dtls_cmn_stats->stats_ctx)); | ||||
| 	spin_unlock_bh(&nss_dtls_cmn_stats_lock); | ||||
|  | ||||
| 	atomic_notifier_call_chain(&nss_dtls_cmn_stats_notifier, NSS_STATS_EVENT_NOTIFY, dtls_cmn_stats); | ||||
| 	kfree(dtls_cmn_stats); | ||||
| } | ||||
|  | ||||
| /* | ||||
|  * nss_dtls_cmn_stats_unregister_notifier() | ||||
|  *	Deregisters statistics notifier. | ||||
|  */ | ||||
| int nss_dtls_cmn_stats_unregister_notifier(struct notifier_block *nb) | ||||
| { | ||||
| 	return atomic_notifier_chain_unregister(&nss_dtls_cmn_stats_notifier, nb); | ||||
| } | ||||
| EXPORT_SYMBOL(nss_dtls_cmn_stats_unregister_notifier); | ||||
|  | ||||
| /* | ||||
|  * nss_dtls_cmn_stats_register_notifier() | ||||
|  *	Registers statistics notifier. | ||||
|  */ | ||||
| int nss_dtls_cmn_stats_register_notifier(struct notifier_block *nb) | ||||
| { | ||||
| 	return atomic_notifier_chain_register(&nss_dtls_cmn_stats_notifier, nb); | ||||
| } | ||||
| EXPORT_SYMBOL(nss_dtls_cmn_stats_register_notifier); | ||||
							
								
								
									
										26
									
								
								feeds/ipq807x/qca-nss-drv/src/nss_dtls_cmn_stats.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										26
									
								
								feeds/ipq807x/qca-nss-drv/src/nss_dtls_cmn_stats.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,26 @@ | ||||
| /* | ||||
|  **************************************************************************** | ||||
|  * Copyright (c) 2020-2021, The Linux Foundation. All rights reserved. | ||||
|  * Permission to use, copy, modify, and/or distribute this software for | ||||
|  * any purpose with or without fee is hereby granted, provided that the | ||||
|  * above copyright notice and this permission notice appear in all copies. | ||||
|  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES | ||||
|  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF | ||||
|  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR | ||||
|  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES | ||||
|  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN | ||||
|  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT | ||||
|  * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | ||||
|  **************************************************************************** | ||||
|  */ | ||||
|  | ||||
| #ifndef __NSS_DTLS_CMN_STATS_H | ||||
| #define __NSS_DTLS_CMN_STATS_H | ||||
|  | ||||
| #include <nss_cmn.h> | ||||
|  | ||||
| extern void nss_dtls_cmn_stats_notify(struct nss_ctx_instance *nss_ctx, uint32_t if_num); | ||||
| extern void nss_dtls_cmn_stats_sync(struct nss_ctx_instance *nss_ctx, struct nss_cmn_msg *ncm); | ||||
| extern void nss_dtls_cmn_stats_dentry_create(void); | ||||
|  | ||||
| #endif /* __NSS_DTLS_CMN_STATS_H */ | ||||
							
								
								
									
										128
									
								
								feeds/ipq807x/qca-nss-drv/src/nss_dtls_cmn_strings.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										128
									
								
								feeds/ipq807x/qca-nss-drv/src/nss_dtls_cmn_strings.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,128 @@ | ||||
| /* | ||||
|  **************************************************************************** | ||||
|  * Copyright (c) 2020, The Linux Foundation. All rights reserved. | ||||
|  * Permission to use, copy, modify, and/or distribute this software for | ||||
|  * any purpose with or without fee is hereby granted, provided that the | ||||
|  * above copyright notice and this permission notice appear in all copies. | ||||
|  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES | ||||
|  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF | ||||
|  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR | ||||
|  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES | ||||
|  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN | ||||
|  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT | ||||
|  * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | ||||
|  **************************************************************************** | ||||
|  */ | ||||
|  | ||||
| #include "nss_stats.h" | ||||
| #include "nss_core.h" | ||||
| #include "nss_strings.h" | ||||
| #include "nss_dtls_cmn_strings.h" | ||||
|  | ||||
| /* | ||||
|  * nss_dtls_cmn_ctx_stats_str | ||||
|  *	 dtls common ctx statistics strings. | ||||
|  */ | ||||
| struct nss_stats_info nss_dtls_cmn_ctx_stats_str[NSS_DTLS_CMN_CTX_STATS_MAX] = { | ||||
| 	{"rx_pkts",			NSS_STATS_TYPE_COMMON}, | ||||
| 	{"rx_byts",			NSS_STATS_TYPE_COMMON}, | ||||
| 	{"tx_pkts",			NSS_STATS_TYPE_COMMON}, | ||||
| 	{"tx_byts",			NSS_STATS_TYPE_COMMON}, | ||||
| 	{"rx_queue[0]_drops",		NSS_STATS_TYPE_DROP}, | ||||
| 	{"rx_queue[1]_drops",		NSS_STATS_TYPE_DROP}, | ||||
| 	{"rx_queue[2]_drops",		NSS_STATS_TYPE_DROP}, | ||||
| 	{"rx_queue[3]_drops",		NSS_STATS_TYPE_DROP}, | ||||
| 	{"rx_single_rec",		NSS_STATS_TYPE_SPECIAL}, | ||||
| 	{"rx_multi_rec",		NSS_STATS_TYPE_SPECIAL}, | ||||
| 	{"fail_crypto_resource",	NSS_STATS_TYPE_DROP}, | ||||
| 	{"fail_crypto_enqueue",		NSS_STATS_TYPE_DROP}, | ||||
| 	{"fail_headroom",		NSS_STATS_TYPE_DROP}, | ||||
| 	{"fail_tailroom",		NSS_STATS_TYPE_DROP}, | ||||
| 	{"fail_ver",			NSS_STATS_TYPE_DROP}, | ||||
| 	{"fail_epoch",			NSS_STATS_TYPE_DROP}, | ||||
| 	{"fail_dtls_record",		NSS_STATS_TYPE_DROP}, | ||||
| 	{"fail_capwap",			NSS_STATS_TYPE_DROP}, | ||||
| 	{"fail_replay",			NSS_STATS_TYPE_DROP}, | ||||
| 	{"fail_replay_dup",		NSS_STATS_TYPE_DROP}, | ||||
| 	{"fail_replay_win",		NSS_STATS_TYPE_DROP}, | ||||
| 	{"fail_queue",			NSS_STATS_TYPE_DROP}, | ||||
| 	{"fail_queue_nexthop",		NSS_STATS_TYPE_DROP}, | ||||
| 	{"fail_pbuf_alloc",		NSS_STATS_TYPE_DROP}, | ||||
| 	{"fail_pbuf_linear",		NSS_STATS_TYPE_DROP}, | ||||
| 	{"fail_pbuf_stats",		NSS_STATS_TYPE_DROP}, | ||||
| 	{"fail_pbuf_align",		NSS_STATS_TYPE_DROP}, | ||||
| 	{"fail_ctx_active",		NSS_STATS_TYPE_DROP}, | ||||
| 	{"fail_hwctx_active",		NSS_STATS_TYPE_DROP}, | ||||
| 	{"fail_cipher",			NSS_STATS_TYPE_EXCEPTION}, | ||||
| 	{"fail_auth",			NSS_STATS_TYPE_EXCEPTION}, | ||||
| 	{"fail_seq_ovf",		NSS_STATS_TYPE_DROP}, | ||||
| 	{"fail_blk_len",		NSS_STATS_TYPE_DROP}, | ||||
| 	{"fail_hash_len",		NSS_STATS_TYPE_DROP}, | ||||
| 	{"len_error",			NSS_STATS_TYPE_DROP}, | ||||
| 	{"token_error",			NSS_STATS_TYPE_DROP}, | ||||
| 	{"bypass_error",		NSS_STATS_TYPE_DROP}, | ||||
| 	{"config_error",		NSS_STATS_TYPE_DROP}, | ||||
| 	{"algo_error",			NSS_STATS_TYPE_DROP}, | ||||
| 	{"hash_ovf_error",		NSS_STATS_TYPE_DROP}, | ||||
| 	{"ttl_error",			NSS_STATS_TYPE_DROP}, | ||||
| 	{"csum_error",			NSS_STATS_TYPE_DROP}, | ||||
| 	{"timeout_error",		NSS_STATS_TYPE_DROP}, | ||||
| 	{"fail_cle_[0]",		NSS_STATS_TYPE_DROP}, | ||||
| 	{"fail_cle_[1]",		NSS_STATS_TYPE_DROP}, | ||||
| 	{"fail_cle_[2]",		NSS_STATS_TYPE_DROP}, | ||||
| 	{"fail_cle_[3]",		NSS_STATS_TYPE_DROP}, | ||||
| 	{"fail_cle_[4]",		NSS_STATS_TYPE_DROP}, | ||||
| 	{"fail_cle_[5]",		NSS_STATS_TYPE_DROP}, | ||||
| 	{"fail_cle_[6]",		NSS_STATS_TYPE_DROP}, | ||||
| 	{"fail_cle_[7]",		NSS_STATS_TYPE_DROP}, | ||||
| 	{"fail_cle_[8]",		NSS_STATS_TYPE_DROP}, | ||||
| 	{"fail_cle_[9]",		NSS_STATS_TYPE_DROP}, | ||||
| 	{"fail_cle_[10]",		NSS_STATS_TYPE_DROP}, | ||||
| 	{"fail_cle_[11]",		NSS_STATS_TYPE_DROP}, | ||||
| 	{"fail_cle_[12]",		NSS_STATS_TYPE_DROP}, | ||||
| 	{"fail_cle_[13]",		NSS_STATS_TYPE_DROP}, | ||||
| 	{"fail_cle_[14]",		NSS_STATS_TYPE_DROP}, | ||||
| 	{"fail_cle_[15]",		NSS_STATS_TYPE_DROP}, | ||||
| 	{"fail_cle_[16]",		NSS_STATS_TYPE_DROP}, | ||||
| 	{"fail_cle_[17]",		NSS_STATS_TYPE_DROP}, | ||||
| 	{"fail_cle_[18]",		NSS_STATS_TYPE_DROP}, | ||||
| 	{"fail_cle_[19]",		NSS_STATS_TYPE_DROP}, | ||||
| 	{"fail_cle_[20]",		NSS_STATS_TYPE_DROP}, | ||||
| 	{"fail_cle_[21]",		NSS_STATS_TYPE_DROP}, | ||||
| 	{"fail_cle_[22]",		NSS_STATS_TYPE_DROP}, | ||||
| 	{"fail_cle_[23]",		NSS_STATS_TYPE_DROP}, | ||||
| 	{"fail_cle_[24]",		NSS_STATS_TYPE_DROP}, | ||||
| 	{"fail_cle_[25]",		NSS_STATS_TYPE_DROP}, | ||||
| 	{"fail_cle_[26]",		NSS_STATS_TYPE_DROP}, | ||||
| 	{"fail_cle_[27]",		NSS_STATS_TYPE_DROP}, | ||||
| 	{"fail_cle_[28]",		NSS_STATS_TYPE_DROP}, | ||||
| 	{"fail_cle_[29]",		NSS_STATS_TYPE_DROP}, | ||||
| 	{"fail_cle_[30]",		NSS_STATS_TYPE_DROP}, | ||||
| 	{"fail_cle_[31]",		NSS_STATS_TYPE_DROP}, | ||||
| 	{"seq_low",			NSS_STATS_TYPE_SPECIAL}, | ||||
| 	{"seq_high",			NSS_STATS_TYPE_SPECIAL}, | ||||
| 	{"epoch",			NSS_STATS_TYPE_SPECIAL} | ||||
| }; | ||||
|  | ||||
| /* | ||||
|  * nss_dtls_cmn_ctx_stats_str_strings_read() | ||||
|  *	Read dtls common ctx statistics names | ||||
|  */ | ||||
| static ssize_t nss_dtls_cmn_ctx_stats_str_strings_read(struct file *fp, char __user *ubuf, size_t sz, loff_t *ppos) | ||||
| { | ||||
| 	return nss_strings_print(ubuf, sz, ppos, nss_dtls_cmn_ctx_stats_str, NSS_DTLS_CMN_CTX_STATS_MAX); | ||||
| } | ||||
|  | ||||
| /* | ||||
|  * nss_dtls_cmn_ctx_stats_str_strings_ops | ||||
|  */ | ||||
| NSS_STRINGS_DECLARE_FILE_OPERATIONS(dtls_cmn_ctx_stats_str); | ||||
|  | ||||
| /* | ||||
|  * nss_dtls_cmn_strings_dentry_create() | ||||
|  *	Create dtls common statistics strings debug entry. | ||||
|  */ | ||||
| void nss_dtls_cmn_strings_dentry_create(void) | ||||
| { | ||||
| 	nss_strings_create_dentry("dtls_cmn_ctx_stats_str", &nss_dtls_cmn_ctx_stats_str_strings_ops); | ||||
| } | ||||
							
								
								
									
										25
									
								
								feeds/ipq807x/qca-nss-drv/src/nss_dtls_cmn_strings.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								feeds/ipq807x/qca-nss-drv/src/nss_dtls_cmn_strings.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,25 @@ | ||||
| /* | ||||
|  **************************************************************************** | ||||
|  * Copyright (c) 2020, The Linux Foundation. All rights reserved. | ||||
|  * Permission to use, copy, modify, and/or distribute this software for | ||||
|  * any purpose with or without fee is hereby granted, provided that the | ||||
|  * above copyright notice and this permission notice appear in all copies. | ||||
|  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES | ||||
|  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF | ||||
|  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR | ||||
|  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES | ||||
|  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN | ||||
|  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT | ||||
|  * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | ||||
|  **************************************************************************** | ||||
|  */ | ||||
|  | ||||
| #ifndef __NSS_DTLS_CMN_STRINGS_H | ||||
| #define __NSS_DTLS_CMN_STRINGS_H | ||||
|  | ||||
| #include "nss_dtls_cmn_stats.h" | ||||
|  | ||||
| extern struct nss_stats_info nss_dtls_cmn_ctx_stats_str[NSS_DTLS_CMN_CTX_STATS_MAX]; | ||||
| extern void nss_dtls_cmn_strings_dentry_create(void); | ||||
|  | ||||
| #endif /* __NSS_DTLS_CMN_STRINGS_H */ | ||||
| @@ -26,10 +26,10 @@ | ||||
| const char *nss_dynamic_interface_type_names[NSS_DYNAMIC_INTERFACE_TYPE_MAX] = { | ||||
| 	"NSS_DYNAMIC_INTERFACE_TYPE_NONE", | ||||
| 	"NSS_DYNAMIC_INTERFACE_TYPE_GRE_REDIR", | ||||
| 	"NSS_DYNAMIC_INTERFACE_TYPE_CAPWAP", | ||||
| 	"NSS_DYNAMIC_INTERFACE_TYPE_RESERVED_5", | ||||
| 	"NSS_DYNAMIC_INTERFACE_TYPE_TUNIPIP6_INNER", | ||||
| 	"NSS_DYNAMIC_INTERFACE_TYPE_TUNIPIP6_OUTER", | ||||
| 	"NSS_DYNAMIC_INTERFACE_TYPE_WIFI", | ||||
| 	"NSS_DYNAMIC_INTERFACE_TYPE_RESERVED", | ||||
| 	"NSS_DYNAMIC_INTERFACE_TYPE_VAP", | ||||
| 	"NSS_DYNAMIC_INTERFACE_TYPE_RESERVED_0", | ||||
| 	"NSS_DYNAMIC_INTERFACE_TYPE_PPPOE", | ||||
| @@ -87,6 +87,8 @@ const char *nss_dynamic_interface_type_names[NSS_DYNAMIC_INTERFACE_TYPE_MAX] = { | ||||
| 	"NSS_DYNAMIC_INTERFACE_TYPE_RMNET_RX_H2N", | ||||
| 	"NSS_DYNAMIC_INTERFACE_TYPE_WIFILI_EXTERNAL0", | ||||
| 	"NSS_DYNAMIC_INTERFACE_TYPE_WIFILI_EXTERNAL1", | ||||
| 	"NSS_DYNAMIC_INTERFACE_TYPE_CAPWAP_HOST_INNER", | ||||
| 	"NSS_DYNAMIC_INTERFACE_TYPE_CAPWAP_OUTER", | ||||
| }; | ||||
|  | ||||
| /* | ||||
|   | ||||
| @@ -1,6 +1,6 @@ | ||||
| /* | ||||
|  ************************************************************************** | ||||
|  * Copyright (c) 2017-2020, The Linux Foundation. All rights reserved. | ||||
|  * Copyright (c) 2017-2021, The Linux Foundation. All rights reserved. | ||||
|  * Permission to use, copy, modify, and/or distribute this software for | ||||
|  * any purpose with or without fee is hereby granted, provided that the | ||||
|  * above copyright notice and this permission notice appear in all copies. | ||||
| @@ -732,6 +732,7 @@ void nss_edma_metadata_ring_stats_sync(struct nss_ctx_instance *nss_ctx, struct | ||||
| 		edma_stats.rx_stats[i][NSS_EDMA_STATS_RX_DESC] += nerss->rx_ring[i].desc_cnt; | ||||
| 		edma_stats.rx_stats[i][NSS_EDMA_STATS_RX_QOS_ERR] += nerss->rx_ring[i].qos_err; | ||||
| 		edma_stats.rx_stats[i][NSS_EDMA_STATS_RX_SRC_PORT_INVALID] += nerss->rx_ring[i].rx_src_port_invalid; | ||||
| 		edma_stats.rx_stats[i][NSS_EDMA_STATS_RX_SRC_IF_INVALID] += nerss->rx_ring[i].rx_src_if_invalid; | ||||
| 	} | ||||
|  | ||||
| 	/* | ||||
|   | ||||
| @@ -1,6 +1,6 @@ | ||||
| /* | ||||
|  ************************************************************************** | ||||
|  * Copyright (c) 2020, The Linux Foundation. All rights reserved. | ||||
|  * Copyright (c) 2020-2021, The Linux Foundation. All rights reserved. | ||||
|  * Permission to use, copy, modify, and/or distribute this software for | ||||
|  * any purpose with or without fee is hereby granted, provided that the | ||||
|  * above copyright notice and this permission notice appear in all copies. | ||||
| @@ -78,7 +78,8 @@ struct nss_stats_info nss_edma_strings_stats_rx[NSS_EDMA_STATS_RX_MAX] = { | ||||
| 	{"rx_csum_err"		, NSS_STATS_TYPE_ERROR}, | ||||
| 	{"desc_cnt"		, NSS_STATS_TYPE_SPECIAL}, | ||||
| 	{"qos_err"		, NSS_STATS_TYPE_DROP}, | ||||
| 	{"rx_src_port_invalid"	, NSS_STATS_TYPE_DROP} | ||||
| 	{"rx_src_port_invalid"	, NSS_STATS_TYPE_DROP}, | ||||
| 	{"rx_src_interface_invalid"	, NSS_STATS_TYPE_DROP} | ||||
| }; | ||||
|  | ||||
| /* | ||||
|   | ||||
| @@ -1,6 +1,6 @@ | ||||
| /* | ||||
|  ************************************************************************** | ||||
|  * Copyright (c) 2017-2020, The Linux Foundation. All rights reserved. | ||||
|  * Copyright (c) 2017-2021, The Linux Foundation. All rights reserved. | ||||
|  * Permission to use, copy, modify, and/or distribute this software for | ||||
|  * any purpose with or without fee is hereby granted, provided that the | ||||
|  * above copyright notice and this permission notice appear in all copies. | ||||
| @@ -17,6 +17,7 @@ | ||||
| #include "nss_tx_rx_common.h" | ||||
| #include "nss_gre_stats.h" | ||||
| #include "nss_gre_log.h" | ||||
| #include "nss_gre_strings.h" | ||||
|  | ||||
| #define NSS_GRE_TX_TIMEOUT 3000 /* 3 Seconds */ | ||||
|  | ||||
| @@ -115,11 +116,13 @@ static void nss_gre_msg_handler(struct nss_ctx_instance *nss_ctx, struct nss_cmn | ||||
| 		/* | ||||
| 		 * debug stats embedded in stats msg | ||||
| 		 */ | ||||
| 		nss_gre_stats_session_debug_sync(nss_ctx, &ntm->msg.sstats, ncm->interface); | ||||
| 		nss_gre_stats_session_sync(nss_ctx, &ntm->msg.sstats, ncm->interface); | ||||
| 		nss_gre_stats_session_notify(nss_ctx, ncm->interface); | ||||
| 		break; | ||||
|  | ||||
| 	case NSS_GRE_MSG_BASE_STATS: | ||||
| 		nss_gre_stats_base_debug_sync(nss_ctx, &ntm->msg.bstats); | ||||
| 		nss_gre_stats_base_sync(nss_ctx, &ntm->msg.bstats); | ||||
| 		nss_gre_stats_base_notify(nss_ctx); | ||||
| 		break; | ||||
|  | ||||
| 	default: | ||||
| @@ -404,4 +407,5 @@ void nss_gre_register_handler(void) | ||||
| 	init_completion(&nss_gre_pvt.complete); | ||||
| 	nss_core_register_handler(nss_ctx, NSS_GRE_INTERFACE, nss_gre_msg_handler, NULL); | ||||
| 	nss_gre_stats_dentry_create(); | ||||
| 	nss_gre_strings_dentry_create(); | ||||
| } | ||||
|   | ||||
| @@ -1,6 +1,6 @@ | ||||
| /* | ||||
|  ************************************************************************** | ||||
|  * Copyright (c) 2014-2020, The Linux Foundation. All rights reserved. | ||||
|  * Copyright (c) 2014-2021, The Linux Foundation. All rights reserved. | ||||
|  * Permission to use, copy, modify, and/or distribute this software for | ||||
|  * any purpose with or without fee is hereby granted, provided that the | ||||
|  * above copyright notice and this permission notice appear in all copies. | ||||
| @@ -16,6 +16,7 @@ | ||||
|  | ||||
| #include "nss_tx_rx_common.h" | ||||
| #include "nss_gre_redir_stats.h" | ||||
| #include "nss_gre_redir_strings.h" | ||||
| #include "nss_gre_redir_log.h" | ||||
| #define NSS_GRE_REDIR_TX_TIMEOUT 3000 /* 3 Seconds */ | ||||
|  | ||||
| @@ -30,15 +31,10 @@ static struct { | ||||
| 	int response; | ||||
| } nss_gre_redir_pvt; | ||||
|  | ||||
| /* | ||||
|  * Spinlock to update tunnel stats. | ||||
|  */ | ||||
| static DEFINE_SPINLOCK(nss_gre_redir_stats_lock); | ||||
|  | ||||
| /* | ||||
|  * Array to hold tunnel stats along with if_num | ||||
|  */ | ||||
| static struct nss_gre_redir_tunnel_stats tun_stats[NSS_GRE_REDIR_MAX_INTERFACES]; | ||||
| struct nss_gre_redir_tunnel_stats tun_stats[NSS_GRE_REDIR_MAX_INTERFACES]; | ||||
|  | ||||
| /* | ||||
|  * nss_gre_callback() | ||||
| @@ -59,7 +55,7 @@ static void nss_gre_redir_msg_sync_callback(void *app_data, struct nss_gre_redir | ||||
|  * nss_gre_redir_verify_ifnum() | ||||
|  *	Verify interface type. | ||||
|  */ | ||||
| static bool nss_gre_redir_verify_ifnum(uint32_t if_num) | ||||
| bool nss_gre_redir_verify_ifnum(uint32_t if_num) | ||||
| { | ||||
| 	uint32_t type; | ||||
|  | ||||
| @@ -72,92 +68,6 @@ static bool nss_gre_redir_verify_ifnum(uint32_t if_num) | ||||
| 			type == NSS_DYNAMIC_INTERFACE_TYPE_GRE_REDIR_EXCEPTION_DS; | ||||
| } | ||||
|  | ||||
| /* | ||||
|  * nss_gre_redir_tunnel_update_stats() | ||||
|  *	Update gre_redir tunnel stats. | ||||
|  */ | ||||
| static void nss_gre_redir_tunnel_update_stats(struct nss_ctx_instance *nss_ctx, int if_num, struct nss_gre_redir_stats_sync_msg *ngss) | ||||
| { | ||||
| 	int i, j; | ||||
| 	uint32_t type; | ||||
| 	struct net_device *dev; | ||||
|  | ||||
| 	type = nss_dynamic_interface_get_type(nss_ctx, if_num); | ||||
| 	dev = nss_cmn_get_interface_dev(nss_ctx, if_num); | ||||
| 	if (!dev) { | ||||
| 		nss_warning("%px: Unable to find net device for the interface %d\n", nss_ctx, if_num); | ||||
| 		return; | ||||
| 	} | ||||
|  | ||||
| 	if (!nss_gre_redir_verify_ifnum(if_num)) { | ||||
| 		nss_warning("%px: Unknown type for interface %d\n", nss_ctx, if_num); | ||||
| 		return; | ||||
| 	} | ||||
|  | ||||
| 	spin_lock_bh(&nss_gre_redir_stats_lock); | ||||
| 	for (i = 0; i < NSS_GRE_REDIR_MAX_INTERFACES; i++) { | ||||
| 		if (tun_stats[i].dev == dev) { | ||||
| 			break; | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	if (i == NSS_GRE_REDIR_MAX_INTERFACES) { | ||||
| 		nss_warning("%px: Unable to find tunnel stats instance for interface %d\n", nss_ctx, if_num); | ||||
| 		return; | ||||
| 	} | ||||
|  | ||||
| 	nss_assert(tun_stats[i].ref_count); | ||||
| 	switch (type) { | ||||
| 	case NSS_DYNAMIC_INTERFACE_TYPE_GRE_REDIR_WIFI_HOST_INNER: | ||||
| 	case NSS_DYNAMIC_INTERFACE_TYPE_GRE_REDIR_WIFI_OFFL_INNER: | ||||
| 	case NSS_DYNAMIC_INTERFACE_TYPE_GRE_REDIR_SJACK_INNER: | ||||
| 		tun_stats[i].node_stats.tx_packets += ngss->node_stats.tx_packets; | ||||
| 		tun_stats[i].node_stats.tx_bytes += ngss->node_stats.tx_bytes; | ||||
| 		tun_stats[i].sjack_tx_packets += ngss->sjack_rx_packets; | ||||
| 		tun_stats[i].encap_sg_alloc_drop += ngss->encap_sg_alloc_drop; | ||||
| 		tun_stats[i].tx_dropped += nss_cmn_rx_dropped_sum(&(ngss->node_stats)); | ||||
| 		for (j = 0; j < NSS_GRE_REDIR_MAX_RADIO; j++) { | ||||
| 			tun_stats[i].offl_tx_pkts[j] += ngss->offl_rx_pkts[j]; | ||||
| 		} | ||||
|  | ||||
| 		break; | ||||
|  | ||||
| 	case NSS_DYNAMIC_INTERFACE_TYPE_GRE_REDIR_OUTER: | ||||
| 		tun_stats[i].node_stats.rx_packets += ngss->node_stats.rx_packets; | ||||
| 		tun_stats[i].node_stats.rx_bytes += ngss->node_stats.rx_bytes; | ||||
| 		tun_stats[i].sjack_rx_packets += ngss->sjack_rx_packets; | ||||
| 		tun_stats[i].decap_fail_drop += ngss->decap_fail_drop; | ||||
| 		tun_stats[i].decap_split_drop += ngss->decap_split_drop; | ||||
| 		tun_stats[i].split_sg_alloc_fail += ngss->split_sg_alloc_fail; | ||||
| 		tun_stats[i].split_linear_copy_fail += ngss->split_linear_copy_fail; | ||||
| 		tun_stats[i].split_not_enough_tailroom += ngss->split_not_enough_tailroom; | ||||
| 		tun_stats[i].decap_eapol_frames += ngss->decap_eapol_frames; | ||||
| 		tun_stats[i].node_stats.rx_dropped[0] += nss_cmn_rx_dropped_sum(&(ngss->node_stats)); | ||||
| 		for (j = 0; j < NSS_GRE_REDIR_MAX_RADIO; j++) { | ||||
| 			tun_stats[i].offl_rx_pkts[j] += ngss->offl_rx_pkts[j]; | ||||
| 		} | ||||
|  | ||||
| 		break; | ||||
|  | ||||
| 	case NSS_DYNAMIC_INTERFACE_TYPE_GRE_REDIR_EXCEPTION_US: | ||||
| 		tun_stats[i].exception_us_rx += ngss->node_stats.rx_packets; | ||||
| 		tun_stats[i].exception_us_tx += ngss->node_stats.tx_packets; | ||||
| 		break; | ||||
|  | ||||
| 	case NSS_DYNAMIC_INTERFACE_TYPE_GRE_REDIR_EXCEPTION_DS: | ||||
| 		tun_stats[i].exception_ds_rx += ngss->node_stats.rx_packets; | ||||
| 		tun_stats[i].exception_ds_tx += ngss->node_stats.tx_packets; | ||||
| 		tun_stats[i].exception_ds_invalid_dst_drop += ngss->exception_ds_invalid_dst_drop; | ||||
| 		tun_stats[i].exception_ds_inv_appid += ngss->exception_ds_inv_appid; | ||||
| 		tun_stats[i].headroom_unavail += ngss->headroom_unavail; | ||||
| 		tun_stats[i].tx_completion_success += ngss->tx_completion_success; | ||||
| 		tun_stats[i].tx_completion_drop += ngss->tx_completion_drop; | ||||
| 		break; | ||||
| 	} | ||||
|  | ||||
| 	spin_unlock_bh(&nss_gre_redir_stats_lock); | ||||
| } | ||||
|  | ||||
| /* | ||||
|  * nss_gre_redir_handler() | ||||
|  *	Handle NSS -> HLOS messages for GRE tunnel. | ||||
| @@ -209,7 +119,8 @@ static void nss_gre_redir_msg_handler(struct nss_ctx_instance *nss_ctx, struct n | ||||
|  | ||||
| 	switch (ncm->type) { | ||||
| 	case NSS_GRE_REDIR_RX_STATS_SYNC_MSG: | ||||
| 		nss_gre_redir_tunnel_update_stats(nss_ctx, ncm->interface, &ngrm->msg.stats_sync); | ||||
| 		nss_gre_redir_stats_sync(nss_ctx, ncm->interface, &ngrm->msg.stats_sync); | ||||
| 		nss_gre_redir_stats_notify(nss_ctx, ncm->interface); | ||||
| 		break; | ||||
| 	} | ||||
|  | ||||
| @@ -540,24 +451,6 @@ nss_tx_status_t nss_gre_redir_configure_outer_node(int ifnum, | ||||
| } | ||||
| EXPORT_SYMBOL(nss_gre_redir_configure_outer_node); | ||||
|  | ||||
| /* | ||||
|  * nss_gre_redir_get_stats() | ||||
|  *	Get gre_redir tunnel stats. | ||||
|  */ | ||||
| bool nss_gre_redir_get_stats(int index, struct nss_gre_redir_tunnel_stats *stats) | ||||
| { | ||||
| 	spin_lock_bh(&nss_gre_redir_stats_lock); | ||||
| 	if (tun_stats[index].ref_count == 0) { | ||||
| 		spin_unlock_bh(&nss_gre_redir_stats_lock); | ||||
| 		return false; | ||||
| 	} | ||||
|  | ||||
| 	memcpy(stats, &tun_stats[index], sizeof(struct nss_gre_redir_tunnel_stats)); | ||||
| 	spin_unlock_bh(&nss_gre_redir_stats_lock); | ||||
| 	return true; | ||||
| } | ||||
| EXPORT_SYMBOL(nss_gre_redir_get_stats); | ||||
|  | ||||
| /* | ||||
|  * nss_gre_redir_tx_msg() | ||||
|  *	Transmit a GRE message to NSS FW. | ||||
| @@ -775,4 +668,6 @@ void nss_gre_redir_register_handler(void) | ||||
| 		nss_warning("%px: Not able to register handler for gre_redir base interface with NSS core\n", nss_ctx); | ||||
| 		return; | ||||
| 	} | ||||
|  | ||||
| 	nss_gre_redir_strings_dentry_create(); | ||||
| } | ||||
|   | ||||
| @@ -1,6 +1,6 @@ | ||||
| /* | ||||
|  ************************************************************************** | ||||
|  * Copyright (c) 2018, 2020, The Linux Foundation. All rights reserved. | ||||
|  **************************************************************************** | ||||
|  * Copyright (c) 2018, 2020-2021, The Linux Foundation. All rights reserved. | ||||
|  * Permission to use, copy, modify, and/or distribute this software for | ||||
|  * any purpose with or without fee is hereby granted, provided that the | ||||
|  * above copyright notice and this permission notice appear in all copies. | ||||
| @@ -11,17 +11,18 @@ | ||||
|  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN | ||||
|  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT | ||||
|  * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | ||||
|  ************************************************************************** | ||||
|  **************************************************************************** | ||||
|  */ | ||||
|  | ||||
| #include "nss_tx_rx_common.h" | ||||
| #include "nss_gre_redir_lag.h" | ||||
| #include "nss_gre_redir_lag_ds_stats.h" | ||||
| #include "nss_gre_redir_lag_ds_log.h" | ||||
| #include "nss_gre_redir_lag_ds_strings.h" | ||||
|  | ||||
| #define NSS_GRE_REDIR_LAG_DS_TX_TIMEOUT 3000 /* 3 Seconds */ | ||||
|  | ||||
| static struct nss_gre_redir_lag_ds_tun_stats tun_stats[NSS_GRE_REDIR_LAG_MAX_NODE]; | ||||
| static DEFINE_SPINLOCK(nss_gre_redir_lag_ds_stats_lock); | ||||
| struct nss_gre_redir_lag_ds_tun_stats tun_ds_stats[NSS_GRE_REDIR_LAG_MAX_NODE]; | ||||
|  | ||||
| /* | ||||
|  * Private data structure | ||||
| @@ -64,11 +65,11 @@ static void nss_gre_redir_lag_ds_callback(void *app_data, struct nss_gre_redir_l | ||||
|  * nss_gre_redir_lag_ds_get_node_idx() | ||||
|  *	Returns index of statistics context. | ||||
|  */ | ||||
| static inline bool nss_gre_redir_lag_ds_get_node_idx(uint32_t ifnum, uint32_t *idx) | ||||
| bool nss_gre_redir_lag_ds_get_node_idx(uint32_t ifnum, uint32_t *idx) | ||||
| { | ||||
| 	uint32_t node_idx; | ||||
| 	for (node_idx = 0; node_idx < NSS_GRE_REDIR_LAG_MAX_NODE; node_idx++) { | ||||
| 		if ((tun_stats[node_idx].valid) && (tun_stats[node_idx].ifnum == ifnum)) { | ||||
| 		if ((tun_ds_stats[node_idx].valid) && (tun_ds_stats[node_idx].ifnum == ifnum)) { | ||||
| 			*idx = node_idx; | ||||
| 			return true; | ||||
| 		} | ||||
| @@ -77,38 +78,11 @@ static inline bool nss_gre_redir_lag_ds_get_node_idx(uint32_t ifnum, uint32_t *i | ||||
| 	return false; | ||||
| } | ||||
|  | ||||
| /* | ||||
|  * nss_gre_redir_lag_ds_update_sync_stats() | ||||
|  *	Update synchonized statistics. | ||||
|  */ | ||||
| static void nss_gre_redir_lag_ds_update_sync_stats(struct nss_ctx_instance *nss_ctx, struct nss_gre_redir_lag_ds_sync_stats_msg *ngss, uint32_t ifnum) | ||||
| { | ||||
| 	int idx, j; | ||||
|  | ||||
| 	spin_lock_bh(&nss_gre_redir_lag_ds_stats_lock); | ||||
| 	if (!nss_gre_redir_lag_ds_get_node_idx(ifnum, &idx)) { | ||||
| 		spin_unlock_bh(&nss_gre_redir_lag_ds_stats_lock); | ||||
| 		nss_warning("%px: Unable to update hash stats msg. Stats context not found.\n", nss_ctx); | ||||
| 		return; | ||||
| 	} | ||||
|  | ||||
| 	tun_stats[idx].tx_packets += ngss->node_stats.tx_packets; | ||||
| 	tun_stats[idx].tx_bytes += ngss->node_stats.tx_bytes; | ||||
| 	tun_stats[idx].rx_packets += ngss->node_stats.rx_packets; | ||||
| 	tun_stats[idx].rx_bytes += ngss->node_stats.rx_bytes; | ||||
| 	for (j = 0; j < NSS_MAX_NUM_PRI; j++) { | ||||
| 		tun_stats[idx].rx_dropped[j] += ngss->node_stats.rx_dropped[j]; | ||||
| 	} | ||||
| 	tun_stats[idx].dst_invalid += ngss->ds_stats.dst_invalid; | ||||
| 	tun_stats[idx].exception_cnt += ngss->ds_stats.exception_cnt; | ||||
| 	spin_unlock_bh(&nss_gre_redir_lag_ds_stats_lock); | ||||
| } | ||||
|  | ||||
| /* | ||||
|  * nss_gre_redir_lag_ds_verify_ifnum() | ||||
|  *	Verify interface type. | ||||
|  */ | ||||
| static bool nss_gre_redir_lag_ds_verify_ifnum(uint32_t if_num) | ||||
| bool nss_gre_redir_lag_ds_verify_ifnum(uint32_t if_num) | ||||
| { | ||||
| 	return nss_dynamic_interface_get_type(nss_gre_redir_lag_ds_get_context(), if_num) == NSS_DYNAMIC_INTERFACE_TYPE_GRE_REDIR_LAG_DS; | ||||
| } | ||||
| @@ -162,7 +136,8 @@ static void nss_gre_redir_lag_ds_msg_handler(struct nss_ctx_instance *nss_ctx, s | ||||
|  | ||||
| 	switch (ncm->type) { | ||||
| 	case NSS_GRE_REDIR_LAG_DS_STATS_SYNC_MSG: | ||||
| 		nss_gre_redir_lag_ds_update_sync_stats(nss_ctx, &ngrm->msg.ds_sync_stats, ncm->interface); | ||||
| 		nss_gre_redir_lag_ds_stats_sync(nss_ctx, &ngrm->msg.ds_sync_stats, ncm->interface); | ||||
| 		nss_gre_redir_lag_ds_stats_notify(nss_ctx, ncm->interface); | ||||
| 		break; | ||||
| 	} | ||||
|  | ||||
| @@ -217,7 +192,7 @@ static enum nss_gre_redir_lag_err_types nss_gre_redir_lag_ds_unregister_if(uint3 | ||||
| 		return NSS_GRE_REDIR_LAG_ERR_STATS_INDEX_NOT_FOUND; | ||||
| 	} | ||||
|  | ||||
| 	tun_stats[idx].valid = false; | ||||
| 	tun_ds_stats[idx].valid = false; | ||||
| 	spin_unlock_bh(&nss_gre_redir_lag_ds_stats_lock); | ||||
| 	return NSS_GRE_REDIR_LAG_SUCCESS; | ||||
| } | ||||
| @@ -258,9 +233,9 @@ static struct nss_ctx_instance *nss_gre_redir_lag_ds_register_if(uint32_t if_num | ||||
| 	nss_core_set_subsys_dp_type(nss_ctx, netdev, if_num, type); | ||||
| 	spin_lock_bh(&nss_gre_redir_lag_ds_stats_lock); | ||||
| 	for (i = 0; i < NSS_GRE_REDIR_LAG_MAX_NODE; i++) { | ||||
| 		if (!tun_stats[i].valid) { | ||||
| 			tun_stats[i].ifnum = if_num; | ||||
| 			tun_stats[i].valid = true; | ||||
| 		if (!tun_ds_stats[i].valid) { | ||||
| 			tun_ds_stats[i].ifnum = if_num; | ||||
| 			tun_ds_stats[i].valid = true; | ||||
| 			break; | ||||
| 		} | ||||
| 	} | ||||
| @@ -280,26 +255,6 @@ struct nss_ctx_instance *nss_gre_redir_lag_ds_get_context(void) | ||||
| } | ||||
| EXPORT_SYMBOL(nss_gre_redir_lag_ds_get_context); | ||||
|  | ||||
| /* | ||||
|  * nss_gre_redir_lag_ds_get_cmn_stats() | ||||
|  *	Get statistics for downstream LAG node. | ||||
|  */ | ||||
| bool nss_gre_redir_lag_ds_get_cmn_stats(struct nss_gre_redir_lag_ds_tun_stats *cmn_stats, uint32_t index) | ||||
| { | ||||
| 	if (index >= NSS_GRE_REDIR_LAG_MAX_NODE) { | ||||
| 		return false; | ||||
| 	} | ||||
|  | ||||
| 	spin_lock_bh(&nss_gre_redir_lag_ds_stats_lock); | ||||
| 	if (!tun_stats[index].valid) { | ||||
| 		spin_unlock_bh(&nss_gre_redir_lag_ds_stats_lock); | ||||
| 		return false; | ||||
| 	} | ||||
| 	memcpy((void *)cmn_stats, (void *)&tun_stats[index], sizeof(*cmn_stats)); | ||||
| 	spin_unlock_bh(&nss_gre_redir_lag_ds_stats_lock); | ||||
| 	return true; | ||||
| } | ||||
|  | ||||
| /* | ||||
|  * nss_gre_redir_lag_ds_tx_msg() | ||||
|  *	Transmit a gre message to NSS. | ||||
| @@ -441,6 +396,7 @@ void nss_gre_redir_lag_ds_register_handler(void) | ||||
| 		return; | ||||
| 	} | ||||
|  | ||||
| 	nss_gre_redir_lag_ds_strings_dentry_create(); | ||||
| 	nss_gre_redir_lag_ds_pvt.cb = NULL; | ||||
| 	nss_gre_redir_lag_ds_pvt.app_data = NULL; | ||||
| 	sema_init(&nss_gre_redir_lag_ds_pvt.sem, 1); | ||||
|   | ||||
| @@ -1,6 +1,6 @@ | ||||
| /* | ||||
|  ************************************************************************** | ||||
|  * Copyright (c) 2019, The Linux Foundation. All rights reserved. | ||||
|  * Copyright (c) 2019, 2021, The Linux Foundation. All rights reserved. | ||||
|  * Permission to use, copy, modify, and/or distribute this software for | ||||
|  * any purpose with or without fee is hereby granted, provided that the | ||||
|  * above copyright notice and this permission notice appear in all copies. | ||||
| @@ -17,69 +17,38 @@ | ||||
| #include "nss_core.h" | ||||
| #include "nss_gre_redir_lag.h" | ||||
| #include "nss_gre_redir_lag_ds_stats.h" | ||||
| #include "nss_gre_redir_lag_ds_strings.h" | ||||
|  | ||||
| /* | ||||
|  * nss_gre_redir_lag_ds_stats_str | ||||
|  *	GRE REDIR LAG DS common statistics strings. | ||||
|  * Declare atomic notifier data structure for statistics. | ||||
|  */ | ||||
| static uint8_t *nss_gre_redir_lag_ds_stats_str[NSS_GRE_REDIR_LAG_DS_STATS_MAX] = { | ||||
| 	"rx_packets", | ||||
| 	"rx_bytes", | ||||
| 	"tx_packets", | ||||
| 	"tx_bytes", | ||||
| 	"rx_queue_0_dropped", | ||||
| 	"rx_queue_1_dropped", | ||||
| 	"rx_queue_2_dropped", | ||||
| 	"rx_queue_3_dropped", | ||||
| 	"dst_invalid", | ||||
| 	"exception_packets" | ||||
| }; | ||||
| ATOMIC_NOTIFIER_HEAD(nss_gre_redir_lag_ds_stats_notifier); | ||||
|  | ||||
| /* | ||||
|  * nss_gre_redir_lag_ds_tunnel_stats() | ||||
|  *	Make a row for GRE_REDIR LAG DS stats. | ||||
|  * Spinlock to protect GRE redirect lag ds statistics update/read | ||||
|  */ | ||||
| static ssize_t nss_gre_redir_lag_ds_cmn_stats_read_entry(char *line, int len, int type, struct nss_gre_redir_lag_ds_tun_stats *s) | ||||
| DEFINE_SPINLOCK(nss_gre_redir_lag_ds_stats_lock); | ||||
|  | ||||
| extern struct nss_gre_redir_lag_ds_tun_stats tun_ds_stats[NSS_GRE_REDIR_LAG_MAX_NODE]; | ||||
|  | ||||
| /* | ||||
|  * nss_gre_redir_lag_ds_stats_get() | ||||
|  *	Get statistics for downstream LAG node. | ||||
|  */ | ||||
| bool nss_gre_redir_lag_ds_stats_get(struct nss_gre_redir_lag_ds_tun_stats *cmn_stats, uint32_t index) | ||||
| { | ||||
| 	uint64_t tcnt = 0; | ||||
| 	if (index >= NSS_GRE_REDIR_LAG_MAX_NODE) | ||||
| 		return false; | ||||
|  | ||||
| 	switch (type) { | ||||
| 	case NSS_STATS_NODE_RX_PKTS: | ||||
| 		tcnt = s->rx_packets; | ||||
| 		return snprintf(line, len, "Common node stats start:\n\n%s = %llu\n", nss_gre_redir_lag_ds_stats_str[type], tcnt); | ||||
| 	case NSS_STATS_NODE_RX_BYTES: | ||||
| 		tcnt = s->rx_bytes; | ||||
| 		return snprintf(line, len, "%s = %llu\n", nss_gre_redir_lag_ds_stats_str[type], tcnt); | ||||
| 	case NSS_STATS_NODE_TX_PKTS: | ||||
| 		tcnt = s->tx_packets; | ||||
| 		return snprintf(line, len, "%s = %llu\n", nss_gre_redir_lag_ds_stats_str[type], tcnt); | ||||
| 	case NSS_STATS_NODE_TX_BYTES: | ||||
| 		tcnt = s->tx_bytes; | ||||
| 		return snprintf(line, len, "%s = %llu\n", nss_gre_redir_lag_ds_stats_str[type], tcnt); | ||||
| 	case NSS_STATS_NODE_RX_QUEUE_0_DROPPED: | ||||
| 		tcnt = s->rx_dropped[0]; | ||||
| 		return snprintf(line, len, "%s = %llu\n", nss_gre_redir_lag_ds_stats_str[type], tcnt); | ||||
| #if (NSS_MAX_NUM_PRI > 1) | ||||
| 	case NSS_STATS_NODE_RX_QUEUE_1_DROPPED: | ||||
| 		tcnt = s->rx_dropped[1]; | ||||
| 		return snprintf(line, len, "%s = %llu\n", nss_gre_redir_lag_ds_stats_str[type], tcnt); | ||||
| 	case NSS_STATS_NODE_RX_QUEUE_2_DROPPED: | ||||
| 		tcnt = s->rx_dropped[2]; | ||||
| 		return snprintf(line, len, "%s = %llu\n", nss_gre_redir_lag_ds_stats_str[type], tcnt); | ||||
| 	case NSS_STATS_NODE_RX_QUEUE_3_DROPPED: | ||||
| 		tcnt = s->rx_dropped[3]; | ||||
| 		return snprintf(line, len, "%s = %llu\n", nss_gre_redir_lag_ds_stats_str[type], tcnt); | ||||
| #endif | ||||
| 	case NSS_GRE_REDIR_LAG_DS_STATS_DST_INVALID: | ||||
| 		tcnt = s->dst_invalid; | ||||
| 		return snprintf(line, len, "%s = %llu\n", nss_gre_redir_lag_ds_stats_str[type], tcnt); | ||||
| 	case NSS_GRE_REDIR_LAG_DS_STATS_EXCEPTION_PKT: | ||||
| 		tcnt = s->exception_cnt; | ||||
| 		return snprintf(line, len, "%s = %llu\n", nss_gre_redir_lag_ds_stats_str[type], tcnt); | ||||
|  | ||||
| 	default: | ||||
| 		return 0; | ||||
| 	spin_lock_bh(&nss_gre_redir_lag_ds_stats_lock); | ||||
| 	if (!tun_ds_stats[index].valid) { | ||||
| 		spin_unlock_bh(&nss_gre_redir_lag_ds_stats_lock); | ||||
| 		return false; | ||||
| 	} | ||||
|  | ||||
| 	memcpy((void *)cmn_stats, (void *)&tun_ds_stats[index], sizeof(*cmn_stats)); | ||||
| 	spin_unlock_bh(&nss_gre_redir_lag_ds_stats_lock); | ||||
| 	return true; | ||||
| } | ||||
|  | ||||
| /* | ||||
| @@ -88,47 +57,45 @@ static ssize_t nss_gre_redir_lag_ds_cmn_stats_read_entry(char *line, int len, in | ||||
|  */ | ||||
| static ssize_t nss_gre_redir_lag_ds_cmn_stats_read(struct file *fp, char __user *ubuf, size_t sz, loff_t *ppos) | ||||
| { | ||||
| 	ssize_t bytes_read = 0; | ||||
| 	/* | ||||
| 	 * Max output lines = #stats + | ||||
| 	 * few blank lines for banner printing + Number of Extra outputlines | ||||
| 	 * for future reference to add new stats | ||||
| 	 */ | ||||
| 	uint32_t max_output_lines = NSS_GRE_REDIR_LAG_DS_STATS_MAX + NSS_STATS_EXTRA_OUTPUT_LINES; | ||||
| 	size_t size_al = NSS_STATS_MAX_STR_LENGTH * max_output_lines; | ||||
| 	struct nss_stats_data *data = fp->private_data; | ||||
| 	struct nss_gre_redir_lag_ds_tun_stats stats; | ||||
| 	size_t bytes; | ||||
| 	char line[80]; | ||||
| 	int start; | ||||
| 	ssize_t bytes_read = 0; | ||||
| 	size_t size_wr = 0; | ||||
|  | ||||
| 	while (data->index < NSS_GRE_REDIR_LAG_MAX_NODE) { | ||||
| 		if (nss_gre_redir_lag_ds_get_cmn_stats(&stats, data->index)) { | ||||
| 			break; | ||||
| 		} | ||||
|  | ||||
| 		data->index++; | ||||
| 	} | ||||
|  | ||||
| 	if (data->index == NSS_GRE_REDIR_LAG_MAX_NODE) { | ||||
| 	char *lbuf = kzalloc(size_al, GFP_KERNEL); | ||||
| 	if (unlikely(!lbuf)) { | ||||
| 		nss_warning("Could not allocate memory for local statistics buffer"); | ||||
| 		return 0; | ||||
| 	} | ||||
|  | ||||
| 	bytes = snprintf(line, sizeof(line), "\nTunnel stats for \n"); | ||||
| 	if (copy_to_user(ubuf, line, bytes) != 0) { | ||||
| 		return -EFAULT; | ||||
| 	} | ||||
|  | ||||
| 	bytes_read += bytes; | ||||
| 	start = NSS_STATS_NODE_RX_PKTS; | ||||
| 	while (bytes_read < sz && start < NSS_GRE_REDIR_LAG_DS_STATS_MAX) { | ||||
| 		bytes = nss_gre_redir_lag_ds_cmn_stats_read_entry(line, sizeof(line), start, &stats); | ||||
|  | ||||
| 		if ((bytes_read + bytes) > sz) | ||||
| 	while (data->index < NSS_GRE_REDIR_LAG_MAX_NODE) { | ||||
| 		if (nss_gre_redir_lag_ds_stats_get(&stats, data->index)) { | ||||
| 			break; | ||||
|  | ||||
| 		if (copy_to_user(ubuf + bytes_read, line, bytes) != 0) { | ||||
| 			return -EFAULT; | ||||
| 		} | ||||
|  | ||||
| 		bytes_read += bytes; | ||||
| 		start++; | ||||
| 		} | ||||
|  | ||||
| 		data->index++; | ||||
| 	} | ||||
|  | ||||
| 	if (data->index >= NSS_GRE_REDIR_LAG_MAX_NODE) { | ||||
| 		kfree(lbuf); | ||||
| 		return 0; | ||||
| 	} | ||||
|  | ||||
| 	size_wr += nss_stats_banner(lbuf, size_wr, size_al, "gre_redir_lag_ds stats", NSS_STATS_SINGLE_CORE); | ||||
| 	size_wr += scnprintf(lbuf + size_wr, size_al - size_wr, "\nTunnel stats for %03u\n", stats.ifnum); | ||||
| 	size_wr += nss_stats_print("gre_redir_lag_ds", NULL, NSS_STATS_SINGLE_INSTANCE, nss_gre_redir_lag_ds_strings_stats, | ||||
| 					&stats.rx_packets, NSS_GRE_REDIR_LAG_DS_STATS_MAX, lbuf, size_wr, size_al); | ||||
|  | ||||
| 	bytes_read = simple_read_from_buffer(ubuf, sz, ppos, lbuf, strlen(lbuf)); | ||||
| 	data->index++; | ||||
| 	kfree(lbuf); | ||||
| 	return bytes_read; | ||||
| } | ||||
|  | ||||
| @@ -161,3 +128,84 @@ struct dentry *nss_gre_redir_lag_ds_stats_dentry_create(void) | ||||
|  | ||||
| 	return cmn_stats; | ||||
| } | ||||
|  | ||||
| /* | ||||
|  * nss_gre_redir_lag_ds_stats_sync() | ||||
|  *	Update synchonized statistics. | ||||
|  */ | ||||
| void nss_gre_redir_lag_ds_stats_sync(struct nss_ctx_instance *nss_ctx, struct nss_gre_redir_lag_ds_sync_stats_msg *ngss, uint32_t ifnum) | ||||
| { | ||||
| 	int idx, j; | ||||
|  | ||||
| 	spin_lock_bh(&nss_gre_redir_lag_ds_stats_lock); | ||||
| 	if (!nss_gre_redir_lag_ds_get_node_idx(ifnum, &idx)) { | ||||
| 		spin_unlock_bh(&nss_gre_redir_lag_ds_stats_lock); | ||||
| 		nss_warning("%px: Unable to update hash stats msg. Stats context not found.\n", nss_ctx); | ||||
| 		return; | ||||
| 	} | ||||
|  | ||||
| 	tun_ds_stats[idx].tx_packets += ngss->node_stats.tx_packets; | ||||
| 	tun_ds_stats[idx].tx_bytes += ngss->node_stats.tx_bytes; | ||||
| 	tun_ds_stats[idx].rx_packets += ngss->node_stats.rx_packets; | ||||
| 	tun_ds_stats[idx].rx_bytes += ngss->node_stats.rx_bytes; | ||||
| 	for (j = 0; j < NSS_MAX_NUM_PRI; j++) { | ||||
| 		tun_ds_stats[idx].rx_dropped[j] += ngss->node_stats.rx_dropped[j]; | ||||
| 	} | ||||
|  | ||||
| 	tun_ds_stats[idx].dst_invalid += ngss->ds_stats.dst_invalid; | ||||
| 	tun_ds_stats[idx].exception_cnt += ngss->ds_stats.exception_cnt; | ||||
| 	spin_unlock_bh(&nss_gre_redir_lag_ds_stats_lock); | ||||
| } | ||||
|  | ||||
| /* | ||||
|  * nss_gre_redir_lag_ds_stats_notify() | ||||
|  *	Sends notifications to all the registered modules. | ||||
|  * | ||||
|  * Leverage NSS-FW statistics timing to update Netlink. | ||||
|  */ | ||||
| void nss_gre_redir_lag_ds_stats_notify(struct nss_ctx_instance *nss_ctx, uint32_t if_num) | ||||
| { | ||||
| 	struct nss_gre_redir_lag_ds_stats_notification *stats_notify; | ||||
| 	int idx; | ||||
|  | ||||
| 	stats_notify = kzalloc(sizeof(struct nss_gre_redir_lag_ds_stats_notification), GFP_ATOMIC); | ||||
| 	if (!stats_notify) { | ||||
| 		nss_warning("Unable to allocate memory for stats notification\n"); | ||||
| 		return; | ||||
| 	} | ||||
|  | ||||
| 	spin_lock_bh(&nss_gre_redir_lag_ds_stats_lock); | ||||
| 	if (!nss_gre_redir_lag_ds_get_node_idx(if_num, &idx)) { | ||||
| 		spin_unlock_bh(&nss_gre_redir_lag_ds_stats_lock); | ||||
| 		nss_warning("%px: Unable to update hash stats msg. Stats context not found.\n", nss_ctx); | ||||
| 		kfree(stats_notify); | ||||
| 		return; | ||||
| 	} | ||||
|  | ||||
| 	stats_notify->core_id = nss_ctx->id; | ||||
| 	stats_notify->if_num = if_num; | ||||
| 	memcpy(&(stats_notify->stats_ctx), &(tun_ds_stats[idx]), sizeof(stats_notify->stats_ctx)); | ||||
| 	spin_unlock_bh(&nss_gre_redir_lag_ds_stats_lock); | ||||
| 	atomic_notifier_call_chain(&nss_gre_redir_lag_ds_stats_notifier, NSS_STATS_EVENT_NOTIFY, stats_notify); | ||||
| 	kfree(stats_notify); | ||||
| } | ||||
|  | ||||
| /* | ||||
|  * nss_gre_redir_lag_ds_stats_unregister_notifier() | ||||
|  *	Deregisters statistics notifier. | ||||
|  */ | ||||
| int nss_gre_redir_lag_ds_stats_unregister_notifier(struct notifier_block *nb) | ||||
| { | ||||
| 	return atomic_notifier_chain_unregister(&nss_gre_redir_lag_ds_stats_notifier, nb); | ||||
| } | ||||
| EXPORT_SYMBOL(nss_gre_redir_lag_ds_stats_unregister_notifier); | ||||
|  | ||||
| /* | ||||
|  * nss_gre_redir_lag_ds_stats_register_notifier() | ||||
|  *	Registers statistics notifier. | ||||
|  */ | ||||
| int nss_gre_redir_lag_ds_stats_register_notifier(struct notifier_block *nb) | ||||
| { | ||||
| 	return atomic_notifier_chain_register(&nss_gre_redir_lag_ds_stats_notifier, nb); | ||||
| } | ||||
| EXPORT_SYMBOL(nss_gre_redir_lag_ds_stats_register_notifier); | ||||
|   | ||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user